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 <Mark.S.Lewis@outlook.com>
This commit is contained in:
Mark S. Lewis 2025-07-21 21:35:51 +01:00 committed by Tatsuya Sato
parent cc85f96d9e
commit 4fabd87648
4 changed files with 62 additions and 1 deletions

View file

@ -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 {

View file

@ -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 {

View file

@ -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()
}

View file

@ -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
}