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
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
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