diff --git a/substrate/consensus/src/signature_scheme.rs b/substrate/consensus/src/signature_scheme.rs new file mode 100644 index 00000000..bf3c3e72 --- /dev/null +++ b/substrate/consensus/src/signature_scheme.rs @@ -0,0 +1,41 @@ +use sp_application_crypto::{ + RuntimePublic as PublicTrait, Pair as PairTrait, + sr25519::{Public, Pair, Signature}, +}; + +use tendermint_machine::ext::SignatureScheme; + +pub(crate) struct TendermintSigner { + keys: Pair, + lookup: Vec, +} + +impl SignatureScheme for TendermintSigner { + type ValidatorId = u16; + type Signature = Signature; + type AggregateSignature = Vec; + + fn sign(&self, msg: &[u8]) -> Signature { + self.keys.sign(msg) + } + + fn verify(&self, validator: u16, msg: &[u8], sig: &Signature) -> bool { + self.lookup[usize::try_from(validator).unwrap()].verify(&msg, sig) + } + + fn aggregate(sigs: &[Signature]) -> Vec { + sigs.to_vec() + } + + fn verify_aggregate(&self, validators: &[u16], msg: &[u8], sigs: &Vec) -> bool { + if validators.len() != sigs.len() { + return false; + } + for (v, sig) in validators.iter().zip(sigs.iter()) { + if !self.verify(*v, msg, sig) { + return false; + } + } + true + } +}