当Chaincode具有编码权限或事件时,如何达成共识?

时间:2016-07-06 03:03:31

标签: blockchain hyperledger

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

我想知道:

  1. 当chaincode具有权限的编码块时究竟发生了什么?
  2. 当chaincode有一个事件编码块时究竟发生了什么?
  3. 例如,A,B,C,D是四方,它们运行在四个验证对等方。 链码A中存在权限的编码块,只有A方有权运行编码块。 并且在链码A中存在事件的编码块,只有A方可以获得事件的结果。

    因此只有A方可以进入编码区。乙方,C,D不能进入编码区。

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

1 个答案:

答案 0 :(得分:0)

考虑到上述评论,这个问题可以改为:

“示例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)
    
  6. 如果证书不相同 - 在PBFT共识阶段,VP将不接受此请求。

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