solidity_mapping_implementation
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 吧.
solidity_mapping_implementation的更多相关文章
随机推荐
- thinkphp遇到的小问题,js文件中U方法不被解析
我想在js文件中写ajax, 写完发现异常, 本以为是js文件中不支持ajax 后来发现时地址解析错误. 也就是U方法在js文件中不被解析. 貌似thinkphp解析,tpl文件中的一些元素. js文 ...
- kali下apche配置多网站
设置文件地址为 :/etc/apache2/sites-available/default 添加: <VirtualHost *:80> ServerName www.php. ...
- Quartz 用 cron 表达式存放执行计划
Quartz 用 cron 表达式存放执行计划.引用了 cron 表达式的 CronTrigger 在计划的时间里会与 job 关联上. 1.Quartz cron 表达式支持七个域如下: 名称 是否 ...
- python学习(十六) 测试
测试驱动开发. 16.1 先测试,后编码 16.1.1 精确的需求说明 16.1.2 为改变而计划 16.1.3 测试的4个步骤 16.2 测试工具 16.2.1 doctest 16.2.2 uni ...
- jmeter json截取
前些日子压测我们系统,发现我们开发把cookie值当成一个参数返回到了json中,这样就要从json中获取这个cookie后配置到cookie 管理器中 Jmeter中本身是不支持直接处理json串的 ...
- 请尽可能详尽的解释AJAX的工作原理
第一步:创建ajax对象(XMLHttpRequest/ActiveXObject(Microsoft.XMLHttp)) 第二步:判断数据传输方式(GET/POST) 第三步:打开链接 open() ...
- python' s fifth day for me dict
字典 dict : key--vlaue 储存大量的数据,而且是关系型数据,查询速度快(二分查询) 数据类型分类: 可变数据类型(不可哈希):list(列表) , dict(字典), set(集合) ...
- 查看自己U盘格式
转自:https://zhidao.baidu.com/question/220844418.html 选中U盘后,鼠标右键单击,选项菜单中点击属性,出的的属性窗口中的“常规”项里边就有U盘的基本信息 ...
- java中的 equals 与 ==
Java中的"=="永远比较的是两个对象是否是同一个对象(引用指向同一块内存就是同一个对象) Java中equals() 在使用必须与类挂上钩,不能单独使用.有的人这样理解&quo ...
- map两种插入方法解析(insert() 与 下标[]操作)
insert 含义是: 如果key存在,则插入失败,如果key不存在,就创建这个key-value. 实例: map.insert((key, value)) 利用下标操作的含义是: 如果这个key存 ...