def sender(self):
     if not self._sender:
         if self.r >= secpk1n or self.s >= secpk1n or self.r == 0 or self.s == 0:
             raise InvalidTransaction("Invalid signature values!")
         if self.version == 0:
             pub = ecrecover_to_pub(self.hash_unsigned, self.v, self.r,
                                    self.s)
         if self.version == 1:
             pub = ecrecover_to_pub(self.hash_typed, self.v, self.r, self.s)
         if pub == b"\x00" * 64:
             raise InvalidTransaction(
                 "Invalid signature (zero privkey cannot sign)")
         self._sender = sha3_256(pub)[-20:]
     return self._sender
def proc_ecrecover(ext, msg):
    # print('ecrecover proc', msg.gas)
    OP_GAS = opcodes.GECRECOVER
    gas_cost = OP_GAS
    if msg.gas < gas_cost:
        return 0, 0, []

    message_hash_bytes = [0] * 32
    msg.data.extract_copy(message_hash_bytes, 0, 0, 32)
    message_hash = b''.join(map(ascii_chr, message_hash_bytes))

    # TODO: This conversion isn't really necessary.
    # TODO: Invesitage if the check below is really needed.
    v = msg.data.extract32(32)
    r = msg.data.extract32(64)
    s = msg.data.extract32(96)

    if r >= secp256k1n or s >= secp256k1n or v < 27 or v > 28:
        return 1, msg.gas - opcodes.GECRECOVER, []
    try:
        pub = utils.ecrecover_to_pub(message_hash, v, r, s)
    except Exception as e:
        return 1, msg.gas - gas_cost, []
    o = [0] * 12 + [safe_ord(x) for x in utils.sha3(pub)[-20:]]
    return 1, msg.gas - gas_cost, o
 def sender(self):
     if not self._sender:
         if self.r >= secpk1n or self.s >= secpk1n or self.r == 0 or self.s == 0:
             raise InvalidTransaction("Invalid signature values!")
         if self.version == 0:
             pub = ecrecover_to_pub(self.hash_unsigned, self.v, self.r,
                                    self.s)
         if self.version == 1:
             pub = ecrecover_to_pub(self.hash_typed, self.v, self.r, self.s)
         if self.version == 2:
             v = 35 - 27 + self.network_id * 2
             if self.v < v:
                 raise InvalidTransaction(
                     "Invalid signature (wrong v with tx version = 2)")
             v = self.v - v
             pub = ecrecover_to_pub(self.hash_unsigned, v, self.r, self.s)
         if pub == b"\x00" * 64:
             raise InvalidTransaction(
                 "Invalid signature (zero privkey cannot sign)")
         self._sender = sha3_256(pub)[-20:]
     return self._sender