前言
在以太坊上,我们可以通过部署智能合约来实现我们需要的功能,合约代码中我们往往需要定义一些变量,这就涉及到了智能合约变量的存储机制。
这篇文章我们将根据solidity的所有的变量命名的类型来讲解智能合约的存储机制。
存储机制
每个在以太坊虚拟机中运行的智能合约的状态都在链上永久地存储着。这些值存储在一个巨大的数组中,数组的长度为2^256,下标从零开始且每一个数组能够储存32字节(256个比特)长度的值。并且存储是稀疏的,并没有那么密集。
变量类型
Solidity的数据变量类型分为两类:
SpaceSwap宣布智能合约已通过Lianantech安全审计:DeFi聚合器SpaceSwap宣布,在SpaceSwap 2.0发布期间,SpaceSwap智能合约已由区块链安全公司Beosin旗下Lianantech进行了审计,Lianantech表示其智能合约能够正常运行,没有检测到关键的错误或漏洞。
此外,10月3日,SpaceSwap发推称,MILK2和SHAKE代币正式上线Mooniswap平台,该项目正在将这两项资产添加到其白名单中。(Pressat)[2020/10/4]
值类型-valuetype
引用类型-referencetype
VETH智能合约遭攻击系合约实现问题:据PeckShield态势感知平台数据显示,06月30日下午17时46分,VETH智能合约遭到黑客攻击,被盗919,299个VETH,价值90万美元。PeckShied安全人员迅速介入后定位发现,这起黑客攻击事件不同于Balancer的攻击方式,黑客主要利用未检查权限的changeExcluded()函数,通过transferFrom()将合约地址本身的VETH余额卷走。[2020/7/1]
值类型
布尔型(bool)2bit(0/1)
整型(int/uint)根据关键字的不同表示不同长度,int8表示8bits有符号数
金色财经现场报道 360官方人员高雪峰:360初衷是使区块链行业中涉及到的智能合约更安全:金色财经现场报道,在今日的360媒体见面会上,360官方人员高雪峰表示,“如何利用安全优势切入区块链领域,区块链不是新的技术而是把很多原有的技术做结合,传统的领域遇到的问题在区块链领域都会遇到,只是eos关注人数足够多所以会引起重视。从360角度,也就是站在安全守卫者的角度出发,依托于360的安全代码,360把数字货币异常的交易等都能感知出来。漏洞攻击的角度来说,能够发现问题,使用防御手段,从而使得区块链行业中涉及到的智能合约更安全,这是360的初衷。”[2018/5/29]
定长浮点型(fixed/ufixed)Solidity还没有完全支持定长浮点型。可以声明定长浮点型的变量,但不能给它们赋值或把它们赋值给其他变量
SMT最新公告:“以太坊智能合约溢出漏洞事件”已经得到全面控制:据SmartMesh(SMT)官方微博公告,此次“以太坊智能合约溢出漏洞事件”已经得到全面控制。对于此次溢出事件流出的“假币”,SMT基金会承诺将从公开流通市场进行回购,并进行销毁。[2018/4/27]
定长字节数组(byte/bytes)定义数组时定义长度
地址类型(adress)160bits
地址类型成员变量(balance,transfer....)?
balanceuint256(256bits)?
transfer()uint256(256bits)
引用类型
不定长字节数组类型(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的计算代码,用以验证机制分析的正确性。
当然,本文设计的智能合约设计并不复杂,在实际开发过程中远比此复杂,需要经历一些分析,在能找到正确的存储位置。最后,希望通过本文章可以帮助大家进一步的了解智能合约。
标签:WORTRAINTPINQatar World CupUnited Emirate Decentralized CoinMyPoints E-CommerceEpinToken
尊敬的用户:?即日起,WBF将上线SWTT理财第二期空投活动,具体详情如下:?活动一、参与SWTT理财享空投用户参与SWTT定期理财,除了享受15%年化利息,锁仓100枚SWTT可获得矿机一台.
1900/1/1 0:00:00尊敬的XT用户:FTM钱包升级已完成,XT现已恢复FTM充值与提币业务,暂停期间给您带来的不便,敬请谅解.
1900/1/1 0:00:00尊敬的用戶:AOFEX將於2021年9月27日上線HEGIC、MCB,具體時間安排如下:HEGIC充提業務已開啟HEGIC交易時間:9月28日11:00MCB交易時間:9月28日12:00MCB.
1900/1/1 0:00:00尊敬的中币用户:???USDT/QC交易对手续费优惠活动现已结束,USDT/QC交易将恢复收取手续费.
1900/1/1 0:00:00一、项目简介?BitcoMine(BME)的目标是教育交易员购买和持有比特币的重要性。此外,为他们提供一些基础知识和指导。BitcoMine支持他们使用强大的工具,增强金融和安全知识.
1900/1/1 0:00:00亲爱的用户:由于Hermez(HEZ)被Polygon(MATIC)收购,所有HEZ代币持有者可自行将HEZ置换为MATIC,故顶峰AscendEX将下架Hermez(HEZ).
1900/1/1 0:00:00