我正在使用测试网络。
peer chaincode invoke
可以选择选项--peerAddresses
,我选择一个或多个对等体来执行链码。(ref)
按照测试网络教程,如果我在两个对等体上运行InitLedger,该命令会抛出错误。
$ peer chaincode invoke -o localhost:7050——ordererTLSHostnameOverrideOrderer.example.com——tls——cafile$ {PWD}/组织/ordererOrganizations/example.com/orderers/orderer.example.com/msp/tlscacerts/tlsca.example.com-cert.pem- c mychannel——peerAddresses localhost: 7051——tlsRootCertFiles $ {PWD}/组织/peerOrganizations org1.example.com/peers/peer0.org1.example.com/tls/ca.crt
——peerAddresses localhost: 9051——tlsRootCertFiles $ {PWD}/组织/peerOrganizations org2.example.com/peers/peer0.org2.example.com/tls/ca.crt
——peerAddresses localhost: 7051——tlsRootCertFiles $ {PWD}/组织/peerOrganizations org1.example.com/peers/peer0.org1.example.com/tls/ca.crt
- c mychannel基本- c - n"{"function"InitLedger","Args":[]}">错误:调用期间背书失败。响应:状态:500消息:模拟中出现错误:执行事务失败2 b3d3a615c2fd99e2503779cc25f923a54103997883548a92184423e67df93a2:发送错误:txid:2 b3d3a615c2fd99e2503779cc25f923a54103997883548a92184423e67df93a2 (mychannel)exists"
何时在两个对等体上运行命令?
看起来网络将"比较提案响应以确定提案响应是否相同"。在这种情况下,为什么我需要指定一个对等体,因为其他对等体将再次执行该命令进行验证?
您向同一个对等体localhost:7051
发送了两次相同的交易。删除其中一个peerAddresses/tlsRootCertFiles对
每笔交易都必须满足链码的背书策略。如果在链码实例化期间没有指定,在Fabric 2中。X(常规configtx.yaml
)默认背书策略需要N/2 + 1个组织(其中N为通道中的组织数)的对等体进行背书。
客户端负责通过交易提案要求这些背书,并在单个事务中收集所有提案。使用peerAddresses
,您的客户端指定在此过程中使用的对等体。
背书后,客户端将交易发送给排序服务,并将其嵌入到一个区块中,该区块被传递给所有加入该通道的对等体,以提交到账本中。提交节点再次检查提案是否匹配(因为现在只由客户端检查),以及所有事务是否包含所需的签名。但他们不会再次执行/模拟链码操作,这已经在背书期间完成了。然后,分类帐就更新了。这在https://hyperledger-fabric.readthedocs.io/en/release/txflow.html中有很好的解释。
在您的例子中,问题是您将事务发送两次到localhost:7051
。您只需向每个对等点发送一次事务。例如,一次到localhost:7051
,一次到localhost:9051
。看粗体该命令中的文本从您的原始帖子复制而来。
$ peer chaincode invoke -o localhost:7050——ordererTLSHostnameOverride orderer.example.com——tls——cafile ${PWD}/organizations/ordererOrganizations/example.com/orderers/orderer.example.com/msp/tlscacerts/tlsca.example.com-cert.pem -C mychannel——peerAddresses localhost:7051——tlsRootCertFiles $ {PWD}/组织/peerOrganizations/org1.example.com/peers/peer0.org1.example.com/tls/ca.crt——peerAddresses localhost:9051——tlsRootCertFiles ${PWD}/organizations/peerOrganizations/org2.example.com/peers/peer0.org2.example.com/tls/ca.crt——peerAddresses localhost: 7051——tlsRootCertFiles $ {PWD}/组织/peerOrganizations/org1.example.com/peers/peer0.org1.example.com/tls/ca.crt-C mychannel -n basic -C '{"function" InitLedger"; "Args"; []}'
简而言之,您的命令--peerAddresses
出现了三次而不是两次。