一、概念
区块链存储是指在区块链网络中各个节点上安置持久化数据的方式。通常我们指代的是Key/Value
数据库。假设数据库名称为DB
。
存储域:针对物理数据来说,存储域就是对应的文件或者磁盘数据块。针对账户来说,存储域就是Merkle Patricia Trie(MPT树)
。
存储操作:针对各自存储域的操作。
存储域包括:
bare域(FB),指底层数据库,比如RocksDB数据库及其抽象。
account域(FA),指每个账户对应的MPT树。
state域(FS),指global state对应的MPT树。
二、基本操作
添加:也实现为insert,往存储域添加(K, V)。
删除:也实现为remove,从存储域中删除(K, V)。
查找:get,从存储域中获得K对应的值V。
修改:也实现为put或者insert,修改存储域中K对应的值V。
三、存储缓存
3.1 域缓存
指针对某一个域实现的缓存数据结构,命名为C[x]
,显然每个域的缓存内容和该域内容同类。
C[FB],存储有(K1, V1)的内存数据库。
C[FA],存储有(K2, V2)的内存结构。
C[FS],存储有(Address, Account)的内存结构。
3.2 域缓存层级
FA -> FS -> FB
FB Cache:
bare域提供一个内存模拟的K/V数据库,用来缓存物理数据库内容,减少IO负载。每当flush或者db commit的时候,写入到磁盘。
FA提供两层缓冲:
storage changes
表示在当前执行环境下的dirty cache。随着storage被commit而消失。
storage cache
考虑到局部性原理,表示当前帐号最新的storage内容,dirty cache最终被commit到此处。
FS Cache:
用来存储当前state下的账户信息。可感知到分叉的存在,因此需要额外的同步操作来保证缓存一致性。同步操作定义为,用C[FA]复写C[FS]相关item。
由于state随着block走,每当block commit的时候就是该层缓存的刷新时机。
四、基本操作实现
4.1 FB
RocksDB数据库的操作
4.2 FA和FS
MPT树操作,参看MPT相关内容。