空白存储空间
存储空间最初默认为零。 让我们看一个简单的合约来说明零价值行为:
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。
领取专属 10元无门槛券
私享最新 技术干货