review feedback + add test

This commit is contained in:
Guillaume Ballet 2023-10-19 11:06:43 +02:00 committed by Gary Rong
parent 6bd99818e8
commit a02c50cd97
4 changed files with 70 additions and 22 deletions

View file

@ -20,7 +20,6 @@ import (
"encoding/json" "encoding/json"
"errors" "errors"
"fmt" "fmt"
"math/big"
"os" "os"
"runtime" "runtime"
"strconv" "strconv"
@ -212,7 +211,7 @@ func initGenesis(ctx *cli.Context) error {
} }
defer chaindb.Close() defer chaindb.Close()
triedb := utils.MakeTrieDatabase(ctx, chaindb, ctx.Bool(utils.CachePreimagesFlag.Name), false, genesis.Config.IsVerkle(big.NewInt(0), genesis.Timestamp)) triedb := utils.MakeTrieDatabase(ctx, chaindb, ctx.Bool(utils.CachePreimagesFlag.Name), false, genesis.IsVerkle())
defer triedb.Close() defer triedb.Close()
_, hash, err := core.SetupGenesisBlockWithOverride(chaindb, triedb, genesis, &overrides) _, hash, err := core.SetupGenesisBlockWithOverride(chaindb, triedb, genesis, &overrides)

View file

@ -17,6 +17,7 @@
package core package core
import ( import (
"bytes"
"encoding/json" "encoding/json"
"math/big" "math/big"
"reflect" "reflect"
@ -261,3 +262,50 @@ func newDbConfig(scheme string) *trie.Config {
} }
return &trie.Config{PathDB: pathdb.Defaults} return &trie.Config{PathDB: pathdb.Defaults}
} }
func TestVerkleGenesisCommit(t *testing.T) {
var verkleTime uint64 = 0
verkleConfig := &params.ChainConfig{
ChainID: big.NewInt(1),
HomesteadBlock: big.NewInt(0),
DAOForkBlock: nil,
DAOForkSupport: false,
EIP150Block: big.NewInt(0),
EIP155Block: big.NewInt(0),
EIP158Block: big.NewInt(0),
ByzantiumBlock: big.NewInt(0),
ConstantinopleBlock: big.NewInt(0),
PetersburgBlock: big.NewInt(0),
IstanbulBlock: big.NewInt(0),
MuirGlacierBlock: big.NewInt(0),
BerlinBlock: big.NewInt(0),
LondonBlock: big.NewInt(0),
ArrowGlacierBlock: big.NewInt(0),
GrayGlacierBlock: big.NewInt(0),
MergeNetsplitBlock: nil,
ShanghaiTime: nil,
CancunTime: nil,
PragueTime: nil,
VerkleTime: &verkleTime,
TerminalTotalDifficulty: nil,
TerminalTotalDifficultyPassed: true,
Ethash: nil,
Clique: nil,
}
genesis := &Genesis{
BaseFee: big.NewInt(params.InitialBaseFee),
Config: verkleConfig,
Timestamp: verkleTime,
// difficulty is nil
Alloc: GenesisAlloc{
{1}: {Balance: big.NewInt(1), Storage: map[common.Hash]common.Hash{{1}: {1}}},
},
}
expected := common.Hex2Bytes("14398d42be3394ff8d50681816a4b7bf8d8283306f577faba2d5bc57498de23b")
got := genesis.ToBlock().Root().Bytes()
if !bytes.Equal(got, expected) {
t.Fatalf("invalid genesis state root, expected %x, got %x", expected, got)
}
}

View file

