亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

如何解析 Envelope.Payload.Data 的 protobuf 數據?

如何解析 Envelope.Payload.Data 的 protobuf 數據?

回首憶惘然 2023-06-14 16:04:15
我正在使用 Hyperledger Fabric Java SDK 通過 txId 獲取交易。返回對象包括交易信息。TransactionInfo txInfo = channel.queryTransactionByID(txId);Common.Envelope envelope = txInfo.getEnvelope();Common.Payload payload = Common.Payload.parseFrom(envelope.getPayload());該Payload消息包括標題和數據。我可以使用Common.Header.ChannelHeader和來解析標頭Common.Header.SignatureHeader。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());獲取數據對象的理想方法是什么?
查看完整描述

3 回答

?
MM們

TA貢獻1886條經驗 獲得超2個贊

終于找到了一種將 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();


查看完整回答
反對 回復 2023-06-14
?
慕桂英3389331

TA貢獻2036條經驗 獲得超8個贊

從事務中獲取請求數據時,我們遇到了類似的問題。


以下代碼將有助于獲取交易的交易請求數據


面料 SDK 版本:2.1.4


        // get transaction from transaction ID

        TransactionInfo txInfo = channel.queryTransactionByID(txId);

        // transaction is stored inside the envelope containing the payload and signature

        Common.Envelope envelope = txInfo.getEnvelope();

        // parse payload from the envelope

        Common.Payload payload = Common.Payload.parseFrom(envelope.getPayload());

        // payload contains Header and Data. We are parsing data to get the transaction

        TransactionPackage.Transaction transaction = TransactionPackage.Transaction.parseFrom(payload.getData());

        // get first action from the transaction action list. it contains input and other details

        TransactionPackage.TransactionAction action = transaction.getActionsList().get(0); // 0 is a index

        // chaincode action payload contains input parameters. So we are taking the action payload

        TransactionPackage.ChaincodeActionPayload chaincodeActionPayload = TransactionPackage.ChaincodeActionPayload.parseFrom(action.getPayload());

        // chaincode ProposalPayload contains Input and TransientMap. We are parsing actionPayload to proposalPayload

        ProposalPackage.ChaincodeProposalPayload prp = ProposalPackage.ChaincodeProposalPayload.parseFrom(chaincodeActionPayload.getChaincodeProposalPayload());

        // parse the input to chaincodeInvocationSpec so that we can unmarshal the input

        Chaincode.ChaincodeInvocationSpec chaincodeInvocationSpec = Chaincode.ChaincodeInvocationSpec.parseFrom(prp.getInput());


        // get the input and parse the arg list and get input arguments 

       chaincodeInvocationSpec.getChaincodeSpec().getInput().getArgsList().get(ChaincodeInput.ARGS_FIELD_NUMBER).toStringUtf8();



查看完整回答
反對 回復 2023-06-14
?
侃侃爾雅

TA貢獻1801條經驗 獲得超16個贊

我找到了答案。


FabricTransaction.Transaction transaction =  FabricTransaction.Transaction.parseFrom(payload.getData());

在那之后,


FabricTransaction.TransactionAction action = transaction.getActionsList().get(index);

FabricTransaction.ChaincodeActionPayload chaincodeActionPayload = FabricTransaction.ChaincodeActionPayload.parseFrom(action.getPayload());

chaincodeActionPayload.getAction().getEndorsementsList().forEach(endorsement -> {

    // This is my current point

    ???? endorser = ????.parseFrom(endorsement.getEndorser());

});

如果我能找到更多,讓我補充一下。歡迎大家補充評論。


查看完整回答
反對 回復 2023-06-14
  • 3 回答
  • 0 關注
  • 157 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號