ethereum.forks.arrow_glacier.vm.precompiled_contracts.ecrecover

Ethereum Virtual Machine (EVM) ECRECOVER PRECOMPILED CONTRACT.

.. contents:: Table of Contents :backlinks: none :local:

Introduction

Implementation of the ECRECOVER precompiled contract.

ecrecover

Decrypts the address using elliptic curve DSA recovery mechanism and writes the address to output.

Parameters

evm : The current EVM frame.

def ecrecover(evm: Evm) -> None:
27
    """
28
    Decrypts the address using elliptic curve DSA recovery mechanism and writes
29
    the address to output.
30
31
    Parameters
32
    ----------
33
    evm :
34
        The current EVM frame.
35
36
    """
37
    data = evm.message.data
38
39
    # GAS
40
    charge_gas(evm, GAS_ECRECOVER)
41
42
    # OPERATION
43
    message_hash_bytes = buffer_read(data, U256(0), U256(32))
44
    message_hash = Hash32(message_hash_bytes)
45
    v = U256.from_be_bytes(buffer_read(data, U256(32), U256(32)))
46
    r = U256.from_be_bytes(buffer_read(data, U256(64), U256(32)))
47
    s = U256.from_be_bytes(buffer_read(data, U256(96), U256(32)))
48
49
    if v != U256(27) and v != U256(28):
50
        return
51
    if U256(0) >= r or r >= SECP256K1N:
52
        return
53
    if U256(0) >= s or s >= SECP256K1N:
54
        return
55
56
    try:
57
        public_key = secp256k1_recover(r, s, v - U256(27), message_hash)
58
    except InvalidSignatureError:
59
        # unable to extract public key
60
        return
61
62
    address = keccak256(public_key)[12:32]
63
    padded_address = left_pad_zero_bytes(address, 32)
64
    evm.output = padded_address