Hyperledger fabric 在hyperledger结构中处理多个背书
我有一份需要多个组织签署的申请。当没有指定背书策略时,链码工作良好。但当我给出AND('Org1.member','Org2.member')的背书策略时,链码所做的更新不会提交 链码是使用JavaSDK调用的。以下是代码片段:Hyperledger fabric 在hyperledger结构中处理多个背书,hyperledger-fabric,Hyperledger Fabric,我有一份需要多个组织签署的申请。当没有指定背书策略时,链码工作良好。但当我给出AND('Org1.member','Org2.member')的背书策略时,链码所做的更新不会提交 链码是使用JavaSDK调用的。以下是代码片段: public String[] invoke1() throws Exception { HFClient client; Channel sdkChannel; String chaincode; String function;
public String[] invoke1() throws Exception {
HFClient client;
Channel sdkChannel;
String chaincode;
String function;
String args[];
chaincode= config.getChaincode();
args= config.getArgs();
function= config.getFunction();
client= HFClient.createNewInstance();
client.setCryptoSuite(CryptoSuite.Factory.getCryptoSuite());
client.setUserContext(config.getUser());
sdkChannel = client.newChannel(config.getChannel());
sdkChannel.addPeer(client.newPeer(config.getPeer1Name(), config.getPeer1Url(), config.getPeer1Properties())); //anchor peer Org1
sdkChannel.addPeer(client.newPeer(config.getPeer2Name(), config.getPeer2Url(), config.getPeer2Properties())); //anchor peer Org2
sdkChannel.addOrderer(client.newOrderer(config.getOrdererName(), config.getOrdererUrl(), config.getOrdererProperties())); // orderer
sdkChannel.initialize();
final TransactionProposalRequest proposalRequest = client.newTransactionProposalRequest();
final ChaincodeID chaincodeID = ChaincodeID.newBuilder()
.setName(chaincode)
.build();
// chaincode name
proposalRequest.setChaincodeID(chaincodeID);
// chaincode function to execute
proposalRequest.setFcn(function);
// timeout
proposalRequest.setProposalWaitTime(60000);
// arguments for chaincode function
proposalRequest.setArgs(args);
System.out.println(proposalRequest.getChaincodeEndorsementPolicy());
// Sending transaction proposal
final Collection<ProposalResponse> responses = sdkChannel.sendTransactionProposal(proposalRequest, sdkChannel.getPeers());
sdkChannel.sendTransaction(responses, client.getUserContext());
String ret[]= new String[responses.size()];
int i= 0;
for (ProposalResponse resp : responses) {
System.out.println(resp.getStatus());
if (!resp.isVerified()
|| resp.getStatus() != ProposalResponse.Status.SUCCESS) {
String str= "Error while executing chaincode from peer " + resp.getPeer().getName() + " status: "+ resp.getStatus() + ". Messages: " + resp.getMessage()+ ".";
throw new RuntimeException(str);
}
else
ret[i++]= new String(resp.getChaincodeActionResponsePayload());
}
System.out.println(sdkChannel.sendTransaction(responses));
return ret;
}
公共字符串[]invoke1()引发异常{
HFC客户端;
信道SDKC信道;
字符串链码;
字符串函数;
字符串args[];
chaincode=config.getChaincode();
args=config.getArgs();
function=config.getFunction();
client=HFClient.createNewInstance();
client.setCryptoSuite(CryptoSuite.Factory.getCryptoSuite());
setUserContext(config.getUser());
sdkChannel=client.newChannel(config.getChannel());
sdkChannel.addPeer(client.newPeer(config.getpeername(),config.getPeer1Url(),config.getPeer1Properties());//锚点对等点Org1
sdkChannel.addPeer(client.newPeer(config.getPeer2Name(),config.getPeer2Url(),config.getPeer2Properties());//锚点对等点Org2
sdkChannel.addOrderer(client.newOrderer(config.getOrderName(),config.getOrderUrl(),config.getOrderProperties());//orderer
sdkChannel.initialize();
final TransactionProposalRequest proposalRequest=client.newTransactionProposalRequest();
final ChaincodeID ChaincodeID=ChaincodeID.newBuilder()
.setName(链码)
.build();
//链码名称
proposalRequest.setChaincodeID(chaincodeID);
//要执行的链码函数
proposalRequest.setFcn(功能);
//超时
proposalRequest.setProposalWaitTime(60000);
//链码函数的参数
proposalRequest.setArgs(args);
System.out.println(proposalRequest.getChaincodeEndorsementPolicy());
//发送交易建议
最终收集响应=sdkChannel.sendTransactionProposal(proposalRequest,sdkChannel.getPeers());
sendTransaction(响应,client.getUserContext());
String ret[]=新字符串[responses.size()];
int i=0;
对于(建议响应:响应){
System.out.println(resp.getStatus());
如果(!resp.isVerified()
||resp.getStatus()!=ProposalResponse.Status.SUCCESS){
String str=“从对等方执行链码时出错”+resp.getPeer().getName()+“状态:“+resp.getStatus()+”。消息:“+resp.getMessage()+”;
抛出新的RuntimeException(str);
}
其他的
ret[i++]=新字符串(分别为getChaincodeActionResponsePayload());
}
System.out.println(sdkChannel.sendTransaction(responses));
返回ret;
}
在两个锚节点上的链码执行都成功,但是链码所做的更改没有提交。
以下是对等日志:
有人能帮我解决这个问题吗。您确定交易提案能送达所有同行吗?此外,您在chaincode container
ccenv
上获得了哪些日志?是的,所有同行都收到了该提案。从对等日志中可以看到,由于签名集不满足批注策略,因此引发了VSCC错误。您是否尝试将批注策略更改为或('Org1.member'、'Org2.member')?如果某个事务由于某个对等事务而失败,这可能有助于调试。是的,我尝试了OR('Org1.member','Org2.member')。它给出了相同的错误。你能分享你的链码容器日志吗?很可能您的链码登录失败!您是否确定交易建议已送达所有对等方?此外,您在chaincode containerccenv
上获得了哪些日志?是的,所有同行都收到了该提案。从对等日志中可以看到,由于签名集不满足批注策略,因此引发了VSCC错误。您是否尝试将批注策略更改为或('Org1.member'、'Org2.member')?如果某个事务由于某个对等事务而失败,这可能有助于调试。是的,我尝试了OR('Org1.member','Org2.member')。它给出了相同的错误。你能分享你的链码容器日志吗?很可能您的链码登录失败!