From fc2ff5829efd2e849caca67ed0aa6e0d50bd09d0 Mon Sep 17 00:00:00 2001 From: Stanislav Jakuschevskij Date: Sat, 7 Dec 2024 16:20:40 +0100 Subject: [PATCH] Implement block parsing Removed Block and Transaction interfaces and unused statusCode function. Using the struct instead of the interfaces now. --- .../application-go/parser/blockParser.go | 87 +++++++++---------- .../application-go/parser/transaction.go | 30 +++---- 2 files changed, 54 insertions(+), 63 deletions(-) diff --git a/off_chain_data/application-go/parser/blockParser.go b/off_chain_data/application-go/parser/blockParser.go index c12f3b258..5e3ab56e5 100644 --- a/off_chain_data/application-go/parser/blockParser.go +++ b/off_chain_data/application-go/parser/blockParser.go @@ -1,23 +1,20 @@ package parser import ( + "fmt" "offChainData/utils" "github.com/hyperledger/fabric-protos-go-apiv2/common" - "github.com/hyperledger/fabric-protos-go-apiv2/peer" "google.golang.org/protobuf/proto" ) type Block struct { - block *common.Block - validationCodes []byte - transactions []Transaction + block *common.Block + transactions []*Transaction } -func ParseBlock(block *common.Block) Block { - validationCodes := extractTransactionValidationCodes(block) - - return Block{block, validationCodes, nil} +func ParseBlock(block *common.Block) *Block { + return &Block{block, nil} } func (b *Block) Number() uint64 { @@ -25,58 +22,53 @@ func (b *Block) Number() uint64 { return header.GetNumber() } -// TODO: needs cache, getPayloads, parsePayload -func (b *Block) Transactions() []Transaction { - return nil -} - -func (b *Block) ToProto() *common.Block { - return nil -} - -func (b *Block) payloads() []*common.Payload { - var payloads []*common.Payload - - for _, envelopeBytes := range b.block.GetData().GetData() { +// TODO: needs cache; decompose +func (b *Block) Transactions() []*Transaction { + envelopes := []*common.Envelope{} + for _, blockData := range b.block.GetData().GetData() { envelope := &common.Envelope{} - if err := proto.Unmarshal(envelopeBytes, envelope); err != nil { + if err := proto.Unmarshal(blockData, envelope); err != nil { panic(err) } + envelopes = append(envelopes, envelope) + } - payload := &common.Payload{} - if err := proto.Unmarshal(envelope.Payload, payload); err != nil { + commonPayloads := []*common.Payload{} + for _, envelope := range envelopes { + commonPayload := &common.Payload{} + if err := proto.Unmarshal(envelope.GetPayload(), commonPayload); err != nil { panic(err) } - - payloads = append(payloads, payload) + commonPayloads = append(commonPayloads, commonPayload) } - return payloads -} - -// TODO not sure about this -func (pb *Block) statusCode(txIndex int) peer.TxValidationCode { - blockMetadata := utils.AssertDefined( - pb.block.GetMetadata(), - "missing block metadata", - ) - - metadata := blockMetadata.GetMetadata() - if int(common.BlockMetadataIndex_TRANSACTIONS_FILTER) >= len(metadata) { - return peer.TxValidationCode_INVALID_OTHER_REASON + validationCodes := b.extractTransactionValidationCodes() + payloads := []*PayloadImpl{} + for i, commonPayload := range commonPayloads { + payload := ParsePayload( + commonPayload, + int32(utils.AssertDefined( + validationCodes[i], + fmt.Sprint("missing validation code index", i), + ), + ), + ) + if payload.IsEndorserTransaction() { + payloads = append(payloads, payload) + } } - statusCodes := metadata[common.BlockMetadataIndex_TRANSACTIONS_FILTER] - if txIndex >= len(statusCodes) { - return peer.TxValidationCode_INVALID_OTHER_REASON + result := []*Transaction{} + for _, payload := range payloads { + result = append(result, NewTransaction(payload)) } - return peer.TxValidationCode(statusCodes[txIndex]) + return result } -func extractTransactionValidationCodes(block *common.Block) []byte { +func (b *Block) extractTransactionValidationCodes() []byte { metadata := utils.AssertDefined( - block.GetMetadata(), + b.block.GetMetadata(), "missing block metadata", ) @@ -85,3 +77,8 @@ func extractTransactionValidationCodes(block *common.Block) []byte { "missing transaction validation code", ) } + +// TODO remove unused? +func (b *Block) ToProto() *common.Block { + return b.block +} diff --git a/off_chain_data/application-go/parser/transaction.go b/off_chain_data/application-go/parser/transaction.go index 1ba316974..93095726a 100644 --- a/off_chain_data/application-go/parser/transaction.go +++ b/off_chain_data/application-go/parser/transaction.go @@ -11,28 +11,19 @@ import ( "google.golang.org/protobuf/proto" ) -type Transaction interface { - ChannelHeader() *common.ChannelHeader - Creator() identity.Identity - ValidationCode() int32 - IsValid() bool - NamespaceReadWriteSets() []NamespaceReadWriteSet - ToProto() *common.Payload -} - -type TransactionImpl struct { +type Transaction struct { payload Payload } -func NewTransactionImpl(payload Payload) *TransactionImpl { - return &TransactionImpl{payload} +func NewTransaction(payload Payload) *Transaction { + return &Transaction{payload} } -func (t *TransactionImpl) ChannelHeader() *common.ChannelHeader { +func (t *Transaction) ChannelHeader() *common.ChannelHeader { return t.payload.ChannelHeader() } -func (t *TransactionImpl) Creator() identity.Identity { +func (t *Transaction) Creator() identity.Identity { creator := &msp.SerializedIdentity{} if err := proto.Unmarshal(t.payload.SignatureHeader().GetCreator(), creator); err != nil { panic(err) @@ -41,7 +32,7 @@ func (t *TransactionImpl) Creator() identity.Identity { return &identityImpl{creator} } -func (t *TransactionImpl) NamespaceReadWriteSets() []NamespaceReadWriteSet { +func (t *Transaction) NamespaceReadWriteSets() []NamespaceReadWriteSet { result := []NamespaceReadWriteSet{} for _, readWriteSet := range t.payload.EndorserTransaction().ReadWriteSets() { result = append(result, readWriteSet.NamespaceReadWriteSets()...) @@ -50,15 +41,18 @@ func (t *TransactionImpl) NamespaceReadWriteSets() []NamespaceReadWriteSet { return result } -func (t *TransactionImpl) ValidationCode() int32 { +// TODO remove unused? +func (t *Transaction) ValidationCode() int32 { return t.payload.TransactionValidationCode() } -func (t *TransactionImpl) IsValid() bool { +// TODO remove unused? +func (t *Transaction) IsValid() bool { return t.payload.IsValid() } -func (t *TransactionImpl) ToProto() *common.Payload { +// TODO remove unused? +func (t *Transaction) ToProto() *common.Payload { return t.payload.ToProto() }