From 2e6de80c14f6642542e4a8c40f0e6d2cef252a67 Mon Sep 17 00:00:00 2001 From: "Mark S. Lewis" Date: Mon, 21 Jul 2025 21:35:51 +0100 Subject: [PATCH] Enhance Go off_chain_data for consistency Add some methods to the parsing API within the Go off_chain_data sample for consistency with the Node and Java implementations: - ToProto() on Block, Transaction and NamespaceReadWriteSet. - ValidationCode() on Transaction. - Creator() on Transaction Signed-off-by: Mark S. Lewis --- off_chain_data/application-go/parser/block.go | 4 ++ .../parser/namespaceReadWriteSet.go | 4 ++ .../application-go/parser/payload.go | 42 ++++++++++++++++++- .../application-go/parser/transaction.go | 13 ++++++ 4 files changed, 62 insertions(+), 1 deletion(-) diff --git a/off_chain_data/application-go/parser/block.go b/off_chain_data/application-go/parser/block.go index 2200284b..18769ace 100644 --- a/off_chain_data/application-go/parser/block.go +++ b/off_chain_data/application-go/parser/block.go @@ -26,6 +26,10 @@ func (b *Block) Transactions() ([]*Transaction, error) { return b.transactions() } +func (b *Block) ToProto() *common.Block { + return b.block +} + func (b *Block) unmarshalTransactions() ([]*Transaction, error) { envelopes, err := b.unmarshalEnvelopes() if err != nil { diff --git a/off_chain_data/application-go/parser/namespaceReadWriteSet.go b/off_chain_data/application-go/parser/namespaceReadWriteSet.go index ce108d4a..06cf2bf3 100644 --- a/off_chain_data/application-go/parser/namespaceReadWriteSet.go +++ b/off_chain_data/application-go/parser/namespaceReadWriteSet.go @@ -27,6 +27,10 @@ func (p *NamespaceReadWriteSet) ReadWriteSet() (*kvrwset.KVRWSet, error) { return p.readWriteSet() } +func (p *NamespaceReadWriteSet) ToProto() *rwset.NsReadWriteSet { + return p.nsReadWriteSet +} + func (p *NamespaceReadWriteSet) unmarshalReadWriteSet() (*kvrwset.KVRWSet, error) { result := &kvrwset.KVRWSet{} if err := proto.Unmarshal(p.nsReadWriteSet.GetRwset(), result); err != nil { diff --git a/off_chain_data/application-go/parser/payload.go b/off_chain_data/application-go/parser/payload.go index 21a23b60..e2d26f4f 100644 --- a/off_chain_data/application-go/parser/payload.go +++ b/off_chain_data/application-go/parser/payload.go @@ -4,6 +4,7 @@ import ( "fmt" "github.com/hyperledger/fabric-protos-go-apiv2/common" + "github.com/hyperledger/fabric-protos-go-apiv2/msp" "github.com/hyperledger/fabric-protos-go-apiv2/peer" "google.golang.org/protobuf/proto" ) @@ -12,6 +13,7 @@ type payload struct { commonPayload *common.Payload statusCode int32 channelHeader *common.ChannelHeader + creator *creatorIdentity } func parsePayload(commonPayload *common.Payload, statusCode int32) (*payload, error) { @@ -19,7 +21,19 @@ func parsePayload(commonPayload *common.Payload, statusCode int32) (*payload, er if err != nil { return nil, err } - return &payload{commonPayload, statusCode, channelHeader}, nil + + creator, err := unmarshalCreator(commonPayload) + if err != nil { + return nil, err + } + + result := &payload{ + commonPayload: commonPayload, + statusCode: statusCode, + channelHeader: channelHeader, + creator: &creatorIdentity{creator}, + } + return result, nil } func unmarshalChannelHeaderFrom(commonPayload *common.Payload) (*common.ChannelHeader, error) { @@ -30,6 +44,20 @@ func unmarshalChannelHeaderFrom(commonPayload *common.Payload) (*common.ChannelH return result, nil } +func unmarshalCreator(commonPayload *common.Payload) (*msp.SerializedIdentity, error) { + signatureHeader := &common.SignatureHeader{} + if err := proto.Unmarshal(commonPayload.GetHeader().GetSignatureHeader(), signatureHeader); err != nil { + return nil, err + } + + result := &msp.SerializedIdentity{} + if err := proto.Unmarshal(signatureHeader.GetCreator(), result); err != nil { + return nil, err + } + + return result, nil +} + func (p *payload) endorserTransaction() (*endorserTransaction, error) { if !p.isEndorserTransaction() { return nil, fmt.Errorf("unexpected payload type: %d", p.channelHeader.GetType()) @@ -50,3 +78,15 @@ func (p *payload) isEndorserTransaction() bool { func (p *payload) isValid() bool { return p.statusCode == int32(peer.TxValidationCode_VALID) } + +type creatorIdentity struct { + creator *msp.SerializedIdentity +} + +func (i *creatorIdentity) MspID() string { + return i.creator.GetMspid() +} + +func (i *creatorIdentity) Credentials() []byte { + return i.creator.GetIdBytes() +} diff --git a/off_chain_data/application-go/parser/transaction.go b/off_chain_data/application-go/parser/transaction.go index 56ddbf31..faf0ca79 100644 --- a/off_chain_data/application-go/parser/transaction.go +++ b/off_chain_data/application-go/parser/transaction.go @@ -1,6 +1,7 @@ package parser import ( + "github.com/hyperledger/fabric-gateway/pkg/identity" "github.com/hyperledger/fabric-protos-go-apiv2/common" ) @@ -16,6 +17,10 @@ func (t *Transaction) ChannelHeader() *common.ChannelHeader { return t.payload.channelHeader } +func (t *Transaction) Creator() identity.Identity { + return t.payload.creator +} + func (t *Transaction) NamespaceReadWriteSets() ([]*NamespaceReadWriteSet, error) { endorserTransaction, err := t.payload.endorserTransaction() if err != nil { @@ -37,3 +42,11 @@ func (t *Transaction) NamespaceReadWriteSets() ([]*NamespaceReadWriteSet, error) func (t *Transaction) IsValid() bool { return t.payload.isValid() } + +func (t *Transaction) ToProto() *common.Payload { + return t.payload.commonPayload +} + +func (t *Transaction) ValidationCode() int32 { + return t.payload.statusCode +}