From 16a2c9a2dc761f0c1f87520402a13d090b4811b2 Mon Sep 17 00:00:00 2001
From: Luke Parker <lukeparker5132@gmail.com>
Date: Tue, 8 Nov 2022 02:14:49 -0500
Subject: [PATCH] Correct protocol name handling

---
 substrate/node/src/service.rs                 | 21 +++++++++----------
 .../tendermint/client/src/authority/mod.rs    |  6 +++---
 substrate/tendermint/client/src/lib.rs        |  6 +++---
 3 files changed, 16 insertions(+), 17 deletions(-)

diff --git a/substrate/node/src/service.rs b/substrate/node/src/service.rs
index 19618220..1de4e6ed 100644
--- a/substrate/node/src/service.rs
+++ b/substrate/node/src/service.rs
@@ -21,12 +21,12 @@ pub(crate) use sc_tendermint::{
 use serai_runtime::{self, MILLISECS_PER_BLOCK, opaque::Block, RuntimeApi};
 
 type FullBackend = sc_service::TFullBackend<Block>;
-type FullSelectChain = TendermintSelectChain<Block, FullBackend>;
+pub type FullClient = TFullClient<Block, RuntimeApi, NativeElseWasmExecutor<ExecutorDispatch>>;
 
 type PartialComponents = sc_service::PartialComponents<
   FullClient,
   FullBackend,
-  FullSelectChain,
+  TendermintSelectChain<Block, FullBackend>,
   sc_consensus::DefaultImportQueue<Block, FullClient>,
   sc_transaction_pool::FullPool<Block, FullClient>,
   Option<Telemetry>,
@@ -48,8 +48,6 @@ impl NativeExecutionDispatch for ExecutorDispatch {
   }
 }
 
-pub type FullClient = TFullClient<Block, RuntimeApi, NativeElseWasmExecutor<ExecutorDispatch>>;
-
 pub struct Cidp;
 #[async_trait::async_trait]
 impl CreateInherentDataProviders<Block, ()> for Cidp {
@@ -169,11 +167,13 @@ pub async fn new_full(mut config: Configuration) -> Result<TaskManager, ServiceE
     },
   ) = new_partial(&config)?;
 
-  if config.role.is_authority() {
-    config.network.extra_sets.push(sc_tendermint::set_config(
-      client.block_hash(0).unwrap().unwrap(),
-      config.chain_spec.fork_id(),
-    ));
+  let is_authority = config.role.is_authority();
+  let tendermint_protocol = sc_tendermint::protocol_name(
+    client.block_hash(0).unwrap().unwrap(),
+    config.chain_spec.fork_id(),
+  );
+  if is_authority {
+    config.network.extra_sets.push(sc_tendermint::set_config(tendermint_protocol.clone()));
   }
 
   let (network, system_rpc_tx, tx_handler_controller, network_starter) =
@@ -210,8 +210,6 @@ pub async fn new_full(mut config: Configuration) -> Result<TaskManager, ServiceE
     })
   };
 
-  let is_authority = config.role.is_authority();
-
   let registry = config.prometheus_registry().cloned();
   sc_service::spawn_tasks(sc_service::SpawnTasksParams {
     network: network.clone(),
@@ -232,6 +230,7 @@ pub async fn new_full(mut config: Configuration) -> Result<TaskManager, ServiceE
       "tendermint",
       None,
       TendermintAuthority::new(authority).authority(
+        tendermint_protocol,
         keystore_container.keystore(),
         Cidp,
         sc_basic_authorship::ProposerFactory::new(
diff --git a/substrate/tendermint/client/src/authority/mod.rs b/substrate/tendermint/client/src/authority/mod.rs
index 314d4369..a51f9f71 100644
--- a/substrate/tendermint/client/src/authority/mod.rs
+++ b/substrate/tendermint/client/src/authority/mod.rs
@@ -26,7 +26,7 @@ use sc_consensus::import_queue::IncomingBlock;
 
 use sc_service::ImportQueue;
 use sc_client_api::{BlockBackend, Finalizer};
-use sc_network::NetworkBlock;
+use sc_network::{ProtocolName, NetworkBlock};
 use sc_network_gossip::GossipEngine;
 
 use substrate_prometheus_endpoint::Registry;
@@ -37,7 +37,7 @@ use tendermint_machine::{
 };
 
 use crate::{
-  CONSENSUS_ID, PROTOCOL_NAME, TendermintValidator,
+  CONSENSUS_ID, TendermintValidator,
   validators::{TendermintSigner, TendermintValidators},
   tendermint::TendermintImport,
 };
@@ -142,6 +142,7 @@ impl<T: TendermintValidator> TendermintAuthority<T> {
   /// as it will not return until the P2P stack shuts down.
   pub async fn authority(
     mut self,
+    protocol: ProtocolName,
     keys: Arc<dyn CryptoStore>,
     providers: T::CIDP,
     env: T::Environment,
@@ -158,7 +159,6 @@ impl<T: TendermintValidator> TendermintAuthority<T> {
     // Create the gossip network
     let mut gossip = GossipEngine::new(
       network.clone(),
-      PROTOCOL_NAME,
       protocol,
       Arc::new(TendermintGossip::new(number.clone(), self.import.validators.clone())),
       registry,
diff --git a/substrate/tendermint/client/src/lib.rs b/substrate/tendermint/client/src/lib.rs
index 63b563e0..7c3e96c4 100644
--- a/substrate/tendermint/client/src/lib.rs
+++ b/substrate/tendermint/client/src/lib.rs
@@ -35,7 +35,7 @@ pub(crate) const KEY_TYPE_ID: KeyTypeId = KeyTypeId(CONSENSUS_ID);
 
 const PROTOCOL_NAME: &str = "/tendermint/1";
 
-fn protocol_name<Hash: AsRef<[u8]>>(genesis: Hash, fork: Option<&str>) -> ProtocolName {
+pub fn protocol_name<Hash: AsRef<[u8]>>(genesis: Hash, fork: Option<&str>) -> ProtocolName {
   let mut name = format!("/{}", hex::encode(genesis.as_ref()));
   if let Some(fork) = fork {
     name += &format!("/{}", fork);
@@ -44,9 +44,9 @@ fn protocol_name<Hash: AsRef<[u8]>>(genesis: Hash, fork: Option<&str>) -> Protoc
   name.into()
 }
 
-pub fn set_config<Hash: AsRef<[u8]>>(genesis: Hash, fork: Option<&str>) -> NonDefaultSetConfig {
+pub fn set_config(protocol: ProtocolName) -> NonDefaultSetConfig {
   // TODO: 1 MiB Block Size + 1 KiB
-  let mut cfg = NonDefaultSetConfig::new(protocol_name(genesis, fork), (1024 * 1024) + 1024);
+  let mut cfg = NonDefaultSetConfig::new(protocol, (1024 * 1024) + 1024);
   cfg.allow_non_reserved(25, 25);
   cfg
 }