def import_block(self, block: BaseBlock, perform_validation: bool = True) -> BaseBlock: """ Imports a complete block. """ try: parent_header = self.get_block_header_by_hash( block.header.parent_hash) except HeaderNotFound: raise ValidationError( "Attempt to import block #{}. Cannot import block {} before importing " "its parent block at {}".format( block.number, block.hash, block.header.parent_hash, )) base_header_for_import = self.create_header_from_parent(parent_header) imported_block = self.get_vm(base_header_for_import).import_block( block) # Validate the imported block. if perform_validation: ensure_imported_block_unchanged(imported_block, block) self.validate_block(imported_block) self.chaindb.persist_block(imported_block) self.logger.debug( 'IMPORTED_BLOCK: number %s | hash %s', imported_block.number, encode_hex(imported_block.hash), ) return imported_block
def import_block( self, block: BaseBlock, perform_validation: bool = True ) -> Tuple[BaseBlock, Tuple[BaseBlock, ...], Tuple[BaseBlock, ...]]: """ Imports a complete block and returns a 3-tuple - the imported block - a tuple of blocks which are now part of the canonical chain. - a tuple of blocks which are were canonical and now are no longer canonical. """ try: parent_header = self.get_block_header_by_hash( block.header.parent_hash) except HeaderNotFound: raise ValidationError( "Attempt to import block #{}. Cannot import block {} before importing " "its parent block at {}".format( block.number, block.hash, block.header.parent_hash, )) base_header_for_import = self.create_header_from_parent(parent_header) imported_block = self.get_vm(base_header_for_import).import_block( block) # Validate the imported block. if perform_validation: ensure_imported_block_unchanged(imported_block, block) self.validate_block(imported_block) ( new_canonical_hashes, old_canonical_hashes, ) = self.chaindb.persist_block(imported_block) self.logger.debug( 'IMPORTED_BLOCK: number %s | hash %s', imported_block.number, encode_hex(imported_block.hash), ) new_canonical_blocks = tuple( self.get_block_by_hash(header_hash) for header_hash in new_canonical_hashes) old_canonical_blocks = tuple( self.get_block_by_hash(header_hash) for header_hash in old_canonical_hashes) return imported_block, new_canonical_blocks, old_canonical_blocks