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()
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