我正在使用 Hyperledger Fabric Java SDK 通过 txId 获取交易。返回对象包含交易信息。
TransactionInfo txInfo = channel.queryTransactionByID(txId);
Common.Envelope envelope = txInfo.getEnvelope();
Common.Payload payload = Common.Payload.parseFrom(envelope.getPayload());
Payload
消息包含 header 和数据。我可以使用 Common.Header.ChannelHeader
和 Common.Header.SignatureHeader
解析 header 。
Common.ChannelHeader channelHeader = Common.ChannelHeader.parseFrom(payload.getHeader().getChannelHeader());
Common.SignatureHeader signatureHeader = Common.SignatureHeader.parseFrom(payload.getHeader().getSignatureHeader());
问题是,我看不到任何消息类型来从 Payload
获取数据。
我的期望是,
SomeMessage someMsg = SomeMessage.parseFrom(payload.getData());
获取数据对象的理想方法是什么?
最佳答案
感谢 Driden Myung 的提示,终于找到了一种将 QSCC 响应解析为 TxReadWriteSet 甚至 KVRWSet 的方法! 这是一个例子:
TransactionInfo txInfo = channel.queryTransactionByID(txId);
Common.Envelope envelope = txInfo.getEnvelope();
Common.Payload payload = Common.Payload.parseFrom(envelope.getPayload());
FabricTransaction.Transaction transaction = FabricTransaction.Transaction.parseFrom(payload.getData());
FabricTransaction.TransactionAction action = transaction.getActionsList().get(0); // 0 is a index
FabricTransaction.ChaincodeActionPayload chaincodeActionPayload = FabricTransaction.ChaincodeActionPayload.parseFrom(action.getPayload());
FabricProposalResponse.ProposalResponsePayload prp = FabricProposalResponse.ProposalResponsePayload.parseFrom(chaincodeActionPayload.getAction().getProposalResponsePayload());
FabricProposal.ChaincodeAction ca = FabricProposal.ChaincodeAction.parseFrom(prp.getExtension());
Rwset.TxReadWriteSet txrws = Rwset.TxReadWriteSet.parseFrom(ca.getResults());
TxReadWriteSetInfo txrwsInfo = new TxReadWriteSetInfo(txrws);
KvRwset.KVRWSet kvrwSet = txrwsInfo.getNsRwsetInfo(0).getRwset();
KvRwset.KVWrite kvWrite = kvrwSet.getWrites(0);
String writeVal = kvWrite.getValue().toStringUtf8();
关于java - 如何解析Envelope.Payload.Data的protobuf数据?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57571732/