go-ethereum/core/state
CPerezz 29ef7576d9
core/state: hook leaf production in binaryHasher
binaryHasher now implements the new LeafProducer optional extension to
the Hasher interface. Every UpdateAccount, UpdateStorage, and delete
path records the corresponding (stem, offset, value) write into an
internal buffer, which the caller drains once per block via
DrainStemWrites() and hands to the pathdb flat-state layer through the
stateUpdate (wired up in the next commit).

Three kinds of writes are recorded:

  - Account create/update: two writes (BasicData at offset 0,
    CodeHash at offset 1), sharing the same 31-byte stem. BasicData
    is produced via bintrie.PackBasicData so the flat-state blob
    is bit-identical to what the trie layer packs internally.

  - Storage update: one write per slot. Non-zero values become
    right-justified 32-byte blobs; the zero value (the bintrie's
    "delete" convention) becomes 32 zero bytes, matching the trie's
    tombstone-with-zero semantics so the flat-state mirror stays
    bit-identical to the StemNode.Values entry.

  - Account delete: two clear writes (nil Value) for offsets 0 and 1.
    Storage slots and code chunks at the same or other stems are NOT
    touched; pre-EIP-6780 full-wipe is a documented scope limitation.

The LeafProducer interface lives on Hasher and is strictly opt-in —
merkleHasher does not implement it, and callers detect capability via
a type assertion. This keeps the read-side/write-side split of the
existing Hasher cleanly extended: hashers that have a concept of
flat-state leaves can expose them; hashers that don't (MPT) are
unaffected.

Tests cover:

  - TestBinaryHasherLeafProduction: account update produces 2 writes
    at offsets 0+1 with matching stem; drain is destructive; storage
    update emits one matching write; zero-value storage writes 32 zero
    bytes; delete emits 2 clear writes.
  - TestMerkleHasherNoLeafProducer: merkleHasher does NOT satisfy the
    LeafProducer interface (the capability is opt-in per hasher).

The collected stem writes are not yet propagated anywhere — a later
commit wires DrainStemWrites into StateDB.IntermediateRoot so the
writes flow through stateUpdate and the pathdb stateSet into the
flat-state layer.
2026-04-15 15:00:40 +02:00
..
pruner all: improve ETA calculation across all progress indicators (#32521) 2025-09-01 13:47:02 +08:00
snapshot crypto/keccak: vendor in golang.org/x/crypto/sha3 (#33323) 2026-02-03 14:55:27 -07:00
access_events.go trie, go.mod: remove all references to go-verkle and go-ipa (#33461) 2025-12-30 20:44:04 +08:00
access_events_test.go trie, go.mod: remove all references to go-verkle and go-ipa (#33461) 2025-12-30 20:44:04 +08:00
access_list.go core/state: improve accessList copy (#33024) 2025-10-26 16:13:59 +08:00
database.go core/state: improve binary hasher 2026-04-15 15:00:39 +02:00
database_code.go core, miner, tests: introduce codedb and simplify cachingDB (#33816) 2026-03-10 08:29:21 +01:00
database_hasher.go core/state: hook leaf production in binaryHasher 2026-04-15 15:00:40 +02:00
database_hasher_binary.go core/state: hook leaf production in binaryHasher 2026-04-15 15:00:40 +02:00
database_hasher_binary_test.go core/state: hook leaf production in binaryHasher 2026-04-15 15:00:40 +02:00
database_hasher_merkle.go core: fix memory leaking 2026-04-15 15:00:39 +02:00
database_hasher_merkle_test.go core: fix memory leaking 2026-04-15 15:00:39 +02:00
database_history.go core/state: build hasher skeleton 2026-04-15 15:00:38 +02:00
database_iterator.go core/state: introduce state iterator interface (#33102) 2026-04-03 10:35:32 +08:00
database_iterator_test.go core/state: introduce state iterator interface (#33102) 2026-04-03 10:35:32 +08:00
dump.go core/state: build hasher skeleton 2026-04-15 15:00:38 +02:00
iterator.go core, miner, tests: introduce codedb and simplify cachingDB (#33816) 2026-03-10 08:29:21 +01:00
iterator_test.go core/state: state reader abstraction (#29761) 2024-09-05 13:10:47 +03:00
journal.go core: miner: reduce allocations in block building (#33375) 2026-02-03 08:19:16 +01:00
metrics.go core/state: integrate witness collector 2026-04-15 15:00:39 +02:00
reader.go core/state: integrate witness collector 2026-04-15 15:00:39 +02:00
reader_stater.go core, miner, tests: introduce codedb and simplify cachingDB (#33816) 2026-03-10 08:29:21 +01:00
state_mut.go core/state: integrate witness collector 2026-04-15 15:00:39 +02:00
state_object.go core/state: integrate witness collector 2026-04-15 15:00:39 +02:00
state_object_test.go core/state: using testing.B.Loop (#32658) 2025-09-19 16:57:43 -06:00
state_sizer.go core/state: implement merkle hasher 2026-04-15 15:00:38 +02:00
state_sizer_test.go core/state: fix incorrect contract code state metrics (#33376) 2025-12-10 11:33:59 +08:00
state_test.go core, consensus/beacon: defer trie resolution (#31725) 2025-06-25 09:42:11 +08:00
statedb.go core/state: plumb CodeSize through AccountMut for binaryHasher 2026-04-15 15:00:39 +02:00
statedb_fuzz_test.go core/state: improve binary hasher 2026-04-15 15:00:39 +02:00
statedb_hooked.go cmd/geth, core/state, tests: rework EIP7610 check (#34718) 2026-04-14 15:54:36 +02:00
statedb_hooked_test.go core: invoke selfdestruct tracer hooks during finalisation (#32919) 2026-01-16 15:10:08 -07:00
statedb_stats.go core/state: integrate witness collector 2026-04-15 15:00:39 +02:00
statedb_test.go core/state: plumb CodeSize through AccountMut for binaryHasher 2026-04-15 15:00:39 +02:00
stateupdate.go core: fix memory leaking 2026-04-15 15:00:39 +02:00
sync.go core,eth,internal: fix typo (#29024) 2024-02-20 19:42:48 +08:00
sync_test.go core, miner, tests: introduce codedb and simplify cachingDB (#33816) 2026-03-10 08:29:21 +01:00
transient_storage.go core/state: optimize transient storage (#33695) 2026-04-14 15:39:42 +02:00
trie_prefetcher.go core/state: integrate prefetching into merkle hasher 2026-04-15 15:00:38 +02:00
trie_prefetcher_test.go core/state: integrate prefetching into merkle hasher 2026-04-15 15:00:38 +02:00