@@ -51,11 +51,9 @@ import (
5151 "math/big"
5252
5353 "github.com/ethereum/go-ethereum/common"
54- "github.com/ethereum/go-ethereum/core/history"
5554 "github.com/ethereum/go-ethereum/core/types"
5655 "github.com/ethereum/go-ethereum/internal/era"
5756 "github.com/ethereum/go-ethereum/internal/era/e2store"
58- "github.com/ethereum/go-ethereum/params"
5957 "github.com/ethereum/go-ethereum/rlp"
6058 "github.com/golang/snappy"
6159)
@@ -90,6 +88,9 @@ type Builder struct {
9088 startNum * uint64
9189 written uint64
9290 expectsProofs bool
91+ isPreMerge bool
92+ numPreMerge int // number of pre-merge blocks
93+ finalTD * big.Int // final total difficulty, used for pre-merge and merge straddling files
9394}
9495
9596// NewBuilder returns a new Builder instance.
@@ -151,19 +152,27 @@ func (b *Builder) AddRLP(headerRLP []byte, bodyRLP []byte, receipts []byte, proo
151152 if len (b .buff .headers ) >= era .MaxSize {
152153 return fmt .Errorf ("exceeds max size %d" , era .MaxSize )
153154 }
155+ if len (b .buff .headers ) == 0 && td != nil {
156+ if td .Sign () > 0 {
157+ b .isPreMerge = true
158+ }
159+ }
154160
155161 b .buff .headers = append (b .buff .headers , headerRLP )
156162 b .buff .bodies = append (b .buff .bodies , bodyRLP )
157163 b .buff .receipts = append (b .buff .receipts , receipts )
158- b .buff .tds = append (b .buff .tds , new (big.Int ).Set (td ))
159- b .hashes = append (b .hashes , blockHash )
160- if proof != nil {
161- b .buff .proofs = append (b .buff .proofs , proof )
164+ if td != nil {
165+ if b .isPreMerge && td .Sign () > 0 {
166+ b .buff .tds = append (b .buff .tds , new (big.Int ).Set (td ))
167+ b .finalTD = new (big.Int ).Set (td )
168+ b .hashes = append (b .hashes , blockHash )
169+ } else if b .isPreMerge {
170+ b .buff .tds = append (b .buff .tds , new (big.Int ).Set (b .finalTD ))
171+ }
162172 }
163173
164- mergeblock := history .PrunePoints [params .MainnetGenesisHash ]
165- if mergeblock != nil && blockNum <= mergeblock .BlockNumber {
166- b .buff .tds = append (b .buff .tds , new (big.Int ).Set (td ))
174+ if proof != nil {
175+ b .buff .proofs = append (b .buff .proofs , proof )
167176 }
168177
169178 // Write Era2 version before writing any blocks.
@@ -233,7 +242,7 @@ func (b *Builder) Finalize() (common.Hash, error) {
233242 var accRoot common.Hash
234243 if len (b .hashes ) > 0 {
235244 var err error
236- accRoot , err = era .ComputeAccumulator (b .hashes , b .buff .tds )
245+ accRoot , err = era .ComputeAccumulator (b .hashes , b .buff .tds [: len ( b . hashes )] )
237246 if err != nil {
238247 return common.Hash {}, fmt .Errorf ("compute accumulator: %w" , err )
239248 }
0 commit comments