https://developers.eos.io/manuals/eos/latest/nodeos/usage/nodeos-implementation
eosio平台在交易的各个阶段会通过各种数据结构存储区块链信息。生产节点被区块生产者运行。
1、 区块链状态和存储
每个nodeos实例都会创建一些内部文件来维护区块链状态。这些文件路径和详细情况如图:
此处主要关注data文件夹中的内容。
ps:此处我本机展示的文件和官网上描述的并不完全一致,不过还是按照官网的描述来说明。
1、block.log是写到磁盘上,每次追加块日志,包括所有不可逆块
2、reversible_blocks是内存映射文件,包括已经写到区块链中但还没有变成不可逆状态的块,此处应该和data/reversible/shard_memory.bin文件对应
3、chain state或者database是内存映射文件,存储每个块的区块链状态(账号详情,延迟交易,交易,在智能合约中使用多索引存储的数据)。一旦块变成不可逆,就不会再缓存到chian state。
4、pending block是一个内存块,即存储在内存中区块,包括被打包进区块中的交易,这个块可能会变成head block。如果nodeos实例正在生产区块,pending block会被同步到其他nodeos实例。
5、head block是最后一个被写进区块链中的,存储在reversible_blocks
2. nodeos读模式
EOSIO提供了一组服务和接口,使合约开发人员能够跨操作(从而跨事务)边界持久化状态。
合约为了实现不同的目的,可以使用这些服务和接口。例如,eosio.token维护数据库中的所有用户的余额信息。每个nodeos实例在内存中维护数据库信息(此处应该是指所有用户的余额信息),因此合约可以读写数据。
nodeos也通过提供HTTP RPC API接口来访问数据。
然而,在任何特定时间,可以由多种正确方式查询数据:
1、推测性(speculative):包括确认和未确认交易的副作用
2、头(head):仅仅包括确认交易的副作用,这种模式会处理未确认交易,但不包括他们
3、只读(read-only):仅仅包括确认交易的副作用
4、不可逆(irreversible):仅包括最后一个不可逆块之前的确认交易的副作用
所谓确认交易,是指位于head block或者在它之前的块中所包含的交易。
综上,从1到4到来看,模式越来越严,可查的范围越来越小。
2.1 推测性
如上所述,推测性模式包括节点收到的任何交易,包括未确认的交易,即未包含到区块链中的交易。该模式具有低延迟,高脆弱性。不能保证交易最终会被包含进区块链中。
nodeos能够执行带有TaPoS(基于权益证明的交易)的交易,这些TaPoS指向这个节点认为最好的fork中的任何有效块(不理解)。
2.2 头
因为head block还没变成不可逆状态,如果nodeos切换到一个更好的fork,该模式下的状态可能是不精确。
该模式在延迟性和数据一致性之间有好的权衡。
2.3 只读
2.4 不可逆
该模式也会跟踪fork db中的块,但是状态落后于当前最好的head block。
3. 如何设置读模式
在eosio::chain_plugin插件中通过--read-mode设置。
网友评论