def validate_transaction(self, transaction: BaseTransaction) -> BaseTransaction: # Validate the transaction transaction.validate() self.vm_state.validate_transaction(transaction) return transaction
def validate_transaction_signature(transaction: BaseTransaction) -> None: if is_eip_155_signed_transaction(transaction): v = extract_signature_v(transaction.v) else: v = transaction.v canonical_v = v - 27 vrs = (canonical_v, transaction.r, transaction.s) signature = keys.Signature(vrs=vrs) message = transaction.get_message_for_signing() try: public_key = signature.recover_public_key_from_msg(message) except BadSignature as e: raise ValidationError("Bad Signature: {0}".format(str(e))) if not signature.verify_msg(message, public_key): raise ValidationError("Invalid Signature")
def extract_transaction_sender(transaction: BaseTransaction) -> Address: if is_eip_155_signed_transaction(transaction): if is_even(transaction.v): v = 28 else: v = 27 else: v = transaction.v r, s = transaction.r, transaction.s canonical_v = v - 27 vrs = (canonical_v, r, s) signature = keys.Signature(vrs=vrs) message = transaction.get_message_for_signing() public_key = signature.recover_public_key_from_msg(message) sender = public_key.to_canonical_address() return Address(sender)