예제 #1
0
    async def _setup(j):
        def coin_bcast(o):
            bcast(("ACS_COIN", j, o))

        coin, coin_recv_task = await shared_coin(
            sid + "COIN" + str(j), pid, n, f, pk, sk, coin_bcast, coin_recvs[j].get
        )

        def aba_bcast(o):
            bcast(("ACS_ABA", j, o))

        aba_task = asyncio.create_task(
            binaryagreement(
                sid + "ABA" + str(j),
                pid,
                n,
                f,
                coin,
                aba_inputs[j].get,
                aba_outputs[j].put_nowait,
                aba_bcast,
                aba_recvs[j].get,
            )
        )

        def rbc_send(k, o):
            send(k, ("ACS_RBC", j, o))

        # Only leader gets input
        rbc_input = await input_msg() if j == pid else None

        rbc_outputs[j] = asyncio.create_task(
            reliablebroadcast(
                sid + "RBC" + str(j),
                pid,
                n,
                f,
                j,
                rbc_input,
                rbc_recvs[j].get,
                rbc_send,
            )
        )

        return coin_recv_task, aba_task
예제 #2
0
async def test_binaryagreement(seed, test_router):
    n, f = 4, 1
    # Generate keys
    sid = "sidA"
    # Test everything when runs are OK
    # if seed is not None: print 'SEED:', seed
    rnd = random.Random(seed)

    # Instantiate the common coin
    coins_seed = rnd.random()
    coins, recv_tasks = await _make_coins(test_router, sid + "COIN", n, f,
                                          coins_seed)

    # Router
    _, recvs, sends = test_router(n, seed=seed)

    threads = []
    inputs = []
    outputs = []

    for i in range(n):
        inputs.append(Queue())
        outputs.append(Queue())

        t = create_task(
            binaryagreement(
                sid,
                i,
                n,
                f,
                coins[i],
                inputs[i].get,
                outputs[i].put_nowait,
                sends[i],
                recvs[i],
            ))
        threads.append(t)

    for i in range(n):
        inputs[i].put_nowait(random.randint(0, 1))

    outs = await gather(*[outputs[i].get() for i in range(n)])
    assert len(set(outs)) == 1
    await gather(*threads)
    [task.cancel() for task in recv_tasks]
예제 #3
0
async def test_binaryagreement_dummy(test_router):
    n, f, seed = 4, 1, None
    # Generate keys
    sid = "sidA"
    # Test everything when runs are OK
    # if seed is not None: print 'SEED:', seed
    _, recvs, sends = test_router(n, seed=seed)

    threads = []
    inputs = []
    outputs = []
    coin = dummy_coin(sid, n, f)  # One dummy coin function for all nodes

    for i in range(n):
        inputs.append(Queue())
        outputs.append(Queue())

        t = create_task(
            binaryagreement(
                sid,
                i,
                n,
                f,
                coin,
                inputs[i].get,
                outputs[i].put_nowait,
                sends[i],
                recvs[i],
            )
        )
        threads.append(t)

    for i in range(n):
        inputs[i].put_nowait(random.randint(0, 1))

    for i in range(n - f, n):
        inputs[i].put_nowait(0)
    outs = await gather(*[outputs[i].get() for i in range(n)])
    assert len(set(outs)) == 1
    await gather(*threads)
예제 #4
0
async def test_binaryagreement_dummy_with_redundant_messages(
        byznode, msg_type):
    n = 4
    f = 1
    seed = None
    sid = "sidA"
    sends, recvs = byzantine_broadcast_router(n,
                                              seed=seed,
                                              byznode=byznode,
                                              redundant_msg_type=msg_type)
    threads = []
    inputs = []
    outputs = []
    coin = dummy_coin(sid, n, f)  # One dummy coin function for all nodes

    for i in range(n):
        inputs.append(Queue())
        outputs.append(Queue())
        t = create_task(
            binaryagreement(
                sid,
                i,
                n,
                f,
                coin,
                inputs[i].get,
                outputs[i].put_nowait,
                sends[i],
                recvs[i],
            ))
        threads.append(t)

    for i in range(n):
        inputs[i].put_nowait(random.randint(0, 1))

    outs = await gather(*[outputs[i].get() for i in range(n) if i != byznode])
    assert all(v in (0, 1) and v == outs[0] for v in outs)
    await gather(*[threads[i] for i in range(len(threads)) if i != byznode])
    threads[byznode].cancel()