|
|
@ -86,6 +86,10 @@ type NodeIterator interface { |
|
|
|
// For leaf nodes, the last element of the path is the 'terminator symbol' 0x10.
|
|
|
|
// For leaf nodes, the last element of the path is the 'terminator symbol' 0x10.
|
|
|
|
Path() []byte |
|
|
|
Path() []byte |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// NodeBlob returns the rlp-encoded value of the current iterated node.
|
|
|
|
|
|
|
|
// If the node is an embedded node in its parent, nil is returned then.
|
|
|
|
|
|
|
|
NodeBlob() []byte |
|
|
|
|
|
|
|
|
|
|
|
// Leaf returns true iff the current node is a leaf node.
|
|
|
|
// Leaf returns true iff the current node is a leaf node.
|
|
|
|
Leaf() bool |
|
|
|
Leaf() bool |
|
|
|
|
|
|
|
|
|
|
@ -224,6 +228,18 @@ func (it *nodeIterator) Path() []byte { |
|
|
|
return it.path |
|
|
|
return it.path |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
func (it *nodeIterator) NodeBlob() []byte { |
|
|
|
|
|
|
|
if it.Hash() == (common.Hash{}) { |
|
|
|
|
|
|
|
return nil // skip the non-standalone node
|
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
blob, err := it.resolveBlob(it.Hash().Bytes(), it.Path()) |
|
|
|
|
|
|
|
if err != nil { |
|
|
|
|
|
|
|
it.err = err |
|
|
|
|
|
|
|
return nil |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
return blob |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
func (it *nodeIterator) Error() error { |
|
|
|
func (it *nodeIterator) Error() error { |
|
|
|
if it.err == errIteratorEnd { |
|
|
|
if it.err == errIteratorEnd { |
|
|
|
return nil |
|
|
|
return nil |
|
|
@ -362,6 +378,15 @@ func (it *nodeIterator) resolveHash(hash hashNode, path []byte) (node, error) { |
|
|
|
return resolved, err |
|
|
|
return resolved, err |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
func (it *nodeIterator) resolveBlob(hash hashNode, path []byte) ([]byte, error) { |
|
|
|
|
|
|
|
if it.resolver != nil { |
|
|
|
|
|
|
|
if blob, err := it.resolver.Get(hash); err == nil && len(blob) > 0 { |
|
|
|
|
|
|
|
return blob, nil |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
return it.trie.resolveBlob(hash, path) |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
func (st *nodeIteratorState) resolve(it *nodeIterator, path []byte) error { |
|
|
|
func (st *nodeIteratorState) resolve(it *nodeIterator, path []byte) error { |
|
|
|
if hash, ok := st.node.(hashNode); ok { |
|
|
|
if hash, ok := st.node.(hashNode); ok { |
|
|
|
resolved, err := it.resolveHash(hash, path) |
|
|
|
resolved, err := it.resolveHash(hash, path) |
|
|
@ -549,6 +574,10 @@ func (it *differenceIterator) Path() []byte { |
|
|
|
return it.b.Path() |
|
|
|
return it.b.Path() |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
func (it *differenceIterator) NodeBlob() []byte { |
|
|
|
|
|
|
|
return it.b.NodeBlob() |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
func (it *differenceIterator) AddResolver(resolver ethdb.KeyValueReader) { |
|
|
|
func (it *differenceIterator) AddResolver(resolver ethdb.KeyValueReader) { |
|
|
|
panic("not implemented") |
|
|
|
panic("not implemented") |
|
|
|
} |
|
|
|
} |
|
|
@ -660,6 +689,10 @@ func (it *unionIterator) Path() []byte { |
|
|
|
return (*it.items)[0].Path() |
|
|
|
return (*it.items)[0].Path() |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
func (it *unionIterator) NodeBlob() []byte { |
|
|
|
|
|
|
|
return (*it.items)[0].NodeBlob() |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
func (it *unionIterator) AddResolver(resolver ethdb.KeyValueReader) { |
|
|
|
func (it *unionIterator) AddResolver(resolver ethdb.KeyValueReader) { |
|
|
|
panic("not implemented") |
|
|
|
panic("not implemented") |
|
|
|
} |
|
|
|
} |
|
|
|