Skip to content

Commit 6f60e9c

Browse files
committed
feat(p2p/webrtc): signaling discovery
re: #772
1 parent 5170ae6 commit 6f60e9c

31 files changed

+1287
-47
lines changed

node/src/action_kind.rs

Lines changed: 83 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,8 @@ use crate::p2p::channels::best_tip::P2pChannelsBestTipAction;
2828
use crate::p2p::channels::best_tip_effectful::P2pChannelsBestTipEffectfulAction;
2929
use crate::p2p::channels::rpc::P2pChannelsRpcAction;
3030
use crate::p2p::channels::rpc_effectful::P2pChannelsRpcEffectfulAction;
31+
use crate::p2p::channels::signaling::discovery::P2pChannelsSignalingDiscoveryAction;
32+
use crate::p2p::channels::signaling::discovery_effectful::P2pChannelsSignalingDiscoveryEffectfulAction;
3133
use crate::p2p::channels::signaling::exchange::P2pChannelsSignalingExchangeAction;
3234
use crate::p2p::channels::signaling::exchange_effectful::P2pChannelsSignalingExchangeEffectfulAction;
3335
use crate::p2p::channels::snark::P2pChannelsSnarkAction;
@@ -211,6 +213,26 @@ pub enum ActionKind {
211213
P2pChannelsRpcEffectfulInit,
212214
P2pChannelsRpcEffectfulRequestSend,
213215
P2pChannelsRpcEffectfulResponseSend,
216+
P2pChannelsSignalingDiscoveryAnswerDecrypted,
217+
P2pChannelsSignalingDiscoveryAnswerReceived,
218+
P2pChannelsSignalingDiscoveryAnswerSend,
219+
P2pChannelsSignalingDiscoveryDiscoveredAccept,
220+
P2pChannelsSignalingDiscoveryDiscoveredAcceptReceived,
221+
P2pChannelsSignalingDiscoveryDiscoveredReceived,
222+
P2pChannelsSignalingDiscoveryDiscoveredReject,
223+
P2pChannelsSignalingDiscoveryDiscoveredRejectReceived,
224+
P2pChannelsSignalingDiscoveryDiscoveredSend,
225+
P2pChannelsSignalingDiscoveryDiscoveryRequestReceived,
226+
P2pChannelsSignalingDiscoveryDiscoveryRequestSend,
227+
P2pChannelsSignalingDiscoveryInit,
228+
P2pChannelsSignalingDiscoveryPending,
229+
P2pChannelsSignalingDiscoveryReady,
230+
P2pChannelsSignalingDiscoveryRequestReceived,
231+
P2pChannelsSignalingDiscoveryRequestSend,
232+
P2pChannelsSignalingDiscoveryEffectfulAnswerDecrypt,
233+
P2pChannelsSignalingDiscoveryEffectfulInit,
234+
P2pChannelsSignalingDiscoveryEffectfulMessageSend,
235+
P2pChannelsSignalingDiscoveryEffectfulOfferEncryptAndSend,
214236
P2pChannelsSignalingExchangeAnswerReceived,
215237
P2pChannelsSignalingExchangeAnswerSend,
216238
P2pChannelsSignalingExchangeInit,
@@ -635,7 +657,7 @@ pub enum ActionKind {
635657
}
636658

637659
impl ActionKind {
638-
pub const COUNT: u16 = 525;
660+
pub const COUNT: u16 = 545;
639661
}
640662

641663
impl std::fmt::Display for ActionKind {
@@ -1046,6 +1068,7 @@ impl ActionKindGet for P2pChannelsAction {
10461068
fn kind(&self) -> ActionKind {
10471069
match self {
10481070
Self::MessageReceived(a) => a.kind(),
1071+
Self::SignalingDiscovery(a) => a.kind(),
10491072
Self::SignalingExchange(a) => a.kind(),
10501073
Self::BestTip(a) => a.kind(),
10511074
Self::Transaction(a) => a.kind(),
@@ -1087,6 +1110,7 @@ impl ActionKindGet for P2pNetworkAction {
10871110
impl ActionKindGet for P2pChannelsEffectfulAction {
10881111
fn kind(&self) -> ActionKind {
10891112
match self {
1113+
Self::SignalingDiscovery(a) => a.kind(),
10901114
Self::SignalingExchange(a) => a.kind(),
10911115
Self::BestTip(a) => a.kind(),
10921116
Self::Rpc(a) => a.kind(),
@@ -1419,6 +1443,47 @@ impl ActionKindGet for P2pChannelsMessageReceivedAction {
14191443
}
14201444
}
14211445

1446+
impl ActionKindGet for P2pChannelsSignalingDiscoveryAction {
1447+
fn kind(&self) -> ActionKind {
1448+
match self {
1449+
Self::Init { .. } => ActionKind::P2pChannelsSignalingDiscoveryInit,
1450+
Self::Pending { .. } => ActionKind::P2pChannelsSignalingDiscoveryPending,
1451+
Self::Ready { .. } => ActionKind::P2pChannelsSignalingDiscoveryReady,
1452+
Self::RequestSend { .. } => ActionKind::P2pChannelsSignalingDiscoveryRequestSend,
1453+
Self::DiscoveryRequestReceived { .. } => {
1454+
ActionKind::P2pChannelsSignalingDiscoveryDiscoveryRequestReceived
1455+
}
1456+
Self::DiscoveredSend { .. } => ActionKind::P2pChannelsSignalingDiscoveryDiscoveredSend,
1457+
Self::DiscoveredRejectReceived { .. } => {
1458+
ActionKind::P2pChannelsSignalingDiscoveryDiscoveredRejectReceived
1459+
}
1460+
Self::DiscoveredAcceptReceived { .. } => {
1461+
ActionKind::P2pChannelsSignalingDiscoveryDiscoveredAcceptReceived
1462+
}
1463+
Self::AnswerSend { .. } => ActionKind::P2pChannelsSignalingDiscoveryAnswerSend,
1464+
Self::RequestReceived { .. } => {
1465+
ActionKind::P2pChannelsSignalingDiscoveryRequestReceived
1466+
}
1467+
Self::DiscoveryRequestSend { .. } => {
1468+
ActionKind::P2pChannelsSignalingDiscoveryDiscoveryRequestSend
1469+
}
1470+
Self::DiscoveredReceived { .. } => {
1471+
ActionKind::P2pChannelsSignalingDiscoveryDiscoveredReceived
1472+
}
1473+
Self::DiscoveredReject { .. } => {
1474+
ActionKind::P2pChannelsSignalingDiscoveryDiscoveredReject
1475+
}
1476+
Self::DiscoveredAccept { .. } => {
1477+
ActionKind::P2pChannelsSignalingDiscoveryDiscoveredAccept
1478+
}
1479+
Self::AnswerReceived { .. } => ActionKind::P2pChannelsSignalingDiscoveryAnswerReceived,
1480+
Self::AnswerDecrypted { .. } => {
1481+
ActionKind::P2pChannelsSignalingDiscoveryAnswerDecrypted
1482+
}
1483+
}
1484+
}
1485+
}
1486+
14221487
impl ActionKindGet for P2pChannelsSignalingExchangeAction {
14231488
fn kind(&self) -> ActionKind {
14241489
match self {
@@ -1693,6 +1758,23 @@ impl ActionKindGet for P2pNetworkRpcAction {
16931758
}
16941759
}
16951760

1761+
impl ActionKindGet for P2pChannelsSignalingDiscoveryEffectfulAction {
1762+
fn kind(&self) -> ActionKind {
1763+
match self {
1764+
Self::Init { .. } => ActionKind::P2pChannelsSignalingDiscoveryEffectfulInit,
1765+
Self::MessageSend { .. } => {
1766+
ActionKind::P2pChannelsSignalingDiscoveryEffectfulMessageSend
1767+
}
1768+
Self::OfferEncryptAndSend { .. } => {
1769+
ActionKind::P2pChannelsSignalingDiscoveryEffectfulOfferEncryptAndSend
1770+
}
1771+
Self::AnswerDecrypt { .. } => {
1772+
ActionKind::P2pChannelsSignalingDiscoveryEffectfulAnswerDecrypt
1773+
}
1774+
}
1775+
}
1776+
}
1777+
16961778
impl ActionKindGet for P2pChannelsSignalingExchangeEffectfulAction {
16971779
fn kind(&self) -> ActionKind {
16981780
match self {

node/src/event_source/event_source_effects.rs

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
use p2p::channels::signaling::discovery::P2pChannelsSignalingDiscoveryAction;
12
use p2p::channels::signaling::exchange::P2pChannelsSignalingExchangeAction;
23
use p2p::channels::snark::P2pChannelsSnarkAction;
34
use p2p::channels::streaming_rpc::P2pChannelsStreamingRpcAction;
@@ -202,6 +203,11 @@ pub fn event_source_effects<S: Service>(store: &mut Store<S>, action: EventSourc
202203
// TODO(binier): dispatch error action.
203204
}
204205
Ok(_) => match chan_id {
206+
ChannelId::SignalingDiscovery => {
207+
store.dispatch(P2pChannelsSignalingDiscoveryAction::Ready {
208+
peer_id,
209+
});
210+
}
205211
ChannelId::SignalingExchange => {
206212
store.dispatch(P2pChannelsSignalingExchangeAction::Ready {
207213
peer_id,

node/src/logger/logger_effects.rs

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -69,6 +69,7 @@ pub fn logger_effects<S: Service>(store: &Store<S>, action: ActionWithMetaRef<'_
6969
P2pAction::Identify(action) => action.action_event(&context),
7070
P2pAction::Channels(action) => match action {
7171
P2pChannelsAction::MessageReceived(action) => action.action_event(&context),
72+
P2pChannelsAction::SignalingDiscovery(action) => action.action_event(&context),
7273
P2pChannelsAction::SignalingExchange(action) => action.action_event(&context),
7374
P2pChannelsAction::BestTip(action) => action.action_event(&context),
7475
P2pChannelsAction::Transaction(action) => action.action_event(&context),
@@ -106,6 +107,9 @@ pub fn logger_effects<S: Service>(store: &Store<S>, action: ActionWithMetaRef<'_
106107
},
107108
Action::P2pEffectful(action) => match action {
108109
p2p::P2pEffectfulAction::Channels(action) => match action {
110+
P2pChannelsEffectfulAction::SignalingDiscovery(action) => {
111+
action.action_event(&context)
112+
}
109113
P2pChannelsEffectfulAction::SignalingExchange(action) => {
110114
action.action_event(&context)
111115
}
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
11
pub use ::p2p::channels::signaling::*;
22

3+
mod p2p_channels_signaling_discovery_actions;
34
mod p2p_channels_signaling_exchange_actions;
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
use super::discovery::*;
2+
3+
impl redux::EnablingCondition<crate::State> for P2pChannelsSignalingDiscoveryAction {
4+
fn is_enabled(&self, state: &crate::State, time: redux::Timestamp) -> bool {
5+
state.p2p.is_enabled(self, time)
6+
}
7+
}

node/src/p2p/mod.rs

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,10 @@ use p2p::{
33
channels::{
44
best_tip_effectful::P2pChannelsBestTipEffectfulAction,
55
rpc_effectful::P2pChannelsRpcEffectfulAction,
6-
signaling::exchange_effectful::P2pChannelsSignalingExchangeEffectfulAction,
6+
signaling::{
7+
discovery_effectful::P2pChannelsSignalingDiscoveryEffectfulAction,
8+
exchange_effectful::P2pChannelsSignalingExchangeEffectfulAction,
9+
},
710
snark_effectful::P2pChannelsSnarkEffectfulAction,
811
snark_job_commitment_effectful::P2pChannelsSnarkJobCommitmentEffectfulAction,
912
streaming_rpc_effectful::P2pChannelsStreamingRpcEffectfulAction,
@@ -108,6 +111,7 @@ impl_into_global_action!(network::kad::P2pNetworkKademliaAction);
108111
impl_into_global_action!(network::pubsub::P2pNetworkPubsubAction);
109112

110113
impl_into_global_action!(channels::P2pChannelsMessageReceivedAction);
114+
impl_into_global_action!(channels::signaling::discovery::P2pChannelsSignalingDiscoveryAction);
111115
impl_into_global_action!(channels::signaling::exchange::P2pChannelsSignalingExchangeAction);
112116
impl_into_global_action!(channels::best_tip::P2pChannelsBestTipAction);
113117
impl_into_global_action!(channels::transaction::P2pChannelsTransactionAction);
@@ -134,6 +138,9 @@ impl_into_global_action!(effectful p2p::P2pNetworkPnetEffectfulAction);
134138
impl_into_global_action!(effectful connection::incoming_effectful::P2pConnectionIncomingEffectfulAction);
135139
impl_into_global_action!(effectful connection::outgoing_effectful::P2pConnectionOutgoingEffectfulAction);
136140
impl_into_global_action!(effectful p2p::disconnection_effectful::P2pDisconnectionEffectfulAction);
141+
impl_into_global_action!(
142+
effectful P2pChannelsSignalingDiscoveryEffectfulAction
143+
);
137144
impl_into_global_action!(effectful P2pChannelsSignalingExchangeEffectfulAction);
138145
impl_into_global_action!(effectful P2pChannelsBestTipEffectfulAction);
139146
impl_into_global_action!(effectful P2pChannelsStreamingRpcEffectfulAction);

p2p/src/channels/mod.rs

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@ use binprot::{BinProtRead, BinProtWrite};
2727
use binprot_derive::{BinProtRead, BinProtWrite};
2828
use derive_more::From;
2929
use serde::{Deserialize, Serialize};
30+
use signaling::discovery::SignalingDiscoveryChannelMsg;
3031
use signaling::exchange::SignalingExchangeChannelMsg;
3132
use strum_macros::EnumIter;
3233

@@ -40,6 +41,7 @@ use self::transaction::TransactionPropagationChannelMsg;
4041
#[derive(Serialize, Deserialize, EnumIter, Debug, Ord, PartialOrd, Eq, PartialEq, Clone, Copy)]
4142
#[repr(u8)]
4243
pub enum ChannelId {
44+
SignalingDiscovery = 0,
4345
SignalingExchange = 1,
4446
BestTipPropagation = 2,
4547
TransactionPropagation = 3,
@@ -62,6 +64,7 @@ impl ChannelId {
6264

6365
pub fn name(self) -> &'static str {
6466
match self {
67+
Self::SignalingDiscovery => "signaling/discovery",
6568
Self::SignalingExchange => "signaling/exchange",
6669
Self::BestTipPropagation => "best_tip/propagation",
6770
Self::TransactionPropagation => "transaction/propagation",
@@ -74,6 +77,7 @@ impl ChannelId {
7477

7578
pub fn supported_by_libp2p(self) -> bool {
7679
match self {
80+
Self::SignalingDiscovery => false,
7781
Self::SignalingExchange => false,
7882
Self::BestTipPropagation => true,
7983
Self::TransactionPropagation => true,
@@ -87,7 +91,8 @@ impl ChannelId {
8791
pub fn max_msg_size(self) -> usize {
8892
match self {
8993
// TODO(binier): measure signaling message sizes
90-
Self::SignalingExchange => 16 * 1024, // 16KB
94+
Self::SignalingDiscovery => 16 * 1024, // 16KB
95+
Self::SignalingExchange => 16 * 1024, // 16KB
9196
// TODO(binier): reduce this value once we change message for best tip
9297
// propagation to just propagating consensus state with block hash.
9398
Self::BestTipPropagation => 32 * 1024 * 1024, // 32MB
@@ -129,6 +134,7 @@ impl MsgId {
129134

130135
#[derive(BinProtWrite, BinProtRead, Serialize, Deserialize, From, Debug, Clone)]
131136
pub enum ChannelMsg {
137+
SignalingDiscovery(SignalingDiscoveryChannelMsg),
132138
SignalingExchange(SignalingExchangeChannelMsg),
133139
BestTipPropagation(BestTipPropagationChannelMsg),
134140
TransactionPropagation(TransactionPropagationChannelMsg),
@@ -141,6 +147,7 @@ pub enum ChannelMsg {
141147
impl ChannelMsg {
142148
pub fn channel_id(&self) -> ChannelId {
143149
match self {
150+
Self::SignalingDiscovery(_) => ChannelId::SignalingDiscovery,
144151
Self::SignalingExchange(_) => ChannelId::SignalingExchange,
145152
Self::BestTipPropagation(_) => ChannelId::BestTipPropagation,
146153
Self::TransactionPropagation(_) => ChannelId::TransactionPropagation,
@@ -156,6 +163,7 @@ impl ChannelMsg {
156163
W: std::io::Write,
157164
{
158165
match self {
166+
Self::SignalingDiscovery(v) => v.binprot_write(w),
159167
Self::SignalingExchange(v) => v.binprot_write(w),
160168
Self::BestTipPropagation(v) => v.binprot_write(w),
161169
Self::TransactionPropagation(v) => v.binprot_write(w),
@@ -172,6 +180,9 @@ impl ChannelMsg {
172180
R: std::io::Read + ?Sized,
173181
{
174182
match id {
183+
ChannelId::SignalingDiscovery => {
184+
SignalingDiscoveryChannelMsg::binprot_read(r).map(|v| v.into())
185+
}
175186
ChannelId::SignalingExchange => {
176187
SignalingExchangeChannelMsg::binprot_read(r).map(|v| v.into())
177188
}
@@ -207,6 +218,11 @@ impl crate::P2pState {
207218
// exhaustive matching so that we don't miss any channels.
208219
for id in self.config.enabled_channels.iter().copied() {
209220
match id {
221+
ChannelId::SignalingDiscovery => {
222+
dispatcher.push(
223+
signaling::discovery::P2pChannelsSignalingDiscoveryAction::Init { peer_id },
224+
);
225+
}
210226
ChannelId::SignalingExchange => {
211227
dispatcher.push(
212228
signaling::exchange::P2pChannelsSignalingExchangeAction::Init { peer_id },

p2p/src/channels/p2p_channels_actions.rs

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,8 @@ use super::{
99
rpc::P2pChannelsRpcAction,
1010
rpc_effectful::P2pChannelsRpcEffectfulAction,
1111
signaling::{
12+
discovery::P2pChannelsSignalingDiscoveryAction,
13+
discovery_effectful::P2pChannelsSignalingDiscoveryEffectfulAction,
1214
exchange::P2pChannelsSignalingExchangeAction,
1315
exchange_effectful::P2pChannelsSignalingExchangeEffectfulAction,
1416
},
@@ -26,6 +28,7 @@ use super::{
2628
#[derive(Serialize, Deserialize, Debug, Clone, openmina_core::ActionEvent)]
2729
pub enum P2pChannelsAction {
2830
MessageReceived(P2pChannelsMessageReceivedAction),
31+
SignalingDiscovery(P2pChannelsSignalingDiscoveryAction),
2932
SignalingExchange(P2pChannelsSignalingExchangeAction),
3033
BestTip(P2pChannelsBestTipAction),
3134
Transaction(P2pChannelsTransactionAction),
@@ -37,6 +40,7 @@ pub enum P2pChannelsAction {
3740

3841
#[derive(Serialize, Deserialize, Debug, Clone, openmina_core::ActionEvent)]
3942
pub enum P2pChannelsEffectfulAction {
43+
SignalingDiscovery(P2pChannelsSignalingDiscoveryEffectfulAction),
4044
SignalingExchange(P2pChannelsSignalingExchangeEffectfulAction),
4145
BestTip(P2pChannelsBestTipEffectfulAction),
4246
Rpc(P2pChannelsRpcEffectfulAction),
@@ -50,6 +54,7 @@ impl P2pChannelsAction {
5054
pub fn peer_id(&self) -> Option<&PeerId> {
5155
match self {
5256
Self::MessageReceived(v) => Some(&v.peer_id),
57+
Self::SignalingDiscovery(v) => Some(v.peer_id()),
5358
Self::SignalingExchange(v) => Some(v.peer_id()),
5459
Self::BestTip(v) => Some(v.peer_id()),
5560
Self::Transaction(v) => v.peer_id(),
@@ -65,6 +70,7 @@ impl redux::EnablingCondition<crate::P2pState> for P2pChannelsAction {
6570
fn is_enabled(&self, state: &crate::P2pState, time: redux::Timestamp) -> bool {
6671
match self {
6772
P2pChannelsAction::MessageReceived(a) => a.is_enabled(state, time),
73+
P2pChannelsAction::SignalingDiscovery(a) => a.is_enabled(state, time),
6874
P2pChannelsAction::SignalingExchange(a) => a.is_enabled(state, time),
6975
P2pChannelsAction::Transaction(a) => a.is_enabled(state, time),
7076
P2pChannelsAction::BestTip(a) => a.is_enabled(state, time),
@@ -79,6 +85,7 @@ impl redux::EnablingCondition<crate::P2pState> for P2pChannelsAction {
7985
impl redux::EnablingCondition<crate::P2pState> for P2pChannelsEffectfulAction {
8086
fn is_enabled(&self, state: &crate::P2pState, time: redux::Timestamp) -> bool {
8187
match self {
88+
P2pChannelsEffectfulAction::SignalingDiscovery(a) => a.is_enabled(state, time),
8289
P2pChannelsEffectfulAction::SignalingExchange(a) => a.is_enabled(state, time),
8390
P2pChannelsEffectfulAction::BestTip(a) => a.is_enabled(state, time),
8491
P2pChannelsEffectfulAction::Transaction(a) => a.is_enabled(state, time),

0 commit comments

Comments
 (0)