def _get_canonical_block_header_by_number( cls, db: BaseDB, block_number: BlockNumber) -> BlockHeader: validate_block_number(block_number) canonical_block_hash = cls._get_canonical_block_hash(db, block_number) return cls._get_block_header_by_hash(db, canonical_block_hash)
def get_vm_class_for_block_number(cls, block_number: BlockNumber) -> Type[VirtualMachineAPI]: if cls.vm_configuration is None: raise AttributeError("Chain classes must define the VMs in vm_configuration") validate_block_number(block_number) for start_block, vm_class in reversed(cls.vm_configuration): if block_number >= start_block: return vm_class else: raise VMNotFound(f"No vm available for block #{block_number}")
def get_canonical_block_header_by_number( self, block_number: BlockNumber) -> BlockHeader: """ Returns the block header with the given number in the canonical chain. Raises BlockNotFound if there's no block header with the given number in the canonical chain. """ validate_block_number(block_number, title="Block Number") return self.get_block_header_by_hash( self.get_canonical_block_hash(block_number))
def _get_canonical_block_hash(db: BaseDB, block_number: BlockNumber) -> Hash32: validate_block_number(block_number) number_to_hash_key = SchemaV1.make_block_number_to_hash_lookup_key(block_number) try: encoded_key = db[number_to_hash_key] except KeyError: raise HeaderNotFound( "No canonical header for block number #{0}".format(block_number) ) else: return rlp.decode(encoded_key, sedes=rlp.sedes.binary)
def get_vm_class_for_block_number(cls, block_number: BlockNumber) -> Type['BaseVM']: """ Returns the VM class for the given block number. """ if cls.vm_configuration is None: raise AttributeError("Chain classes must define the VMs in vm_configuration") validate_block_number(block_number) for start_block, vm_class in reversed(cls.vm_configuration): if block_number >= start_block: return vm_class else: raise VMNotFound("No vm available for block #{0}".format(block_number))
def get_canonical_block_hash(self, block_number: BlockNumber) -> Hash32: """ Returns the block hash for the canonical block at the given number. Raises BlockNotFound if there's no block header with the given number in the canonical chain. """ validate_block_number(block_number, title="Block Number") number_to_hash_key = SchemaV1.make_block_number_to_hash_lookup_key( block_number) try: encoded_key = self.db[number_to_hash_key] except KeyError: raise HeaderNotFound( "No canonical header for block number #{0}".format( block_number)) else: return rlp.decode(encoded_key, sedes=rlp.sedes.binary)
def test_validate_block_number(block_number, is_valid): if is_valid: validate_block_number(block_number) else: with pytest.raises(ValidationError): validate_block_number(block_number)