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