finished closeness measurement
This commit is contained in:
		
							parent
							
								
									c4be08bd23
								
							
						
					
					
						commit
						da11c74f6c
					
				
					 6 changed files with 92 additions and 11 deletions
				
			
		
							
								
								
									
										9
									
								
								scripts/generate-onions.py
									
										
									
									
									
										
										
										Normal file → Executable file
									
								
							
							
						
						
									
										9
									
								
								scripts/generate-onions.py
									
										
									
									
									
										
										
										Normal file → Executable file
									
								
							|  | @ -9,6 +9,11 @@ if not os.path.exists('onionr.sh'): | ||||||
|     os.chdir('../') |     os.chdir('../') | ||||||
| sys.path.append("src/") | sys.path.append("src/") | ||||||
| 
 | 
 | ||||||
|  | try: | ||||||
|  |     sys.argv[1] | ||||||
|  | except IndexError: | ||||||
|  |     sys.exit(1) | ||||||
|  | 
 | ||||||
| tor_process = process.launch_tor_with_config( | tor_process = process.launch_tor_with_config( | ||||||
|     completion_percent=0, |     completion_percent=0, | ||||||
|   config = { |   config = { | ||||||
|  | @ -23,13 +28,13 @@ tor_process = process.launch_tor_with_config( | ||||||
| 
 | 
 | ||||||
| with Controller.from_port('127.0.0.1', 2778) as controller: | with Controller.from_port('127.0.0.1', 2778) as controller: | ||||||
|     controller.authenticate() |     controller.authenticate() | ||||||
|     for i in range(1024, 2000): |     for i in range(1024, 1024 + int(sys.argv[1])): | ||||||
|         hs = controller.create_ephemeral_hidden_service( |         hs = controller.create_ephemeral_hidden_service( | ||||||
|             {80: i}, |             {80: i}, | ||||||
|             key_type='NEW', |             key_type='NEW', | ||||||
|             key_content='ED25519-V3', |             key_content='ED25519-V3', | ||||||
|             await_publication=False, |             await_publication=False, | ||||||
|             detached=True) |             detached=True) | ||||||
|         print(hs.service_id) |         print(hs.service_id + ".onion") | ||||||
| 
 | 
 | ||||||
| tor_process.kill() | tor_process.kill() | ||||||
|  | @ -8,6 +8,8 @@ LoopBackIP = NewType('LoopBackIP', str) | ||||||
| 
 | 
 | ||||||
| DeterministicKeyPassphrase = NewType('DeterministicKeyPassphrase', str) | DeterministicKeyPassphrase = NewType('DeterministicKeyPassphrase', str) | ||||||
| 
 | 
 | ||||||
|  | Ed25519PublicKeyBytes = NewType('Ed25519PublicKeyBytes', bytes) | ||||||
|  | 
 | ||||||
| BlockHash = NewType('BlockHash', str) | BlockHash = NewType('BlockHash', str) | ||||||
| 
 | 
 | ||||||
| OnboardingConfig = NewType('OnboardingConfig', str) | OnboardingConfig = NewType('OnboardingConfig', str) | ||||||
|  |  | ||||||
|  | @ -1 +1,2 @@ | ||||||
| from .extracted25519 import extract_ed25519_from_onion_address | from .extracted25519 import extract_ed25519_from_onion_address | ||||||
|  | from .neighbors import identify_neighbors | ||||||
|  | @ -8,7 +8,7 @@ if TYPE_CHECKING: | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
| def extract_ed25519_from_onion_address( | def extract_ed25519_from_onion_address( | ||||||
|         address: OnionAddressString) -> Ed25519PublicKeyBytes: |         address: 'OnionAddressString') -> 'Ed25519PublicKeyBytes': | ||||||
|     address = str_to_bytes(address).replace(b'.onion', b'').upper() |     address = str_to_bytes(address).replace(b'.onion', b'').upper() | ||||||
|     ed25519 = b32decode(address)[:-3] |     ed25519 = b32decode(address)[:-3] | ||||||
|     return ed25519 |     return ed25519 | ||||||
|  | @ -1,5 +1,8 @@ | ||||||
| from onionrtypes import OnionAddressString | from onionrtypes import OnionAddressString | ||||||
| from typing import Iterable | from typing import Iterable | ||||||
|  | 
 | ||||||
|  | from collections import OrderedDict | ||||||
|  | 
 | ||||||
| from .extracted25519 import extract_ed25519_from_onion_address | from .extracted25519 import extract_ed25519_from_onion_address | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
|  | @ -12,11 +15,15 @@ def identify_neighbors( | ||||||
|     address_int = int.from_bytes(address, "big") |     address_int = int.from_bytes(address, "big") | ||||||
| 
 | 
 | ||||||
|     def _calc_closeness(y): |     def _calc_closeness(y): | ||||||
|         return abs(address_int - int.from_bytes(y, "big")) |         return abs(address_int - int.from_bytes(extract_ed25519_from_onion_address(y), "big")) | ||||||
| 
 |  | ||||||
| 
 |  | ||||||
|     peer_ed_keys = list(map(extract_ed25519_from_onion_address, peers)) |  | ||||||
|     differences = list(map(_calc_closeness, peer_ed_keys)) |  | ||||||
| 
 |  | ||||||
|     return sorted(differences)[:closest_n] |  | ||||||
| 
 | 
 | ||||||
|  |     closeness_values = [] | ||||||
|  |     end_result = [] | ||||||
|  |     for peer in peers: | ||||||
|  |         closeness_values.append((peer, _calc_closeness(peer))) | ||||||
|  |     closeness_values.sort() | ||||||
|  |     for i, result in enumerate(closeness_values): | ||||||
|  |         if i > closest_n: | ||||||
|  |             break | ||||||
|  |         end_result.append(result[0]) | ||||||
|  |     return end_result | ||||||
|  |  | ||||||
							
								
								
									
										66
									
								
								tests/test_streamfill_neighbors.py
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										66
									
								
								tests/test_streamfill_neighbors.py
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,66 @@ | ||||||
|  | #!/usr/bin/env python3 | ||||||
|  | import sys, os | ||||||
|  | import subprocess | ||||||
|  | sys.path.append(".") | ||||||
|  | sys.path.append("src/") | ||||||
|  | import uuid | ||||||
|  | import binascii | ||||||
|  | from base64 import b32decode | ||||||
|  | TEST_DIR = 'testdata/%s-%s' % (uuid.uuid4(), os.path.basename(__file__)) + '/' | ||||||
|  | print("Test directory:", TEST_DIR) | ||||||
|  | os.environ["ONIONR_HOME"] = TEST_DIR | ||||||
|  | import unittest | ||||||
|  | 
 | ||||||
|  | from streamfill import identify_neighbors, extract_ed25519_from_onion_address | ||||||
|  | 
 | ||||||
|  | class TestStreamfillNeighbors(unittest.TestCase): | ||||||
|  |     def test_neighbor_closeness_consistent(self): | ||||||
|  |         onions = [] | ||||||
|  |         # p = subprocess.Popen(["scripts/generate-onions.py", '5'], | ||||||
|  |         #                      stdout=subprocess.PIPE, | ||||||
|  |         #                      stderr=subprocess.PIPE) | ||||||
|  |         # for line in iter(p.stdout.readline, b''): | ||||||
|  |         #     line = line.decode() | ||||||
|  |         #     onions.append(line.strip()) | ||||||
|  |         main = '7uifxsgidchopmdwmtip6x4ydra6cpf2ov4ghj2lzx5uydyssduh5qid.onion' | ||||||
|  |         others = ['bxxajpimlonmbxb5jzjre3go3dvfobqyayqwpksd6zpjz4s4mknstwyd.onion', '2zofaifd6s3flwbv5wl4vtgnesbprc4f2ptljl4a47dfkvrbmw3e5iqd.onion', '6umslj7jtzu27n4jgf3byn55ztz5mkoqocx32zwjya6rbnxqjpyysyyd.onion'] | ||||||
|  |         main_num = int.from_bytes(extract_ed25519_from_onion_address(main), 'big') | ||||||
|  | 
 | ||||||
|  |         test_data = identify_neighbors(main, others, 3) | ||||||
|  | 
 | ||||||
|  |         my_result = [] | ||||||
|  |         for i in others: | ||||||
|  |             my_result.append((i, abs(main_num - int.from_bytes(extract_ed25519_from_onion_address(i), 'big')))) | ||||||
|  |         my_result.sort() | ||||||
|  |         final = [] | ||||||
|  |         for i in my_result: | ||||||
|  |             final.append(i[0]) | ||||||
|  |         self.assertTrue(len(test_data) == 3) | ||||||
|  |         self.assertListEqual(test_data, final) | ||||||
|  | 
 | ||||||
|  |     def test_neighbor_closeness_random(self): | ||||||
|  |         onions = [] | ||||||
|  |         p = subprocess.Popen(["scripts/generate-onions.py", '100'], | ||||||
|  |                              stdout=subprocess.PIPE, | ||||||
|  |                              stderr=subprocess.PIPE) | ||||||
|  |         for line in iter(p.stdout.readline, b''): | ||||||
|  |             line = line.decode() | ||||||
|  |             onions.append(line.strip()) | ||||||
|  |         p.terminate() | ||||||
|  |         main = '7uifxsgidchopmdwmtip6x4ydra6cpf2ov4ghj2lzx5uydyssduh5qid.onion' | ||||||
|  |         main_num = int.from_bytes(extract_ed25519_from_onion_address(main), 'big') | ||||||
|  | 
 | ||||||
|  |         test_data = identify_neighbors(main, onions, 100) | ||||||
|  | 
 | ||||||
|  |         my_result = [] | ||||||
|  |         for i in onions: | ||||||
|  |             my_result.append((i, abs(main_num - int.from_bytes(extract_ed25519_from_onion_address(i), 'big')))) | ||||||
|  |         my_result.sort() | ||||||
|  |         final = [] | ||||||
|  |         for i in my_result: | ||||||
|  |             final.append(i[0]) | ||||||
|  |         self.assertTrue(len(test_data) == 100) | ||||||
|  |         self.assertListEqual(test_data, final) | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | unittest.main() | ||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue