Skip to content

Commit e8114e8

Browse files
authored
copy the pre-state, use an untouched copy for the proof (#72)
1 parent a758e16 commit e8114e8

File tree

2 files changed

+23
-25
lines changed

2 files changed

+23
-25
lines changed

core/chain_makers.go

Lines changed: 20 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -295,6 +295,7 @@ func GenerateVerkleChain(config *params.ChainConfig, parent *types.Block, engine
295295
genblock := func(i int, parent *types.Block, statedb *state.StateDB) (*types.Block, types.Receipts) {
296296
b := &BlockGen{i: i, chain: blocks, parent: parent, statedb: statedb, config: config, engine: engine}
297297
b.header = makeHeader(chainreader, parent, statedb, b.engine)
298+
preState := statedb.Copy()
298299

299300
// Mutate the state and block according to any hard-fork specs
300301
if daoBlock := config.DAOForkBlock; daoBlock != nil {
@@ -329,30 +330,25 @@ func GenerateVerkleChain(config *params.ChainConfig, parent *types.Block, engine
329330
}
330331

331332
// Generate an associated verkle proof
332-
if tr := statedb.GetTrie(); tr.IsVerkle() {
333-
vtr := tr.(*trie.VerkleTrie)
334-
// Generate the proof if we are using a verkle tree
335-
// WORKAROUND: make sure all keys are resolved
336-
// before building the proof. Ultimately, node
337-
// resolution can be done with a prefetcher or
338-
// from GetCommitmentsAlongPath.
339-
340-
keys := statedb.Witness().Keys()
341-
for _, key := range keys {
342-
out, err := vtr.TryGet(key)
343-
if err != nil {
344-
panic(err)
345-
}
346-
if len(out) == 0 {
347-
panic(fmt.Sprintf("%x should be present in the tree", key))
348-
}
349-
}
350-
vtr.Hash()
351-
p, k, err := vtr.ProveAndSerialize(keys, statedb.Witness().KeyVals())
352-
block.SetVerkleProof(p, k)
353-
if err != nil {
354-
panic(err)
355-
}
333+
tr := preState.GetTrie()
334+
if !tr.IsVerkle() {
335+
panic("tree should be verkle")
336+
}
337+
338+
vtr := tr.(*trie.VerkleTrie)
339+
// Make sure all keys are resolved before
340+
// building the proof. Ultimately, node
341+
// resolution can be done with a prefetcher
342+
// or from GetCommitmentsAlongPath.
343+
keys := statedb.Witness().Keys()
344+
for _, key := range keys {
345+
vtr.TryGet(key)
346+
}
347+
vtr.Hash()
348+
p, k, err := vtr.ProveAndSerialize(keys, statedb.Witness().KeyVals())
349+
block.SetVerkleProof(p, k)
350+
if err != nil {
351+
panic(err)
356352
}
357353
return block, b.receipts
358354
}

miner/worker.go

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -82,6 +82,7 @@ type environment struct {
8282
signer types.Signer
8383

8484
state *state.StateDB // apply state changes here
85+
original *state.StateDB // verkle: keep the orignal data to prove the pre-state
8586
ancestors mapset.Set // ancestor set (used for checking uncle parent validity)
8687
family mapset.Set // family set (used for checking uncle invalidity)
8788
uncles mapset.Set // uncle set
@@ -692,6 +693,7 @@ func (w *worker) makeCurrent(parent *types.Block, header *types.Header) error {
692693
env := &environment{
693694
signer: types.MakeSigner(w.chainConfig, header.Number),
694695
state: state,
696+
original: state.Copy(),
695697
ancestors: mapset.NewSet(),
696698
family: mapset.NewSet(),
697699
uncles: mapset.NewSet(),
@@ -1039,7 +1041,7 @@ func (w *worker) commit(uncles []*types.Header, interval func(), update bool, st
10391041
if err != nil {
10401042
return err
10411043
}
1042-
if tr := s.GetTrie(); tr.IsVerkle() {
1044+
if tr := w.current.original.GetTrie(); tr.IsVerkle() {
10431045
vtr := tr.(*trie.VerkleTrie)
10441046
// Generate the proof if we are using a verkle tree
10451047
p, k, err := vtr.ProveAndSerialize(s.Witness().Keys(), s.Witness().KeyVals())

0 commit comments

Comments
 (0)