【发布时间】: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
重现问题的详细步骤:
- Org1 通过链码方法
stub.putState()向所有 4 个对等方发送提案以进行背书,从而成功创建了一条记录(即记录#ABC) - record#ABC 只是一个简单的一层 JSON(键值对)
- 访问Org2的peer2的CouchDB入口,直接删除记录#ABC
- 通过链码方法
stub.getState()从所有 4 个对等点检索记录#ABC,并且 3 个对等点返回相同的正确结果,并且只有 Org2 的对等点 2 按预期返回空结果 - 通过链码方法
stub.getHistoryForKey()从所有 4 个对等点检索记录#ABC,并返回与预期相同的结果(据我了解,此方法直接从 levelDB 而不是 CouchDB 执行查询) - Org1 通过链码方法
stub.putState()向所有 4 个对等方发送提案以进行背书,从而成功更新了记录#ABC 的一个值 - 通过检查 Node.js 应用程序日志,Org2 的 peer2 按预期返回错误
No such Data。由于它只需要2个背书签名,因此有望通过验证。 - 通过检查 Org2 的 peer2 的 docker 日志,block#007 已提交,但其事务被状态验证器标记为无效,因为
MVCC_READ_CONFLICT - 通过链码方法
stub.getState()从所有 4 个对等点检索记录#ABC,并且只有 Org2 的对等点 2 按预期返回空结果 - 通过链码方法
stub.getHistoryForKey()从所有 4 个对等点检索记录#ABC,3 个对等点返回记录#ABC 的 2 个版本的相同结果,而 Org2 的对等点 2 仅返回记录#ABC 的原始版本,没有最新版本 - 从所有对等方检索包含更新记录#ABC 交易的最新区块(即区块#007)。块的所有主要内容都是一样的。
- 区块链可以继续接收创建新记录的新请求。
我的问题来了:
- 为什么问题块 (block#007) 仍然在 Org2 的 peer2 中提交?
- 为什么区块链系统可以继续运行而不会抛出严重错误,因为不同对等方的区块链之间存在差异?是否应该重新设计以停止操作,直到差异问题得到解决?
【问题讨论】:
标签: hyperledger-fabric blockchain hyperledger