コード例 #1
0
def diff_state(
        expected_state: AccountState,
        state: BaseState) -> AccountDiff:

    for account, account_data in sorted(expected_state.items()):
        expected_balance = account_data['balance']
        expected_nonce = account_data['nonce']
        expected_code = account_data['code']

        actual_nonce = state.get_nonce(account)
        actual_code = state.get_code(account)
        actual_balance = state.get_balance(account)

        if actual_nonce != expected_nonce:
            yield (account, 'nonce', actual_nonce, expected_nonce)
        if actual_code != expected_code:
            yield (account, 'code', actual_code, expected_code)
        if actual_balance != expected_balance:
            yield (account, 'balance', actual_balance, expected_balance)

        for slot, expected_storage_value in sorted(account_data['storage'].items()):
            actual_storage_value = state.get_storage(account, slot)
            if actual_storage_value != expected_storage_value:
                yield (
                    account,
                    f'storage[{slot}]',
                    actual_storage_value,
                    expected_storage_value,
                )
コード例 #2
0
ファイル: helpers.py プロジェクト: cd4761/ecc-trinity
def setup_state(desired_state: AccountState, state: BaseState) -> None:
    for account, account_data in desired_state.items():
        for slot, value in account_data['storage'].items():
            state.set_storage(account, slot, value)

        nonce = account_data['nonce']
        code = account_data['code']
        balance = account_data['balance']

        state.set_nonce(account, nonce)
        state.set_code(account, code)
        state.set_balance(account, balance)
    state.persist()
コード例 #3
0
ファイル: gas.py プロジェクト: csu-xiao-an/trinity
def _get_computation_error(state: BaseState,
                           transaction: SpoofTransaction) -> Optional[VMError]:

    snapshot = state.snapshot()

    try:
        computation = state.execute_transaction(transaction)
        if computation.is_error:
            return computation._error
        else:
            return None

    finally:
        state.revert(snapshot)
コード例 #4
0
ファイル: db.py プロジェクト: cd4761/ecc-trinity
def apply_state_dict(state: BaseState, state_dict: AccountState) -> None:
    for account, account_data in state_dict.items():
        state.set_balance(account, account_data["balance"])
        state.set_nonce(account, account_data["nonce"])
        state.set_code(account, account_data["code"])

        for slot, value in account_data["storage"].items():
            state.set_storage(account, slot, value)
コード例 #5
0
def validate_frontier_transaction(state: BaseState,
                                  transaction: BaseOrSpoofTransaction) -> None:
    gas_cost = transaction.gas * transaction.gas_price
    sender_balance = state.get_balance(transaction.sender)

    if sender_balance < gas_cost:
        raise ValidationError(
            "Sender account balance cannot afford txn gas: `{0}`".format(
                transaction.sender))

    total_cost = transaction.value + gas_cost

    if sender_balance < total_cost:
        raise ValidationError("Sender account balance cannot afford txn")

    if state.get_nonce(transaction.sender) != transaction.nonce:
        raise ValidationError("Invalid transaction nonce")
コード例 #6
0
ファイル: __init__.py プロジェクト: WazzaF/py-evm
    def make_receipt(
            base_header: BlockHeader,
            transaction: BaseTransaction,
            computation: BaseComputation,
            state: BaseState) -> Receipt:

        receipt_without_state_root = make_frontier_receipt(base_header, transaction, computation)

        return receipt_without_state_root.copy(
            state_root=state.make_state_root()
        )