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
- Attach the resolver to the underlying iterators before wrapping them in the difference iterator.
- Type-switch on the iterator and skip AddResolver for difference iterators.
- 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
- Install resolvers on source iterators before wrapping them in difference/union iterators.
- Keep a list of iterator kinds that support AddResolver when writing generic traversal code.
- Check the codebase for 'not implemented' panics before relying on optional iterator APIs.
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.