ethereum/go-ethereum · error

UpdateStem is not implemented for TransitionTrie

Error message

UpdateStem is not implemented for TransitionTrie

What it means

Error "UpdateStem is not implemented for TransitionTrie" thrown in ethereum/go-ethereum.

Solutions

  1. TransitionTrie.UpdateStem is not implemented. Apply stem updates to the underlying Verkle (overlay) trie directly instead of through the TransitionTrie wrapper.

Example fix

// Update the overlay verkle trie stem-by-stem:
overlay := tt.Overlay()
if err := overlay.UpdateStem(stem, values); err != nil { return err }

When it happens

Trigger: Calling UpdateStem on a TransitionTrie; the method is a Verkle-specific stub on the transition wrapper.

Common situations: Experimental Verkle transition tooling touching stems via the transition abstraction.


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

Appendix: source

Thrown at trie/transitiontrie/transition.go:245

// If the trie does not contain a value for key, the returned proof contains all
// nodes of the longest existing prefix of the key (at least the root), ending
// with the node that proves the absence of the key.
func (t *TransitionTrie) Prove(key []byte, proofDb ethdb.KeyValueWriter) error {
	panic("not implemented") // TODO: Implement
}

// IsUBT returns true if the trie is verkle-tree based
func (t *TransitionTrie) IsUBT() bool {
	// For all intents and purposes, the calling code should treat this as a verkle trie
	return true
}

// UpdateStem updates a group of values, given the stem they are using. If
// a value already exists, it is overwritten.
// TODO: This is Verkle-specific and requires access to private fields.
// Not currently used in the codebase.
func (t *TransitionTrie) UpdateStem(key []byte, values [][]byte) error {
	panic("UpdateStem is not implemented for TransitionTrie")
}

// Copy creates a deep copy of the transition trie.
func (t *TransitionTrie) Copy() *TransitionTrie {
	return &TransitionTrie{
		overlay: t.overlay.Copy(),
		// base in immutable, so there is no need to copy it
		base:    t.base,
		storage: t.storage,
	}
}

// UpdateContractCode updates the contract code for the given address.
func (t *TransitionTrie) UpdateContractCode(addr common.Address, codeHash common.Hash, code []byte) error {
	return t.overlay.UpdateContractCode(addr, codeHash, code)
}

// Witness returns a set containing all trie nodes that have been accessed.

View on GitHub (pinned to 6bb0588ad8)