在 Hyperledger Fabric 中,块位置和有效性标准

In Hyperledger Fabric, Blocks locations and validity criteria

完全公开,一些用户已经问过这个问题,但答案以某种方式转移了实际问题的答案。

因此,在 Hyperledger Fabric 中:

  1. 对等实例上的物理块文件存储在哪里?
  2. 根据基础 ledger/blockchain 验证世界状态的频率或时间?

我知道 LevelDB 用于世界状态,它可以切换到 CouchDB,我在某处读到分类账也在 LevelDB 中建立索引,但同样可以引用世界状态,但似乎没有人知道分类帐的位置。

我已经探索了对等实例和位置 /var/hyperledger/production/ledgersData,它进一步包含诸如 chains、historyLeveldb、ledgerProvider、pvtdataStore 之类的目录,chains 目录确实包含通道,然后每个通道目录都有一个文件 blockfile_000000 并且根据我当前的配置,我已经执行了一些交易,中间有一些延迟,但我没有看到在我提到的位置下创建的任何新块。

更让我吃惊的是,在每个节点上,我都递归地完全删除了账本目录,而我的区块链仍然运行良好,这引出了一个问题,世界状态是否真的得到验证,或者我们是否必须提供我们的自己的实现根据我们自己的需要根据分类账验证世界状态?

我的网络相关配置:

OrdererType: Kafka
BatchTimeout: 2s
BatchSize:
  MaxMessageCount: 10
  AbsoluteMaxBytes: 1 MB
  PreferredMaxBytes: 512KB

PS:在 Ordering Service 的日志中,我确实看到日志说“要等待更新的块”。 maxAvailaBlockNumber=[7]、waitForBlockNum=[8] 和新块是根据配置创建的,但我没有在上面提到的 blockfile_000000 中更改任何文件大小。

区块链存储在块文件的 ledgersData/chains 目录中。每次提交一个块时,块文件将被写入并同步。

状态数据库保存在LevelDB(ledgersData/stateLeveldb目录)或外部CouchDB。每次提交块时,块的状态更新将提交到状态数据库。

如果数据以某种方式被篡改或在区块链和状态数据库之间不同步,那么对该节点的背书请求将根据与其他节点的不一致来识别坏数据。如果对状态数据库的完整性有任何疑问,可以从区块链中删除并重建状态数据库。如需更深入的解释,请参阅 https://lists.hyperledger.org/g/fabric/message/4896 处的 post。