iterator.go 15.9 KB
Newer Older
1
// Copyright 2014 The go-ethereum Authors
2
// This file is part of the go-ethereum library.
3
//
4
// The go-ethereum library is free software: you can redistribute it and/or modify
5 6 7 8
// it under the terms of the GNU Lesser General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
9
// The go-ethereum library is distributed in the hope that it will be useful,
10
// but WITHOUT ANY WARRANTY; without even the implied warranty of
11
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 13 14
// GNU Lesser General Public License for more details.
//
// You should have received a copy of the GNU Lesser General Public License
15
// along with the go-ethereum library. If not, see <http://www.gnu.org/licenses/>.
16

obscuren's avatar
obscuren committed
17
package trie
obscuren's avatar
obscuren committed
18

19 20
import (
	"bytes"
21
	"container/heap"
22
	"errors"
23

24
	"github.com/ethereum/go-ethereum/common"
25
	"github.com/ethereum/go-ethereum/rlp"
26
)
27

28
// Iterator is a key-value trie iterator that traverses a Trie.
obscuren's avatar
obscuren committed
29
type Iterator struct {
30
	nodeIt NodeIterator
obscuren's avatar
obscuren committed
31

32 33
	Key   []byte // Current data key on which the iterator is positioned on
	Value []byte // Current data value on which the iterator is positioned on
34
	Err   error
obscuren's avatar
obscuren committed
35 36
}

37 38 39
// NewIterator creates a new key-value iterator from a node iterator.
// Note that the value returned by the iterator is raw. If the content is encoded
// (e.g. storage value is RLP-encoded), it's caller's duty to decode it.
40
func NewIterator(it NodeIterator) *Iterator {
41 42
	return &Iterator{
		nodeIt: it,
43
	}
obscuren's avatar
obscuren committed
44 45
}

46 47
// Next moves the iterator forward one key-value entry.
func (it *Iterator) Next() bool {
48 49
	for it.nodeIt.Next(true) {
		if it.nodeIt.Leaf() {
50
			it.Key = it.nodeIt.LeafKey()
51
			it.Value = it.nodeIt.LeafBlob()
52
			return true
obscuren's avatar
obscuren committed
53
		}
Felix Lange's avatar
Felix Lange committed
54
	}
55 56
	it.Key = nil
	it.Value = nil
57
	it.Err = it.nodeIt.Error()
58
	return false
obscuren's avatar
obscuren committed
59 60
}

61 62 63 64 65 66
// Prove generates the Merkle proof for the leaf node the iterator is currently
// positioned on.
func (it *Iterator) Prove() [][]byte {
	return it.nodeIt.LeafProof()
}

67 68 69 70 71
// NodeIterator is an iterator to traverse the trie pre-order.
type NodeIterator interface {
	// Next moves the iterator to the next node. If the parameter is false, any child
	// nodes will be skipped.
	Next(bool) bool
72

73 74
	// Error returns the error status of the iterator.
	Error() error
75 76 77

	// Hash returns the hash of the current node.
	Hash() common.Hash
78

79 80 81
	// Parent returns the hash of the parent of the current node. The hash may be the one
	// grandparent if the immediate parent is an internal node with no hash.
	Parent() common.Hash
82

83 84 85 86 87 88 89
	// Path returns the hex-encoded path to the current node.
	// Callers must not retain references to the return value after calling Next.
	// For leaf nodes, the last element of the path is the 'terminator symbol' 0x10.
	Path() []byte

	// Leaf returns true iff the current node is a leaf node.
	Leaf() bool
90 91 92 93

	// LeafKey returns the key of the leaf. The method panics if the iterator is not
	// positioned at a leaf. Callers must not retain references to the value after
	// calling Next.
94
	LeafKey() []byte
95 96 97 98 99 100 101 102 103 104

	// LeafBlob returns the content of the leaf. The method panics if the iterator
	// is not positioned at a leaf. Callers must not retain references to the value
	// after calling Next.
	LeafBlob() []byte

	// LeafProof returns the Merkle proof of the leaf. The method panics if the
	// iterator is not positioned at a leaf. Callers must not retain references
	// to the value after calling Next.
	LeafProof() [][]byte
obscuren's avatar
obscuren committed
105
}
106 107 108 109

