trie/bintrie: fix debug_executionWitness for binary tree (#33739)

The `Witness` method was not implemented for the binary tree, which
caused `debug_excutionWitness` to panic. This PR fixes that.

Note that the `TransitionTrie` version isn't implemented, and that's on
purpose: more thought must be given to what should go in the global
witness.
This commit is contained in:
Guillaume Ballet 2026-02-03 12:19:40 +01:00 committed by GitHub
parent 16a6531ac2
commit 19f37003fb
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
2 changed files with 28 additions and 1 deletions

View file

@ -424,5 +424,5 @@ func (t *BinaryTrie) PrefetchStorage(addr common.Address, keys [][]byte) error {
// Witness returns a set containing all trie nodes that have been accessed.
func (t *BinaryTrie) Witness() map[string][]byte {
panic("not implemented")
return t.tracer.Values()
}

View file

@ -22,6 +22,7 @@ import (
"testing"
"github.com/ethereum/go-ethereum/common"
"github.com/ethereum/go-ethereum/trie"
)
var (
@ -195,3 +196,29 @@ func TestMerkleizeMultipleEntries(t *testing.T) {
t.Fatalf("invalid root, expected=%x, got = %x", expected, got)
}
}
func TestBinaryTrieWitness(t *testing.T) {
tracer := trie.NewPrevalueTracer()
tr := &BinaryTrie{
root: NewBinaryNode(),
tracer: tracer,
}
if w := tr.Witness(); len(w) != 0 {
t.Fatal("expected empty witness for fresh trie")
}
tracer.Put([]byte("path1"), []byte("blob1"))
tracer.Put([]byte("path2"), []byte("blob2"))
witness := tr.Witness()
if len(witness) != 2 {
t.Fatalf("expected 2 witness entries, got %d", len(witness))
}
if !bytes.Equal(witness[string([]byte("path1"))], []byte("blob1")) {
t.Fatal("unexpected witness value for path1")
}
if !bytes.Equal(witness[string([]byte("path2"))], []byte("blob2")) {
t.Fatal("unexpected witness value for path2")
}
}