mirror of
https://github.com/ethereum/go-ethereum.git
synced 2026-07-22 12:46:44 +00:00
simpify binary tree recursion
This commit is contained in:
parent
d972963de6
commit
ed3caba92a
2 changed files with 72 additions and 20 deletions
|
|
@ -427,7 +427,11 @@ func GenerateChain(config *params.ChainConfig, parent *types.Block, engine conse
|
|||
}
|
||||
|
||||
// Forcibly use hash-based state scheme for retaining all nodes in disk.
|
||||
triedb := triedb.NewDatabase(db, triedb.HashDefaults)
|
||||
var triedbConfig *triedb.Config = triedb.HashDefaults
|
||||
if config.IsVerkle(config.ChainID, 0) {
|
||||
triedbConfig = triedb.VerkleDefaults
|
||||
}
|
||||
triedb := triedb.NewDatabase(db, triedbConfig)
|
||||
defer triedb.Close()
|
||||
|
||||
for i := 0; i < n; i++ {
|
||||
|
|
@ -472,7 +476,11 @@ func GenerateChain(config *params.ChainConfig, parent *types.Block, engine conse
|
|||
// then generate chain on top.
|
||||
func GenerateChainWithGenesis(genesis *Genesis, engine consensus.Engine, n int, gen func(int, *BlockGen)) (ethdb.Database, []*types.Block, []types.Receipts) {
|
||||
db := rawdb.NewMemoryDatabase()
|
||||
triedb := triedb.NewDatabase(db, triedb.HashDefaults)
|
||||
var triedbConfig *triedb.Config = triedb.HashDefaults
|
||||
if genesis.Config != nil && genesis.Config.IsVerkle(genesis.Config.ChainID, 0) {
|
||||
triedbConfig = triedb.VerkleDefaults
|
||||
}
|
||||
triedb := triedb.NewDatabase(db, triedbConfig)
|
||||
defer triedb.Close()
|
||||
_, err := genesis.Commit(db, triedb)
|
||||
if err != nil {
|
||||
|
|
|
|||
|
|
@ -49,14 +49,27 @@ func (bt *InternalNode) GetValuesAtStem(stem []byte, resolver NodeResolverFn) ([
|
|||
}
|
||||
|
||||
bit := stem[bt.depth/8] >> (7 - (bt.depth % 8)) & 1
|
||||
var child *BinaryNode
|
||||
if bit == 0 {
|
||||
child = &bt.left
|
||||
} else {
|
||||
child = &bt.right
|
||||
if hn, ok := bt.left.(HashedNode); ok {
|
||||
path, err := keyToPath(bt.depth, stem)
|
||||
if err != nil {
|
||||
return nil, fmt.Errorf("GetValuesAtStem resolve error: %w", err)
|
||||
}
|
||||
data, err := resolver(path, common.Hash(hn))
|
||||
if err != nil {
|
||||
return nil, fmt.Errorf("GetValuesAtStem resolve error: %w", err)
|
||||
}
|
||||
node, err := DeserializeNode(data, bt.depth+1)
|
||||
if err != nil {
|
||||
return nil, fmt.Errorf("GetValuesAtStem node deserialization error: %w", err)
|
||||
}
|
||||
bt.left = node
|
||||
}
|
||||
return bt.left.GetValuesAtStem(stem, resolver)
|
||||
|
||||
}
|
||||
|
||||
if hn, ok := (*child).(HashedNode); ok {
|
||||
if hn, ok := bt.right.(HashedNode); ok {
|
||||
path, err := keyToPath(bt.depth, stem)
|
||||
if err != nil {
|
||||
return nil, fmt.Errorf("GetValuesAtStem resolve error: %w", err)
|
||||
|
|
@ -69,9 +82,9 @@ func (bt *InternalNode) GetValuesAtStem(stem []byte, resolver NodeResolverFn) ([
|
|||
if err != nil {
|
||||
return nil, fmt.Errorf("GetValuesAtStem node deserialization error: %w", err)
|
||||
}
|
||||
*child = node
|
||||
bt.right = node
|
||||
}
|
||||
return (*child).GetValuesAtStem(stem, resolver)
|
||||
return bt.right.GetValuesAtStem(stem, resolver)
|
||||
}
|
||||
|
||||
// Get retrieves the value for the given key.
|
||||
|
|
@ -118,23 +131,54 @@ func (bt *InternalNode) Hash() common.Hash {
|
|||
// InsertValuesAtStem inserts a full value group at the given stem in the internal node.
|
||||
// Already-existing values will be overwritten.
|
||||
func (bt *InternalNode) InsertValuesAtStem(stem []byte, values [][]byte, resolver NodeResolverFn, depth int) (BinaryNode, error) {
|
||||
var (
|
||||
child *BinaryNode
|
||||
err error
|
||||
)
|
||||
var err error
|
||||
bit := stem[bt.depth/8] >> (7 - (bt.depth % 8)) & 1
|
||||
if bit == 0 {
|
||||
child = &bt.left
|
||||
} else {
|
||||
child = &bt.right
|
||||
if bt.left == nil {
|
||||
bt.left = Empty{}
|
||||
}
|
||||
|
||||
if hn, ok := bt.left.(HashedNode); ok {
|
||||
path, err := keyToPath(bt.depth, stem)
|
||||
if err != nil {
|
||||
return nil, fmt.Errorf("InsertValuesAtStem resolve error: %w", err)
|
||||
}
|
||||
data, err := resolver(path, common.Hash(hn))
|
||||
if err != nil {
|
||||
return nil, fmt.Errorf("InsertValuesAtStem resolve error: %w", err)
|
||||
}
|
||||
node, err := DeserializeNode(data, bt.depth+1)
|
||||
if err != nil {
|
||||
return nil, fmt.Errorf("InsertValuesAtStem node deserialization error: %w", err)
|
||||
}
|
||||
bt.left = node
|
||||
}
|
||||
|
||||
bt.left, err = bt.left.InsertValuesAtStem(stem, values, resolver, depth+1)
|
||||
return bt, err
|
||||
}
|
||||
|
||||
// Initialize child to Empty if it's nil
|
||||
if *child == nil {
|
||||
*child = Empty{}
|
||||
if bt.right == nil {
|
||||
bt.right = Empty{}
|
||||
}
|
||||
|
||||
*child, err = (*child).InsertValuesAtStem(stem, values, resolver, depth+1)
|
||||
if hn, ok := bt.right.(HashedNode); ok {
|
||||
path, err := keyToPath(bt.depth, stem)
|
||||
if err != nil {
|
||||
return nil, fmt.Errorf("InsertValuesAtStem resolve error: %w", err)
|
||||
}
|
||||
data, err := resolver(path, common.Hash(hn))
|
||||
if err != nil {
|
||||
return nil, fmt.Errorf("InsertValuesAtStem resolve error: %w", err)
|
||||
}
|
||||
node, err := DeserializeNode(data, bt.depth+1)
|
||||
if err != nil {
|
||||
return nil, fmt.Errorf("InsertValuesAtStem node deserialization error: %w", err)
|
||||
}
|
||||
bt.right = node
|
||||
}
|
||||
|
||||
bt.right, err = bt.right.InsertValuesAtStem(stem, values, resolver, depth+1)
|
||||
return bt, err
|
||||
}
|
||||
|
||||
|
|
|
|||
Loading…
Reference in a new issue