From 5219742612372b0f6b78266ed384b0b8461559df Mon Sep 17 00:00:00 2001 From: Sawyer <18228063+2dvorak@users.noreply.github.com> Date: Thu, 7 Aug 2025 22:04:21 +0900 Subject: [PATCH] Check filter GetLogs args correctly and add test cases --- node/cn/filters/api_kaia_filter.go | 3 ++ node/cn/filters/filter_system_test.go | 64 ++++++++++++++++++++------- 2 files changed, 51 insertions(+), 16 deletions(-) diff --git a/node/cn/filters/api_kaia_filter.go b/node/cn/filters/api_kaia_filter.go index 7039b6f2d..77213b5e2 100644 --- a/node/cn/filters/api_kaia_filter.go +++ b/node/cn/filters/api_kaia_filter.go @@ -403,6 +403,9 @@ func (api *KaiaFilterAPI) GetLogs(ctx context.Context, crit FilterCriteria) ([]* var filter *Filter if crit.BlockHash != nil { + if crit.FromBlock != nil || crit.ToBlock != nil { + return nil, errors.New("can't specify fromBlock/toBlock with blockHash") + } // Block filter requested, construct a single-shot filter filter = NewBlockFilter(api.backend, *crit.BlockHash, crit.Addresses, crit.Topics) } else { diff --git a/node/cn/filters/filter_system_test.go b/node/cn/filters/filter_system_test.go index 35efe9428..3821c5fc1 100644 --- a/node/cn/filters/filter_system_test.go +++ b/node/cn/filters/filter_system_test.go @@ -28,6 +28,7 @@ import ( "math/rand" "reflect" "runtime" + "strings" "testing" "time" @@ -35,6 +36,7 @@ import ( "github.com/kaiachain/kaia/blockchain/bloombits" "github.com/kaiachain/kaia/blockchain/state" "github.com/kaiachain/kaia/blockchain/types" + "github.com/kaiachain/kaia/blockchain/vm" "github.com/kaiachain/kaia/common" "github.com/kaiachain/kaia/consensus" "github.com/kaiachain/kaia/consensus/gxhash" @@ -404,27 +406,57 @@ func TestInvalidLogFilterCreation(t *testing.T) { func TestInvalidGetLogsRequest(t *testing.T) { var ( - mux = new(event.TypeMux) - db = database.NewMemoryDBManager() - txFeed = new(event.Feed) - rmLogsFeed = new(event.Feed) - logsFeed = new(event.Feed) - chainFeed = new(event.Feed) - backend = &testBackend{mux, db, 0, txFeed, rmLogsFeed, logsFeed, chainFeed, params.TestChainConfig, nil, nil, nil} - api = NewKaiaFilterAPI(backend) - blockHash = common.HexToHash("0x1111111111111111111111111111111111111111111111111111111111111111") + mux = new(event.TypeMux) + db = database.NewMemoryDBManager() + genesis = new(blockchain.Genesis).MustCommit(db) + blocks, _ = blockchain.GenerateChain(params.TestChainConfig, genesis, gxhash.NewFaker(), db, 10, func(i int, gen *blockchain.BlockGen) {}) + txFeed = new(event.Feed) + rmLogsFeed = new(event.Feed) + logsFeed = new(event.Feed) + chainFeed = new(event.Feed) + engine = gxhash.NewFaker() + backend = &testBackend{mux, db, 0, txFeed, rmLogsFeed, logsFeed, chainFeed, params.TestChainConfig, nil, nil, engine} + api = NewKaiaFilterAPI(backend) + blockHash = blocks[0].Hash() + unknownBlockHash = common.HexToHash("0x1111111111111111111111111111111111111111111111111111111111111111") ) - // Reason: Cannot specify both BlockHash and FromBlock/ToBlock) - testCases := []FilterCriteria{ - 0: {BlockHash: &blockHash, FromBlock: big.NewInt(100)}, - 1: {BlockHash: &blockHash, ToBlock: big.NewInt(500)}, - 2: {BlockHash: &blockHash, FromBlock: big.NewInt(rpc.LatestBlockNumber.Int64())}, + // Insert the blocks into the chain so filter can look them up + blockchain, err := blockchain.NewBlockChain(db, nil, params.TestChainConfig, backend.Engine(), vm.Config{}) + if err != nil { + t.Fatalf("failed to create tester chain: %v", err) + } + if n, err := blockchain.InsertChain(blocks); err != nil { + t.Fatalf("block %d: failed to insert into chain: %v", n, err) + } + + type testcase struct { + f FilterCriteria + errStr string + } + testCases := []testcase{ + { + f: FilterCriteria{BlockHash: &blockHash, FromBlock: big.NewInt(100)}, + errStr: "can't specify fromBlock/toBlock with blockHash", + }, + { + f: FilterCriteria{BlockHash: &blockHash, ToBlock: big.NewInt(500)}, + errStr: "can't specify fromBlock/toBlock with blockHash", + }, + { + f: FilterCriteria{BlockHash: &blockHash, FromBlock: big.NewInt(rpc.LatestBlockNumber.Int64())}, + errStr: "can't specify fromBlock/toBlock with blockHash", + }, + { + f: FilterCriteria{BlockHash: &unknownBlockHash}, + errStr: "unknown block", + }, } for i, test := range testCases { - if _, err := api.GetLogs(context.Background(), test); err == nil { - t.Errorf("Expected Logs for case #%d to fail", i) + _, err := api.GetLogs(context.Background(), test.f) + if !strings.Contains(err.Error(), test.errStr) { + t.Errorf("case %d: wrong error: %q\nwant: %q", i, err, test.errStr) } } }