all: removed blockhash from statedb (#23126)
This PR removes the blockhash from the statedb
This commit is contained in:
		
							parent
							
								
									e7c8693635
								
							
						
					
					
						commit
						686b2884ee
					
				| @ -152,7 +152,7 @@ func (pre *Prestate) Apply(vmConfig vm.Config, chainConfig *params.ChainConfig, | ||||
| 		} | ||||
| 		vmConfig.Tracer = tracer | ||||
| 		vmConfig.Debug = (tracer != nil) | ||||
| 		statedb.Prepare(tx.Hash(), blockHash, txIndex) | ||||
| 		statedb.Prepare(tx.Hash(), txIndex) | ||||
| 		txContext := core.NewEVMTxContext(msg) | ||||
| 		snapshot := statedb.Snapshot() | ||||
| 		evm := vm.NewEVM(vmContext, txContext, statedb, chainConfig, vmConfig) | ||||
| @ -197,7 +197,7 @@ func (pre *Prestate) Apply(vmConfig vm.Config, chainConfig *params.ChainConfig, | ||||
| 			} | ||||
| 
 | ||||
| 			// Set the receipt logs and create the bloom filter.
 | ||||
| 			receipt.Logs = statedb.GetLogs(tx.Hash()) | ||||
| 			receipt.Logs = statedb.GetLogs(tx.Hash(), blockHash) | ||||
| 			receipt.Bloom = types.CreateBloom(types.Receipts{receipt}) | ||||
| 			// These three are non-consensus fields:
 | ||||
| 			//receipt.BlockHash
 | ||||
|  | ||||
| @ -102,7 +102,7 @@ func (b *BlockGen) AddTxWithChain(bc *BlockChain, tx *types.Transaction) { | ||||
| 	if b.gasPool == nil { | ||||
| 		b.SetCoinbase(common.Address{}) | ||||
| 	} | ||||
| 	b.statedb.Prepare(tx.Hash(), common.Hash{}, len(b.txs)) | ||||
| 	b.statedb.Prepare(tx.Hash(), len(b.txs)) | ||||
| 	receipt, err := ApplyTransaction(b.config, bc, &b.header.Coinbase, b.gasPool, b.statedb, b.header, tx, &b.header.GasUsed, vm.Config{}) | ||||
| 	if err != nil { | ||||
| 		panic(err) | ||||
|  | ||||
| @ -89,10 +89,10 @@ type StateDB struct { | ||||
| 	// The refund counter, also used by state transitioning.
 | ||||
| 	refund uint64 | ||||
| 
 | ||||
| 	thash, bhash common.Hash | ||||
| 	txIndex      int | ||||
| 	logs         map[common.Hash][]*types.Log | ||||
| 	logSize      uint | ||||
| 	thash   common.Hash | ||||
| 	txIndex int | ||||
| 	logs    map[common.Hash][]*types.Log | ||||
| 	logSize uint | ||||
| 
 | ||||
| 	preimages map[common.Hash][]byte | ||||
| 
 | ||||
| @ -186,15 +186,18 @@ func (s *StateDB) AddLog(log *types.Log) { | ||||
| 	s.journal.append(addLogChange{txhash: s.thash}) | ||||
| 
 | ||||
| 	log.TxHash = s.thash | ||||
| 	log.BlockHash = s.bhash | ||||
| 	log.TxIndex = uint(s.txIndex) | ||||
| 	log.Index = s.logSize | ||||
| 	s.logs[s.thash] = append(s.logs[s.thash], log) | ||||
| 	s.logSize++ | ||||
| } | ||||
| 
 | ||||
| func (s *StateDB) GetLogs(hash common.Hash) []*types.Log { | ||||
| 	return s.logs[hash] | ||||
| func (s *StateDB) GetLogs(hash common.Hash, blockHash common.Hash) []*types.Log { | ||||
| 	logs := s.logs[hash] | ||||
| 	for _, l := range logs { | ||||
| 		l.BlockHash = blockHash | ||||
| 	} | ||||
| 	return logs | ||||
| } | ||||
| 
 | ||||
| func (s *StateDB) Logs() []*types.Log { | ||||
| @ -272,11 +275,6 @@ func (s *StateDB) TxIndex() int { | ||||
| 	return s.txIndex | ||||
| } | ||||
| 
 | ||||
| // BlockHash returns the current block hash set by Prepare.
 | ||||
| func (s *StateDB) BlockHash() common.Hash { | ||||
| 	return s.bhash | ||||
| } | ||||
| 
 | ||||
| func (s *StateDB) GetCode(addr common.Address) []byte { | ||||
| 	stateObject := s.getStateObject(addr) | ||||
| 	if stateObject != nil { | ||||
| @ -882,9 +880,8 @@ func (s *StateDB) IntermediateRoot(deleteEmptyObjects bool) common.Hash { | ||||
| 
 | ||||
| // Prepare sets the current transaction hash and index and block hash which is
 | ||||
| // used when the EVM emits new state logs.
 | ||||
| func (s *StateDB) Prepare(thash, bhash common.Hash, ti int) { | ||||
| func (s *StateDB) Prepare(thash common.Hash, ti int) { | ||||
| 	s.thash = thash | ||||
| 	s.bhash = bhash | ||||
| 	s.txIndex = ti | ||||
| 	s.accessList = newAccessList() | ||||
| } | ||||
|  | ||||
| @ -463,9 +463,9 @@ func (test *snapshotTest) checkEqual(state, checkstate *StateDB) error { | ||||
| 		return fmt.Errorf("got GetRefund() == %d, want GetRefund() == %d", | ||||
| 			state.GetRefund(), checkstate.GetRefund()) | ||||
| 	} | ||||
| 	if !reflect.DeepEqual(state.GetLogs(common.Hash{}), checkstate.GetLogs(common.Hash{})) { | ||||
| 	if !reflect.DeepEqual(state.GetLogs(common.Hash{}, common.Hash{}), checkstate.GetLogs(common.Hash{}, common.Hash{})) { | ||||
| 		return fmt.Errorf("got GetLogs(common.Hash{}) == %v, want GetLogs(common.Hash{}) == %v", | ||||
| 			state.GetLogs(common.Hash{}), checkstate.GetLogs(common.Hash{})) | ||||
| 			state.GetLogs(common.Hash{}, common.Hash{}), checkstate.GetLogs(common.Hash{}, common.Hash{})) | ||||
| 	} | ||||
| 	return nil | ||||
| } | ||||
|  | ||||
| @ -67,7 +67,7 @@ func (p *statePrefetcher) Prefetch(block *types.Block, statedb *state.StateDB, c | ||||
| 		if err != nil { | ||||
| 			return // Also invalid block, bail out
 | ||||
| 		} | ||||
| 		statedb.Prepare(tx.Hash(), block.Hash(), i) | ||||
| 		statedb.Prepare(tx.Hash(), i) | ||||
| 		if err := precacheTransaction(msg, p.config, gaspool, statedb, header, evm); err != nil { | ||||
| 			return // Ugh, something went horribly wrong, bail out
 | ||||
| 		} | ||||
|  | ||||
| @ -18,6 +18,7 @@ package core | ||||
| 
 | ||||
| import ( | ||||
| 	"fmt" | ||||
| 	"math/big" | ||||
| 
 | ||||
| 	"github.com/ethereum/go-ethereum/common" | ||||
| 	"github.com/ethereum/go-ethereum/consensus" | ||||
| @ -57,11 +58,13 @@ func NewStateProcessor(config *params.ChainConfig, bc *BlockChain, engine consen | ||||
| // transactions failed to execute due to insufficient gas it will return an error.
 | ||||
| func (p *StateProcessor) Process(block *types.Block, statedb *state.StateDB, cfg vm.Config) (types.Receipts, []*types.Log, uint64, error) { | ||||
| 	var ( | ||||
| 		receipts types.Receipts | ||||
| 		usedGas  = new(uint64) | ||||
| 		header   = block.Header() | ||||
| 		allLogs  []*types.Log | ||||
| 		gp       = new(GasPool).AddGas(block.GasLimit()) | ||||
| 		receipts    types.Receipts | ||||
| 		usedGas     = new(uint64) | ||||
| 		header      = block.Header() | ||||
| 		blockHash   = block.Hash() | ||||
| 		blockNumber = block.Number() | ||||
| 		allLogs     []*types.Log | ||||
| 		gp          = new(GasPool).AddGas(block.GasLimit()) | ||||
| 	) | ||||
| 	// Mutate the block and state according to any hard-fork specs
 | ||||
| 	if p.config.DAOForkSupport && p.config.DAOForkBlock != nil && p.config.DAOForkBlock.Cmp(block.Number()) == 0 { | ||||
| @ -75,8 +78,8 @@ func (p *StateProcessor) Process(block *types.Block, statedb *state.StateDB, cfg | ||||
| 		if err != nil { | ||||
| 			return nil, nil, 0, fmt.Errorf("could not apply tx %d [%v]: %w", i, tx.Hash().Hex(), err) | ||||
| 		} | ||||
| 		statedb.Prepare(tx.Hash(), block.Hash(), i) | ||||
| 		receipt, err := applyTransaction(msg, p.config, p.bc, nil, gp, statedb, header, tx, usedGas, vmenv) | ||||
| 		statedb.Prepare(tx.Hash(), i) | ||||
| 		receipt, err := applyTransaction(msg, p.config, p.bc, nil, gp, statedb, blockNumber, blockHash, tx, usedGas, vmenv) | ||||
| 		if err != nil { | ||||
| 			return nil, nil, 0, fmt.Errorf("could not apply tx %d [%v]: %w", i, tx.Hash().Hex(), err) | ||||
| 		} | ||||
| @ -89,7 +92,7 @@ func (p *StateProcessor) Process(block *types.Block, statedb *state.StateDB, cfg | ||||
| 	return receipts, allLogs, *usedGas, nil | ||||
| } | ||||
| 
 | ||||
| func applyTransaction(msg types.Message, config *params.ChainConfig, bc ChainContext, author *common.Address, gp *GasPool, statedb *state.StateDB, header *types.Header, tx *types.Transaction, usedGas *uint64, evm *vm.EVM) (*types.Receipt, error) { | ||||
| func applyTransaction(msg types.Message, config *params.ChainConfig, bc ChainContext, author *common.Address, gp *GasPool, statedb *state.StateDB, blockNumber *big.Int, blockHash common.Hash, tx *types.Transaction, usedGas *uint64, evm *vm.EVM) (*types.Receipt, error) { | ||||
| 	// Create a new context to be used in the EVM environment.
 | ||||
| 	txContext := NewEVMTxContext(msg) | ||||
| 	evm.Reset(txContext, statedb) | ||||
| @ -102,10 +105,10 @@ func applyTransaction(msg types.Message, config *params.ChainConfig, bc ChainCon | ||||
| 
 | ||||
| 	// Update the state with pending changes.
 | ||||
| 	var root []byte | ||||
| 	if config.IsByzantium(header.Number) { | ||||
| 	if config.IsByzantium(blockNumber) { | ||||
| 		statedb.Finalise(true) | ||||
| 	} else { | ||||
| 		root = statedb.IntermediateRoot(config.IsEIP158(header.Number)).Bytes() | ||||
| 		root = statedb.IntermediateRoot(config.IsEIP158(blockNumber)).Bytes() | ||||
| 	} | ||||
| 	*usedGas += result.UsedGas | ||||
| 
 | ||||
| @ -126,10 +129,10 @@ func applyTransaction(msg types.Message, config *params.ChainConfig, bc ChainCon | ||||
| 	} | ||||
| 
 | ||||
| 	// Set the receipt logs and create the bloom filter.
 | ||||
| 	receipt.Logs = statedb.GetLogs(tx.Hash()) | ||||
| 	receipt.Logs = statedb.GetLogs(tx.Hash(), blockHash) | ||||
| 	receipt.Bloom = types.CreateBloom(types.Receipts{receipt}) | ||||
| 	receipt.BlockHash = statedb.BlockHash() | ||||
| 	receipt.BlockNumber = header.Number | ||||
| 	receipt.BlockHash = blockHash | ||||
| 	receipt.BlockNumber = blockNumber | ||||
| 	receipt.TransactionIndex = uint(statedb.TxIndex()) | ||||
| 	return receipt, err | ||||
| } | ||||
| @ -146,5 +149,5 @@ func ApplyTransaction(config *params.ChainConfig, bc ChainContext, author *commo | ||||
| 	// Create a new context to be used in the EVM environment
 | ||||
| 	blockContext := NewEVMBlockContext(header, bc, author) | ||||
| 	vmenv := vm.NewEVM(blockContext, vm.TxContext{}, statedb, config, cfg) | ||||
| 	return applyTransaction(msg, config, bc, author, gp, statedb, header, tx, usedGas, vmenv) | ||||
| 	return applyTransaction(msg, config, bc, author, gp, statedb, header.Number, header.Hash(), tx, usedGas, vmenv) | ||||
| } | ||||
|  | ||||
| @ -178,7 +178,7 @@ func (api *consensusAPI) AssembleBlock(params assembleBlockParams) (*executableD | ||||
| 		from, _ := types.Sender(signer, tx) | ||||
| 
 | ||||
| 		// Execute the transaction
 | ||||
| 		env.state.Prepare(tx.Hash(), common.Hash{}, env.tcount) | ||||
| 		env.state.Prepare(tx.Hash(), env.tcount) | ||||
| 		err = env.commitTransaction(tx, coinbase) | ||||
| 		switch err { | ||||
| 		case core.ErrGasLimitReached: | ||||
|  | ||||
| @ -170,7 +170,7 @@ func (eth *Ethereum) stateAtTransaction(block *types.Block, txIndex int, reexec | ||||
| 		} | ||||
| 		// Not yet the searched for transaction, execute on top of the current state
 | ||||
| 		vmenv := vm.NewEVM(context, txContext, statedb, eth.blockchain.Config(), vm.Config{}) | ||||
| 		statedb.Prepare(tx.Hash(), block.Hash(), idx) | ||||
| 		statedb.Prepare(tx.Hash(), idx) | ||||
| 		if _, err := core.ApplyMessage(vmenv, msg, new(core.GasPool).AddGas(tx.Gas())); err != nil { | ||||
| 			return nil, vm.BlockContext{}, nil, fmt.Errorf("transaction %#x failed: %v", tx.Hash(), err) | ||||
| 		} | ||||
|  | ||||
| @ -539,7 +539,7 @@ func (api *API) traceBlock(ctx context.Context, block *types.Block, config *Trac | ||||
| 
 | ||||
| 		// Generate the next state snapshot fast without tracing
 | ||||
| 		msg, _ := tx.AsMessage(signer, block.BaseFee()) | ||||
| 		statedb.Prepare(tx.Hash(), block.Hash(), i) | ||||
| 		statedb.Prepare(tx.Hash(), i) | ||||
| 		vmenv := vm.NewEVM(blockCtx, core.NewEVMTxContext(msg), statedb, api.backend.ChainConfig(), vm.Config{}) | ||||
| 		if _, err := core.ApplyMessage(vmenv, msg, new(core.GasPool).AddGas(msg.Gas())); err != nil { | ||||
| 			failed = err | ||||
| @ -653,7 +653,7 @@ func (api *API) standardTraceBlockToFile(ctx context.Context, block *types.Block | ||||
| 		} | ||||
| 		// Execute the transaction and flush any traces to disk
 | ||||
| 		vmenv := vm.NewEVM(vmctx, txContext, statedb, chainConfig, vmConf) | ||||
| 		statedb.Prepare(tx.Hash(), block.Hash(), i) | ||||
| 		statedb.Prepare(tx.Hash(), i) | ||||
| 		_, err = core.ApplyMessage(vmenv, msg, new(core.GasPool).AddGas(msg.Gas())) | ||||
| 		if writer != nil { | ||||
| 			writer.Flush() | ||||
| @ -816,7 +816,7 @@ func (api *API) traceTx(ctx context.Context, message core.Message, txctx *Contex | ||||
| 	vmenv := vm.NewEVM(vmctx, txContext, statedb, api.backend.ChainConfig(), vm.Config{Debug: true, Tracer: tracer, NoBaseFee: true}) | ||||
| 
 | ||||
| 	// Call Prepare to clear out the statedb access list
 | ||||
| 	statedb.Prepare(txctx.TxHash, txctx.BlockHash, txctx.TxIndex) | ||||
| 	statedb.Prepare(txctx.TxHash, txctx.TxIndex) | ||||
| 
 | ||||
| 	result, err := core.ApplyMessage(vmenv, message, new(core.GasPool).AddGas(message.Gas())) | ||||
| 	if err != nil { | ||||
|  | ||||
| @ -58,7 +58,7 @@ func (leth *LightEthereum) stateAtTransaction(ctx context.Context, block *types. | ||||
| 		msg, _ := tx.AsMessage(signer, block.BaseFee()) | ||||
| 		txContext := core.NewEVMTxContext(msg) | ||||
| 		context := core.NewEVMBlockContext(block.Header(), leth.blockchain, nil) | ||||
| 		statedb.Prepare(tx.Hash(), block.Hash(), idx) | ||||
| 		statedb.Prepare(tx.Hash(), idx) | ||||
| 		if idx == txIndex { | ||||
| 			return msg, context, statedb, nil | ||||
| 		} | ||||
|  | ||||
| @ -815,7 +815,7 @@ func (w *worker) commitTransactions(txs *types.TransactionsByPriceAndNonce, coin | ||||
| 			continue | ||||
| 		} | ||||
| 		// Start executing the transaction
 | ||||
| 		w.current.state.Prepare(tx.Hash(), common.Hash{}, w.current.tcount) | ||||
| 		w.current.state.Prepare(tx.Hash(), w.current.tcount) | ||||
| 
 | ||||
| 		logs, err := w.commitTransaction(tx, coinbase) | ||||
| 		switch { | ||||
|  | ||||
		Loading…
	
		Reference in New Issue
	
	Block a user