Onionr/src/gossip/__init__.py

37 lines
1.2 KiB
Python

from typing import TYPE_CHECKING, Set
from gossip.peer import Peer
if TYPE_CHECKING:
import queue
from onionrblocks import Block
from onionrthreads import add_onionr_thread
import onionrplugins
from .client import gossip_client
from .server import gossip_server
"""
Onionr uses a flavor of Dandelion++ epidemic routing
The starter creates a peer set and passes it to the client and server
as well as each of the plugins.
The transports forward incoming requests to the gossip server
When a new peer announcement is recieved an event is fired and the transport plugin that handles it will (or wont)
create a new peer object by connecting to that peer
When a new block is generated, it is added to a queue in raw form passed to the starter
"""
def start_gossip_threads(peer_set: Set[Peer], block_queue: queue.Queue[Block]):
# Peer set is largely handled by the transport plugins
# There is a unified set so gossip logic is not repeated
add_onionr_thread(gossip_server, 1, peer_set, block_queue, initial_sleep=0.2)
add_onionr_thread(gossip_client, 1, peer_set, block_queue, initial_sleep=0)
onionrplugins.events.event('gossip_start', data=peer_set, threaded=True)