github.com/intfoundation/intchain@v0.0.0-20220727031208-4316ad31ca73/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/intfoundation/intchain/common" 25 "github.com/intfoundation/intchain/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(nil) 184 defer returnHasherToPool(hasher) 185 186 proofs := make([][]byte, 0, len(it.stack)) 187 188 for i, item := range it.stack[:len(it.stack)-1] { 189 // Gather nodes that end up as hash nodes (or the root) 190 node, _, _ := hasher.hashChildren(item.node, nil) 191 hashed, _ := hasher.store(node, nil, false) 192 if _, ok := hashed.(hashNode); ok || i == 0 { 193 enc, _ := rlp.EncodeToBytes(node) 194 proofs = append(proofs, enc) 195 } 196 } 197 return proofs 198 } 199 } 200 panic("not at leaf") 201 } 202 203 func (it *nodeIterator) Path() []byte { 204 return it.path 205 } 206 207 func (it *nodeIterator) Error() error { 208 if it.err == errIteratorEnd { 209 return nil 210 } 211 if seek, ok := it.err.(seekError); ok { 212 return seek.err 213 } 214 return it.err 215 } 216 217 // Next moves the iterator to the next node, returning whether there are any 218 // further nodes. In case of an internal error this method returns false and 219 // sets the Error field to the encountered failure. If `descend` is false, 220 // skips iterating over any subnodes of the current node. 221 func (it *nodeIterator) Next(descend bool) bool { 222 if it.err == errIteratorEnd { 223 return false 224 } 225 if seek, ok := it.err.(seekError); ok { 226 if it.err = it.seek(seek.key); it.err != nil { 227 return false 228 } 229 } 230 // Otherwise step forward with the iterator and report any errors. 231 state, parentIndex, path, err := it.peek(descend) 232 it.err = err 233 if it.err != nil { 234 return false 235 } 236 it.push(state, parentIndex, path) 237 return true 238 } 239 240 func (it *nodeIterator) seek(prefix []byte) error { 241 // The path we're looking for is the hex encoded key without terminator. 242 key := keybytesToHex(prefix) 243 key = key[:len(key)-1] 244 // Move forward until we're just before the closest match to key. 245 for { 246 state, parentIndex, path, err := it.peek(bytes.HasPrefix(key, it.path)) 247 if err == errIteratorEnd { 248 return errIteratorEnd 249 } else if err != nil { 250 return seekError{prefix, err} 251 } else if bytes.Compare(path, key) >= 0 { 252 return nil 253 } 254 it.push(state, parentIndex, path) 255 } 256 } 257 258 // peek creates the next state of the iterator. 259 func (it *nodeIterator) peek(descend bool) (*nodeIteratorState, *int, []byte, error) { 260 if len(it.stack) == 0 { 261 // Initialize the iterator if we've just started. 262 root := it.trie.Hash() 263 state := &nodeIteratorState{node: it.trie.root, index: -1} 264 if root != emptyRoot { 265 state.hash = root 266 } 267 err := state.resolve(it.trie, nil) 268 return state, nil, nil, err 269 } 270 if !descend { 271 // If we're skipping children, pop the current node first 272 it.pop() 273 } 274 275 // Continue iteration to the next child 276 for len(it.stack) > 0 { 277 parent := it.stack[len(it.stack)-1] 278 ancestor := parent.hash 279 if (ancestor == common.Hash{}) { 280 ancestor = parent.parent 281 } 282 state, path, ok := it.nextChild(parent, ancestor) 283 if ok { 284 if err := state.resolve(it.trie, path); err != nil { 285 return parent, &parent.index, path, err 286 } 287 return state, &parent.index, path, nil 288 } 289 // No more child nodes, move back up. 290 it.pop() 291 } 292 return nil, nil, nil, errIteratorEnd 293 } 294 295 func (st *nodeIteratorState) resolve(tr *Trie, path []byte) error { 296 if hash, ok := st.node.(hashNode); ok { 297 resolved, err := tr.resolveHash(hash, path) 298 if err != nil { 299 return err 300 } 301 st.node = resolved 302 st.hash = common.BytesToHash(hash) 303 } 304 return nil 305 } 306 307 func (it *nodeIterator) nextChild(parent *nodeIteratorState, ancestor common.Hash) (*nodeIteratorState, []byte, bool) { 308 switch node := parent.node.(type) { 309 case *fullNode: 310 // Full node, move to the first non-nil child. 311 for i := parent.index + 1; i < len(node.Children); i++ { 312 child := node.Children[i] 313 if child != nil { 314 hash, _ := child.cache() 315 state := &nodeIteratorState{ 316 hash: common.BytesToHash(hash), 317 node: child, 318 parent: ancestor, 319 index: -1, 320 pathlen: len(it.path), 321 } 322 path := append(it.path, byte(i)) 323 parent.index = i - 1 324 return state, path, true 325 } 326 } 327 case *shortNode: 328 // Short node, return the pointer singleton child 329 if parent.index < 0 { 330 hash, _ := node.Val.cache() 331 state := &nodeIteratorState{ 332 hash: common.BytesToHash(hash), 333 node: node.Val, 334 parent: ancestor, 335 index: -1, 336 pathlen: len(it.path), 337 } 338 path := append(it.path, node.Key...) 339 return state, path, true 340 } 341 } 342 return parent, it.path, false 343 } 344 345 func (it *nodeIterator) push(state *nodeIteratorState, parentIndex *int, path []byte) { 346 it.path = path 347 it.stack = append(it.stack, state) 348 if parentIndex != nil { 349 *parentIndex++ 350 } 351 } 352 353 func (it *nodeIterator) pop() { 354 parent := it.stack[len(it.stack)-1] 355 it.path = it.path[:parent.pathlen] 356 it.stack = it.stack[:len(it.stack)-1] 357 } 358 359 func compareNodes(a, b NodeIterator) int { 360 if cmp := bytes.Compare(a.Path(), b.Path()); cmp != 0 { 361 return cmp 362 } 363 if a.Leaf() && !b.Leaf() { 364 return -1 365 } else if b.Leaf() && !a.Leaf() { 366 return 1 367 } 368 if cmp := bytes.Compare(a.Hash().Bytes(), b.Hash().Bytes()); cmp != 0 { 369 return cmp 370 } 371 if a.Leaf() && b.Leaf() { 372 return bytes.Compare(a.LeafBlob(), b.LeafBlob()) 373 } 374 return 0 375 } 376 377 type differenceIterator struct { 378 a, b NodeIterator // Nodes returned are those in b - a. 379 eof bool // Indicates a has run out of elements 380 count int // Number of nodes scanned on either trie 381 } 382 383 // NewDifferenceIterator constructs a NodeIterator that iterates over elements in b that 384 // are not in a. Returns the iterator, and a pointer to an integer recording the number 385 // of nodes seen. 386 func NewDifferenceIterator(a, b NodeIterator) (NodeIterator, *int) { 387 a.Next(true) 388 it := &differenceIterator{ 389 a: a, 390 b: b, 391 } 392 return it, &it.count 393 } 394 395 func (it *differenceIterator) Hash() common.Hash { 396 return it.b.Hash() 397 } 398 399 func (it *differenceIterator) Parent() common.Hash { 400 return it.b.Parent() 401 } 402 403 func (it *differenceIterator) Leaf() bool { 404 return it.b.Leaf() 405 } 406 407 func (it *differenceIterator) LeafKey() []byte { 408 return it.b.LeafKey() 409 } 410 411 func (it *differenceIterator) LeafBlob() []byte { 412 return it.b.LeafBlob() 413 } 414 415 func (it *differenceIterator) LeafProof() [][]byte { 416 return it.b.LeafProof() 417 } 418 419 func (it *differenceIterator) Path() []byte { 420 return it.b.Path() 421 } 422 423 func (it *differenceIterator) Next(bool) bool { 424 // Invariants: 425 // - We always advance at least one element in b. 426 // - At the start of this function, a's path is lexically greater than b's. 427 if !it.b.Next(true) { 428 return false 429 } 430 it.count++ 431 432 if it.eof { 433 // a has reached eof, so we just return all elements from b 434 return true 435 } 436 437 for { 438 switch compareNodes(it.a, it.b) { 439 case -1: 440 // b jumped past a; advance a 441 if !it.a.Next(true) { 442 it.eof = true 443 return true 444 } 445 it.count++ 446 case 1: 447 // b is before a 448 return true 449 case 0: 450 // a and b are identical; skip this whole subtree if the nodes have hashes 451 hasHash := it.a.Hash() == common.Hash{} 452 if !it.b.Next(hasHash) { 453 return false 454 } 455 it.count++ 456 if !it.a.Next(hasHash) { 457 it.eof = true 458 return true 459 } 460 it.count++ 461 } 462 } 463 } 464 465 func (it *differenceIterator) Error() error { 466 if err := it.a.Error(); err != nil { 467 return err 468 } 469 return it.b.Error() 470 } 471 472 type nodeIteratorHeap []NodeIterator 473 474 func (h nodeIteratorHeap) Len() int { return len(h) } 475 func (h nodeIteratorHeap) Less(i, j int) bool { return compareNodes(h[i], h[j]) < 0 } 476 func (h nodeIteratorHeap) Swap(i, j int) { h[i], h[j] = h[j], h[i] } 477 func (h *nodeIteratorHeap) Push(x interface{}) { *h = append(*h, x.(NodeIterator)) } 478 func (h *nodeIteratorHeap) Pop() interface{} { 479 n := len(*h) 480 x := (*h)[n-1] 481 *h = (*h)[0 : n-1] 482 return x 483 } 484 485 type unionIterator struct { 486 items *nodeIteratorHeap // Nodes returned are the union of the ones in these iterators 487 count int // Number of nodes scanned across all tries 488 } 489 490 // NewUnionIterator constructs a NodeIterator that iterates over elements in the union 491 // of the provided NodeIterators. Returns the iterator, and a pointer to an integer 492 // recording the number of nodes visited. 493 func NewUnionIterator(iters []NodeIterator) (NodeIterator, *int) { 494 h := make(nodeIteratorHeap, len(iters)) 495 copy(h, iters) 496 heap.Init(&h) 497 498 ui := &unionIterator{items: &h} 499 return ui, &ui.count 500 } 501 502 func (it *unionIterator) Hash() common.Hash { 503 return (*it.items)[0].Hash() 504 } 505 506 func (it *unionIterator) Parent() common.Hash { 507 return (*it.items)[0].Parent() 508 } 509 510 func (it *unionIterator) Leaf() bool { 511 return (*it.items)[0].Leaf() 512 } 513 514 func (it *unionIterator) LeafKey() []byte { 515 return (*it.items)[0].LeafKey() 516 } 517 518 func (it *unionIterator) LeafBlob() []byte { 519 return (*it.items)[0].LeafBlob() 520 } 521 522 func (it *unionIterator) LeafProof() [][]byte { 523 return (*it.items)[0].LeafProof() 524 } 525 526 func (it *unionIterator) Path() []byte { 527 return (*it.items)[0].Path() 528 } 529 530 // Next returns the next node in the union of tries being iterated over. 531 // 532 // It does this by maintaining a heap of iterators, sorted by the iteration 533 // order of their next elements, with one entry for each source trie. Each 534 // time Next() is called, it takes the least element from the heap to return, 535 // advancing any other iterators that also point to that same element. These 536 // iterators are called with descend=false, since we know that any nodes under 537 // these nodes will also be duplicates, found in the currently selected iterator. 538 // Whenever an iterator is advanced, it is pushed back into the heap if it still 539 // has elements remaining. 540 // 541 // In the case that descend=false - eg, we're asked to ignore all subnodes of the 542 // current node - we also advance any iterators in the heap that have the current 543 // path as a prefix. 544 func (it *unionIterator) Next(descend bool) bool { 545 if len(*it.items) == 0 { 546 return false 547 } 548 549 // Get the next key from the union 550 least := heap.Pop(it.items).(NodeIterator) 551 552 // Skip over other nodes as long as they're identical, or, if we're not descending, as 553 // long as they have the same prefix as the current node. 554 for len(*it.items) > 0 && ((!descend && bytes.HasPrefix((*it.items)[0].Path(), least.Path())) || compareNodes(least, (*it.items)[0]) == 0) { 555 skipped := heap.Pop(it.items).(NodeIterator) 556 // Skip the whole subtree if the nodes have hashes; otherwise just skip this node 557 if skipped.Next(skipped.Hash() == common.Hash{}) { 558 it.count++ 559 // If there are more elements, push the iterator back on the heap 560 heap.Push(it.items, skipped) 561 } 562 } 563 if least.Next(descend) { 564 it.count++ 565 heap.Push(it.items, least) 566 } 567 return len(*it.items) > 0 568 } 569 570 func (it *unionIterator) Error() error { 571 for i := 0; i < len(*it.items); i++ { 572 if err := (*it.items)[i].Error(); err != nil { 573 return err 574 } 575 } 576 return nil 577 }