ethereum/go-ethereum · warning

not implemented

Error message

not implemented

What it means

The difference iterator ( NewDifferenceIterator) does not support attaching a node resolver, so AddResolver panics with 'not implemented'. This iterator wraps two iterators and only exposes pass-through operations; node resolution is not wired through the wrapper.

Source

Thrown at trie/iterator.go:673

func (it *differenceIterator) LeafBlob() []byte {
	return it.b.LeafBlob()
}

func (it *differenceIterator) LeafProof() [][]byte {
	return it.b.LeafProof()
}

func (it *differenceIterator) Path() []byte {
	return it.b.Path()
}

func (it *differenceIterator) NodeBlob() []byte {
	return it.b.NodeBlob()
}

func (it *differenceIterator) AddResolver(resolver NodeResolver) {
	panic("not implemented")
}

func (it *differenceIterator) Next(bool) bool {
	// Invariants:
	// - We always advance at least one element in b.
	// - At the start of this function, a's path is lexically greater than b's.
	if !it.b.Next(true) {
		return false
	}
	it.count++

	if it.eof {
		// a has reached eof, so we just return all elements from b
		return true
	}

	for {
		switch compareNodes(it.a, it.b) {

View on GitHub (pinned to 6bb0588ad8)

Solutions

  1. Attach the resolver to the underlying iterators before wrapping them in the difference iterator.
  2. Type-switch on the iterator and skip AddResolver for difference iterators.
  3. Contribute an implementation upstream if your workflow requires it.

Example fix

// before
it := trie.NewDifferenceIterator(a, b)
it.AddResolver(resolver) // panic

// after
a.AddResolver(resolver)
b.AddResolver(resolver)
it := trie.NewDifferenceIterator(a, b)
Defensive patterns

Strategy: type-guard

Validate before calling

a.AddResolver(resolver) // attach to sources before wrapping
b.AddResolver(resolver)
it := trie.NewDifferenceIterator(a, b)

Type guard

func addResolverSafe(it trie.NodeIterator, r trie.NodeResolver) {
    if _, isDiff := it.(*trie.DifferenceIterator); isDiff {
        return // AddResolver panics: not implemented
    }
    it.AddResolver(r)
}

Prevention

When it happens

Trigger: Calling NewDifferenceIterator(...).AddResolver(db) or passing a difference iterator to generic code that installs a resolver (e.g. witness builders or iterators over remote databases).

Common situations: Reusable traversal utilities that always call AddResolver to enable lazy node loading; running witness/proof collection over a trie difference; code that worked with plain iterators but was switched to difference iteration.

Related errors


AI-assisted analysis of ethereum/go-ethereum@6bb0588ad8 (2026-08-15). Data as JSON: /api/errors/e96e72dbe40123ea. Report an issue: GitHub.