コード例 #1
0
async def rbc(params):

    (sends, recvs, t, n, msg) = params
    rbc_tasks = [None] * n
    dealer_id = randint(0, n - 1)
    tag = f"RBC"

    for i in range(n):
        if i == dealer_id:
            rbc_tasks[i] = asyncio.create_task(
                reliablebroadcast(tag, i, n, t, dealer_id, msg, recvs[i], sends[i])
            )
        else:
            rbc_tasks[i] = asyncio.create_task(
                reliablebroadcast(tag, i, n, t, dealer_id, None, recvs[i], sends[i])
            )
    await asyncio.gather(*rbc_tasks)
    for task in rbc_tasks:
        task.cancel()
コード例 #2
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