Пример #1
0
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)
Пример #2
0
def is_database_initialized(chaindb: AsyncChainDB) -> bool:
    try:
        chaindb.get_canonical_head()
    except CanonicalHeadNotFound:
        # empty chain database
        return False
    else:
        return True
Пример #3
0
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
Пример #4
0
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
Пример #5
0
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
Пример #6
0
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()
Пример #7
0
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")
Пример #8
0
def get_fresh_mainnet_chaindb():
    chaindb = AsyncChainDB(MemoryDB())
    chaindb.persist_header_to_db(MAINNET_GENESIS_HEADER)
    return chaindb