本文共 1022 字,大约阅读时间需要 3 分钟。
为了探测 solidity mapping 如何实现,我构造了一个简单的合约. 先说结论,实际上 mapping的访问成本并不比直接访问storage变量多花费更多的 gas.两者几乎差不多.
pragma solidity ^0.4.23;contract TestMap{ mapping(uint256 => uint256) public channels; function TestSet() external{ channels[0x39]=0x77; }}
合约非常简单,就是写一个 mapping.
最主要是这些指令里面就有一条昂贵的就是 sstore, 至少需要5000gas.
/* "testmapping.sol":151:155 0x77 */ 0x77 /* "testmapping.sol":136:144 channels */ 0x0 /* "testmapping.sol":136:150 channels[0x39] */ dup1 /* "testmapping.sol":145:149 0x39 */ 0x39 /* "testmapping.sol":136:150 channels[0x39] */ dup2 mstore 0x20 add swap1 dup2 mstore 0x20 add 0x0 keccak256 /* "testmapping.sol":136:155 channels[0x39]=0x77 */ dup2 swap1 sstore pop
由于指令的成本较低,写 storage 最少需要5000gas, 而 sha3只需要30+gas, 可以忽略不计,其他指令也很便宜.
当然如果是读的话,就稍微贵一点点,读 storage 是200gas, 那么 sha3加上这些指令,估计就有接近100了. 不过如果mapping 确实可以带来便利,那就用 mapping 吧.转载地址:http://ljycx.baihongyu.com/