go-ethereum/nomt/core/node.go
weiihann 2db24e85a3 nomt/core: redesign for EIP-7864 compatibility (Phase A)
Replace Keccak256+MSB tagging with SHA256. Remove leaf nodes entirely,
replacing them with opaque stem hashes. Simplify NodeKind to just
Terminator and Internal. Add HashStem (8-level binary SHA256 tree
matching bintrie StemNode.Hash). Reduce max trie depth from 256 to 248
(31-byte stem path). Replace BuildTrie/LeafOp with
BuildInternalTree/StemKeyValue.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-12 21:59:53 +08:00

53 lines
1.8 KiB
Go

// Package core defines the fundamental data structures for a NOMT binary
// merkle trie aligned with EIP-7864. All types are pure computation with
// no I/O dependencies.
package core
// Node is a 256-bit hash representing a node in the binary merkle trie.
// The all-zeros value is reserved as the Terminator (empty sub-trie).
// Unlike the previous NOMT design, there is no MSB tagging — nodes are
// either terminators (zero) or opaque hashes (non-zero).
type Node = [32]byte
// KeyPath is a full 256-bit key (31-byte stem + 1-byte suffix).
// Used for flat state lookups where the full 32-byte key is needed.
type KeyPath = [32]byte
// StemPath is the 248-bit (31-byte) stem portion of a key.
// In the EIP-7864 trie, internal nodes traverse bits 0-247, then
// stem nodes hold 256 value slots indexed by the last byte.
type StemPath = [StemSize]byte
// Terminator is the special node value denoting an empty sub-trie.
// When this appears at a location, no key with a matching path prefix has a value.
var Terminator Node
// NodeKind discriminates the two kinds of trie nodes in the page tree.
type NodeKind int
const (
// NodeTerminator indicates an empty sub-trie (all-zero node).
NodeTerminator NodeKind = iota
// NodeInternal indicates a non-zero hash (internal node or stem hash).
NodeInternal
)
// NodeKindOf returns the kind of the given node.
// In EIP-7864, the page tree only stores terminators and opaque hashes.
func NodeKindOf(n *Node) NodeKind {
if *n == Terminator {
return NodeTerminator
}
return NodeInternal
}
// IsTerminator reports whether the node is the all-zero terminator.
func IsTerminator(n *Node) bool {
return *n == Terminator
}
// InternalData holds the preimage of an internal (branch) node.
type InternalData struct {
Left Node
Right Node
}