区块链研究实验室-深入了解Solidity如何在以太坊上运行-第五节

空白存储空间

存储空间最初默认为零。 让我们看一个简单的合约来说明零价值行为:

pragma solidity ^0.4.11;

contract C {

uint256 a;

uint256 b;

uint256 c;

uint256 d;

uint256 e;

uint256 f;

function C() {

f =0xc0fefe;

}

}

存储的布局很简单:

变量a位于0x0位置

变量b在0x1位置

等等…

关键问题:如果我们只使用f,我们需要为a,b,c,d,e支付多少gas?

让我们编译看看:

$ solc --bin --asm --optimize c-many-variables.sol

集合:

// sstore(0x5, 0xc0fefe)

tag_2:

0xc0fefe

0x5

sstore

存储变量声明不需要任何费用,因为不需要初始化。 Solidity保留该存储变量的位置,并且只有在您存储内容时才需要gas。

在这种情况下,我们只支付存储到0x5。如果我们手工编写程序集,我们可以选择任何存储位置而无需“扩展”存储:

// Writing to an arbitrary position

sstore(0xc0fefe,0x42)

零读取

您不仅可以在存储中的任何地方书写,还可以随时随地阅读。 从未初始化的位置读取只返回0x0。

让我们看一个从未初始化的位置读取的合同:

pragma solidity ^0.4.11;

contract C {

uint256 a;

function C() {

a = a +1;

}

}

编译:

$ solc --bin --asm --optimize c-zero-value.sol

集合:

tag_2:

// sload(0x0) returning 0x0

0x0

dup1

sload

// a + 1; where a == 0

0x1

add

// sstore(0x0, a + 1)

swap1

sstore

请注意,生成从未初始化位置加载的代码是有效的。但是我们可以比Solidity编译器更智能。 由于我们知道tag_2是构造函数并且从未编写过,我们可以用0x0替换sload序列以节省5000个gas。

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20180809A08SBS00?refer=cp_1026
  • 腾讯「云+社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 yunjia_community@tencent.com 删除。

扫码关注云+社区

领取腾讯云代金券