cmd, core/state, eth, tests, trie: improve state reader (#27428)
The state availability is checked during the creation of a state reader.
- In hash-based database, if the specified root node does not exist on disk disk, then
the state reader won't be created and an error will be returned.
- In path-based database, if the specified state layer is not available, then the
state reader won't be created and an error will be returned.
This change also contains a stricter semantics regarding the `Commit` operation: once it has been performed, the trie is no longer usable, and certain operations will return an error.
This commit is contained in:
+7
-3
@@ -184,8 +184,8 @@ func (t *odrTrie) Hash() common.Hash {
|
||||
return t.trie.Hash()
|
||||
}
|
||||
|
||||
func (t *odrTrie) NodeIterator(startkey []byte) trie.NodeIterator {
|
||||
return newNodeIterator(t, startkey)
|
||||
func (t *odrTrie) NodeIterator(startkey []byte) (trie.NodeIterator, error) {
|
||||
return newNodeIterator(t, startkey), nil
|
||||
}
|
||||
|
||||
func (t *odrTrie) GetKey(sha []byte) []byte {
|
||||
@@ -248,7 +248,11 @@ func newNodeIterator(t *odrTrie, startkey []byte) trie.NodeIterator {
|
||||
})
|
||||
}
|
||||
it.do(func() error {
|
||||
it.NodeIterator = it.t.trie.NodeIterator(startkey)
|
||||
var err error
|
||||
it.NodeIterator, err = it.t.trie.NodeIterator(startkey)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
return it.NodeIterator.Error()
|
||||
})
|
||||
return it
|
||||
|
||||
+10
-2
@@ -62,8 +62,16 @@ func TestNodeIterator(t *testing.T) {
|
||||
}
|
||||
|
||||
func diffTries(t1, t2 state.Trie) error {
|
||||
i1 := trie.NewIterator(t1.NodeIterator(nil))
|
||||
i2 := trie.NewIterator(t2.NodeIterator(nil))
|
||||
trieIt1, err := t1.NodeIterator(nil)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
trieIt2, err := t2.NodeIterator(nil)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
i1 := trie.NewIterator(trieIt1)
|
||||
i2 := trie.NewIterator(trieIt2)
|
||||
for i1.Next() && i2.Next() {
|
||||
if !bytes.Equal(i1.Key, i2.Key) {
|
||||
spew.Dump(i2)
|
||||
|
||||
Reference in New Issue
Block a user