1

我阅读了协议规范https://github.com/hyperledger/fabric/blob/master/docs/protocol-spec.md#5-byzantine-consensus-1

我想知道:

  1. 当链码有一个编码权限块时,到底发生了什么?
  2. 当链码有一个事件编码块时到底发生了什么?

例如,有 A、B、C、D 是四方,它们在四个 Validating Peer 上运行。链码 A 中有一个编码块的权限,只有甲方有权运行编码块。并且chaincode A中有一个event的编码块,只有A方才能得到event的结果。

所以只有甲方可以进入编码块。乙方、丙方、丁方不能碰上编码块。

在这种情况下,PBFT 如何对 A、B、C、D 达成共识?

4

1 回答 1

0

考虑到上面的评论,这个问题可以改成这样:

“一个示例assets_management.go有“isCaller”方法,只能由“调用者”执行。在这种情况下如何达成 PBFT 共识?”

但是这个定义是不正确的,因为如果交易是用原始的“admin”证书签名的,那么所有 A、B、C 和 D Validation Peers 都可以在“transfer”、“assign”和“isCaller”中执行代码。

让我们通过这个例子,一步一步地研究它。

  1. “asset_management.go”链码可以由任何具有“client”角色的用户部署到账本中</li>
  2. 在部署过程中,在Init方法中,该用户的证书将作为“admin”保存在账本中:

    adminCert, err := stub.GetCallerMetadata()
    ...
    stub.PutState("admin", adminCert)
    
  3. 当有人想提交assigntransfer交易到账本时,他必须用自己的证书签署这个请求

  4. 此请求将传播到网络中的所有 VP。
  5. 每个 VP 都会从账本中加载“管理员”证书,并将其与用于签署此特定请求的证书进行比较:

    adminCertificate, err := stub.GetState("admin")
    ...
    ok, err := t.isCaller(stub, adminCertificate)
    

如果证书不相同- 在 PBFT 共识阶段,VP 不会接受此请求。

如果证书相同- 所有 VP 都将知道此请求由原始“调用者”签名,并将继续执行链代码,因为他们拥有执行此操作所需的所有信息。

于 2016-07-14T12:30:50.663 回答