Skip to content

Conversation

@cuiweixie
Copy link
Contributor

remove todo

// TODO (MariusVanDerWijden) add blob fees

// Add blob fees for blob transactions (EIP-4844)
if tx.Type() == types.BlobTxType {
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The fee of blobs are burned without paying to block producer. It makes no sense to include them here.

cuiweixie added a commit to cuiweixie/go-ethereum that referenced this pull request Aug 11, 2025
MariusVanDerWijden pushed a commit that referenced this pull request Aug 11, 2025
gballet pushed a commit to gballet/go-ethereum that referenced this pull request Sep 11, 2025
oleg-ssvlabs added a commit to compose-network/op-geth that referenced this pull request Dec 1, 2025
* all: incorporate state history indexing status into eth_syncing response (#32099)

This pull request tracks the state indexing progress in eth_syncing
RPC response, i.e. we will return non-null syncing status until indexing
has finished.

* version: release go-ethereum v1.16.0 stable

* version: begin v1.16.1 release cycle

* .gitea: trigger PPA upload on tag

* .travis.yml: remove travis configuration

* all: replace override.prague with osaka (#32093)

replace `--override.prague` with `--override.osaka`

Signed-off-by: jsvisa <[email protected]>

* node: do not double-wrap KV stores (#32089)

For no apparent reason, KV stores were getting wrapped in `nofreezedb`
first and then in `freezerdb`.

* eth: correct tracer initialization in BlockchainConfig (#32107)

core.BlockChainConfig.VmConfig is not a pointer, so setting the Tracer
on the `vmConfig` object after it was passed to options does *not* apply
it to options.VmConfig

This fixes the issue by setting the value directly inside the `options`
object and removing the confusing `vmConfig` variable to prevent further
mistakes.

* .gitea: switch release builds to static linking (#32118)

This is to avoid compatibility issues with mismatched glibc versions
between the builder and deployment target.

Fixes #32102

* .gitea: fix 386 upload

* .gitea: disable cron schedule

* triedb: reset state indexer after snap synced (#32104)

Fix the issue after initial snap sync with `gcmode=archive` enabled.

```
NewPayload: inserting block failed       error="history indexing is out of order, last: null, requested: 1"
```

---------

Signed-off-by: Delweng <[email protected]>
Co-authored-by: Gary Rong <[email protected]>

* eth/filters: add address limit to filters (#31876)

The address filter was never checked against a maximum limit, which can
be somewhat abusive for API nodes. This PR adds a limit similar to
topics

## Description (AI generated)

This pull request introduces a new validation to enforce a maximum limit
on the number of addresses allowed in filter criteria for Ethereum logs.
It includes updates to the `FilterAPI` and `EventSystem` logic, as well
as corresponding test cases to ensure the new constraint is properly
enforced.

### Core functionality changes:

* **Validation for maximum addresses in filter criteria**:
- Added a new constant, `maxAddresses`, set to 100, to define the
maximum allowable addresses in a filter.
- Introduced a new error, `errExceedMaxAddresses`, to handle cases where
the number of addresses exceeds the limit.
- Updated the `GetLogs` method in `FilterAPI` to validate the number of
addresses against `maxAddresses`.
- Modified the `UnmarshalJSON` method to return an error if the number
of addresses in the input JSON exceeds `maxAddresses`.
- Added similar validation to the `SubscribeLogs` method in
`EventSystem`.

### Test updates:

* **New test cases for address limit validation**:
- Added a test in `TestUnmarshalJSONNewFilterArgs` to verify that
exceeding the maximum number of addresses triggers the
`errExceedMaxAddresses` error.
- Updated `TestInvalidLogFilterCreation` to include a test case for an
invalid filter with more than `maxAddresses` addresses.
- Updated `TestInvalidGetLogsRequest` to test for invalid log requests
with excessive addresses.

These changes ensure that the system enforces a reasonable limit on the
number of addresses in filter criteria, improving robustness and
preventing potential performance issues.

---------

Co-authored-by: zsfelfoldi <[email protected]>

* Fix log indexer noise after debug_setHead operations (#31934)

## Summary
This PR resolves Issue #31929 by reducing log noise generated by the log
indexer after `debug_setHead` operations.

## Problem Description
When `debug_setHead` is called to rewind the blockchain, blocks are
removed from the database. However, the log indexer's `ChainView`
objects may still hold references to these deleted blocks. When
`extendNonCanonical()` attempts to access these missing headers, it
results in:

1. **Repeated ERROR logs**: `Header not found number=X hash=0x...`
2. **Log noise** that can mask other important errors  
3. **User confusion** about whether this indicates a real problem

## Root Cause Analysis
The issue occurs because:
- `debug_setHead` removes blocks from the blockchain database
- Log indexer's `ChainView` may still reference deleted block hashes
- `extendNonCanonical()` in `core/filtermaps/chain_view.go` tries to
fetch these missing headers
- The existing `return false` logic properly handles the error, but logs
at ERROR level

## Solution
This is a **logging improvement only** - no functional logic changes:

### Changes Made
1. **Log level**: Changed from `ERROR` to `DEBUG` 
2. **Log message**: Enhanced with descriptive context about chain view
extension
3. **Comments**: Added explanation for when this situation occurs
4. **Behavior**: Maintains existing error handling (`return false` was
already present)

### Code Changes
```go
// Before
log.Error("Header not found", "number", number, "hash", hash)
return false

// After  
// Header not found - this can happen after debug_setHead operations
// where blocks have been deleted. Return false to indicate the chain view
// is no longer valid rather than logging repeated errors.
log.Debug("Header not found during chain view extension", "number", number, "hash", hash)
return false
```

## Testing

### Automated Tests
- ✅ All existing filtermaps tests pass: `go test ./core/filtermaps -v`
- ✅ No regressions in related functionality

### Manual Verification
1. **Before fix**: Started geth in dev mode, generated blocks, called
`debug_setHead(3)` → **5 repeated ERROR logs**
2. **After fix**: Same scenario → **4 DEBUG logs, no ERROR noise**

### Test Environment
```bash
# Setup test environment
rm -rf ./dev-test-data
./build/bin/geth --dev --datadir ./dev-test-data --http --http.api debug,eth,net,web3 --verbosity 4

# Generate test blocks and trigger issue
curl -X POST -H "Content-Type: application/json" --data '{"jsonrpc":"2.0","method":"debug_setHead","params":["0x3"],"id":1}' http://localhost:8545
```


## Related Issues
- Fixes #31929

## Additional Context
This issue was reported as spurious error messages appearing after
`debug_setHead` operations. The investigation revealed that while the
error handling was functionally correct, the ERROR log level was
inappropriate for this expected scenario in development/debugging
workflows.

The fix maintains full compatibility while significantly improving the
debugging experience for developers using `debug_setHead`.

---------

Co-authored-by: Sun Tae, Kim <[email protected]>
Co-authored-by: zsfelfoldi <[email protected]>

* core/filtermaps: clean up log format of unindexing message (#32123)

Sorry for not fully fixed in https://github.com/ethereum/go-ethereum/pull/31761, now the log 
format of unindexing message is cleaned up, to make it consistent with the indexing message.

* eth/catalyst: fix the log message in newPayloadV4 (#32125)

It should be `newPayloadV4 must only be called for prague payloads` for
the V4 payload error

* internal/ethapi: prealloc map for the txpool api (#32110)

use `make(map, len(txpool))` to prealloc the map for the txpool content,
to avoid the map growing in the loop.

* ethapi: reduce some of the wasted effort in GetTransactionReceipt (#32021)

Towards https://github.com/ethereum/go-ethereum/issues/26974

---------

Co-authored-by: Gary Rong <[email protected]>

* internal: remove unused shh and swarm modules from console (#32073)

Similar to https://github.com/ethereum/go-ethereum/pull/31856, remove
the not availabe shh, swarm modules in the console.

---------

Co-authored-by: Gary Rong <[email protected]>

* core/filtermaps: define APIs for map, epoch calculation (#31659)

This pull request refines the filtermap implementation, defining key
APIs for map and
epoch calculations to improve readability.

This pull request doesn't change any logic, it's a pure cleanup.

---------

Co-authored-by: zsfelfoldi <[email protected]>

* core/types: blockTimestamp in logs is hex-encoded (#32129)

closes #32120

* core/rawdb, triedb/pathdb: fix two inaccurate comments (#32130)

* eth/catalyst: fix edge case in simulated backend (#31871)

geth cmd: `geth --dev --dev.period 5`
call: `debug.setHead` to rollback several blocks.

If the `debug.setHead` call is delayed, it will trigger a panic with a
small probability, due to using the null point of
`fcResponse.PayloadID`.

---------

Co-authored-by: Marius van der Wijden <[email protected]>

* accounts/abi: generate TryPack* methods for abigen v2 bindings (#31692)

1. Fix the error return format.
**todo**: ~~`bindtype` needs more complex logic to fix it.~~
`
if err != nil {
  return nil, err
}
if err == nil {
  return obj, nil
}
`
2. ~~Return pointer type object to avoid copying the whole struct
content.~~
3. Give the panic decision to the user.
4. Fix empty line at the end of function.

**TODO**: ~~fix some related test cases.~~

---------

Co-authored-by: Jared Wasinger <[email protected]>

* version: release go-ethereum v1.16.1 stable

* version: begin v1.16.2 release cycle

* beacon/blsync: update logs for blsync (Fixes #31968 ) (#32046)

Small update for logs when syncing with blsync. Downgrades the "latest
filled block is not available" to warn.

Co-authored-by: shantichanal <[email protected]>

* cmd/workload: rework tracegen to run tracing at block level (#32092)

This PR changes the trace test to block level, aiming for better
execution performance.

---------

Co-authored-by: zsfelfoldi <[email protected]>

* core/state: add GetStateAndCommittedState (#31585)

Improves the SSTORE gas calculation a bit. Previously we would pull up
the state object twice. This is okay for existing objects, since they
are cached, however non-existing objects are not cached, thus we needed
to go through all 128 diff layers as well as the disk layer twice, just
for the gas calculation

```
goos: linux
goarch: amd64
pkg: github.com/ethereum/go-ethereum/core/vm
cpu: AMD Ryzen 9 5900X 12-Core Processor            
               │ /tmp/old.txt │            /tmp/new.txt             │
               │    sec/op    │   sec/op     vs base                │
Interpreter-24   1118.0n ± 2%   602.8n ± 1%  -46.09% (p=0.000 n=10)
```

---------

Co-authored-by: Gary Rong <[email protected]>

* cmd/utils, internal/debug: hide the deprecated flags (#32128)

Some of the flags were deprecated, so try to hide them in the help
message. And move the `--vmodule` and `--logjson` flags to the
DeprecatedCategory.

* .gitea: add windows build (experimental)

* cmd/utils: show full deprecated flags (#32141)

This is a follow up PR after #32128 , Seems I've missed to add
--txlookuplimit as hidden. In hte meanwhile, I also add the other 
deprecated flags into the output of `show-deprecated-flags`

* cmd/utils: update flag description of gcmode (#32145)

* .gitea: add workflow_dispatch for release build

* .gitea: update PATH

* .gitea: set PATH

* gitea: try with cmd

* gitea: set PATH in script

* .gitea: fix typo in windows workflow

* core/vm: move nil-check out of the interpreter loop (#32068)

Moves the jumptable nil check our of the interpreter loop.
Benchmarks show a 2-10% improvement.

* core/vm: implement EIP-7939 - CLZ opcode (#31989)

https://eips.ethereum.org/EIPS/eip-7939

---------

Co-authored-by: spencer-tb <[email protected]>
Co-authored-by: Felix Lange <[email protected]>

* core/txpool/blobpool: lower log level for warnings (#32142)

- Change the log level to `warning`, during syncing blocks, the `final
== nil` is normal.
- Change to log tx hash.

* .github, internal/flags: improve actions test runs (#32150)

This change enables more tests to run on GitHub actions. First, it
removes the `-short` flag passed to `go test`, unskipping some longer
running tests. We also enable the full consensus tests to run by
enabling submodules during git clone.

The EF now operates org wide runners with the `self-hosted-ghr` label.
These are auto-scaling runners which should ideally allow us to process
any amount of testing load we throw at them. The new runners have `HOME`
configured differently from the actual user home directory, so our
internal test for resolving `~` had to be adapted to work in this scenario.

* consensus/misc/eip4844: implement EIP-7918  (#31965)

https://eips.ethereum.org/EIPS/eip-7918

---------

Co-authored-by: Felix Lange <[email protected]>

* core/vm: implement EIP-7951 - precompile for secp256r1 (#31991)

https://github.com/ethereum/EIPs/pull/9833

Based on #27540, #30043

---------

Co-authored-by: Ulaş Erdoğan <[email protected]>

* cmd, eth/catalyst: exit geth only if exitWhenSynced is specified (#32149)

This pull request modifies the behavior of `--synctarget` to terminate
the node only when `--exitWhenSynced` is explicitly specified.

* eth/catalyst:  abort dev mode block commit if shut down is triggered (#32166)

alternate approach to https://github.com/ethereum/go-ethereum/pull/31328
suggested by @MariusVanDerWijden . This prevents Geth from outputting a
lot of logs when trying to commit on-demand dev mode blocks while the
client is shutting down.

The issue is hard to reproduce, but I've seen it myself and it is
annoying when it happens. I think this is a reasonable simple solution,
and we can revisit if we find that the output is still too large (i.e.
there is a large delay between initiating shut down and the simulated
beacon receiving the signal, while in this loop).

Co-authored-by: Marius van der Wijden <[email protected]>

* miner, core, core/txpool: implement EIP 7825 - TX Gas Limit Cap (#31824)

Implements EIP-7825

---------

Co-authored-by: Gary Rong <[email protected]>
Co-authored-by: lightclient <[email protected]>
Co-authored-by: MariusVanDerWijden <[email protected]>

* core/vm: update gas cost of CLZ to five (#32172)

https://github.com/ethereum/EIPs/commit/a794de3fcf71bb8c71e8bafdba11f63133ce4516

* core,miner: implement EIP-7934 - RLP Execution Block Size Limit (#31990)

This PR adds a block validation check for the maximum block size, as required by
EIP-7934, and also applies a slightly lower size limit during block building.

---------

Co-authored-by: spencer-tb <[email protected]>
Co-authored-by: Felix Lange <[email protected]>
Co-authored-by: Gary Rong <[email protected]>

* cmd/utils: add the missing check for the HoodiFlag in blsync (#32179)

Hoodi network flag should be exclusive to other network flags for both blysnc standalone and integrated mode.

* cmd/clef: update Safe API documentation links in changelog (#32136)

This PR updates the outdated documentation URL from docs.gnosis.io to
the new official docs.safe.global domain. The change reflects the
rebranding from Gnosis Safe to Safe and ensures that users are directed
to the current API documentation for transaction service reference.

* core/types:  add block-level access list structures with encoding/decoding (#31948)

This adds the SSZ types from the 
[EIP-7928](https://eips.ethereum.org/EIPS/eip-7928) and also adds
encoder/decoder generation using https://github.com/ferranbt/fastssz.

The fastssz dependency is updated because the generation will not work
properly with the master branch version due to a bug in fastssz.

---------

Co-authored-by: Gary Rong <[email protected]>

* eth/downloader: fix ancient limit in snap sync (#32188)

This pull request fixes an issue in disabling direct-ancient mode in
snap sync.

Specifically, if `origin >= frozen && origin != 0`, it implies a part of
chain data has been written into the key-value store, all the following 
writes into ancient store scheduled by downloader will be rejected 
with error 

`ERROR[07-10|03:46:57.924] Error importing chain data to ancients
err="can't add block 1166 hash: the append operation is out-order: have
1166 want 0"`.

This issue is detected by the https://github.com/ethpandaops/kurtosis-sync-test, 
which initiates the first snap sync cycle without the finalized header and
implicitly disables the direct-ancient mode. A few seconds later the second 
snap sync cycle is initiated with the finalized information and direct-ancient mode
is enabled incorrectly.

* .github: remove karalabe from CODEOWNERS

* cmd/geth: update vcheck testdata, add docs on generating signatures (#32121)

Fixed typo in security release URL by replacing:
Old: https://blog.ethereum.org/2020/11/12/geth_security_release/
New: https://blog.ethereum.org/2020/11/12/geth-security-release/

---------

Co-authored-by: lightclient <[email protected]>

* signer/core/apitypes: require blob txs to have tx.to set (#32197)

Check the `to` address before building the blob tx.

---------

Co-authored-by: jwasinger <[email protected]>

* accounts/keystore: update links to documenation (#32194)

---


**Description:**  
- Replaced outdated GitHub wiki links with the official Ethereum
documentation for Web3 Secret Storage.
- Updated references in `keystore.go` and `passphrase.go` for improved
accuracy and reliability.


---

* ethclient/gethclient: remove race condition in tests (#32206)

alternative to https://github.com/ethereum/go-ethereum/pull/32200

The race condition is not happening yet, since there is only a single
call to `newTestBackend`, but there might be more in the future

* params: EIP-7892 - Blob Parameter Only Hardforks (#32193)

This is a resubmit of https://github.com/ethereum/go-ethereum/pull/31820
against the `master` branch.

---------

Co-authored-by: Marius van der Wijden <[email protected]>
Co-authored-by: Gary Rong <[email protected]>

* eth/fetcher: fix announcement drop logic (#32210)

This PR fixes an issue in the tx_fetcher DoS prevention logic where the
code keeps the overflow amount (`want - maxTxAnnounces`) instead of the
allowed amount (`maxTxAnnounces - used`). The specific changes are:

- Correct slice indexing in the announcement drop logic
- Extend the overflow test case to cover the inversion scenario

* miner: set sidecar version when recomputing proofs (#32199)

- If the block number is `osaka` fork and needs to recompute some `blob
proofs` to `cell proofs`, here also needs to set version to `1`.

* all: fix outdated ethereum wiki json-rpc json-rpc doc links (#32209)

Replace outdated wiki reference with ethereum.org
documentation links

* core/types: fix CellProofsAt method (#32198)

* triedb/pathdb: introduce file-based state journal (#32060)

Introduce file-based state journal in path database, fixing
the Pebble restriction when the journal size exceeds 4GB.

---------

Signed-off-by: jsvisa <[email protected]>
Co-authored-by: Gary Rong <[email protected]>

* core/rawdb: change the mechanism to schedule freezer sync (#32135)

This pull request slightly improves the freezer fsync mechanism by scheduling 
the Sync operation based on the number of uncommitted items and original
time interval.

Originally, freezer.Sync was triggered every 30 seconds, which worked well during
active chain synchronization. However, once the initial state sync is complete, 
the fixed interval causes Sync to be scheduled too frequently.

To address this, the scheduling logic has been improved to consider both the time 
interval and the number of uncommitted items. This additional condition helps 
avoid unnecessary Sync operations when the chain is idle.

* eth/protocols/snap, p2p/discover: improve zero time checks (#32214)

* all: update dead wiki links (#32215)

---


**Description:**  
- Replaced outdated GitHub wiki links with current, official
documentation URLs.
- Removed links that redirect or are no longer relevant.
- Ensured all references point to up-to-date and reliable sources.


---

* core/rawdb: reduce allocations in rawdb.ReadHeaderNumber (#31913)

This is something interesting I came across during my benchmarks, we
spent ~3.8% of all allocations allocating the header number on the heap.

```
(pprof) list GetHeaderByHash
Total: 38197204475
ROUTINE ======================== github.com/ethereum/go-ethereum/core.(*BlockChain).GetHeaderByHash in github.com/ethereum/go-ethereum/core/blockchain_reader.go
         0 5786566117 (flat, cum) 15.15% of Total
         .          .     79:func (bc *BlockChain) GetHeaderByHash(hash common.Hash) *types.Header {
         . 5786566117     80: return bc.hc.GetHeaderByHash(hash)
         .          .     81:}
         .          .     82:
         .          .     83:// GetHeaderByNumber retrieves a block header from the database by number,
         .          .     84:// caching it (associated with its hash) if found.
         .          .     85:func (bc *BlockChain) GetHeaderByNumber(number uint64) *types.Header {
ROUTINE ======================== github.com/ethereum/go-ethereum/core.(*HeaderChain).GetHeaderByHash in github.com/ethereum/go-ethereum/core/headerchain.go
         0 5786566117 (flat, cum) 15.15% of Total
         .          .    404:func (hc *HeaderChain) GetHeaderByHash(hash common.Hash) *types.Header {
         . 1471264309    405: number := hc.GetBlockNumber(hash)
         .          .    406: if number == nil {
         .          .    407:  return nil
         .          .    408: }
         . 4315301808    409: return hc.GetHeader(hash, *number)
         .          .    410:}
         .          .    411:
         .          .    412:// HasHeader checks if a block header is present in the database or not.
         .          .    413:// In theory, if header is present in the database, all relative components
         .          .    414:// like td and hash->number should be present too.
(pprof) list GetBlockNumber
Total: 38197204475
ROUTINE ======================== github.com/ethereum/go-ethereum/core.(*HeaderChain).GetBlockNumber in github.com/ethereum/go-ethereum/core/headerchain.go
  94438817 1471264309 (flat, cum)  3.85% of Total
         .          .    100:func (hc *HeaderChain) GetBlockNumber(hash common.Hash) *uint64 {
  94438817   94438817    101: if cached, ok := hc.numberCache.Get(hash); ok {
         .          .    102:  return &cached
         .          .    103: }
         . 1376270828    104: number := rawdb.ReadHeaderNumber(hc.chainDb, hash)
         .          .    105: if number != nil {
         .     554664    106:  hc.numberCache.Add(hash, *number)
         .          .    107: }
         .          .    108: return number
         .          .    109:}
         .          .    110:
         .          .    111:type headerWriteResult struct {
(pprof) list ReadHeaderNumber
Total: 38197204475
ROUTINE ======================== github.com/ethereum/go-ethereum/core/rawdb.ReadHeaderNumber in github.com/ethereum/go-ethereum/core/rawdb/accessors_chain.go
 204606513 1376270828 (flat, cum)  3.60% of Total
         .          .    146:func ReadHeaderNumber(db ethdb.KeyValueReader, hash common.Hash) *uint64 {
 109577863 1281242178    147: data, _ := db.Get(headerNumberKey(hash))
         .          .    148: if len(data) != 8 {
         .          .    149:  return nil
         .          .    150: }
  95028650   95028650    151: number := binary.BigEndian.Uint64(data)
         .          .    152: return &number
         .          .    153:}
         .          .    154:
         .          .    155:// WriteHeaderNumber stores the hash->number mapping.
         .          .    156:func WriteHeaderNumber(db ethdb.KeyValueWriter, hash common.Hash, number uint64) {
```

Opening this to discuss the idea, I know that rawdb.EmptyNumber is not a
great name for the variable, open to suggestions

* trie: avoid spawning goroutines for empty children (#32220)

* eth/downloader: improve nil pointer protection (#32222)

Fix #32221

---------

Co-authored-by: rjl493456442 <[email protected]>

* account/abi/bind/v2: fix TestDeploymentWithOverrides (#32212)

The root cause of the flaky test was a nonce conflict caused by async
contract deployments.

This solution defines a custom deployer with automatic nonce management.

* eth/tracers: apply block header overrides correctly (#32183)

Fixes #32175.

This fixes the scenario where the blockhash opcode would return 0x0
during RPC simulations when using BlockOverrides with a future block
number. The root cause was that BlockOverrides.Apply() only modified the
vm.BlockContext, but GetHashFn() depends on the actual
types.Header.Number to resolve valid historical block hashes. This
caused a mismatch and resulted in incorrect behavior during trace and
call simulations.

---------

Co-authored-by: shantichanal <[email protected]>
Co-authored-by: lightclient <[email protected]>

* triedb/pathdb: avoid duplicate metadata reads (#32226)

* eth/protocols/snap: fix negative eta in state progress logging (#32225)

* triedb/pathdb: improve the performance of parse index block (#32219)

The implementation of `parseIndexBlock` used a reverse loop with slice
appends to build the restart points, which was less cache-friendly and
involved unnecessary allocations and operations. In this PR we change
the implementation to read and validate the restart points in one single
forward loop.

Here is the benchmark test:

```bash
go test -benchmem -bench=BenchmarkParseIndexBlock ./triedb/pathdb/
```

The result as below:

```
benchmark                      old ns/op     new ns/op     delta
BenchmarkParseIndexBlock-8     52.9          37.5          -29.05%
```

about 29% improvements

---------

Signed-off-by: jsvisa <[email protected]>

* all: define constructor for BlobSidecar (#32213)

The main purpose of this change is to enforce the version setting when
constructing the blobSidecar, avoiding creating sidecar with wrong/default 
version tag.

* params: update tx gas limit cap (#32230)

Updates the tx gas limit cap to the new parameter (2^24)
https://github.com/ethereum/EIPs/pull/9986/files

* core/txpool/blobpool: remove unused `txValidationFn` from BlobPool (#32237)

This PR removes the now‑unused `txValidationFn` field from BlobPool.
It became obsolete after a PR  https://github.com/ethereum/go-ethereum/pull/31202 
was merged.

Resolves https://github.com/ethereum/go-ethereum/issues/32236

* triedb/pathdb: fix incorrect address length in history searching (#32248)

We should use account length to check address, else OOB maybe occured

Signed-off-by: jsvisa <[email protected]>

* core/vm: triple modexp cost post-cancun (#32231)

https://github.com/ethereum/EIPs/pull/9969/files

* core, params: add limit for max blobs in blob transaction (#32246)

[EIP-7594](https://eips.ethereum.org/EIPS/eip-7594) defines a limit of
max 6 blobs per transaction. We need to enforce this limit during block
processing.

> Additionally, a limit of 6 blobs per transaction is introduced.
Clients MUST enforce this limit when validating blob transactions at
submission time, when received from the network, and during block
production and processing.

* superchain: skip celo mainnet genesis processing (#646)

* superchain: skip celo mainnet genesis processing

* superchain: add GetChain tests

* superchain: add clarifying comments for celo exclusion

* build: update tests to fusaka-devnet-3 (#32251)

* core/types: minimize this invalid intermediate state (#32241)

* core/rawdb: downgrade log level in chain freezer (#32253)

* triedb/pathdb:  use binary.append to eliminate the tmp scratch slice (#32250)

`binary.AppendUvarint` offers better performance than using append
directly, because it avoids unnecessary memory allocation and copying.

In our case, it can increase the performance by +35.8% for the
`blockWriter.append` function:

```
benchmark                        old ns/op     new ns/op     delta
BenchmarkBlockWriterAppend-8     5.97          3.83          -35.80%
```

---------

Signed-off-by: jsvisa <[email protected]>
Co-authored-by: Gary Rong <[email protected]>

* p2p/rlpx: optimize XOR operation using bitutil.XORBytes (#32217)

Replace manual byte-by-byte XOR implementation with the optimized
bitutil.XORBytes function. This improves performance by using word-sized
operations on supported architectures while maintaining the same
functionality. The optimized version processes data in bulk rather than
one byte at a time

---------

Co-authored-by: Felix Lange <[email protected]>

* eth/gasestimator: fix potential overflow (#32255)

Improve binary search, preventing the potential overflow in certain L2 cases

* triedb/pathdb: fix an deadlock in history indexer (#32260)

Seems the `signal.result` was not sent back in shorten case, this will
cause a deadlock.

---------

Signed-off-by: jsvisa <[email protected]>
Co-authored-by: Gary Rong <[email protected]>

* eth/protocols/snap: add healing and syncing metrics (#32258)

Adds the heal time and snap sync time to grafana

---------

Co-authored-by: Gary Rong <[email protected]>

* core: replace the empty fmt.Errorf with errors.New (#32274)

The `errors.new` function does not require string formatting, so its
performance is better than that of `fmt.Errorf`.

* eth/catalyst: fix error message in ExecuteStatelessPayloadV4 (#32269)

Correct the error message in the ExecuteStatelessPayloadV4 function to
reference newPayloadV4 and the Prague fork, instead of incorrectly
referencing newPayloadV3 and Cancun. 

This improves clarity during debugging and aligns the error message with 
the actual function and fork being validated. No logic is changed.

---------

Co-authored-by: rjl493456442 <[email protected]>

* cmd, eth, internal: introduce debug_sync (#32177)

Alternative implementation of https://github.com/ethereum/go-ethereum/pull/32159

* all: replace fmt.Errorf with errors.New (#32286)

The errors.new function does not require string formatting, so its
performance is better than that of fmt.Errorf.

* downloader: fix typos, grammar and formatting (#32288)

* ethclient/simulated: Fix flaky rollback test (#32280)

This PR addresses a flakiness in the rollback test discussed in
https://github.com/ethereum/go-ethereum/issues/32252

I found `nonce` collision caused transactions occasionally fail to send.
I tried to change error message in the failed test like:

```
	if err = client.SendTransaction(ctx, signedTx); err != nil {
		t.Fatalf("failed to send transaction: %v, nonce: %d", err, signedTx.Nonce())
	}
```

and I occasionally got test failure with this message:

```
=== CONT  TestFlakyFunction/Run_#100
    rollback_test.go:44: failed to send transaction: already known, nonce: 0
--- FAIL: TestFlakyFunction/Run_#100 (0.07s)
```

Although `nonces` are obtained via `PendingNonceAt`, we observed that,
in rare cases (approximately 1 in 1000), two transactions from the same
sender end up with the same nonce. This likely happens because `tx0` has
not yet propagated to the transaction pool before `tx1` requests its
nonce. When the test succeeds, `tx0` and `tx1` have nonces `0` and `1`,
respectively. However, in rare failures, both transactions end up with
nonce `0`.

We modified the test to explicitly assign nonces to each transaction. By
controlling the nonce values manually, we eliminated the race condition
and ensured consistent behavior. After several thousand runs, the
flakiness was no longer reproducible in my local environment.

Reduced internal polling interval in `pendingStateHasTx()` to speed up
test execution without impacting stability. It reduces test time for
`TestTransactionRollbackBehavior` from about 7 seconds to 2 seconds.

* core/state: preallocate capacity for logs list (#32291)

Improvement: preallocate capacity for `logs` at first to avoid
reallocating multi times.

* core/state: improve PrettyPrint function (#32293)

* core/types: expose sigHash as Hash for SetCodeAuthorization (#32298)

* common/hexutil: replace customized bit sizer with bit.Uintsize (#32304)

* accounts/abi: precompile regex (#32301)

* cmd/devp2p/internal/v4test: add test for ENRRequest (#32303)

This adds a cross-client protocol test for a recently discovered bug in Nethermind.

* trie: reduce the memory allocation in trie hashing (#31902)

This pull request optimizes trie hashing by reducing memory allocation
overhead. Specifically:

- define a fullNodeEncoder pool to reuse encoders and avoid memory
allocations.

- simplify the encoding logic for shortNode and fullNode by getting rid
of the Go interfaces.

* core/vm: add configurable jumpdest analysis cache (#32143)

This adds a method on vm.EVM to set the jumpdest cache implementation.
It can be used to maintain an analysis cache across VM invocations, to improve
performance by skipping the analysis for already known contracts.

---------

Co-authored-by: lmittmann <[email protected]>
Co-authored-by: Felix Lange <[email protected]>

* eth: fix typos and outdated comments (#32324)

* eth/filters: fix error when blockHash is used with fromBlock/toBlock (#31877)

This introduces an error when the filter has both `blockHash` and
`fromBlock`/`toBlock`, since these are mutually exclusive. Seems the
tests were actually returning `not found` error, which went undetected
since there was no check on the actual returned error in the test.

* rlp/rlpgen: implement package renaming support (#31148)

This adds support for importing types from multiple identically-named
packages.

---------

Co-authored-by: Felix Lange <[email protected]>

* beacon/params, core/filtermaps: update checkpoints (#32336)

This PR updates checkpoints for blsync and filtermaps.

* version: release v1.16.2 (#32343)

* version: begin v1.16.3 release cycle (#32345)

* core/state: introduce the TransitionState object (verkle transition part 1) (#31634)

This is the first part of #31532 

It maintains a series of conversion maker which are to be updated by the
conversion code (in a follow-up PR, this is a breakdown of a larger PR
to make things easier to review). They can be used in this way:

- During the conversion, by storing the conversion markers when the
block has been processed. This is meant to be written in a function that
isn't currently present, hence [this
TODO](https://github.com/ethereum/go-ethereum/pull/31634/files#diff-89272f61e115723833d498a0acbe59fa2286e3dc7276a676a7f7816f21e248b7R384).

Part of  https://github.com/ethereum/go-ethereum/issues/31583

---------

Signed-off-by: Guillaume Ballet <[email protected]>
Co-authored-by: Gary Rong <[email protected]>

* eth/catalyst: avoid load the same blob tx multi times (#32190)

- If all the `vhashes` are in the same `sidecar`, then it will load the
same blob tx many times. This PR aims to upgrade this.

---------

Co-authored-by: Gary Rong <[email protected]>

* eth/gasestimator: check ErrGasLimitTooHigh conditions (#32348)

This PR makes 2 changes to how
[EIP-7825](https://github.com/ethereum/go-ethereum/pull/31824) behaves.

When `eth_estimateGas` or `eth_createAccessList` is called without any
gas limit in the payload, geth will choose the block's gas limit or the
`RPCGasCap`, which can be larger than the `maxTxGas`.

When this happens for `estimateGas`, the gas estimation just errors out
and ends, when it should continue doing binary search to find the lowest
possible gas limit.

This PR will: 
- Add a check to see if `hi` is larger than `maxTxGas` and cap it to
`maxTxGas` if it's larger. And add a special case handling for gas
estimation execute when it errs with `ErrGasLimitTooHigh`

---------

Co-authored-by: Gary Rong <[email protected]>

* core/filtermaps: remove unnecessary nil check and add cv2 lock (#32309)

Co-authored-by: zsfelfoldi <[email protected]>

* go.mod: upgraded github.com/golang-jwt/jwt/v4 v4.5.1 => v4.5.2 (#32356)

https://pkg.go.dev/vuln/GO-2025-3553

* rpc: use reflect.TypeFor (#32316)

* crypto/kzg4844: use reflect.TypeFor (#32319)

* common, common/hexutil: use reflect.TypeFor (#32321)

* beacon/merkle: use reflect.TypeFor (#32322)

* core: use reflect.TypeFor (#32320)

https://github.com/golang/go/issues/60088

* p2p/enode: use atomic.Pointer in LocalNode (#32360)

* signer/core/apitypes: simplify reflect []byte creation (#32315)


Co-authored-by: Felix Lange <[email protected]>

* rlp: use reflect.TypeFor (#32317)


Co-authored-by: Felix Lange <[email protected]>

* eth/downloader: fix incomplete code comment  (#32354)

* metrics: use atomic.Pointer in runtimeHistogram (#32361)

Co-authored-by: Felix Lange <[email protected]>

* core/vm: fold EVMInterpreter into EVM (#32352)

The separation serves no purpose atm, and the circular dependency that
EVM and EVMInterpreter had was begging for them to be merged.

* ethclient: fix flaky pending tx test (#32380)

Fixes: https://github.com/ethereum/go-ethereum/issues/32252

* ethdb/leveldb: check iterator error in Database.DeleteRange (#32384)

Add missing it.Error() check after iteration in Database.DeleteRange to
avoid silently ignoring iterator errors before writing the batch.

Aligns behavior with batch.DeleteRange, which already validates iterator
errors. No other functional changes; existing tests pass (TestLevelDB).

* core/vm: make types consistent in makeDup (#32378)

* miner: remove todo comment (#32389)

see
https://github.com/ethereum/go-ethereum/pull/32372#discussion_r2265885182

* downloader: fix comment (#32382)

The previous comment stated that every 3rd block has a tx and every 5th
has an uncle.
The implementation actually adds one transaction to every second block
and does not add uncles.
Updated the comment to reflect the real behavior to avoid confusion when
reading tests.

* accounts/abi, accounts/keystore: use reflect.TypeFor (#32323)


Co-authored-by: Felix Lange <[email protected]>

* eth/downloader: skip nil peer in GetHeader (#32369)

The GetHeader function was incorrectly returning an error when
encountering nil peers in the peers list, which contradicted the comment 
"keep retrying if none are yet available". 

Changed the logic to skip nil peers with 'continue' instead of returning
an error, allowing the function to properly iterate through all
available peers and attempt to retrieve the target header from each valid peer.

This ensures the function behaves as intended - trying all available
peers before giving up, rather than failing on the first nil peer encountered.

* trie, core: rework tracer and track origin value of dirty nodes (#32306)

These changes made in the PR should be highlighted here

The trie tracer is split into two distinct structs: opTracer and prevalueTracer. 
The former is specific to MPT, while the latter is generic and applicable to all
trie implementations.

The original values of dirty nodes are tracked in a NodeSet. This serves
as the foundation for both full archive node implementations and the state live
tracer.

* consensus: fix ambiguous invalid gas limit error (#32405)

## Description

Correct symmetric tolerance in gas limit validation:
Replace ambiguous "+-=" with standard "+/-" in the error message.
Logic rejects when |header − parent| ≥ limit, so allowed range is |Δ| ≤
limit − 1.

No logic or functionality has been modified.

* metrics: Block Basefee (#658)

* basefee metric

* Handle nil basefee for before london hf

* Update forkdiff

* trie: refactor to use slices.Concat (#32401)

* cmd: fix inconsistent function name in comment (#32411)

fix inconsistent function name in comment

Signed-off-by: youzichuan <[email protected]>

* eth: abort `requiredBlocks` check if peer handler terminated (#32413)

* node: remove unused err var (#32398)

* rlp: optimize intsize (#32421)

goos: darwin
goarch: arm64
pkg: github.com/ethereum/go-ethereum/rlp
cpu: Apple M4
        │   old.txt   │               new.txt               │
        │   sec/op    │   sec/op     vs base                │
Intsize   2.175n ± 5%   1.050n ± 4%  -51.76% (p=0.000 n=10)

* eth/tracers: Adds codeHash to prestateTracer's response (#32391)

**Problem:** Including full account code in prestateTracer response
significantly increases response payload size.

**Solution:** Add codeHash field to the response. This will allow
client-side bytecode caching and is a non-breaking change.

**Note:** codeHash for EoAs is excluded to save space.

---------

Co-authored-by: Sina Mahmoodi <[email protected]>

* eth/syncer: fix typo (#32427)

avaibale -> available

* p2p: refactor to use time.Now().UnixMilli() in golang std lib (#32402)

* .github: upgrade workflows to Go 1.25 (#32425)

* build: upgrade -dlgo version to Go 1.25.0 (#32412)

* crypto/secp256k1: use ReadBits from common/math (#32430)

* build: remove unused functions (#32393)

* catalyst/api: centralize OPStack validation into helper functions (#592)

* catalyist/api: centralize OPStack validation into helper functions

located in a seperate file for a cleaner diff to upstream

* add test coverage for optimism validation checks

return unadorned errors from helper and allow caller to wrap

* lint

* use engine.InvalidPayloadAttributes.With() for all failed optimism FCU checks

* typos

* fix: only check optimism payload attributes if they are not nil

* combine conditions

* move test

* combine checks

* add check on withdrawals root from canyon to isthmus

* lint

* trie, core/state: add the transition tree (verkle transition part 2) (#32366)

This add some of the changes that were missing from #31634. It
introduces the `TransitionTrie`, which is a façade pattern between the
current MPT trie and the overlay tree.

---------

Signed-off-by: Guillaume Ballet <[email protected]>
Co-authored-by: rjl493456442 <[email protected]>

* cmd/evm: use PathScheme in blockrunner (#32444)

This is a preparatory change for Verkle/binary trees, since they don't
support the hash-based database scheme. This has no impact on the MPT.

* core/vm: refactor to use bitutil.TestBytes (#32434)

* crypto/bn256: refactor to use bitutil.TestBytes (#32435)

* consensus/misc/eip4844: use blob parameters of current header (#32424)

This changes the implementation to resolve the blob parameters according
to the current header timestamp. This matters for EIP-7918, where we
would previously resolve the UpdateFraction according to the parent
header fork, leading to a confusing situation at the fork transition
block.

---------

Co-authored-by: MariusVanDerWijden <[email protected]>

* rlp: remove workaround for Value.Bytes (#32433)

As of Go 1.19, it is permitted to call Bytes() on a reflect.Value
representing an adressable byte array. So we can remove our workaround,
undoing #22924.

https://go.dev/doc/go1.19#reflectpkgreflect

> The method [Value.Bytes](https://go.dev/pkg/reflect/#Value.Bytes) now
accepts addressable arrays in addition to slices.

* core/vm: fix EIP-7823 modexp input length check (#32363)

The order of the checks was wrong which would have allowed a call to
modexp with `baseLen == 0 && modLen == 0` post fusaka.

Also handles an edge case where base/mod/exp length >= 2**64

---------

Co-authored-by: Felix Lange <[email protected]>

* metrics: add tinygo build flag for CPU time (#32454)

* core/rawdb: add non-unix alternative for tablewriter (#32455)

Continuation of https://github.com/ethereum/go-ethereum/issues/32022

tablewriter assumes unix or windows, which may not be the case for
embedded targets.

For v0.0.5 of tablewriter, it is noted in table.go: "The protocols were
written in pure Go and works on windows and unix systems"

---------

Co-authored-by: rjl493456442 <[email protected]>

* eth/syncer: stop ticker to prevent resource leak (#32443)

* core/rawdb: enhance database key construction (#32431)

* rpc: add SetWebsocketReadLimit in Server (#32279)

Exposing the public method to setReadLimits for Websocket RPC to
prevent OOM.

Current, Geth Server is using a default 32MB max read limit (message
size) for websocket, which is prune to being attacked for OOM. Any one
can easily launch a client to send a bunch of concurrent large request
to cause the node to crash for OOM. One example of such script that can
easily crash a Geth node running websocket server is like this:

https://gist.githubusercontent.com/DeltaXV/b64d221e342e9c1ec6c99c1ab8201544/raw/ec830979ac9a707d98f40dfcc0ce918fc8fb9057/poc.go

---------

Co-authored-by: Felix Lange <[email protected]>

* CODEOWNERS: add gballet as the owner of trie package (#32466)

* ethclient/gethclient: use common.Hash to debug_traceTransaction (#32404)

* graphql: add query depth limit to prevent DoS attacks (#32344)

## Summary

This PR addresses a DoS vulnerability in the GraphQL service by
implementing a maximum query depth limit. While #26026 introduced
timeout handling, it didn't fully mitigate the attack vector where
deeply nested queries can still consume excessive CPU and memory
resources before the timeout is reached.

## Changes
- Added `maxQueryDepth` constant (set to 20) to limit the maximum
nesting depth of GraphQL queries
- Applied the depth limit using `graphql.MaxDepth()` option when parsing
the schema
- Added test case `TestGraphQLMaxDepth` to verify that queries exceeding
the depth limit are properly rejected

## Security Impact

Without query depth limits, malicious actors could craft deeply nested
queries that:
  - Consume excessive CPU cycles during query parsing and execution
  - Allocate large amounts of memory for nested result structures
- Potentially cause service degradation or outages even with timeout
protection

This fix complements the existing timeout mechanism by preventing
resource-intensive queries from being executed in the first place.

## Testing

Added `TestGraphQLMaxDepth` which verifies that queries with nesting
depth > 20 are rejected with a `MaxDepthExceeded` error.

## References
  - Original issue: #26026
- Related security best practices:
https://www.howtographql.com/advanced/4-security/

---------

Co-authored-by: Felix Lange <[email protected]>

* p2p: update MaxPeers comment (#32414)

* eth/catalyst: return methods by reflect (#32300)

Return the exposed methods in `ConsensusAPI` by reflection.

* internal/ethapi, miner: fix GetBlockReceipts for pending (#32461)

* trie, core/state: introduce trie Prefetch for optimizing preload (#32134)

This pull introduces a `Prefetch` operation in the trie to prefetch trie
nodes in parallel. It is used by the `triePrefetcher` to accelerate state 
loading and improve overall chain processing performance.

* beacon/engine,eth/catalyst: Fix engine API checks and exec payload creation (#662)

* p2p: using math.MaxInt32 from go std lib (#32357)

Co-authored-by: Felix Lange <[email protected]>

* rlp: refactor to use maths.ReadBits (#32432)

* fixes missing protection of nil pointer dereference in scwallet (#32186)

Fixes #32181

Signed-off-by: kapil <[email protected]>

* accounts/usbwallet: correct version comparison logic (#32417)

## Description

This PR fixes a bug in the Ledger hardware wallet version validation
logic for EIP-155 transaction signing. The original condition
incorrectly allowed older versions that don't support EIP-155 such as
0.9.9 and 0.1.5 to proceed.

* p2p: remove todo comment, as it's unnecessary (#32397)

as metioned in https://github.com/ethereum/go-ethereum/pull/32351, I
think this comment is unnecessary.

* core/types: reduce allocations for transaction comparison (#31912)

This PR should reduce overall allocations of a running node by ~10
percent. Since most allocations are coming from the re-heaping of the
transaction pool.

```
(pprof) list EffectiveGasTipCmp
Total: 38197204475
ROUTINE ======================== github.com/ethereum/go-ethereum/core/types.(*Transaction).EffectiveGasTipCmp in github.com/ethereum/go-ethereum/core/types/transaction.go
         0 3766837369 (flat, cum)  9.86% of Total
         .          .    386:func (tx *Transaction) EffectiveGasTipCmp(other *Transaction, baseFee *big.Int) int {
         .          .    387: if baseFee == nil {
         .          .    388:  return tx.GasTipCapCmp(other)
         .          .    389: }
         .          .    390: // Use more efficient internal method.
         .          .    391: txTip, otherTip := new(big.Int), new(big.Int)
         . 1796172553    392: tx.calcEffectiveGasTip(txTip, baseFee)
         . 1970664816    393: other.calcEffectiveGasTip(otherTip, baseFee)
         .          .    394: return txTip.Cmp(otherTip)
         .          .    395:}
         .          .    396:
         .          .    397:// EffectiveGasTipIntCmp compares the effective gasTipCap of a transaction to the given gasTipCap.
         .          .    398:func (tx *Transaction) EffectiveGasTipIntCmp(other *big.Int, baseFee *big.Int) int {
```

This PR reduces the allocations for comparing two transactions from 2 to
0:
```
goos: linux
goarch: amd64
pkg: github.com/ethereum/go-ethereum/core/types
cpu: Intel(R) Core(TM) Ultra 7 155U
                               │ /tmp/old.txt │            /tmp/new.txt             │
                               │    sec/op    │   sec/op     vs base                │
EffectiveGasTipCmp/Original-14    64.67n ± 2%   25.13n ± 9%  -61.13% (p=0.000 n=10)

                               │ /tmp/old.txt │            /tmp/new.txt            │
                               │     B/op     │   B/op     vs base                 │
EffectiveGasTipCmp/Original-14     16.00 ± 0%   0.00 ± 0%  -100.00% (p=0.000 n=10)

                               │ /tmp/old.txt │            /tmp/new.txt             │
                               │  allocs/op   │ allocs/op   vs base                 │
EffectiveGasTipCmp/Original-14     2.000 ± 0%   0.000 ± 0%  -100.00% (p=0.000 n=10)
```

It also speeds up the process by ~60%

There are two minor caveats with this PR:
- We change the API for `EffectiveGasTipCmp` and `EffectiveGasTipIntCmp`
(which are probably not used by much)
- We slightly change the behavior of `tx.EffectiveGasTip` when it
returns an error. It would previously return a negative number on error,
now it does not (since uint256 does not allow for negative numbers)

---------

Signed-off-by: Csaba Kiraly <[email protected]>
Co-authored-by: Csaba Kiraly <[email protected]>

* triedb/pathdb: improve err message in historical state reader (#32477)

Fixes https://github.com/ethereum/go-ethereum/issues/32474

* core, miner, trie: add metrics tracking state trie depth (#32388)

Co-authored-by: shantichanal <[email protected]>
Co-authored-by: Gary Rong <[email protected]>
Co-authored-by: Guillaume Ballet <[email protected]>

* p2p/discover: add discv5 invalid findnodes result test cases (#32481)

Supersedes #32470.

### What
- snap: shorten stall watchdog in `eth/protocols/snap/sync_test.go` from
1m to 10s.
- discover/v5: consolidate FINDNODE negative tests into a single
table-driven test:
  - `TestUDPv5_findnodeCall_InvalidNodes` covers:
    - invalid IP (unspecified `0.0.0.0`) → ignored
    - low UDP port (`<=1024`) → ignored

### Why
- Addresses TODOs:
  - “Make tests smaller” (reduce long 1m timeout).
- “check invalid IPs”; also cover low port per `verifyResponseNode`
rules (UDP must be >1024).

### How it’s validated
- Test-only changes; no production code touched.
- Local runs:
  - `go test ./p2p/discover -count=1 -timeout=300s` → ok
  - `go test ./eth/protocols/snap -count=1 -timeout=600s` → ok
- Lint:
  - `go run build/ci.go lint` → 0 issues on modified files.

### Notes
- The test harness uses `enode.ValidSchemesForTesting` (which includes
the “null” scheme), so records signed with `enode.SignNull` are
signature-valid; failures here are due to IP/port validation in
`verifyResponseNode` and `netutil.CheckRelayAddr`.
- Tests are written as a single table-driven function for clarity; no
helpers or environment switching.

---------

Co-authored-by: lightclient <[email protected]>

* node: fix vhosts for adminAPI (#32488)

* core,trie: fix typo in TransitionTrie (#32491)

Change `NewTransitionTree` to the correct `NewTransitionTrie`.

Signed-off-by: pxwanglu <[email protected]>

* .github/workflows: naive PR format checker (#32480)

Full disclosure: this has been generated by AI. The goal is to have a
quick check that the PR format is correct, before we merge it. This is
to avoid the periodical case when someone forgets to add a milestone or
check the title matches our preferred format.

* p2p: use slices.Clone (#32428)

Replaces a helper method with slices.Clone

* eth/protocols/eth: Handle DepositTx Receipts

* eth: Catch nil chainViews in backend filter maps update

* params: fix history serve window for verkle test (#32127)

Fixes the history serve window parameter for the
test function `getContractStoredBlockHash`.

Fixes #32458.

* eth/tracers: add missing teardown in TestTraceChain (#32472)

The TestTraceChain function was missing a defer backend.teardown() call,
which is required to properly release blockchain resources after test
completion.

---------

Co-authored-by: Sina Mahmoodi <[email protected]>

* internal/web3ext: remove deprecated method debug_seedHash (#32495)

The corresponding function was removed in #27178

* triedb/pathdb: rename history to state history (#32498)

This is a internal refactoring PR, renaming the history to stateHistory.

It's a pre-requisite PR for merging trienode history, avoid the name
conflict.

* build: add support for ubuntu 25.04 (#31666)

* cmd: fix typo in comment (#32501)

The function name in the comment should be `writeErrors` instead of
`writeQueries`.

Signed-off-by: tzchenxixi <[email protected]>

* eth/tracers: fix supply tracer uncle accounting (#31882)

Uncle rewards were being omitted in the supply tracer due
to a bug. This PR fixes that.

---------

Co-authored-by: Sina Mahmoodi <[email protected]>

* triedb/pathdb: refactor state history write (#32497)

This pull request refactors the internal implementation in path database
a bit, specifically:

- purge the state index data in batch
- simplify the logic of state history construction and index, make it more readable

* rpc: refactor read limit test (#32494)

closes #32240 #32232

The main cause for the time out is the slow json encoding of large data.
In #32240 they tried to resolve the issue by reducing the size of the
test. However as Felix pointed out, the test is still kind of confusing.

I've refactored the test so it is more understandable and have reduced
the amount of data needed to be json encoded. I think it is still
important to ensure that the default read limit is not active, so I have
retained one large (~32 MB) test case, but it's at least smaller than
the existing ~64 MB test case.

* eth: replace hardcoded sleep with polling loop in snap sync test (#32499)

Replace hardcoded 5-second sleep with polling loop that actively checks
snap sync state. This approach is already used in other project tests
(like account_cache_test.go) and provides better reliability by:

- Reducing flaky behavior on slower systems
- Finishing early when sync completes quickly
- Using 1-second timeout with 100ms polling intervals

---------

Co-authored-by: lightclient <[email protected]>

* internal/ethapi: fix precompile override for eth_estimateGas (#31795)

Fix and close https://github.com/ethereum/go-ethereum/issues/31719.

---------

Co-authored-by: Sina Mahmoodi <[email protected]>

* accounts/abi: fix panic when check event with log has empty or nil topics (#32503)

When the log has empty or nil topics, the generated bindings code will
panic when accessing `log.Topics[0]`, add a check to avoid it.

* core, internal, miner, signer: convert legacy sidecar in Osaka fork (#32347)

This pull request implements #32235 , constructing blob sidecar in new
format (cell proof)
if the Osaka has been activated.

Apart from that, it introduces a pre-conversion step in the blob pool
before adding the txs.
This mechanism is essential for handling the remote **legacy** blob txs
from the network.

One thing is still missing and probably is worthy being highlighted
here: the blobpool may
contain several legacy blob txs before the Osaka and these txs should be
converted once
Osaka is activated. While the `GetBlob` API in blobpool is capable for
generating cell proofs
at the runtime, converting legacy txs at one time is much cheaper
overall.

---------

Co-authored-by: MariusVanDerWijden <[email protected]>
Co-authored-by: lightclient <[email protected]>

* eth/tracers: fix testcase 7702_delegate (#32349)

Fixes a prestateTracer test case covering 7702 delegation.

---------

Co-authored-by: Jared Wasinger <[email protected]>
Co-authored-by: Sina Mahmoodi <[email protected]>

* node: fix problematic function name in comment (#32510)

fix problematic function name in comment

Signed-off-by: slicesequal <[email protected]>

* eth: stabilize tx relay peer selection (#31714)

When maxPeers was just above some perfect square, and a few peers
dropped for some reason, we changed the peer selection function.
When new peers were acquired, we changed again.

This PR improves the selection function, in two ways. First, it will always select
sqrt(peers) to broadcast to. Second, the selection now uses siphash with a secret
key, to guard against information leaks about tx source.

---------

Signed-off-by: Csaba Kiraly <[email protected]>
Co-authored-by: Felix Lange <[email protected]>

* core: improve error context in state processor for Prague EIPs (#32509)

Add better error context for EIP-6110, EIP-7002, and EIP-7251 processing
in state processor to improve debugging capabilities.

* all: fix problematic function name in comment (#32513)

Fix problematic function name in comment.
Do my best to correct them all with a script to avoid spamming PRs.

* triedb/pathdb, core: keep root->id mappings after truncation (#32502)

This pull request preserves the root->ID mappings in the path database
even after the associated state histories are truncated, regardless of
whether the truncation occurs at the head or the tail.

The motivation is to support an additional history type, trienode history. 
Since the root->ID mappings are shared between two history instances, 
they must not be removed by either one.

As a consequence, the root->ID mappings remain in the database even
after the corresponding histories are pruned. While these mappings may 
become  dangling, it is safe and cheap to keep them.

Additionally, this pull request enhances validation during historical
reader construction, ensuring that only canonical historical state will be
served.

* README: add twitter badge to documentation (#32516)

* core/rawdb: inspect database in parallel (#32506)

`db inspect` on the full database currently takes **30min+**, because
the db iterate was run in one thread, propose to split the key-space to
256 sub range, and assign them to the worker pool to speed up.

After the change, the time of running `db inspect --workers 16` reduced
to **10min**(the keyspace is not evenly distributed).

---------

Signed-off-by: jsvisa <[email protected]>
Co-authored-by: Gary Rong <[email protected]>

* all: improve ETA calculation across all progress indicators (#32521)

### Summary
Fixes long-standing ETA calculation errors in progress indicators that
have been present since February 2021. The current implementation
produces increasingly inaccurate estimates due to integer division
precision loss.

### Problem

https://github.com/ethereum/go-ethereum/blob/3aeccadd04aee2d18bdb77826f86b1ca000d3b67/triedb/pathdb/history_indexer.go#L541-L553
The ETA calculation has two critical issues:
1. **Integer division precision loss**: `speed` is calculated as
`uint64`
2. **Off-by-one**: `speed` uses `+ 1`(2 times) to avoid division by
zero, however it makes mistake in the final calculation

This results in wildly inaccurate time estimates that don't improve as
progress continues.

### Example
Current output during state history indexing:
```
lvl=info msg="Indexing state history" processed=16858580 left=41802252 elapsed=18h22m59.848s eta=11h36m42.252s
```

**Expected calculation:**
- Speed: 16858580 ÷ 66179848ms = 0.255 blocks/ms  
- ETA: 41802252 ÷ 0.255 = ~45.6 hours

**Current buggy calculation:**
- Speed: rounds to 1 block/ms
- ETA: 41802252 ÷ 1 = ~11.6 hours ❌

### Solution
- Created centralized `CalculateETA()` function in common package
- Replaced all 8 duplicate code copies across the codebase

### Testing
Verified accurate ETA calculations during archive node reindexing with
significantly improved time estimates.

* core/stateless: only report leaf depth in witness stats (#32507)

Filtering for leaf nodes was missing from #32388, which means that even
the root done was reported, which made little sense for the bloatnet
data processing we want to do.

* trie/bintrie: add eip7864 binary trees and run its tests (#32365)

Implement the binary tree as specified in [eip-7864](https://eips.ethereum.org/EIPS/eip-7864). 

This will gradually replace verkle trees in the codebase. This is only 
running the tests and will not be executed in production, but will help 
me rebase some of my work, so that it doesn't bitrot as much.

---------

Signed-off-by: Guillaume Ballet
Co-authored-by: Parithosh Jayanthi <[email protected]>
Co-authored-by: rjl493456442 <[email protected]>

* internal/ethapi,params: add `eth_config` (#32239)

~Will probably be mostly supplanted by #32224, but this should do for
now for devnet 3.~

Seems like #32224 is going to take some more time, so I have completed
the implementation of eth_config here. It is quite a bit simpler to
implement now that the config hashing was removed.

---------

Co-authored-by: MariusVanDerWijden <[email protected]>
Co-authored-by: Guillaume Ballet <[email protected]>
Co-authored-by: rjl493456442 <[email protected]>

* version: release v1.16.3

* feat: bump superchain registry (#669)

* ci: Update forkdiff version to v0.1.1 (#670)

* feat: introduce minimum base fee (#666)

* add minBaseFee to superchain/types and Jovian to params/config

* extend extraData header field

* validate/encode eip1559

* spike add jovian 1559 tests

* update calcBaseFee test and fix logic for calcBaseFee

* update comment

* validate params should be 9 not 10

* dont leave out version byte in extraData

* 0 minbasefee is valid

* dont need default minBaseFee

* add test that fails for curr impl

* do one check at the end to enforce minBaseFee

* 9 bytes not 10 in validate err msg

* extend coverage

* nits

* fix test

* use feature naming and assume eip1559params 8bytes still

* best effort decode

* feature flag

* nits

* handle FCU and payload building args properly

* have payload building test support holocene still

* nits + fix api payload fcu

* use option A of feature flag + nits

* Switch from log2 to significand + exponent for min base fee

* Clear out the higher 4 bits of the significand

* Add encode/decode helpers for min base fee factors

* Remove the check for a blank min base fee

* bit manipulation change

* eth/catalyst: fix ExtraData validation for Jovian min base fee; add tests

* use u64 approach

* feedback + add specs link

* use more compact syntax

* move expectation to end of struct

* combine tests

* rename feature flag

* add new optimism-specific file with general validation and decoding functions

* move optimism specific code to new file

* remove validation and add comments

validation is done in catalyst/api

* remove feature flags altogether

* remove validation from decoding fn

* fix and use generic extradata validation fn

* add comments

* finish removing feature flag

* fix tests

* Apply suggestions from code review

* add spec link

* use inline fn to clean up diff to upstream

* add test cases and factor into subtests with require statement

* tidy up jovianConfig() helper and rename a test

* Introduce Holocene/JovianExtraDataVersionByte

* tweak

* consistency

* rename minbasefee to jovian in validation fn error msg

* assert holocene params in payload_building_test.go

* fix regression

* use ptr for MinBaseFee in PayloadAttributes

* eip1559_optimism: have Validate/DecodeOptimismExtraData take a ForkChecker interface and return a *uint64 for MinBaseFee

* introduce EncodeOptimismExtraData

* lint (whitespace only)

* fix pointer comparison in assertion

* add test for determinism of payload id

* dereference pointer when computing ID

This is not strictly necessary, but it is clearer.

* use eip1559.DecodeOptimismExtraData in test

and extend coverage to missing minbasefee

* Update consensus/misc/eip1559/eip1559_optimism.go

Co-authored-by: Sebastian Stammler <[email protected]>

* use isOptimismHolocene in CalcBaseFee and document assumption about extraData validity

* TestBuildPatload: use nil minBaseFee expectation preJovian

* rework closure to reduce diff to upstream

* remove empty line

---------

Co-authored-by: William Law <[email protected]>
Co-authored-by: Niran Babalola <[email protected]>
Co-authored-by: Sebastian Stammler <[email protected]>

* jovian: make isthmus gas params extraction forward-compatible (#671)

* sync-superchain: Handle case where skipped genesis file doesn't exist. (#673)

* feat: bump superchain registry to include are…
ClaytonNorthey92 added a commit to hemilabs/op-geth that referenced this pull request Dec 1, 2025
* cmd/workload: rework tracegen to run tracing at block level (#32092)

This PR changes the trace test to block level, aiming for better
execution performance.

---------

Co-authored-by: zsfelfoldi <[email protected]>

* core/state: add GetStateAndCommittedState (#31585)

Improves the SSTORE gas calculation a bit. Previously we would pull up
the state object twice. This is okay for existing objects, since they
are cached, however non-existing objects are not cached, thus we needed
to go through all 128 diff layers as well as the disk layer twice, just
for the gas calculation

```
goos: linux
goarch: amd64
pkg: github.com/ethereum/go-ethereum/core/vm
cpu: AMD Ryzen 9 5900X 12-Core Processor            
               │ /tmp/old.txt │            /tmp/new.txt             │
               │    sec/op    │   sec/op     vs base                │
Interpreter-24   1118.0n ± 2%   602.8n ± 1%  -46.09% (p=0.000 n=10)
```

---------

Co-authored-by: Gary Rong <[email protected]>

* cmd/utils, internal/debug: hide the deprecated flags (#32128)

Some of the flags were deprecated, so try to hide them in the help
message. And move the `--vmodule` and `--logjson` flags to the
DeprecatedCategory.

* .gitea: add windows build (experimental)

* cmd/utils: show full deprecated flags (#32141)

This is a follow up PR after #32128 , Seems I've missed to add
--txlookuplimit as hidden. In hte meanwhile, I also add the other 
deprecated flags into the output of `show-deprecated-flags`

* cmd/utils: update flag description of gcmode (#32145)

* .gitea: add workflow_dispatch for release build

* .gitea: update PATH

* .gitea: set PATH

* gitea: try with cmd

* gitea: set PATH in script

* .gitea: fix typo in windows workflow

* core/vm: move nil-check out of the interpreter loop (#32068)

Moves the jumptable nil check our of the interpreter loop.
Benchmarks show a 2-10% improvement.

* core/vm: implement EIP-7939 - CLZ opcode (#31989)

https://eips.ethereum.org/EIPS/eip-7939

---------

Co-authored-by: spencer-tb <[email protected]>
Co-authored-by: Felix Lange <[email protected]>

* core/txpool/blobpool: lower log level for warnings (#32142)

- Change the log level to `warning`, during syncing blocks, the `final
== nil` is normal.
- Change to log tx hash.

* .github, internal/flags: improve actions test runs (#32150)

This change enables more tests to run on GitHub actions. First, it
removes the `-short` flag passed to `go test`, unskipping some longer
running tests. We also enable the full consensus tests to run by
enabling submodules during git clone.

The EF now operates org wide runners with the `self-hosted-ghr` label.
These are auto-scaling runners which should ideally allow us to process
any amount of testing load we throw at them. The new runners have `HOME`
configured differently from the actual user home directory, so our
internal test for resolving `~` had to be adapted to work in this scenario.

* consensus/misc/eip4844: implement EIP-7918  (#31965)

https://eips.ethereum.org/EIPS/eip-7918

---------

Co-authored-by: Felix Lange <[email protected]>

* core/vm: implement EIP-7951 - precompile for secp256r1 (#31991)

https://github.com/ethereum/EIPs/pull/9833

Based on #27540, #30043

---------

Co-authored-by: Ulaş Erdoğan <[email protected]>

* cmd, eth/catalyst: exit geth only if exitWhenSynced is specified (#32149)

This pull request modifies the behavior of `--synctarget` to terminate
the node only when `--exitWhenSynced` is explicitly specified.

* eth/catalyst:  abort dev mode block commit if shut down is triggered (#32166)

alternate approach to https://github.com/ethereum/go-ethereum/pull/31328
suggested by @MariusVanDerWijden . This prevents Geth from outputting a
lot of logs when trying to commit on-demand dev mode blocks while the
client is shutting down.

The issue is hard to reproduce, but I've seen it myself and it is
annoying when it happens. I think this is a reasonable simple solution,
and we can revisit if we find that the output is still too large (i.e.
there is a large delay between initiating shut down and the simulated
beacon receiving the signal, while in this loop).

Co-authored-by: Marius van der Wijden <[email protected]>

* miner, core, core/txpool: implement EIP 7825 - TX Gas Limit Cap (#31824)

Implements EIP-7825

---------

Co-authored-by: Gary Rong <[email protected]>
Co-authored-by: lightclient <[email protected]>
Co-authored-by: MariusVanDerWijden <[email protected]>

* core/vm: update gas cost of CLZ to five (#32172)

https://github.com/ethereum/EIPs/commit/a794de3fcf71bb8c71e8bafdba11f63133ce4516

* core,miner: implement EIP-7934 - RLP Execution Block Size Limit (#31990)

This PR adds a block validation check for the maximum block size, as required by
EIP-7934, and also applies a slightly lower size limit during block building.

---------

Co-authored-by: spencer-tb <[email protected]>
Co-authored-by: Felix Lange <[email protected]>
Co-authored-by: Gary Rong <[email protected]>

* Remove checkInterop from Block Building Path (#585)

* cmd/utils: add the missing check for the HoodiFlag in blsync (#32179)

Hoodi network flag should be exclusive to other network flags for both blysnc standalone and integrated mode.

* feat: bump scr commit (#640)

* cmd/clef: update Safe API documentation links in changelog (#32136)

This PR updates the outdated documentation URL from docs.gnosis.io to
the new official docs.safe.global domain. The change reflects the
rebranding from Gnosis Safe to Safe and ensures that users are directed
to the current API documentation for transaction service reference.

* txpool: Move Ingress Filter Checks to addTxsLocked (#642)

* txpool: introduce MaxTxGasLimit feature to enforce per-transaction gas limits (#626)

Adds a new flag `--txpool.maxtxgas` which represents the maximum gas limit for individual transactions (0 = no limit) when added to the mempool. Transactions exceeding this limit will be rejected by the transaction pool.

Co-authored-by: Mark Tyneway <[email protected]>

* core/types:  add block-level access list structures with encoding/decoding (#31948)

This adds the SSZ types from the 
[EIP-7928](https://eips.ethereum.org/EIPS/eip-7928) and also adds
encoder/decoder generation using https://github.com/ferranbt/fastssz.

The fastssz dependency is updated because the generation will not work
properly with the master branch version due to a bug in fastssz.

---------

Co-authored-by: Gary Rong <[email protected]>

* eth/downloader: fix ancient limit in snap sync (#32188)

This pull request fixes an issue in disabling direct-ancient mode in
snap sync.

Specifically, if `origin >= frozen && origin != 0`, it implies a part of
chain data has been written into the key-value store, all the following 
writes into ancient store scheduled by downloader will be rejected 
with error 

`ERROR[07-10|03:46:57.924] Error importing chain data to ancients
err="can't add block 1166 hash: the append operation is out-order: have
1166 want 0"`.

This issue is detected by the https://github.com/ethpandaops/kurtosis-sync-test, 
which initiates the first snap sync cycle without the finalized header and
implicitly disables the direct-ancient mode. A few seconds later the second 
snap sync cycle is initiated with the finalized information and direct-ancient mode
is enabled incorrectly.

* .github: remove karalabe from CODEOWNERS

* cmd/geth: update vcheck testdata, add docs on generating signatures (#32121)

Fixed typo in security release URL by replacing:
Old: https://blog.ethereum.org/2020/11/12/geth_security_release/
New: https://blog.ethereum.org/2020/11/12/geth-security-release/

---------

Co-authored-by: lightclient <[email protected]>

* signer/core/apitypes: require blob txs to have tx.to set (#32197)

Check the `to` address before building the blob tx.

---------

Co-authored-by: jwasinger <[email protected]>

* accounts/keystore: update links to documenation (#32194)

---


**Description:**  
- Replaced outdated GitHub wiki links with the official Ethereum
documentation for Web3 Secret Storage.
- Updated references in `keystore.go` and `passphrase.go` for improved
accuracy and reliability.


---

* ethclient/gethclient: remove race condition in tests (#32206)

alternative to https://github.com/ethereum/go-ethereum/pull/32200

The race condition is not happening yet, since there is only a single
call to `newTestBackend`, but there might be more in the future

* tracing: Show OptimismBaseFeeRecipient in prestate (#407)

The OptimismBaseFeeRecipient should show up in prestate tracing results
(both the normal prestate and the diff mode prestate results) if IsOptimism.
I added one prestate diff test with Optimism turned on to show that it
works correctly. This required adding the L1CostFunc to the test block context.

* params: EIP-7892 - Blob Parameter Only Hardforks (#32193)

This is a resubmit of https://github.com/ethereum/go-ethereum/pull/31820
against the `master` branch.

---------

Co-authored-by: Marius van der Wijden <[email protected]>
Co-authored-by: Gary Rong <[email protected]>

* eth/fetcher: fix announcement drop logic (#32210)

This PR fixes an issue in the tx_fetcher DoS prevention logic where the
code keeps the overflow amount (`want - maxTxAnnounces`) instead of the
allowed amount (`maxTxAnnounces - used`). The specific changes are:

- Correct slice indexing in the announcement drop logic
- Extend the overflow test case to cover the inversion scenario

* miner: set sidecar version when recomputing proofs (#32199)

- If the block number is `osaka` fork and needs to recompute some `blob
proofs` to `cell proofs`, here also needs to set version to `1`.

* miner, txpool: detect supervisor failsafe and reject interop transactions if enabled (#636)

* miner, txpool: detect supervisor failsafe and reject interop transactions if enabled

Add routine to periodically check for failsafe mode by calling supervisor RPC and checking error for sentinel value
Backend caches result, miner inspects the cache. Txpool checks over RPC on ingress.

Adds comprehensive tests.

* move SupervisorInFailSafe method to BackendWithInterop interface

* rename

* use interoptypes.TxToInteropAccessList in commitTransaction

* use admin_getFailsafeEnabled instead of stubbed CheckAccessList

* fixes

* fixes

* all: fix outdated ethereum wiki json-rpc json-rpc doc links (#32209)

Replace outdated wiki reference with ethereum.org
documentation links

* core/types: fix CellProofsAt method (#32198)

* triedb/pathdb: introduce file-based state journal (#32060)

Introduce file-based state journal in path database, fixing
the Pebble restriction when the journal size exceeds 4GB.

---------

Signed-off-by: jsvisa <[email protected]>
Co-authored-by: Gary Rong <[email protected]>

* core/rawdb: change the mechanism to schedule freezer sync (#32135)

This pull request slightly improves the freezer fsync mechanism by scheduling 
the Sync operation based on the number of uncommitted items and original
time interval.

Originally, freezer.Sync was triggered every 30 seconds, which worked well during
active chain synchronization. However, once the initial state sync is complete, 
the fixed interval causes Sync to be scheduled too frequently.

To address this, the scheduling logic has been improved to consider both the time 
interval and the number of uncommitted items. This additional condition helps 
avoid unnecessary Sync operations when the chain is idle.

* eth/protocols/snap, p2p/discover: improve zero time checks (#32214)

* all: update dead wiki links (#32215)

---


**Description:**  
- Replaced outdated GitHub wiki links with current, official
documentation URLs.
- Removed links that redirect or are no longer relevant.
- Ensured all references point to up-to-date and reliable sources.


---

* core/rawdb: reduce allocations in rawdb.ReadHeaderNumber (#31913)

This is something interesting I came across during my benchmarks, we
spent ~3.8% of all allocations allocating the header number on the heap.

```
(pprof) list GetHeaderByHash
Total: 38197204475
ROUTINE ======================== github.com/ethereum/go-ethereum/core.(*BlockChain).GetHeaderByHash in github.com/ethereum/go-ethereum/core/blockchain_reader.go
         0 5786566117 (flat, cum) 15.15% of Total
         .          .     79:func (bc *BlockChain) GetHeaderByHash(hash common.Hash) *types.Header {
         . 5786566117     80: return bc.hc.GetHeaderByHash(hash)
         .          .     81:}
         .          .     82:
         .          .     83:// GetHeaderByNumber retrieves a block header from the database by number,
         .          .     84:// caching it (associated with its hash) if found.
         .          .     85:func (bc *BlockChain) GetHeaderByNumber(number uint64) *types.Header {
ROUTINE ======================== github.com/ethereum/go-ethereum/core.(*HeaderChain).GetHeaderByHash in github.com/ethereum/go-ethereum/core/headerchain.go
         0 5786566117 (flat, cum) 15.15% of Total
         .          .    404:func (hc *HeaderChain) GetHeaderByHash(hash common.Hash) *types.Header {
         . 1471264309    405: number := hc.GetBlockNumber(hash)
         .          .    406: if number == nil {
         .          .    407:  return nil
         .          .    408: }
         . 4315301808    409: return hc.GetHeader(hash, *number)
         .          .    410:}
         .          .    411:
         .          .    412:// HasHeader checks if a block header is present in the database or not.
         .          .    413:// In theory, if header is present in the database, all relative components
         .          .    414:// like td and hash->number should be present too.
(pprof) list GetBlockNumber
Total: 38197204475
ROUTINE ======================== github.com/ethereum/go-ethereum/core.(*HeaderChain).GetBlockNumber in github.com/ethereum/go-ethereum/core/headerchain.go
  94438817 1471264309 (flat, cum)  3.85% of Total
         .          .    100:func (hc *HeaderChain) GetBlockNumber(hash common.Hash) *uint64 {
  94438817   94438817    101: if cached, ok := hc.numberCache.Get(hash); ok {
         .          .    102:  return &cached
         .          .    103: }
         . 1376270828    104: number := rawdb.ReadHeaderNumber(hc.chainDb, hash)
         .          .    105: if number != nil {
         .     554664    106:  hc.numberCache.Add(hash, *number)
         .          .    107: }
         .          .    108: return number
         .          .    109:}
         .          .    110:
         .          .    111:type headerWriteResult struct {
(pprof) list ReadHeaderNumber
Total: 38197204475
ROUTINE ======================== github.com/ethereum/go-ethereum/core/rawdb.ReadHeaderNumber in github.com/ethereum/go-ethereum/core/rawdb/accessors_chain.go
 204606513 1376270828 (flat, cum)  3.60% of Total
         .          .    146:func ReadHeaderNumber(db ethdb.KeyValueReader, hash common.Hash) *uint64 {
 109577863 1281242178    147: data, _ := db.Get(headerNumberKey(hash))
         .          .    148: if len(data) != 8 {
         .          .    149:  return nil
         .          .    150: }
  95028650   95028650    151: number := binary.BigEndian.Uint64(data)
         .          .    152: return &number
         .          .    153:}
         .          .    154:
         .          .    155:// WriteHeaderNumber stores the hash->number mapping.
         .          .    156:func WriteHeaderNumber(db ethdb.KeyValueWriter, hash common.Hash, number uint64) {
```

Opening this to discuss the idea, I know that rawdb.EmptyNumber is not a
great name for the variable, open to suggestions

* trie: avoid spawning goroutines for empty children (#32220)

* eth/downloader: improve nil pointer protection (#32222)

Fix #32221

---------

Co-authored-by: rjl493456442 <[email protected]>

* account/abi/bind/v2: fix TestDeploymentWithOverrides (#32212)

The root cause of the flaky test was a nonce conflict caused by async
contract deployments.

This solution defines a custom deployer with automatic nonce management.

* eth/tracers: apply block header overrides correctly (#32183)

Fixes #32175.

This fixes the scenario where the blockhash opcode would return 0x0
during RPC simulations when using BlockOverrides with a future block
number. The root cause was that BlockOverrides.Apply() only modified the
vm.BlockContext, but GetHashFn() depends on the actual
types.Header.Number to resolve valid historical block hashes. This
caused a mismatch and resulted in incorrect behavior during trace and
call simulations.

---------

Co-authored-by: shantichanal <[email protected]>
Co-authored-by: lightclient <[email protected]>

* triedb/pathdb: avoid duplicate metadata reads (#32226)

* eth/protocols/snap: fix negative eta in state progress logging (#32225)

* triedb/pathdb: improve the performance of parse index block (#32219)

The implementation of `parseIndexBlock` used a reverse loop with slice
appends to build the restart points, which was less cache-friendly and
involved unnecessary allocations and operations. In this PR we change
the implementation to read and validate the restart points in one single
forward loop.

Here is the benchmark test:

```bash
go test -benchmem -bench=BenchmarkParseIndexBlock ./triedb/pathdb/
```

The result as below:

```
benchmark                      old ns/op     new ns/op     delta
BenchmarkParseIndexBlock-8     52.9          37.5          -29.05%
```

about 29% improvements

---------

Signed-off-by: jsvisa <[email protected]>

* all: define constructor for BlobSidecar (#32213)

The main purpose of this change is to enforce the version setting when
constructing the blobSidecar, avoiding creating sidecar with wrong/default 
version tag.

* params: update tx gas limit cap (#32230)

Updates the tx gas limit cap to the new parameter (2^24)
https://github.com/ethereum/EIPs/pull/9986/files

* core/txpool/blobpool: remove unused `txValidationFn` from BlobPool (#32237)

This PR removes the now‑unused `txValidationFn` field from BlobPool.
It became obsolete after a PR  https://github.com/ethereum/go-ethereum/pull/31202 
was merged.

Resolves https://github.com/ethereum/go-ethereum/issues/32236

* triedb/pathdb: fix incorrect address length in history searching (#32248)

We should use account length to check address, else OOB maybe occured

Signed-off-by: jsvisa <[email protected]>

* core/vm: triple modexp cost post-cancun (#32231)

https://github.com/ethereum/EIPs/pull/9969/files

* core, params: add limit for max blobs in blob transaction (#32246)

[EIP-7594](https://eips.ethereum.org/EIPS/eip-7594) defines a limit of
max 6 blobs per transaction. We need to enforce this limit during block
processing.

> Additionally, a limit of 6 blobs per transaction is introduced.
Clients MUST enforce this limit when validating blob transactions at
submission time, when received from the network, and during block
production and processing.

* superchain: skip celo mainnet genesis processing (#646)

* superchain: skip celo mainnet genesis processing

* superchain: add GetChain tests

* superchain: add clarifying comments for celo exclusion

* build: update tests to fusaka-devnet-3 (#32251)

* core/types: minimize this invalid intermediate state (#32241)

* core/rawdb: downgrade log level in chain freezer (#32253)

* triedb/pathdb:  use binary.append to eliminate the tmp scratch slice (#32250)

`binary.AppendUvarint` offers better performance than using append
directly, because it avoids unnecessary memory allocation and copying.

In our case, it can increase the performance by +35.8% for the
`blockWriter.append` function:

```
benchmark                        old ns/op     new ns/op     delta
BenchmarkBlockWriterAppend-8     5.97          3.83          -35.80%
```

---------

Signed-off-by: jsvisa <[email protected]>
Co-authored-by: Gary Rong <[email protected]>

* p2p/rlpx: optimize XOR operation using bitutil.XORBytes (#32217)

Replace manual byte-by-byte XOR implementation with the optimized
bitutil.XORBytes function. This improves performance by using word-sized
operations on supported architectures while maintaining the same
functionality. The optimized version processes data in bulk rather than
one byte at a time

---------

Co-authored-by: Felix Lange <[email protected]>

* eth/gasestimator: fix potential overflow (#32255)

Improve binary search, preventing the potential overflow in certain L2 cases

* triedb/pathdb: fix an deadlock in history indexer (#32260)

Seems the `signal.result` was not sent back in shorten case, this will
cause a deadlock.

---------

Signed-off-by: jsvisa <[email protected]>
Co-authored-by: Gary Rong <[email protected]>

* eth/protocols/snap: add healing and syncing metrics (#32258)

Adds the heal time and snap sync time to grafana

---------

Co-authored-by: Gary Rong <[email protected]>

* core: replace the empty fmt.Errorf with errors.New (#32274)

The `errors.new` function does not require string formatting, so its
performance is better than that of `fmt.Errorf`.

* eth/catalyst: fix error message in ExecuteStatelessPayloadV4 (#32269)

Correct the error message in the ExecuteStatelessPayloadV4 function to
reference newPayloadV4 and the Prague fork, instead of incorrectly
referencing newPayloadV3 and Cancun. 

This improves clarity during debugging and aligns the error message with 
the actual function and fork being validated. No logic is changed.

---------

Co-authored-by: rjl493456442 <[email protected]>

* cmd, eth, internal: introduce debug_sync (#32177)

Alternative implementation of https://github.com/ethereum/go-ethereum/pull/32159

* all: replace fmt.Errorf with errors.New (#32286)

The errors.new function does not require string formatting, so its
performance is better than that of fmt.Errorf.

* downloader: fix typos, grammar and formatting (#32288)

* ethclient/simulated: Fix flaky rollback test (#32280)

This PR addresses a flakiness in the rollback test discussed in
https://github.com/ethereum/go-ethereum/issues/32252

I found `nonce` collision caused transactions occasionally fail to send.
I tried to change error message in the failed test like:

```
	if err = client.SendTransaction(ctx, signedTx); err != nil {
		t.Fatalf("failed to send transaction: %v, nonce: %d", err, signedTx.Nonce())
	}
```

and I occasionally got test failure with this message:

```
=== CONT  TestFlakyFunction/Run_#100
    rollback_test.go:44: failed to send transaction: already known, nonce: 0
--- FAIL: TestFlakyFunction/Run_#100 (0.07s)
```

Although `nonces` are obtained via `PendingNonceAt`, we observed that,
in rare cases (approximately 1 in 1000), two transactions from the same
sender end up with the same nonce. This likely happens because `tx0` has
not yet propagated to the transaction pool before `tx1` requests its
nonce. When the test succeeds, `tx0` and `tx1` have nonces `0` and `1`,
respectively. However, in rare failures, both transactions end up with
nonce `0`.

We modified the test to explicitly assign nonces to each transaction. By
controlling the nonce values manually, we eliminated the race condition
and ensured consistent behavior. After several thousand runs, the
flakiness was no longer reproducible in my local environment.

Reduced internal polling interval in `pendingStateHasTx()` to speed up
test execution without impacting stability. It reduces test time for
`TestTransactionRollbackBehavior` from about 7 seconds to 2 seconds.

* core/state: preallocate capacity for logs list (#32291)

Improvement: preallocate capacity for `logs` at first to avoid
reallocating multi times.

* core/state: improve PrettyPrint function (#32293)

* core/types: expose sigHash as Hash for SetCodeAuthorization (#32298)

* common/hexutil: replace customized bit sizer with bit.Uintsize (#32304)

* accounts/abi: precompile regex (#32301)

* cmd/devp2p/internal/v4test: add test for ENRRequest (#32303)

This adds a cross-client protocol test for a recently discovered bug in Nethermind.

* trie: reduce the memory allocation in trie hashing (#31902)

This pull request optimizes trie hashing by reducing memory allocation
overhead. Specifically:

- define a fullNodeEncoder pool to reuse encoders and avoid memory
allocations.

- simplify the encoding logic for shortNode and fullNode by getting rid
of the Go interfaces.

* core/vm: add configurable jumpdest analysis cache (#32143)

This adds a method on vm.EVM to set the jumpdest cache implementation.
It can be used to maintain an analysis cache across VM invocations, to improve
performance by skipping the analysis for already known contracts.

---------

Co-authored-by: lmittmann <[email protected]>
Co-authored-by: Felix Lange <[email protected]>

* eth: fix typos and outdated comments (#32324)

* eth/filters: fix error when blockHash is used with fromBlock/toBlock (#31877)

This introduces an error when the filter has both `blockHash` and
`fromBlock`/`toBlock`, since these are mutually exclusive. Seems the
tests were actually returning `not found` error, which went undetected
since there was no check on the actual returned error in the test.

* rlp/rlpgen: implement package renaming support (#31148)

This adds support for importing types from multiple identically-named
packages.

---------

Co-authored-by: Felix Lange <[email protected]>

* beacon/params, core/filtermaps: update checkpoints (#32336)

This PR updates checkpoints for blsync and filtermaps.

* version: release v1.16.2 (#32343)

* version: begin v1.16.3 release cycle (#32345)

* core/state: introduce the TransitionState object (verkle transition part 1) (#31634)

This is the first part of #31532 

It maintains a series of conversion maker which are to be updated by the
conversion code (in a follow-up PR, this is a breakdown of a larger PR
to make things easier to review). They can be used in this way:

- During the conversion, by storing the conversion markers when the
block has been processed. This is meant to be written in a function that
isn't currently present, hence [this
TODO](https://github.com/ethereum/go-ethereum/pull/31634/files#diff-89272f61e115723833d498a0acbe59fa2286e3dc7276a676a7f7816f21e248b7R384).

Part of  https://github.com/ethereum/go-ethereum/issues/31583

---------

Signed-off-by: Guillaume Ballet <[email protected]>
Co-authored-by: Gary Rong <[email protected]>

* eth/catalyst: avoid load the same blob tx multi times (#32190)

- If all the `vhashes` are in the same `sidecar`, then it will load the
same blob tx many times. This PR aims to upgrade this.

---------

Co-authored-by: Gary Rong <[email protected]>

* eth/gasestimator: check ErrGasLimitTooHigh conditions (#32348)

This PR makes 2 changes to how
[EIP-7825](https://github.com/ethereum/go-ethereum/pull/31824) behaves.

When `eth_estimateGas` or `eth_createAccessList` is called without any
gas limit in the payload, geth will choose the block's gas limit or the
`RPCGasCap`, which can be larger than the `maxTxGas`.

When this happens for `estimateGas`, the gas estimation just errors out
and ends, when it should continue doing binary search to find the lowest
possible gas limit.

This PR will: 
- Add a check to see if `hi` is larger than `maxTxGas` and cap it to
`maxTxGas` if it's larger. And add a special case handling for gas
estimation execute when it errs with `ErrGasLimitTooHigh`

---------

Co-authored-by: Gary Rong <[email protected]>

* core/filtermaps: remove unnecessary nil check and add cv2 lock (#32309)

Co-authored-by: zsfelfoldi <[email protected]>

* go.mod: upgraded github.com/golang-jwt/jwt/v4 v4.5.1 => v4.5.2 (#32356)

https://pkg.go.dev/vuln/GO-2025-3553

* rpc: use reflect.TypeFor (#32316)

* crypto/kzg4844: use reflect.TypeFor (#32319)

* common, common/hexutil: use reflect.TypeFor (#32321)

* beacon/merkle: use reflect.TypeFor (#32322)

* core: use reflect.TypeFor (#32320)

https://github.com/golang/go/issues/60088

* p2p/enode: use atomic.Pointer in LocalNode (#32360)

* signer/core/apitypes: simplify reflect []byte creation (#32315)


Co-authored-by: Felix Lange <[email protected]>

* rlp: use reflect.TypeFor (#32317)


Co-authored-by: Felix Lange <[email protected]>

* eth/downloader: fix incomplete code comment  (#32354)

* metrics: use atomic.Pointer in runtimeHistogram (#32361)

Co-authored-by: Felix Lange <[email protected]>

* core/vm: fold EVMInterpreter into EVM (#32352)

The separation serves no purpose atm, and the circular dependency that
EVM and EVMInterpreter had was begging for them to be merged.

* ethclient: fix flaky pending tx test (#32380)

Fixes: https://github.com/ethereum/go-ethereum/issues/32252

* ethdb/leveldb: check iterator error in Database.DeleteRange (#32384)

Add missing it.Error() check after iteration in Database.DeleteRange to
avoid silently ignoring iterator errors before writing the batch.

Aligns behavior with batch.DeleteRange, which already validates iterator
errors. No other functional changes; existing tests pass (TestLevelDB).

* core/vm: make types consistent in makeDup (#32378)

* miner: remove todo comment (#32389)

see
https://github.com/ethereum/go-ethereum/pull/32372#discussion_r2265885182

* downloader: fix comment (#32382)

The previous comment stated that every 3rd block has a tx and every 5th
has an uncle.
The implementation actually adds one transaction to every second block
and does not add uncles.
Updated the comment to reflect the real behavior to avoid confusion when
reading tests.

* accounts/abi, accounts/keystore: use reflect.TypeFor (#32323)


Co-authored-by: Felix Lange <[email protected]>

* eth/downloader: skip nil peer in GetHeader (#32369)

The GetHeader function was incorrectly returning an error when
encountering nil peers in the peers list, which contradicted the comment 
"keep retrying if none are yet available". 

Changed the logic to skip nil peers with 'continue' instead of returning
an error, allowing the function to properly iterate through all
available peers and attempt to retrieve the target header from each valid peer.

This ensures the function behaves as intended - trying all available
peers before giving up, rather than failing on the first nil peer encountered.

* trie, core: rework tracer and track origin value of dirty nodes (#32306)

These changes made in the PR should be highlighted here

The trie tracer is split into two distinct structs: opTracer and prevalueTracer. 
The former is specific to MPT, while the latter is generic and applicable to all
trie implementations.

The original values of dirty nodes are tracked in a NodeSet. This serves
as the foundation for both full archive node implementations and the state live
tracer.

* consensus: fix ambiguous invalid gas limit error (#32405)

## Description

Correct symmetric tolerance in gas limit validation:
Replace ambiguous "+-=" with standard "+/-" in the error message.
Logic rejects when |header − parent| ≥ limit, so allowed range is |Δ| ≤
limit − 1.

No logic or functionality has been modified.

* metrics: Block Basefee (#658)

* basefee metric

* Handle nil basefee for before london hf

* Update forkdiff

* trie: refactor to use slices.Concat (#32401)

* cmd: fix inconsistent function name in comment (#32411)

fix inconsistent function name in comment

Signed-off-by: youzichuan <[email protected]>

* eth: abort `requiredBlocks` check if peer handler terminated (#32413)

* node: remove unused err var (#32398)

* rlp: optimize intsize (#32421)

goos: darwin
goarch: arm64
pkg: github.com/ethereum/go-ethereum/rlp
cpu: Apple M4
        │   old.txt   │               new.txt               │
        │   sec/op    │   sec/op     vs base                │
Intsize   2.175n ± 5%   1.050n ± 4%  -51.76% (p=0.000 n=10)

* eth/tracers: Adds codeHash to prestateTracer's response (#32391)

**Problem:** Including full account code in prestateTracer response
significantly increases response payload size.

**Solution:** Add codeHash field to the response. This will allow
client-side bytecode caching and is a non-breaking change.

**Note:** codeHash for EoAs is excluded to save space.

---------

Co-authored-by: Sina Mahmoodi <[email protected]>

* eth/syncer: fix typo (#32427)

avaibale -> available

* p2p: refactor to use time.Now().UnixMilli() in golang std lib (#32402)

* .github: upgrade workflows to Go 1.25 (#32425)

* build: upgrade -dlgo version to Go 1.25.0 (#32412)

* crypto/secp256k1: use ReadBits from common/math (#32430)

* build: remove unused functions (#32393)

* catalyst/api: centralize OPStack validation into helper functions (#592)

* catalyist/api: centralize OPStack validation into helper functions

located in a seperate file for a cleaner diff to upstream

* add test coverage for optimism validation checks

return unadorned errors from helper and allow caller to wrap

* lint

* use engine.InvalidPayloadAttributes.With() for all failed optimism FCU checks

* typos

* fix: only check optimism payload attributes if they are not nil

* combine conditions

* move test

* combine checks

* add check on withdrawals root from canyon to isthmus

* lint

* trie, core/state: add the transition tree (verkle transition part 2) (#32366)

This add some of the changes that were missing from #31634. It
introduces the `TransitionTrie`, which is a façade pattern between the
current MPT trie and the overlay tree.

---------

Signed-off-by: Guillaume Ballet <[email protected]>
Co-authored-by: rjl493456442 <[email protected]>

* cmd/evm: use PathScheme in blockrunner (#32444)

This is a preparatory change for Verkle/binary trees, since they don't
support the hash-based database scheme. This has no impact on the MPT.

* core/vm: refactor to use bitutil.TestBytes (#32434)

* crypto/bn256: refactor to use bitutil.TestBytes (#32435)

* consensus/misc/eip4844: use blob parameters of current header (#32424)

This changes the implementation to resolve the blob parameters according
to the current header timestamp. This matters for EIP-7918, where we
would previously resolve the UpdateFraction according to the parent
header fork, leading to a confusing situation at the fork transition
block.

---------

Co-authored-by: MariusVanDerWijden <[email protected]>

* rlp: remove workaround for Value.Bytes (#32433)

As of Go 1.19, it is permitted to call Bytes() on a reflect.Value
representing an adressable byte array. So we can remove our workaround,
undoing #22924.

https://go.dev/doc/go1.19#reflectpkgreflect

> The method [Value.Bytes](https://go.dev/pkg/reflect/#Value.Bytes) now
accepts addressable arrays in addition to slices.

* core/vm: fix EIP-7823 modexp input length check (#32363)

The order of the checks was wrong which would have allowed a call to
modexp with `baseLen == 0 && modLen == 0` post fusaka.

Also handles an edge case where base/mod/exp length >= 2**64

---------

Co-authored-by: Felix Lange <[email protected]>

* metrics: add tinygo build flag for CPU time (#32454)

* core/rawdb: add non-unix alternative for tablewriter (#32455)

Continuation of https://github.com/ethereum/go-ethereum/issues/32022

tablewriter assumes unix or windows, which may not be the case for
embedded targets.

For v0.0.5 of tablewriter, it is noted in table.go: "The protocols were
written in pure Go and works on windows and unix systems"

---------

Co-authored-by: rjl493456442 <[email protected]>

* eth/syncer: stop ticker to prevent resource leak (#32443)

* core/rawdb: enhance database key construction (#32431)

* rpc: add SetWebsocketReadLimit in Server (#32279)

Exposing the public method to setReadLimits for Websocket RPC to
prevent OOM.

Current, Geth Server is using a default 32MB max read limit (message
size) for websocket, which is prune to being attacked for OOM. Any one
can easily launch a client to send a bunch of concurrent large request
to cause the node to crash for OOM. One example of such script that can
easily crash a Geth node running websocket server is like this:

https://gist.githubusercontent.com/DeltaXV/b64d221e342e9c1ec6c99c1ab8201544/raw/ec830979ac9a707d98f40dfcc0ce918fc8fb9057/poc.go

---------

Co-authored-by: Felix Lange <[email protected]>

* CODEOWNERS: add gballet as the owner of trie package (#32466)

* ethclient/gethclient: use common.Hash to debug_traceTransaction (#32404)

* graphql: add query depth limit to prevent DoS attacks (#32344)

## Summary

This PR addresses a DoS vulnerability in the GraphQL service by
implementing a maximum query depth limit. While #26026 introduced
timeout handling, it didn't fully mitigate the attack vector where
deeply nested queries can still consume excessive CPU and memory
resources before the timeout is reached.

## Changes
- Added `maxQueryDepth` constant (set to 20) to limit the maximum
nesting depth of GraphQL queries
- Applied the depth limit using `graphql.MaxDepth()` option when parsing
the schema
- Added test case `TestGraphQLMaxDepth` to verify that queries exceeding
the depth limit are properly rejected

## Security Impact

Without query depth limits, malicious actors could craft deeply nested
queries that:
  - Consume excessive CPU cycles during query parsing and execution
  - Allocate large amounts of memory for nested result structures
- Potentially cause service degradation or outages even with timeout
protection

This fix complements the existing timeout mechanism by preventing
resource-intensive queries from being executed in the first place.

## Testing

Added `TestGraphQLMaxDepth` which verifies that queries with nesting
depth > 20 are rejected with a `MaxDepthExceeded` error.

## References
  - Original issue: #26026
- Related security best practices:
https://www.howtographql.com/advanced/4-security/

---------

Co-authored-by: Felix Lange <[email protected]>

* p2p: update MaxPeers comment (#32414)

* eth/catalyst: return methods by reflect (#32300)

Return the exposed methods in `ConsensusAPI` by reflection.

* internal/ethapi, miner: fix GetBlockReceipts for pending (#32461)

* trie, core/state: introduce trie Prefetch for optimizing preload (#32134)

This pull introduces a `Prefetch` operation in the trie to prefetch trie
nodes in parallel. It is used by the `triePrefetcher` to accelerate state 
loading and improve overall chain processing performance.

* beacon/engine,eth/catalyst: Fix engine API checks and exec payload creation (#662)

* p2p: using math.MaxInt32 from go std lib (#32357)

Co-authored-by: Felix Lange <[email protected]>

* rlp: refactor to use maths.ReadBits (#32432)

* fixes missing protection of nil pointer dereference in scwallet (#32186)

Fixes #32181

Signed-off-by: kapil <[email protected]>

* accounts/usbwallet: correct version comparison logic (#32417)

## Description

This PR fixes a bug in the Ledger hardware wallet version validation
logic for EIP-155 transaction signing. The original condition
incorrectly allowed older versions that don't support EIP-155 such as
0.9.9 and 0.1.5 to proceed.

* p2p: remove todo comment, as it's unnecessary (#32397)

as metioned in https://github.com/ethereum/go-ethereum/pull/32351, I
think this comment is unnecessary.

* core/types: reduce allocations for transaction comparison (#31912)

This PR should reduce overall allocations of a running node by ~10
percent. Since most allocations are coming from the re-heaping of the
transaction pool.

```
(pprof) list EffectiveGasTipCmp
Total: 38197204475
ROUTINE ======================== github.com/ethereum/go-ethereum/core/types.(*Transaction).EffectiveGasTipCmp in github.com/ethereum/go-ethereum/core/types/transaction.go
         0 3766837369 (flat, cum)  9.86% of Total
         .          .    386:func (tx *Transaction) EffectiveGasTipCmp(other *Transaction, baseFee *big.Int) int {
         .          .    387: if baseFee == nil {
         .          .    388:  return tx.GasTipCapCmp(other)
         .          .    389: }
         .          .    390: // Use more efficient internal method.
         .          .    391: txTip, otherTip := new(big.Int), new(big.Int)
         . 1796172553    392: tx.calcEffectiveGasTip(txTip, baseFee)
         . 1970664816    393: other.calcEffectiveGasTip(otherTip, baseFee)
         .          .    394: return txTip.Cmp(otherTip)
         .          .    395:}
         .          .    396:
         .          .    397:// EffectiveGasTipIntCmp compares the effective gasTipCap of a transaction to the given gasTipCap.
         .          .    398:func (tx *Transaction) EffectiveGasTipIntCmp(other *big.Int, baseFee *big.Int) int {
```

This PR reduces the allocations for comparing two transactions from 2 to
0:
```
goos: linux
goarch: amd64
pkg: github.com/ethereum/go-ethereum/core/types
cpu: Intel(R) Core(TM) Ultra 7 155U
                               │ /tmp/old.txt │            /tmp/new.txt             │
                               │    sec/op    │   sec/op     vs base                │
EffectiveGasTipCmp/Original-14    64.67n ± 2%   25.13n ± 9%  -61.13% (p=0.000 n=10)

                               │ /tmp/old.txt │            /tmp/new.txt            │
                               │     B/op     │   B/op     vs base                 │
EffectiveGasTipCmp/Original-14     16.00 ± 0%   0.00 ± 0%  -100.00% (p=0.000 n=10)

                               │ /tmp/old.txt │            /tmp/new.txt             │
                               │  allocs/op   │ allocs/op   vs base                 │
EffectiveGasTipCmp/Original-14     2.000 ± 0%   0.000 ± 0%  -100.00% (p=0.000 n=10)
```

It also speeds up the process by ~60%

There are two minor caveats with this PR:
- We change the API for `EffectiveGasTipCmp` and `EffectiveGasTipIntCmp`
(which are probably not used by much)
- We slightly change the behavior of `tx.EffectiveGasTip` when it
returns an error. It would previously return a negative number on error,
now it does not (since uint256 does not allow for negative numbers)

---------

Signed-off-by: Csaba Kiraly <[email protected]>
Co-authored-by: Csaba Kiraly <[email protected]>

* triedb/pathdb: improve err message in historical state reader (#32477)

Fixes https://github.com/ethereum/go-ethereum/issues/32474

* core, miner, trie: add metrics tracking state trie depth (#32388)

Co-authored-by: shantichanal <[email protected]>
Co-authored-by: Gary Rong <[email protected]>
Co-authored-by: Guillaume Ballet <[email protected]>

* p2p/discover: add discv5 invalid findnodes result test cases (#32481)

Supersedes #32470.

### What
- snap: shorten stall watchdog in `eth/protocols/snap/sync_test.go` from
1m to 10s.
- discover/v5: consolidate FINDNODE negative tests into a single
table-driven test:
  - `TestUDPv5_findnodeCall_InvalidNodes` covers:
    - invalid IP (unspecified `0.0.0.0`) → ignored
    - low UDP port (`<=1024`) → ignored

### Why
- Addresses TODOs:
  - “Make tests smaller” (reduce long 1m timeout).
- “check invalid IPs”; also cover low port per `verifyResponseNode`
rules (UDP must be >1024).

### How it’s validated
- Test-only changes; no production code touched.
- Local runs:
  - `go test ./p2p/discover -count=1 -timeout=300s` → ok
  - `go test ./eth/protocols/snap -count=1 -timeout=600s` → ok
- Lint:
  - `go run build/ci.go lint` → 0 issues on modified files.

### Notes
- The test harness uses `enode.ValidSchemesForTesting` (which includes
the “null” scheme), so records signed with `enode.SignNull` are
signature-valid; failures here are due to IP/port validation in
`verifyResponseNode` and `netutil.CheckRelayAddr`.
- Tests are written as a single table-driven function for clarity; no
helpers or environment switching.

---------

Co-authored-by: lightclient <[email protected]>

* node: fix vhosts for adminAPI (#32488)

* core,trie: fix typo in TransitionTrie (#32491)

Change `NewTransitionTree` to the correct `NewTransitionTrie`.

Signed-off-by: pxwanglu <[email protected]>

* .github/workflows: naive PR format checker (#32480)

Full disclosure: this has been generated by AI. The goal is to have a
quick check that the PR format is correct, before we merge it. This is
to avoid the periodical case when someone forgets to add a milestone or
check the title matches our preferred format.

* p2p: use slices.Clone (#32428)

Replaces a helper method with slices.Clone

* eth/protocols/eth: Handle DepositTx Receipts

* eth: Catch nil chainViews in backend filter maps update

* params: fix history serve window for verkle test (#32127)

Fixes the history serve window parameter for the
test function `getContractStoredBlockHash`.

Fixes #32458.

* eth/tracers: add missing teardown in TestTraceChain (#32472)

The TestTraceChain function was missing a defer backend.teardown() call,
which is required to properly release blockchain resources after test
completion.

---------

Co-authored-by: Sina Mahmoodi <[email protected]>

* internal/web3ext: remove deprecated method debug_seedHash (#32495)

The corresponding function was removed in #27178

* triedb/pathdb: rename history to state history (#32498)

This is a internal refactoring PR, renaming the history to stateHistory.

It's a pre-requisite PR for merging trienode history, avoid the name
conflict.

* build: add support for ubuntu 25.04 (#31666)

* cmd: fix typo in comment (#32501)

The function name in the comment should be `writeErrors` instead of
`writeQueries`.

Signed-off-by: tzchenxixi <[email protected]>

* eth/tracers: fix supply tracer uncle accounting (#31882)

Uncle rewards were being omitted in the supply tracer due
to a bug. This PR fixes that.

---------

Co-authored-by: Sina Mahmoodi <[email protected]>

* triedb/pathdb: refactor state history write (#32497)

This pull request refactors the internal implementation in path database
a bit, specifically:

- purge the state index data in batch
- simplify the logic of state history construction and index, make it more readable

* rpc: refactor read limit test (#32494)

closes #32240 #32232

The main cause for the time out is the slow json encoding of large data.
In #32240 they tried to resolve the issue by reducing the size of the
test. However as Felix pointed out, the test is still kind of confusing.

I've refactored the test so it is more understandable and have reduced
the amount of data needed to be json encoded. I think it is still
important to ensure that the default read limit is not active, so I have
retained one large (~32 MB) test case, but it's at least smaller than
the existing ~64 MB test case.

* eth: replace hardcoded sleep with polling loop in snap sync test (#32499)

Replace hardcoded 5-second sleep with polling loop that actively checks
snap sync state. This approach is already used in other project tests
(like account_cache_test.go) and provides better reliability by:

- Reducing flaky behavior on slower systems
- Finishing early when sync completes quickly
- Using 1-second timeout with 100ms polling intervals

---------

Co-authored-by: lightclient <[email protected]>

* internal/ethapi: fix precompile override for eth_estimateGas (#31795)

Fix and close https://github.com/ethereum/go-ethereum/issues/31719.

---------

Co-authored-by: Sina Mahmoodi <[email protected]>

* accounts/abi: fix panic when check event with log has empty or nil topics (#32503)

When the log has empty or nil topics, the generated bindings code will
panic when accessing `log.Topics[0]`, add a check to avoid it.

* core, internal, miner, signer: convert legacy sidecar in Osaka fork (#32347)

This pull request implements #32235 , constructing blob sidecar in new
format (cell proof)
if the Osaka has been activated.

Apart from that, it introduces a pre-conversion step in the blob pool
before adding the txs.
This mechanism is essential for handling the remote **legacy** blob txs
from the network.

One thing is still missing and probably is worthy being highlighted
here: the blobpool may
contain several legacy blob txs before the Osaka and these txs should be
converted once
Osaka is activated. While the `GetBlob` API in blobpool is capable for
generating cell proofs
at the runtime, converting legacy txs at one time is much cheaper
overall.

---------

Co-authored-by: MariusVanDerWijden <[email protected]>
Co-authored-by: lightclient <[email protected]>

* eth/tracers: fix testcase 7702_delegate (#32349)

Fixes a prestateTracer test case covering 7702 delegation.

---------

Co-authored-by: Jared Wasinger <[email protected]>
Co-authored-by: Sina Mahmoodi <[email protected]>

* node: fix problematic function name in comment (#32510)

fix problematic function name in comment

Signed-off-by: slicesequal <[email protected]>

* eth: stabilize tx relay peer selection (#31714)

When maxPeers was just above some perfect square, and a few peers
dropped for some reason, we changed the peer selection function.
When new peers were acquired, we changed again.

This PR improves the selection function, in two ways. First, it will always select
sqrt(peers) to broadcast to. Second, the selection now uses siphash with a secret
key, to guard against information leaks about tx source.

---------

Signed-off-by: Csaba Kiraly <[email protected]>
Co-authored-by: Felix Lange <[email protected]>

* core: improve error context in state processor for Prague EIPs (#32509)

Add better error context for EIP-6110, EIP-7002, and EIP-7251 processing
in state processor to improve debugging capabilities.

* all: fix problematic function name in comment (#32513)

Fix problematic function name in comment.
Do my best to correct them all with a script to avoid spamming PRs.

* triedb/pathdb, core: keep root->id mappings after truncation (#32502)

This pull request preserves the root->ID mappings in the path database
even after the associated state histories are truncated, regardless of
whether the truncation occurs at the head or the tail.

The motivation is to support an additional history type, trienode history. 
Since the root->ID mappings are shared between two history instances, 
they must not be removed by either one.

As a consequence, the root->ID mappings remain in the database even
after the corresponding histories are pruned. While these mappings may 
become  dangling, it is safe and cheap to keep them.

Additionally, this pull request enhances validation during historical
reader construction, ensuring that only canonical historical state will be
served.

* README: add twitter badge to documentation (#32516)

* core/rawdb: inspect database in parallel (#32506)

`db inspect` on the full database currently takes **30min+**, because
the db iterate was run in one thread, propose to split the key-space to
256 sub range, and assign them to the worker pool to speed up.

After the change, the time of running `db inspect --workers 16` reduced
to **10min**(the keyspace is not evenly distributed).

---------

Signed-off-by: jsvisa <[email protected]>
Co-authored-by: Gary Rong <[email protected]>

* all: improve ETA calculation across all progress indicators (#32521)

### Summary
Fixes long-standing ETA calculation errors in progress indicators that
have been present since February 2021. The current implementation
produces increasingly inaccurate estimates due to integer division
precision loss.

### Problem

https://github.com/ethereum/go-ethereum/blob/3aeccadd04aee2d18bdb77826f86b1ca000d3b67/triedb/pathdb/history_indexer.go#L541-L553
The ETA calculation has two critical issues:
1. **Integer division precision loss**: `speed` is calculated as
`uint64`
2. **Off-by-one**: `speed` uses `+ 1`(2 times) to avoid division by
zero, however it makes mistake in the final calculation

This results in wildly inaccurate time estimates that don't improve as
progress continues.

### Example
Current output during state history indexing:
```
lvl=info msg="Indexing state history" processed=16858580 left=41802252 elapsed=18h22m59.848s eta=11h36m42.252s
```

**Expected calculation:**
- Speed: 16858580 ÷ 66179848ms = 0.255 blocks/ms  
- ETA: 41802252 ÷ 0.255 = ~45.6 hours

**Current buggy calculation:**
- Speed: rounds to 1 block/ms
- ETA: 41802252 ÷ 1 = ~11.6 hours ❌

### Solution
- Created centralized `CalculateETA()` function in common package
- Replaced all 8 duplicate code copies across the codebase

### Testing
Verified accurate ETA calculations during archive node reindexing with
significantly improved time estimates.

* core/stateless: only report leaf depth in witness stats (#32507)

Filtering for leaf nodes was missing from #32388, which means that even
the root done was reported, which made little sense for the bloatnet
data processing we want to do.

* trie/bintrie: add eip7864 binary trees and run its tests (#32365)

Implement the binary tree as specified in [eip-7864](https://eips.ethereum.org/EIPS/eip-7864). 

This will gradually replace verkle trees in the codebase. This is only 
running the tests and will not be executed in production, but will help 
me rebase some of my work, so that it doesn't bitrot as much.

---------

Signed-off-by: Guillaume Ballet
Co-authored-by: Parithosh Jayanthi <[email protected]>
Co-authored-by: rjl493456442 <[email protected]>

* internal/ethapi,params: add `eth_config` (#32239)

~Will probably be mostly supplanted by #32224, but this should do for
now for devnet 3.~

Seems like #32224 is going to take some more time, so I have completed
the implementation of eth_config here. It is quite a bit simpler to
implement now that the config hashing was removed.

---------

Co-authored-by: MariusVanDerWijden <[email protected]>
Co-authored-by: Guillaume Ballet <[email protected]>
Co-authored-by: rjl493456442 <[email protected]>

* version: release v1.16.3

* feat: bump superchain registry (#669)

* ci: Update forkdiff version to v0.1.1 (#670)

* feat: introduce minimum base fee (#666)

* add minBaseFee to superchain/types and Jovian to params/config

* extend extraData header field

* validate/encode eip1559

* spike add jovian 1559 tests

* update calcBaseFee test and fix logic for calcBaseFee

* update comment

* validate params should be 9 not 10

* dont leave out version byte in extraData

* 0 minbasefee is valid

* dont need default minBaseFee

* add test that fails for curr impl

* do one check at the end to enforce minBaseFee

* 9 bytes not 10 in validate err msg

* extend coverage

* nits

* fix test

* use feature naming and assume eip1559params 8bytes still

* best effort decode

* feature flag

* nits

* handle FCU and payload building args properly

* have payload building test support holocene still

* nits + fix api payload fcu

* use option A of feature flag + nits

* Switch from log2 to significand + exponent for min base fee

* Clear out the higher 4 bits of the significand

* Add encode/decode helpers for min base fee factors

* Remove the check for a blank min base fee

* bit manipulation change

* eth/catalyst: fix ExtraData validation for Jovian min base fee; add tests

* use u64 approach

* feedback + add specs link

* use more compact syntax

* move expectation to end of struct

* combine tests

* rename feature flag

* add new optimism-specific file with general validation and decoding functions

* move optimism specific code to new file

* remove validation and add comments

validation is done in catalyst/api

* remove feature flags altogether

* remove validation from decoding fn

* fix and use generic extradata validation fn

* add comments

* finish removing feature flag

* fix tests

* Apply suggestions from code review

* add spec link

* use inline fn to clean up diff to upstream

* add test cases and factor into subtests with require statement

* tidy up jovianConfig() helper and rename a test

* Introduce Holocene/JovianExtraDataVersionByte

* tweak

* consistency

* rename minbasefee to jovian in validation fn error msg

* assert holocene params in payload_building_test.go

* fix regression

* use ptr for MinBaseFee in PayloadAttributes

* eip1559_optimism: have Validate/DecodeOptimismExtraData take a ForkChecker interface and return a *uint64 for MinBaseFee

* introduce EncodeOptimismExtraData

* lint (whitespace only)

* fix pointer comparison in assertion

* add test for determinism of payload id

* dereference pointer when computing ID

This is not strictly necessary, but it is clearer.

* use eip1559.DecodeOptimismExtraData in test

and extend coverage to missing minbasefee

* Update consensus/misc/eip1559/eip1559_optimism.go

Co-authored-by: Sebastian Stammler <[email protected]>

* use isOptimismHolocene in CalcBaseFee and document assumption about extraData validity

* TestBuildPatload: use nil minBaseFee expectation preJovian

* rework closure to reduce diff to upstream

* remove empty line

---------

Co-authored-by: William Law <[email protected]>
Co-authored-by: Niran Babalola <[email protected]>
Co-authored-by: Sebastian Stammler <[email protected]>

* jovian: make isthmus gas params extraction forward-compatible (#671)

* sync-superchain: Handle case where skipped genesis file doesn't exist. (#673)

* feat: bump superchain registry to include arena-z sepolia isthmus hardfork (#678)

* chore(superchain-registry): bump version for addresses cleanup (#672)

* eth/downloader: Fix deposit receipt correction (#680)

* all: Introduce feature toggles for Jovian (#677)

* introduce IsMinBaseFee feature toggle

Allows feature to be easily removed from Jovian hardfork.
When the hardfork scope is locked, this commit can be reverted.

* decouple features

* add isOperatorFeeFix toggle

* Remove approval hold job from release workflow (#683)

Removed approval hold job from release process in CircleCI config.

* params: add bpo forks to eth_config (#32579)

BPO forks should also be included in eth_config response.

* params: schedule Osaka/BPO1/BPO2 for testnets (#32735)

Timestamps taken from:

- Holesky:
https://github.com/eth-clients/holesky/blob/main/metadata/genesis.json
- Sepolia:
https://github.com/eth-clients/sepolia/blob/main/metadata/genesis.json
- Hoodi:
https://github.com/eth-clients/hoodi/blob/main/metadata/genesis.json

* core,miner,parms: DA footprint block limit (constant gas scalar) (#655)

* all: Make DA footprint gas scalar configurable (#675)

Co-authored-by: Sebastian Stammler <[email protected]>

* core/types: implement operator fee fix (Jovian) (#696)

* fix!: multiply operatorFeeScalar by 100 instead of dividing by 1e6

* apply comments

* apply comments

* remove dup IsOperatorFeeFix

---------

Co-authored-by: fakedev9999 <[email protected]>

* consensus/beacon: Fix OP Legacy header verification dispatch (#697)

* all: Store DA footprint in blob gas used header field (#694)

* all: update c-kzg-4844 to 2.1.5 (#702)

* superchain: update scr import to include worldchain-sepolia isthmus time (#704)

* core: add gauge metrics + histograms for block gas used and blob gas used (#705)

* core: add gauge metric for block gas used and blob gas used

This can be used to track the DA footprint per block

* encapsulate OPStack additions into new file and function

* add histogram metrics for (blob)GasUsed

* update fork.yaml

* typos

* superchain: update scr import to include jovian activation timestamp (#707)

* Add new precompile limits for Jovian (#709)

This introduces more realistic limits on accelerated precompiles for the Jovian hard fork.

* superchain: Update for new Jovian timestamps (#712)

* core/types: Populate Jovian receipt fields (#710)

* core/types: Move receipt tests OP diff to separate file

* core/types: Populate Jovian receipt fields

* core/txpool/blobpool: migrate billy to new slot size (#31966)

Implements a migration path for the blobpool slotter

---------

Co-authored-by: lightclient <[email protected]>
Co-authored-by: lightclient <[email protected]>
Co-authored-by: Gary Rong <[email protected]>

* params: set osaka and BPO1 & BPO2 mainnet dates (#33063)

Sets the fusaka, bpo1, bpo2 timestamps for mainnet
see: https://notes.ethereum.org/@bbusa/fusaka-bpo-timeline

* superchain: update for new Jovian timestamps (#716)

* triedb/pathdb: sync ancient store before journal (#32557) (#718)

This pull request addresses the corrupted path database with log
indicating:
`history head truncation out of range, tail: 122557, head: 212208,
target: 212557`

This is a rare edge case where the in-memory layers, including the write
buffer
in the disk layer, are fully persisted (e.g., written to file), but the
state history
freezer is not properly closed (e.g., Geth is terminated after
journaling but
before freezer.Close). In this situation, the recent state history
writes will be
truncated on the next startup, while the in-memory layers resolve
correctly.
As a result, the state history falls behind the disk layer (including
the write buffer).

In this pull request, the state history freezer is always synced before
journal,
ensuring the state history writes are always persisted before the
others.

Edit: 
It's confirmed that devops team has 10s container termination setting.
It
explains why Geth didn't finish the entire termination without state
history
being closed.

https://github.com/ethpandaops/fusaka-devnets/pull/63/files

Co-authored-by: rjl493456442 <[email protected]>

* finalize merge of v1.101603.4

* checkpoint

* fixed tests besides one

* remove pr validation, I don't think it's used by us

* fix test broken with upstream pull merge

* added forgotten options

* Additional Logging

* Additional Logging

* Go generate

* logging around time overrides

* add overrides to new struct

* revert gen receipts go file

* don't modify map

* correct comparison

* Logging

* More logging

* Short-circuit modern signer's tx.From extraction for PoP / BTC Attr Dep

* Short-circuit modern signer's tx.From extraction for PoP / BTC Attr Dep

* Short-circuit modern signer's tx.From extraction for PoP / BTC Attr Dep

* Logging

* Do not pre-populate precompiles for gas calculation, remove some logging

* Remove precompile prepare logging

* Remove gas param logging

---------

Signed-off-by: jsvisa <[email protected]>
Signed-off-by: Guillaume Ballet <[email protected]>
Signed-off-by: youzichuan <[email protected]>
Signed-off-by: kapil <[email protected]>
Signed-off-by: Csaba Kiraly <[email protected]>
Signed-off-by: pxwanglu <[email protected]>
Signed-off-by: tzchenxixi <[email protected]>
Signed-off-by: slicesequal <[email protected]>
Signed-off-by: Guillaume Ballet
Co-authored-by: rjl493456442 <[email protected]>
Co-authored-by: zsfelfoldi <[email protected]>
Co-authored-by: Marius van der Wijden <[email protected]>
Co-authored-by: Zhou <[email protected]>
Co-authored-by: Felix Lange <[email protected]>
Co-authored-by: Ömer Faruk Irmak <[email protected]>
Co-authored-by: Giulio rebuffo <[email protected]>
Co-authored-by: spencer-tb <[email protected]>
Co-authored-by: maskpp <[email protected]>
Co-authored-by: Sina M <[email protected]>
Co-authored-by: Ulaş Erdoğan <[email protected]>
Co-authored-by: jwasinger <[email protected]>
Co-authored-by: lightclient <[email protected]>
Co-authored-by: Axel Kingsley <[email protected]>
Co-authored-by: Jacob Elias <[email protected]>
Co-authored-by: CrazyFrog <[email protected]>
Co-authored-by: Niran Babalola <[email protected]>
Co-authored-by: Mark Tyneway <[email protected]>
Co-authored-by: PixelPilot <[email protected]>
Co-authored-by: kilavvy <[email protected]>
Co-authored-by: Karl Bartel <[email protected]>
Co-authored-by: Bosul Mun <[email protected]>
Co-authored-by: George Knee <[email protected]>
Co-authored-by: FT <[email protected]>
Co-authored-by: Delweng <[email protected]>
Co-authored-by: asamuj <[email protected]>
Co-authored-by: Maxim Evtush <[email protected]>
Co-authored-by: CertiK-Geth <[email protected]>
Co-authored-by: steven <[email protected]>
Co-authored-by: shazam8253 <[email protected]>
Co-authored-by: shantichanal <[email protected]>
Co-authored-by: kourin <[email protected]>
Co-authored-by: Sam Stokes <[email protected]>
Co-authored-by: Micke <[email protected]>
Co-authored-by: gzeon <[email protected]>
Co-authored-by: nthumann <[email protected]>
Co-authored-by: Galoretka <[email protected]>
Co-authored-by: ericxtheodore <[email protected]>
Co-authored-by: Tomás Andróil <[email protected]>
Co-authored-by: kashitaka <[email protected]>
Co-authored-by: Daniel Katzan <[email protected]>
Co-authored-by: cui <[email protected]>
Co-authored-by: lmittmann <[email protected]>
Co-authored-by: lmittmann <lm…
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants