def get_tx_batch(): w = Wallet() tx = TransactionBuilder( sender='stu', contract='testing', function='set', kwargs={'var': 'howdy'}, stamps=100_000, processor=b'\x00' * 32, nonce=0 ) tx.sign(w.signing_key()) tx.serialize() currency_contract = 'currency' balances_hash = 'balances' balances_key = '{}{}{}{}{}'.format(currency_contract, config.INDEX_SEPARATOR, balances_hash, config.DELIMITER, w.verifying_key().hex()) driver = BlockchainDriver() driver.set(balances_key, 1_000_000) driver.commit() w = Wallet() tx2 = TransactionBuilder( sender='stu', contract='testing', function='get', kwargs={}, stamps=100_000, processor=b'\x00' * 32, nonce=0 ) tx2.sign(Wallet().signing_key()) tx2.serialize() currency_contract = 'currency' balances_hash = 'balances' balances_key = '{}{}{}{}{}'.format(currency_contract, config.INDEX_SEPARATOR, balances_hash, config.DELIMITER, w.verifying_key().hex()) driver = BlockchainDriver() driver.set(balances_key, 1_000_000) driver.commit() return transaction_list_to_transaction_batch([tx.struct, tx2.struct], wallet=Wallet())
def test_send_to_delegates_doesnt_hang_if_one_is_not_online(self): bootnodes = ['ipc:///tmp/n2', 'ipc:///tmp/n3'] mnw1 = Wallet() mnw2 = Wallet() dw1 = Wallet() dw2 = Wallet() dw3 = Wallet() dw4 = Wallet() constitution = { "masternodes": { "vk_list": [ mnw1.verifying_key().hex(), mnw2.verifying_key().hex() ], "min_quorum": 1 }, "delegates": { "vk_list": [ dw1.verifying_key().hex(), dw2.verifying_key().hex(), dw3.verifying_key().hex(), dw4.verifying_key().hex() ], "min_quorum": 1 }, "witnesses": {}, "schedulers": {}, "notifiers": {}, "enable_stamps": False, "enable_nonces": False } n1 = '/tmp/n1' make_ipc(n1) mn1 = Masternode(wallet=mnw1, ctx=self.ctx, socket_base=f'ipc://{n1}', bootnodes=bootnodes, constitution=constitution, webserver_port=8080, overwrite=True) masternodes = [mnw1.verifying_key().hex(), mnw2.verifying_key().hex()] delegates = [dw1.verifying_key().hex(), dw2.verifying_key().hex(), dw3.verifying_key().hex(), dw4.verifying_key().hex()] contacts = MockContacts( masters=masternodes, delegates=delegates ) d1 = '/tmp/d1' make_ipc(d1) wi1 = WorkInbox(socket_id=_socket(f'ipc://{d1}/incoming_work'), ctx=self.ctx, contacts=contacts, verify=False) d2 = '/tmp/d2' make_ipc(d2) wi2 = WorkInbox(socket_id=_socket(f'ipc://{d2}/incoming_work'), ctx=self.ctx, contacts=contacts, verify=False) d3 = '/tmp/d3' make_ipc(d3) #wi3 = WorkInbox(socket_id=_socket(f'ipc://{d3}/incoming_work'), ctx=self.ctx, contacts=contacts, verify=False) d4 = '/tmp/d4' make_ipc(d4) wi4 = WorkInbox(socket_id=_socket(f'ipc://{d4}/incoming_work'), ctx=self.ctx, contacts=contacts, verify=False) w = Wallet() batch = TransactionBuilder( sender=w.verifying_key(), contract='test', function='testing', kwargs={}, stamps=1_000_000, processor=mnw1.verifying_key(), nonce=0 ) batch.sign(w.signing_key()) b = batch.serialize() tx = transaction_capnp.Transaction.from_bytes_packed(b) currency_contract = 'currency' balances_hash = 'balances' balances_key = '{}{}{}{}{}'.format(currency_contract, config.INDEX_SEPARATOR, balances_hash, config.DELIMITER, w.verifying_key().hex()) driver = BlockchainDriver() driver.set(balances_key, 1_000_000) driver.commit() mn1.tx_batcher.queue.append(tx) mn1.network.peer_service.table.peers = { dw1.verifying_key().hex(): f'ipc://{d1}', dw2.verifying_key().hex(): f'ipc://{d2}', dw3.verifying_key().hex(): f'ipc://{d3}', dw4.verifying_key().hex(): f'ipc://{d4}' } async def late_send(): await asyncio.sleep(0.3) await mn1.parameters.refresh() return await mn1.send_batch_to_delegates() async def stop(): await asyncio.sleep(0.5) wi1.stop() wi2.stop() wi4.stop() mn1.network.stop() tasks = asyncio.gather( mn1.network.start(False), wi1.serve(), wi2.serve(), wi4.serve(), late_send(), stop() ) _, _, _, _, r, _ = self.loop.run_until_complete(tasks) # Make sure the right socket failed for rr in r: if not rr[0]: self.assertEqual(rr[1], f'ipc://{d3}/incoming_work') self.assertTrue(wi1.work[mnw1.verifying_key().hex()]) self.assertTrue(wi2.work[mnw1.verifying_key().hex()]) self.assertTrue(wi4.work[mnw1.verifying_key().hex()])