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
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
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']), )
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]
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")
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
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))
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']), )
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