예제 #1
0
def _get_block_by_hash(chain, block_hash):
    block = chain.get_block_by_hash(block_hash)

    if block.number >= chain.get_block().number:
        raise BlockNotFound("No block fuond for block hash: {0}".format(block_hash))

    block_at_height = chain.get_canonical_block_by_number(block.number)
    if block != block_at_height:
        raise BlockNotFound("No block fuond for block hash: {0}".format(block_hash))

    return block
예제 #2
0
def _get_block_by_hash(evm, block_hash):
    block_by_hash = evm.chain.get_block(block_hash)
    if block_by_hash is None or block_by_hash.number == evm.block.number:
        raise BlockNotFound(
            "Block with hash {0} not found on chain".format(block_hash))

    block_by_number = _get_block_by_number(evm, block_by_hash.number)
    if block_by_hash.hash != block_by_number.hash:
        raise BlockNotFound(
            "Block with hash {0} not found on chain".format(block_hash))
    return block_by_hash
예제 #3
0
    def get_block_by_number(self, block_number, full_transactions=False):
        if full_transactions:
            transaction_serializer = serialize_full_transaction
        else:
            transaction_serializer = serialize_transaction_as_hash

        if block_number == self.block['number']:
            block = self.block
        elif block_number == "latest":
            try:
                block = self.blocks[-1]
            except IndexError:
                block = self.block
        elif block_number == "pending":
            block = self.block
        elif block_number == "earliest":
            try:
                block = self.blocks[0]
            except IndexError:
                block = self.block
        elif is_integer(block_number):
            try:
                block = self.blocks[block_number]
            except IndexError:
                raise BlockNotFound("No block found for #{0}".format(block_number))
        else:
            raise Exception(
                "Invariant.  Unrecognized block number format: {0}".format(block_number)
            )

        return serialize_block(
            block,
            transaction_serializer=transaction_serializer,
            is_pending=(block['number'] == self.block['number']),
        )
예제 #4
0
def _get_block_by_number(evm, block_number="latest"):
    if block_number == "latest":
        if len(evm.blocks) == 0:
            raise BlockNotFound("Chain has no blocks")
        elif len(evm.blocks) == 1:
            return evm.blocks[0]
        else:
            return evm.blocks[-2]
    elif block_number == "earliest":
        return evm.blocks[0]
    elif block_number == "pending":
        return evm.block
    elif block_number == evm.block.number:
        return evm.block
    else:
        if block_number >= len(evm.blocks):
            raise BlockNotFound("Block number is longer than current chain.")
        return evm.blocks[block_number]
예제 #5
0
def _get_block_by_hash(evm, block_hash):
    block_hash = block_hash

    for block in reversed(evm.blocks):
        if block.hash == block_hash:
            return block
    else:
        if block_hash == evm.block.hash:
            return evm.block
        raise BlockNotFound("Could not find block for provided hash")
예제 #6
0
def _get_block_by_number(evm, block_number):
    if is_integer(block_number):
        if block_number > evm.block.number:
            raise BlockNotFound("Block number is longer than current chain.")

        block = evm.chain.get_block_by_number(block_number)
        if block is None:
            raise BlockNotFound(
                "Block not found for block number: {0}".format(block_number))
    elif block_number == "pending":
        block = evm.block  # Get pending block
    elif block_number == "latest":
        block = evm.chain.head  # Get latest block added to chain
    elif block_number == "earliest":
        block = evm.chain.genesis
    else:
        raise BlockNotFound(
            "Block identifier was not in a recognized format: Got "
            "{0}".format(block_number))

    return block
예제 #7
0
def _get_block_by_number(chain, block_number):
    if block_number == "latest":
        head_block = chain.get_block()
        return chain.get_canonical_block_by_number(max(0, head_block.number - 1))
    elif block_number == "earliest":
        return chain.get_canonical_block_by_number(0)
    elif block_number == "pending":
        return chain.get_block()
    elif is_integer(block_number):
        head_block = chain.get_block()
        if block_number == head_block.number:
            return head_block
        elif block_number < head_block.number:
            return chain.get_canonical_block_by_number(block_number)

    # fallback
    raise BlockNotFound("No block found for block number: {0}".format(block_number))
예제 #8
0
    def get_block_by_hash(self, block_hash, full_transactions=False):
        if full_transactions:
            transaction_serializer = serialize_full_transaction
        else:
            transaction_serializer = serialize_transaction_as_hash

        for block in itertools.chain([self.block], reversed(self.blocks)):
            if block['hash'] == block_hash:
                block = block
                break
        else:
            raise BlockNotFound("No block found for hash: {0}".format(block_hash))

        return serialize_block(
            block,
            transaction_serializer=transaction_serializer,
            is_pending=(block['number'] == self.block['number']),
        )
예제 #9
0
    def call(self, transaction, block_number="latest"):
        from ethereum.messages import apply_message

        if isinstance(block_number, bytes):
            state = self.evm.chain.mk_poststate_of_blockhash(block_number)
        elif isinstance(block_number, int) or isinstance(block_number, str):
            block = _get_block_by_number(self.evm, block_number)
            state = self.evm.chain.mk_poststate_of_blockhash(block.hash)
        else:
            raise BlockNotFound("Invalid block identifer.")

        output = apply_message(
            state,
            sender=transaction['from'],
            to=transaction['to'],
            code_address=transaction['to'],
            data=transaction['data'],
            gas=transaction['gas'],
        )
        if output is None:
            raise TransactionFailed
        return output