serai-node which compiles and produces/finalizes blocks with --dev

This commit is contained in:
Luke Parker
2025-11-05 18:20:23 -05:00
parent 012b8fddae
commit 31874ceeae
7 changed files with 232 additions and 53 deletions

View File

@@ -1,12 +1,15 @@
#![expect(unused_imports, dead_code)]
use core::marker::PhantomData;
use sp_core::Pair as PairTrait;
use sc_service::ChainType;
use ciphersuite::{group::GroupEncoding, Ciphersuite};
use rand_core::OsRng;
use zeroize::Zeroizing;
use ciphersuite::{
group::{ff::Field, GroupEncoding},
WrappedGroup, Ciphersuite,
};
use embedwards25519::Embedwards25519;
use secq256k1::Secq256k1;
@@ -25,15 +28,28 @@ fn insecure_account_from_name(name: &'static str) -> Public {
sp_core::sr25519::Pair::from_string(&format!("//{name}"), None).unwrap().public().into()
}
fn insecure_arbitrary_public_key_from_name<C: Ciphersuite>(name: &'static str) -> Vec<u8> {
let key = C::hash_to_F(name.as_bytes());
(C::generator() * key).to_bytes().as_ref().to_vec()
}
fn insecure_embedded_elliptic_curve_keys_from_name(
fn insecure_embedded_elliptic_curve_keys(
name: &'static str,
) -> Vec<SignedEmbeddedEllipticCurveKeys> {
vec![] // TODO
vec![
SignedEmbeddedEllipticCurveKeys::bitcoin(
&mut OsRng,
insecure_account_from_name(name),
&Zeroizing::new(<Embedwards25519 as WrappedGroup>::F::random(&mut OsRng)),
&Zeroizing::new(<Secq256k1 as WrappedGroup>::F::random(&mut OsRng)),
),
SignedEmbeddedEllipticCurveKeys::ethereum(
&mut OsRng,
insecure_account_from_name(name),
&Zeroizing::new(<Embedwards25519 as WrappedGroup>::F::random(&mut OsRng)),
&Zeroizing::new(<Secq256k1 as WrappedGroup>::F::random(&mut OsRng)),
),
SignedEmbeddedEllipticCurveKeys::monero(
&mut OsRng,
insecure_account_from_name(name),
&Zeroizing::new(<Embedwards25519 as WrappedGroup>::F::random(&mut OsRng)),
),
]
}
fn wasm_binary() -> Vec<u8> {
@@ -54,9 +70,7 @@ fn devnet_genesis(
) -> RuntimeGenesisConfig {
let validators = validators
.iter()
.map(|name| {
(insecure_account_from_name(name), insecure_embedded_elliptic_curve_keys_from_name(name))
})
.map(|name| (insecure_account_from_name(name), insecure_embedded_elliptic_curve_keys(name)))
.collect::<Vec<_>>();
RuntimeGenesisConfig {
@@ -80,20 +94,12 @@ fn devnet_genesis(
},
signals: SignalsConfig::default(),
babe: BabeConfig {
authorities: validators
.iter()
.map(|validator| (sp_core::sr25519::Public::from(validator.0).into(), 1))
.collect(),
// We leave this empty as `serai-validator-sets-pallet` initializes the authorities
authorities: vec![],
epoch_config: BABE_GENESIS_EPOCH_CONFIG,
_config: PhantomData,
},
grandpa: GrandpaConfig {
authorities: validators
.into_iter()
.map(|validator| (sp_core::sr25519::Public::from(validator.0).into(), 1))
.collect(),
_config: PhantomData,
},
grandpa: GrandpaConfig { authorities: vec![], _config: PhantomData },
}
}

View File

@@ -5,6 +5,12 @@ use sp_keystore::*;
pub struct Keystore(sr25519::Pair);
impl From<sr25519::Pair> for Keystore {
fn from(keypair: sr25519::Pair) -> Self {
Self(keypair)
}
}
impl Keystore {
pub fn from_env() -> Option<Self> {
let mut key_hex = serai_env::var("KEY")?;

View File

@@ -92,6 +92,11 @@ pub fn new_partial(
let keystore: Arc<dyn sp_keystore::Keystore> =
if let Some(keystore) = crate::keystore::Keystore::from_env() {
Arc::new(keystore)
} else if let Some(seed) = config.dev_key_seed.as_ref() {
Arc::new(crate::keystore::Keystore::from(
<sp_core::sr25519::Pair as sp_core::Pair>::from_string(seed, None)
.expect("dev key had invalid seed"),
))
} else {
keystore_container.keystore()
};
@@ -288,10 +293,6 @@ pub fn new_full(mut config: Configuration) -> Result<TaskManager, ServiceError>
let role = config.role;
let keystore = keystore_container;
if let Some(seed) = config.dev_key_seed.as_ref() {
let _ =
keystore.sr25519_generate_new(sp_core::crypto::key_types::AUTHORITY_DISCOVERY, Some(seed));
}
let prometheus_registry = config.prometheus_registry().cloned();
// TODO: Ensure we're considered as an authority is a validator of an external network