WOR:智能合约变量储存机制详解

前言

在以太坊上,我们可以通过部署智能合约来实现我们需要的功能,合约代码中我们往往需要定义一些变量,这就涉及到了智能合约变量的存储机制。

这篇文章我们将根据solidity的所有的变量命名的类型来讲解智能合约的存储机制。

存储机制

每个在以太坊虚拟机中运行的智能合约的状态都在链上永久地存储着。这些值存储在一个巨大的数组中,数组的长度为2^256,下标从零开始且每一个数组能够储存32字节(256个比特)长度的值。并且存储是稀疏的,并没有那么密集。

变量类型

Solidity的数据变量类型分为两类:

波卡生态智能合约平台Plasm Network将更新品牌形象和网站:官方消息,波卡生态智能合约平台Plasm Network宣布,将在短期内更新品牌形象和网站。[2021/5/12 21:53:12]

值类型-valuetype

引用类型-referencetype

值类型

布尔型(bool)2bit(0/1)

整型(int/uint)根据关键字的不同表示不同长度,int8表示8bits有符号数

定长浮点型(fixed/ufixed)Solidity还没有完全支持定长浮点型。可以声明定长浮点型的变量,但不能给它们赋值或把它们赋值给其他变量

蚂蚁集团:区块链有望通过智能合约使网络互助流程更加自动化:最近,蚂蚁集团发布全国首份《网络互助行业白皮书》。白皮书也指出,未来10年,关键核心的数字技术将在网络互助行业获得更深层次应用,如大数据、知识图谱等技术将使智能赔付流程更加精准化,未来区块链技术也有望通过智能合约使网络互助流程更加自动化。(科技日报)[2020/7/3]

定长字节数组(byte/bytes)定义数组时定义长度

地址类型(adress)160bits

地址类型成员变量(balance,transfer....)?

balanceuint256(256bits)?

声音 | 彭枫:智能合约交易可以减少人工干预:金色财经现场报道,在今日举办的金融界2018夏季达沃斯之夜+区块链思享会上,中国人民银行数字货币研究所规划部负责人彭枫提出了自己的创新思路,认为区块链可以做到数据上链登记,包括三流信息同步,多方信息一致,全新数据存储结构,算法保障安全可信,对等协作新模式;全方位数据验证,包括开放账本体系,内部共识验证,外部交叉验证,共享验证存证,探索跨链交互;信息穿透,包括底层资产信息披露,信息安全可信,动态数据更新,信息全局一致,满足多方需求;智能合约交易,包括减少人工干预,简化流程执行,公开透明交易,自动强制执行,创新业务探索等。[2018/9/17]

transfer()uint256(256bits)

动态 | 新增代币型智能合约地址数连“涨”至235个:第三方大数据评级机构RatingToken最新数据显示,2018年8月27日全球共新增1862个合约地址,其中235个为代币型智能合约。同时,在RatingToken发布的“新增代币型智能合约风险榜”中,风险排名前三的是Value Chain(VaT)、Saloon(SLXN)和General Neural AI Token(GNAIT),其中Value Chain(VaT)存在39个安全风险,检测得分为3.38。此外,其他登上该风险榜TOP10的还包括VeronX(VRX)、imfomo Long Official(imfomo)、FoMo3D Long Official(F3D)、XMG Long Official(XMG)、TEST Coin(TEST)、Lucky Buddy(Lucky)和SOBO(SOBO)。如需查看更多智能合约检测结果,请查看原文链接。[2018/8/28]

引用类型

不定长字节数组类型(bytes/byte,string,uint....)

结构体(struct)

映射(mapping)

简单分析

写一个简单值类型的合约

pragmasolidity^0

可以看到虽然规定了了长度为5,但是实际上只用了4个,所以就只是用了四个bytes8的空间。

是不是可以加一个,编译器会报错。

变长数组

pragmasolidity^0

functionunlock(bytes32_password)public{?if(password==_password){??locked=false;?}}}

定义为私有变量只能组织其他合约访问,但是无法阻止公开访问

按照其代码,可以知道password的存储位置是1

web3.eth.getStorageAt(contract.address,1)

直接使用

contract.unlock("Averystrongsecretpassword:)")//密码错误

contract.unlock(web3.utils.hexToBytes('0x412076657279207374726f6e67207365637265742070617373776f7264203a29'))

题目二--LockBox

pragmasolidity0.4.24;import"../CtfFramework.sol";contractLockbox1isCtfFramework{?uint256privatepin;?constructor(address_ctfLauncher,address_player)publicpayable???CtfFramework(_ctfLauncher,_player)?{???pin=now000;?}??functionunlock(uint256_pin)externalctf{???require(pin==_pin,"IncorrectPIN");???msg.sender.transfer(address(this).balance);?}}

读取私有变量

constructor只在构造的时候执行一次

总结

本篇文章详细讲解了智能合约的优化存储原则,数组类型,字符串类型,结构体类型和映射类型的存储机制。同时提供了基于python的计算代码,用以验证机制分析的正确性。

当然,本文设计的智能合约设计并不复杂,在实际开发过程中远比此复杂,需要经历一些分析,在能找到正确的存储位置。最后,希望通过本文章可以帮助大家进一步的了解智能合约。

郑重声明: 本文版权归原作者所有, 转载文章仅为传播更多信息之目的, 如作者信息标记有误, 请第一时间联系我们修改或删除, 多谢。

地球链

[0:15ms0-0:538ms