跳至内容
深圳市捷比信实业有限公司 · 产品选型与采购咨询联系业务人员
抗浪涌电阻捷比信 · 专业器件主题站

以太坊如何优化数据存储

为了解决这个问题,让我们了解以太坊如何优化数据存储。但是首先,请确保您知道如何读取区块链上的存储空间。以太坊如何优化数据存储从Solidity文档中,我们得到了以下定义:静态大小的变量(除映射和动态大小的数组类型以外的所有内容)从位置0开始连续放置在存储中。如果可能,多个项需要少于32个字节包装在一个存储槽中。以下是根据以下规则导致存储使用效率低下的示例。请注意,较小的变量(例如boolVar和bytes4Var)未按顺序初始化,它们将占用新的插槽0和2:当它们可以打包在一起时:一种更有效的存储方法是声明bool(1字节大小),然后bytes4(4字节大小)变量。然后,EVM将这两个模块有效地包装到一个存储插槽中。同样,在对象结构中,一种更有效的方法是将两个uint8组合在一起以占用1个插槽。这样,Object的所有将来实例仅需要存储2个插槽,而不是3个插槽。存储优化在结构中尤其重要,因为存储可以快速增长:注:插槽索引从右到左为0。在boolVar之后初始化Bytes4Var,因此将其存储在boolVar的左侧,正好是1个字节。例外:1.该常数未存储在内存中。根据以太坊文档,编译器不会为常量变量保留存储槽。这意味着您将无法在任何存储插槽中找到以下内容:合同A {uint公共常数=。 ..; //未存储在存储设备中} 2,映射和动态调整大小的数组不遵循这些约定。关于这一点将在后面详细说明。您现在可以解决此问题!详细的演练要解决此级别的问题,您必须找出数据[2]中存储的内容,将其转换为bytes16变量,然后将其提交为unlock()privacy.sol的密钥。 0.请注意privacy.sol中的以下变量声明。让我们计算一下所占用的存储插槽://布尔值占用1个字节布尔型public lock = true; // IGNORE:由于常量uint不存储在存储器中uint256公共常量ID = block.timestamp; // uint8 vars占用1个字节uint8私有展平= 10; uint8私有denominaTIon = 255; // uint16占用2个字节uint16私有笨拙= uint16(现在); //每个bytes32占用一个插槽//因此长度为3的数组占用3bytes32 [3]私有数据;您应该期望unlock,flattening和denominaTIon三个字段总共占据5个字节,并且仅共享1个存储插槽(27个字节的可用存储空间)。您应该期望数据阵列剩余3个插槽,并且每个数据都有一个数据[index]。 1.要获取数据[2],请阅读插槽4的存储:在Truffle控制台-网络Ropsten中,访问您的关卡实例,并调用GetStorageAt(…,3)以获取数据[2]。 2.使用Remix将bytes32结果转换为bytes16值。 3.使用Remix并使用bytes16值调用unlock()来解锁该级别!关键安全元素:通常,过多使用插槽会浪费大量气体,尤其是如果您声明一个将复制许多实例的结构时,尤其如此。记住要优化存储以节省气体! ·如果不需要维护智能合约的状态,请将变量保存到内存中。存储“” SLOAD是非常耗油的操作代码。 ·区块链上的所有存储都是公开可见的,甚至是您的私有变量!不要存储密码和私钥而不进行散列