// nodeIteratorState represents the iteration state at one particular node of the
// trie, which can be resumed at a later invocation.
type nodeIteratorState struct {
110 111 112
	hash    common.Hash // Hash of the node being iterated (nil if not standalone)
	node    node        // Trie node being iterated
	parent  common.Hash // Hash of the first full ancestor node (nil if current is the root)
113
	index   int         // Child to be processed next
114
	pathlen int         // Length of the path to this node
115 116
}

117
type nodeIterator struct {
118 119
	trie  *Trie                // Trie being iterated
	stack []*nodeIteratorState // Hierarchy of trie nodes persisting the iteration state
120
	path  []byte               // Path to the current node
121 122 123
	err   error                // Failure set in case of an internal error in the iterator
}

124 125
// errIteratorEnd is stored in nodeIterator.err when iteration is done.
var errIteratorEnd = errors.New("end of iteration")
126 127 128 129 130 131 132 133 134

// seekError is stored in nodeIterator.err if the initial seek has failed.
type seekError struct {
	key []byte
	err error
}

func (e seekError) Error() string {
	return "seek error: " + e.err.Error()
135 136
}

137
func newNodeIterator(trie *Trie, start []byte) NodeIterator {
138
	if trie.Hash() == emptyState {
139 140
		return new(nodeIterator)
	}
141
	it := &nodeIterator{trie: trie}
142
	it.err = it.seek(start)
143
	return it
144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160
}

func (it *nodeIterator) Hash() common.Hash {
	if len(it.stack) == 0 {
		return common.Hash{}
	}
	return it.stack[len(it.stack)-1].hash
}

func (it *nodeIterator) Parent() common.Hash {
	if len(it.stack) == 0 {
		return common.Hash{}
	}
	return it.stack[len(it.stack)-1].parent
}

func (it *nodeIterator) Leaf() bool {
161
	return hasTerm(it.path)
162 163
}

164 165 166 167 168 169 170 171 172
func (it *nodeIterator) LeafKey() []byte {
	if len(it.stack) > 0 {
		if _, ok := it.stack[len(it.stack)-1].node.(valueNode); ok {
			return hexToKeybytes(it.path)
		}
	}
	panic("not at leaf")
}

173
func (it *nodeIterator) LeafBlob() []byte {
174 175 176 177
	if len(it.stack) > 0 {
		if node, ok := it.stack[len(it.stack)-1].node.(valueNode); ok {
			return []byte(node)
		}
178
	}
179 180
	panic("not at leaf")
}
181

182
func (it *nodeIterator) LeafProof() [][]byte {
183 184
	if len(it.stack) > 0 {
		if _, ok := it.stack[len(it.stack)-1].node.(valueNode); ok {
185
			hasher := newHasher(nil)
186 187
			defer returnHasherToPool(hasher)

188 189 190 191 192 193 194 195 196 197 198 199
			proofs := make([][]byte, 0, len(it.stack))

			for i, item := range it.stack[:len(it.stack)-1] {
				// Gather nodes that end up as hash nodes (or the root)
				node, _, _ := hasher.hashChildren(item.node, nil)
				hashed, _ := hasher.store(node, nil, false)
				if _, ok := hashed.(hashNode); ok || i == 0 {
					enc, _ := rlp.EncodeToBytes(node)
					proofs = append(proofs, enc)
				}
			}
			return proofs
200
		}
201
	}
202
	panic("not at leaf")
203 204 205 206 207 208 209
}

func (it *nodeIterator) Path() []byte {
	return it.path
}

func (it *nodeIterator) Error() error {
210
	if it.err == errIteratorEnd {
211 212
		return nil
	}
213 214 215
	if seek, ok := it.err.(seekError); ok {
		return seek.err
	}
216
	return it.err
217 218 219
}

