Chaincode 有权限或事件的编码块时,究竟如何达成共识?

How exactly to make consensus when Chaincode has coding block of authority or event?

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

我在想:

  1. 当 chaincode 拥有授权编码块时到底发生了什么?
  2. 当链码有事件编码块时到底发生了什么?

例如,A、B、C、D 是四个参与方,它们 运行 在四个验证节点上。 chaincode A 中有一个编码块的权限,只有甲方有权限 运行 该编码块。 而chaincode A中有一个event的编码块,只有A方才能得到event的结果。

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

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

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

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

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

让我们通过这个例子逐步研究它。

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

    adminCert, err := stub.GetCallerMetadata()
    ...
    stub.PutState("admin", adminCert)
    
  3. 当有人想要将 assigntransfer 交易提交到分类帐中时,他必须使用自己的证书签署此请求

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

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

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

如果证书 相同 - 所有 VPs 将知道此请求是由原始“调用者”签名的,并将继续执行链代码,因为他们拥有所有必要的这样做的信息。