示例#1
0
def get_chaindb_manager(chain_config: ChainConfig, base_db: BaseAtomicDB) -> BaseManager:
    chaindb = AsyncChainDB(base_db)
    chain_head_db = AsyncChainHeadDB.load_from_saved_root_hash(base_db)

    if not is_database_initialized(chaindb, chain_config):
        if 'GENERATE_RANDOM_DATABASE' in os.environ:
            #this is for testing, we neeed to build an initial blockchain database
            #create_dev_test_random_blockchain_database(base_db)
            if "INSTANCE_NUMBER" in os.environ:
                create_predefined_blockchain_database(base_db, instance = int(os.environ["INSTANCE_NUMBER"]))
            else:
                create_predefined_blockchain_database(base_db)
        else:
            initialize_database(chain_config = chain_config, chaindb = chaindb)


    consensus_db = AsyncConsensusDB(chaindb)


    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_chain_head_db',
        callable=lambda: TracebackRecorder(chain_head_db),
        proxytype=ChainHeadDBProxy,
    )

    DBManager.register(  # type: ignore
        'get_consensus_db',
        callable=lambda: TracebackRecorder(consensus_db),
        proxytype=ConsensusDBProxy,
    )


    manager = DBManager(address=str(chain_config.database_ipc_path))  # type: ignore
    return manager
示例#2
0
def get_predefined_blockchain_db(instance_number):
    testdb1 = MemoryDB()
    create_predefined_blockchain_database(testdb1, instance=instance_number)
    return testdb1
示例#3
0
async def test_consensus_avg_network_min_gas(request, event_loop):

    num_peers_in_swarm = 6

    base_db = MemoryDB()
    create_predefined_blockchain_database(base_db)

    tx_list = [[
        TESTNET_GENESIS_PRIVATE_KEY, private_keys[1], 1,
        int(time.time())
    ]]
    add_transactions_to_blockchain_db(base_db, tx_list)

    client_db = MemoryDB(kv_store=base_db.kv_store.copy())

    peer_dbs = []
    for i in range(num_peers_in_swarm):
        peer_dbs.append(MemoryDB(kv_store=base_db.kv_store.copy()))

    # Set their minimum gas prices
    bootstrap_chain = TestnetChain(
        base_db, TESTNET_GENESIS_PRIVATE_KEY.public_key.to_canonical_address())
    bootstrap_chain.min_gas_db.initialize_historical_minimum_gas_price_at_genesis(
        min_gas_price=100, net_tpc_cap=1)

    client_chain = TestnetChain(
        client_db,
        TESTNET_GENESIS_PRIVATE_KEY.public_key.to_canonical_address())
    client_chain.min_gas_db.initialize_historical_minimum_gas_price_at_genesis(
        min_gas_price=100, net_tpc_cap=1)

    for peer_db in peer_dbs:
        peer_chain = TestnetChain(
            peer_db,
            TESTNET_GENESIS_PRIVATE_KEY.public_key.to_canonical_address())
        peer_chain.min_gas_db.initialize_historical_minimum_gas_price_at_genesis(
            min_gas_price=random.randint(1, 1000), net_tpc_cap=1)

    bootstrap_historical_min_gas_price = bootstrap_chain.min_gas_db.load_historical_minimum_gas_price(
    )
    bootstrap_historical_network_tpc_capability = bootstrap_chain.min_gas_db.load_historical_network_tpc_capability(
    )

    async def validation(consensus_services: List[Consensus]):
        # avg_min_gas_limits = [await client_consensus.calculate_average_network_min_gas_limit() for client_consensus in consensus_services]
        # print(avg_min_gas_limits)
        # all_equal = all(x == avg_min_gas_limits[0] for x in avg_min_gas_limits)
        # assert(all_equal)

        # We also want to make sure that the nodes correctly initialized to the bootstrap node
        for consensus in consensus_services:
            chain = consensus.node.get_chain()
            node_historical_min_gas_price = chain.min_gas_db.load_historical_minimum_gas_price(
            )
            node_historical_network_tpc_capability = chain.min_gas_db.load_historical_network_tpc_capability(
            )

            assert (bootstrap_historical_min_gas_price[:-1] ==
                    node_historical_min_gas_price[:len(
                        bootstrap_historical_min_gas_price) - 1])
            assert (bootstrap_historical_network_tpc_capability[:-1] ==
                    node_historical_network_tpc_capability[:len(
                        bootstrap_historical_network_tpc_capability) - 1])

    async def wait_for_time(consensus_services):
        while True:
            # They should have the same parameters once they have received stats from all other nodes.
            length_of_stats = [
                len(consensus._network_min_gas_limit_statistics)
                for consensus in consensus_services
            ]
            print('ZZZZZZZZZZZZZZ')
            print(length_of_stats)
            if all([x >= (num_peers_in_swarm + 1) for x in length_of_stats]):
                return
            await asyncio.sleep(1)

    await _test_consensus_swarm(request,
                                event_loop,
                                base_db,
                                client_db,
                                peer_dbs,
                                validation,
                                waiting_function=wait_for_time)