// Next moves the iterator to the next node, returning whether there are any
220
// further nodes. In case of an internal error this method returns false and
221 222 223
// sets the Error field to the encountered failure. If `descend` is false,
// skips iterating over any subnodes of the current node.
func (it *nodeIterator) Next(descend bool) bool {
224
	if it.err == errIteratorEnd {
225 226
		return false
	}
227 228 229 230 231 232
	if seek, ok := it.err.(seekError); ok {
		if it.err = it.seek(seek.key); it.err != nil {
			return false
		}
	}
	// Otherwise step forward with the iterator and report any errors.
233
	state, parentIndex, path, err := it.peek(descend)
234 235
	it.err = err
	if it.err != nil {
236 237
		return false
	}
238 239
	it.push(state, parentIndex, path)
	return true
240 241
}

242
func (it *nodeIterator) seek(prefix []byte) error {
243 244 245 246 247 248
	// The path we're looking for is the hex encoded key without terminator.
	key := keybytesToHex(prefix)
	key = key[:len(key)-1]
	// Move forward until we're just before the closest match to key.
	for {
		state, parentIndex, path, err := it.peek(bytes.HasPrefix(key, it.path))
249 250
		if err == errIteratorEnd {
			return errIteratorEnd
251 252 253 254
		} else if err != nil {
			return seekError{prefix, err}
		} else if bytes.Compare(path, key) >= 0 {
			return nil
255 256
		}
		it.push(state, parentIndex, path)
257
	}
258 259 260 261
}

// peek creates the next state of the iterator.
func (it *nodeIterator) peek(descend bool) (*nodeIteratorState, *int, []byte, error) {
262
	if len(it.stack) == 0 {
263
		// Initialize the iterator if we've just started.
264
		root := it.trie.Hash()
265
		state := &nodeIteratorState{node: it.trie.root, index: -1}
266 267
		if root != emptyRoot {
			state.hash = root
268
		}
269 270
		err := state.resolve(it.trie, nil)
		return state, nil, nil, err
271 272 273
	}
	if !descend {
		// If we're skipping children, pop the current node first
274
		it.pop()
275
	}
276

277
	// Continue iteration to the next child
278
	for len(it.stack) > 0 {
279
		parent := it.stack[len(it.stack)-1]
280 281 282 283
		ancestor := parent.hash
		if (ancestor == common.Hash{}) {
			ancestor = parent.parent
		}
284 285 286 287
		state, path, ok := it.nextChild(parent, ancestor)
		if ok {
			if err := state.resolve(it.trie, path); err != nil {
				return parent, &parent.index, path, err
288
			}
289 290 291 292 293
			return state, &parent.index, path, nil
		}
		// No more child nodes, move back up.
		it.pop()
	}
294
	return nil, nil, nil, errIteratorEnd
295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316
}

func (st *nodeIteratorState) resolve(tr *Trie, path []byte) error {
	if hash, ok := st.node.(hashNode); ok {
		resolved, err := tr.resolveHash(hash, path)
		if err != nil {
			return err
		}
		st.node = resolved
		st.hash = common.BytesToHash(hash)
	}
	return nil
}

func (it *nodeIterator) nextChild(parent *nodeIteratorState, ancestor common.Hash) (*nodeIteratorState, []byte, bool) {
	switch node := parent.node.(type) {
	case *fullNode:
		// Full node, move to the first non-nil child.
		for i := parent.index + 1; i < len(node.Children); i++ {
			child := node.Children[i]
			if child != nil {
				hash, _ := child.cache()
317
				state := &nodeIteratorState{
318
					hash:    common.BytesToHash(hash),
319
					node:    child,
320
					parent:  ancestor,
321
					index:   -1,
322
					pathlen: len(it.path),
323
				}
324 325 326
				path := append(it.path, byte(i))
				parent.index = i - 1
				return state, path, true
327
			}
328 329 330 331 332 333 334 335 336 337 338
		}
	case *shortNode:
		// Short node, return the pointer singleton child
		if parent.index < 0 {
			hash, _ := node.Val.cache()
			state := &nodeIteratorState{
				hash:    common.BytesToHash(hash),
				node:    node.Val,
				parent:  ancestor,
				index:   -1,
				pathlen: len(it.path),
339
			}
340 341
			path := append(it.path, node.Key...)
			return state, path, true
342 343
		}
	}
344
	return parent, it.path, false
345 346 347 348 349 350
}

