2025-09-02 11:07:45 -04:00
|
|
|
use sp_core::sr25519::Public;
|
2025-09-02 10:40:57 -04:00
|
|
|
|
2025-09-20 00:06:19 -04:00
|
|
|
use serai_abi::primitives::{crypto::SignedEmbeddedEllipticCurveKeys, network_id::*};
|
2025-09-02 10:40:57 -04:00
|
|
|
|
|
|
|
|
use frame_support::storage::StorageDoubleMap;
|
|
|
|
|
|
|
|
|
|
pub(crate) trait EmbeddedEllipticCurveKeysStorage {
|
|
|
|
|
/// An opaque map storing keys on an embedded elliptic curve.
|
|
|
|
|
type EmbeddedEllipticCurveKeys: StorageDoubleMap<
|
|
|
|
|
ExternalNetworkId,
|
|
|
|
|
Public,
|
2025-09-20 00:06:19 -04:00
|
|
|
serai_abi::primitives::crypto::EmbeddedEllipticCurveKeys,
|
|
|
|
|
Query = Option<serai_abi::primitives::crypto::EmbeddedEllipticCurveKeys>,
|
2025-09-02 10:40:57 -04:00
|
|
|
>;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/// An interface for managing validators' embedded elliptic curve keys.
|
|
|
|
|
pub(crate) trait EmbeddedEllipticCurveKeys {
|
|
|
|
|
/// Set a validator's embedded elliptic curve keys for an external network.
|
|
|
|
|
fn set_embedded_elliptic_curve_keys(
|
|
|
|
|
validator: Public,
|
|
|
|
|
keys: SignedEmbeddedEllipticCurveKeys,
|
|
|
|
|
) -> Result<(), ()>;
|
|
|
|
|
/// Check if a validator still needs to set embedded elliptic curve keys.
|
|
|
|
|
fn still_needs_to_set_embedded_elliptic_curve_keys(network: NetworkId, validator: Public)
|
|
|
|
|
-> bool;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
impl<S: EmbeddedEllipticCurveKeysStorage> EmbeddedEllipticCurveKeys for S {
|
|
|
|
|
/// Set a validator's embedded elliptic curve keys, for an external network.
|
|
|
|
|
fn set_embedded_elliptic_curve_keys(
|
|
|
|
|
validator: Public,
|
|
|
|
|
keys: SignedEmbeddedEllipticCurveKeys,
|
|
|
|
|
) -> Result<(), ()> {
|
|
|
|
|
let keys = keys.verify(validator.into()).ok_or(())?;
|
|
|
|
|
S::EmbeddedEllipticCurveKeys::set(keys.network(), validator, Some(keys));
|
|
|
|
|
Ok(())
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/// Check if a validator still needs to set embedded elliptic curve keys.
|
|
|
|
|
fn still_needs_to_set_embedded_elliptic_curve_keys(
|
|
|
|
|
network: NetworkId,
|
|
|
|
|
validator: Public,
|
|
|
|
|
) -> bool {
|
|
|
|
|
match network {
|
|
|
|
|
// Validators never need to set embedded elliptic curve keys for Serai
|
2025-09-03 06:10:54 -04:00
|
|
|
NetworkId::Serai => false,
|
2025-09-02 10:40:57 -04:00
|
|
|
NetworkId::External(network) => {
|
|
|
|
|
!S::EmbeddedEllipticCurveKeys::contains_key(network, validator)
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|