implement EIP 2046
This commit is contained in:
parent
cd98ddbbd3
commit
97f73fd03d
|
@ -65,4 +65,5 @@ const
|
|||
# and: https://github.com/ethereum/EIPs/issues/170
|
||||
EIP170_CODE_SIZE_LIMIT* = 24577
|
||||
|
||||
|
||||
# EIP
|
||||
MaxPrecompilesAddr* = 0xFFFF
|
||||
|
|
|
@ -731,7 +731,7 @@ template genCall(callName: untyped, opCode: Op): untyped =
|
|||
(memOutPos, memOutLen)
|
||||
|
||||
let contractAddress = when opCode in {Call, StaticCall}: destination else: c.msg.contractAddress
|
||||
let (childGasFee, childGasLimit) = c.gasCosts[opCode].c_handler(
|
||||
var (childGasFee, childGasLimit) = c.gasCosts[opCode].c_handler(
|
||||
value,
|
||||
GasParams(kind: opCode,
|
||||
c_isNewAccount: not c.accountExists(contractAddress),
|
||||
|
@ -742,6 +742,13 @@ template genCall(callName: untyped, opCode: Op): untyped =
|
|||
c_memLength: memLength
|
||||
))
|
||||
|
||||
# EIP 2046
|
||||
# reduce gas fee for precompiles
|
||||
# from 700 to 40
|
||||
when opCode == StaticCall:
|
||||
if c.fork >= FkBerlin and destination.toInt <= MaxPrecompilesAddr:
|
||||
childGasFee = childGasFee - 660.GasInt
|
||||
|
||||
if childGasFee >= 0:
|
||||
c.gasMeter.consumeGas(childGasFee, reason = $opCode)
|
||||
|
||||
|
|
|
@ -7,6 +7,7 @@
|
|||
|
||||
import
|
||||
macros,
|
||||
stew/endians2, stew/ranges/ptr_arith,
|
||||
eth/common/eth_types,
|
||||
../../../constants
|
||||
|
||||
|
@ -112,3 +113,9 @@ func safeInt*(x: Uint256): int {.inline.} =
|
|||
result = x.truncate(int)
|
||||
if x > high(int32).u256 or result < 0:
|
||||
result = high(int32)
|
||||
|
||||
func toInt*(x: EthAddress): int =
|
||||
type T = uint32
|
||||
const len = sizeof(T)
|
||||
fromBytesBE(T, makeOpenArray(x[x.len-len].unsafeAddr, len)).int
|
||||
|
|
@ -113,4 +113,5 @@ cliBuilder:
|
|||
./test_forkid,
|
||||
../stateless/test_witness_keys,
|
||||
../stateless/test_block_witness,
|
||||
../stateless/test_witness_json
|
||||
../stateless/test_witness_json,
|
||||
./test_misc
|
||||
|
|
|
@ -0,0 +1,26 @@
|
|||
import
|
||||
unittest2, stew/byteutils,
|
||||
eth/common/eth_types,
|
||||
../nimbus/vm/interpreter/utils/utils_numeric
|
||||
|
||||
func toAddress(n: int): EthAddress =
|
||||
result[19] = n.byte
|
||||
|
||||
func toAddress(a, b: int): EthAddress =
|
||||
result[18] = a.byte
|
||||
result[19] = b.byte
|
||||
|
||||
func toAddress(a, b, c: int): EthAddress =
|
||||
result[17] = a.byte
|
||||
result[18] = b.byte
|
||||
result[19] = c.byte
|
||||
|
||||
proc miscMain*() =
|
||||
suite "Misc test suite":
|
||||
test "EthAddress to int":
|
||||
check toAddress(0xff).toInt == 0xFF
|
||||
check toAddress(0x10, 0x0).toInt == 0x1000
|
||||
check toAddress(0x10, 0x0, 0x0).toInt == 0x100000
|
||||
|
||||
when isMainModule:
|
||||
miscMain()
|
Loading…
Reference in New Issue