Пример #1
0
def set_evm_opcode_pass():
    def debug_opcode(computation):
        computation.stack_pop(num_items=1, type_hint=constants.UINT256)

    opcodes = original_opcodes.copy()
    opcodes[vyper_opcodes['DEBUG'][0]] = as_opcode(logic_fn=debug_opcode,
                                                   mnemonic="DEBUG",
                                                   gas_cost=0)
    setattr(eth.vm.forks.byzantium.computation.ByzantiumComputation, 'opcodes',
            opcodes)
Пример #2
0
def set_evm_opcode_debugger(source_code=None,
                            source_map=None,
                            stdin=None,
                            stdout=None):
    def debug_opcode(computation):
        line_no = computation.stack_pop(num_items=1,
                                        type_hint=constants.UINT256)
        VyperDebugCmd(computation,
                      line_no=line_no,
                      source_code=source_code,
                      source_map=source_map,
                      stdin=stdin,
                      stdout=stdout).cmdloop()

    opcodes = original_opcodes.copy()
    opcodes[vyper_opcodes['DEBUG'][0]] = as_opcode(logic_fn=debug_opcode,
                                                   mnemonic="DEBUG",
                                                   gas_cost=0)

    setattr(eth.vm.forks.byzantium.computation.ByzantiumComputation, 'opcodes',
            opcodes)
Пример #3
0
from eth.vm import opcode_values
from eth.vm import mnemonics
from eth.vm.forks.homestead.opcodes import HOMESTEAD_OPCODES
from eth.vm.logic import (
    call,
    context,
    storage,
    system,
)
from eth.vm.opcode import as_opcode


