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

前言

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

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

存储机制

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

变量类型

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

Gate.io明日16点上线ETHA锁仓赚币:据官方公告,Gate.io将于4月13日(明日)16:00上线ETHA锁仓赚币,总额度200,000 ETHA,锁仓14天。[2021/4/12 20:10:55]

值类型-valuetype

引用类型-referencetype

值类型

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

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

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

Gate.io永续合约实盘交易11月7日-8日结果公布:据官方公告,Gate.io永续合约USDT实盘交易冬季争霸赛11月7日-8日中奖结果已公布,单日最高合约用户收益率720.88%,最大盈利57832.8311 USDT。活动期间交易盈利超过100USDT自动获得1000GT抽奖资格,单日排名前三用户享双倍抽奖资格。[2020/11/9 12:03:19]

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

地址类型(adress)160bits

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

balanceuint256(256bits)?

动态 | 完成4000万美元IPO之后,Silvergate CEO押注加密市场高波动性:加密友好银行Silvergate Bank正从本月的IPO中支出现金,以扩大发行规模。Silvergate首席执行官Alan Lane在接受采访时表示,IPO为新产品提供了新的资金,以满足机构对完整的加密货币借贷和存款解决方案不断增长的需求。Lane表示,更大的价格波动可能给加密市场带来更多的价差和获利机会。这将导致交易者增加在Silvergate的美元存款。Lane补充称:“我们不预测这种情况何时会发生,但我们知道可能还会有一段时间,到时波动性会推高交易量。我们希望确保在这种情况发生时能够帮助客户……根据我们的经验,这与资产的绝对价格没有太大关系,而是与价格的波动有关,我们看到了一些客户行为的潜在变化。”Lane指出,一个潜在的催化剂可能是明年比特币区块奖励减半,其它事件可能包括监管机构批准加密货币ETF、硬分叉产生新币,或者交易所受到黑客攻击影响市场情绪等。据悉,11月7日,Silvergate在纽约证券交易所上市,交易代码为SI,并于11月12日完成了4000万美元的IPO。(CoinDesk)[2019/11/22]

transfer()uint256(256bits)

声音 | 美国黑客:智能合约本身就是一笔赏金:据ambcrypto消息,在旧金山区块链周期间,美国黑客、Comma.ai创始人George Hotz称,以太坊是一个很棒的bug赏金平台,而且智能合约本身就是一笔赏金,个人甚至不需要开发商。如果他们有能力破解智能合约,就会得到报酬。此外,这个过程并不违法,因为黑客只是在以太坊平台上运行代码。另外他还称,比特币是唯一存在可扩展性问题的加密货币。[2018/10/18]

引用类型

不定长字节数组类型(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:0ms0-3:936ms