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的更多相关文章
随机推荐
- Java-Runoob:Java 教程
ylbtech-Java-Runoob:Java 教程 1.返回顶部 1. Java 教程 Java 是由Sun Microsystems公司于1995年5月推出的高级程序设计语言. Java可运行于 ...
- 第14 章 Spring MVC的工作机制与设计模式
14.1 Spring MVC的总体设计 要使用SPring MVC,只要在web.xml中配置一个DispatcherServlet. 再定义一个dispatcherServlet-servlet. ...
- flask系列六之模型分文件
1.分开models的目的:为了让代码更加方便的管理. 2.如何解决循环引用:把db放在一个单独的文件中,切断循环引用的线条就可以了. (1)避免循环引用 解决循环引用 主文件:main.py fro ...
- 使用Statement接口实现增,删,改操作(工作中不常用这个,而用PreparedStatement接口)
一.Statement接口 作用:用于执行静态 SQL 语句并返回它所生成结果的对象. 1. 创建数据库连接类及相册实体,代码如下: package com.learn.jdbc.util; impo ...
- django 基于正则表达式的url
方式一: urls.py from mytest import views urlpatterns = [ url(r'^index-(\d+)-(\d+).html', views.Index.as ...
- 【知识碎片】Asp.Net 篇
51.app.config 连接字符串 <?xml version="1.0" encoding="utf-8"?> <configurati ...
- 查看window下默认ORACLE_SID
Configuration and Migration Tools-----Configuration and Migration Tools-----Administration Assistant ...
- Spring总结四:IOC和DI 注解方式
首先我们要了解注解和xml配置的区别: 作用一样,但是注解写在Bean的上方来代替我们之前在xml文件中所做的bean配置,也就是说我们使用了注解的方式,就不用再xml里面进行配置了,相对来说注解方式 ...
- Java-Http
1 import java.io.BufferedReader; 2 import java.io.BufferedWriter; 3 import java.io.IOException; 4 im ...
- 728. Self Dividing Numbers可以自己除以自己的数字
[抄题]: A self-dividing number is a number that is divisible by every digit it contains. For example, ...