Skip to content

Commit 159b3bb

Browse files
committed
core/{,state}: use one triedb per tree
1 parent bb038c6 commit 159b3bb

33 files changed

+161
-112
lines changed

cmd/evm/internal/t8ntool/execution.go

+2-1
Original file line numberDiff line numberDiff line change
@@ -416,7 +416,8 @@ func (pre *Prestate) Apply(vmConfig vm.Config, chainConfig *params.ChainConfig,
416416

417417
func MakePreState(db ethdb.Database, accounts types.GenesisAlloc) *state.StateDB {
418418
tdb := triedb.NewDatabase(db, &triedb.Config{Preimages: true})
419-
sdb := state.NewDatabase(tdb, nil)
419+
vdb := triedb.NewDatabase(db, &triedb.Config{Preimages: true})
420+
sdb := state.NewDatabase(tdb, vdb, nil)
420421
statedb, _ := state.New(types.EmptyRootHash, sdb)
421422
for addr, a := range accounts {
422423
statedb.SetCode(addr, a.Code)

cmd/evm/runner.go

+3-2
Original file line numberDiff line numberDiff line change
@@ -221,13 +221,14 @@ func runCmd(ctx *cli.Context) error {
221221
}
222222

223223
db := rawdb.NewMemoryDatabase()
224+
verkledb := triedb.NewDatabase(db, triedb.VerkleDefaults)
224225
triedb := triedb.NewDatabase(db, &triedb.Config{
225226
Preimages: preimages,
226227
HashDB: hashdb.Defaults,
227228
})
228229
defer triedb.Close()
229-
genesis := genesisConfig.MustCommit(db, triedb)
230-
sdb := state.NewDatabase(triedb, nil)
230+
genesis := genesisConfig.MustCommit(db, triedb, verkledb)
231+
sdb := state.NewDatabase(triedb, verkledb, nil)
231232
prestate, _ = state.New(genesis.Root(), sdb)
232233
chainConfig = genesisConfig.Config
233234

cmd/geth/chaincmd.go

+6-4
Original file line numberDiff line numberDiff line change
@@ -243,10 +243,11 @@ func initGenesis(ctx *cli.Context) error {
243243
}
244244
defer chaindb.Close()
245245

246-
triedb := utils.MakeTrieDatabase(ctx, chaindb, ctx.Bool(utils.CachePreimagesFlag.Name), false, genesis.IsVerkle())
246+
triedb, verkledb := utils.MakeTrieDatabase(ctx, chaindb, ctx.Bool(utils.CachePreimagesFlag.Name), false, genesis.IsVerkle())
247247
defer triedb.Close()
248+
defer verkledb.Close()
248249

249-
_, hash, _, err := core.SetupGenesisBlockWithOverride(chaindb, triedb, genesis, &overrides)
250+
_, hash, _, err := core.SetupGenesisBlockWithOverride(chaindb, triedb, verkledb, genesis, &overrides)
250251
if err != nil {
251252
utils.Fatalf("Failed to write genesis block: %v", err)
252253
}
@@ -594,10 +595,11 @@ func dump(ctx *cli.Context) error {
594595
if err != nil {
595596
return err
596597
}
597-
triedb := utils.MakeTrieDatabase(ctx, db, true, true, false) // always enable preimage lookup
598+
triedb, verkledb := utils.MakeTrieDatabase(ctx, db, true, true, false) // always enable preimage lookup
598599
defer triedb.Close()
600+
defer verkledb.Close()
599601

600-
state, err := state.New(root, state.NewDatabase(triedb, nil))
602+
state, err := state.New(root, state.NewDatabase(triedb, verkledb, nil))
601603
if err != nil {
602604
return err
603605
}

cmd/geth/dbcmd.go

+4-2
Original file line numberDiff line numberDiff line change
@@ -524,8 +524,9 @@ func dbDumpTrie(ctx *cli.Context) error {
524524
db := utils.MakeChainDatabase(ctx, stack, true)
525525
defer db.Close()
526526

527-
triedb := utils.MakeTrieDatabase(ctx, db, false, true, false)
527+
triedb, verkledb := utils.MakeTrieDatabase(ctx, db, false, true, false)
528528
defer triedb.Close()
529+
defer verkledb.Close()
529530

530531
var (
531532
state []byte
@@ -859,8 +860,9 @@ func inspectHistory(ctx *cli.Context) error {
859860
db := utils.MakeChainDatabase(ctx, stack, true)
860861
defer db.Close()
861862

862-
triedb := utils.MakeTrieDatabase(ctx, db, false, false, false)
863+
triedb, verkledb := utils.MakeTrieDatabase(ctx, db, false, false, false)
863864
defer triedb.Close()
865+
defer verkledb.Close()
864866

865867
var (
866868
err error

cmd/geth/snapshot.go

+10-5
Original file line numberDiff line numberDiff line change
@@ -217,8 +217,9 @@ func verifyState(ctx *cli.Context) error {
217217
log.Error("Failed to load head block")
218218
return errors.New("no head block")
219219
}
220-
triedb := utils.MakeTrieDatabase(ctx, chaindb, false, true, false)
220+
triedb, verkledb := utils.MakeTrieDatabase(ctx, chaindb, false, true, false)
221221
defer triedb.Close()
222+
defer verkledb.Close()
222223

223224
snapConfig := snapshot.Config{
224225
CacheSize: 256,
@@ -272,8 +273,9 @@ func traverseState(ctx *cli.Context) error {
272273
chaindb := utils.MakeChainDatabase(ctx, stack, true)
273274
defer chaindb.Close()
274275

275-
triedb := utils.MakeTrieDatabase(ctx, chaindb, false, true, false)
276+
triedb, verkledb := utils.MakeTrieDatabase(ctx, chaindb, false, true, false)
276277
defer triedb.Close()
278+
defer verkledb.Close()
277279

278280
headBlock := rawdb.ReadHeadBlock(chaindb)
279281
if headBlock == nil {
@@ -381,8 +383,9 @@ func traverseRawState(ctx *cli.Context) error {
381383
chaindb := utils.MakeChainDatabase(ctx, stack, true)
382384
defer chaindb.Close()
383385

384-
triedb := utils.MakeTrieDatabase(ctx, chaindb, false, true, false)
386+
triedb, verkledb := utils.MakeTrieDatabase(ctx, chaindb, false, true, false)
385387
defer triedb.Close()
388+
defer verkledb.Close()
386389

387390
headBlock := rawdb.ReadHeadBlock(chaindb)
388391
if headBlock == nil {
@@ -548,8 +551,9 @@ func dumpState(ctx *cli.Context) error {
548551
if err != nil {
549552
return err
550553
}
551-
triedb := utils.MakeTrieDatabase(ctx, db, false, true, false)
554+
triedb, verkledb := utils.MakeTrieDatabase(ctx, db, false, true, false)
552555
defer triedb.Close()
556+
defer verkledb.Close()
553557

554558
snapConfig := snapshot.Config{
555559
CacheSize: 256,
@@ -630,8 +634,9 @@ func snapshotExportPreimages(ctx *cli.Context) error {
630634
chaindb := utils.MakeChainDatabase(ctx, stack, true)
631635
defer chaindb.Close()
632636

633-
triedb := utils.MakeTrieDatabase(ctx, chaindb, false, true, false)
637+
triedb, verkledb := utils.MakeTrieDatabase(ctx, chaindb, false, true, false)
634638
defer triedb.Close()
639+
defer verkledb.Close()
635640

636641
var root common.Hash
637642
if ctx.NArg() > 1 {

cmd/utils/flags.go

+3-3
Original file line numberDiff line numberDiff line change
@@ -2262,7 +2262,7 @@ func MakeConsolePreloads(ctx *cli.Context) []string {
22622262
}
22632263

22642264
// MakeTrieDatabase constructs a trie database based on the configured scheme.
2265-
func MakeTrieDatabase(ctx *cli.Context, disk ethdb.Database, preimage bool, readOnly bool, isVerkle bool) *triedb.Database {
2265+
func MakeTrieDatabase(ctx *cli.Context, disk ethdb.Database, preimage bool, readOnly bool, isVerkle bool) (*triedb.Database, *triedb.Database) {
22662266
config := &triedb.Config{
22672267
Preimages: preimage,
22682268
IsVerkle: isVerkle,
@@ -2276,12 +2276,12 @@ func MakeTrieDatabase(ctx *cli.Context, disk ethdb.Database, preimage bool, read
22762276
// ignore the parameter silently. TODO(rjl493456442)
22772277
// please config it if read mode is implemented.
22782278
config.HashDB = hashdb.Defaults
2279-
return triedb.NewDatabase(disk, config)
2279+
return triedb.NewDatabase(disk, config), triedb.NewDatabase(disk, triedb.VerkleDefaults)
22802280
}
22812281
if readOnly {
22822282
config.PathDB = pathdb.ReadOnly
22832283
} else {
22842284
config.PathDB = pathdb.Defaults
22852285
}
2286-
return triedb.NewDatabase(disk, config)
2286+
return triedb.NewDatabase(disk, config), triedb.NewDatabase(disk, triedb.VerkleDefaults)
22872287
}

cmd/utils/history_test.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -166,7 +166,7 @@ func TestHistoryImportAndExport(t *testing.T) {
166166
db2.Close()
167167
})
168168

169-
genesis.MustCommit(db2, triedb.NewDatabase(db2, triedb.HashDefaults))
169+
genesis.MustCommit(db2, triedb.NewDatabase(db2, triedb.HashDefaults), triedb.NewDatabase(db2, triedb.VerkleDefaults))
170170
imported, err := core.NewBlockChain(db2, nil, genesis, nil, ethash.NewFaker(), vm.Config{}, nil)
171171
if err != nil {
172172
t.Fatalf("unable to initialize chain: %v", err)

core/blockchain.go

+9-3
Original file line numberDiff line numberDiff line change
@@ -234,6 +234,7 @@ type BlockChain struct {
234234
lastWrite uint64 // Last block when the state was flushed
235235
flushInterval atomic.Int64 // Time interval (processing time) after which to flush a state
236236
triedb *triedb.Database // The database handler for maintaining trie nodes.
237+
verkledb *triedb.Database // The database handler for maintaining verkle trie nodes.
237238
statedb *state.CachingDB // State database to reuse between imports (contains state cache)
238239
txIndexer *txIndexer // Transaction indexer, might be nil if not enabled
239240

@@ -283,13 +284,14 @@ func NewBlockChain(db ethdb.Database, cacheConfig *CacheConfig, genesis *Genesis
283284
if cacheConfig == nil {
284285
cacheConfig = defaultCacheConfig
285286
}
287+
verkledb := triedb.NewDatabase(db, triedb.VerkleDefaults)
286288
triedb := triedb.NewDatabase(db, cacheConfig.triedbConfig(genesis.IsVerkle()))
287289

288290
// Write the supplied genesis to the database if it has not been initialized
289291
// yet. The corresponding chain config will be returned, either from the
290292
// provided genesis or from the locally stored configuration if the genesis
291293
// has already been initialized.
292-
chainConfig, genesisHash, compatErr, err := SetupGenesisBlockWithOverride(db, triedb, genesis, overrides)
294+
chainConfig, genesisHash, compatErr, err := SetupGenesisBlockWithOverride(db, triedb, verkledb, genesis, overrides)
293295
if err != nil {
294296
return nil, err
295297
}
@@ -306,6 +308,7 @@ func NewBlockChain(db ethdb.Database, cacheConfig *CacheConfig, genesis *Genesis
306308
cacheConfig: cacheConfig,
307309
db: db,
308310
triedb: triedb,
311+
verkledb: verkledb,
309312
triegc: prque.New[int64, common.Hash](nil),
310313
quit: make(chan struct{}),
311314
chainmu: syncx.NewClosableMutex(),
@@ -323,7 +326,7 @@ func NewBlockChain(db ethdb.Database, cacheConfig *CacheConfig, genesis *Genesis
323326
return nil, err
324327
}
325328
bc.flushInterval.Store(int64(cacheConfig.TrieTimeLimit))
326-
bc.statedb = state.NewDatabase(bc.triedb, nil)
329+
bc.statedb = state.NewDatabase(bc.triedb, bc.verkledb, nil)
327330
bc.validator = NewBlockValidator(chainConfig, bc)
328331
bc.prefetcher = newStatePrefetcher(chainConfig, bc.hc)
329332
bc.processor = NewStateProcessor(chainConfig, bc.hc)
@@ -464,7 +467,7 @@ func NewBlockChain(db ethdb.Database, cacheConfig *CacheConfig, genesis *Genesis
464467
bc.snaps, _ = snapshot.New(snapconfig, bc.db, bc.triedb, head.Root)
465468

466469
// Re-initialize the state database with snapshot
467-
bc.statedb = state.NewDatabase(bc.triedb, bc.snaps)
470+
bc.statedb = state.NewDatabase(bc.triedb, bc.verkledb, bc.snaps)
468471
}
469472

470473
// Rewind the chain in case of an incompatible config upgrade.
@@ -1168,6 +1171,9 @@ func (bc *BlockChain) Stop() {
11681171
if err := bc.triedb.Close(); err != nil {
11691172
log.Error("Failed to close trie database", "err", err)
11701173
}
1174+
if err := bc.verkledb.Close(); err != nil {
1175+
log.Error("Failed to close the verkle trie database", "err", err)
1176+
}
11711177
log.Info("Blockchain stopped")
11721178
}
11731179

core/blockchain_repair_test.go

+2
Original file line numberDiff line numberDiff line change
@@ -1846,6 +1846,7 @@ func testRepairWithScheme(t *testing.T, tt *rewindTest, snapshots bool, scheme s
18461846
}
18471847
// Pull the plug on the database, simulating a hard crash
18481848
chain.triedb.Close()
1849+
chain.verkledb.Close()
18491850
db.Close()
18501851
chain.stopWithoutSaving()
18511852

@@ -1969,6 +1970,7 @@ func testIssue23496(t *testing.T, scheme string) {
19691970

19701971
// Pull the plug on the database, simulating a hard crash
19711972
chain.triedb.Close()
1973+
chain.verkledb.Close()
19721974
db.Close()
19731975
chain.stopWithoutSaving()
19741976

core/blockchain_sethead_test.go

+3-1
Original file line numberDiff line numberDiff line change
@@ -2034,14 +2034,16 @@ func testSetHeadWithScheme(t *testing.T, tt *rewindTest, snapshots bool, scheme
20342034
}
20352035
// Reopen the trie database without persisting in-memory dirty nodes.
20362036
chain.triedb.Close()
2037+
chain.verkledb.Close()
20372038
dbconfig := &triedb.Config{}
20382039
if scheme == rawdb.PathScheme {
20392040
dbconfig.PathDB = pathdb.Defaults
20402041
} else {
20412042
dbconfig.HashDB = hashdb.Defaults
20422043
}
20432044
chain.triedb = triedb.NewDatabase(chain.db, dbconfig)
2044-
chain.statedb = state.NewDatabase(chain.triedb, chain.snaps)
2045+
chain.verkledb = triedb.NewDatabase(chain.db, triedb.VerkleDefaults)
2046+
chain.statedb = state.NewDatabase(chain.triedb, chain.verkledb, chain.snaps)
20452047

20462048
// Force run a freeze cycle
20472049
type freezer interface {

core/blockchain_snapshot_test.go

+2
Original file line numberDiff line numberDiff line change
@@ -255,6 +255,7 @@ func (snaptest *crashSnapshotTest) test(t *testing.T) {
255255
db.Close()
256256
chain.stopWithoutSaving()
257257
chain.triedb.Close()
258+
chain.verkledb.Close()
258259

259260
// Start a new blockchain back up and see where the repair leads us
260261
pdb, err := pebble.New(snaptest.datadir, 0, 0, "", false, true)
@@ -410,6 +411,7 @@ func (snaptest *wipeCrashSnapshotTest) test(t *testing.T) {
410411

411412
// Simulate the blockchain crash.
412413
tmp.triedb.Close()
414+
tmp.verkledb.Close()
413415
tmp.stopWithoutSaving()
414416

415417
newchain, err = NewBlockChain(snaptest.db, DefaultCacheConfigWithScheme(snaptest.scheme), snaptest.gspec, nil, snaptest.engine, vm.Config{}, nil)

core/chain_makers.go

+13-7
Original file line numberDiff line numberDiff line change
@@ -422,12 +422,15 @@ func GenerateChain(config *params.ChainConfig, parent *types.Block, engine conse
422422
return block, b.receipts
423423
}
424424

425+
verkledb := triedb.NewDatabase(db, triedb.VerkleDefaults)
426+
defer verkledb.Close()
427+
425428
// Forcibly use hash-based state scheme for retaining all nodes in disk.
426429
triedb := triedb.NewDatabase(db, triedb.HashDefaults)
427430
defer triedb.Close()
428431

429432
for i := 0; i < n; i++ {
430-
statedb, err := state.New(parent.Root(), state.NewDatabase(triedb, nil))
433+
statedb, err := state.New(parent.Root(), state.NewDatabase(triedb, verkledb, nil))
431434
if err != nil {
432435
panic(err)
433436
}
@@ -468,17 +471,19 @@ func GenerateChain(config *params.ChainConfig, parent *types.Block, engine conse
468471
// then generate chain on top.
469472
func GenerateChainWithGenesis(genesis *Genesis, engine consensus.Engine, n int, gen func(int, *BlockGen)) (ethdb.Database, []*types.Block, []types.Receipts) {
470473
db := rawdb.NewMemoryDatabase()
474+
verkledb := triedb.NewDatabase(db, triedb.VerkleDefaults)
475+
defer verkledb.Close()
471476
triedb := triedb.NewDatabase(db, triedb.HashDefaults)
472477
defer triedb.Close()
473-
_, err := genesis.Commit(db, triedb)
478+
_, err := genesis.Commit(db, triedb, verkledb)
474479
if err != nil {
475480
panic(err)
476481
}
477482
blocks, receipts := GenerateChain(genesis.Config, genesis.ToBlock(), engine, db, n, gen)
478483
return db, blocks, receipts
479484
}
480485

481-
func GenerateVerkleChain(config *params.ChainConfig, parent *types.Block, engine consensus.Engine, db ethdb.Database, trdb *triedb.Database, n int, gen func(int, *BlockGen)) ([]*types.Block, []types.Receipts, []*verkle.VerkleProof, []verkle.StateDiff) {
486+
func GenerateVerkleChain(config *params.ChainConfig, parent *types.Block, engine consensus.Engine, db ethdb.Database, trdb, vdb *triedb.Database, n int, gen func(int, *BlockGen)) ([]*types.Block, []types.Receipts, []*verkle.VerkleProof, []verkle.StateDiff) {
482487
if config == nil {
483488
config = params.TestChainConfig
484489
}
@@ -536,7 +541,7 @@ func GenerateVerkleChain(config *params.ChainConfig, parent *types.Block, engine
536541
return block, b.receipts
537542
}
538543

539-
sdb := state.NewDatabase(trdb, nil)
544+
sdb := state.NewDatabase(trdb, vdb, nil)
540545

541546
for i := 0; i < n; i++ {
542547
statedb, err := state.New(parent.Root(), sdb)
@@ -580,13 +585,14 @@ func GenerateVerkleChainWithGenesis(genesis *Genesis, engine consensus.Engine, n
580585
saveVerkleTransitionStatusAtVerlkeGenesis(db)
581586
cacheConfig := DefaultCacheConfigWithScheme(rawdb.PathScheme)
582587
cacheConfig.SnapshotLimit = 0
583-
triedb := triedb.NewDatabase(db, cacheConfig.triedbConfig(true))
588+
verkledb := triedb.NewDatabase(db, cacheConfig.triedbConfig(true))
589+
triedb := triedb.NewDatabase(db, triedb.VerkleDefaults)
584590
defer triedb.Close()
585-
genesisBlock, err := genesis.Commit(db, triedb)
591+
genesisBlock, err := genesis.Commit(db, triedb, verkledb)
586592
if err != nil {
587593
panic(err)
588594
}
589-
blocks, receipts, proofs, keyvals := GenerateVerkleChain(genesis.Config, genesisBlock, engine, db, triedb, n, gen)
595+
blocks, receipts, proofs, keyvals := GenerateVerkleChain(genesis.Config, genesisBlock, engine, db, triedb, verkledb, n, gen)
590596
return genesisBlock.Hash(), db, blocks, receipts, proofs, keyvals
591597
}
592598

core/chain_makers_test.go

+2-2
Original file line numberDiff line numberDiff line change
@@ -75,7 +75,7 @@ func TestGeneratePOSChain(t *testing.T) {
7575
Storage: storage,
7676
Code: common.Hex2Bytes("600154600354"),
7777
}
78-
genesis := gspec.MustCommit(gendb, triedb.NewDatabase(gendb, triedb.HashDefaults))
78+
genesis := gspec.MustCommit(gendb, triedb.NewDatabase(gendb, triedb.HashDefaults), triedb.NewDatabase(gendb, triedb.VerkleDefaults))
7979
engine := beacon.New(ethash.NewFaker())
8080

8181
genchain, genreceipts := GenerateChain(gspec.Config, genesis, engine, gendb, 4, func(i int, gen *BlockGen) {
@@ -199,7 +199,7 @@ func ExampleGenerateChain() {
199199
Config: &params.ChainConfig{HomesteadBlock: new(big.Int)},
200200
Alloc: types.GenesisAlloc{addr1: {Balance: big.NewInt(1000000)}},
201201
}
202-
genesis := gspec.MustCommit(genDb, triedb.NewDatabase(genDb, triedb.HashDefaults))
202+
genesis := gspec.MustCommit(genDb, triedb.NewDatabase(genDb, triedb.HashDefaults), triedb.NewDatabase(genDb, triedb.VerkleDefaults))
203203

204204
// This call generates a chain of 5 blocks. The function runs for
205205
// each block and adds different features to gen based on the

0 commit comments

Comments
 (0)