separate global config

This commit is contained in:
Youngjoon Lee 2024-06-27 17:32:22 +09:00
parent 28b5055278
commit 3585d3cf86
No known key found for this signature in database
GPG Key ID: 09B750B5BD6F08A2
5 changed files with 28 additions and 21 deletions

View File

@ -12,15 +12,17 @@ from pysphinx.sphinx import Node as SphinxNode
@dataclass
class MixnetConfig:
node_configs: List[NodeConfig]
class GlobalConfig:
membership: MixMembership
transmission_rate_per_sec: int # Global Transmission Rate
# TODO: use this to make the size of Sphinx packet constant
max_mix_path_length: int
@dataclass
class NodeConfig:
private_key: X25519PrivateKey
transmission_rate_per_sec: int # Global Transmission Rate
mix_path_length: int # TODO: use this when creating Sphinx packets
@dataclass

View File

@ -11,7 +11,7 @@ from pysphinx.sphinx import (
SphinxPacket,
)
from mixnet.config import MixMembership, NodeConfig
from mixnet.config import GlobalConfig, NodeConfig
from mixnet.packet import Fragment, MessageFlag, MessageReconstructor, PacketBuilder
NetworkPacket: TypeAlias = "SphinxPacket | bytes"
@ -22,14 +22,14 @@ BroadcastChannel: TypeAlias = "asyncio.Queue[bytes]"
class Node:
config: NodeConfig
membership: MixMembership
global_config: GlobalConfig
mixgossip_channel: MixGossipChannel
reconstructor: MessageReconstructor
broadcast_channel: BroadcastChannel
def __init__(self, config: NodeConfig, membership: MixMembership):
def __init__(self, config: NodeConfig, global_config: GlobalConfig):
self.config = config
self.membership = membership
self.global_config = global_config
self.mixgossip_channel = MixGossipChannel(self.__process_sphinx_packet)
self.reconstructor = MessageReconstructor()
self.broadcast_channel = asyncio.Queue()
@ -61,11 +61,13 @@ class Node:
conn = asyncio.Queue()
peer.mixgossip_channel.add_inbound(conn)
self.mixgossip_channel.add_outbound(
MixOutboundConnection(conn, self.config.transmission_rate_per_sec)
MixOutboundConnection(conn, self.global_config.transmission_rate_per_sec)
)
async def send_message(self, msg: bytes):
for packet, _ in PacketBuilder.build_real_packets(msg, self.membership):
for packet, _ in PacketBuilder.build_real_packets(
msg, self.global_config.membership
):
await self.mixgossip_channel.gossip(packet)

View File

@ -9,10 +9,8 @@ from mixnet.test_utils import (
class TestNode(IsolatedAsyncioTestCase):
async def test_node(self):
config = init_mixnet_config(10)
nodes = [
Node(node_config, config.membership) for node_config in config.node_configs
]
global_config, node_configs = init_mixnet_config(10)
nodes = [Node(node_config, global_config) for node_config in node_configs]
for i, node in enumerate(nodes):
node.connect(nodes[(i + 1) % len(nodes)])

View File

@ -16,7 +16,7 @@ from mixnet.test_utils import init_mixnet_config
class TestPacket(TestCase):
def test_real_packet(self):
membership = init_mixnet_config(10).membership
membership = init_mixnet_config(10)[0].membership
msg = self.random_bytes(3500)
packets_and_routes = PacketBuilder.build_real_packets(msg, membership)
self.assertEqual(4, len(packets_and_routes))
@ -47,7 +47,7 @@ class TestPacket(TestCase):
)
def test_cover_packet(self):
membership = init_mixnet_config(10).membership
membership = init_mixnet_config(10)[0].membership
msg = b"cover"
packets_and_routes = PacketBuilder.build_drop_cover_packets(msg, membership)
self.assertEqual(1, len(packets_and_routes))

View File

@ -1,20 +1,25 @@
from cryptography.hazmat.primitives.asymmetric.x25519 import X25519PrivateKey
from mixnet.config import (
GlobalConfig,
MixMembership,
MixnetConfig,
NodeConfig,
NodeInfo,
)
def init_mixnet_config(num_nodes: int) -> MixnetConfig:
def init_mixnet_config(num_nodes: int) -> tuple[GlobalConfig, list[NodeConfig]]:
transmission_rate_per_sec = 3
max_mix_path_length = 3
node_configs = [
NodeConfig(X25519PrivateKey.generate(), transmission_rate_per_sec)
NodeConfig(X25519PrivateKey.generate(), max_mix_path_length)
for _ in range(num_nodes)
]
membership = MixMembership(
[NodeInfo(node_config.private_key) for node_config in node_configs]
global_config = GlobalConfig(
MixMembership(
[NodeInfo(node_config.private_key) for node_config in node_configs]
),
transmission_rate_per_sec,
max_mix_path_length,
)
return MixnetConfig(node_configs, membership)
return (global_config, node_configs)