Page 150 - 《软件学报》2026年第1期
P. 150
苏琳萱 等: 区块链状态分片技术综述 147
MPT 通过将相同的前缀合并成一条路径来减少存储空间, 避免了重复存储相同前缀的多个节点, 因此具有较小的
存储开销. 同时, 由于 MPT 结合了默克尔树的特性, 使得状态数据具备不可篡改性, 即任何对状态数据的修改都会
引起默克尔树根 (Merkle root) 的变化, 从而保证了状态数据的完整性和一致性. 在全局状态树中, 叶子节点存储账
户的核心状态字段. 每个账户的状态由以下核心字段组成: d i = {X i |η,ω,ζ}, 其中, X i 代表账户地址, η 为交易计数器
(nonce), 表示账户发送的交易次数或合约创建次数, ω 为账户余额 (balance), ζ 为合约特有字段, 包括存储根
(storageRoot) 和合约代码哈希 (codeHash) 等, 用于存储合约数据和标识合约代码.
在全分片系统中, 为支持动态状态分配, 必须设计有效的状态管理机制, 维护状态数据与各个分片之间的映射
关系. BrokerChain [15] 提出了基于分片状态树 (modified shard state tree, mSST) 的状态管理机制, 确保每个分片都能
了解全局状态与分片的存储映射关系, 具体来说, 在 BrokerChain 中, 每个分片都会维护一个唯一的 mSST, 以记录
当前状态的存储位置. mSST 的设计基于以太坊的状态树, 保证状态的高效存储与管理 (如图 6 所示). 与传统的状
态树不同, BrokerChain 中的 mSST 是基于所有账户状态的存储映射构建的. 具体而言, BrokerChain 通过一个向量
φ 表示账户的存储分片. 该向量定义如下:
φ = [e 1 ,e 2 ,...,e K ] (6)
i
其中, e i = 1 表示账户存储在分片 中, 而 e i = 0 表示账户不存储在该分片. 例如, 当 φ = 0010 时, 表示该状态数据存
在分片 3 中. 为了支持该机制, BrokerChain 修改了账户状态的字段, 其数据结构定义如下:
{
d i = X i |φ,η,ω,ζ } (7)
分片 #1 mSST 状态分配结果
根节点 共享前缀: a 地址示例 分片
a13 #1
共享前缀: 1 a14 #2
…
键末位 φ η ω ζ 键末位 φ η ω ζ
4 0100 / 3 1000 23 45 /
叶子节点 #a14 叶子节点 #a13
图 6 分片状态树结构
相较于以太坊的账户状态, 新增字段 φ 表示该账户的存储位置, 对于不属于本分片的账户, mSST 中仅存储该
φ, 而不保留其具体的账户状态数据 η ( 、 ω、
账户的分片映射 ζ 为空).
mSST 充分利用 MPT 自带的路径压缩特性, 结合空字段存储策略, 仅存储与本分片相关的完整账户状态, 从
而显著降低了全局存储开销. 此外, 每个分片均独立维护其对应的 mSST, 允许各分片高效查询状态数据的存储位
置. 由于 mSST 继承了 MPT 的索引机制, 查询某个账户状态的存储分片仅需在 mSST 中进行一次路径查找. MPT
O(l), 其中 l 是账户地址的长度, 即键的位数. 在以太坊中, 账户地址通常为 160 位 (20 字节),
的查询复杂度通常为
因此, 查询的时间复杂度接近常数时间, 即 O(1).
此外, 通过在 mSST 中查询存储映射信息, BrokerChain 能够快速判断某笔交易是分片内交易还是跨分片交
易: 由于分片存储映射向量 φ 的查询仅涉及固定长度的比特运算, 其查询时间复杂度为 O(1).
2.2 状态迁移
动态分配通过调整各分片所维护的状态数据, 能够有效优化系统的跨分片交易比例并实现分片负载均衡. 为
满足动态分配的需求, 状态数据需在分片之间进行迁移. 在状态迁移的过程中, 需要满足以下两个要求.

