github.com/luckypickle/go-ethereum-vet@v1.14.2/trie/iterator.go (about) 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 // it under the terms of the GNU Lesser General Public License as published by 6 // the Free Software Foundation, either version 3 of the License, or 7 // (at your option) any later version. 8 // 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 // GNU Lesser General Public License for more details. 13 // 14 // 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 17 package trie 18 19 import ( 20 "bytes" 21 "container/heap" 22 "errors" 23 24 "github.com/luckypickle/go-ethereum-vet/common" 25 "github.com/luckypickle/go-ethereum-vet/rlp" 26 ) 27 28 // Iterator is a key-value trie iterator that traverses a Trie. 29 type Iterator struct { 30 nodeIt NodeIterator 31 32 Key []byte // Current data key on which the iterator is positioned on 33 Value []byte // Current data value on which the iterator is positioned on 34 Err error 35 } 36 37 // NewIterator creates a new key-value iterator from a node iterator 38 func NewIterator(it NodeIterator) *Iterator { 39 return &Iterator{ 40 nodeIt: it, 41 } 42 } 43 44 // Next moves the iterator forward one key-value entry. 45 func (it *Iterator) Next() bool { 46 for it.nodeIt.Next(true) { 47 if it.nodeIt.Leaf() { 48 it.Key = it.nodeIt.LeafKey() 49 it.Value = it.nodeIt.LeafBlob() 50 return true 51 } 52 } 53 it.Key = nil 54 it.Value = nil 55 it.Err = it.nodeIt.Error() 56 return false 57 } 58 59 // Prove generates the Merkle proof for the leaf node the iterator is currently 60 // positioned on. 61 func (it *Iterator) Prove() [][]byte { 62 return it.nodeIt.LeafProof() 63 } 64 65 // NodeIterator is an iterator to traverse the trie pre-order. 66 type NodeIterator interface { 67 // Next moves the iterator to the next node. If the parameter is false, any child 68 // nodes will be skipped. 69 Next(bool) bool 70 71 // Error returns the error status of the iterator. 72 Error() error 73 74 // Hash returns the hash of the current node. 75 Hash() common.Hash 76 77 // Parent returns the hash of the parent of the current node. The hash may be the one 78 // grandparent if the immediate parent is an internal node with no hash. 79 Parent() common.Hash 80 81 // Path returns the hex-encoded path to the current node. 82 // Callers must not retain references to the return value after calling Next. 83 // For leaf nodes, the last element of the path is the 'terminator symbol' 0x10. 84 Path() []byte 85 86 // Leaf returns true iff the current node is a leaf node. 87 Leaf() bool 88 89 // LeafKey returns the key of the leaf. The method panics if the iterator is not 90 // positioned at a leaf. Callers must not retain references to the value after 91 // calling Next. 92 LeafKey() []byte 93 94 // LeafBlob returns the content of the leaf. The method panics if the iterator 95 // is not positioned at a leaf. Callers must not retain references to the value 96 // after calling Next. 97 LeafBlob() []byte 98 99 // LeafProof returns the Merkle proof of the leaf. The method panics if the 100 // iterator is not positioned at a leaf. Callers must not retain references 101 // to the value after calling Next. 102 LeafProof() [][]byte 103 } 104 105 // nodeIteratorState represents the iteration state at one particular node of the 106 // trie, which can be resumed at a later invocation. 107 type nodeIteratorState struct { 108 hash common.Hash // Hash of the node being iterated (nil if not standalone) 109 node node // Trie node being iterated 110 parent common.Hash // Hash of the first full ancestor node (nil if current is the root) 111 index int // Child to be processed next 112 pathlen int // Length of the path to this node 113 } 114 115 type nodeIterator struct { 116 trie *Trie // Trie being iterated 117 stack []*nodeIteratorState // Hierarchy of trie nodes persisting the iteration state 118 path []byte // Path to the current node 119 err error // Failure set in case of an internal error in the iterator 120 } 121 122 // errIteratorEnd is stored in nodeIterator.err when iteration is done. 123 var errIteratorEnd = errors.New("end of iteration") 124 125 // seekError is stored in nodeIterator.err if the initial seek has failed. 126 type seekError struct { 127 key []byte 128 err error 129 } 130 131 func (e seekError) Error() string { 132 return "seek error: " + e.err.Error() 133 } 134 135 func newNodeIterator(trie *Trie, start []byte) NodeIterator { 136 if trie.Hash() == emptyState { 137 return new(nodeIterator) 138 } 139 it := &nodeIterator{trie: trie} 140 it.err = it.seek(start) 141 return it 142 } 143 144 func (it *nodeIterator) Hash() common.Hash { 145 if len(it.stack) == 0 { 146 return common.Hash{} 147 } 148 return it.stack[len(it.stack)-1].hash 149 } 150 151 func (it *nodeIterator) Parent() common.Hash { 152 if len(it.stack) == 0 { 153 return common.Hash{} 154 } 155 return it.stack[len(it.stack)-1].parent 156 } 157 158 func (it *nodeIterator) Leaf() bool { 159 return hasTerm(it.path) 160 } 161 162 func (it *nodeIterator) LeafKey() []byte { 163 if len(it.stack) > 0 { 164 if _, ok := it.stack[len(it.stack)-1].node.(valueNode); ok { 165 return hexToKeybytes(it.path) 166 } 167 } 168 panic("not at leaf") 169 } 170 171 func (it *nodeIterator) LeafBlob() []byte { 172 if len(it.stack) > 0 { 173 if node, ok := it.stack[len(it.stack)-1].node.(valueNode); ok { 174 return []byte(node) 175 } 176 } 177 panic("not at leaf") 178 } 179 180 func (it *nodeIterator) LeafProof() [][]byte { 181 if len(it.stack) > 0 { 182 if _, ok := it.stack[len(it.stack)-1].node.(valueNode); ok { 183 hasher := newHasher(0, 0, nil) 184 proofs := make([][]byte, 0, len(it.stack)) 185 186 for i, item := range it.stack[:len(it.stack)-1] { 187 // Gather nodes that end up as hash nodes (or the root) 188 node, _, _ := hasher.hashChildren(item.node, nil) 189 hashed, _ := hasher.store(node, nil, false) 190 if _, ok := hashed.(hashNode); ok || i == 0 { 191 enc, _ := rlp.EncodeToBytes(node) 192 proofs = append(proofs, enc) 193 } 194 } 195 return proofs 196 } 197 } 198 panic("not at leaf") 199 } 200 201 func (it *nodeIterator) Path() []byte { 202 return it.path 203 } 204 205 func (it *nodeIterator) Error() error { 206 if it.err == errIteratorEnd { 207 return nil 208 } 209 if seek, ok := it.err.(seekError); ok { 210 return seek.err 211 } 212 return it.err 213 } 214 215 // Next moves the iterator to the next node, returning whether there are any 216 // further nodes. In case of an internal error this method returns false and 217 // sets the Error field to the encountered failure. If `descend` is false, 218 // skips iterating over any subnodes of the current node. 219 func (it *nodeIterator) Next(descend bool) bool { 220 if it.err == errIteratorEnd { 221 return false 222 } 223 if seek, ok := it.err.(seekError); ok { 224 if it.err = it.seek(seek.key); it.err != nil { 225 return false 226 } 227 } 228 // Otherwise step forward with the iterator and report any errors. 229 state, parentIndex, path, err := it.peek(descend) 230 it.err = err 231 if it.err != nil { 232 return false 233 } 234 it.push(state, parentIndex, path) 235 return true 236 } 237 238 func (it *nodeIterator) seek(prefix []byte) error { 239 // The path we're looking for is the hex encoded key without terminator. 240 key := keybytesToHex(prefix) 241 key = key[:len(key)-1] 242 // Move forward until we're just before the closest match to key. 243 for { 244 state, parentIndex, path, err := it.peek(bytes.HasPrefix(key, it.path)) 245 if err == errIteratorEnd { 246 return errIteratorEnd 247 } else if err != nil { 248 return seekError{prefix, err} 249 } else if bytes.Compare(path, key) >= 0 { 250 return nil 251 } 252 it.push(state, parentIndex, path) 253 } 254 } 255 256 // peek creates the next state of the iterator. 257 func (it *nodeIterator) peek(descend bool) (*nodeIteratorState, *int, []byte, error) { 258 if len(it.stack) == 0 { 259 // Initialize the iterator if we've just started. 260 root := it.trie.Hash() 261 state := &nodeIteratorState{node: it.trie.root, index: -1} 262 if root != emptyRoot { 263 state.hash = root 264 } 265 err := state.resolve(it.trie, nil) 266 return state, nil, nil, err 267 } 268 if !descend { 269 // If we're skipping children, pop the current node first 270 it.pop() 271 } 272 273 // Continue iteration to the next child 274 for len(it.stack) > 0 { 275 parent := it.stack[len(it.stack)-1] 276 ancestor := parent.hash 277 if (ancestor == common.Hash{}) { 278 ancestor = parent.parent 279 } 280 state, path, ok := it.nextChild(parent, ancestor) 281 if ok { 282 if err := state.resolve(it.trie, path); err != nil { 283 return parent, &parent.index, path, err 284 } 285 return state, &parent.index, path, nil 286 } 287 // No more child nodes, move back up. 288 it.pop() 289 } 290 return nil, nil, nil, errIteratorEnd 291 } 292 293 func (st *nodeIteratorState) resolve(tr *Trie, path []byte) error { 294 if hash, ok := st.node.(hashNode); ok { 295 resolved, err := tr.resolveHash(hash, path) 296 if err != nil { 297 return err 298 } 299 st.node = resolved 300 st.hash = common.BytesToHash(hash) 301 } 302 return nil 303 } 304 305 func (it *nodeIterator) nextChild(parent *nodeIteratorState, ancestor common.Hash) (*nodeIteratorState, []byte, bool) { 306 switch node := parent.node.(type) { 307 case *fullNode: 308 // Full node, move to the first non-nil child. 309 for i := parent.index + 1; i < len(node.Children); i++ { 310 child := node.Children[i] 311 if child != nil { 312 hash, _ := child.cache() 313 state := &nodeIteratorState{ 314 hash: common.BytesToHash(hash), 315 node: child, 316 parent: ancestor, 317 index: -1, 318 pathlen: len(it.path), 319 } 320 path := append(it.path, byte(i)) 321 parent.index = i - 1 322 return state, path, true 323 } 324 } 325 case *shortNode: 326 // Short node, return the pointer singleton child 327 if parent.index < 0 { 328 hash, _ := node.Val.cache() 329 state := &nodeIteratorState{ 330 hash: common.BytesToHash(hash), 331 node: node.Val, 332 parent: ancestor, 333 index: -1, 334 pathlen: len(it.path), 335 } 336 path := append(it.path, node.Key...) 337 return state, path, true 338 } 339 } 340 return parent, it.path, false 341 } 342 343 func (it *nodeIterator) push(state *nodeIteratorState, parentIndex *int, path []byte) { 344 it.path = path 345 it.stack = append(it.stack, state) 346 if parentIndex != nil { 347 *parentIndex++ 348 } 349 } 350 351 func (it *nodeIterator) pop() { 352 parent := it.stack[len(it.stack)-1] 353 it.path = it.path[:parent.pathlen] 354 it.stack = it.stack[:len(it.stack)-1] 355 } 356 357 func compareNodes(a, b NodeIterator) int { 358 if cmp := bytes.Compare(a.Path(), b.Path()); cmp != 0 { 359 return cmp 360 } 361 if a.Leaf() && !b.Leaf() { 362 return -1 363 } else if b.Leaf() && !a.Leaf() { 364 return 1 365 } 366 if cmp := bytes.Compare(a.Hash().Bytes(), b.Hash().Bytes()); cmp != 0 { 367 return cmp 368 } 369 if a.Leaf() && b.Leaf() { 370 return bytes.Compare(a.LeafBlob(), b.LeafBlob()) 371 } 372 return 0 373 } 374 375 type differenceIterator struct { 376 a, b NodeIterator // Nodes returned are those in b - a. 377 eof bool // Indicates a has run out of elements 378 count int // Number of nodes scanned on either trie 379 } 380 381 // NewDifferenceIterator constructs a NodeIterator that iterates over elements in b that 382 // are not in a. Returns the iterator, and a pointer to an integer recording the number 383 // of nodes seen. 384 func NewDifferenceIterator(a, b NodeIterator) (NodeIterator, *int) { 385 a.Next(true) 386 it := &differenceIterator{ 387 a: a, 388 b: b, 389 } 390 return it, &it.count 391 } 392 393 func (it *differenceIterator) Hash() common.Hash { 394 return it.b.Hash() 395 } 396 397 func (it *differenceIterator) Parent() common.Hash { 398 return it.b.Parent() 399 } 400 401 func (it *differenceIterator) Leaf() bool { 402 return it.b.Leaf() 403 } 404 405 func (it *differenceIterator) LeafKey() []byte { 406 return it.b.LeafKey() 407 } 408 409 func (it *differenceIterator) LeafBlob() []byte { 410 return it.b.LeafBlob() 411 } 412 413 func (it *differenceIterator) LeafProof() [][]byte { 414 return it.b.LeafProof() 415 } 416 417 func (it *differenceIterator) Path() []byte { 418 return it.b.Path() 419 } 420 421 func (it *differenceIterator) Next(bool) bool { 422 // Invariants: 423 // - We always advance at least one element in b. 424 // - At the start of this function, a's path is lexically greater than b's. 425 if !it.b.Next(true) { 426 return false 427 } 428 it.count++ 429 430 if it.eof { 431 // a has reached eof, so we just return all elements from b 432 return true 433 } 434 435 for { 436 switch compareNodes(it.a, it.b) { 437 case -1: 438 // b jumped past a; advance a 439 if !it.a.Next(true) { 440 it.eof = true 441 return true 442 } 443 it.count++ 444 case 1: 445 // b is before a 446 return true 447 case 0: 448 // a and b are identical; skip this whole subtree if the nodes have hashes 449 hasHash := it.a.Hash() == common.Hash{} 450 if !it.b.Next(hasHash) { 451 return false 452 } 453 it.count++ 454 if !it.a.Next(hasHash) { 455 it.eof = true 456 return true 457 } 458 it.count++ 459 } 460 } 461 } 462 463 func (it *differenceIterator) Error() error { 464 if err := it.a.Error(); err != nil { 465 return err 466 } 467 return it.b.Error() 468 } 469 470 type nodeIteratorHeap []NodeIterator 471 472 func (h nodeIteratorHeap) Len() int { return len(h) } 473 func (h nodeIteratorHeap) Less(i, j int) bool { return compareNodes(h[i], h[j]) < 0 } 474 func (h nodeIteratorHeap) Swap(i, j int) { h[i], h[j] = h[j], h[i] } 475 func (h *nodeIteratorHeap) Push(x interface{}) { *h = append(*h, x.(NodeIterator)) } 476 func (h *nodeIteratorHeap) Pop() interface{} { 477 n := len(*h) 478 x := (*h)[n-1] 479 *h = (*h)[0 : n-1] 480 return x 481 } 482 483 type unionIterator struct { 484 items *nodeIteratorHeap // Nodes returned are the union of the ones in these iterators 485 count int // Number of nodes scanned across all tries 486 } 487 488 // NewUnionIterator constructs a NodeIterator that iterates over elements in the union 489 // of the provided NodeIterators. Returns the iterator, and a pointer to an integer 490 // recording the number of nodes visited. 491 func NewUnionIterator(iters []NodeIterator) (NodeIterator, *int) { 492 h := make(nodeIteratorHeap, len(iters)) 493 copy(h, iters) 494 heap.Init(&h) 495 496 ui := &unionIterator{items: &h} 497 return ui, &ui.count 498 } 499 500 func (it *unionIterator) Hash() common.Hash { 501 return (*it.items)[0].Hash() 502 } 503 504 func (it *unionIterator) Parent() common.Hash { 505 return (*it.items)[0].Parent() 506 } 507 508 func (it *unionIterator) Leaf() bool { 509 return (*it.items)[0].Leaf() 510 } 511 512 func (it *unionIterator) LeafKey() []byte { 513 return (*it.items)[0].LeafKey() 514 } 515 516 func (it *unionIterator) LeafBlob() []byte { 517 return (*it.items)[0].LeafBlob() 518 } 519 520 func (it *unionIterator) LeafProof() [][]byte { 521 return (*it.items)[0].LeafProof() 522 } 523 524 func (it *unionIterator) Path() []byte { 525 return (*it.items)[0].Path() 526 } 527 528 // Next returns the next node in the union of tries being iterated over. 529 // 530 // It does this by maintaining a heap of iterators, sorted by the iteration 531 // order of their next elements, with one entry for each source trie. Each 532 // time Next() is called, it takes the least element from the heap to return, 533 // advancing any other iterators that also point to that same element. These 534 // iterators are called with descend=false, since we know that any nodes under 535 // these nodes will also be duplicates, found in the currently selected iterator. 536 // Whenever an iterator is advanced, it is pushed back into the heap if it still 537 // has elements remaining. 538 // 539 // In the case that descend=false - eg, we're asked to ignore all subnodes of the 540 // current node - we also advance any iterators in the heap that have the current 541 // path as a prefix. 542 func (it *unionIterator) Next(descend bool) bool { 543 if len(*it.items) == 0 { 544 return false 545 } 546 547 // Get the next key from the union 548 least := heap.Pop(it.items).(NodeIterator) 549 550 // Skip over other nodes as long as they're identical, or, if we're not descending, as 551 // long as they have the same prefix as the current node. 552 for len(*it.items) > 0 && ((!descend && bytes.HasPrefix((*it.items)[0].Path(), least.Path())) || compareNodes(least, (*it.items)[0]) == 0) { 553 skipped := heap.Pop(it.items).(NodeIterator) 554 // Skip the whole subtree if the nodes have hashes; otherwise just skip this node 555 if skipped.Next(skipped.Hash() == common.Hash{}) { 556 it.count++ 557 // If there are more elements, push the iterator back on the heap 558 heap.Push(it.items, skipped) 559 } 560 } 561 if least.Next(descend) { 562 it.count++ 563 heap.Push(it.items, least) 564 } 565 return len(*it.items) > 0 566 } 567 568 func (it *unionIterator) Error() error { 569 for i := 0; i < len(*it.items); i++ { 570 if err := (*it.items)[i].Error(); err != nil { 571 return err 572 } 573 } 574 return nil 575 }