finished closeness measurement
parent
c4be08bd23
commit
da11c74f6c
|
@ -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
|
||||||
|
|
|
@ -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…
Reference in New Issue