java - 如何解析Envelope.Payload.Data的protobuf数据?

标签 java protocol-buffers hyperledger-fabric

我正在使用 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.ChannelHeaderCommon.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/

相关文章:

docker - 为什么在安装HyperLedgerFabric的结构样本和二进制文件时出现 'Cannot connect to docker daemon'错误?

java - 如何让线程一个接一个地运行?

java - Java Web 应用程序和 C++ 服务器之间的套接字通信

protocol-buffers - Protobuf,嵌套映射?

go - 如何在 Go 中实现结构到类似结构的转换

hyperledger-fabric - channel 未配置任何具有 'discover' 角色的对等点

hyperledger-fabric - 错误 : timeout waiting for channel creation -- While using Kafka Orderer of Fabric

java - 链接列表中出现奇怪的错误?

java - java中的Windows 10不可见边框有解决方法吗?

java - 字符串到二进制,反之亦然 : extended ASCII