区块链的世界状态是什么意思

昕阳小编 93 0

在庞大的区块链产业中,“世界状况”是人们经常提到的一个技术术语。什么是世界状态,不同项目的世界状态是如何设计和实现的,状态爆炸应该如何解决?

区块链可以理解为一个分布式状态机:所有节点从同一个创建状态开始,依次运行已经达成共识的区块中的事务,驱动所有节点的状态按照相同的操作顺序(添加、删除、修改)不断变化,使得所有节点在执行完相同编号的区块中的事务后状态相同。我们称这种状态为。

区块链的世界状态是什么意思-第1张图片-昕阳网

图1区块链状态改变世界状态。里面记录了各种信息,比如账户余额、智能合约字节码、每个智能合约的自定义数据(比如一个游戏DAPP的道具相关信息)、链的配置参数等。世界的状态表示当前状态,即每个记录的状态数据的当前值。为了保证在执行事务时世界状态能够快速更新,世界状态方案的设计和实现要考虑状态数据的快速搜索和高效更新。

比特币的世界状态数据存储在chainstate目录中,由LevelDB管理。它主要存储所有尚未花费的事务输出和事务的元数据信息,用于验证新进入的事务和块。在存储这些数据时,会进行适当的压缩。LevelDB是一个持久的键值数据库,利用了磁盘顺序写入性能远大于随机写入的特点,采用LSM树结构将磁盘随机写入转化为顺序写入,大大提高了写入速度。LSM将树结构分为一棵大树和一棵小树,较小的树驻留在内存中,较大的树持久存储在磁盘中。写操作会先操作内存中的树,随着内存中的树变大,会触发与磁盘中的树的合并操作,合并操作本身只是顺序写。比特币的LevelDB存储了多种数据,其中最重要的是硬币数据,以“”的形式存储。Key为CoinEntry类型,由3部分组成:1字节大写字符“C”(DB _ COIN),32字节交易ID值,4字节序列号;序列化价值硬币价值硬币对象。区块链的世界状态是什么意思-第2张图片-昕阳网图2比特币LevelDB中存储的硬币数据以及硬币数据操作的相关类如下图所示:CCoinsView接口类定义了对硬币的操作集合,CoinsViewDB类用于真正与LevelDB进行交互。此类有一个全局实例pcoinsdbviewCCoinsViewBacked类充当多个Coinview级别之间的传输层;CCoinsViewMemPool类专门用于处理与MemPool相关的未使用的事务;CCoinsViewErrorCatcher类包装LevelDB读取的错误处理;CCoinsViewCache类使用CCoinsMap来存储CoutPoint到CCoinsCacheEntry对象的映射,这个类有一个全局实例pcoinsTip。CCoinsViewCache类是一个内存缓存实现。获取Coin时,使用传入的OutPoint对象作为键,在CCoinsViewCache的内部成员hashmap中查找;如果找不到,就在初始化CCoinsViewCache对象时传入的基视图中查找。如果在基本视图中找到它,使用这个条目填充内部散列表。当添加Coin时,它也被添加到hashmap(CCoinsViewCache的内部成员)中,并设置相应的DIRTY、FRESH标志。CCoinsViewCache有一个Flush接口,通过BatchWrite将缓存的内容写入数据库。区块链的世界状态是什么意思-第3张图片-昕阳网图3比特币操作相关类比特币的世界状态是用网络中的全局未用事务输出(UTXO)来描述的,而以太坊则用账户概念来描述状态信息。帐户状态包含四个属性,nonce、balance、storageRoot和codeHash。以太坊使用stateObject管理账户状态,账户用地址唯一标识,在相关交易执行过程中修改其信息。所有的账户对象被逐一插入到MPT结构中,形成stateTrie。头数据结构中的根字段存储stateTrie的根值,即世界状态的哈希值。 区块链的世界状态是什么意思-第4张图片-昕阳网图4以太坊世界状态哈希以太坊使用StateDB管理stateObject,包含两个接口:Trie接口用于操作内存中的MPT,数据库接口用于操作持久存储数据库。不同版本的以太坊客户端使用不同的数据库。Go、C和Python客户端使用LevelDB,Rust实现的奇偶校验客户端使用RocksDB。RocksDB是基于LevelDB开发的,优化了LevelDB中存在的一些问题。StateTrie存储账户的信息(余额、发起交易数、虚拟机指令数组等。),所以每一次事务执行都会导致StateTrie的变化。StateDB定义了IntermediateRoot()函数,用于生成实时根值。入口函数StateProcessor。由事务调用引擎执行的Process()。Finalize()在返回之前,Finalize()在内部调用上面的IntermediateRoot()函数并赋给块头的Root字段,这个字段是块中所有交易完成后所有账户信息的即时状态生成的根值。StateDB使用两级缓存机制来存储和更新所有表示帐户的stateObject对象。一级缓存以映射的形式存储状态对象。二级缓存以MPT的形式存储,最后调用CommitTo接口实现对键值数据库的持久化存储。区块链的世界状态是什么意思-第5张图片-昕阳网图5以太坊的世界状态更新从比特币和以太坊的处理可以看出,两个项目都采用了内存缓存机制,配合实现持久化的key-value数据库来管理世界状态,从而保证了更新世界状态的高效率。此外,两个项目都采用键值映射数据结构,无论内存缓存尚力财经小编2022还是底层持久化,都是为了实现快速数据搜索。以太坊还利用MPT结构跟踪内存中的状态变化,在每个块的数据块头中记录对应世界状态的哈希值,从而将每个节点世界状态的一致性纳入一致性验证的范围。区块链的一个重要指标是事务处理能力TPS(每秒事务数)。事务处理过程可以高速频繁地读写世界状态,因此需要一个高性能的数据库来管理世界状态。此外,当事务修改世界状态时,有可能共识协议要求回滚,因此需要数据库或应用层逻辑来支持数据修改和回滚。与比特币以太坊使用的密钥数据库LevelDB或RocksDB相比,更好地支持简单的键/值查询,但对复杂查询的逻辑支持需要应用层自己实现。Ultrain实现的开放联盟链(以下简称开放联盟链)正是考虑到以上原因,选择开源的chainbase数据库进行世界状态管理。区块链的世界状态是什么意思-第6张图片-昕阳网图6 chainbase,开放联盟链的世界状态处理,是一个内存数据库,使用内存文件映射技术将文件映射到进程的地址空间。当物理内存空间足够时,可以保证足够高的读写性能。Chainbase有撤销会话的概念,支持回滚未提交的状态修改。Chainbase基于boost库的multi_index_container实现,支持多关键字索引,从而支持丰富的查询逻辑。

