2015-07-07 02:54:22 +02:00
// Copyright 2014 The go-ethereum Authors
2015-07-22 18:48:40 +02:00
// This file is part of the go-ethereum library.
2015-07-07 02:54:22 +02:00
//
2015-07-23 18:35:11 +02:00
// The go-ethereum library is free software: you can redistribute it and/or modify
2015-07-07 02:54:22 +02:00
// it under the terms of the GNU Lesser General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
2015-07-22 18:48:40 +02:00
// The go-ethereum library is distributed in the hope that it will be useful,
2015-07-07 02:54:22 +02:00
// but WITHOUT ANY WARRANTY; without even the implied warranty of
2015-07-22 18:48:40 +02:00
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
2015-07-07 02:54:22 +02:00
// GNU Lesser General Public License for more details.
//
// You should have received a copy of the GNU Lesser General Public License
2015-07-22 18:48:40 +02:00
// along with the go-ethereum library. If not, see <http://www.gnu.org/licenses/>.
2015-07-07 02:54:22 +02:00
2014-12-04 10:28:02 +01:00
package core
2014-06-13 12:58:01 +02:00
import (
2020-12-04 12:22:19 +01:00
"fmt"
2017-11-13 13:47:27 +02:00
"math"
2014-07-30 00:31:15 +02:00
"math/big"
2015-03-09 18:05:56 +01:00
2015-03-16 11:27:38 +01:00
"github.com/ethereum/go-ethereum/common"
2021-05-17 15:13:22 +02:00
cmath "github.com/ethereum/go-ethereum/common/math"
2021-02-25 07:26:57 -07:00
"github.com/ethereum/go-ethereum/core/types"
2015-03-23 16:59:09 +01:00
"github.com/ethereum/go-ethereum/core/vm"
2021-08-07 19:38:18 +02:00
"github.com/ethereum/go-ethereum/crypto"
2015-04-02 05:17:15 +02:00
"github.com/ethereum/go-ethereum/params"
2014-06-13 12:58:01 +02:00
)
2021-08-07 19:38:18 +02:00
var emptyCodeHash = crypto . Keccak256Hash ( nil )
2022-10-04 08:44:05 +02:00
// StateTransition represents a state transition.
//
2022-10-04 18:09:05 +02:00
// == The State Transitioning Model
2022-09-10 13:25:40 +02:00
//
// A state transition is a change made when a transaction is applied to the current world
// state. The state transitioning model does all the necessary work to work out a valid new
// state root.
//
// 1. Nonce handling
// 2. Pre pay gas
2022-12-13 01:33:40 -07:00
// 3. Create a new state object if the recipient is nil
2022-09-10 13:25:40 +02:00
// 4. Value transfer
//
// == If contract creation ==
//
// 4a. Attempt to run transaction data
// 4b. If valid, use result as code for the new state object
//
// == end ==
//
// 5. Run Script section
// 6. Derive new state root
2014-06-13 12:58:01 +02:00
type StateTransition struct {
2017-01-04 20:17:24 +01:00
gp * GasPool
msg Message
gas uint64
gasPrice * big . Int
2021-06-08 13:05:41 +03:00
gasFeeCap * big . Int
gasTipCap * big . Int
2017-11-13 13:47:27 +02:00
initialGas uint64
2017-01-04 20:17:24 +01:00
value * big . Int
optimism: historical Bedrock geth rollup changes
This commit squashes the op-geth fork history into a more maintainable
diff for rebasing upon upstream geth.
reference-optimistic-geth changes (origins of op-geth in early Bedrock
development stage):
- Deposit TX Type
- Enable deposit tx in EVM/tx pool
- Change deposit nonce to not be the max nonce
- Extend PayloadAttributesV1 with a Transactions field
- Force deposits at the start of each L2 block
- Fix height check
- noTxPool flag, reproduce block in verifier mode without tx pool interference
- Fix RPC json marshalling (ref op-geth PR 4)
- Deposit txs block height check in block body validation (ref op-geth PR 5)
- core: do not try to reinject deposit txs into tx-pool (ref-op-geth PR 6)
- deposit source hash field instead of L2 block height and tx index combination
- Include invalid deposits, rewind state, but always persist mint (#10)
- Provide gas to Call/Create in deposit transactions (#12)
- Add docker builds (ref-op-geth PR 16, 17)
- Don't panic on deposit transaction signature values or chain ID (ref-op-geth PR 18)
- core: Add version to DepositTx (ref-op-geth PR 19)
- Enable Geth build/lint/test in CircleCI (ref-op-geth PR 23)
- core: Include guaranteed gas in the gas pool (ref-op-geth PR 21)
- core: handle base fee, l1 availability fee, tx fee (ref-op-geth PR 27)
- fix: deposit tx hash
- fix l1 fee cache, rpc, tracing and tx pool
- core: remove deposit-tx sub-type (a.k.a. deposit version byte)
- eth/catalyst: allow engine user to reorg own chain
- miner: restore ability to reorg deep as block builder
- params: print Optimism consensus type in banner
- core/types: remove unused protected() method, see upstream PR 23376
- core: do not mutate original balance value in tx pool l1 cost adjustment
- core: subtract deposit gas from pool, so other txs do not use the same gas. And fail tx processing if deposits reach gas limit
- core/types: deposits do not tip, avoid basefee subtraction
- Unmeter the L1 Attributes Transaction
- miner: handle force tx errors as critical, clean up diff
- ci: Switch branch
- eth,miner: return STATUS_INVALID when failing to process forced transactions in request (ref-op-geth PR 40)
- verifier: forward tx to sequencer based on flag
- txpool: add flag to disable tx gossip (ref-op-geth PR 42)
- Add op-geth version in addition to geth version (ref-op-geth PR 43)
- ci: CircleCI improvements (ref-op-geth PR 44)
- Rename to op-geth
- Build latest tag on optimism branch
op-geth changes:
- Expose cache config in simulated backend (#2)
- Add EIP-1559 parameters
- eth/catalyst: update payload id computation (#1)
- make eip1559 configurable (#4)
- post-merge network should not log warnings about missing transition information (#5)
- Make the simulator more configurable (#6)
- fix OPB-6 - IsDepositTx check instead of artificial nonce value check (#7)
- Simulated backend - enable proof of stake consensus type and fix performance issue (#8)
- accounts: simulated backend consensus engine option and immediate tx indexing
- consensus/beacon: recognize all blocks as reached TTD with 0 TTD in chain config
- Add --rollup.historicalhttp CLI flag and fix backend iface
- Flags and interfaces for historical RPC requests (#12)
- Redirect historical RPC requests (#13)
- Use the pre-existing ethereum.NotFound error (#18)
- Add historical endpoint to TraceBlockByNumber and TraceBlockByHash (#19)
- Add historical endpoint to TraceTransaction (#20)
- Add historical endpoint to TraceCall (#21)
- optimism: fee params from info txi, update l1 cost func GPO params read (#15)
- add hardcoded addresses for fee payouts (#23)
- dynamic gas limit via engine API (#22)
Co-authored-by: Matthew Slipper <me@matthewslipper.com>
Co-authored-by: Joshua Gutow <jgutow@oplabs.co>
Co-authored-by: protolambda <proto@protolambda.com>
Co-authored-by: Mark Tyneway <mark.tyneway@gmail.com>
Co-authored-by: Maurelian <maurelian@protonmail.ch>
2022-03-10 12:13:11 -08:00
mint * big . Int
2017-01-04 20:17:24 +01:00
data [ ] byte
state vm . StateDB
2017-08-21 08:47:15 +08:00
evm * vm . EVM
2014-12-18 15:18:13 +01:00
}
2015-03-17 12:00:29 +01:00
// Message represents a message sent to a contract.
2014-12-18 15:18:13 +01:00
type Message interface {
2016-11-02 13:44:13 +01:00
From ( ) common . Address
2015-03-17 12:00:29 +01:00
To ( ) * common . Address
2014-12-18 15:18:13 +01:00
GasPrice ( ) * big . Int
2021-06-08 13:05:41 +03:00
GasFeeCap ( ) * big . Int
GasTipCap ( ) * big . Int
2017-11-13 13:47:27 +02:00
Gas ( ) uint64
2014-12-18 15:18:13 +01:00
Value ( ) * big . Int
optimism: historical Bedrock geth rollup changes
This commit squashes the op-geth fork history into a more maintainable
diff for rebasing upon upstream geth.
reference-optimistic-geth changes (origins of op-geth in early Bedrock
development stage):
- Deposit TX Type
- Enable deposit tx in EVM/tx pool
- Change deposit nonce to not be the max nonce
- Extend PayloadAttributesV1 with a Transactions field
- Force deposits at the start of each L2 block
- Fix height check
- noTxPool flag, reproduce block in verifier mode without tx pool interference
- Fix RPC json marshalling (ref op-geth PR 4)
- Deposit txs block height check in block body validation (ref op-geth PR 5)
- core: do not try to reinject deposit txs into tx-pool (ref-op-geth PR 6)
- deposit source hash field instead of L2 block height and tx index combination
- Include invalid deposits, rewind state, but always persist mint (#10)
- Provide gas to Call/Create in deposit transactions (#12)
- Add docker builds (ref-op-geth PR 16, 17)
- Don't panic on deposit transaction signature values or chain ID (ref-op-geth PR 18)
- core: Add version to DepositTx (ref-op-geth PR 19)
- Enable Geth build/lint/test in CircleCI (ref-op-geth PR 23)
- core: Include guaranteed gas in the gas pool (ref-op-geth PR 21)
- core: handle base fee, l1 availability fee, tx fee (ref-op-geth PR 27)
- fix: deposit tx hash
- fix l1 fee cache, rpc, tracing and tx pool
- core: remove deposit-tx sub-type (a.k.a. deposit version byte)
- eth/catalyst: allow engine user to reorg own chain
- miner: restore ability to reorg deep as block builder
- params: print Optimism consensus type in banner
- core/types: remove unused protected() method, see upstream PR 23376
- core: do not mutate original balance value in tx pool l1 cost adjustment
- core: subtract deposit gas from pool, so other txs do not use the same gas. And fail tx processing if deposits reach gas limit
- core/types: deposits do not tip, avoid basefee subtraction
- Unmeter the L1 Attributes Transaction
- miner: handle force tx errors as critical, clean up diff
- ci: Switch branch
- eth,miner: return STATUS_INVALID when failing to process forced transactions in request (ref-op-geth PR 40)
- verifier: forward tx to sequencer based on flag
- txpool: add flag to disable tx gossip (ref-op-geth PR 42)
- Add op-geth version in addition to geth version (ref-op-geth PR 43)
- ci: CircleCI improvements (ref-op-geth PR 44)
- Rename to op-geth
- Build latest tag on optimism branch
op-geth changes:
- Expose cache config in simulated backend (#2)
- Add EIP-1559 parameters
- eth/catalyst: update payload id computation (#1)
- make eip1559 configurable (#4)
- post-merge network should not log warnings about missing transition information (#5)
- Make the simulator more configurable (#6)
- fix OPB-6 - IsDepositTx check instead of artificial nonce value check (#7)
- Simulated backend - enable proof of stake consensus type and fix performance issue (#8)
- accounts: simulated backend consensus engine option and immediate tx indexing
- consensus/beacon: recognize all blocks as reached TTD with 0 TTD in chain config
- Add --rollup.historicalhttp CLI flag and fix backend iface
- Flags and interfaces for historical RPC requests (#12)
- Redirect historical RPC requests (#13)
- Use the pre-existing ethereum.NotFound error (#18)
- Add historical endpoint to TraceBlockByNumber and TraceBlockByHash (#19)
- Add historical endpoint to TraceTransaction (#20)
- Add historical endpoint to TraceCall (#21)
- optimism: fee params from info txi, update l1 cost func GPO params read (#15)
- add hardcoded addresses for fee payouts (#23)
- dynamic gas limit via engine API (#22)
Co-authored-by: Matthew Slipper <me@matthewslipper.com>
Co-authored-by: Joshua Gutow <jgutow@oplabs.co>
Co-authored-by: protolambda <proto@protolambda.com>
Co-authored-by: Mark Tyneway <mark.tyneway@gmail.com>
Co-authored-by: Maurelian <maurelian@protonmail.ch>
2022-03-10 12:13:11 -08:00
IsSystemTx ( ) bool // IsSystemTx indicates the message, if also a deposit, does not emit gas usage.
IsDepositTx ( ) bool // IsDepositTx indicates the message is force-included and can persist a mint.
Mint ( ) * big . Int // Mint is the amount to mint before EVM processing, or nil if there is no minting.
RollupDataGas ( ) uint64 // RollupDataGas indicates the rollup cost of the message, 0 if not a rollup or no cost.
2014-12-18 15:18:13 +01:00
Nonce ( ) uint64
2021-08-23 11:49:39 +02:00
IsFake ( ) bool
2014-12-18 15:18:13 +01:00
Data ( ) [ ] byte
2021-02-25 07:26:57 -07:00
AccessList ( ) types . AccessList
2014-06-13 12:58:01 +02:00
}
2015-03-18 13:00:01 +01:00
2020-04-22 16:25:36 +08:00
// ExecutionResult includes all output after executing given evm
// message no matter the execution itself is successful or not.
type ExecutionResult struct {
UsedGas uint64 // Total used gas but include the refunded gas
Err error // Any error encountered during the execution(listed in core/vm/errors.go)
ReturnData [ ] byte // Returned data from evm(function result or data supplied with revert opcode)
}
// Unwrap returns the internal evm error which allows us for further
// analysis outside.
func ( result * ExecutionResult ) Unwrap ( ) error {
return result . Err
}
// Failed returns the indicator whether the execution is successful or not
func ( result * ExecutionResult ) Failed ( ) bool { return result . Err != nil }
// Return is a helper function to help caller distinguish between revert reason
// and function return. Return returns the data after execution if no error occurs.
func ( result * ExecutionResult ) Return ( ) [ ] byte {
if result . Err != nil {
return nil
}
return common . CopyBytes ( result . ReturnData )
}
// Revert returns the concrete revert reason if the execution is aborted by `REVERT`
// opcode. Note the reason can be nil if no data supplied with revert opcode.
func ( result * ExecutionResult ) Revert ( ) [ ] byte {
if result . Err != vm . ErrExecutionReverted {
return nil
}
return common . CopyBytes ( result . ReturnData )
}
2017-11-13 13:47:27 +02:00
// IntrinsicGas computes the 'intrinsic gas' for a message with the given data.
2023-01-11 10:05:47 +01:00
func IntrinsicGas ( data [ ] byte , accessList types . AccessList , isContractCreation bool , isHomestead , isEIP2028 bool , isEIP3860 bool ) ( uint64 , error ) {
2017-11-13 13:47:27 +02:00
// Set the starting gas for the raw transaction
var gas uint64
2021-02-25 07:26:57 -07:00
if isContractCreation && isHomestead {
2017-11-13 13:47:27 +02:00
gas = params . TxGasContractCreation
2015-11-27 15:40:29 +01:00
} else {
2017-11-13 13:47:27 +02:00
gas = params . TxGas
2015-11-27 15:40:29 +01:00
}
2023-01-11 10:05:47 +01:00
dataLen := uint64 ( len ( data ) )
2017-11-13 13:47:27 +02:00
// Bump the required gas by the amount of transactional data
2023-01-11 10:05:47 +01:00
if dataLen > 0 {
2017-11-13 13:47:27 +02:00
// Zero and non-zero bytes are priced differently
var nz uint64
2015-06-25 14:46:44 +02:00
for _ , byt := range data {
if byt != 0 {
nz ++
}
2015-04-08 20:47:32 +02:00
}
2017-11-13 13:47:27 +02:00
// Make sure we don't exceed uint64 for all data combinations
2019-08-14 20:53:21 +08:00
nonZeroGas := params . TxDataNonZeroGasFrontier
if isEIP2028 {
nonZeroGas = params . TxDataNonZeroGasEIP2028
}
if ( math . MaxUint64 - gas ) / nonZeroGas < nz {
2020-04-22 16:25:36 +08:00
return 0 , ErrGasUintOverflow
2017-11-13 13:47:27 +02:00
}
2019-08-14 20:53:21 +08:00
gas += nz * nonZeroGas
2017-11-13 13:47:27 +02:00
2023-01-11 10:05:47 +01:00
z := dataLen - nz
2017-11-13 13:47:27 +02:00
if ( math . MaxUint64 - gas ) / params . TxDataZeroGas < z {
2020-04-22 16:25:36 +08:00
return 0 , ErrGasUintOverflow
2017-11-13 13:47:27 +02:00
}
gas += z * params . TxDataZeroGas
2023-01-11 10:05:47 +01:00
if isContractCreation && isEIP3860 {
lenWords := toWordSize ( dataLen )
if ( math . MaxUint64 - gas ) / params . InitCodeWordGas < lenWords {
return 0 , ErrGasUintOverflow
}
gas += lenWords * params . InitCodeWordGas
}
2015-04-08 20:47:32 +02:00
}
2021-02-25 07:26:57 -07:00
if accessList != nil {
gas += uint64 ( len ( accessList ) ) * params . TxAccessListAddressGas
gas += uint64 ( accessList . StorageKeys ( ) ) * params . TxAccessListStorageKeyGas
}
2017-11-13 13:47:27 +02:00
return gas , nil
2015-04-08 20:47:32 +02:00
}
2023-01-11 10:05:47 +01:00
// toWordSize returns the ceiled word size required for init code payment calculation.
func toWordSize ( size uint64 ) uint64 {
if size > math . MaxUint64 - 31 {
return math . MaxUint64 / 32 + 1
}
return ( size + 31 ) / 32
}
2016-04-01 00:30:21 +02:00
// NewStateTransition initialises and returns a new state transition object.
2017-01-04 20:17:24 +01:00
func NewStateTransition ( evm * vm . EVM , msg Message , gp * GasPool ) * StateTransition {
2016-04-01 00:30:21 +02:00
return & StateTransition {
2021-06-08 13:05:41 +03:00
gp : gp ,
evm : evm ,
msg : msg ,
gasPrice : msg . GasPrice ( ) ,
gasFeeCap : msg . GasFeeCap ( ) ,
gasTipCap : msg . GasTipCap ( ) ,
value : msg . Value ( ) ,
optimism: historical Bedrock geth rollup changes
This commit squashes the op-geth fork history into a more maintainable
diff for rebasing upon upstream geth.
reference-optimistic-geth changes (origins of op-geth in early Bedrock
development stage):
- Deposit TX Type
- Enable deposit tx in EVM/tx pool
- Change deposit nonce to not be the max nonce
- Extend PayloadAttributesV1 with a Transactions field
- Force deposits at the start of each L2 block
- Fix height check
- noTxPool flag, reproduce block in verifier mode without tx pool interference
- Fix RPC json marshalling (ref op-geth PR 4)
- Deposit txs block height check in block body validation (ref op-geth PR 5)
- core: do not try to reinject deposit txs into tx-pool (ref-op-geth PR 6)
- deposit source hash field instead of L2 block height and tx index combination
- Include invalid deposits, rewind state, but always persist mint (#10)
- Provide gas to Call/Create in deposit transactions (#12)
- Add docker builds (ref-op-geth PR 16, 17)
- Don't panic on deposit transaction signature values or chain ID (ref-op-geth PR 18)
- core: Add version to DepositTx (ref-op-geth PR 19)
- Enable Geth build/lint/test in CircleCI (ref-op-geth PR 23)
- core: Include guaranteed gas in the gas pool (ref-op-geth PR 21)
- core: handle base fee, l1 availability fee, tx fee (ref-op-geth PR 27)
- fix: deposit tx hash
- fix l1 fee cache, rpc, tracing and tx pool
- core: remove deposit-tx sub-type (a.k.a. deposit version byte)
- eth/catalyst: allow engine user to reorg own chain
- miner: restore ability to reorg deep as block builder
- params: print Optimism consensus type in banner
- core/types: remove unused protected() method, see upstream PR 23376
- core: do not mutate original balance value in tx pool l1 cost adjustment
- core: subtract deposit gas from pool, so other txs do not use the same gas. And fail tx processing if deposits reach gas limit
- core/types: deposits do not tip, avoid basefee subtraction
- Unmeter the L1 Attributes Transaction
- miner: handle force tx errors as critical, clean up diff
- ci: Switch branch
- eth,miner: return STATUS_INVALID when failing to process forced transactions in request (ref-op-geth PR 40)
- verifier: forward tx to sequencer based on flag
- txpool: add flag to disable tx gossip (ref-op-geth PR 42)
- Add op-geth version in addition to geth version (ref-op-geth PR 43)
- ci: CircleCI improvements (ref-op-geth PR 44)
- Rename to op-geth
- Build latest tag on optimism branch
op-geth changes:
- Expose cache config in simulated backend (#2)
- Add EIP-1559 parameters
- eth/catalyst: update payload id computation (#1)
- make eip1559 configurable (#4)
- post-merge network should not log warnings about missing transition information (#5)
- Make the simulator more configurable (#6)
- fix OPB-6 - IsDepositTx check instead of artificial nonce value check (#7)
- Simulated backend - enable proof of stake consensus type and fix performance issue (#8)
- accounts: simulated backend consensus engine option and immediate tx indexing
- consensus/beacon: recognize all blocks as reached TTD with 0 TTD in chain config
- Add --rollup.historicalhttp CLI flag and fix backend iface
- Flags and interfaces for historical RPC requests (#12)
- Redirect historical RPC requests (#13)
- Use the pre-existing ethereum.NotFound error (#18)
- Add historical endpoint to TraceBlockByNumber and TraceBlockByHash (#19)
- Add historical endpoint to TraceTransaction (#20)
- Add historical endpoint to TraceCall (#21)
- optimism: fee params from info txi, update l1 cost func GPO params read (#15)
- add hardcoded addresses for fee payouts (#23)
- dynamic gas limit via engine API (#22)
Co-authored-by: Matthew Slipper <me@matthewslipper.com>
Co-authored-by: Joshua Gutow <jgutow@oplabs.co>
Co-authored-by: protolambda <proto@protolambda.com>
Co-authored-by: Mark Tyneway <mark.tyneway@gmail.com>
Co-authored-by: Maurelian <maurelian@protonmail.ch>
2022-03-10 12:13:11 -08:00
mint : msg . Mint ( ) ,
2021-06-08 13:05:41 +03:00
data : msg . Data ( ) ,
state : evm . StateDB ,
2014-12-18 15:18:13 +01:00
}
2016-04-01 00:30:21 +02:00
}
// ApplyMessage computes the new state by applying the given message
// against the old state within the environment.
//
// ApplyMessage returns the bytes returned by any EVM execution (if it took place),
// the gas used (which includes gas refunds) and an error if it failed. An error always
// indicates a core error meaning that the message would always fail for that particular
// state and would never be accepted within a block.
2020-04-22 16:25:36 +08:00
func ApplyMessage ( evm * vm . EVM , msg Message , gp * GasPool ) ( * ExecutionResult , error ) {
2017-11-13 13:47:27 +02:00
return NewStateTransition ( evm , msg , gp ) . TransitionDb ( )
2014-06-13 12:58:01 +02:00
}
2018-04-10 15:33:25 +02:00
// to returns the recipient of the message.
func ( st * StateTransition ) to ( ) common . Address {
if st . msg == nil || st . msg . To ( ) == nil /* contract creation */ {
return common . Address { }
2015-08-30 10:19:10 +02:00
}
2018-04-10 15:33:25 +02:00
return * st . msg . To ( )
2014-06-13 12:58:01 +02:00
}
2017-05-11 09:55:48 +08:00
func ( st * StateTransition ) buyGas ( ) error {
2021-05-30 19:37:52 +02:00
mgval := new ( big . Int ) . SetUint64 ( st . msg . Gas ( ) )
mgval = mgval . Mul ( mgval , st . gasPrice )
optimism: historical Bedrock geth rollup changes
This commit squashes the op-geth fork history into a more maintainable
diff for rebasing upon upstream geth.
reference-optimistic-geth changes (origins of op-geth in early Bedrock
development stage):
- Deposit TX Type
- Enable deposit tx in EVM/tx pool
- Change deposit nonce to not be the max nonce
- Extend PayloadAttributesV1 with a Transactions field
- Force deposits at the start of each L2 block
- Fix height check
- noTxPool flag, reproduce block in verifier mode without tx pool interference
- Fix RPC json marshalling (ref op-geth PR 4)
- Deposit txs block height check in block body validation (ref op-geth PR 5)
- core: do not try to reinject deposit txs into tx-pool (ref-op-geth PR 6)
- deposit source hash field instead of L2 block height and tx index combination
- Include invalid deposits, rewind state, but always persist mint (#10)
- Provide gas to Call/Create in deposit transactions (#12)
- Add docker builds (ref-op-geth PR 16, 17)
- Don't panic on deposit transaction signature values or chain ID (ref-op-geth PR 18)
- core: Add version to DepositTx (ref-op-geth PR 19)
- Enable Geth build/lint/test in CircleCI (ref-op-geth PR 23)
- core: Include guaranteed gas in the gas pool (ref-op-geth PR 21)
- core: handle base fee, l1 availability fee, tx fee (ref-op-geth PR 27)
- fix: deposit tx hash
- fix l1 fee cache, rpc, tracing and tx pool
- core: remove deposit-tx sub-type (a.k.a. deposit version byte)
- eth/catalyst: allow engine user to reorg own chain
- miner: restore ability to reorg deep as block builder
- params: print Optimism consensus type in banner
- core/types: remove unused protected() method, see upstream PR 23376
- core: do not mutate original balance value in tx pool l1 cost adjustment
- core: subtract deposit gas from pool, so other txs do not use the same gas. And fail tx processing if deposits reach gas limit
- core/types: deposits do not tip, avoid basefee subtraction
- Unmeter the L1 Attributes Transaction
- miner: handle force tx errors as critical, clean up diff
- ci: Switch branch
- eth,miner: return STATUS_INVALID when failing to process forced transactions in request (ref-op-geth PR 40)
- verifier: forward tx to sequencer based on flag
- txpool: add flag to disable tx gossip (ref-op-geth PR 42)
- Add op-geth version in addition to geth version (ref-op-geth PR 43)
- ci: CircleCI improvements (ref-op-geth PR 44)
- Rename to op-geth
- Build latest tag on optimism branch
op-geth changes:
- Expose cache config in simulated backend (#2)
- Add EIP-1559 parameters
- eth/catalyst: update payload id computation (#1)
- make eip1559 configurable (#4)
- post-merge network should not log warnings about missing transition information (#5)
- Make the simulator more configurable (#6)
- fix OPB-6 - IsDepositTx check instead of artificial nonce value check (#7)
- Simulated backend - enable proof of stake consensus type and fix performance issue (#8)
- accounts: simulated backend consensus engine option and immediate tx indexing
- consensus/beacon: recognize all blocks as reached TTD with 0 TTD in chain config
- Add --rollup.historicalhttp CLI flag and fix backend iface
- Flags and interfaces for historical RPC requests (#12)
- Redirect historical RPC requests (#13)
- Use the pre-existing ethereum.NotFound error (#18)
- Add historical endpoint to TraceBlockByNumber and TraceBlockByHash (#19)
- Add historical endpoint to TraceTransaction (#20)
- Add historical endpoint to TraceCall (#21)
- optimism: fee params from info txi, update l1 cost func GPO params read (#15)
- add hardcoded addresses for fee payouts (#23)
- dynamic gas limit via engine API (#22)
Co-authored-by: Matthew Slipper <me@matthewslipper.com>
Co-authored-by: Joshua Gutow <jgutow@oplabs.co>
Co-authored-by: protolambda <proto@protolambda.com>
Co-authored-by: Mark Tyneway <mark.tyneway@gmail.com>
Co-authored-by: Maurelian <maurelian@protonmail.ch>
2022-03-10 12:13:11 -08:00
var l1Cost * big . Int
if st . evm . Context . L1CostFunc != nil {
l1Cost = st . evm . Context . L1CostFunc ( st . evm . Context . BlockNumber . Uint64 ( ) , st . msg )
}
if l1Cost != nil {
mgval = mgval . Add ( mgval , l1Cost )
}
2021-05-30 19:37:52 +02:00
balanceCheck := mgval
2021-06-08 13:05:41 +03:00
if st . gasFeeCap != nil {
2021-05-30 19:37:52 +02:00
balanceCheck = new ( big . Int ) . SetUint64 ( st . msg . Gas ( ) )
2021-06-08 13:05:41 +03:00
balanceCheck = balanceCheck . Mul ( balanceCheck , st . gasFeeCap )
2021-07-22 15:39:40 +02:00
balanceCheck . Add ( balanceCheck , st . value )
optimism: historical Bedrock geth rollup changes
This commit squashes the op-geth fork history into a more maintainable
diff for rebasing upon upstream geth.
reference-optimistic-geth changes (origins of op-geth in early Bedrock
development stage):
- Deposit TX Type
- Enable deposit tx in EVM/tx pool
- Change deposit nonce to not be the max nonce
- Extend PayloadAttributesV1 with a Transactions field
- Force deposits at the start of each L2 block
- Fix height check
- noTxPool flag, reproduce block in verifier mode without tx pool interference
- Fix RPC json marshalling (ref op-geth PR 4)
- Deposit txs block height check in block body validation (ref op-geth PR 5)
- core: do not try to reinject deposit txs into tx-pool (ref-op-geth PR 6)
- deposit source hash field instead of L2 block height and tx index combination
- Include invalid deposits, rewind state, but always persist mint (#10)
- Provide gas to Call/Create in deposit transactions (#12)
- Add docker builds (ref-op-geth PR 16, 17)
- Don't panic on deposit transaction signature values or chain ID (ref-op-geth PR 18)
- core: Add version to DepositTx (ref-op-geth PR 19)
- Enable Geth build/lint/test in CircleCI (ref-op-geth PR 23)
- core: Include guaranteed gas in the gas pool (ref-op-geth PR 21)
- core: handle base fee, l1 availability fee, tx fee (ref-op-geth PR 27)
- fix: deposit tx hash
- fix l1 fee cache, rpc, tracing and tx pool
- core: remove deposit-tx sub-type (a.k.a. deposit version byte)
- eth/catalyst: allow engine user to reorg own chain
- miner: restore ability to reorg deep as block builder
- params: print Optimism consensus type in banner
- core/types: remove unused protected() method, see upstream PR 23376
- core: do not mutate original balance value in tx pool l1 cost adjustment
- core: subtract deposit gas from pool, so other txs do not use the same gas. And fail tx processing if deposits reach gas limit
- core/types: deposits do not tip, avoid basefee subtraction
- Unmeter the L1 Attributes Transaction
- miner: handle force tx errors as critical, clean up diff
- ci: Switch branch
- eth,miner: return STATUS_INVALID when failing to process forced transactions in request (ref-op-geth PR 40)
- verifier: forward tx to sequencer based on flag
- txpool: add flag to disable tx gossip (ref-op-geth PR 42)
- Add op-geth version in addition to geth version (ref-op-geth PR 43)
- ci: CircleCI improvements (ref-op-geth PR 44)
- Rename to op-geth
- Build latest tag on optimism branch
op-geth changes:
- Expose cache config in simulated backend (#2)
- Add EIP-1559 parameters
- eth/catalyst: update payload id computation (#1)
- make eip1559 configurable (#4)
- post-merge network should not log warnings about missing transition information (#5)
- Make the simulator more configurable (#6)
- fix OPB-6 - IsDepositTx check instead of artificial nonce value check (#7)
- Simulated backend - enable proof of stake consensus type and fix performance issue (#8)
- accounts: simulated backend consensus engine option and immediate tx indexing
- consensus/beacon: recognize all blocks as reached TTD with 0 TTD in chain config
- Add --rollup.historicalhttp CLI flag and fix backend iface
- Flags and interfaces for historical RPC requests (#12)
- Redirect historical RPC requests (#13)
- Use the pre-existing ethereum.NotFound error (#18)
- Add historical endpoint to TraceBlockByNumber and TraceBlockByHash (#19)
- Add historical endpoint to TraceTransaction (#20)
- Add historical endpoint to TraceCall (#21)
- optimism: fee params from info txi, update l1 cost func GPO params read (#15)
- add hardcoded addresses for fee payouts (#23)
- dynamic gas limit via engine API (#22)
Co-authored-by: Matthew Slipper <me@matthewslipper.com>
Co-authored-by: Joshua Gutow <jgutow@oplabs.co>
Co-authored-by: protolambda <proto@protolambda.com>
Co-authored-by: Mark Tyneway <mark.tyneway@gmail.com>
Co-authored-by: Maurelian <maurelian@protonmail.ch>
2022-03-10 12:13:11 -08:00
if l1Cost != nil {
balanceCheck . Add ( balanceCheck , l1Cost )
}
2021-05-30 19:37:52 +02:00
}
if have , want := st . state . GetBalance ( st . msg . From ( ) ) , balanceCheck ; have . Cmp ( want ) < 0 {
2020-12-04 12:22:19 +01:00
return fmt . Errorf ( "%w: address %v have %v want %v" , ErrInsufficientFunds , st . msg . From ( ) . Hex ( ) , have , want )
2014-06-13 12:58:01 +02:00
}
2017-11-13 13:47:27 +02:00
if err := st . gp . SubGas ( st . msg . Gas ( ) ) ; err != nil {
2014-06-13 12:58:01 +02:00
return err
}
2017-11-13 13:47:27 +02:00
st . gas += st . msg . Gas ( )
2017-01-04 20:17:24 +01:00
2017-11-13 13:47:27 +02:00
st . initialGas = st . msg . Gas ( )
2018-04-10 15:33:25 +02:00
st . state . SubBalance ( st . msg . From ( ) , mgval )
2014-06-13 12:58:01 +02:00
return nil
}
2017-05-11 09:55:48 +08:00
func ( st * StateTransition ) preCheck ( ) error {
optimism: historical Bedrock geth rollup changes
This commit squashes the op-geth fork history into a more maintainable
diff for rebasing upon upstream geth.
reference-optimistic-geth changes (origins of op-geth in early Bedrock
development stage):
- Deposit TX Type
- Enable deposit tx in EVM/tx pool
- Change deposit nonce to not be the max nonce
- Extend PayloadAttributesV1 with a Transactions field
- Force deposits at the start of each L2 block
- Fix height check
- noTxPool flag, reproduce block in verifier mode without tx pool interference
- Fix RPC json marshalling (ref op-geth PR 4)
- Deposit txs block height check in block body validation (ref op-geth PR 5)
- core: do not try to reinject deposit txs into tx-pool (ref-op-geth PR 6)
- deposit source hash field instead of L2 block height and tx index combination
- Include invalid deposits, rewind state, but always persist mint (#10)
- Provide gas to Call/Create in deposit transactions (#12)
- Add docker builds (ref-op-geth PR 16, 17)
- Don't panic on deposit transaction signature values or chain ID (ref-op-geth PR 18)
- core: Add version to DepositTx (ref-op-geth PR 19)
- Enable Geth build/lint/test in CircleCI (ref-op-geth PR 23)
- core: Include guaranteed gas in the gas pool (ref-op-geth PR 21)
- core: handle base fee, l1 availability fee, tx fee (ref-op-geth PR 27)
- fix: deposit tx hash
- fix l1 fee cache, rpc, tracing and tx pool
- core: remove deposit-tx sub-type (a.k.a. deposit version byte)
- eth/catalyst: allow engine user to reorg own chain
- miner: restore ability to reorg deep as block builder
- params: print Optimism consensus type in banner
- core/types: remove unused protected() method, see upstream PR 23376
- core: do not mutate original balance value in tx pool l1 cost adjustment
- core: subtract deposit gas from pool, so other txs do not use the same gas. And fail tx processing if deposits reach gas limit
- core/types: deposits do not tip, avoid basefee subtraction
- Unmeter the L1 Attributes Transaction
- miner: handle force tx errors as critical, clean up diff
- ci: Switch branch
- eth,miner: return STATUS_INVALID when failing to process forced transactions in request (ref-op-geth PR 40)
- verifier: forward tx to sequencer based on flag
- txpool: add flag to disable tx gossip (ref-op-geth PR 42)
- Add op-geth version in addition to geth version (ref-op-geth PR 43)
- ci: CircleCI improvements (ref-op-geth PR 44)
- Rename to op-geth
- Build latest tag on optimism branch
op-geth changes:
- Expose cache config in simulated backend (#2)
- Add EIP-1559 parameters
- eth/catalyst: update payload id computation (#1)
- make eip1559 configurable (#4)
- post-merge network should not log warnings about missing transition information (#5)
- Make the simulator more configurable (#6)
- fix OPB-6 - IsDepositTx check instead of artificial nonce value check (#7)
- Simulated backend - enable proof of stake consensus type and fix performance issue (#8)
- accounts: simulated backend consensus engine option and immediate tx indexing
- consensus/beacon: recognize all blocks as reached TTD with 0 TTD in chain config
- Add --rollup.historicalhttp CLI flag and fix backend iface
- Flags and interfaces for historical RPC requests (#12)
- Redirect historical RPC requests (#13)
- Use the pre-existing ethereum.NotFound error (#18)
- Add historical endpoint to TraceBlockByNumber and TraceBlockByHash (#19)
- Add historical endpoint to TraceTransaction (#20)
- Add historical endpoint to TraceCall (#21)
- optimism: fee params from info txi, update l1 cost func GPO params read (#15)
- add hardcoded addresses for fee payouts (#23)
- dynamic gas limit via engine API (#22)
Co-authored-by: Matthew Slipper <me@matthewslipper.com>
Co-authored-by: Joshua Gutow <jgutow@oplabs.co>
Co-authored-by: protolambda <proto@protolambda.com>
Co-authored-by: Mark Tyneway <mark.tyneway@gmail.com>
Co-authored-by: Maurelian <maurelian@protonmail.ch>
2022-03-10 12:13:11 -08:00
if st . msg . IsDepositTx ( ) {
// No fee fields to check, no nonce to check, and no need to check if EOA (L1 already verified it for us)
// Gas is free, but no refunds!
st . initialGas = st . msg . Gas ( )
st . gas += st . msg . Gas ( ) // Add gas here in order to be able to execute calls.
// Don't touch the gas pool for system transactions
if st . msg . IsSystemTx ( ) {
return nil
}
return st . gp . SubGas ( st . msg . Gas ( ) ) // gas used by deposits may not be used by other txs
}
2021-08-23 11:49:39 +02:00
// Only check transactions that are not fake
if ! st . msg . IsFake ( ) {
// Make sure this transaction's nonce is correct.
2020-12-04 12:22:19 +01:00
stNonce := st . state . GetNonce ( st . msg . From ( ) )
if msgNonce := st . msg . Nonce ( ) ; stNonce < msgNonce {
return fmt . Errorf ( "%w: address %v, tx: %d state: %d" , ErrNonceTooHigh ,
st . msg . From ( ) . Hex ( ) , msgNonce , stNonce )
} else if stNonce > msgNonce {
return fmt . Errorf ( "%w: address %v, tx: %d state: %d" , ErrNonceTooLow ,
st . msg . From ( ) . Hex ( ) , msgNonce , stNonce )
2021-11-11 15:00:58 +01:00
} else if stNonce + 1 < stNonce {
return fmt . Errorf ( "%w: address %v, nonce: %d" , ErrNonceMax ,
st . msg . From ( ) . Hex ( ) , stNonce )
2016-07-11 11:58:10 +02:00
}
2021-08-23 11:49:39 +02:00
// Make sure the sender is an EOA
if codeHash := st . state . GetCodeHash ( st . msg . From ( ) ) ; codeHash != emptyCodeHash && codeHash != ( common . Hash { } ) {
return fmt . Errorf ( "%w: address %v, codehash: %s" , ErrSenderNoEOA ,
st . msg . From ( ) . Hex ( ) , codeHash )
}
2021-08-07 19:38:18 +02:00
}
2021-06-08 13:05:41 +03:00
// Make sure that transaction gasFeeCap is greater than the baseFee (post london)
2021-05-17 15:13:22 +02:00
if st . evm . ChainConfig ( ) . IsLondon ( st . evm . Context . BlockNumber ) {
2021-06-10 08:02:51 +03:00
// Skip the checks if gas fields are zero and baseFee was explicitly disabled (eth_call)
if ! st . evm . Config . NoBaseFee || st . gasFeeCap . BitLen ( ) > 0 || st . gasTipCap . BitLen ( ) > 0 {
if l := st . gasFeeCap . BitLen ( ) ; l > 256 {
return fmt . Errorf ( "%w: address %v, maxFeePerGas bit length: %d" , ErrFeeCapVeryHigh ,
st . msg . From ( ) . Hex ( ) , l )
}
if l := st . gasTipCap . BitLen ( ) ; l > 256 {
return fmt . Errorf ( "%w: address %v, maxPriorityFeePerGas bit length: %d" , ErrTipVeryHigh ,
st . msg . From ( ) . Hex ( ) , l )
}
if st . gasFeeCap . Cmp ( st . gasTipCap ) < 0 {
return fmt . Errorf ( "%w: address %v, maxPriorityFeePerGas: %s, maxFeePerGas: %s" , ErrTipAboveFeeCap ,
st . msg . From ( ) . Hex ( ) , st . gasTipCap , st . gasFeeCap )
}
// This will panic if baseFee is nil, but basefee presence is verified
// as part of header validation.
if st . gasFeeCap . Cmp ( st . evm . Context . BaseFee ) < 0 {
return fmt . Errorf ( "%w: address %v, maxFeePerGas: %s baseFee: %s" , ErrFeeCapTooLow ,
st . msg . From ( ) . Hex ( ) , st . gasFeeCap , st . evm . Context . BaseFee )
}
2021-05-17 15:13:22 +02:00
}
}
2017-05-11 09:55:48 +08:00
return st . buyGas ( )
2014-06-19 13:41:17 +02:00
}
2017-11-13 13:47:27 +02:00
// TransitionDb will transition the state by applying the current message and
2020-04-22 16:25:36 +08:00
// returning the evm execution result with following fields.
//
2022-09-10 13:25:40 +02:00
// - used gas: total gas used (including gas being refunded)
// - returndata: the returned data from evm
// - concrete execution error: various EVM errors which abort the execution, e.g.
// ErrOutOfGas, ErrExecutionReverted
2020-04-22 16:25:36 +08:00
//
// However if any consensus issue encountered, return the error directly with
// nil evm execution result.
func ( st * StateTransition ) TransitionDb ( ) ( * ExecutionResult , error ) {
optimism: historical Bedrock geth rollup changes
This commit squashes the op-geth fork history into a more maintainable
diff for rebasing upon upstream geth.
reference-optimistic-geth changes (origins of op-geth in early Bedrock
development stage):
- Deposit TX Type
- Enable deposit tx in EVM/tx pool
- Change deposit nonce to not be the max nonce
- Extend PayloadAttributesV1 with a Transactions field
- Force deposits at the start of each L2 block
- Fix height check
- noTxPool flag, reproduce block in verifier mode without tx pool interference
- Fix RPC json marshalling (ref op-geth PR 4)
- Deposit txs block height check in block body validation (ref op-geth PR 5)
- core: do not try to reinject deposit txs into tx-pool (ref-op-geth PR 6)
- deposit source hash field instead of L2 block height and tx index combination
- Include invalid deposits, rewind state, but always persist mint (#10)
- Provide gas to Call/Create in deposit transactions (#12)
- Add docker builds (ref-op-geth PR 16, 17)
- Don't panic on deposit transaction signature values or chain ID (ref-op-geth PR 18)
- core: Add version to DepositTx (ref-op-geth PR 19)
- Enable Geth build/lint/test in CircleCI (ref-op-geth PR 23)
- core: Include guaranteed gas in the gas pool (ref-op-geth PR 21)
- core: handle base fee, l1 availability fee, tx fee (ref-op-geth PR 27)
- fix: deposit tx hash
- fix l1 fee cache, rpc, tracing and tx pool
- core: remove deposit-tx sub-type (a.k.a. deposit version byte)
- eth/catalyst: allow engine user to reorg own chain
- miner: restore ability to reorg deep as block builder
- params: print Optimism consensus type in banner
- core/types: remove unused protected() method, see upstream PR 23376
- core: do not mutate original balance value in tx pool l1 cost adjustment
- core: subtract deposit gas from pool, so other txs do not use the same gas. And fail tx processing if deposits reach gas limit
- core/types: deposits do not tip, avoid basefee subtraction
- Unmeter the L1 Attributes Transaction
- miner: handle force tx errors as critical, clean up diff
- ci: Switch branch
- eth,miner: return STATUS_INVALID when failing to process forced transactions in request (ref-op-geth PR 40)
- verifier: forward tx to sequencer based on flag
- txpool: add flag to disable tx gossip (ref-op-geth PR 42)
- Add op-geth version in addition to geth version (ref-op-geth PR 43)
- ci: CircleCI improvements (ref-op-geth PR 44)
- Rename to op-geth
- Build latest tag on optimism branch
op-geth changes:
- Expose cache config in simulated backend (#2)
- Add EIP-1559 parameters
- eth/catalyst: update payload id computation (#1)
- make eip1559 configurable (#4)
- post-merge network should not log warnings about missing transition information (#5)
- Make the simulator more configurable (#6)
- fix OPB-6 - IsDepositTx check instead of artificial nonce value check (#7)
- Simulated backend - enable proof of stake consensus type and fix performance issue (#8)
- accounts: simulated backend consensus engine option and immediate tx indexing
- consensus/beacon: recognize all blocks as reached TTD with 0 TTD in chain config
- Add --rollup.historicalhttp CLI flag and fix backend iface
- Flags and interfaces for historical RPC requests (#12)
- Redirect historical RPC requests (#13)
- Use the pre-existing ethereum.NotFound error (#18)
- Add historical endpoint to TraceBlockByNumber and TraceBlockByHash (#19)
- Add historical endpoint to TraceTransaction (#20)
- Add historical endpoint to TraceCall (#21)
- optimism: fee params from info txi, update l1 cost func GPO params read (#15)
- add hardcoded addresses for fee payouts (#23)
- dynamic gas limit via engine API (#22)
Co-authored-by: Matthew Slipper <me@matthewslipper.com>
Co-authored-by: Joshua Gutow <jgutow@oplabs.co>
Co-authored-by: protolambda <proto@protolambda.com>
Co-authored-by: Mark Tyneway <mark.tyneway@gmail.com>
Co-authored-by: Maurelian <maurelian@protonmail.ch>
2022-03-10 12:13:11 -08:00
if mint := st . msg . Mint ( ) ; mint != nil {
st . state . AddBalance ( st . msg . From ( ) , mint )
}
snap := st . state . Snapshot ( )
result , err := st . innerTransitionDb ( )
// Failed deposits must still be included. Unless we cannot produce the block at all due to the gas limit.
// On deposit failure, we rewind any state changes from after the minting, and increment the nonce.
if err != nil && err != ErrGasLimitReached && st . msg . IsDepositTx ( ) {
st . state . RevertToSnapshot ( snap )
// Even though we revert the state changes, always increment the nonce for the next deposit transaction
st . state . SetNonce ( st . msg . From ( ) , st . state . GetNonce ( st . msg . From ( ) ) + 1 )
// Record deposits as using all their gas (matches the gas pool)
// System Transactions are special & are not recorded as using any gas (anywhere)
gasUsed := st . msg . Gas ( )
if st . msg . IsSystemTx ( ) {
gasUsed = 0
}
result = & ExecutionResult {
UsedGas : gasUsed ,
Err : fmt . Errorf ( "failed deposit: %w" , err ) ,
ReturnData : nil ,
}
err = nil
}
return result , err
}
func ( st * StateTransition ) innerTransitionDb ( ) ( * ExecutionResult , error ) {
2020-04-22 16:25:36 +08:00
// First check this message satisfies all consensus rules before
// applying the message. The rules include these clauses
//
// 1. the nonce of the message caller is correct
// 2. caller has enough balance to cover transaction fee(gaslimit * gasprice)
// 3. the amount of gas required is available in the block
// 4. the purchased gas is enough to cover intrinsic usage
// 5. there is no overflow when calculating intrinsic gas
// 6. caller has enough balance to cover asset transfer for **topmost** call
// Check clauses 1-3, buy gas if everything is correct
if err := st . preCheck ( ) ; err != nil {
return nil , err
2014-06-19 13:41:17 +02:00
}
2022-03-31 11:51:44 +02:00
if st . evm . Config . Debug {
st . evm . Config . Tracer . CaptureTxStart ( st . initialGas )
defer func ( ) {
st . evm . Config . Tracer . CaptureTxEnd ( st . gas )
} ( )
}
var (
msg = st . msg
sender = vm . AccountRef ( msg . From ( ) )
2022-09-27 13:42:57 +02:00
rules = st . evm . ChainConfig ( ) . Rules ( st . evm . Context . BlockNumber , st . evm . Context . Random != nil , st . evm . Context . Time )
2022-03-31 11:51:44 +02:00
contractCreation = msg . To ( ) == nil
)
2017-05-11 09:55:48 +08:00
2020-04-22 16:25:36 +08:00
// Check clauses 4-5, subtract intrinsic gas if everything is correct
2023-01-11 10:05:47 +01:00
gas , err := IntrinsicGas ( st . data , st . msg . AccessList ( ) , contractCreation , rules . IsHomestead , rules . IsIstanbul , rules . IsShanghai )
2018-02-14 21:02:51 +01:00
if err != nil {
2020-04-22 16:25:36 +08:00
return nil , err
2018-02-14 21:02:51 +01:00
}
2020-04-22 16:25:36 +08:00
if st . gas < gas {
2020-12-04 12:22:19 +01:00
return nil , fmt . Errorf ( "%w: have %d, want %d" , ErrIntrinsicGas , st . gas , gas )
2014-06-13 12:58:01 +02:00
}
2020-04-22 16:25:36 +08:00
st . gas -= gas
2014-06-13 12:58:01 +02:00
2020-04-22 16:25:36 +08:00
// Check clause 6
2020-11-13 13:42:19 +01:00
if msg . Value ( ) . Sign ( ) > 0 && ! st . evm . Context . CanTransfer ( st . state , msg . From ( ) , msg . Value ( ) ) {
2020-12-04 12:22:19 +01:00
return nil , fmt . Errorf ( "%w: address %v" , ErrInsufficientFundsForTransfer , msg . From ( ) . Hex ( ) )
2020-04-22 16:25:36 +08:00
}
2021-02-25 07:26:57 -07:00
2023-01-11 10:05:47 +01:00
// Check whether the init code size has been exceeded.
if rules . IsShanghai && contractCreation && len ( st . data ) > params . MaxInitCodeSize {
return nil , fmt . Errorf ( "%w: code size %v limit %v" , ErrMaxInitCodeSizeExceeded , len ( st . data ) , params . MaxInitCodeSize )
}
2022-11-16 01:18:52 -08:00
// Execute the preparatory steps for state transition which includes:
// - prepare accessList(post-berlin)
// - reset transient storage(eip 1153)
2022-11-22 22:39:52 +01:00
st . state . Prepare ( rules , msg . From ( ) , st . evm . Context . Coinbase , msg . To ( ) , vm . ActivePrecompiles ( rules ) , msg . AccessList ( ) )
2022-11-16 01:18:52 -08:00
2016-12-06 02:16:03 +01:00
var (
2020-04-22 16:25:36 +08:00
ret [ ] byte
vmerr error // vm errors do not effect consensus and are therefore not assigned to err
2016-12-06 02:16:03 +01:00
)
2015-11-27 15:40:29 +01:00
if contractCreation {
2020-04-22 16:25:36 +08:00
ret , _ , st . gas , vmerr = st . evm . Create ( sender , st . data , st . gas , st . value )
2014-07-07 13:59:09 +02:00
} else {
2015-03-24 15:23:16 +01:00
// Increment the nonce for the next transaction
2018-04-10 15:33:25 +02:00
st . state . SetNonce ( msg . From ( ) , st . state . GetNonce ( sender . Address ( ) ) + 1 )
2020-04-22 16:25:36 +08:00
ret , st . gas , vmerr = st . evm . Call ( sender , st . to ( ) , st . data , st . gas , st . value )
2015-07-06 11:54:11 +02:00
}
2021-08-09 22:34:20 +08:00
optimism: historical Bedrock geth rollup changes
This commit squashes the op-geth fork history into a more maintainable
diff for rebasing upon upstream geth.
reference-optimistic-geth changes (origins of op-geth in early Bedrock
development stage):
- Deposit TX Type
- Enable deposit tx in EVM/tx pool
- Change deposit nonce to not be the max nonce
- Extend PayloadAttributesV1 with a Transactions field
- Force deposits at the start of each L2 block
- Fix height check
- noTxPool flag, reproduce block in verifier mode without tx pool interference
- Fix RPC json marshalling (ref op-geth PR 4)
- Deposit txs block height check in block body validation (ref op-geth PR 5)
- core: do not try to reinject deposit txs into tx-pool (ref-op-geth PR 6)
- deposit source hash field instead of L2 block height and tx index combination
- Include invalid deposits, rewind state, but always persist mint (#10)
- Provide gas to Call/Create in deposit transactions (#12)
- Add docker builds (ref-op-geth PR 16, 17)
- Don't panic on deposit transaction signature values or chain ID (ref-op-geth PR 18)
- core: Add version to DepositTx (ref-op-geth PR 19)
- Enable Geth build/lint/test in CircleCI (ref-op-geth PR 23)
- core: Include guaranteed gas in the gas pool (ref-op-geth PR 21)
- core: handle base fee, l1 availability fee, tx fee (ref-op-geth PR 27)
- fix: deposit tx hash
- fix l1 fee cache, rpc, tracing and tx pool
- core: remove deposit-tx sub-type (a.k.a. deposit version byte)
- eth/catalyst: allow engine user to reorg own chain
- miner: restore ability to reorg deep as block builder
- params: print Optimism consensus type in banner
- core/types: remove unused protected() method, see upstream PR 23376
- core: do not mutate original balance value in tx pool l1 cost adjustment
- core: subtract deposit gas from pool, so other txs do not use the same gas. And fail tx processing if deposits reach gas limit
- core/types: deposits do not tip, avoid basefee subtraction
- Unmeter the L1 Attributes Transaction
- miner: handle force tx errors as critical, clean up diff
- ci: Switch branch
- eth,miner: return STATUS_INVALID when failing to process forced transactions in request (ref-op-geth PR 40)
- verifier: forward tx to sequencer based on flag
- txpool: add flag to disable tx gossip (ref-op-geth PR 42)
- Add op-geth version in addition to geth version (ref-op-geth PR 43)
- ci: CircleCI improvements (ref-op-geth PR 44)
- Rename to op-geth
- Build latest tag on optimism branch
op-geth changes:
- Expose cache config in simulated backend (#2)
- Add EIP-1559 parameters
- eth/catalyst: update payload id computation (#1)
- make eip1559 configurable (#4)
- post-merge network should not log warnings about missing transition information (#5)
- Make the simulator more configurable (#6)
- fix OPB-6 - IsDepositTx check instead of artificial nonce value check (#7)
- Simulated backend - enable proof of stake consensus type and fix performance issue (#8)
- accounts: simulated backend consensus engine option and immediate tx indexing
- consensus/beacon: recognize all blocks as reached TTD with 0 TTD in chain config
- Add --rollup.historicalhttp CLI flag and fix backend iface
- Flags and interfaces for historical RPC requests (#12)
- Redirect historical RPC requests (#13)
- Use the pre-existing ethereum.NotFound error (#18)
- Add historical endpoint to TraceBlockByNumber and TraceBlockByHash (#19)
- Add historical endpoint to TraceTransaction (#20)
- Add historical endpoint to TraceCall (#21)
- optimism: fee params from info txi, update l1 cost func GPO params read (#15)
- add hardcoded addresses for fee payouts (#23)
- dynamic gas limit via engine API (#22)
Co-authored-by: Matthew Slipper <me@matthewslipper.com>
Co-authored-by: Joshua Gutow <jgutow@oplabs.co>
Co-authored-by: protolambda <proto@protolambda.com>
Co-authored-by: Mark Tyneway <mark.tyneway@gmail.com>
Co-authored-by: Maurelian <maurelian@protonmail.ch>
2022-03-10 12:13:11 -08:00
// if deposit: skip refunds, skip tipping coinbase
if st . msg . IsDepositTx ( ) {
// Record deposits as using all their gas (matches the gas pool)
// System Transactions are special & are not recorded as using any gas (anywhere)
gasUsed := st . msg . Gas ( )
if st . msg . IsSystemTx ( ) {
gasUsed = 0
}
return & ExecutionResult {
UsedGas : gasUsed ,
Err : vmerr ,
ReturnData : ret ,
} , nil
}
2022-03-31 11:51:44 +02:00
if ! rules . IsLondon {
2021-05-07 08:25:32 +02:00
// Before EIP-3529: refunds were capped to gasUsed / 2
st . refundGas ( params . RefundQuotient )
} else {
// After EIP-3529: refunds are capped to gasUsed / 5
st . refundGas ( params . RefundQuotientEIP3529 )
}
2021-05-17 15:13:22 +02:00
effectiveTip := st . gasPrice
2022-03-31 11:51:44 +02:00
if rules . IsLondon {
2021-06-08 13:05:41 +03:00
effectiveTip = cmath . BigMin ( st . gasTipCap , new ( big . Int ) . Sub ( st . gasFeeCap , st . evm . Context . BaseFee ) )
2021-05-17 15:13:22 +02:00
}
2022-07-15 04:32:54 -05:00
if st . evm . Config . NoBaseFee && st . gasFeeCap . Sign ( ) == 0 && st . gasTipCap . Sign ( ) == 0 {
// Skip fee payment when NoBaseFee is set and the fee fields
// are 0. This avoids a negative effectiveTip being applied to
// the coinbase when simulating calls.
} else {
fee := new ( big . Int ) . SetUint64 ( st . gasUsed ( ) )
fee . Mul ( fee , effectiveTip )
st . state . AddBalance ( st . evm . Context . Coinbase , fee )
}
2014-07-24 12:04:15 +02:00
2022-12-05 10:36:27 -08:00
// Check that we are post bedrock to enable op-geth to be able to create pseudo pre-bedrock blocks (these are pre-bedrock, but don't follow l2 geth rules)
// Note optimismConfig will not be nil if rules.IsOptimismBedrock is true
if optimismConfig := st . evm . ChainConfig ( ) . Optimism ; optimismConfig != nil && rules . IsOptimismBedrock {
optimism: historical Bedrock geth rollup changes
This commit squashes the op-geth fork history into a more maintainable
diff for rebasing upon upstream geth.
reference-optimistic-geth changes (origins of op-geth in early Bedrock
development stage):
- Deposit TX Type
- Enable deposit tx in EVM/tx pool
- Change deposit nonce to not be the max nonce
- Extend PayloadAttributesV1 with a Transactions field
- Force deposits at the start of each L2 block
- Fix height check
- noTxPool flag, reproduce block in verifier mode without tx pool interference
- Fix RPC json marshalling (ref op-geth PR 4)
- Deposit txs block height check in block body validation (ref op-geth PR 5)
- core: do not try to reinject deposit txs into tx-pool (ref-op-geth PR 6)
- deposit source hash field instead of L2 block height and tx index combination
- Include invalid deposits, rewind state, but always persist mint (#10)
- Provide gas to Call/Create in deposit transactions (#12)
- Add docker builds (ref-op-geth PR 16, 17)
- Don't panic on deposit transaction signature values or chain ID (ref-op-geth PR 18)
- core: Add version to DepositTx (ref-op-geth PR 19)
- Enable Geth build/lint/test in CircleCI (ref-op-geth PR 23)
- core: Include guaranteed gas in the gas pool (ref-op-geth PR 21)
- core: handle base fee, l1 availability fee, tx fee (ref-op-geth PR 27)
- fix: deposit tx hash
- fix l1 fee cache, rpc, tracing and tx pool
- core: remove deposit-tx sub-type (a.k.a. deposit version byte)
- eth/catalyst: allow engine user to reorg own chain
- miner: restore ability to reorg deep as block builder
- params: print Optimism consensus type in banner
- core/types: remove unused protected() method, see upstream PR 23376
- core: do not mutate original balance value in tx pool l1 cost adjustment
- core: subtract deposit gas from pool, so other txs do not use the same gas. And fail tx processing if deposits reach gas limit
- core/types: deposits do not tip, avoid basefee subtraction
- Unmeter the L1 Attributes Transaction
- miner: handle force tx errors as critical, clean up diff
- ci: Switch branch
- eth,miner: return STATUS_INVALID when failing to process forced transactions in request (ref-op-geth PR 40)
- verifier: forward tx to sequencer based on flag
- txpool: add flag to disable tx gossip (ref-op-geth PR 42)
- Add op-geth version in addition to geth version (ref-op-geth PR 43)
- ci: CircleCI improvements (ref-op-geth PR 44)
- Rename to op-geth
- Build latest tag on optimism branch
op-geth changes:
- Expose cache config in simulated backend (#2)
- Add EIP-1559 parameters
- eth/catalyst: update payload id computation (#1)
- make eip1559 configurable (#4)
- post-merge network should not log warnings about missing transition information (#5)
- Make the simulator more configurable (#6)
- fix OPB-6 - IsDepositTx check instead of artificial nonce value check (#7)
- Simulated backend - enable proof of stake consensus type and fix performance issue (#8)
- accounts: simulated backend consensus engine option and immediate tx indexing
- consensus/beacon: recognize all blocks as reached TTD with 0 TTD in chain config
- Add --rollup.historicalhttp CLI flag and fix backend iface
- Flags and interfaces for historical RPC requests (#12)
- Redirect historical RPC requests (#13)
- Use the pre-existing ethereum.NotFound error (#18)
- Add historical endpoint to TraceBlockByNumber and TraceBlockByHash (#19)
- Add historical endpoint to TraceTransaction (#20)
- Add historical endpoint to TraceCall (#21)
- optimism: fee params from info txi, update l1 cost func GPO params read (#15)
- add hardcoded addresses for fee payouts (#23)
- dynamic gas limit via engine API (#22)
Co-authored-by: Matthew Slipper <me@matthewslipper.com>
Co-authored-by: Joshua Gutow <jgutow@oplabs.co>
Co-authored-by: protolambda <proto@protolambda.com>
Co-authored-by: Mark Tyneway <mark.tyneway@gmail.com>
Co-authored-by: Maurelian <maurelian@protonmail.ch>
2022-03-10 12:13:11 -08:00
st . state . AddBalance ( params . OptimismBaseFeeRecipient , new ( big . Int ) . Mul ( new ( big . Int ) . SetUint64 ( st . gasUsed ( ) ) , st . evm . Context . BaseFee ) )
if cost := st . evm . Context . L1CostFunc ( st . evm . Context . BlockNumber . Uint64 ( ) , st . msg ) ; cost != nil {
st . state . AddBalance ( params . OptimismL1FeeRecipient , cost )
}
}
2020-04-22 16:25:36 +08:00
return & ExecutionResult {
UsedGas : st . gasUsed ( ) ,
Err : vmerr ,
ReturnData : ret ,
} , nil
2014-07-24 12:04:15 +02:00
}
2014-12-18 21:58:26 +01:00
2021-05-07 08:25:32 +02:00
func ( st * StateTransition ) refundGas ( refundQuotient uint64 ) {
// Apply refund counter, capped to a refund quotient
refund := st . gasUsed ( ) / refundQuotient
2017-11-13 13:47:27 +02:00
if refund > st . state . GetRefund ( ) {
refund = st . state . GetRefund ( )
}
st . gas += refund
2017-01-04 20:17:24 +01:00
2017-11-13 13:47:27 +02:00
// Return ETH for remaining gas, exchanged at the original rate.
remaining := new ( big . Int ) . Mul ( new ( big . Int ) . SetUint64 ( st . gas ) , st . gasPrice )
2018-04-10 15:33:25 +02:00
st . state . AddBalance ( st . msg . From ( ) , remaining )
2014-12-18 21:58:26 +01:00
2015-09-02 12:55:11 +02:00
// Also return remaining gas to the block gas counter so it is
// available for the next transaction.
2017-11-13 13:47:27 +02:00
st . gp . AddGas ( st . gas )
2014-12-18 21:58:26 +01:00
}
2017-11-13 13:47:27 +02:00
// gasUsed returns the amount of gas used up by the state transition.
func ( st * StateTransition ) gasUsed ( ) uint64 {
return st . initialGas - st . gas
2014-12-18 21:58:26 +01:00
}