def apply_fixture_block_to_chain( block_fixture: Dict[str, Any], chain: ChainAPI, perform_validation: bool = True) -> Tuple[BlockAPI, BlockAPI, bytes]: """ :return: (premined_block, mined_block, rlp_encoded_mined_block) """ # The block to import may be in a different block-class-range than the # chain's current one, so we use the block number specified in the # fixture to look up the correct block class. if 'blockHeader' in block_fixture: block_number = block_fixture['blockHeader']['number'] block_class = chain.get_vm_class_for_block_number( block_number).get_block_class() else: block_class = chain.get_vm().get_block_class() block = rlp.decode(block_fixture['rlp'], sedes=block_class) import_result = chain.import_block(block, perform_validation=perform_validation) mined_block = import_result.imported_block rlp_encoded_mined_block = rlp.encode(mined_block, sedes=block_class) return (block, mined_block, rlp_encoded_mined_block)
def genesis(chain_class: ChainAPI, db: AtomicDatabaseAPI = None, params: Dict[str, HeaderParams] = None, state: GeneralState = None) -> ChainAPI: """ Initialize the given chain class with the given genesis header parameters and chain state. """ if state is None: genesis_state: AccountState = {} else: genesis_state = _fill_and_normalize_state(state) genesis_params_defaults = _get_default_genesis_params(genesis_state) if params is None: genesis_params = genesis_params_defaults else: genesis_params = merge(genesis_params_defaults, params) if db is None: base_db: AtomicDatabaseAPI = AtomicDB() else: base_db = db return chain_class.from_genesis(base_db, genesis_params, genesis_state)
def _import_blocks(chain: ChainAPI) -> ChainAPI: for block in blocks: chain.import_block(block) return chain
def import_block(block: BlockAPI, chain: ChainAPI) -> ChainAPI: """ Import the provided ``block`` into the chain. """ chain.import_block(block) return chain