|
|
|
@ -17,6 +17,7 @@ |
|
|
|
|
package trie |
|
|
|
|
|
|
|
|
|
import ( |
|
|
|
|
"errors" |
|
|
|
|
"fmt" |
|
|
|
|
"sync" |
|
|
|
|
|
|
|
|
@ -26,6 +27,8 @@ import ( |
|
|
|
|
"github.com/ethereum/go-ethereum/rlp" |
|
|
|
|
) |
|
|
|
|
|
|
|
|
|
var ErrCommitDisabled = errors.New("no database for committing") |
|
|
|
|
|
|
|
|
|
var stPool = sync.Pool{ |
|
|
|
|
New: func() interface{} { |
|
|
|
|
return NewStackTrie(nil) |
|
|
|
@ -391,14 +394,18 @@ func (st *StackTrie) Hash() (h common.Hash) { |
|
|
|
|
return common.BytesToHash(st.val) |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
// Commit will commit the current node to database db
|
|
|
|
|
func (st *StackTrie) Commit(db ethdb.KeyValueStore) common.Hash { |
|
|
|
|
oldDb := st.db |
|
|
|
|
st.db = db |
|
|
|
|
defer func() { |
|
|
|
|
st.db = oldDb |
|
|
|
|
}() |
|
|
|
|
// Commit will firstly hash the entrie trie if it's still not hashed
|
|
|
|
|
// and then commit all nodes to the associated database. Actually most
|
|
|
|
|
// of the trie nodes MAY have been committed already. The main purpose
|
|
|
|
|
// here is to commit the root node.
|
|
|
|
|
//
|
|
|
|
|
// The associated database is expected, otherwise the whole commit
|
|
|
|
|
// functionality should be disabled.
|
|
|
|
|
func (st *StackTrie) Commit() (common.Hash, error) { |
|
|
|
|
if st.db == nil { |
|
|
|
|
return common.Hash{}, ErrCommitDisabled |
|
|
|
|
} |
|
|
|
|
st.hash() |
|
|
|
|
h := common.BytesToHash(st.val) |
|
|
|
|
return h |
|
|
|
|
return h, nil |
|
|
|
|
} |
|
|
|
|