def initialize_database(chain_config: ChainConfig, chaindb: AsyncChainDB, base_db: BaseAtomicDB) -> None: try: chaindb.get_canonical_head() except CanonicalHeadNotFound: chain_config.initialize_chain(base_db)
def is_database_initialized(chaindb: AsyncChainDB) -> bool: try: chaindb.get_canonical_head() except CanonicalHeadNotFound: # empty chain database return False else: return True
def get_chaindb_manager(trinity_config: TrinityConfig, base_db: BaseAtomicDB) -> BaseManager: chain_config = trinity_config.get_chain_config() chaindb = AsyncChainDB(base_db) if not is_database_initialized(chaindb): initialize_database(chain_config, chaindb, base_db) headerdb = AsyncHeaderDB(base_db) class DBManager(BaseManager): pass DBManager.register('get_db', callable=lambda: TracebackRecorder(base_db), proxytype=DBProxy) DBManager.register( 'get_chaindb', callable=lambda: TracebackRecorder(chaindb), proxytype=ChainDBProxy, ) DBManager.register( 'get_headerdb', callable=lambda: TracebackRecorder(headerdb), proxytype=AsyncHeaderDBProxy, ) manager = DBManager(address=str( trinity_config.database_ipc_path)) # type: ignore return manager
def get_chaindb_manager(trinity_config: TrinityConfig, base_db: BaseAtomicDB) -> BaseManager: chaindb = AsyncChainDB(base_db) if not is_database_initialized(chaindb): initialize_database(trinity_config, chaindb) chain_class: Type[BaseChain] chain: BaseChain if trinity_config.network_id == MAINNET_NETWORK_ID: chain_class = MainnetChain chain = chain_class(base_db) elif trinity_config.network_id == ROPSTEN_NETWORK_ID: chain_class = RopstenChain chain = chain_class(base_db) else: raise NotImplementedError( "Only the ropsten and mainnet chains are supported") headerdb = AsyncHeaderDB(base_db) header_chain = AsyncHeaderChain(base_db) class DBManager(BaseManager): pass # Typeshed definitions for multiprocessing.managers is incomplete, so ignore them for now: # https://github.com/python/typeshed/blob/85a788dbcaa5e9e9a62e55f15d44530cd28ba830/stdlib/3/multiprocessing/managers.pyi#L3 DBManager.register( # type: ignore 'get_db', callable=lambda: TracebackRecorder(base_db), proxytype=DBProxy) DBManager.register( # type: ignore 'get_chaindb', callable=lambda: TracebackRecorder(chaindb), proxytype=ChainDBProxy, ) DBManager.register( # type: ignore 'get_chain', callable=lambda: TracebackRecorder(chain), proxytype=ChainProxy) DBManager.register( # type: ignore 'get_headerdb', callable=lambda: TracebackRecorder(headerdb), proxytype=AsyncHeaderDBProxy, ) DBManager.register( # type: ignore 'get_header_chain', callable=lambda: TracebackRecorder(header_chain), proxytype=AsyncHeaderChainProxy, ) manager = DBManager(address=str( trinity_config.database_ipc_path)) # type: ignore return manager
def get_chaindb_manager(trinity_config: TrinityConfig, base_db: BaseAtomicDB) -> BaseManager: chaindb = AsyncChainDB(base_db) if not is_database_initialized(chaindb): initialize_database(trinity_config, chaindb) chain_class: Type[BaseChain] chain: BaseChain if trinity_config.network_id == MAINNET_NETWORK_ID: chain_class = MainnetChain chain = chain_class(base_db) elif trinity_config.network_id == ROPSTEN_NETWORK_ID: chain_class = RopstenChain chain = chain_class(base_db) else: raise NotImplementedError( "Only the ropsten and mainnet chains are supported") headerdb = AsyncHeaderDB(base_db) header_chain = AsyncHeaderChain(base_db) class DBManager(BaseManager): pass DBManager.register('get_db', callable=lambda: TracebackRecorder(base_db), proxytype=DBProxy) DBManager.register( 'get_chaindb', callable=lambda: TracebackRecorder(chaindb), proxytype=ChainDBProxy, ) DBManager.register('get_chain', callable=lambda: TracebackRecorder(chain), proxytype=ChainProxy) DBManager.register( 'get_headerdb', callable=lambda: TracebackRecorder(headerdb), proxytype=AsyncHeaderDBProxy, ) DBManager.register( 'get_header_chain', callable=lambda: TracebackRecorder(header_chain), proxytype=AsyncHeaderChainProxy, ) manager = DBManager(address=str( trinity_config.database_ipc_path)) # type: ignore return manager
def serve_chaindb(chain_config: ChainConfig, base_db: BaseDB) -> None: chaindb = AsyncChainDB(base_db) chain_class: Type[BaseChain] if not is_database_initialized(chaindb): initialize_database(chain_config, chaindb) if chain_config.network_id == MAINNET_NETWORK_ID: chain_class = MainnetChain elif chain_config.network_id == ROPSTEN_NETWORK_ID: chain_class = RopstenChain else: raise NotImplementedError( "Only the mainnet and ropsten chains are currently supported") chain = chain_class(base_db) headerdb = AsyncHeaderDB(base_db) header_chain = AsyncHeaderChain(base_db) class DBManager(BaseManager): pass # Typeshed definitions for multiprocessing.managers is incomplete, so ignore them for now: # https://github.com/python/typeshed/blob/85a788dbcaa5e9e9a62e55f15d44530cd28ba830/stdlib/3/multiprocessing/managers.pyi#L3 DBManager.register('get_db', callable=lambda: base_db, proxytype=DBProxy) # type: ignore DBManager.register( # type: ignore 'get_chaindb', callable=lambda: chaindb, proxytype=ChainDBProxy, ) DBManager.register('get_chain', callable=lambda: chain, proxytype=ChainProxy) # type: ignore DBManager.register( # type: ignore 'get_headerdb', callable=lambda: headerdb, proxytype=AsyncHeaderDBProxy, ) DBManager.register( # type: ignore 'get_header_chain', callable=lambda: header_chain, proxytype=AsyncHeaderChainProxy, ) manager = DBManager(address=str( chain_config.database_ipc_path)) # type: ignore server = manager.get_server() # type: ignore server.serve_forever()
def initialize_database(chain_config: ChainConfig, chaindb: AsyncChainDB) -> None: try: chaindb.get_canonical_head() except CanonicalHeadNotFound: if chain_config.network_id == ROPSTEN_NETWORK_ID: # We're starting with a fresh DB. chaindb.persist_header(ROPSTEN_GENESIS_HEADER) elif chain_config.network_id == MAINNET_NETWORK_ID: chaindb.persist_header(MAINNET_GENESIS_HEADER) else: # TODO: add genesis data to ChainConfig and if it's present, use it # here to initialize the chain. raise NotImplementedError( "Only the mainnet and ropsten chains are currently supported")
def get_fresh_mainnet_chaindb(): chaindb = AsyncChainDB(MemoryDB()) chaindb.persist_header_to_db(MAINNET_GENESIS_HEADER) return chaindb