前言
在以太坊上,我们可以通过部署智能合约来实现我们需要的功能,合约代码中我们往往需要定义一些变量,这就涉及到了智能合约变量的存储机制。
这篇文章我们将根据solidity的所有的变量命名的类型来讲解智能合约的存储机制。
存储机制
每个在以太坊虚拟机中运行的智能合约的状态都在链上永久地存储着。这些值存储在一个巨大的数组中,数组的长度为2^256,下标从零开始且每一个数组能够储存32字节(256个比特)长度的值。并且存储是稀疏的,并没有那么密集。
变量类型
Solidity的数据变量类型分为两类:
币安:团队正在优化质押流程以降低任何潜在的智能合约风险:5月31日消息,安全社区Dilation Effect昨日在博客文章中指出主流交易所和机构钱包地址安全防护问题,其中,币安存在对合约的授权没有定期清理、大量的币种授权额度无限制、币种授权规则不统一等问题。
币安对此做出回应称,团队正在优化质押流程以降低任何潜在的智能合约风险。安全团队已针对不同币种设置了不同的授权限额,且会在每次合约完成后撤销质押许可。需要澄清的是,在不同的质押项目中,将会为不同的币种做不同的限制,因此针对某一币种/项目的授权规则不会完全一致。”[2023/5/31 11:50:11]
值类型-valuetype
Curve:不需要重新部署crvUSD的智能合约:金色财经报道,Curve发推表示,已经进行了更多crvUSD测试,到目前为止,不需要重新部署智能合约,用户界面将于本周上线。[2023/5/9 14:50:48]
引用类型-referencetype
值类型
布尔型(bool)2bit(0/1)
整型(int/uint)根据关键字的不同表示不同长度,int8表示8bits有符号数
定长浮点型(fixed/ufixed)Solidity还没有完全支持定长浮点型。可以声明定长浮点型的变量,但不能给它们赋值或把它们赋值给其他变量
SevenX Ventures完成波卡生态多链智能合约平台ParaState追投:据官方消息,SevenX Ventures曾参与对波卡生态多链智能合约平台ParaState的种子轮投资,并于近日完成对ParaState的追投。SevenX Ventures认为,ParaState作为波卡生态中首个同时支持EVM和EWASM的底层基础设施,将会成为跨链虚拟机的标准之一。
SevenX Ventures是一家研究驱动型区块链投资公司,坚持浸入式投资,团队在市场,经济体系,资源等方面为项目方全面赋能。SevenX Ventures投资组合覆盖Defi、NFT、波卡、Web3等领域,包括DoDo、Maskbook、Subquery、Zerion、Vega、Furucombo、Daomaker、InsurAce、Darwinia、Litentry等项目。[2021/4/10 20:03:48]
定长字节数组(byte/bytes)定义数组时定义长度
全国首款金交所区块链智能合约产品落地:在供应链金融这个具有万亿级别规模的市场,天津金融资产交易所联合恒生电子,实现了国内首例金交所区块链业务场景的落地。这款产品的研发成功,标志着供应链金融已经进入了技术引领的金融科技时代,提供了由点到段,再到整个供应链链条的金融解决方案。[2018/6/20]
地址类型(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的计算代码,用以验证机制分析的正确性。
当然,本文设计的智能合约设计并不复杂,在实际开发过程中远比此复杂,需要经历一些分析,在能找到正确的存储位置。最后,希望通过本文章可以帮助大家进一步的了解智能合约。
标签:INTWORPINBYTblockchaintechnology怎么读ClubFi NetworkPIN价格BYTES
关于Gate.ioStartup免费空投计划为回馈平台用户,Gate.io上线“免费空投计划”,在Startup区不定期进行区块链项目的免费空投计划.
DeFi周报是Odaily星球日报联合全球Defi孵化工场DeFictory、区块链营销咨询公司WXY、数据提供方OKLink、内容合作方BlockArk推出的一档栏目.
注:原文来自hyperledger。2019年,全球约有79亿条数据记录遭到破坏,然而,39%的公司没有使用强大的数据安全措施,因为部署复杂性是一大障碍.
F2Pool矿池停止向中国用户提供服务;星火矿池宣布将于9月30日停止运营。近期,国内多地因电力短缺等因素出现断电情况,加密挖矿预计将进一步遭受打击,国内加密监管保持趋严态势.
新加坡,国土面积仅有724.4平方公里,人口不到600万,国内既没有丰富的资源,又没有足够大的市场,却成为国际上最开放的经济体之一,人均GDP达到了65000美元.
随着区块链行业内容的热度不断提高,关注其行业的用户群体数量也不断上升,难免有一些不法分子“借题发挥”.