Beispiel #1
0
 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
Beispiel #2
0
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)
Beispiel #3
0
    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}")
Beispiel #4
0
    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
Beispiel #5
0
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")
Beispiel #6
0
    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())
Beispiel #7
0
    def validate_transaction(self, transaction: SignedTransactionAPI) -> None:

        # Validate the transaction
        transaction.validate()
        self.vm_state.validate_transaction(transaction)
Beispiel #8
0
 def get_custom_transaction_context(
     transaction: SignedTransactionAPI
 ) -> TransactionContextAPI:  # noqa: E501
     custom_transaction = transaction.copy(gas_price=gas_price)
     return original_context(custom_transaction)
Beispiel #9
0
 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)