func (it *nodeIterator) push(state *nodeIteratorState, parentIndex *int, path []byte) {
	it.path = path
	it.stack = append(it.stack, state)
	if parentIndex != nil {
351
		*parentIndex++
352 353 354 355 356 357 358
	}
}

func (it *nodeIterator) pop() {
	parent := it.stack[len(it.stack)-1]
	it.path = it.path[:parent.pathlen]
	it.stack = it.stack[:len(it.stack)-1]
359 360
}

361
func compareNodes(a, b NodeIterator) int {
362
	if cmp := bytes.Compare(a.Path(), b.Path()); cmp != 0 {
363 364 365 366 367 368 369
		return cmp
	}
	if a.Leaf() && !b.Leaf() {
		return -1
	} else if b.Leaf() && !a.Leaf() {
		return 1
	}
370
	if cmp := bytes.Compare(a.Hash().Bytes(), b.Hash().Bytes()); cmp != 0 {
371 372
		return cmp
	}
373 374 375 376
	if a.Leaf() && b.Leaf() {
		return bytes.Compare(a.LeafBlob(), b.LeafBlob())
	}
	return 0
377 378
}

379 380 381 382 383
type differenceIterator struct {
	a, b  NodeIterator // Nodes returned are those in b - a.
	eof   bool         // Indicates a has run out of elements
	count int          // Number of nodes scanned on either trie
}
384

385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408
// NewDifferenceIterator constructs a NodeIterator that iterates over elements in b that
// are not in a. Returns the iterator, and a pointer to an integer recording the number
// of nodes seen.
func NewDifferenceIterator(a, b NodeIterator) (NodeIterator, *int) {
	a.Next(true)
	it := &differenceIterator{
		a: a,
		b: b,
	}
	return it, &it.count
}

func (it *differenceIterator) Hash() common.Hash {
	return it.b.Hash()
}

func (it *differenceIterator) Parent() common.Hash {
	return it.b.Parent()
}

func (it *differenceIterator) Leaf() bool {
	return it.b.Leaf()
}

409 410 411 412
func (it *differenceIterator) LeafKey() []byte {
	return it.b.LeafKey()
}

413 414 415 416
func (it *differenceIterator) LeafBlob() []byte {
	return it.b.LeafBlob()
}

417 418
func (it *differenceIterator) LeafProof() [][]byte {
	return it.b.LeafProof()
419 420
}

421 422 423 424 425 426 427 428 429
func (it *differenceIterator) Path() []byte {
	return it.b.Path()
}

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) {
430 431
		return false
	}
432
	it.count++
433 434 435 436 437 438 439

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

	for {
440
		switch compareNodes(it.a, it.b) {
441 442 443 444 445 446
		case -1:
			// b jumped past a; advance a
			if !it.a.Next(true) {
				it.eof = true
				return true
			}
447
			it.count++
448 449 450 451 452 453 454 455 456
		case 1:
			// b is before a
			return true
		case 0:
			// a and b are identical; skip this whole subtree if the nodes have hashes
			hasHash := it.a.Hash() == common.Hash{}
			if !it.b.Next(hasHash) {
				return false
			}
457
			it.count++
458 459 460 461
			if !it.a.Next(hasHash) {
				it.eof = true
				return true
			}
462
			it.count++
463 464 465
		}
	}
}
466

467 468 469
func (it *differenceIterator) Error() error {
	if err := it.a.Error(); err != nil {
		return err
470
	}
471
	return it.b.Error()
472
}
473 474 475 476 477 478 479 480 481 482 483 484 485 486 487 488 489 490 491 492 493 494 495 496 497 498 499

type nodeIteratorHeap []NodeIterator