UPDATED_OPCODES = {
    opcode_values.EXTCODESIZE: as_opcode(
        logic_fn=context.extcodesize,
        mnemonic=mnemonics.EXTCODESIZE,
        gas_cost=constants.GAS_EXTCODE_EIP150,
    ),
    opcode_values.EXTCODECOPY: as_opcode(
        logic_fn=context.extcodecopy,
        mnemonic=mnemonics.EXTCODECOPY,
        gas_cost=constants.GAS_EXTCODE_EIP150,
    ),
    opcode_values.BALANCE: as_opcode(
        logic_fn=context.balance,
        mnemonic=mnemonics.BALANCE,
        gas_cost=constants.GAS_BALANCE_EIP150,
    ),
    opcode_values.SLOAD: as_opcode(
        logic_fn=storage.sload,
        mnemonic=mnemonics.SLOAD,
Пример #4
0
SUBTRACT_MNEMONIC = 'SUBTRACT'


def sub(computation: BaseComputation) -> None:
    left, right = computation.stack_pop_ints(2)

    result = (left - right) & constants.UINT_256_MAX

    computation.stack_push_int(result)


UPDATED_OPCODES = {
    OP.SUB:
    as_opcode(
        logic_fn=sub,
        mnemonic=SUBTRACT_MNEMONIC,
        gas_cost=constants.GAS_LOW,
    )
}

CUSTOM_OPCODES = merge(copy.deepcopy(ISTANBUL_OPCODES), UPDATED_OPCODES)


class CustomComputation(IstanbulComputation):
    opcodes = CUSTOM_OPCODES


class CustomState(IstanbulState):
    computation_class = CustomComputation

Пример #5
0
    GAS_SELFDESTRUCT_EIP150,
)
from eth.vm.forks.byzantium.opcodes import (
    ensure_no_static,
)
from eth.vm.forks.muir_glacier.opcodes import (
    MUIR_GLACIER_OPCODES,
)

from . import logic


UPDATED_OPCODES: Dict[int, Opcode] = {
    opcode_values.BALANCE: as_opcode(
        gas_cost=constants.GAS_NULL,
        logic_fn=logic.balance_eip2929,
        mnemonic=mnemonics.BALANCE,
    ),
    opcode_values.EXTCODESIZE: as_opcode(
        gas_cost=constants.GAS_NULL,
        logic_fn=logic.extcodesize_eip2929,
        mnemonic=mnemonics.EXTCODESIZE,
    ),
    opcode_values.EXTCODECOPY: as_opcode(
        gas_cost=constants.GAS_NULL,
        logic_fn=logic.extcodecopy_eip2929,
        mnemonic=mnemonics.EXTCODECOPY,
    ),
    opcode_values.EXTCODEHASH: as_opcode(
        gas_cost=constants.GAS_NULL,
        logic_fn=logic.extcodehash_eip2929,
Пример #6
0
def ensure_no_static(opcode_fn: Callable[..., Any]) -> Callable[..., Any]:
    @functools.wraps(opcode_fn)
    def inner(computation: BaseComputation) -> Callable[..., Any]:
        if computation.msg.is_static:
            raise WriteProtection(
                "Cannot modify state while inside of a STATICCALL context")
        return opcode_fn(computation)

    return inner


UPDATED_OPCODES = {
    opcode_values.REVERT:
    as_opcode(
        logic_fn=system.revert,
        mnemonic=mnemonics.REVERT,
        gas_cost=constants.GAS_ZERO,
    ),
    #
    # Context
    #
    opcode_values.RETURNDATASIZE:
    as_opcode(
        logic_fn=context.returndatasize,
        mnemonic=mnemonics.RETURNDATASIZE,
        gas_cost=constants.GAS_BASE,
    ),
    opcode_values.RETURNDATACOPY:
    as_opcode(
        logic_fn=context.returndatacopy,
        mnemonic=mnemonics.RETURNDATACOPY,
Пример #7
0
    stack,
    storage,
    swap,
    system,
)
from eth.vm.opcode import (
    as_opcode, )

FRONTIER_OPCODES: Dict[int, OpcodeAPI] = {
    #
    # Arithmetic
    #
    opcode_values.STOP:
    as_opcode(
        logic_fn=flow.stop,
        mnemonic=mnemonics.STOP,
        gas_cost=constants.GAS_ZERO,
    ),
    opcode_values.ADD:
    as_opcode(
        logic_fn=arithmetic.add,
        mnemonic=mnemonics.ADD,
        gas_cost=constants.GAS_VERYLOW,
    ),
    opcode_values.MUL:
    as_opcode(
        logic_fn=arithmetic.mul,
        mnemonic=mnemonics.MUL,
        gas_cost=constants.GAS_LOW,
    ),
    opcode_values.SUB:
Пример #8
0
    arithmetic,
    system,
    call,
)
from eth.vm.opcode import as_opcode

from .constants import (
    GAS_EXP_EIP160,
    GAS_EXPBYTE_EIP160
)


UPDATED_OPCODES = {
    opcode_values.EXP: as_opcode(
        logic_fn=arithmetic.exp(gas_per_byte=GAS_EXPBYTE_EIP160),
        mnemonic=mnemonics.EXP,
        gas_cost=GAS_EXP_EIP160,
    ),
    opcode_values.SELFDESTRUCT: as_opcode(
        logic_fn=system.selfdestruct_eip161,
        mnemonic=mnemonics.SELFDESTRUCT,
        gas_cost=GAS_SELFDESTRUCT_EIP150,
    ),
    opcode_values.CALL: call.CallEIP161.configure(
        __name__='opcode:CALL',
        mnemonic=mnemonics.CALL,
        gas_cost=GAS_CALL_EIP150,
    )(),
}

Пример #9
0
from cytoolz import (merge)

from eth import (constants)
from eth.vm import (
    mnemonics,
    opcode_values,
)
from eth.vm.forks.byzantium.opcodes import (BYZANTIUM_OPCODES)
from eth.vm.logic import (arithmetic)
from eth.vm.opcode import (as_opcode)

UPDATED_OPCODES = {
    opcode_values.SHL:
    as_opcode(
        logic_fn=arithmetic.shl,
        mnemonic=mnemonics.SHL,
        gas_cost=constants.GAS_VERYLOW,
    ),
    opcode_values.SHR:
    as_opcode(
        logic_fn=arithmetic.shr,
        mnemonic=mnemonics.SHR,
        gas_cost=constants.GAS_VERYLOW,
    ),
}

CONSTANTINOPLE_OPCODES = merge(
    copy.deepcopy(BYZANTIUM_OPCODES),
    UPDATED_OPCODES,
)
Пример #10
0
)
from eth.vm.logic import (
    context,
    storage,
)
from eth.vm.opcode import as_opcode
from .storage import (
    sstore_eip2200,
)


UPDATED_OPCODES = {
    # New opcodes
    opcode_values.CHAINID: as_opcode(
        logic_fn=context.chain_id,
        mnemonic=mnemonics.CHAINID,
        gas_cost=constants.GAS_BASE,
    ),
    opcode_values.SELFBALANCE: as_opcode(
        logic_fn=context.selfbalance,
        mnemonic=mnemonics.SELFBALANCE,
        gas_cost=constants.GAS_LOW,
    ),

    # Repriced opcodes
    opcode_values.SSTORE: as_opcode(
        logic_fn=ensure_no_static(sstore_eip2200),
        mnemonic=mnemonics.SSTORE,
        gas_cost=constants.GAS_NULL,
    ),
    opcode_values.BALANCE: as_opcode(
Пример #11
0
    GAS_EXTCODEHASH_EIP1052
)
from eth.vm.logic import (
    arithmetic,
    context,
    system,
)
from eth.vm.opcode import (
    as_opcode
)


UPDATED_OPCODES = {
    opcode_values.SHL: as_opcode(
        logic_fn=arithmetic.shl,
        mnemonic=mnemonics.SHL,
        gas_cost=constants.GAS_VERYLOW,
    ),
    opcode_values.SHR: as_opcode(
        logic_fn=arithmetic.shr,
        mnemonic=mnemonics.SHR,
        gas_cost=constants.GAS_VERYLOW,
    ),
    opcode_values.SAR: as_opcode(
        logic_fn=arithmetic.sar,
        mnemonic=mnemonics.SAR,
        gas_cost=constants.GAS_VERYLOW,
    ),
    opcode_values.EXTCODEHASH: as_opcode(
        logic_fn=context.extcodehash,
        mnemonic=mnemonics.EXTCODEHASH,
Пример #12
0
    as_opcode,
)
from eth import constants

from eth.vm.forks.berlin.opcodes import (
    BERLIN_OPCODES, )
from eth.vm.forks.byzantium.opcodes import (
    ensure_no_static, )

from . import storage

UPDATED_OPCODES: Dict[int, Opcode] = {
    opcode_values.BASEFEE:
    as_opcode(
        gas_cost=constants.GAS_BASE,
        logic_fn=block.basefee,
        mnemonic=mnemonics.BASEFEE,
    ),
    opcode_values.SSTORE:
    as_opcode(
        gas_cost=constants.GAS_NULL,
        logic_fn=ensure_no_static(storage.sstore_eip3529),
        mnemonic=mnemonics.SSTORE,
    ),
}

LONDON_OPCODES = merge(
    copy.deepcopy(BERLIN_OPCODES),
    UPDATED_OPCODES,
)
Пример #13
0
        "balance": DEFAULT_INITIAL_BALANCE,
        "nonce": 0,
        "code": b'',
        "storage": {}
    }
}

chain = MainnetChain.from_genesis(AtomicDB(), GENESIS_PARAMS, GENESIS_STATE)


def add(computation):
    computation.stack_pop1_int()
    computation.stack_push_int(69)


add_op = as_opcode(add, "ADD", 1)


def gen_context(chain):
    CANONICAL_ADDRESS_A = to_canonical_address(
        "0x0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6")
    CANONICAL_ADDRESS_B = to_canonical_address(
        "0xcd1722f3947def4cf144679da39c4c32bdc35681")
    state = chain.get_vm().state
    message = Message(
        to=CANONICAL_ADDRESS_A,
        sender=CANONICAL_ADDRESS_B,
        create_address=None,
        value=0,
        data=b'',
        code=b'',
Пример #14
0
from eth.vm.forks.byzantium.opcodes import (BYZANTIUM_OPCODES)
from eth.vm.forks.constantinople.constants import (GAS_EXTCODEHASH_EIP1052)
from eth.vm.forks.constantinople.storage import (
    sstore_eip1283, )
from eth.vm.logic import (
    arithmetic,
    context,
    system,
)
from eth.vm.opcode import (as_opcode)

UPDATED_OPCODES = {
    opcode_values.SHL:
    as_opcode(
        logic_fn=arithmetic.shl,
        mnemonic=mnemonics.SHL,
        gas_cost=constants.GAS_VERYLOW,
    ),
    opcode_values.SHR:
    as_opcode(
        logic_fn=arithmetic.shr,
        mnemonic=mnemonics.SHR,
        gas_cost=constants.GAS_VERYLOW,
    ),
    opcode_values.SAR:
    as_opcode(
        logic_fn=arithmetic.sar,
        mnemonic=mnemonics.SAR,
        gas_cost=constants.GAS_VERYLOW,
    ),
    opcode_values.EXTCODEHASH: