Skip to content

Commit c85752d

Browse files
committed
refactor(p2p): simplify factory
1 parent 6a4c562 commit c85752d

21 files changed

+101
-117
lines changed

hathor/builder/builder.py

+1-14
Original file line numberDiff line numberDiff line change
@@ -143,7 +143,6 @@ def __init__(self) -> None:
143143
self._capabilities: Optional[list[str]] = None
144144

145145
self._peer: Optional[PrivatePeer] = None
146-
self._network: Optional[str] = None
147146
self._cmdline: str = ''
148147

149148
self._storage_type: StorageType = StorageType.MEMORY
@@ -207,9 +206,6 @@ def build(self) -> BuildArtifacts:
207206
if self.artifacts is not None:
208207
raise ValueError('cannot call build twice')
209208

210-
if self._network is None:
211-
raise TypeError('you must set a network')
212-
213209
if SyncSupportLevel.ENABLED not in {self._sync_v1_support, self._sync_v2_support}:
214210
raise TypeError('you must enable at least one sync version')
215211

@@ -257,7 +253,6 @@ def build(self) -> BuildArtifacts:
257253
manager = HathorManager(
258254
reactor,
259255
settings=settings,
260-
network=self._network,
261256
pubsub=pubsub,
262257
consensus_algorithm=consensus_algorithm,
263258
daa=daa,
@@ -423,12 +418,9 @@ def _get_or_create_p2p_manager(self) -> ConnectionsManager:
423418
reactor = self._get_reactor()
424419
my_peer = self._get_peer()
425420

426-
assert self._network is not None
427-
428421
self._p2p_manager = ConnectionsManager(
429422
settings=self._get_or_create_settings(),
430423
reactor=reactor,
431-
network=self._network,
432424
my_peer=my_peer,
433425
pubsub=self._get_or_create_pubsub(),
434426
ssl=enable_ssl,
@@ -522,7 +514,7 @@ def _get_or_create_event_manager(self) -> EventManager:
522514
storage = self._get_or_create_event_storage()
523515
factory = EventWebsocketFactory(
524516
peer_id=str(peer.id),
525-
network=settings.NETWORK_NAME,
517+
settings=settings,
526518
reactor=reactor,
527519
event_storage=storage,
528520
)
@@ -776,11 +768,6 @@ def set_pubsub(self, pubsub: PubSubManager) -> 'Builder':
776768
self._pubsub = pubsub
777769
return self
778770

779-
def set_network(self, network: str) -> 'Builder':
780-
self.check_if_can_modify()
781-
self._network = network
782-
return self
783-
784771
def set_sync_v1_support(self, support_level: SyncSupportLevel) -> 'Builder':
785772
self.check_if_can_modify()
786773
self._sync_v1_support = support_level

hathor/builder/cli_builder.py

+1-4
Original file line numberDiff line numberDiff line change
@@ -197,7 +197,6 @@ def create_manager(self, reactor: Reactor) -> HathorManager:
197197
self.log.info('with wallet', wallet=self.wallet, path=self._args.data)
198198

199199
hostname = self.get_hostname()
200-
network = settings.NETWORK_NAME
201200

202201
sync_choice: SyncChoice
203202
if self._args.sync_bridge:
@@ -245,7 +244,7 @@ def create_manager(self, reactor: Reactor) -> HathorManager:
245244
if self._args.x_enable_event_queue:
246245
self.event_ws_factory = EventWebsocketFactory(
247246
peer_id=str(peer.id),
248-
network=network,
247+
settings=settings,
249248
reactor=reactor,
250249
event_storage=event_storage
251250
)
@@ -322,7 +321,6 @@ def create_manager(self, reactor: Reactor) -> HathorManager:
322321
p2p_manager = ConnectionsManager(
323322
settings=settings,
324323
reactor=reactor,
325-
network=network,
326324
my_peer=peer,
327325
pubsub=pubsub,
328326
ssl=True,
@@ -367,7 +365,6 @@ def create_manager(self, reactor: Reactor) -> HathorManager:
367365
self.manager = HathorManager(
368366
reactor,
369367
settings=settings,
370-
network=network,
371368
hostname=hostname,
372369
pubsub=pubsub,
373370
consensus_algorithm=consensus_algorithm,

hathor/cli/events_simulator/events_simulator.py

+2-1
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,7 @@ def execute(args: Namespace, reactor: 'ReactorProtocol') -> None:
4848
os.environ['HATHOR_CONFIG_YAML'] = UNITTESTS_SETTINGS_FILEPATH
4949
from hathor.cli.events_simulator.event_forwarding_websocket_factory import EventForwardingWebsocketFactory
5050
from hathor.cli.events_simulator.scenario import Scenario
51+
from hathor.conf.get_settings import get_global_settings
5152
from hathor.simulator import Simulator
5253

5354
try:
@@ -70,7 +71,7 @@ def execute(args: Namespace, reactor: 'ReactorProtocol') -> None:
7071
forwarding_ws_factory = EventForwardingWebsocketFactory(
7172
simulator=simulator,
7273
peer_id='simulator_peer_id',
73-
network='simulator_network',
74+
settings=get_global_settings(),
7475
reactor=reactor,
7576
event_storage=event_ws_factory._event_storage
7677
)

hathor/event/websocket/factory.py

+3-2
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717
from autobahn.twisted.websocket import WebSocketServerFactory
1818
from structlog import get_logger
1919

20+
from hathor.conf.settings import HathorSettings
2021
from hathor.event.model.base_event import BaseEvent
2122
from hathor.event.storage import EventStorage
2223
from hathor.event.websocket.protocol import EventWebsocketProtocol
@@ -45,14 +46,14 @@ def __init__(
4546
self,
4647
*,
4748
peer_id: str,
48-
network: str,
49+
settings: HathorSettings,
4950
reactor: Reactor,
5051
event_storage: EventStorage
5152
) -> None:
5253
super().__init__()
5354
self.log = logger.new()
5455
self._peer_id = peer_id
55-
self._network = network
56+
self._network = settings.NETWORK_NAME
5657
self._reactor = reactor
5758
self._event_storage = event_storage
5859
self._connections: set[EventWebsocketProtocol] = set()

hathor/manager.py

+1-4
Original file line numberDiff line numberDiff line change
@@ -107,7 +107,6 @@ def __init__(
107107
bit_signaling_service: BitSignalingService,
108108
verification_service: VerificationService,
109109
cpu_mining_service: CpuMiningService,
110-
network: str,
111110
execution_manager: ExecutionManager,
112111
vertex_handler: VertexHandler,
113112
vertex_parser: VertexParser,
@@ -126,8 +125,6 @@ def __init__(
126125
"""
127126
:param reactor: Twisted reactor which handles the mainloop and the events.
128127
:param peer: Peer object, with peer-id of this node.
129-
:param network: Name of the network this node participates. Usually it is either testnet or mainnet.
130-
:type network: string
131128
132129
:param tx_storage: Required storage backend.
133130
:type tx_storage: :py:class:`hathor.transaction.storage.transaction_storage.TransactionStorage`
@@ -170,7 +167,7 @@ def __init__(
170167
self.remote_address = None
171168

172169
self.my_peer = peer
173-
self.network = network
170+
self.network = settings.NETWORK_NAME
174171

175172
self.is_started: bool = False
176173

hathor/metrics.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -256,7 +256,7 @@ def collect_peer_connection_metrics(self) -> None:
256256
metric = PeerConnectionMetrics(
257257
connection_string=str(connection.entrypoint) if connection.entrypoint else "",
258258
peer_id=str(connection.peer.id),
259-
network=connection.network,
259+
network=settings.NETWORK_NAME,
260260
received_messages=connection.metrics.received_messages,
261261
sent_messages=connection.metrics.sent_messages,
262262
received_bytes=connection.metrics.received_bytes,

hathor/p2p/factory.py

+13-51
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@
1212
# See the License for the specific language governing permissions and
1313
# limitations under the License.
1414

15-
from typing import TYPE_CHECKING, Optional
15+
from abc import ABC
1616

1717
from twisted.internet import protocol
1818
from twisted.internet.interfaces import IAddress
@@ -22,23 +22,12 @@
2222
from hathor.p2p.peer import PrivatePeer
2323
from hathor.p2p.protocol import HathorLineReceiver
2424

25-
if TYPE_CHECKING:
26-
from hathor.manager import HathorManager # noqa: F401
2725

28-
MyServerProtocol = HathorLineReceiver
29-
MyClientProtocol = HathorLineReceiver
30-
31-
32-
class HathorServerFactory(protocol.ServerFactory):
33-
""" HathorServerFactory is used to generate HathorProtocol objects when a new connection arrives.
34-
"""
35-
36-
manager: Optional[ConnectionsManager]
37-
protocol: type[MyServerProtocol] = MyServerProtocol
26+
class _HathorLineReceiverFactory(ABC, protocol.Factory):
27+
inbound: bool
3828

3929
def __init__(
4030
self,
41-
network: str,
4231
my_peer: PrivatePeer,
4332
p2p_manager: ConnectionsManager,
4433
*,
@@ -47,56 +36,29 @@ def __init__(
4736
):
4837
super().__init__()
4938
self._settings = settings
50-
self.network = network
5139
self.my_peer = my_peer
5240
self.p2p_manager = p2p_manager
5341
self.use_ssl = use_ssl
5442

55-
def buildProtocol(self, addr: IAddress) -> MyServerProtocol:
56-
assert self.protocol is not None
57-
p = self.protocol(
58-
network=self.network,
43+
def buildProtocol(self, addr: IAddress) -> HathorLineReceiver:
44+
p = HathorLineReceiver(
5945
my_peer=self.my_peer,
6046
p2p_manager=self.p2p_manager,
6147
use_ssl=self.use_ssl,
62-
inbound=True,
48+
inbound=self.inbound,
6349
settings=self._settings
6450
)
6551
p.factory = self
6652
return p
6753

6854

69-
class HathorClientFactory(protocol.ClientFactory):
70-
""" HathorClientFactory is used to generate HathorProtocol objects when we connected to another peer.
55+
class HathorServerFactory(_HathorLineReceiverFactory, protocol.ServerFactory):
56+
""" HathorServerFactory is used to generate HathorProtocol objects when a new connection arrives.
7157
"""
58+
inbound = True
7259

73-
protocol: type[MyClientProtocol] = MyClientProtocol
74-
75-
def __init__(
76-
self,
77-
network: str,
78-
my_peer: PrivatePeer,
79-
p2p_manager: ConnectionsManager,
80-
*,
81-
settings: HathorSettings,
82-
use_ssl: bool,
83-
):
84-
super().__init__()
85-
self._settings = settings
86-
self.network = network
87-
self.my_peer = my_peer
88-
self.p2p_manager = p2p_manager
89-
self.use_ssl = use_ssl
9060

91-
def buildProtocol(self, addr: IAddress) -> MyClientProtocol:
92-
assert self.protocol is not None
93-
p = self.protocol(
94-
network=self.network,
95-
my_peer=self.my_peer,
96-
p2p_manager=self.p2p_manager,
97-
use_ssl=self.use_ssl,
98-
inbound=False,
99-
settings=self._settings
100-
)
101-
p.factory = self
102-
return p
61+
class HathorClientFactory(_HathorLineReceiverFactory, protocol.ClientFactory):
62+
""" HathorClientFactory is used to generate HathorProtocol objects when we connected to another peer.
63+
"""
64+
inbound = False

hathor/p2p/manager.py

+3-6
Original file line numberDiff line numberDiff line change
@@ -95,7 +95,6 @@ def __init__(
9595
self,
9696
settings: HathorSettings,
9797
reactor: Reactor,
98-
network: str,
9998
my_peer: PrivatePeer,
10099
pubsub: PubSubManager,
101100
ssl: bool,
@@ -114,8 +113,6 @@ def __init__(
114113
self.reactor = reactor
115114
self.my_peer = my_peer
116115

117-
self.network = network
118-
119116
# List of address descriptions to listen for new connections (eg: [tcp:8000])
120117
self.listen_address_descriptions: list[str] = []
121118

@@ -132,10 +129,10 @@ def __init__(
132129
from hathor.p2p.factory import HathorClientFactory, HathorServerFactory
133130
self.use_ssl = ssl
134131
self.server_factory = HathorServerFactory(
135-
self.network, self.my_peer, p2p_manager=self, use_ssl=self.use_ssl, settings=self._settings
132+
self.my_peer, p2p_manager=self, use_ssl=self.use_ssl, settings=self._settings
136133
)
137134
self.client_factory = HathorClientFactory(
138-
self.network, self.my_peer, p2p_manager=self, use_ssl=self.use_ssl, settings=self._settings
135+
self.my_peer, p2p_manager=self, use_ssl=self.use_ssl, settings=self._settings
139136
)
140137

141138
# Global maximum number of connections.
@@ -407,7 +404,7 @@ def on_peer_ready(self, protocol: HathorProtocol) -> None:
407404
self.unverified_peer_storage.pop(protocol.peer.id, None)
408405

409406
# we emit the event even if it's a duplicate peer as a matching
410-
# NETWORK_PEER_DISCONNECTED will be emmited regardless
407+
# NETWORK_PEER_DISCONNECTED will be emitted regardless
411408
self.pubsub.publish(
412409
HathorEvents.NETWORK_PEER_READY,
413410
protocol=protocol,

hathor/p2p/protocol.py

-3
Original file line numberDiff line numberDiff line change
@@ -73,7 +73,6 @@ class WarningFlags(str, Enum):
7373
NO_PEER_ID_URL = 'no_peer_id_url'
7474
NO_ENTRYPOINTS = 'no_entrypoints'
7575

76-
network: str
7776
my_peer: PrivatePeer
7877
connections: 'ConnectionsManager'
7978
node: 'HathorManager'
@@ -99,7 +98,6 @@ def peer(self) -> PublicPeer:
9998

10099
def __init__(
101100
self,
102-
network: str,
103101
my_peer: PrivatePeer,
104102
p2p_manager: 'ConnectionsManager',
105103
*,
@@ -108,7 +106,6 @@ def __init__(
108106
inbound: bool,
109107
) -> None:
110108
self._settings = settings
111-
self.network = network
112109
self.my_peer = my_peer
113110
self.connections = p2p_manager
114111

hathor/p2p/states/hello.py

+2-2
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,7 @@ def _get_hello_data(self) -> dict[str, Any]:
5252
remote = protocol.transport.getPeer()
5353
data = {
5454
'app': self._app(),
55-
'network': protocol.network,
55+
'network': self._settings.NETWORK_NAME,
5656
'remote_address': format_address(remote),
5757
'genesis_short_hash': get_genesis_short_hash(),
5858
'timestamp': protocol.node.reactor.seconds(),
@@ -135,7 +135,7 @@ def handle_hello(self, payload: str) -> None:
135135
# XXX: this used to be a warning, but it shouldn't be since it's perfectly normal
136136
self.log.debug('different versions', theirs=remote_app, ours=our_app)
137137

138-
if data['network'] != protocol.network:
138+
if data['network'] != self._settings.NETWORK_NAME:
139139
protocol.send_error_and_close_connection('Wrong network.')
140140
return
141141

hathor/simulator/simulator.py

-2
Original file line numberDiff line numberDiff line change
@@ -55,7 +55,6 @@ def __init__(self, seed: Optional[int] = None):
5555
self.seed = seed
5656
self.rng = Random(self.seed)
5757
self.settings = get_global_settings()._replace(AVG_TIME_BETWEEN_BLOCKS=SIMULATOR_AVG_TIME_BETWEEN_BLOCKS)
58-
self._network = 'testnet'
5958
self._clock = MemoryReactorHeapClock()
6059
self._peers: OrderedDict[str, HathorManager] = OrderedDict()
6160
self._connections: list['FakeConnection'] = []
@@ -80,7 +79,6 @@ def get_default_builder(self) -> Builder:
8079
Returns a builder with default configuration, for convenience when using create_peer() or create_artifacts()
8180
"""
8281
return Builder() \
83-
.set_network(self._network) \
8482
.set_peer(PrivatePeer.auto_generated()) \
8583
.set_soft_voided_tx_ids(set()) \
8684
.enable_full_verification() \

hathor/transaction/block.py

+1
Original file line numberDiff line numberDiff line change
@@ -359,6 +359,7 @@ def get_feature_activation_bit_value(self, bit: int) -> int:
359359
def iter_transactions_in_this_block(self) -> Iterator[BaseTransaction]:
360360
"""Return an iterator of the transactions that have this block as meta.first_block."""
361361
from hathor.transaction.storage.traversal import BFSOrderWalk
362+
assert self.storage is not None
362363
bfs = BFSOrderWalk(self.storage, is_dag_verifications=True, is_dag_funds=True, is_left_to_right=False)
363364
for tx in bfs.run(self, skip_root=True):
364365
tx_meta = tx.get_metadata()

hathor/transaction/storage/__init__.py

+2
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
from hathor.transaction.storage.cache_storage import TransactionCacheStorage
1616
from hathor.transaction.storage.memory_storage import TransactionMemoryStorage
1717
from hathor.transaction.storage.transaction_storage import TransactionStorage
18+
from hathor.transaction.storage.vertex_storage_protocol import VertexStorageProtocol
1819

1920
try:
2021
from hathor.transaction.storage.rocksdb_storage import TransactionRocksDBStorage
@@ -26,4 +27,5 @@
2627
'TransactionMemoryStorage',
2728
'TransactionCacheStorage',
2829
'TransactionRocksDBStorage',
30+
'VertexStorageProtocol'
2931
]

0 commit comments

Comments
 (0)