codecamp

以太坊 存储、内存和堆栈

以太坊虚拟机具有三个可以存储数据的区域:存储、内存和堆栈。

每个帐户都有一个称为storage的数据区域,它在函数调用和事务之间是持久的。存储是将 256 位字映射到 256 位字的键值存储。无法从合约中枚举存储,读取成本相对较高,初始化和修改存储的成本更高。由于这个成本,您应该将存储在持久存储中的内容最小化为合约需要运行的内容。在合约之外存储衍生计算、缓存和聚合等数据。合约既不能读取也不能写入除了自己的存储之外的任何存储。

第二个数据区域称为内存,其中合约为每个消息调用获取一个新清除的实例。内存是线性的,可以在字节级别寻址,但读取的宽度限制为 256 位,而写入的宽度可以是 8 位或 256 位。当访问(读取或写入)以前未触及的内存字(即字内的任何偏移量)时,内存会扩展一个字(256 位)。扩张时,必须支付gas费用。内存越大,它的成本就越高(它以二次方缩放)。

EVM 不是寄存器机,而是堆栈机,因此所有计算都在称为堆栈的数据区域上执行。它的最大大小为 1024 个元素并包含 256 位的字。通过以下方式对堆栈的访问仅限于顶端:可以将最顶端的 16 个元素之一复制到堆栈的顶部,或者将最顶端的元素与它下面的 16 个元素之一交换。所有其他操作从堆栈中获取最顶部的两个(或一个或多个,取决于操作)元素并将结果压入堆栈。当然,可以将堆栈元素移动到存储或内存中,以便更深入地访问堆栈,但在不首先移除堆栈顶部的情况下,不可能仅访问堆栈中更深的任意元素。


以太坊 GAS
以太坊 指令系统
温馨提示
下载编程狮App,免费阅读超1000+编程语言教程
取消
确定
目录

关闭

MIP.setData({ 'pageTheme' : getCookie('pageTheme') || {'day':true, 'night':false}, 'pageFontSize' : getCookie('pageFontSize') || 20 }); MIP.watch('pageTheme', function(newValue){ setCookie('pageTheme', JSON.stringify(newValue)) }); MIP.watch('pageFontSize', function(newValue){ setCookie('pageFontSize', newValue) }); function setCookie(name, value){ var days = 1; var exp = new Date(); exp.setTime(exp.getTime() + days*24*60*60*1000); document.cookie = name + '=' + value + ';expires=' + exp.toUTCString(); } function getCookie(name){ var reg = new RegExp('(^| )' + name + '=([^;]*)(;|$)'); return document.cookie.match(reg) ? JSON.parse(document.cookie.match(reg)[2]) : null; }