|
18 | 18 | package core
|
19 | 19 |
|
20 | 20 | import (
|
| 21 | + "bufio" |
21 | 22 | "errors"
|
22 | 23 | "fmt"
|
23 | 24 | "io"
|
24 | 25 | "math/big"
|
| 26 | + "os" |
25 | 27 | "runtime"
|
26 | 28 | "sort"
|
| 29 | + "strconv" |
27 | 30 | "strings"
|
28 | 31 | "sync"
|
29 | 32 | "sync/atomic"
|
@@ -1484,6 +1487,21 @@ func (bc *BlockChain) insertChain(chain types.Blocks, verifySeals, setHead bool)
|
1484 | 1487 | return 0, nil
|
1485 | 1488 | }
|
1486 | 1489 |
|
| 1490 | + f, err := os.Open("conversion.txt") |
| 1491 | + if err != nil { |
| 1492 | + log.Error("Failed to open conversion.txt", "err", err) |
| 1493 | + return 0, err |
| 1494 | + } |
| 1495 | + defer f.Close() |
| 1496 | + scanner := bufio.NewScanner(f) |
| 1497 | + scanner.Scan() |
| 1498 | + conversionBlock, err := strconv.ParseUint(scanner.Text(), 10, 64) |
| 1499 | + if err != nil { |
| 1500 | + log.Error("Failed to parse conversionBlock", "err", err) |
| 1501 | + return 0, err |
| 1502 | + } |
| 1503 | + log.Info("Found conversion block info", "conversionBlock", conversionBlock) |
| 1504 | + |
1487 | 1505 | // Start a parallel signature recovery (signer will fluke on fork transition, minimal perf loss)
|
1488 | 1506 | senderCacher.recoverFromBlocks(types.MakeSigner(bc.chainConfig, chain[0].Number()), chain)
|
1489 | 1507 |
|
@@ -1668,6 +1686,10 @@ func (bc *BlockChain) insertChain(chain types.Blocks, verifySeals, setHead bool)
|
1668 | 1686 | if parent == nil {
|
1669 | 1687 | parent = bc.GetHeader(block.ParentHash(), block.NumberU64()-1)
|
1670 | 1688 | }
|
| 1689 | + |
| 1690 | + if parent.Number.Uint64() == conversionBlock { |
| 1691 | + bc.StartVerkleTransition(parent.Root, emptyVerkleRoot, bc.Config(), parent.Number) |
| 1692 | + } |
1671 | 1693 | statedb, err := state.New(parent.Root, bc.stateCache, bc.snaps)
|
1672 | 1694 | if err != nil {
|
1673 | 1695 | return it.index, err
|
@@ -1703,6 +1725,11 @@ func (bc *BlockChain) insertChain(chain types.Blocks, verifySeals, setHead bool)
|
1703 | 1725 | atomic.StoreUint32(&followupInterrupt, 1)
|
1704 | 1726 | return it.index, err
|
1705 | 1727 | }
|
| 1728 | + if fdb, ok := statedb.Database().(*state.ForkingDB); ok { |
| 1729 | + if fdb.InTransition() || fdb.Transitionned() { |
| 1730 | + bc.AddRootTranslation(block.Root(), statedb.IntermediateRoot(false)) |
| 1731 | + } |
| 1732 | + } |
1706 | 1733 |
|
1707 | 1734 | // Update the metrics touched during block processing
|
1708 | 1735 | accountReadTimer.Update(statedb.AccountReads) // Account reads are complete, we can mark them
|
@@ -2285,6 +2312,8 @@ func (bc *BlockChain) skipBlock(err error, it *insertIterator) bool {
|
2285 | 2312 | return false
|
2286 | 2313 | }
|
2287 | 2314 |
|
| 2315 | +var emptyVerkleRoot common.Hash |
| 2316 | + |
2288 | 2317 | // indexBlocks reindexes or unindexes transactions depending on user configuration
|
2289 | 2318 | func (bc *BlockChain) indexBlocks(tail *uint64, head uint64, done chan struct{}) {
|
2290 | 2319 | defer func() { close(done) }()
|
@@ -2429,3 +2458,11 @@ func (bc *BlockChain) SetBlockValidatorAndProcessorForTesting(v Validator, p Pro
|
2429 | 2458 | bc.validator = v
|
2430 | 2459 | bc.processor = p
|
2431 | 2460 | }
|
| 2461 | + |
| 2462 | +func (bc *BlockChain) StartVerkleTransition(originalRoot, translatedRoot common.Hash, chainConfig *params.ChainConfig, cancunBlock *big.Int) { |
| 2463 | + bc.stateCache.(*state.ForkingDB).StartTransition(originalRoot, translatedRoot, chainConfig, cancunBlock) |
| 2464 | +} |
| 2465 | + |
| 2466 | +func (bc *BlockChain) AddRootTranslation(originalRoot, translatedRoot common.Hash) { |
| 2467 | + bc.stateCache.(*state.ForkingDB).AddTranslation(originalRoot, translatedRoot) |
| 2468 | +} |
0 commit comments