def add_transaction(self, block_header: BlockHeaderAPI, index_key: int, transaction: SignedTransactionAPI) -> Hash32: transaction_db = HexaryTrie(self.db, root_hash=block_header.transaction_root) transaction_db[index_key] = transaction.encode() return transaction_db.root_hash
def extract_transaction_sender(transaction: SignedTransactionAPI) -> Address: vrs = (transaction.y_parity, transaction.r, transaction.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)
def validate(self, transaction: SignedTransactionAPI) -> None: transaction_class = self.get_appropriate_tx_class() tx = transaction_class(**transaction.as_dict()) tx.validate() if tx.chain_id != self.chain.chain_id: raise ValidationError( f"Transaction {encode_hex(tx.hash)} is for chain with id {tx.chain_id} " f"but current chain has id {self.chain.chain_id}")
def __call__(self, transaction: SignedTransactionAPI) -> bool: transaction_class = self.get_appropriate_tx_class() tx = transaction_class(**transaction.as_dict()) try: tx.validate() except ValidationError: return False else: return True
def validate_transaction_signature(transaction: SignedTransactionAPI) -> None: message = transaction.get_message_for_signing() vrs = (transaction.y_parity, transaction.r, transaction.s) try: signature = keys.Signature(vrs=vrs) public_key = signature.recover_public_key_from_msg(message) except BadSignature as e: raise ValidationError(f"Bad Signature: {str(e)}") if not signature.verify_msg(message, public_key): raise ValidationError("Invalid Signature")
def make_receipt(cls, base_header: BlockHeaderAPI, transaction: SignedTransactionAPI, computation: ComputationAPI, state: StateAPI) -> ReceiptAPI: gas_used = base_header.gas_used + cls.finalize_gas_used( transaction, computation) if computation.is_error: status_code = EIP658_TRANSACTION_STATUS_CODE_FAILURE else: status_code = EIP658_TRANSACTION_STATUS_CODE_SUCCESS return transaction.make_receipt(status_code, gas_used, computation.get_log_entries())
def validate_transaction(self, transaction: SignedTransactionAPI) -> None: # Validate the transaction transaction.validate() self.vm_state.validate_transaction(transaction)
def get_custom_transaction_context( transaction: SignedTransactionAPI ) -> TransactionContextAPI: # noqa: E501 custom_transaction = transaction.copy(gas_price=gas_price) return original_context(custom_transaction)
def costless_execute_transaction( self, transaction: SignedTransactionAPI) -> ComputationAPI: with self.override_transaction_context( gas_price=transaction.gas_price): free_transaction = transaction.copy(gas_price=0) return self.apply_transaction(free_transaction)