Explorar o código

Merge pull request #22629 from karalabe/fix-chain-tracing-from-0

eth: fix tracing state retrieval if requesting the non-dirty genesis
Péter Szilágyi %!s(int64=4) %!d(string=hai) anos
pai
achega
264fff7dd4
Modificáronse 1 ficheiros con 10 adicións e 0 borrados
  1. 10 0
      eth/state_accessor.go

+ 10 - 0
eth/state_accessor.go

@@ -61,6 +61,16 @@ func (eth *Ethereum) stateAtBlock(block *types.Block, reexec uint64, base *state
 		// the internal junks created by tracing will be persisted into the disk.
 		database = state.NewDatabaseWithConfig(eth.chainDb, &trie.Config{Cache: 16})
 
+		// If we didn't check the dirty database, do check the clean one, otherwise
+		// we would rewind past a persisted block (specific corner case is chain
+		// tracing from the genesis).
+		if !checkLive {
+			statedb, err = state.New(current.Root(), database, nil)
+			if err == nil {
+				return statedb, nil
+			}
+		}
+		// Database does not have the state for the given block, try to regenerate
 		for i := uint64(0); i < reexec; i++ {
 			if current.NumberU64() == 0 {
 				return nil, errors.New("genesis state is missing")