{"content":{"title":"Solidity 0.8.18 带来了哪些改变","body":"> 从 0.8.17 到 0.8.18 属于小版本升级，没有非常大的变化，但有几个点感觉还是要注意一下的。\r\n\r\n## 0x01 mapping 可命名类型参数\r\n之前我们在 Solidity 中定义 mapping 类型的变量只能是下面这样：\r\n```\r\nmapping(address => uint) public balanceOf;\r\n```\r\n我们可以声明 mapping 类型里面的数据是从一个 address 类型映射到 uint 类型，但这里的 address 类型和uint类型分别代表什么含义就没法直接说明了，很多时候我们需要通过注释的方式来说明。\r\n现在我们可以去掉注释，直接像下面这样声明 mapping 类型了：\r\n```\r\nmapping(address user => uint balanceAmount) public balanceOf;\r\n```\r\n这样代码的可读性就更强了，算是一个小改进吧。\r\n\r\n## 0x02 对巴黎升级的支持\r\n巴黎升级对以太坊最大的改变就是共识机制从 POW 变成了 POS。Solidity 在语言层面也要做相应的调整，主要是一些内置变量在 POS 共识机制下已经不在适用。\r\n最典型的就是：\r\n```\r\nblock.difficulty\r\n```\r\n区块难度离开 POW，在 POS 中已经没什么意义。从这个版本开始，Solidity 开始逐步废弃 block.difficulty, 现在使用编译器会有警告，计划在 0.9 完全去掉 block.difficulty，那时候再使用就是编译器报错了。\r\n\r\n取而代之的是 \r\n```\r\nblock.prevrandao\r\n```\r\n通过调用 block.prevrandao 可以获取在以太坊信标链 POS 环境中产生的随机数。\r\n\r\n##  0x03  废弃 selfdestruct\r\n这个版本之后再用 selfdestruct 编译器就会警告。具体原因 https://hackmd.io/@vbuterin/selfdestruct 这里有比较详细的解释。"},"author":{"user":"https://learnblockchain.cn/people/29","address":null},"history":"QmU9Qzxuuz83jDLWMZJGjHby8FeRDtuvbMW3xF2caFaV8i","timestamp":1676606815,"version":1}