【问题标题】:Discrepancy between blockchains of different peers in Hyperledger Fabric 1.4Hyperledger Fabric 1.4 中不同对等点的区块链之间的差异
【发布时间】:2021-02-01 05:14:12
【问题描述】:

系统:Hyperledger Fabric 1.4.6

拓扑:2 个组织(Org1,Org2),每个组织有 2 个对等点(peer1,peer2)和 Raft 排序服务

背书政策:任意 2 位同行

Chaincode交互方式:通过Node.js SDK

StateDB:CouchDB

重现问题的详细步骤:

  1. Org1 通过链码方法stub.putState() 向所有 4 个对等方发送提案以进行背书,从而成功创建了一条记录(即记录#ABC)
  2. record#ABC 只是一个简单的一层 JSON(键值对)
  3. 访问Org2的peer2的CouchDB入口,直接删除记录#ABC
  4. 通过链码方法 stub.getState() 从所有 4 个对等点检索记录#ABC,并且 3 个对等点返回相同的正确结果,并且只有 Org2 的对等点 2 按预期返回空结果
  5. 通过链码方法 stub.getHistoryForKey() 从所有 4 个对等点检索记录#ABC,并返回与预期相同的结果(据我了解,此方法直接从 levelDB 而不是 CouchDB 执行查询)
  6. Org1 通过链码方法stub.putState() 向所有 4 个对等方发送提案以进行背书,从而成功更新了记录#ABC 的一个值
  7. 通过检查 Node.js 应用程序日志,Org2 的 peer2 按预期返回错误 No such Data。由于它只需要2个背书签名,因此有望通过验证。
  8. 通过检查 Org2 的 peer2 的 docker 日志,block#007 已提交,但其事务被状态验证器标记为无效,因为MVCC_READ_CONFLICT
  9. 通过链码方法stub.getState() 从所有 4 个对等点检索记录#ABC,并且只有 Org2 的对等点 2 按预期返回空结果
  10. 通过链码方法stub.getHistoryForKey() 从所有 4 个对等点检索记录#ABC,3 个对等点返回记录#ABC 的 2 个版本的相同结果,而 Org2 的对等点 2 仅返回记录#ABC 的原始版本,没有最新版本
  11. 从所有对等方检索包含更新记录#ABC 交易的最新区块(即区块#007)。块的所有主要内容都是一样的。
  12. 区块链可以继续接收创建新记录的新请求。

我的问题来了:

  1. 为什么问题块 (block#007) 仍然在 Org2 的 peer2 中提交?
  2. 为什么区块链系统可以继续运行而不会抛出严重错误,因为不同对等方的区块链之间存在差异?是否应该重新设计以停止操作,直到差异问题得到解决?

【问题讨论】:

    标签: hyperledger-fabric blockchain hyperledger


    【解决方案1】:
    1. 持久化/提交区块独立于验证交易和更新状态。只要块是正确的顺序并由正确的排序者签名,它就会被提交。 Fabric 使用指示每个事务有效性的元数据来注释块中的每个事务。

    2. 由于 Org1 和 Org2 都有成功背书交易的对等方,因此该交易对未被篡改的对等方有效。如果没有足够的对等方可用于背书交易,则所有对等方都将其视为无效。无需停止系统,因为交易正在网络信任参数的上下文中正确处理。

    【讨论】:

    • 我明白你的意思,但如果有人在尝试从 4 个同行检索该记录后才发现差异问题,这可能会造成混乱。
    猜你喜欢
    • 1970-01-01
    • 2017-04-17
    • 1970-01-01
    • 2020-04-06
    • 1970-01-01
    • 1970-01-01
    • 2018-05-31
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多