Use proper messages for ValidatorSets/InInstructions pallet

Provides a DST, and associated metadata as beneficial.

Also utilizes MuSig's context to session-bind. Since set_keys_messages also
binds to set, this is semi-redundant, yet that's appreciated.
This commit is contained in:
Luke Parker
2023-05-13 04:20:13 -04:00
parent 663b5f4b50
commit 47f8766da6
17 changed files with 102 additions and 70 deletions

View File

@@ -1,12 +1,10 @@
use scale::Encode;
use sp_core::Pair;
use serai_client::{
primitives::insecure_pair_from_name,
validator_sets::primitives::{Session, ValidatorSet},
in_instructions::{
primitives::{Batch, SignedBatch},
primitives::{Batch, SignedBatch, batch_message},
InInstructionsEvent,
},
Serai,
@@ -32,7 +30,7 @@ pub async fn provide_batch(batch: Batch) -> [u8; 32] {
let block = publish_tx(&Serai::execute_batch(SignedBatch {
batch: batch.clone(),
signature: pair.sign(&batch.encode()),
signature: pair.sign(&batch_message(&batch)),
}))
.await;

View File

@@ -3,18 +3,16 @@ use std::collections::HashMap;
use zeroize::Zeroizing;
use rand_core::OsRng;
use scale::Encode;
use sp_core::{Pair, sr25519::Signature};
use ciphersuite::{group::GroupEncoding, Ciphersuite, Ristretto};
use frost::dkg::musig::*;
use frost::dkg::musig::musig;
use schnorrkel::Schnorrkel;
use serai_client::{
primitives::insecure_pair_from_name,
validator_sets::{
primitives::{ValidatorSet, KeyPair},
primitives::{ValidatorSet, KeyPair, musig_context, musig_key, set_keys_message},
ValidatorSetsEvent,
},
Serai,
@@ -31,7 +29,7 @@ pub async fn set_validator_set_keys(set: ValidatorSet, key_pair: KeyPair) -> [u8
let public_key = <Ristretto as Ciphersuite>::read_G::<&[u8]>(&mut public.0.as_ref()).unwrap();
assert_eq!(
serai.get_validator_set_musig_key(set).await.unwrap().unwrap(),
musig_key::<Ristretto>(&[public_key]).unwrap().to_bytes()
musig_key(set, &[public]).0
);
let secret_key = <Ristretto as Ciphersuite>::read_F::<&[u8]>(
@@ -39,7 +37,8 @@ pub async fn set_validator_set_keys(set: ValidatorSet, key_pair: KeyPair) -> [u8
)
.unwrap();
assert_eq!(Ristretto::generator() * secret_key, public_key);
let threshold_keys = musig::<Ristretto>(&Zeroizing::new(secret_key), &[public_key]).unwrap();
let threshold_keys =
musig::<Ristretto>(&musig_context(set), &Zeroizing::new(secret_key), &[public_key]).unwrap();
assert_eq!(
serai.get_validator_set_musig_key(set).await.unwrap().unwrap(),
threshold_keys.group_key().to_bytes()
@@ -52,7 +51,7 @@ pub async fn set_validator_set_keys(set: ValidatorSet, key_pair: KeyPair) -> [u8
Schnorrkel::new(b"substrate"),
&HashMap::from([(threshold_keys.params().i(), threshold_keys.into())]),
),
&key_pair.encode(),
&set_keys_message(&set, &key_pair),
);
// Vote in a key pair

View File

@@ -2,13 +2,10 @@ use rand_core::{RngCore, OsRng};
use sp_core::{sr25519::Public, Pair};
use ciphersuite::{group::GroupEncoding, Ciphersuite, Ristretto};
use frost::dkg::musig::musig_key;
use serai_client::{
primitives::{NETWORKS, NetworkId, insecure_pair_from_name},
validator_sets::{
primitives::{Session, ValidatorSet},
primitives::{Session, ValidatorSet, musig_key},
ValidatorSetsEvent,
},
Serai,
@@ -56,12 +53,7 @@ serai_test!(
assert_eq!(participants_ref, [(public, set_data.bond)].as_ref());
assert_eq!(
serai.get_validator_set_musig_key(set).await.unwrap().unwrap(),
musig_key::<Ristretto>(&[<Ristretto as Ciphersuite>::read_G::<&[u8]>(
&mut public.0.as_ref()
)
.unwrap()])
.unwrap()
.to_bytes()
musig_key(set, &[public]).0
);
let block = set_validator_set_keys(set, key_pair.clone()).await;