@ -177,15 +177,21 @@ func (db *cachingDB) OpenTrie(root common.Hash) (Trie, error) {
if err != nil { if err != nil {
return nil, fmt.Errorf("failed to get node reader in OpenTrie: %w", err) return nil, fmt.Errorf("failed to get node reader in OpenTrie: %w", err)
} }
var verkleroot verkle.VerkleNode
if root != (common.Hash{}) && root != types.EmptyRootHash {
verklerootbytes, err := reader.Node(common.Hash{}, nil, common.Hash{}) verklerootbytes, err := reader.Node(common.Hash{}, nil, common.Hash{})
if err != nil { if err != nil {
return nil, fmt.Errorf("failed to get serialized root node in OpenTrie: %w", err) return nil, fmt.Errorf("failed to get serialized root node in OpenTrie: %w", err)
} }
verkleroot, err := verkle.ParseNode(verklerootbytes, 0) verkleroot, err = verkle.ParseNode(verklerootbytes, 0)
if err != nil { if err != nil {
return nil, fmt.Errorf("failed to deserialize root node in OpenTrie: %w", err) return nil, fmt.Errorf("failed to deserialize root node in OpenTrie: %w", err)
} }
return trie.NewVerkleTrie(verkleroot, db.triedb, utils.NewPointCache(), true) } else {
verkleroot = verkle.New()
}
return trie.NewVerkleTrie(root, verkleroot, db.triedb, utils.NewPointCache(), true)
} }
tr, err := trie.NewStateTrie(trie.StateTrieID(root), db.triedb) tr, err := trie.NewStateTrie(trie.StateTrieID(root), db.triedb)
if err != nil { if err != nil {

View file

@ -17,7 +17,6 @@
package trie package trie
import ( import (
"crypto/sha256"
"encoding/binary" "encoding/binary"
"errors" "errors"
"fmt" "fmt"
@ -39,6 +38,7 @@ type VerkleTrie struct {
db *Database db *Database
pointCache *utils.PointCache pointCache *utils.PointCache
ended bool ended bool
rootHash common.Hash
reader *trieReader reader *trieReader
} }
@ -46,9 +46,7 @@ func (vt *VerkleTrie) ToDot() string {
return verkle.ToDot(vt.root) return verkle.ToDot(vt.root)
} }
func NewVerkleTrie(root verkle.VerkleNode, db *Database, pointCache *utils.PointCache, ended bool) (*VerkleTrie, error) { func NewVerkleTrie(rootHash common.Hash, root verkle.VerkleNode, db *Database, pointCache *utils.PointCache, ended bool) (*VerkleTrie, error) {
comm := root.Commit().Bytes()
rootHash := sha256.Sum256(comm[:])
reader, err := newTrieReader(rootHash, common.Hash{}, db) reader, err := newTrieReader(rootHash, common.Hash{}, db)
if err != nil { if err != nil {
return nil, err return nil, err
@ -58,14 +56,12 @@ func NewVerkleTrie(root verkle.VerkleNode, db *Database, pointCache *utils.Point
db: db, db: db,
pointCache: pointCache, pointCache: pointCache,
ended: ended, ended: ended,
rootHash: rootHash,
reader: reader, reader: reader,
}, nil }, nil
} }
func (trie *VerkleTrie) FlatdbNodeResolver(path []byte) ([]byte, error) { func (trie *VerkleTrie) FlatdbNodeResolver(path []byte) ([]byte, error) {
// NOTE: I use common.Hash{} as the hash, as I expect it to be ignored
// since we are using the pathdb. @rjl493456442 please confirm that this
// works.
return trie.reader.reader.Node(trie.reader.owner, path, common.Hash{}) return trie.reader.reader.Node(trie.reader.owner, path, common.Hash{})
} }
@ -248,14 +244,13 @@ func (trie *VerkleTrie) Commit(_ bool) (common.Hash, *trienode.NodeSet, error) {
nodeset := trienode.NewNodeSet(common.Hash{}) nodeset := trienode.NewNodeSet(common.Hash{})
for _, node := range nodes { for _, node := range nodes {
comm := node.Node.Commitment().Bytes() // hash parameter is not used in pathdb
hash := sha256.Sum256(comm[:]) nodeset.AddNode(node.Path, trienode.New(common.Hash{}, node.SerializedBytes))
nodeset.AddNode(node.Path, trienode.New(common.BytesToHash(hash[:]), node.SerializedBytes))
} }
// Serialize root commitment form // Serialize root commitment form
rootH := root.Hash().BytesLE() trie.rootHash = trie.Hash()
return common.BytesToHash(rootH[:]), nodeset, nil return trie.rootHash, nodeset, nil
} }
// NodeIterator returns an iterator that returns nodes of the trie. Iteration // NodeIterator returns an iterator that returns nodes of the trie. Iteration