From 3e2c47e89625a4d6354d822901013751d2ccab1e Mon Sep 17 00:00:00 2001 From: prathamesh0 Date: Thu, 7 Jul 2022 16:14:43 +0530 Subject: [PATCH] Avoid NULL result from canonical block hash query --- pkg/eth/backend.go | 15 ++++++++++----- pkg/eth/cid_retriever.go | 2 +- pkg/eth/test_helpers/test_data.go | 4 ++++ 3 files changed, 15 insertions(+), 6 deletions(-) diff --git a/pkg/eth/backend.go b/pkg/eth/backend.go index a5a8e34c..def93667 100644 --- a/pkg/eth/backend.go +++ b/pkg/eth/backend.go @@ -56,6 +56,7 @@ var ( errNegativeBlockNumber = errors.New("negative block number not supported") errHeaderHashNotFound = errors.New("header for hash not found") errHeaderNotFound = errors.New("header not found") + errTxHashNotFound = errors.New("transaction for hash not found") errTxHashInMultipleBlocks = errors.New("transaction for hash found in more than one canonical block") // errMissingSignature is returned if a block's extra-data section doesn't seem @@ -63,8 +64,10 @@ var ( ) const ( - RetrieveCanonicalBlockHashByNumber = `SELECT canonical_header_hash($1)` - RetrieveCanonicalHeaderByNumber = `SELECT cid, data FROM eth.header_cids + RetrieveCanonicalBlockHashByNumber = `SELECT block_hash + FROM canonical_header_hash($1) AS block_hash + WHERE block_hash IS NOT NULL` + RetrieveCanonicalHeaderByNumber = `SELECT cid, data FROM eth.header_cids INNER JOIN public.blocks ON ( header_cids.mh_key = blocks.key AND header_cids.block_number = blocks.block_number @@ -526,12 +529,14 @@ func (b *Backend) GetTransaction(ctx context.Context, txHash common.Hash) (*type Index uint64 `db:"index"` } var res = make([]txRes, 0) - if err := b.DB.Get(&res, RetrieveRPCTransaction, txHash.String()); err != nil { + if err := b.DB.Select(&res, RetrieveRPCTransaction, txHash.String()); err != nil { return nil, common.Hash{}, 0, 0, err } - // a transaction can be part of a only one canonical block - if len(res) > 1 { + if len(res) == 0 { + return nil, common.Hash{}, 0, 0, errTxHashNotFound + } else if len(res) > 1 { + // a transaction can be part of a only one canonical block return nil, common.Hash{}, 0, 0, errTxHashInMultipleBlocks } diff --git a/pkg/eth/cid_retriever.go b/pkg/eth/cid_retriever.go index 85e708c1..c1579638 100644 --- a/pkg/eth/cid_retriever.go +++ b/pkg/eth/cid_retriever.go @@ -737,7 +737,7 @@ func (ecr *CIDRetriever) RetrieveTxCIDByHash(txHash string) (TransactionCIDRecor var txCID TransactionCIDRecord - err := ecr.gormDB.Joins("IPLD").First(&txCID, "tx_hash = ?", txHash).Error + err := ecr.gormDB.Joins("IPLD").Find(&txCID, "tx_hash = ? AND transaction_cids.header_id = (SELECT canonical_header_hash(transaction_cids.block_number))", txHash).Error if err != nil { log.Error("header cid retrieval error") return txCID, err diff --git a/pkg/eth/test_helpers/test_data.go b/pkg/eth/test_helpers/test_data.go index 96d525d7..d4f7118d 100644 --- a/pkg/eth/test_helpers/test_data.go +++ b/pkg/eth/test_helpers/test_data.go @@ -301,6 +301,7 @@ var ( MockRctMetaPostPublish = []models.ReceiptModel{ { BlockNumber: "1", + HeaderID: MockBlock.Hash().String(), LeafCID: Rct1CID.String(), LeafMhKey: Rct1MhKey, Contract: "", @@ -308,6 +309,7 @@ var ( }, { BlockNumber: "1", + HeaderID: MockBlock.Hash().String(), LeafCID: Rct2CID.String(), LeafMhKey: Rct2MhKey, Contract: "", @@ -315,6 +317,7 @@ var ( }, { BlockNumber: "1", + HeaderID: MockBlock.Hash().String(), LeafCID: Rct3CID.String(), LeafMhKey: Rct3MhKey, Contract: ContractAddress.String(), @@ -322,6 +325,7 @@ var ( }, { BlockNumber: "1", + HeaderID: MockBlock.Hash().String(), LeafCID: Rct4CID.String(), LeafMhKey: Rct4MhKey, Contract: "",