func (h nodeIteratorHeap) Len() int            { return len(h) }
func (h nodeIteratorHeap) Less(i, j int) bool  { return compareNodes(h[i], h[j]) < 0 }
func (h nodeIteratorHeap) Swap(i, j int)       { h[i], h[j] = h[j], h[i] }
func (h *nodeIteratorHeap) Push(x interface{}) { *h = append(*h, x.(NodeIterator)) }
func (h *nodeIteratorHeap) Pop() interface{} {
	n := len(*h)
	x := (*h)[n-1]
	*h = (*h)[0 : n-1]
	return x
}

type unionIterator struct {
	items *nodeIteratorHeap // Nodes returned are the union of the ones in these iterators
	count int               // Number of nodes scanned across all tries
}

// NewUnionIterator constructs a NodeIterator that iterates over elements in the union
// of the provided NodeIterators. Returns the iterator, and a pointer to an integer
// recording the number of nodes visited.
func NewUnionIterator(iters []NodeIterator) (NodeIterator, *int) {
	h := make(nodeIteratorHeap, len(iters))
	copy(h, iters)
	heap.Init(&h)

500
	ui := &unionIterator{items: &h}
501 502 503 504 505 506 507 508 509 510 511 512 513 514 515
	return ui, &ui.count
}

func (it *unionIterator) Hash() common.Hash {
	return (*it.items)[0].Hash()
}

func (it *unionIterator) Parent() common.Hash {
	return (*it.items)[0].Parent()
}

func (it *unionIterator) Leaf() bool {
	return (*it.items)[0].Leaf()
}

516 517 518 519
func (it *unionIterator) LeafKey() []byte {
	return (*it.items)[0].LeafKey()
}

520 521 522 523
func (it *unionIterator) LeafBlob() []byte {
	return (*it.items)[0].LeafBlob()
}

524 525
func (it *unionIterator) LeafProof() [][]byte {
	return (*it.items)[0].LeafProof()
526 527
}

528 529 530 531 532 533 534 535 536 537 538 539 540 541 542 543 544 545 546 547 548 549 550 551 552 553 554 555 556 557 558 559
func (it *unionIterator) Path() []byte {
	return (*it.items)[0].Path()
}

// Next returns the next node in the union of tries being iterated over.
//
// It does this by maintaining a heap of iterators, sorted by the iteration
// order of their next elements, with one entry for each source trie. Each
// time Next() is called, it takes the least element from the heap to return,
// advancing any other iterators that also point to that same element. These
// iterators are called with descend=false, since we know that any nodes under
// these nodes will also be duplicates, found in the currently selected iterator.
// Whenever an iterator is advanced, it is pushed back into the heap if it still
// has elements remaining.
//
// In the case that descend=false - eg, we're asked to ignore all subnodes of the
// current node - we also advance any iterators in the heap that have the current
// path as a prefix.
func (it *unionIterator) Next(descend bool) bool {
	if len(*it.items) == 0 {
		return false
	}

	// Get the next key from the union
	least := heap.Pop(it.items).(NodeIterator)

	// Skip over other nodes as long as they're identical, or, if we're not descending, as
	// long as they have the same prefix as the current node.
	for len(*it.items) > 0 && ((!descend && bytes.HasPrefix((*it.items)[0].Path(), least.Path())) || compareNodes(least, (*it.items)[0]) == 0) {
		skipped := heap.Pop(it.items).(NodeIterator)
		// Skip the whole subtree if the nodes have hashes; otherwise just skip this node
		if skipped.Next(skipped.Hash() == common.Hash{}) {
560
			it.count++
561 562 563 564 565
			// If there are more elements, push the iterator back on the heap
			heap.Push(it.items, skipped)
		}
	}
	if least.Next(descend) {
566
		it.count++
567 568 569 570 571 572 573 574 575 576 577 578 579
		heap.Push(it.items, least)
	}
	return len(*it.items) > 0
}

func (it *unionIterator) Error() error {
	for i := 0; i < len(*it.items); i++ {
		if err := (*it.items)[i].Error(); err != nil {
			return err
		}
	}
	return nil
}