mirror of
https://github.com/ethereum/go-ethereum.git
synced 2026-08-19 18:32:23 +00:00
update based on fixes added to the main branch
This commit is contained in:
parent
f534a4dc35
commit
1bdae104a4
4 changed files with 18 additions and 38 deletions
|
|
@ -104,8 +104,8 @@ func (aw *AccessWitness) TouchFullAccount(addr []byte, isWrite bool) uint64 {
|
||||||
// call to that account.
|
// call to that account.
|
||||||
func (aw *AccessWitness) TouchAndChargeMessageCall(destination []byte) uint64 {
|
func (aw *AccessWitness) TouchAndChargeMessageCall(destination []byte) uint64 {
|
||||||
var gas uint64
|
var gas uint64
|
||||||
gas += aw.touchAddressAndChargeGas(addr, zeroTreeIndex, utils.VersionLeafKey, false)
|
gas += aw.touchAddressAndChargeGas(destination, zeroTreeIndex, utils.VersionLeafKey, false)
|
||||||
gas += aw.touchAddressAndChargeGas(addr, zeroTreeIndex, utils.CodeSizeLeafKey, false)
|
gas += aw.touchAddressAndChargeGas(destination, zeroTreeIndex, utils.CodeSizeLeafKey, false)
|
||||||
return gas
|
return gas
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -26,7 +26,6 @@ import (
|
||||||
"github.com/ethereum/go-ethereum/core/tracing"
|
"github.com/ethereum/go-ethereum/core/tracing"
|
||||||
"github.com/ethereum/go-ethereum/core/types"
|
"github.com/ethereum/go-ethereum/core/types"
|
||||||
"github.com/ethereum/go-ethereum/core/vm"
|
"github.com/ethereum/go-ethereum/core/vm"
|
||||||
"github.com/ethereum/go-ethereum/crypto"
|
|
||||||
"github.com/ethereum/go-ethereum/crypto/kzg4844"
|
"github.com/ethereum/go-ethereum/crypto/kzg4844"
|
||||||
"github.com/ethereum/go-ethereum/params"
|
"github.com/ethereum/go-ethereum/params"
|
||||||
"github.com/holiman/uint256"
|
"github.com/holiman/uint256"
|
||||||
|
|
@ -424,18 +423,12 @@ func (st *StateTransition) TransitionDb() (*ExecutionResult, error) {
|
||||||
originAddr := msg.From
|
originAddr := msg.From
|
||||||
|
|
||||||
st.evm.Accesses.TouchTxOrigin(originAddr.Bytes())
|
st.evm.Accesses.TouchTxOrigin(originAddr.Bytes())
|
||||||
originNonce := st.evm.StateDB.GetNonce(originAddr)
|
|
||||||
|
|
||||||
if msg.To != nil {
|
if msg.To != nil {
|
||||||
st.evm.Accesses.TouchTxDestination(targetAddr.Bytes(), msg.Value.Sign() != 0)
|
st.evm.Accesses.TouchTxDestination(targetAddr.Bytes(), msg.Value.Sign() != 0)
|
||||||
|
|
||||||
// ensure the code size ends up in the access witness
|
// ensure the code size ends up in the access witness
|
||||||
st.evm.StateDB.GetCodeSize(*targetAddr)
|
st.evm.StateDB.GetCodeSize(*targetAddr)
|
||||||
} else {
|
|
||||||
contractAddr := crypto.CreateAddress(originAddr, originNonce)
|
|
||||||
if !tryConsumeGas(&st.gasRemaining, st.evm.Accesses.TouchAndChargeContractCreateInit(contractAddr.Bytes(), msg.Value.Sign() != 0)) {
|
|
||||||
return nil, fmt.Errorf("%w: Insufficient funds to cover witness access costs for transaction: have %d, want %d", ErrInsufficientBalanceWitness, st.gasRemaining, gas)
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -403,12 +403,6 @@ func gasCall(evm *EVM, contract *Contract, stack *Stack, mem *Memory, memorySize
|
||||||
return 0, ErrGasUintOverflow
|
return 0, ErrGasUintOverflow
|
||||||
}
|
}
|
||||||
if evm.chainRules.IsEIP4762 {
|
if evm.chainRules.IsEIP4762 {
|
||||||
if _, isPrecompile := evm.precompile(address); !isPrecompile {
|
|
||||||
gas, overflow = math.SafeAdd(gas, evm.Accesses.TouchAndChargeMessageCall(address.Bytes()[:]))
|
|
||||||
if overflow {
|
|
||||||
return 0, ErrGasUintOverflow
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if transfersValue {
|
if transfersValue {
|
||||||
gas, overflow = math.SafeAdd(gas, evm.Accesses.TouchAndChargeValueTransfer(contract.Address().Bytes()[:], address.Bytes()[:]))
|
gas, overflow = math.SafeAdd(gas, evm.Accesses.TouchAndChargeValueTransfer(contract.Address().Bytes()[:], address.Bytes()[:]))
|
||||||
if overflow {
|
if overflow {
|
||||||
|
|
@ -444,8 +438,9 @@ func gasCallCode(evm *EVM, contract *Contract, stack *Stack, mem *Memory, memory
|
||||||
}
|
}
|
||||||
if evm.chainRules.IsEIP4762 {
|
if evm.chainRules.IsEIP4762 {
|
||||||
address := common.Address(stack.Back(1).Bytes20())
|
address := common.Address(stack.Back(1).Bytes20())
|
||||||
if _, isPrecompile := evm.precompile(address); !isPrecompile {
|
transfersValue := !stack.Back(2).IsZero()
|
||||||
gas, overflow = math.SafeAdd(gas, evm.Accesses.TouchAndChargeMessageCall(address.Bytes()))
|
if transfersValue {
|
||||||
|
gas, overflow = math.SafeAdd(gas, evm.Accesses.TouchAndChargeValueTransfer(contract.Address().Bytes()[:], address.Bytes()[:]))
|
||||||
if overflow {
|
if overflow {
|
||||||
return 0, ErrGasUintOverflow
|
return 0, ErrGasUintOverflow
|
||||||
}
|
}
|
||||||
|
|
@ -467,15 +462,6 @@ func gasDelegateCall(evm *EVM, contract *Contract, stack *Stack, mem *Memory, me
|
||||||
if gas, overflow = math.SafeAdd(gas, evm.callGasTemp); overflow {
|
if gas, overflow = math.SafeAdd(gas, evm.callGasTemp); overflow {
|
||||||
return 0, ErrGasUintOverflow
|
return 0, ErrGasUintOverflow
|
||||||
}
|
}
|
||||||
if evm.chainRules.IsEIP4762 {
|
|
||||||
address := common.Address(stack.Back(1).Bytes20())
|
|
||||||
if _, isPrecompile := evm.precompile(address); !isPrecompile {
|
|
||||||
gas, overflow = math.SafeAdd(gas, evm.Accesses.TouchAndChargeMessageCall(address.Bytes()))
|
|
||||||
if overflow {
|
|
||||||
return 0, ErrGasUintOverflow
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return gas, nil
|
return gas, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -492,15 +478,6 @@ func gasStaticCall(evm *EVM, contract *Contract, stack *Stack, mem *Memory, memo
|
||||||
if gas, overflow = math.SafeAdd(gas, evm.callGasTemp); overflow {
|
if gas, overflow = math.SafeAdd(gas, evm.callGasTemp); overflow {
|
||||||
return 0, ErrGasUintOverflow
|
return 0, ErrGasUintOverflow
|
||||||
}
|
}
|
||||||
if evm.chainRules.IsEIP4762 {
|
|
||||||
address := common.Address(stack.Back(1).Bytes20())
|
|
||||||
if _, isPrecompile := evm.precompile(address); !isPrecompile {
|
|
||||||
gas, overflow = math.SafeAdd(gas, evm.Accesses.TouchAndChargeMessageCall(address.Bytes()))
|
|
||||||
if overflow {
|
|
||||||
return 0, ErrGasUintOverflow
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return gas, nil
|
return gas, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -49,17 +49,22 @@ func gasBalance4762(evm *EVM, contract *Contract, stack *Stack, mem *Memory, mem
|
||||||
|
|
||||||
func gasExtCodeSize4762(evm *EVM, contract *Contract, stack *Stack, mem *Memory, memorySize uint64) (uint64, error) {
|
func gasExtCodeSize4762(evm *EVM, contract *Contract, stack *Stack, mem *Memory, memorySize uint64) (uint64, error) {
|
||||||
address := stack.peek().Bytes20()
|
address := stack.peek().Bytes20()
|
||||||
|
if _, isPrecompile := evm.precompile(address); isPrecompile {
|
||||||
|
return 0, nil
|
||||||
|
}
|
||||||
wgas := evm.Accesses.TouchVersion(address[:], false)
|
wgas := evm.Accesses.TouchVersion(address[:], false)
|
||||||
wgas += evm.Accesses.TouchCodeSize(address[:], false)
|
wgas += evm.Accesses.TouchCodeSize(address[:], false)
|
||||||
if wgas == 0 {
|
if wgas == 0 {
|
||||||
wgas = params.WarmStorageReadCostEIP2929
|
wgas = params.WarmStorageReadCostEIP2929
|
||||||
}
|
}
|
||||||
|
|
||||||
return wgas, nil
|
return wgas, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func gasExtCodeHash4762(evm *EVM, contract *Contract, stack *Stack, mem *Memory, memorySize uint64) (uint64, error) {
|
func gasExtCodeHash4762(evm *EVM, contract *Contract, stack *Stack, mem *Memory, memorySize uint64) (uint64, error) {
|
||||||
address := stack.peek().Bytes20()
|
address := stack.peek().Bytes20()
|
||||||
|
if _, isPrecompile := evm.precompile(address); isPrecompile {
|
||||||
|
return 0, nil
|
||||||
|
}
|
||||||
codehashgas := evm.Accesses.TouchCodeHash(address[:], false)
|
codehashgas := evm.Accesses.TouchCodeHash(address[:], false)
|
||||||
if codehashgas == 0 {
|
if codehashgas == 0 {
|
||||||
codehashgas = params.WarmStorageReadCostEIP2929
|
codehashgas = params.WarmStorageReadCostEIP2929
|
||||||
|
|
@ -73,8 +78,10 @@ func makeCallVariantGasEIP4762(oldCalculator gasFunc) gasFunc {
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return 0, err
|
return 0, err
|
||||||
}
|
}
|
||||||
wgas := evm.Accesses.TouchCodeSize(contract.Address().Bytes(), false)
|
if _, isPrecompile := evm.precompile(contract.Address()); isPrecompile {
|
||||||
wgas += evm.Accesses.TouchCodeHash(contract.Address().Bytes(), false)
|
return gas, nil
|
||||||
|
}
|
||||||
|
wgas := evm.Accesses.TouchAndChargeMessageCall(contract.Address().Bytes())
|
||||||
if wgas == 0 {
|
if wgas == 0 {
|
||||||
wgas = params.WarmStorageReadCostEIP2929
|
wgas = params.WarmStorageReadCostEIP2929
|
||||||
}
|
}
|
||||||
|
|
@ -91,6 +98,9 @@ var (
|
||||||
|
|
||||||
func gasSelfdestructEIP4762(evm *EVM, contract *Contract, stack *Stack, mem *Memory, memorySize uint64) (uint64, error) {
|
func gasSelfdestructEIP4762(evm *EVM, contract *Contract, stack *Stack, mem *Memory, memorySize uint64) (uint64, error) {
|
||||||
beneficiaryAddr := common.Address(stack.peek().Bytes20())
|
beneficiaryAddr := common.Address(stack.peek().Bytes20())
|
||||||
|
if _, isPrecompile := evm.precompile(beneficiaryAddr); isPrecompile {
|
||||||
|
return 0, nil
|
||||||
|
}
|
||||||
contractAddr := contract.Address()
|
contractAddr := contract.Address()
|
||||||
statelessGas := evm.Accesses.TouchVersion(contractAddr[:], false)
|
statelessGas := evm.Accesses.TouchVersion(contractAddr[:], false)
|
||||||
statelessGas += evm.Accesses.TouchCodeSize(contractAddr[:], false)
|
statelessGas += evm.Accesses.TouchCodeSize(contractAddr[:], false)
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue