From e0569ce30684703bcadfbeb4bd99c002f72d228d Mon Sep 17 00:00:00 2001 From: CertiK <138698582+CertiK-Geth@users.noreply.github.com> Date: Tue, 30 Sep 2025 12:01:39 +0800 Subject: [PATCH 1/4] Fix eth/filters: Unsubscription Missing at `filter` Api With Subscription Error Fix issue https://github.com/ethereum/go-ethereum/issues/32793 --- eth/filters/api.go | 1 + 1 file changed, 1 insertion(+) diff --git a/eth/filters/api.go b/eth/filters/api.go index d678c403894..334a19f0b5e 100644 --- a/eth/filters/api.go +++ b/eth/filters/api.go @@ -152,6 +152,7 @@ func (api *FilterAPI) NewPendingTransactionFilter(fullTx *bool) rpc.ID { api.filtersMu.Lock() delete(api.filters, pendingTxSub.ID) api.filtersMu.Unlock() + pendingTxSub.Unsubscribe() return } } From fa92c65545f087ac351dc9d5a6d0541d853c5449 Mon Sep 17 00:00:00 2001 From: CertiK <138698582+CertiK-Geth@users.noreply.github.com> Date: Sat, 11 Oct 2025 16:49:47 +0800 Subject: [PATCH 2/4] eth: unsubscribe from subscriptions on error to prevent leaks --- eth/filters/api.go | 3 +++ eth/gasprice/gasprice.go | 1 + 2 files changed, 4 insertions(+) diff --git a/eth/filters/api.go b/eth/filters/api.go index a3ed00f33b3..de70e5e310a 100644 --- a/eth/filters/api.go +++ b/eth/filters/api.go @@ -103,6 +103,7 @@ func (api *FilterAPI) timeoutLoop(timeout time.Duration) { select { case <-ticker.C: case <-api.events.chainSub.Err(): + api.events.chainSub.Unsubscribe() return } api.filtersMu.Lock() @@ -230,6 +231,7 @@ func (api *FilterAPI) NewBlockFilter() rpc.ID { api.filtersMu.Lock() delete(api.filters, headerSub.ID) api.filtersMu.Unlock() + headerSub.Unsubscribe() return } } @@ -415,6 +417,7 @@ func (api *FilterAPI) NewFilter(crit FilterCriteria) (rpc.ID, error) { api.filtersMu.Lock() delete(api.filters, logsSub.ID) api.filtersMu.Unlock() + logsSub.Unsubscribe() return } } diff --git a/eth/gasprice/gasprice.go b/eth/gasprice/gasprice.go index 4fd3df74285..fb61cd3906e 100644 --- a/eth/gasprice/gasprice.go +++ b/eth/gasprice/gasprice.go @@ -123,6 +123,7 @@ func NewOracle(backend OracleBackend, params Config, startPrice *big.Int) *Oracl sub := backend.SubscribeChainHeadEvent(headEvent) if sub != nil { // the gasprice testBackend doesn't support subscribing to head events go func() { + defer sub.Unsubscribe() var lastHead common.Hash for { select { From 0c125a8d009443851ee620d59bf75635b1974d44 Mon Sep 17 00:00:00 2001 From: CertiK <138698582+CertiK-Geth@users.noreply.github.com> Date: Fri, 17 Oct 2025 17:44:02 +0800 Subject: [PATCH 3/4] fix: use maximum uint64 value for receipt chain insertion --- cmd/utils/cmd.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cmd/utils/cmd.go b/cmd/utils/cmd.go index db7bd691d8e..16c15753a57 100644 --- a/cmd/utils/cmd.go +++ b/cmd/utils/cmd.go @@ -311,7 +311,7 @@ func ImportHistory(chain *core.BlockChain, dir string, network string) error { return fmt.Errorf("error reading receipts %d: %w", it.Number(), err) } encReceipts := types.EncodeBlockReceiptLists([]types.Receipts{receipts}) - if _, err := chain.InsertReceiptChain([]*types.Block{block}, encReceipts, 2^64-1); err != nil { + if _, err := chain.InsertReceiptChain([]*types.Block{block}, encReceipts, ^uint64(0)); err != nil { return fmt.Errorf("error inserting body %d: %w", it.Number(), err) } imported += 1 From ac23136ae7cfaf9ce871272eaaafc949e375619b Mon Sep 17 00:00:00 2001 From: johnzhu0908 Date: Fri, 17 Oct 2025 18:01:28 +0800 Subject: [PATCH 4/4] Revert "fix: use maximum uint64 value for receipt chain insertion" This reverts commit 0c125a8d009443851ee620d59bf75635b1974d44. --- cmd/utils/cmd.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cmd/utils/cmd.go b/cmd/utils/cmd.go index 16c15753a57..db7bd691d8e 100644 --- a/cmd/utils/cmd.go +++ b/cmd/utils/cmd.go @@ -311,7 +311,7 @@ func ImportHistory(chain *core.BlockChain, dir string, network string) error { return fmt.Errorf("error reading receipts %d: %w", it.Number(), err) } encReceipts := types.EncodeBlockReceiptLists([]types.Receipts{receipts}) - if _, err := chain.InsertReceiptChain([]*types.Block{block}, encReceipts, ^uint64(0)); err != nil { + if _, err := chain.InsertReceiptChain([]*types.Block{block}, encReceipts, 2^64-1); err != nil { return fmt.Errorf("error inserting body %d: %w", it.Number(), err) } imported += 1