From 81efd2cc61e3ac937f7dbe1edf45e3584855514c Mon Sep 17 00:00:00 2001 From: Stanislav Jakuschevskij Date: Wed, 1 Jan 2025 18:01:19 +0100 Subject: [PATCH] Refactor parser package, decompose files Every struct was put in its own file. Every method which is not used outside the parser package was given package scope. All interfaces were removed, they are implemented by the structs which are now used everywhere needed as return values. There is no clear benefit of using interfaces in this sample. Signed-off-by: Stanislav Jakuschevskij --- off_chain_data/application-go/parser/block.go | 17 +- .../application-go/parser/block_test.go | 21 ++- .../parser/endorserTransaction.go | 105 ++++++++++++ .../application-go/parser/identity.go | 16 -- .../parser/namespaceReadWriteSet.go | 32 ++++ .../application-go/parser/payload.go | 63 ++------ .../application-go/parser/readWriteSet.go | 62 +------ .../application-go/parser/transaction.go | 151 +----------------- .../application-go/processor/block.go | 26 +-- .../application-go/processor/transaction.go | 12 +- off_chain_data/application-go/transact.go | 4 +- 11 files changed, 204 insertions(+), 305 deletions(-) create mode 100644 off_chain_data/application-go/parser/endorserTransaction.go delete mode 100644 off_chain_data/application-go/parser/identity.go create mode 100644 off_chain_data/application-go/parser/namespaceReadWriteSet.go diff --git a/off_chain_data/application-go/parser/block.go b/off_chain_data/application-go/parser/block.go index 7bd1c6e6..8a1c0f19 100644 --- a/off_chain_data/application-go/parser/block.go +++ b/off_chain_data/application-go/parser/block.go @@ -58,11 +58,11 @@ func (*Block) unmarshalPayloadsFrom(envelopes []*common.Envelope) []*common.Payl return result } -func (b *Block) parse(commonPayloads []*common.Payload) []*PayloadImpl { +func (b *Block) parse(commonPayloads []*common.Payload) []*payload { validationCodes := b.extractTransactionValidationCodes() - result := []*PayloadImpl{} + result := []*payload{} for i, commonPayload := range commonPayloads { - payload := ParsePayload( + payload := parsePayload( commonPayload, int32(utils.AssertDefined( validationCodes[i], @@ -70,7 +70,7 @@ func (b *Block) parse(commonPayloads []*common.Payload) []*PayloadImpl { ), ), ) - if payload.IsEndorserTransaction() { + if payload.isEndorserTransaction() { result = append(result, payload) } } @@ -89,15 +89,10 @@ func (b *Block) extractTransactionValidationCodes() []byte { ) } -func (*Block) createTransactionsFrom(payloads []*PayloadImpl) []*Transaction { +func (*Block) createTransactionsFrom(payloads []*payload) []*Transaction { result := []*Transaction{} for _, payload := range payloads { - result = append(result, NewTransaction(payload)) + result = append(result, newTransaction(payload)) } return result } - -// TODO remove unused? -func (b *Block) ToProto() *common.Block { - return b.block -} diff --git a/off_chain_data/application-go/parser/block_test.go b/off_chain_data/application-go/parser/block_test.go index 80b5b1ea..838af348 100644 --- a/off_chain_data/application-go/parser/block_test.go +++ b/off_chain_data/application-go/parser/block_test.go @@ -1,11 +1,10 @@ -package parser_test +package parser import ( "encoding/json" "testing" atb "offChainData/contract" - "offChainData/parser" "github.com/hyperledger/fabric-protos-go-apiv2/ledger/rwset" "github.com/hyperledger/fabric-protos-go-apiv2/ledger/rwset/kvrwset" @@ -35,13 +34,13 @@ func Test_GetReadWriteSetsFromEndorserTransaction(t *testing.T) { }, } - parsedEndorserTransaction := parser.ParseEndorserTransaction(transaction) - if len(parsedEndorserTransaction.ReadWriteSets()) != 1 { - t.Fatal("expected 1 ReadWriteSet, got", len(parsedEndorserTransaction.ReadWriteSets())) + parsedEndorserTransaction := parseEndorserTransaction(transaction) + if len(parsedEndorserTransaction.readWriteSets()) != 1 { + t.Fatal("expected 1 ReadWriteSet, got", len(parsedEndorserTransaction.readWriteSets())) } assertReadWriteSet( - parsedEndorserTransaction.ReadWriteSets()[0].NamespaceReadWriteSets()[0], + parsedEndorserTransaction.readWriteSets()[0].namespaceReadWriteSets()[0], expectedNamespace, expectedAsset, t, @@ -49,7 +48,7 @@ func Test_GetReadWriteSetsFromEndorserTransaction(t *testing.T) { } func assertReadWriteSet( - parsedNsRwSet parser.NamespaceReadWriteSet, + parsedNsRwSet *NamespaceReadWriteSet, expectedNamespace string, expectedAsset atb.Asset, t *testing.T, @@ -80,16 +79,16 @@ func Test_ReadWriteSetWrapping(t *testing.T) { NsRwset: []*rwset.NsReadWriteSet{nsReadWriteSetFake}, } - parsedRwSet := parser.ParseReadWriteSet(txReadWriteSetFake) - if len(parsedRwSet.NamespaceReadWriteSets()) != 1 { - t.Fatalf("Expected 1 NamespaceReadWriteSet, got %d", len(parsedRwSet.NamespaceReadWriteSets())) + parsedRwSet := parseReadWriteSet(txReadWriteSetFake) + if len(parsedRwSet.namespaceReadWriteSets()) != 1 { + t.Fatalf("Expected 1 NamespaceReadWriteSet, got %d", len(parsedRwSet.namespaceReadWriteSets())) } } func Test_NamespaceReadWriteSetParsing(t *testing.T) { nsReadWriteSetFake, expectedNamespace, expectedAsset := nsReadWriteSetFake() - parsedNsRwSet := parser.ParseNamespaceReadWriteSet(nsReadWriteSetFake) + parsedNsRwSet := parseNamespaceReadWriteSet(nsReadWriteSetFake) assertReadWriteSet( parsedNsRwSet, expectedNamespace, diff --git a/off_chain_data/application-go/parser/endorserTransaction.go b/off_chain_data/application-go/parser/endorserTransaction.go new file mode 100644 index 00000000..d3653979 --- /dev/null +++ b/off_chain_data/application-go/parser/endorserTransaction.go @@ -0,0 +1,105 @@ +package parser + +import ( + "offChainData/utils" + + "github.com/hyperledger/fabric-protos-go-apiv2/ledger/rwset" + "github.com/hyperledger/fabric-protos-go-apiv2/peer" + "google.golang.org/protobuf/proto" +) + +type endorserTransaction struct { + transaction *peer.Transaction +} + +func parseEndorserTransaction(transaction *peer.Transaction) *endorserTransaction { + return &endorserTransaction{transaction} +} + +func (p *endorserTransaction) readWriteSets() []*readWriteSet { + return utils.Cache(func() []*readWriteSet { + chaincodeActionPayloads := p.unmarshalChaincodeActionPayloads() + + chaincodeEndorsedActions := p.extractChaincodeEndorsedActionsFrom(chaincodeActionPayloads) + + proposalResponsePayloads := p.unmarshalProposalResponsePayloadsFrom(chaincodeEndorsedActions) + + chaincodeActions := p.unmarshalChaincodeActionsFrom(proposalResponsePayloads) + + txReadWriteSets := p.unmarshalTxReadWriteSetsFrom(chaincodeActions) + + return p.parseReadWriteSets(txReadWriteSets) + })() +} + +func (p *endorserTransaction) unmarshalChaincodeActionPayloads() []*peer.ChaincodeActionPayload { + result := []*peer.ChaincodeActionPayload{} + for _, transactionAction := range p.transaction.GetActions() { + chaincodeActionPayload := &peer.ChaincodeActionPayload{} + if err := proto.Unmarshal(transactionAction.GetPayload(), chaincodeActionPayload); err != nil { + panic(err) + } + + result = append(result, chaincodeActionPayload) + } + return result +} + +func (*endorserTransaction) extractChaincodeEndorsedActionsFrom(chaincodeActionPayloads []*peer.ChaincodeActionPayload) []*peer.ChaincodeEndorsedAction { + result := []*peer.ChaincodeEndorsedAction{} + for _, payload := range chaincodeActionPayloads { + result = append( + result, + utils.AssertDefined( + payload.GetAction(), + "missing chaincode endorsed action", + ), + ) + } + return result +} + +func (*endorserTransaction) unmarshalProposalResponsePayloadsFrom(chaincodeEndorsedActions []*peer.ChaincodeEndorsedAction) []*peer.ProposalResponsePayload { + result := []*peer.ProposalResponsePayload{} + for _, endorsedAction := range chaincodeEndorsedActions { + proposalResponsePayload := &peer.ProposalResponsePayload{} + if err := proto.Unmarshal(endorsedAction.GetProposalResponsePayload(), proposalResponsePayload); err != nil { + panic(err) + } + result = append(result, proposalResponsePayload) + } + return result +} + +func (*endorserTransaction) unmarshalChaincodeActionsFrom(proposalResponsePayloads []*peer.ProposalResponsePayload) []*peer.ChaincodeAction { + result := []*peer.ChaincodeAction{} + for _, proposalResponsePayload := range proposalResponsePayloads { + chaincodeAction := &peer.ChaincodeAction{} + if err := proto.Unmarshal(proposalResponsePayload.GetExtension(), chaincodeAction); err != nil { + panic(err) + } + result = append(result, chaincodeAction) + } + return result +} + +func (*endorserTransaction) unmarshalTxReadWriteSetsFrom(chaincodeActions []*peer.ChaincodeAction) []*rwset.TxReadWriteSet { + result := []*rwset.TxReadWriteSet{} + for _, chaincodeAction := range chaincodeActions { + txReadWriteSet := &rwset.TxReadWriteSet{} + if err := proto.Unmarshal(chaincodeAction.GetResults(), txReadWriteSet); err != nil { + continue + } + result = append(result, txReadWriteSet) + } + return result +} + +func (*endorserTransaction) parseReadWriteSets(txReadWriteSets []*rwset.TxReadWriteSet) []*readWriteSet { + result := []*readWriteSet{} + for _, txReadWriteSet := range txReadWriteSets { + parsedReadWriteSet := parseReadWriteSet(txReadWriteSet) + result = append(result, parsedReadWriteSet) + } + return result +} diff --git a/off_chain_data/application-go/parser/identity.go b/off_chain_data/application-go/parser/identity.go deleted file mode 100644 index 85c9ecb7..00000000 --- a/off_chain_data/application-go/parser/identity.go +++ /dev/null @@ -1,16 +0,0 @@ -package parser - -import "github.com/hyperledger/fabric-protos-go-apiv2/msp" - -// Implements identity.Identity Interface -type identityImpl struct { - creator *msp.SerializedIdentity -} - -func (i *identityImpl) MspID() string { - return i.creator.GetMspid() -} - -func (i *identityImpl) Credentials() []byte { - return i.creator.GetIdBytes() -} diff --git a/off_chain_data/application-go/parser/namespaceReadWriteSet.go b/off_chain_data/application-go/parser/namespaceReadWriteSet.go new file mode 100644 index 00000000..341571ec --- /dev/null +++ b/off_chain_data/application-go/parser/namespaceReadWriteSet.go @@ -0,0 +1,32 @@ +package parser + +import ( + "offChainData/utils" + + "github.com/hyperledger/fabric-protos-go-apiv2/ledger/rwset" + "github.com/hyperledger/fabric-protos-go-apiv2/ledger/rwset/kvrwset" + "google.golang.org/protobuf/proto" +) + +type NamespaceReadWriteSet struct { + nsReadWriteSet *rwset.NsReadWriteSet +} + +func parseNamespaceReadWriteSet(nsRwSet *rwset.NsReadWriteSet) *NamespaceReadWriteSet { + return &NamespaceReadWriteSet{nsRwSet} +} + +func (p *NamespaceReadWriteSet) Namespace() string { + return p.nsReadWriteSet.GetNamespace() +} + +func (p *NamespaceReadWriteSet) ReadWriteSet() *kvrwset.KVRWSet { + return utils.Cache(func() *kvrwset.KVRWSet { + result := kvrwset.KVRWSet{} + if err := proto.Unmarshal(p.nsReadWriteSet.GetRwset(), &result); err != nil { + panic(err) + } + + return &result + })() +} diff --git a/off_chain_data/application-go/parser/payload.go b/off_chain_data/application-go/parser/payload.go index 46d666db..b61454a8 100644 --- a/off_chain_data/application-go/parser/payload.go +++ b/off_chain_data/application-go/parser/payload.go @@ -9,29 +9,18 @@ import ( "google.golang.org/protobuf/proto" ) -// TODO remove interface, use struct; encapsulate -type Payload interface { - ChannelHeader() *common.ChannelHeader - EndorserTransaction() EndorserTransaction - SignatureHeader() *common.SignatureHeader - TransactionValidationCode() int32 - IsEndorserTransaction() bool - IsValid() bool - ToProto() *common.Payload +type payload struct { + commonPayload *common.Payload + statusCode int32 } -type PayloadImpl struct { - payload *common.Payload - statusCode int32 +func parsePayload(commonPayload *common.Payload, statusCode int32) *payload { + return &payload{commonPayload, statusCode} } -func ParsePayload(payload *common.Payload, statusCode int32) *PayloadImpl { - return &PayloadImpl{payload, statusCode} -} - -func (p *PayloadImpl) ChannelHeader() *common.ChannelHeader { +func (p *payload) channelHeader() *common.ChannelHeader { return utils.Cache(func() *common.ChannelHeader { - header := utils.AssertDefined(p.payload.GetHeader(), "missing payload header") + header := utils.AssertDefined(p.commonPayload.GetHeader(), "missing payload header") result := &common.ChannelHeader{} if err := proto.Unmarshal(header.GetChannelHeader(), result); err != nil { @@ -42,45 +31,23 @@ func (p *PayloadImpl) ChannelHeader() *common.ChannelHeader { })() } -func (p *PayloadImpl) EndorserTransaction() EndorserTransaction { - if !p.IsEndorserTransaction() { - panic(fmt.Errorf("unexpected payload type: %d", p.ChannelHeader().GetType())) +func (p *payload) endorserTransaction() *endorserTransaction { + if !p.isEndorserTransaction() { + panic(fmt.Errorf("unexpected payload type: %d", p.channelHeader().GetType())) } result := &peer.Transaction{} - if err := proto.Unmarshal(p.payload.GetData(), result); err != nil { + if err := proto.Unmarshal(p.commonPayload.GetData(), result); err != nil { panic(err) } - return ParseEndorserTransaction(result) + return parseEndorserTransaction(result) } -func (p *PayloadImpl) SignatureHeader() *common.SignatureHeader { - return utils.Cache(func() *common.SignatureHeader { - header := utils.AssertDefined(p.payload.GetHeader(), "missing payload header") - - result := &common.SignatureHeader{} - if err := proto.Unmarshal(header.GetSignatureHeader(), result); err != nil { - panic(err) - } - - return result - })() +func (p *payload) isEndorserTransaction() bool { + return p.channelHeader().GetType() == int32(common.HeaderType_ENDORSER_TRANSACTION) } -func (p *PayloadImpl) TransactionValidationCode() int32 { - return p.statusCode -} - -func (p *PayloadImpl) IsEndorserTransaction() bool { - return p.ChannelHeader().GetType() == int32(common.HeaderType_ENDORSER_TRANSACTION) -} - -func (p *PayloadImpl) IsValid() bool { +func (p *payload) isValid() bool { return p.statusCode == int32(peer.TxValidationCode_VALID) } - -// TODO remove unused -func (p *PayloadImpl) ToProto() *common.Payload { - return p.payload -} diff --git a/off_chain_data/application-go/parser/readWriteSet.go b/off_chain_data/application-go/parser/readWriteSet.go index f16b1e97..d795c0b8 100644 --- a/off_chain_data/application-go/parser/readWriteSet.go +++ b/off_chain_data/application-go/parser/readWriteSet.go @@ -1,72 +1,22 @@ package parser import ( - "offChainData/utils" - "github.com/hyperledger/fabric-protos-go-apiv2/ledger/rwset" - "github.com/hyperledger/fabric-protos-go-apiv2/ledger/rwset/kvrwset" - "google.golang.org/protobuf/proto" ) -// TODO remove interface, use struct; encapsulate; extract into file -type ReadWriteSet interface { - NamespaceReadWriteSets() []NamespaceReadWriteSet - ToProto() *rwset.TxReadWriteSet -} - -type ReadWriteSetImpl struct { +type readWriteSet struct { readWriteSet *rwset.TxReadWriteSet } -func ParseReadWriteSet(rwSet *rwset.TxReadWriteSet) *ReadWriteSetImpl { - return &ReadWriteSetImpl{rwSet} +func parseReadWriteSet(rwSet *rwset.TxReadWriteSet) *readWriteSet { + return &readWriteSet{rwSet} } -func (p *ReadWriteSetImpl) NamespaceReadWriteSets() []NamespaceReadWriteSet { - result := []NamespaceReadWriteSet{} +func (p *readWriteSet) namespaceReadWriteSets() []*NamespaceReadWriteSet { + result := []*NamespaceReadWriteSet{} for _, nsReadWriteSet := range p.readWriteSet.GetNsRwset() { - parsedNamespaceReadWriteSet := ParseNamespaceReadWriteSet(nsReadWriteSet) + parsedNamespaceReadWriteSet := parseNamespaceReadWriteSet(nsReadWriteSet) result = append(result, parsedNamespaceReadWriteSet) } return result } - -// TODO remove unused -func (p *ReadWriteSetImpl) ToProto() *rwset.TxReadWriteSet { - return p.readWriteSet -} - -// TODO remove interface, use struct -type NamespaceReadWriteSet interface { - Namespace() string - ReadWriteSet() *kvrwset.KVRWSet - ToProto() *rwset.NsReadWriteSet -} - -type NamespaceReadWriteSetImpl struct { - nsReadWriteSet *rwset.NsReadWriteSet -} - -func ParseNamespaceReadWriteSet(nsRwSet *rwset.NsReadWriteSet) *NamespaceReadWriteSetImpl { - return &NamespaceReadWriteSetImpl{nsRwSet} -} - -func (p *NamespaceReadWriteSetImpl) Namespace() string { - return p.nsReadWriteSet.GetNamespace() -} - -func (p *NamespaceReadWriteSetImpl) ReadWriteSet() *kvrwset.KVRWSet { - return utils.Cache(func() *kvrwset.KVRWSet { - result := kvrwset.KVRWSet{} - if err := proto.Unmarshal(p.nsReadWriteSet.GetRwset(), &result); err != nil { - panic(err) - } - - return &result - })() -} - -// TODO remove unused -func (p *NamespaceReadWriteSetImpl) ToProto() *rwset.NsReadWriteSet { - return p.nsReadWriteSet -} diff --git a/off_chain_data/application-go/parser/transaction.go b/off_chain_data/application-go/parser/transaction.go index b2d3b1e1..d7c618d9 100644 --- a/off_chain_data/application-go/parser/transaction.go +++ b/off_chain_data/application-go/parser/transaction.go @@ -1,165 +1,30 @@ package parser import ( - "offChainData/utils" - - "github.com/hyperledger/fabric-gateway/pkg/identity" "github.com/hyperledger/fabric-protos-go-apiv2/common" - "github.com/hyperledger/fabric-protos-go-apiv2/ledger/rwset" - "github.com/hyperledger/fabric-protos-go-apiv2/msp" - "github.com/hyperledger/fabric-protos-go-apiv2/peer" - "google.golang.org/protobuf/proto" ) type Transaction struct { - payload Payload + payload *payload } -func NewTransaction(payload Payload) *Transaction { +func newTransaction(payload *payload) *Transaction { return &Transaction{payload} } func (t *Transaction) ChannelHeader() *common.ChannelHeader { - return t.payload.ChannelHeader() + return t.payload.channelHeader() } -// TODO remove unused? -func (t *Transaction) Creator() identity.Identity { - creator := &msp.SerializedIdentity{} - if err := proto.Unmarshal(t.payload.SignatureHeader().GetCreator(), creator); err != nil { - panic(err) - } - - return &identityImpl{creator} -} - -func (t *Transaction) NamespaceReadWriteSets() []NamespaceReadWriteSet { - result := []NamespaceReadWriteSet{} - for _, readWriteSet := range t.payload.EndorserTransaction().ReadWriteSets() { - result = append(result, readWriteSet.NamespaceReadWriteSets()...) +func (t *Transaction) NamespaceReadWriteSets() []*NamespaceReadWriteSet { + result := []*NamespaceReadWriteSet{} + for _, readWriteSet := range t.payload.endorserTransaction().readWriteSets() { + result = append(result, readWriteSet.namespaceReadWriteSets()...) } return result } -// TODO remove unused? -func (t *Transaction) ValidationCode() int32 { - return t.payload.TransactionValidationCode() -} - -// TODO remove unused? func (t *Transaction) IsValid() bool { - return t.payload.IsValid() -} - -// TODO remove unused? -func (t *Transaction) ToProto() *common.Payload { - return t.payload.ToProto() -} - -// TODO remove interface, use struct; encapsulate; extract into file -type EndorserTransaction interface { - ReadWriteSets() []ReadWriteSet - ToProto() *peer.Transaction -} - -type EndorserTransactionImpl struct { - transaction *peer.Transaction -} - -func ParseEndorserTransaction(transaction *peer.Transaction) *EndorserTransactionImpl { - return &EndorserTransactionImpl{transaction} -} - -func (p *EndorserTransactionImpl) ReadWriteSets() []ReadWriteSet { - return utils.Cache(func() []ReadWriteSet { - chaincodeActionPayloads := p.unmarshalChaincodeActionPayloads() - - chaincodeEndorsedActions := p.extractChaincodeEndorsedActionsFrom(chaincodeActionPayloads) - - proposalResponsePayloads := p.unmarshalProposalResponsePayloadsFrom(chaincodeEndorsedActions) - - chaincodeActions := p.unmarshalChaincodeActionsFrom(proposalResponsePayloads) - - txReadWriteSets := p.unmarshalTxReadWriteSetsFrom(chaincodeActions) - - return p.parseReadWriteSets(txReadWriteSets) - })() -} - -func (p *EndorserTransactionImpl) unmarshalChaincodeActionPayloads() []*peer.ChaincodeActionPayload { - result := []*peer.ChaincodeActionPayload{} - for _, transactionAction := range p.transaction.GetActions() { - chaincodeActionPayload := &peer.ChaincodeActionPayload{} - if err := proto.Unmarshal(transactionAction.GetPayload(), chaincodeActionPayload); err != nil { - panic(err) - } - - result = append(result, chaincodeActionPayload) - } - return result -} - -func (*EndorserTransactionImpl) extractChaincodeEndorsedActionsFrom(chaincodeActionPayloads []*peer.ChaincodeActionPayload) []*peer.ChaincodeEndorsedAction { - result := []*peer.ChaincodeEndorsedAction{} - for _, payload := range chaincodeActionPayloads { - result = append( - result, - utils.AssertDefined( - payload.GetAction(), - "missing chaincode endorsed action", - ), - ) - } - return result -} - -func (*EndorserTransactionImpl) unmarshalProposalResponsePayloadsFrom(chaincodeEndorsedActions []*peer.ChaincodeEndorsedAction) []*peer.ProposalResponsePayload { - result := []*peer.ProposalResponsePayload{} - for _, endorsedAction := range chaincodeEndorsedActions { - proposalResponsePayload := &peer.ProposalResponsePayload{} - if err := proto.Unmarshal(endorsedAction.GetProposalResponsePayload(), proposalResponsePayload); err != nil { - panic(err) - } - result = append(result, proposalResponsePayload) - } - return result -} - -func (*EndorserTransactionImpl) unmarshalChaincodeActionsFrom(proposalResponsePayloads []*peer.ProposalResponsePayload) []*peer.ChaincodeAction { - result := []*peer.ChaincodeAction{} - for _, proposalResponsePayload := range proposalResponsePayloads { - chaincodeAction := &peer.ChaincodeAction{} - if err := proto.Unmarshal(proposalResponsePayload.GetExtension(), chaincodeAction); err != nil { - panic(err) - } - result = append(result, chaincodeAction) - } - return result -} - -func (*EndorserTransactionImpl) unmarshalTxReadWriteSetsFrom(chaincodeActions []*peer.ChaincodeAction) []*rwset.TxReadWriteSet { - result := []*rwset.TxReadWriteSet{} - for _, chaincodeAction := range chaincodeActions { - txReadWriteSet := &rwset.TxReadWriteSet{} - if err := proto.Unmarshal(chaincodeAction.GetResults(), txReadWriteSet); err != nil { - continue - } - result = append(result, txReadWriteSet) - } - return result -} - -func (*EndorserTransactionImpl) parseReadWriteSets(txReadWriteSets []*rwset.TxReadWriteSet) []ReadWriteSet { - result := []ReadWriteSet{} - for _, txReadWriteSet := range txReadWriteSets { - parsedReadWriteSet := ParseReadWriteSet(txReadWriteSet) - result = append(result, parsedReadWriteSet) - } - return result -} - -// TODO remove unused -func (p *EndorserTransactionImpl) ToProto() *peer.Transaction { - return p.transaction + return t.payload.isValid() } diff --git a/off_chain_data/application-go/processor/block.go b/off_chain_data/application-go/processor/block.go index 13cc0759..3734b2cd 100644 --- a/off_chain_data/application-go/processor/block.go +++ b/off_chain_data/application-go/processor/block.go @@ -9,20 +9,20 @@ import ( ) type block struct { - block *parser.Block + parsedBlock *parser.Block checkpointer *client.FileCheckpointer writeToStore store.Writer channelName string } func NewBlock( - _block *parser.Block, + parsedBlock *parser.Block, checkpointer *client.FileCheckpointer, writeToStore store.Writer, channelName string, ) *block { return &block{ - _block, + parsedBlock, checkpointer, writeToStore, channelName, @@ -30,25 +30,25 @@ func NewBlock( } func (b *block) Process() { - blockNumber := b.block.Number() + blockNumber := b.parsedBlock.Number() fmt.Println("\nReceived block", blockNumber) - for _, transaction := range b.validTransactions() { - aTransactionProcessor := transactionProcessor{ + for _, validTransaction := range b.validTransactions() { + aTransaction := transaction{ blockNumber, - transaction, + validTransaction, // TODO use pointer to parent and get blockNumber, store and channelName from parent b.writeToStore, b.channelName, } - aTransactionProcessor.process() + aTransaction.process() - transactionId := transaction.ChannelHeader().GetTxId() + transactionId := validTransaction.ChannelHeader().GetTxId() b.checkpointer.CheckpointTransaction(blockNumber, transactionId) } - b.checkpointer.CheckpointBlock(b.block.Number()) + b.checkpointer.CheckpointBlock(b.parsedBlock.Number()) } func (b *block) validTransactions() []*parser.Transaction { @@ -62,7 +62,7 @@ func (b *block) validTransactions() []*parser.Transaction { } func (b *block) getNewTransactions() []*parser.Transaction { - transactions := b.block.Transactions() + transactions := b.parsedBlock.Transactions() lastTransactionId := b.checkpointer.TransactionID() if lastTransactionId == "" { @@ -77,7 +77,7 @@ func (b *block) getNewTransactions() []*parser.Transaction { func (b *block) findLastProcessedIndex() int { blockTransactionIds := []string{} - for _, transaction := range b.block.Transactions() { + for _, transaction := range b.parsedBlock.Transactions() { blockTransactionIds = append(blockTransactionIds, transaction.ChannelHeader().GetTxId()) } @@ -93,7 +93,7 @@ func (b *block) findLastProcessedIndex() int { fmt.Errorf( "checkpoint transaction ID %s not found in block %d containing transactions: %s", lastTransactionId, - b.block.Number(), + b.parsedBlock.Number(), b.joinByComma(blockTransactionIds), ), ) diff --git a/off_chain_data/application-go/processor/transaction.go b/off_chain_data/application-go/processor/transaction.go index 99d965d3..3ff78edd 100644 --- a/off_chain_data/application-go/processor/transaction.go +++ b/off_chain_data/application-go/processor/transaction.go @@ -7,14 +7,14 @@ import ( "slices" ) -type transactionProcessor struct { +type transaction struct { blockNumber uint64 transaction *parser.Transaction writeToStore store.Writer channelName string } -func (t *transactionProcessor) process() { +func (t *transaction) process() { transactionId := t.transaction.ChannelHeader().GetTxId() writes := t.writes() @@ -32,10 +32,12 @@ func (t *transactionProcessor) process() { }) } -func (t *transactionProcessor) writes() []store.Write { +func (t *transaction) writes() []store.Write { + // TODO this entire code should live in the parser and just return the kvWrite which + // we then map to store.Write and return t.channelName = t.transaction.ChannelHeader().GetChannelId() - nonSystemCCReadWriteSets := []parser.NamespaceReadWriteSet{} + nonSystemCCReadWriteSets := []*parser.NamespaceReadWriteSet{} for _, nsReadWriteSet := range t.transaction.NamespaceReadWriteSets() { if !t.isSystemChaincode(nsReadWriteSet.Namespace()) { nonSystemCCReadWriteSets = append(nonSystemCCReadWriteSets, nsReadWriteSet) @@ -60,7 +62,7 @@ func (t *transactionProcessor) writes() []store.Write { return writes } -func (t *transactionProcessor) isSystemChaincode(chaincodeName string) bool { +func (t *transaction) isSystemChaincode(chaincodeName string) bool { systemChaincodeNames := []string{ "_lifecycle", "cscc", diff --git a/off_chain_data/application-go/transact.go b/off_chain_data/application-go/transact.go index 0b388f16..6514f796 100644 --- a/off_chain_data/application-go/transact.go +++ b/off_chain_data/application-go/transact.go @@ -27,7 +27,7 @@ func transact(clientConnection *grpc.ClientConn) { type transactApp struct { smartContract *atb.AssetTransferBasic - batchSize uint + batchSize int } func newTransactApp(smartContract *atb.AssetTransferBasic) *transactApp { @@ -35,7 +35,7 @@ func newTransactApp(smartContract *atb.AssetTransferBasic) *transactApp { } func (t *transactApp) run() { - for i := 0; i < int(t.batchSize); i++ { + for i := 0; i < t.batchSize; i++ { t.transact() } }