core/vm: don't include contract deployer bytecode in AccessWitness or charge witness access costs for it (#54)
This commit is contained in:
parent
4428439fdf
commit
d761880fd2
@ -58,6 +58,9 @@ type Contract struct {
|
|||||||
CodeAddr *common.Address
|
CodeAddr *common.Address
|
||||||
Input []byte
|
Input []byte
|
||||||
|
|
||||||
|
// is the execution frame represented by this object a contract deployment
|
||||||
|
IsDeployment bool
|
||||||
|
|
||||||
Gas uint64
|
Gas uint64
|
||||||
value *big.Int
|
value *big.Int
|
||||||
}
|
}
|
||||||
|
@ -260,6 +260,7 @@ func (evm *EVM) Call(caller ContractRef, addr common.Address, input []byte, gas
|
|||||||
// The depth-check is already done, and precompiles handled above
|
// The depth-check is already done, and precompiles handled above
|
||||||
contract := NewContract(caller, AccountRef(addrCopy), value, gas)
|
contract := NewContract(caller, AccountRef(addrCopy), value, gas)
|
||||||
contract.SetCallCode(&addrCopy, evm.StateDB.GetCodeHash(addrCopy), code)
|
contract.SetCallCode(&addrCopy, evm.StateDB.GetCodeHash(addrCopy), code)
|
||||||
|
contract.IsDeployment = true
|
||||||
ret, err = evm.interpreter.Run(contract, input, false)
|
ret, err = evm.interpreter.Run(contract, input, false)
|
||||||
gas = contract.Gas
|
gas = contract.Gas
|
||||||
}
|
}
|
||||||
@ -483,6 +484,7 @@ func (evm *EVM) create(caller ContractRef, codeAndHash *codeAndHash, gas uint64,
|
|||||||
// The contract is a scoped environment for this execution context only.
|
// The contract is a scoped environment for this execution context only.
|
||||||
contract := NewContract(caller, AccountRef(address), value, gas)
|
contract := NewContract(caller, AccountRef(address), value, gas)
|
||||||
contract.SetCodeOptionalHash(&address, codeAndHash)
|
contract.SetCodeOptionalHash(&address, codeAndHash)
|
||||||
|
contract.IsDeployment = true
|
||||||
|
|
||||||
if evm.Config.NoRecursion && evm.depth > 0 {
|
if evm.Config.NoRecursion && evm.depth > 0 {
|
||||||
return nil, address, gas, nil
|
return nil, address, gas, nil
|
||||||
|
@ -191,7 +191,7 @@ func (in *EVMInterpreter) Run(contract *Contract, input []byte, readOnly bool) (
|
|||||||
logged, pcCopy, gasCopy = false, pc, contract.Gas
|
logged, pcCopy, gasCopy = false, pc, contract.Gas
|
||||||
}
|
}
|
||||||
|
|
||||||
if in.evm.TxContext.Accesses != nil {
|
if in.evm.TxContext.Accesses != nil && !contract.IsDeployment {
|
||||||
// if the PC ends up in a new "page" of verkleized code, charge the
|
// if the PC ends up in a new "page" of verkleized code, charge the
|
||||||
// associated witness costs.
|
// associated witness costs.
|
||||||
contract.Gas -= touchEachChunksAndChargeGas(pc, 1, contract.Address().Bytes()[:], contract, in.evm.TxContext.Accesses)
|
contract.Gas -= touchEachChunksAndChargeGas(pc, 1, contract.Address().Bytes()[:], contract, in.evm.TxContext.Accesses)
|
||||||
|
Loading…
x
Reference in New Issue
Block a user