def run_diner(is_payer): worker = Diner() worker.start() worker.ready.wait() worker.listen_to_channel('/diners/ready') worker.listen_to_channel('/diners/done') name = str(uuid.uuid4()) data = { 'name': name } data = json.dumps(data) diners_entity = entity('diners') requests.post(diners_entity, data=data) worker.diners_ready.wait() resp = requests.get(diners_entity) diner_data = resp.json others = get_names(name, diner_data) secrets, to_watch = establish_secrets(name, others) worker.get_secrets(to_watch) worker.secrets_ready.wait() secrets = secrets + worker.secrets announce_bit(secrets, is_payer) print 'waiting for bits' worker.bits_ready.wait() print 'got bits' resp = requests.get(entity('announce')) bits = [] for _, data in resp.json.iteritems(): bits.append(data['bit']) result = xor_list(bits) if result: print 'A diner paid' else: print 'The NSA paid' worker.join()
def announce_bit(secrets, is_payer): bit = xor_list(secrets) if is_payer: bit = int(not bit) data = {'bit': bit} requests.post(entity('announce'), data=json.dumps(data))