예제 #1
0
def precompile_ecrecover(computation):
    computation.gas_meter.consume_gas(constants.GAS_ECRECOVER, reason="ECRecover Precompile")
    raw_message_hash = computation.msg.data[:32]
    message_hash = pad32r(raw_message_hash)

    v_bytes = pad32r(computation.msg.data[32:64])
    v = big_endian_to_int(v_bytes)

    r_bytes = pad32r(computation.msg.data[64:96])
    r = big_endian_to_int(r_bytes)

    s_bytes = pad32r(computation.msg.data[96:128])
    s = big_endian_to_int(s_bytes)

    try:
        validate_lt_secpk1n(r)
        validate_lt_secpk1n(s)
        validate_lte(v, 28)
        validate_gte(v, 27)
    except ValidationError:
        return computation

    try:
        raw_public_key = ecdsa_raw_recover(message_hash, (v, r, s))
    except ValueError:
        return computation

    public_key = encode_raw_public_key(raw_public_key)
    address = public_key_to_address(public_key)
    padded_address = pad32(address)

    computation.output = padded_address
    return computation
예제 #2
0
def extract_transaction_sender(transaction):
    unsigned_transaction = transaction.as_unsigned_transaction()
    signature = encode_signature(
        v=transaction.v,
        r=transaction.r,
        s=transaction.s,
    )
    public_key = ecdsa_recover(rlp.encode(unsigned_transaction), signature)
    sender = public_key_to_address(public_key)
    return sender
예제 #3
0
def extract_transaction_sender(transaction):
    vrs = (transaction.v, transaction.r, transaction.s)
    unsigned_transaction = transaction.as_unsigned_transaction()
    raw_public_key = get_ecc_backend().ecdsa_raw_recover(
        keccak(rlp.encode(unsigned_transaction)),
        vrs,
    )
    public_key = encode_raw_public_key(raw_public_key)
    sender = public_key_to_address(public_key)
    return sender