BEEFY and GRANDPA protocol names should use full genesis hash (#10974)

std::fmt::Display shows formats as reduced hash (e.g. 0xb0a8…dafe)

Use hex::encode to format full hash.

Signed-off-by: acatangiu <adrian@parity.io>
This commit is contained in:
Adrian Catangiu
2022-03-04 18:22:52 +02:00
committed by GitHub
parent 6cfdbe5caa
commit d41838076e
6 changed files with 103 additions and 6 deletions
@@ -19,6 +19,7 @@ dyn-clone = "1.0"
fork-tree = { version = "3.0.0", path = "../../utils/fork-tree" }
futures = "0.3.19"
futures-timer = "3.0.1"
hex = "0.4.2"
log = "0.4.8"
parking_lot = "0.12.0"
rand = "0.8.4"
@@ -58,5 +59,7 @@ sc-network-test = { version = "0.8.0", path = "../network/test" }
sp-keyring = { version = "6.0.0", path = "../../primitives/keyring" }
substrate-test-runtime-client = { version = "2.0.0", path = "../../test-utils/runtime/client" }
sp-tracing = { version = "5.0.0", path = "../../primitives/tracing" }
serde = "1.0.136"
tokio = "1.15"
tempfile = "3.1.0"
@@ -77,13 +77,13 @@ pub mod grandpa_protocol_name {
/// Name of the notifications protocol used by GRANDPA.
///
/// Must be registered towards the networking in order for GRANDPA to properly function.
pub fn standard_name<Hash: std::fmt::Display>(
pub fn standard_name<Hash: AsRef<[u8]>>(
genesis_hash: &Hash,
chain_spec: &Box<dyn ChainSpec>,
) -> std::borrow::Cow<'static, str> {
let chain_prefix = match chain_spec.fork_id() {
Some(fork_id) => format!("/{}/{}", genesis_hash, fork_id),
None => format!("/{}", genesis_hash),
Some(fork_id) => format!("/{}/{}", hex::encode(genesis_hash), fork_id),
None => format!("/{}", hex::encode(genesis_hash)),
};
format!("{}{}", chain_prefix, NAME).into()
}
@@ -535,3 +535,46 @@ fn peer_with_higher_view_leads_to_catch_up_request() {
futures::executor::block_on(test);
}
fn local_chain_spec() -> Box<dyn sc_chain_spec::ChainSpec> {
use sc_chain_spec::{ChainSpec, GenericChainSpec};
use serde::{Deserialize, Serialize};
use sp_runtime::{BuildStorage, Storage};
#[derive(Debug, Serialize, Deserialize)]
struct Genesis(std::collections::BTreeMap<String, String>);
impl BuildStorage for Genesis {
fn assimilate_storage(&self, storage: &mut Storage) -> Result<(), String> {
storage.top.extend(
self.0.iter().map(|(a, b)| (a.clone().into_bytes(), b.clone().into_bytes())),
);
Ok(())
}
}
let chain_spec = GenericChainSpec::<Genesis>::from_json_file(std::path::PathBuf::from(
"../chain-spec/res/chain_spec.json",
))
.unwrap();
chain_spec.cloned_box()
}
#[test]
fn grandpa_protocol_name() {
let chain_spec = local_chain_spec();
// Create protocol name using random genesis hash.
let genesis_hash = sp_core::H256::random();
let expected = format!("/{}/grandpa/1", hex::encode(genesis_hash));
let proto_name = grandpa_protocol_name::standard_name(&genesis_hash, &chain_spec);
assert_eq!(proto_name.to_string(), expected);
// Create protocol name using hardcoded genesis hash. Verify exact representation.
let genesis_hash = [
53, 79, 112, 97, 119, 217, 39, 202, 147, 138, 225, 38, 88, 182, 215, 185, 110, 88, 8, 53,
125, 210, 158, 151, 50, 113, 102, 59, 245, 199, 221, 240,
];
let expected =
"/354f706177d927ca938ae12658b6d7b96e5808357dd29e973271663bf5c7ddf0/grandpa/1".to_string();
let proto_name = grandpa_protocol_name::standard_name(&genesis_hash, &chain_spec);
assert_eq!(proto_name.to_string(), expected);
}