考虑到上面的评论,这个问题可以改成这样:
“一个示例assets_management.go有“isCaller”方法,只能由“调用者”执行。在这种情况下如何达成 PBFT 共识?”
但是这个定义是不正确的,因为如果交易是用原始的“admin”证书签名的,那么所有 A、B、C 和 D Validation Peers 都可以在“transfer”、“assign”和“isCaller”中执行代码。
让我们通过这个例子,一步一步地研究它。
- “asset_management.go”链码可以由任何具有“client”角色的用户部署到账本中</li>
在部署过程中,在Init
方法中,该用户的证书将作为“admin”保存在账本中:
adminCert, err := stub.GetCallerMetadata()
...
stub.PutState("admin", adminCert)
当有人想提交assign
或transfer
交易到账本时,他必须用自己的证书签署这个请求
- 此请求将传播到网络中的所有 VP。
每个 VP 都会从账本中加载“管理员”证书,并将其与用于签署此特定请求的证书进行比较:
adminCertificate, err := stub.GetState("admin")
...
ok, err := t.isCaller(stub, adminCertificate)
如果证书不相同- 在 PBFT 共识阶段,VP 不会接受此请求。
如果证书相同- 所有 VP 都将知道此请求由原始“调用者”签名,并将继续执行链代码,因为他们拥有执行此操作所需的所有信息。