内存,分为文件备份和匿名两种。file-backed对应的是文件,数据是可以修改的,比如程序的文本段,文件的共享内存和可修改的数据。匿名内存中的数据没有文件对应,或者对应文件中的内容无法修改,比如堆、栈、共享库、静态数据区、未初始化数据区。Chainbase使用memap并设置MAP_SHARED标志,它的类型是file-backed。将系统文件映射到进程的地址空间,直接访问内存读写文件。系统定期尚力财经小编2022向磁盘写入脏数据,会占用CPU和IO,影响性能。链库大小可能超过物理内存。当数据被访问时,系统通过缺页中断将数据加载到内存中。理论上chainbase可以无限大,但是超过物理内存的数据量会导致频繁的缺页中断,增加事务执行时间,严重影响系统的TPS性能。

链库支持撤消会话的概念。 创建撤消会话时,将跟踪和记录chianbase的添加、删除和修改。如果需要回滚,撤销时会恢复原记录;如果不需要回滚,保存的撤消状态信息将在提交时被丢弃,以使修改不可逆。链表中的每个数据表都有三个独立的撤销栈,分别记录对数据表的添加、删除和修改操作。在每个块和每个事务的开始创建一个新的撤消高速缓存条目;如果事务成功,则进行撤销栈融合操作,修改合并到该块的撤销条目中;如果事务失败,状态将回滚,事务对数据表的修改将回滚。区块链的世界状态是什么意思-第7张图片-昕阳网图7链座撤销机构的具体操作流程如上图所示。例如,如果chainbase中的原始变量A是3,而新事务将它更改为4,则chain base将在修改后的undo statck中记录原始值3。如果事务成功,修改的记录将与块级撤消堆栈合并。如果事务失败,则执行回滚操作。撤销堆栈内容在被块提交确认后被丢弃。

chainbase采用了boost库中的multi_index_container数据结构,是boost实现的多关键字索引容器,可以理解为数据库中的一个表。在未来的链式实现中,chainbase有20多个核心数据表(见controller.cpp中的add _ 尚力财经小编2022 indicators函数)。与智能合同开发数据库的操作相关的有两个表table_id_multi_index和key_value_index。table_id_multi_index保存智能合同中创建的所有表的信息,key_value_index保存智能合同中创建的所有表的数据记录。此外,使用五个表(index64_index、index128_index、index256_index、index_double_index、index_long_double_index)存储二级索引数据,实现数据记录的灵活查询。

