mirror of
https://github.com/pezkuwichain/pezkuwi-subxt.git
synced 2026-07-12 20:25:49 +00:00
Support for keyring in runtimes (#2044)
This functionality is required for #1984. This PR enables [`sp-keyring`](https://github.com/paritytech/polkadot-sdk/blob/21d36b7b4229c4d5225944f197918cde23fda4ea/substrate/primitives/keyring/src/sr25519.rs#L31-L40) in `no-std` environments, allowing to generate the public key (e.g. `AccountKeyring::Alice.public().to_ss58check()`), which can be later used in the any of built-in [_runtime-genesis-config_ variant](https://github.com/paritytech/polkadot-sdk/blob/21d36b7b4229c4d5225944f197918cde23fda4ea/polkadot/node/service/src/chain_spec.rs#L1066-L1073). The proposal is as follows: - expose [`core::Pair` trait](https://github.com/paritytech/polkadot-sdk/blob/d6f15306282e3de848a09c9aa9cba6f95a7811f0/substrate/primitives/core/src/crypto.rs#L832) in `no-std`, - `full_crypto` feature enables `sign` method, - `std` feature enables `generate_with_phrase` and `generate` methods (randomness is required), - All other functionality, currently gated by `full_crypto` will be available unconditionally (`no-std`): -- `from_string` -- `from_string_with_seed` -- `from seed` -- `from_seed_slice` -- `from_phrase` -- `derive` -- `verify` --- Depends on https://github.com/rust-bitcoin/rust-bip39/pull/57 --------- Co-authored-by: command-bot <> Co-authored-by: Davide Galassi <davxy@datawok.net>
This commit is contained in:
committed by
GitHub
parent
1ead59773e
commit
a756baf3b2
@@ -19,11 +19,11 @@
|
||||
|
||||
#[cfg(feature = "serde")]
|
||||
use crate::crypto::Ss58Codec;
|
||||
use crate::crypto::{ByteArray, CryptoType, Derive, Public as PublicT, UncheckedFrom};
|
||||
#[cfg(feature = "full_crypto")]
|
||||
use crate::crypto::{DeriveError, DeriveJunction, Pair as PairT, SecretStringError};
|
||||
use crate::crypto::{
|
||||
ByteArray, CryptoType, Derive, DeriveError, DeriveJunction, Pair as PairT, Public as PublicT,
|
||||
SecretStringError, UncheckedFrom,
|
||||
};
|
||||
|
||||
#[cfg(feature = "full_crypto")]
|
||||
use sp_std::vec::Vec;
|
||||
|
||||
use codec::{Decode, Encode, MaxEncodedLen};
|
||||
@@ -39,12 +39,11 @@ use sp_std::convert::TryFrom;
|
||||
/// ECDSA and BLS12-377 paired crypto scheme
|
||||
#[cfg(feature = "bls-experimental")]
|
||||
pub mod ecdsa_bls377 {
|
||||
use crate::{bls377, crypto::CryptoTypeId, ecdsa};
|
||||
#[cfg(feature = "full_crypto")]
|
||||
use crate::Hasher;
|
||||
use crate::{
|
||||
bls377,
|
||||
crypto::{CryptoTypeId, Pair as PairT, UncheckedFrom},
|
||||
ecdsa,
|
||||
crypto::{Pair as PairT, UncheckedFrom},
|
||||
Hasher,
|
||||
};
|
||||
|
||||
/// An identifier used to match public keys against BLS12-377 keys
|
||||
@@ -56,7 +55,6 @@ pub mod ecdsa_bls377 {
|
||||
ecdsa::SIGNATURE_SERIALIZED_SIZE + bls377::SIGNATURE_SERIALIZED_SIZE;
|
||||
|
||||
/// (ECDSA,BLS12-377) key-pair pair.
|
||||
#[cfg(feature = "full_crypto")]
|
||||
pub type Pair = super::Pair<ecdsa::Pair, bls377::Pair, PUBLIC_KEY_LEN, SIGNATURE_LEN>;
|
||||
/// (ECDSA,BLS12-377) public key pair.
|
||||
pub type Public = super::Public<PUBLIC_KEY_LEN>;
|
||||
@@ -64,16 +62,13 @@ pub mod ecdsa_bls377 {
|
||||
pub type Signature = super::Signature<SIGNATURE_LEN>;
|
||||
|
||||
impl super::CryptoType for Public {
|
||||
#[cfg(feature = "full_crypto")]
|
||||
type Pair = Pair;
|
||||
}
|
||||
|
||||
impl super::CryptoType for Signature {
|
||||
#[cfg(feature = "full_crypto")]
|
||||
type Pair = Pair;
|
||||
}
|
||||
|
||||
#[cfg(feature = "full_crypto")]
|
||||
impl super::CryptoType for Pair {
|
||||
type Pair = Pair;
|
||||
}
|
||||
@@ -136,7 +131,6 @@ pub mod ecdsa_bls377 {
|
||||
/// Secure seed length.
|
||||
///
|
||||
/// Currently only supporting sub-schemes whose seed is a 32-bytes array.
|
||||
#[cfg(feature = "full_crypto")]
|
||||
const SECURE_SEED_LEN: usize = 32;
|
||||
|
||||
/// A secret seed.
|
||||
@@ -144,14 +138,12 @@ const SECURE_SEED_LEN: usize = 32;
|
||||
/// It's not called a "secret key" because ring doesn't expose the secret keys
|
||||
/// of the key pair (yeah, dumb); as such we're forced to remember the seed manually if we
|
||||
/// will need it later (such as for HDKD).
|
||||
#[cfg(feature = "full_crypto")]
|
||||
type Seed = [u8; SECURE_SEED_LEN];
|
||||
|
||||
/// A public key.
|
||||
#[derive(Clone, Encode, Decode, MaxEncodedLen, TypeInfo, PartialEq, Eq, PartialOrd, Ord)]
|
||||
pub struct Public<const LEFT_PLUS_RIGHT_LEN: usize>([u8; LEFT_PLUS_RIGHT_LEN]);
|
||||
|
||||
#[cfg(feature = "full_crypto")]
|
||||
impl<const LEFT_PLUS_RIGHT_LEN: usize> sp_std::hash::Hash for Public<LEFT_PLUS_RIGHT_LEN> {
|
||||
fn hash<H: sp_std::hash::Hasher>(&self, state: &mut H) {
|
||||
self.0.hash(state);
|
||||
@@ -215,7 +207,6 @@ impl<const LEFT_PLUS_RIGHT_LEN: usize> PassBy for Public<LEFT_PLUS_RIGHT_LEN> {
|
||||
type PassBy = pass_by::Inner<Self, [u8; LEFT_PLUS_RIGHT_LEN]>;
|
||||
}
|
||||
|
||||
#[cfg(feature = "full_crypto")]
|
||||
impl<
|
||||
LeftPair: PairT,
|
||||
RightPair: PairT,
|
||||
@@ -311,7 +302,6 @@ impl<T: ByteArray> SignatureBound for T {}
|
||||
#[derive(Clone, Encode, Decode, MaxEncodedLen, TypeInfo, PartialEq, Eq)]
|
||||
pub struct Signature<const LEFT_PLUS_RIGHT_LEN: usize>([u8; LEFT_PLUS_RIGHT_LEN]);
|
||||
|
||||
#[cfg(feature = "full_crypto")]
|
||||
impl<const LEFT_PLUS_RIGHT_LEN: usize> sp_std::hash::Hash for Signature<LEFT_PLUS_RIGHT_LEN> {
|
||||
fn hash<H: sp_std::hash::Hasher>(&self, state: &mut H) {
|
||||
self.0.hash(state);
|
||||
@@ -411,7 +401,6 @@ impl<const LEFT_PLUS_RIGHT_LEN: usize> UncheckedFrom<[u8; LEFT_PLUS_RIGHT_LEN]>
|
||||
}
|
||||
|
||||
/// A key pair.
|
||||
#[cfg(feature = "full_crypto")]
|
||||
#[derive(Clone)]
|
||||
pub struct Pair<
|
||||
LeftPair: PairT,
|
||||
@@ -423,7 +412,6 @@ pub struct Pair<
|
||||
right: RightPair,
|
||||
}
|
||||
|
||||
#[cfg(feature = "full_crypto")]
|
||||
impl<
|
||||
LeftPair: PairT,
|
||||
RightPair: PairT,
|
||||
@@ -483,6 +471,7 @@ where
|
||||
Self::Public::unchecked_from(raw)
|
||||
}
|
||||
|
||||
#[cfg(feature = "full_crypto")]
|
||||
fn sign(&self, message: &[u8]) -> Self::Signature {
|
||||
let mut raw: [u8; SIGNATURE_LEN] = [0u8; SIGNATURE_LEN];
|
||||
raw[..LeftPair::Signature::LEN].copy_from_slice(self.left.sign(message).as_ref());
|
||||
|
||||
Reference in New Issue
Block a user