From 034e9b08c0d7597725eb0fc672430b240772f66d Mon Sep 17 00:00:00 2001 From: Stanislav Jakuschevskij Date: Tue, 11 Feb 2025 17:55:14 +0100 Subject: [PATCH] Move channel header unmarshal to constructor Remove txError struct. Signed-off-by: Stanislav Jakuschevskij --- .../application-go/contract/contract.go | 2 +- off_chain_data/application-go/getAllAssets.go | 5 +- off_chain_data/application-go/listen.go | 47 ++++--------------- off_chain_data/application-go/parser/block.go | 6 +-- .../application-go/parser/block_test.go | 2 +- .../application-go/parser/payload.go | 43 ++++++----------- .../application-go/parser/transaction.go | 4 +- off_chain_data/application-go/transact.go | 3 +- 8 files changed, 33 insertions(+), 79 deletions(-) diff --git a/off_chain_data/application-go/contract/contract.go b/off_chain_data/application-go/contract/contract.go index 433343d2..7f7404de 100644 --- a/off_chain_data/application-go/contract/contract.go +++ b/off_chain_data/application-go/contract/contract.go @@ -64,7 +64,7 @@ func (atb *AssetTransferBasic) GetAllAssets() ([]Asset, error) { } if len(assetsRaw) == 0 { - return []Asset{}, nil + return nil, nil } var assets []Asset diff --git a/off_chain_data/application-go/getAllAssets.go b/off_chain_data/application-go/getAllAssets.go index 4668a886..95619be9 100644 --- a/off_chain_data/application-go/getAllAssets.go +++ b/off_chain_data/application-go/getAllAssets.go @@ -24,12 +24,11 @@ func getAllAssets(clientConnection grpc.ClientConnInterface) error { return err } - assetsJSONformatted, err := json.MarshalIndent(assets, "", " ") + formatted, err := json.MarshalIndent(assets, "", " ") if err != nil { return err } - - fmt.Println(assetsJSONformatted) + fmt.Println(string(formatted)) return nil } diff --git a/off_chain_data/application-go/listen.go b/off_chain_data/application-go/listen.go index 81ef6830..5ea87b59 100644 --- a/off_chain_data/application-go/listen.go +++ b/off_chain_data/application-go/listen.go @@ -104,11 +104,7 @@ func (b *blockProcessor) process() error { return err } - channelHeader, err := validTransaction.ChannelHeader() - if err != nil { - return err - } - transactionID := channelHeader.GetTxId() + transactionID := validTransaction.ChannelHeader().GetTxId() if err := b.checkpointer.CheckpointTransaction(b.parsedBlock.Number(), transactionID); err != nil { return err } @@ -164,11 +160,7 @@ func (b *blockProcessor) findLastProcessedIndex() (int, error) { blockTransactionIDs := []string{} for _, transaction := range transactions { - channelHeader, err := transaction.ChannelHeader() - if err != nil { - return 0, err - } - blockTransactionIDs = append(blockTransactionIDs, channelHeader.GetTxId()) + blockTransactionIDs = append(blockTransactionIDs, transaction.ChannelHeader().GetTxId()) } lastTransactionID := b.checkpointer.TransactionID() @@ -180,11 +172,13 @@ func (b *blockProcessor) findLastProcessedIndex() (int, error) { } if lastProcessedIndex < 0 { - return lastProcessedIndex, newTxIDNotFoundError( + err = fmt.Errorf( + "checkpoint transaction ID %s not found in block %d containing transactions: %s", lastTransactionID, b.parsedBlock.Number(), - blockTransactionIDs, + strings.Join(blockTransactionIDs, ", "), ) + return lastProcessedIndex, err } return lastProcessedIndex, nil @@ -198,11 +192,7 @@ type transactionProcessor struct { } func (t *transactionProcessor) process() error { - channelHeader, err := t.transaction.ChannelHeader() - if err != nil { - return err - } - transactionID := channelHeader.GetTxId() + transactionID := t.transaction.ChannelHeader().GetTxId() writes, err := t.writes() if err != nil { @@ -230,11 +220,7 @@ func (t *transactionProcessor) process() error { func (t *transactionProcessor) writes() ([]write, error) { // TODO this entire code should live in the parser and just return the kvWrite which // we then map to write and return - channelHeader, err := t.transaction.ChannelHeader() - if err != nil { - return nil, err - } - t.channelName = channelHeader.GetChannelId() + t.channelName = t.transaction.ChannelHeader().GetChannelId() nsReadWriteSets, err := t.transaction.NamespaceReadWriteSets() if err != nil { @@ -282,20 +268,3 @@ func (t *transactionProcessor) isSystemChaincode(chaincodeName string) bool { } return slices.Contains(systemChaincodeNames, chaincodeName) } - -type txIDNotFoundError struct { - txID string - blockNumber uint64 - blockTxIDs []string -} - -func newTxIDNotFoundError(txID string, blockNumber uint64, blockTxIds []string) *txIDNotFoundError { - return &txIDNotFoundError{ - txID, blockNumber, blockTxIds, - } -} - -func (t *txIDNotFoundError) Error() string { - format := "checkpoint transaction ID %s not found in block %d containing transactions: %s" - return fmt.Sprintf(format, t.txID, t.blockNumber, strings.Join(t.blockTxIDs, ", ")) -} diff --git a/off_chain_data/application-go/parser/block.go b/off_chain_data/application-go/parser/block.go index 7d0458e3..7a51a7d3 100644 --- a/off_chain_data/application-go/parser/block.go +++ b/off_chain_data/application-go/parser/block.go @@ -76,12 +76,12 @@ func (b *Block) parse(commonPayloads []*common.Payload) ([]*payload, error) { for i, commonPayload := range commonPayloads { statusCode := validationCodes[i] - payload := parsePayload(commonPayload, int32(statusCode)) - is, err := payload.isEndorserTransaction() + payload, err := parsePayload(commonPayload, int32(statusCode)) if err != nil { return nil, err } - if is { + + if payload.isEndorserTransaction() { result = append(result, payload) } } diff --git a/off_chain_data/application-go/parser/block_test.go b/off_chain_data/application-go/parser/block_test.go index 2b3ca504..6e0f94b6 100644 --- a/off_chain_data/application-go/parser/block_test.go +++ b/off_chain_data/application-go/parser/block_test.go @@ -88,7 +88,7 @@ func Test_ReadWriteSetWrapping(t *testing.T) { parsedRwSet := parseReadWriteSet(txReadWriteSetFake) if len(parsedRwSet.namespaceReadWriteSets()) != 1 { - t.Fatalf("Expected 1 NamespaceReadWriteSet, got %d", len(parsedRwSet.namespaceReadWriteSets())) + t.Fatal("expected 1 NamespaceReadWriteSet, got", len(parsedRwSet.namespaceReadWriteSets())) } } diff --git a/off_chain_data/application-go/parser/payload.go b/off_chain_data/application-go/parser/payload.go index a989a296..21a23b60 100644 --- a/off_chain_data/application-go/parser/payload.go +++ b/off_chain_data/application-go/parser/payload.go @@ -2,7 +2,6 @@ package parser import ( "fmt" - "sync" "github.com/hyperledger/fabric-protos-go-apiv2/common" "github.com/hyperledger/fabric-protos-go-apiv2/peer" @@ -12,35 +11,28 @@ import ( type payload struct { commonPayload *common.Payload statusCode int32 - channelHeader func() (*common.ChannelHeader, error) + channelHeader *common.ChannelHeader } -func parsePayload(commonPayload *common.Payload, statusCode int32) *payload { - result := &payload{commonPayload, statusCode, nil} - result.channelHeader = sync.OnceValues(result.unmarshalChannelHeader) - return result -} - -func (p *payload) unmarshalChannelHeader() (*common.ChannelHeader, error) { - result := &common.ChannelHeader{} - if err := proto.Unmarshal(p.commonPayload.GetHeader().GetChannelHeader(), result); err != nil { +func parsePayload(commonPayload *common.Payload, statusCode int32) (*payload, error) { + channelHeader, err := unmarshalChannelHeaderFrom(commonPayload) + if err != nil { return nil, err } + return &payload{commonPayload, statusCode, channelHeader}, nil +} +func unmarshalChannelHeaderFrom(commonPayload *common.Payload) (*common.ChannelHeader, error) { + result := &common.ChannelHeader{} + if err := proto.Unmarshal(commonPayload.GetHeader().GetChannelHeader(), result); err != nil { + return nil, err + } return result, nil } func (p *payload) endorserTransaction() (*endorserTransaction, error) { - is, err := p.isEndorserTransaction() - if err != nil { - return nil, err - } - if !is { - channelHeader, err := p.channelHeader() - if err != nil { - return nil, err - } - return nil, fmt.Errorf("unexpected payload type: %d", channelHeader.GetType()) + if !p.isEndorserTransaction() { + return nil, fmt.Errorf("unexpected payload type: %d", p.channelHeader.GetType()) } result := &peer.Transaction{} @@ -51,13 +43,8 @@ func (p *payload) endorserTransaction() (*endorserTransaction, error) { return parseEndorserTransaction(result), nil } -func (p *payload) isEndorserTransaction() (bool, error) { - channelHeader, err := p.channelHeader() - if err != nil { - return false, err - } - - return channelHeader.GetType() == int32(common.HeaderType_ENDORSER_TRANSACTION), nil +func (p *payload) isEndorserTransaction() bool { + return p.channelHeader.GetType() == int32(common.HeaderType_ENDORSER_TRANSACTION) } func (p *payload) isValid() bool { diff --git a/off_chain_data/application-go/parser/transaction.go b/off_chain_data/application-go/parser/transaction.go index ea120fd7..ef59b160 100644 --- a/off_chain_data/application-go/parser/transaction.go +++ b/off_chain_data/application-go/parser/transaction.go @@ -12,8 +12,8 @@ func newTransaction(payload *payload) *Transaction { return &Transaction{payload} } -func (t *Transaction) ChannelHeader() (*common.ChannelHeader, error) { - return t.payload.channelHeader() +func (t *Transaction) ChannelHeader() *common.ChannelHeader { + return t.payload.channelHeader } func (t *Transaction) NamespaceReadWriteSets() ([]*NamespaceReadWriteSet, error) { diff --git a/off_chain_data/application-go/transact.go b/off_chain_data/application-go/transact.go index 46afafdc..578f3b2d 100644 --- a/off_chain_data/application-go/transact.go +++ b/off_chain_data/application-go/transact.go @@ -127,8 +127,7 @@ func newAsset() (atb.Asset, error) { // Pick a random element from an array. func randomElement(values []string) string { - result := values[rand.N(len(values))] - return result + return values[rand.N(len(values))] } // Pick a random element from an array, excluding the current value.