开放联盟链是主侧链架构,节点会在侧链间随机调度。链间调度引入了一个问题:一个节点从一个侧链到另一个侧链的调度相当于一个新节点加入了侧链网络,所以这个节点需要和其他节点有相同的世界状态,才能加入共识参与分块过程。构造世界状态,可以利用历史块数据依次执行块中存储的事务,重构世界状态;也可以使用保存的世界状态快照文件直接还原指定区块的世界状态,然后继续重放后续区块。第一种方式,链运行的时间越长,产生的数据就越多,重播的时间就越长。第二种方式,一方面需要考虑如何高效地生成世界状态的快照文件,另一方面需要为节点提供一种机制来验证其获得的世界状态的快照文件是正确的,没有被篡改。如何在不影响主线程正常事务处理,即不影响TPS性能的情况下,高效生成世界状态快照文件?Ultrain采用缓存机制,并使用单独的世界状态快照来生成线程。如下图所示,类似于chainbase的撤销堆栈机制,Ultrain增加了缓存模块。每一个事务修改chainbase数据,一方面会进入undo栈支持状态回滚,另一方面会进入cache模块为单个世界状态快照生成线程处理。cache模块的处理逻辑与undo stack不同,缓存保留多个块数据块的修改,并保持合并,每隔一定间隔(例如每产生100个块)生成一个新的条目,如下图,901 ~ 1000,表示编号为901和1000的块之间的数据修改缓存。区块链的世界状态是什么意思-第8张图片-昕阳网图8撤销堆栈和世界状态缓存类似于LevelDB中合并内存和文件系统文件的机制。在生成开放联盟链的世界状态快照期间,世界状态数据将被存储在文件系统中。使用缓存机制,内存只占用少量空间来记录短时间内的数据修改。在特定的块间隔(例如,每100个块),世界状态生成线程(follo中的ws线程 通过采用这种机制,世界状态快照生成的过程不会影响主线程的性能,也不会造成大量的内存占用。区块链的世界状态是什么意思-第9张图片-昕阳网图9主线程和世界状态生成线程的文件系统每隔一定的块(可配置参数,目前链式未来主网络的配置为1000块)分别保存生成的世界状态快照文件,并计算快照文件的哈希值。每个节点会将哈希值上报给主链系统契约,被调度的节点启动时会从主链获取哈希值,以便节点检查获取的世界状态快照文件是否被恶意篡改。世界状态快照生成机制保证了节点能够快速恢复到指定块的世界状态,从而支持未来链式主边链机制中的关键节点随机调度功能。

区块链网络中的所有节点运行一段时间后,会有越来越多的数据存储在本地。存储的本地数据包括历史数据和世界状态数据:历史数据主要以块的形式存储,包含所有的交易信息;世界状态数据是由处理从创建块的开始到当前块高度的所有事务的节点形成的当前状态数据。无论是历史数据还是世界状态数据,都会随着系统的运行不断增长,使得运行整个节点所需的存储资源越来越大。目前区块链的处理性能还是比较低的(比特币7TPS,以太坊15TPS,其他区块链几千TPS)。考虑到区块链的处理性能已经有了很大的提高,存储增长的问题会变得更加严重,也就是状态爆炸的问题。历史数据的积累相对容易解决,可以采用集中压缩存储,或者使用检查点机制,使得所有节点都不需要存储某个时间点之前的历史数据。对于世界状态数据的状态爆炸问题,目前主要有状态租赁方案、状态剪枝方案和“无状态节点”方案等解决方案。

状态租赁方案要求用户为存储的数据支付租金,这不仅考虑了数据占用的空间,而且与它在链中的存储时间成正比。通过让用户支付状态费,可以随着时间的推移删除不再使用的状态信息,从而防止数据逐渐增加。关于收费模式有不同的讨论,目前没有明确的结论。

状态剪枝方案是指全节点只存储近期的数据,比较老的历史数据将存储在其他地方,状态剪枝方案会影响那些依靠全节点索引和查询所有历史数据的DApp。状态剪枝方案不能从根本上解决问题,而且随着区块链应用越来越多,数据增加的速度也越来越快,由于存储空间不变,那么能被存储的近期数据时间也就会越来越短。

在无状态节点方案中,全节点不需要存储区块链的状态,而只需要对状态进行短暂的承诺(Commitment)以验证交易,这需要利用到的密码学原理包括累加器和向量承诺(Accumulators and Vector Commitments)。有研究机构构建了基于比特币和以太坊的概念验证模型,但是从概念验证到真正的落地应用,还需要做大量的工作。针对状态爆炸问题,还有项目提出了一些新的思路,比如EOS内置交易市场,用户需要支付原生代币购买RAM进行世界状态存储;Nervos采用Cell模型,利用原生代币经济模型激励存储空间自由定价交易;Coda利用零知识证明的不断递归实现存储压缩技术等。Ultrain所采取的主侧链结构中,各个侧链的世界状态相互独立,可以理解为对世界状态的水平切分,缓解了单链结构中状态爆炸的问题。此外,Ultrain也在尝试节点状态压缩技术,即节点只保存部分世界状态数据,结合交易提供的状态数据完成交易执行。同时Ultrain也在积极探索“无状态节点”技术,争取早日实现该技术的工程落地。让信任计算赋能各行各业。

标签: boos

抱歉,评论功能暂时关闭!

微信号已复制,请打开微信添加咨询详情!