区块链 · 数字资产知识 · 行业资讯
文章库关于本站

技术原理

区块链虚拟机源码先看什么|执行栈、临时内存与持久状态分层理解

摘要

读EVM实现之前,可以先画出数据在执行期间的位置和寿命。运算中的中间值、一次调用使用的内存与合约长期状态不是同一层,源码变量名称也不等于链上存储身份。

区块链虚拟机源码的科技主题配图

先区分执行规则与具体实现

区块链虚拟机源码不是一份所有客户端逐字共用的程序。以太坊EVM介绍列出不同语言的实现;它们需要按相同执行规则处理输入状态和交易,得到对应的新状态。阅读源码时,应先说明所读实现及版本,再把实现中的模块对应到规则,而不是将某个文件名当成协议本身。

本文只建立阅读框架,没有下载、编译或逐行审计某个客户端。EVM处理的是合约字节码与状态;介绍中的实现列表也不是产品性能排名。把这些范围写清,才能避免将规范概念、源代码组织和实测结果混成一件事。

栈用于运算,内存也不是长期账本

EVM介绍把执行模型描述为栈机器:栈最多容纳1024项,每项是256位字。运算指令围绕这些中间值工作。执行期间还存在临时内存,它不会跨交易保留。两者都不应被理解为程序随时可以写入并永久保存的账户数据库。

因此,看执行轨迹中某个值被算出,不能立刻断言它已经成为合约长期状态。可以在阅读笔记中分开标注:运算中间值在哪里、哪一步使用内存、是否涉及持久状态。这个标注方式是理解资料的建议,不是完整的程序正确性证明。

区块链编程教程的科技主题配图

临时状态与持久状态仍需再分一层

同一EVM文档还区分了transient storage与持久storage。前者按交易存续,交易结束清除;后者属于账户关联的持久状态。不能仅因名称都含storage,就将它们的保存期限和作用范围视为相同,也不能把临时状态与普通内存直接合并。

假设两段代码都使用一个名为counter的变量,名称相同并不足以说明它们读写相同数据。还要核对其对应机制与执行上下文。这里采用假设名称辅助阅读,不构成真实代码示例,也未对某个网络当前启用的操作码作兼容性承诺。

变量改名不一定改变已保存数据

OpenZeppelin的可升级合约说明提供了一个有用对照:在它描述的存储布局场景中,变量改名后可以继续读到原来的值,删除末尾声明也不会自动清除已有存储。由此可见,源码中的文字名称和持久数据位置不是同一个概念,不能凭名称变化推断数据已经重建。

该文还区分传统布局与命名空间布局,实际规则需要结合对应实现阅读。本文只借此说明持久状态不能按临时变量理解,不指导合约升级或操作已有资产。一个可靠的源码阅读记录,应分别注明规则版本、数据层次和已核实范围,尚未运行的部分就保持未验证。

← 返回全部文章

延伸阅读 · 相关栏目

区块链基础技术原理数字资产知识资料与核验