From 35eb66d9e5ac60973bc2f0c12d5c675cfc2e43f8 Mon Sep 17 00:00:00 2001
From: Hugo Trentesaux <hugo@trentesaux.fr>
Date: Wed, 23 Oct 2024 16:31:03 +0200
Subject: [PATCH] wip sketch endpoint gossip service

---
 node/src/cli.rs     | 17 +++++++++++++++++
 node/src/command.rs |  4 +++-
 node/src/service.rs | 23 +++++++++++++++++++++++
 3 files changed, 43 insertions(+), 1 deletion(-)

diff --git a/node/src/cli.rs b/node/src/cli.rs
index a494a8727..647845b5f 100644
--- a/node/src/cli.rs
+++ b/node/src/cli.rs
@@ -19,9 +19,14 @@ pub struct Cli {
     #[clap(subcommand)]
     pub subcommand: Option<Subcommand>,
 
+    /// substrate base options
     #[clap(flatten)]
     pub run: sc_cli::RunCmd,
 
+    /// duniter specific options
+    #[clap(flatten)]
+    pub duniter_options: DuniterConfigExtension,
+
     /// How blocks should be sealed
     ///
     /// Options are "production", "instant", "manual", or timer interval in milliseconds
@@ -29,6 +34,18 @@ pub struct Cli {
     pub sealing: crate::cli::Sealing,
 }
 
+/// add options specific to duniter client
+#[derive(Debug, Clone, clap::Parser)]
+pub struct DuniterConfigExtension {
+    /// Public RPC endpoint to gossip on the network and make available in the apps.
+    #[arg(long)]
+    pub public_rpc: Option<String>,
+
+    /// Public Squid graphql endpoint to gossip on the network and make available in the apps.
+    #[arg(long)]
+    pub public_squid: Option<String>,
+}
+
 #[derive(Debug, clap::Subcommand)]
 pub enum Subcommand {
     /// Build a chain specification.
diff --git a/node/src/command.rs b/node/src/command.rs
index 29af19445..9bac52396 100644
--- a/node/src/command.rs
+++ b/node/src/command.rs
@@ -364,6 +364,8 @@ pub fn run() -> sc_cli::Result<()> {
         }
         None => {
             let runner = cli.create_runner(&cli.run)?;
+            // TODO add endpoint config here
+            let config_extension: DuniterConfigExtension = ();
             runner.run_node_until_exit(|mut config| async move {
                 // Force offchain worker and offchain indexing if we have the role Authority
                 if config.role.is_authority() {
@@ -376,7 +378,7 @@ pub fn run() -> sc_cli::Result<()> {
                         service::runtime_executor::runtime::RuntimeApi,
                         Executor,
                         sc_network::Litep2pNetworkBackend,
-                    >(config, cli.sealing)
+                    >(config, cli.sealing, config_extension)
                     .map_err(sc_cli::Error::Service)
                 }
             })
diff --git a/node/src/service.rs b/node/src/service.rs
index 894644308..48b2c255c 100644
--- a/node/src/service.rs
+++ b/node/src/service.rs
@@ -147,6 +147,7 @@ type FullGrandpaBlockImport<RuntimeApi, Executor> = sc_consensus_grandpa::Grandp
 pub fn new_partial<RuntimeApi, Executor>(
     config: &Configuration,
     consensus_manual: bool,
+    config_extension: DuniterConfigExtension,
 ) -> Result<
     sc_service::PartialComponents<
         FullClient<RuntimeApi, Executor>,
@@ -348,6 +349,28 @@ where
         );
     net_config.add_notification_protocol(grandpa_protocol_config);
 
+    // endpoint gossip
+    // only active for non-authority (to save workload)
+    if !role.is_authority() {
+        // configure protocol
+        let (endpoint_gossip_protocol_config, endpoint_gossip_notification_service) = ((), ());
+        net_config.add_notification_protocol(endpoint_gossip_protocol_config);
+        let endpoint_gossip_config = ();
+        let endpoint_gossip_params = EndpointGossipParams {
+            config: endpoint_gossip_config,
+            network,
+            notification_service: endpoint_gossip_notification_service,
+            // offchain storage
+            offchain_endpoint_tester: (),
+        };
+        // spawn task
+        task_manager.spawn_handle().spawn(
+            "endpoint-gossip",
+            None,
+            run_gossip_worker(endpoint_gossip_params)?,
+        );
+    }
+
     let warp_sync = Arc::new(sc_consensus_grandpa::warp_proof::NetworkProvider::new(
         backend.clone(),
         grandpa_link.shared_authority_set().clone(),
-- 
GitLab