前言
在以太坊上,我们可以通过部署智能合约来实现我们需要的功能,合约代码中我们往往需要定义一些变量,这就涉及到了智能合约变量的存储机制。
这篇文章我们将根据solidity的所有的变量命名的类型来讲解智能合约的存储机制。
存储机制
每个在以太坊虚拟机中运行的智能合约的状态都在链上永久地存储着。这些值存储在一个巨大的数组中,数组的长度为2^256,下标从零开始且每一个数组能够储存32字节(256个比特)长度的值。并且存储是稀疏的,并没有那么密集。
变量类型
Solidity的数据变量类型分为两类:
ZT交易所已经支持BitTorrent(BTT)智能合约置换及代币增量:据最新消息,ZT交易所已经支持BitTorrent(BTT)智能合约置换及代币增量。所有ZT用户持有的BTT旧代币将按照 1 BTT(旧代币)= 1,000 BTT(新代币)的兑换比例发放BTT新代币。
BitTorrent Chain 是异构链跨链互操作扩容协议,采用 POS(Proof of Stake)共识机制 ,通过侧链进行智能合约的扩展。首发支持 Ethereum 、TRON 、BSC 公链跨链,未来将逐步支持更多公链。[2022/1/18 8:57:33]
值类型-valuetype
法学教授Agata Ferreira:对智能合约的充分监管指导有助于消除其法律上的不确定性:法学教授Agata Ferreira发文表示,全球智能合约的市场规模正在快速增长。预计在2020年至2025年的预测期内,市场复合年增长率将达到17.4%。智能合约越来越多地部署在包括金融部门在内的广泛领域,如公共部门、供应链管理以及汽车、房地产、保险和医疗保健行业等。它们也是不断增长的去中心化金融 (DeFi) 的支柱。监管机构在应对和解决智能合约方面将面临越来越大的挑战,但迄今为止的立法举措表明,智能合约的使用没有重大障碍。
与此同时,对智能合约的不同定义和潜在法律处理的激增可能会导致法律不确定性和监管套利。因此,立法者应密切关注智能合约的发展,并仅在必要时介入以提供法律确定性、降低风险和保护脆弱的缔约方。这种衡量和基于风险的监管方法将支持创新、利用机会并将智能合约创新整合到现有法律体系中。充分的监管指导还有助于消除法律上的不确定性,提升行业、投资者和消费者的市场信心。(Cointelegraph)[2021/6/19 23:50:06]
引用类型-referencetype
动态 | 票务商Ticketmaster希望使用智能合约支持票务行业:美国门票销售和分销公司Ticketmaster副总裁Sandy Khaund12月9日在拉斯维加斯举行的Elev8CON大会上表示,智能合约可以为票务行业带来的价值,到2025年,这个市场规模有望达到62.3亿美元。 Khaund强调,为了创造可扩展性、与其他服务提供商的无缝集成,票务提供商应该考虑将票务作为智能合约来对待。(Cointelegraph)[2019/12/10]
值类型
布尔型(bool)2bit(0/1)
整型(int/uint)根据关键字的不同表示不同长度,int8表示8bits有符号数
富士通开发出检测智能合约风险技术:富士通研究所以及中国富士通开发中心,已经实现了能够检测智能合约上的风险,并在源代码上标示出来。本次技术的细目发表在了BSC(Blockchains and Smart Contracts Workshop)2018大会上,本次会议2月26日到28日在法国巴黎举办。[2018/3/7]
定长浮点型(fixed/ufixed)Solidity还没有完全支持定长浮点型。可以声明定长浮点型的变量,但不能给它们赋值或把它们赋值给其他变量
定长字节数组(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的计算代码,用以验证机制分析的正确性。
当然,本文设计的智能合约设计并不复杂,在实际开发过程中远比此复杂,需要经历一些分析,在能找到正确的存储位置。最后,希望通过本文章可以帮助大家进一步的了解智能合约。
郑重声明: 本文版权归原作者所有, 转载文章仅为传播更多信息之目的, 如作者信息标记有误, 请第一时间联系我们修改或删除, 多谢。