以太坊作为全球领先的智能合约平台,其核心魅力在于允许开发者部署和执行自动化的、不可篡改的协议——即智能合约,这些定义了复杂逻辑和规则的智能合约,究竟是如何存储在以太坊这个庞大的分布式网络中的呢?本文将深入探讨以太坊智能合约的存储机制。
要理解智能合约的存储,首先需要明确一个关键概念:智能合约本身与其状态是两个不同但紧密相关的部分。
智能合约代码的存储:合约账户中的代码哈希与代码对象
在以太坊中,有两种主要类型的账户:外部账户(EOA,由用户私钥控制)和合约账户(由代码控制),智能合约的部署,本质上是创建了一个合约账户,并将合约代码与该账户关联起来。
-
合约部署过程: 当开发者部署一个智能合约时,他会将编写好的合约代码(通常是以Solidity等高级语言编写,然后编译成字节码)发送到以太坊网络,这个交易的目标地址是一个空地址,以太坊网络会识别出这是一个合约创建交易。
-
代码存储:
- 代码对象(Code Object):以太坊客户端(如Geth, Parity)在收到合约创建交易后,会将编译后的合约字节码作为一个“代码对象”存储在区块链的特定区域,这个代码对象是与新创建的合约账户地址直接关联的。
- 代码哈希(Code Hash):每个合约账户都有一个名为
codeHash的字段,这个codeHash是该合约代码对象的Keccak-256哈希值,值得注意的是,以太坊规定,空字符串的哈希值是一个特定的已知值(c5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470),如果codeHash不是这个值,就意味着该账户是一个合约账户,其对应的代码对象存储在区块链上。
-
代码位置: 合约的字节码并非直接存储在账户状态树的叶子节点,而是存储在一个被称为“合约代码存储区”或“代码仓库”的独立数据结构中,账户状态树中只存储了指向该代码的哈希值,这种设计节省了状态树的空间,因为相同的代码(如果被多个合约使用,尽管不常见)或代码本身只需要存储一份,通过哈希来引用。
智能合约状态的存储:合约账户中的存储槽
智能合约不仅仅是代码,它还需要存储数据,例如用户的余额、交易记录、配置参数等,这些数据被称为合约的状态(State),存储在合约账户的存储(Storage)中。
-
存储结构:
- 合约的存储是一个从整数(索引)到整数的键值对映射。
- 以太坊使用一个名为“存储树”(Storage Tree)的数据结构,它是整个以太坊状态树的一个分支,每个合约账户都有自己独立的存储树。
- 存储树的基本单位是“存储槽”(Storage Slot),每个存储槽大小为32字节(256位),数据被组织并存储在这些连续的存储槽中。
-
数据存储方式:
- 基本类型:如
uint256,address,bool等,通常直接存储在一个或多个存储槽中。 - 数组:数组的元素被连续存储在存储槽中,如果数组长度超过一个槽能容纳的大小,或者元素本身较大,会占用多个连续槽。

- 基本类型:如
欢迎留下您的宝贵意见