solidity_mapping_implementation

简介: solidity 中 mapping 是如何存储的为了探测 solidity mapping 如何实现,我构造了一个简单的合约. 先说结论,实际上 mapping的访问成本并不比直接访问storage变量多花费更多的 gas.

solidity 中 mapping 是如何存储的

为了探测 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 吧.

目录
相关文章
|
SQL Dubbo 中间件
分布式事务:中间件方案
分布式事务:中间件方案
575 88
|
XML 设计模式 C#
技术心得记录:某软件公司面试题c#
技术心得记录:某软件公司面试题c#
|
关系型数据库 MySQL Shell
MySQL报错:Got error 28 from storage engine
MySQL报错:Got error 28 from storage engine
323 0
|
存储 人工智能 BI
差分与前缀和
差分与前缀和
133 0
leetcode-88:合并两个有序数组
leetcode-88:合并两个有序数组
99 2
|
数据采集 大数据
面试心经03--大数据开发工程师
面试心经03--大数据开发工程师
|
搜索推荐
一对一直播源码,为什么定制开发更受欢迎?
一对一直播源码,为什么定制开发更受欢迎?
|
人工智能 达摩院
达摩院特别版-视觉AI训练营第五天
达摩院特别版-视觉AI训练营第五天
781 0
|
固态存储 Oracle 关系型数据库
Dell PowerEdge R740xd解析:服务器只看参数那就错了
- 支持3/6块共900W GPU:PCIe散热设计非易事; - NVDIMM:电池保护、Oracle数据库和SDS应用; - 机箱内部驱动器托架、PERC、NDC等
5553 0