在本系列的第一篇文章中,我们深入研究了一个简单的Solidity的汇编代码:
contract C {
uint256 a;
function C() {
a =1;
}
}
该合同归结为调用sstore指令:
// a = 1
sstore(0x0,0x1)
EVM将值0x1存储在存储位置0x0中,每个存储位置可以精确存储32个字节(或256位)。
在本文中,我们将开始研究Solidity如何使用32字节的块来表示更复杂的数据类型,如结构和数组。 我们还将了解如何优化存储以及如何优化。
在典型的编程语言中,理解数据类型如何在如此低的水平上表示并不是非常有用。 在Solidity(或任何EVM语言)中,这种知识至关重要,因为存储访问非常昂贵:
sstore的成本为20000,比基本算术指令贵约5000倍。
sload需要200gas,比基本算术指令贵100倍。
而通过“成本”,不仅是毫秒的性能,运行和使用合同的成本很可能都由sstore和sload主导!
构建通用计算机需要两个基本要素:
一种循环方式,可以是跳转也可以是递归。
无限量存储
EVM汇编代码,EVM存储器提供无限内存。模拟一个运行以太坊版本的环境;
合同的EVM存储就像一个无限的自动收报机磁带,磁带的每个插槽都有32个字节,例如:
[32bytes][32bytes][32bytes]...
我们将看到数据如何存在于无限磁带上。
磁带的长度为2²⁵⁶方或每个合约约10⁷⁷方个存储槽, 可观察的粒子数为10⁸⁰方。
领取专属 10元无门槛券
私享最新 技术干货