def setup_apps(amount, tokens, num_transfers, num_nodes, channels_per_node): assert len(tokens) <= num_nodes deposit = amount * num_transfers private_keys = [ sha3('mediated_transfer:{}'.format(position)) for position in range(num_nodes) ] blockchain_services = list() tester = tester_state( private_keys[0], private_keys, tester_blockgas_limit(), ) nettingchannel_library_address = tester_nettingchannel_library_address( tester_state, ) channelmanager_library_address = tester_channelmanager_library_address( tester_state, nettingchannel_library_address, ) registry_address = tester_registry_address( tester_state, channelmanager_library_address, ) for privkey in private_keys: blockchain = BlockChainServiceTesterMock( privkey, tester, registry_address, ) blockchain_services.append(blockchain) registry = blockchain_services[0].registry(registry_address) for token in tokens: registry.add_token(token) verbosity = 3 apps = create_network( blockchain_services, tokens, channels_per_node, deposit, DEFAULT_SETTLE_TIMEOUT, UDPTransport, verbosity, ) return apps
def profile_transfer(num_nodes=10, channels_per_node=2): num_tokens = 1 deposit = 10000 tokens = [ sha3('token:{}'.format(number))[:20] for number in range(num_tokens) ] private_keys = [ sha3('speed:{}'.format(position)) for position in range(num_nodes) ] blockchain_services = list() tester = tester_state( private_keys[0], private_keys, tester_blockgas_limit(), ) nettingchannel_library_address = tester_nettingchannel_library_address( tester_state, ) channelmanager_library_address = tester_channelmanager_library_address( tester_state, nettingchannel_library_address, ) registry_address = tester_registry_address( tester_state, channelmanager_library_address, ) for privkey in private_keys: blockchain = BlockChainServiceTesterMock( privkey, tester, registry_address, ) blockchain_services.append(blockchain) registry = blockchain_services[0].registry(registry_address) for token in tokens: registry.add_token(token) discovery_mock = Discovery() endpoint_discovery_services = [discovery_mock for _ in private_keys] verbosity = 3 apps = create_apps( blockchain_services, endpoint_discovery_services, tokens, channels_per_node, deposit, DEFAULT_SETTLE_TIMEOUT, UDPTransport, verbosity, ) main_app = apps[0] # channels main_graph = main_app.raiden.token_to_channelgraph[tokens[0]] # search for a path of length=2 A > B > C num_hops = 2 source = main_app.raiden.address paths = main_graph.get_paths_of_length(source, num_hops) # sanity check assert paths path = paths[0] target = path[-1] # addresses token_address = main_graph.token_address amount = 10 # measure the hot path with profiling.profile(): result = main_app.raiden.mediated_transfer_async( token_address, amount, target, 1, ) result.wait() profiling.print_all_threads()
def transfer_speed(num_transfers=100, max_locked=100): # pylint: disable=too-many-locals channels_per_node = 1 num_nodes = 2 num_tokens = 1 private_keys = [ sha3('speed:{}'.format(position)) for position in range(num_nodes) ] tokens = [ sha3('token:{}'.format(number))[:20] for number in range(num_tokens) ] amounts = [a % 100 + 1 for a in range(1, num_transfers + 1)] deposit = sum(amounts) secrets = [str(i) for i in range(num_transfers)] blockchain_services = list() tester = tester_state( private_keys[0], private_keys, tester_blockgas_limit(), ) nettingchannel_library_address = tester_nettingchannel_library_address( tester_state, ) channelmanager_library_address = tester_channelmanager_library_address( tester_state, nettingchannel_library_address, ) registry_address = tester_registry_address( tester_state, channelmanager_library_address, ) for privkey in private_keys: blockchain = BlockChainServiceTesterMock( privkey, tester, registry_address, ) blockchain_services.append(blockchain) registry = blockchain_services[0].registry(registry_address) for token in tokens: registry.add_token(token) apps = create_network( private_keys, tokens, registry_address, channels_per_node, deposit, DEFAULT_SETTLE_TIMEOUT, DEFAULT_POLL_TIMEOUT, UDPTransport, BlockChainServiceTesterMock, ) app0, app1 = apps # pylint: disable=unbalanced-tuple-unpacking channel0 = app0.raiden.channelgraphs[tokens[0]].address_channel.values()[0] channel1 = app1.raiden.channelgraphs[tokens[0]].address_channel.values()[0] expiration = app0.raiden.chain.block_number() + DEFAULT_REVEAL_TIMEOUT + 3 start = time.time() for i, amount in enumerate(amounts): hashlock = sha3(secrets[i]) locked_transfer = channel0.create_lockedtransfer( app0.raiden.get_block_number(), amount=amount, identifier=1, # TODO: fill in identifier expiration=expiration, hashlock=hashlock, ) app0.raiden.sign(locked_transfer) channel0.register_transfer(locked_transfer) channel1.register_transfer(locked_transfer) if i > max_locked: idx = i - max_locked secret = secrets[idx] channel0.register_secret(secret) channel1.register_secret(secret) elapsed = time.time() - start print('%d transfers per second' % (num_transfers / elapsed))
def profile_transfer(num_nodes=10, channels_per_node=2): num_tokens = 1 deposit = 10000 tokens = [ sha3('token:{}'.format(number).encode())[:20] for number in range(num_tokens) ] private_keys = [ sha3('speed:{}'.format(position).encode()) for position in range(num_nodes) ] blockchain_services = list() tester = tester_chain( private_keys[0], private_keys, tester_blockgas_limit(), ) nettingchannel_library_address = tester_nettingchannel_library_address( tester_chain, ) channelmanager_library_address = tester_channelmanager_library_address( tester_chain, nettingchannel_library_address, ) registry_address = tester_registry_address( tester_chain, channelmanager_library_address, ) for privkey in private_keys: blockchain = BlockChainServiceTesterMock( privkey, tester, ) blockchain_services.append(blockchain) registry = blockchain_services[0].registry(registry_address) for token in tokens: registry.add_token(token) discovery_mock = Discovery() endpoint_discovery_services = [discovery_mock for _ in private_keys] apps = create_apps( blockchain_services, endpoint_discovery_services, registry_address, tokens, channels_per_node, deposit, DEFAULT_SETTLE_TIMEOUT, UDPTransport, ) main_app = apps[0] # channels main_graph = main_app.raiden.token_to_channelgraph[tokens[0]] # search for a path of length=2 A > B > C num_hops = 2 source = main_app.raiden.address paths = main_graph.get_paths_of_length(source, num_hops) # sanity check assert paths path = paths[0] target = path[-1] # addresses token_address = main_graph.token_address amount = 10 # measure the hot path with profiling.profile(): result = main_app.raiden.mediated_transfer_async( token_address, amount, target, 1, ) result.wait() profiling.print_all_threads()
def transfer_speed(num_transfers=100, max_locked=100): # pylint: disable=too-many-locals channels_per_node = 1 num_nodes = 2 num_tokens = 1 private_keys = [ sha3('speed:{}'.format(position).encode()) for position in range(num_nodes) ] tokens = [ sha3('token:{}'.format(number).encode())[:20] for number in range(num_tokens) ] amounts = [ a % 100 + 1 for a in range(1, num_transfers + 1) ] deposit = sum(amounts) secrets = [ str(i) for i in range(num_transfers) ] blockchain_services = list() tester = tester_chain( private_keys[0], private_keys, tester_blockgas_limit(), ) nettingchannel_library_address = tester_nettingchannel_library_address( tester_chain, ) channelmanager_library_address = tester_channelmanager_library_address( tester_chain, nettingchannel_library_address, ) registry_address = tester_registry_address( tester_chain, channelmanager_library_address, ) for privkey in private_keys: blockchain = BlockChainServiceTesterMock( privkey, tester, ) blockchain_services.append(blockchain) registry = blockchain_services[0].registry(registry_address) for token in tokens: registry.add_token(token) apps = create_network( private_keys, tokens, registry_address, channels_per_node, deposit, DEFAULT_SETTLE_TIMEOUT, DEFAULT_POLL_TIMEOUT, UDPTransport, BlockChainServiceTesterMock, ) app0, app1 = apps # pylint: disable=unbalanced-tuple-unpacking channel0 = list(app0.raiden.token_to_channelgraph[tokens[0]].address_to_channel.values())[0] channel1 = list(app1.raiden.token_to_channelgraph[tokens[0]].address_to_channel.values())[0] expiration = app0.raiden.chain.block_number() + DEFAULT_REVEAL_TIMEOUT + 3 start = time.time() for i, amount in enumerate(amounts): hashlock = sha3(secrets[i].encode()) locked_transfer = channel0.create_lockedtransfer( amount=amount, identifier=1, # TODO: fill in identifier expiration=expiration, hashlock=hashlock, ) app0.raiden.sign(locked_transfer) channel0.register_transfer( app0.raiden.get_block_number(), locked_transfer, ) channel1.register_transfer( app0.raiden.get_block_number(), locked_transfer, ) if i > max_locked: idx = i - max_locked secret = secrets[idx] channel0.register_secret(secret) channel1.register_secret(secret) elapsed = time.time() - start print('{} transfers per second'.format(num_transfers / elapsed))