Overhaul crypto (Schnorr/Ristretto, HDKD, BIP39) (#1795)

* Rijig to Ristretto

* Rebuild wasm

* adds compatibility test with the wasm module

* Add Ed25519-BIP39 support

* Bump subkey version

* Update CLI output

* New keys.

* Standard phrase/password/path keys.

* Subkey uses S-URI for secrets

* Move everything to use new HDKD crypto.

* Test fixes

* Ignore old test vector.

* fix the ^^ old test vector.

* Fix tests

* Test fixes

* Cleanups

* Fix broken key conversion logic in grandpa

CC @rphmeier

* Remove legacy Keyring usage

* Traitify `Pair`

* Replace Ed25519AuthorityId with ed25519::Public

* Expunge Ed25519AuthorityId type!

* Replace Sr25519AuthorityId with sr25519::Public

* Remove dodgy crypto type-punning conversions

* Fix some tests

* Avoid trait

* Deduplicate DeriveJunction string decode

* Remove cruft code

* Fix test

* Minor removals

* Build fix

* Subkey supports sign and verify

* Inspect works for public key URIs

* Remove more crypto type-punning

* Fix typo

* Fix tests
This commit is contained in:
Gav Wood
2019-03-13 14:08:31 +01:00
committed by GitHub
parent 17f093da13
commit d7fcf5dc9d
83 changed files with 2636 additions and 1687 deletions
+2
View File
@@ -16,6 +16,7 @@ primitives = { package = "sr-primitives", path = "../../core/sr-primitives", def
srml-support = { path = "../support", default-features = false }
system = { package = "srml-system", path = "../system", default-features = false }
session = { package = "srml-session", path = "../session", default-features = false }
consensus = { package = "srml-consensus", path = "../consensus", default-features = false }
finality-tracker = { package = "srml-finality-tracker", path = "../finality-tracker", default-features = false }
[dev-dependencies]
@@ -33,6 +34,7 @@ std = [
"srml-support/std",
"primitives/std",
"system/std",
"consensus/std",
"session/std",
"finality-tracker/std",
]
+11 -20
View File
@@ -40,10 +40,11 @@ use srml_support::{Parameter, decl_event, decl_storage, decl_module};
use srml_support::dispatch::Result;
use srml_support::storage::StorageValue;
use srml_support::storage::unhashed::StorageVec;
use primitives::traits::{CurrentHeight, Convert};
use substrate_primitives::Ed25519AuthorityId;
use primitives::traits::CurrentHeight;
use substrate_primitives::ed25519;
use system::ensure_signed;
use primitives::traits::MaybeSerializeDebug;
use ed25519::Public as AuthorityId;
mod mock;
mod tests;
@@ -100,7 +101,7 @@ impl<N: Clone, SessionKey> RawLog<N, SessionKey> {
}
impl<N, SessionKey> GrandpaChangeSignal<N> for RawLog<N, SessionKey>
where N: Clone, SessionKey: Clone + Into<Ed25519AuthorityId>,
where N: Clone, SessionKey: Clone + Into<AuthorityId>,
{
fn as_signal(&self) -> Option<ScheduledChange<N>> {
RawLog::as_signal(self).map(|(delay, next_authorities)| ScheduledChange {
@@ -309,7 +310,7 @@ impl<T: Trait> Module<T> {
}
}
impl<T: Trait> Module<T> where Ed25519AuthorityId: core::convert::From<<T as Trait>::SessionKey> {
impl<T: Trait> Module<T> where AuthorityId: core::convert::From<<T as Trait>::SessionKey> {
/// See if the digest contains any standard scheduled change.
pub fn scrape_digest_change(log: &Log<T>)
-> Option<ScheduledChange<T::BlockNumber>>
@@ -340,19 +341,14 @@ impl<T> Default for SyncedAuthorities<T> {
}
impl<X, T> session::OnSessionChange<X> for SyncedAuthorities<T> where
T: Trait,
T: session::Trait,
<T as session::Trait>::ConvertAccountIdToSessionKey: Convert<
<T as system::Trait>::AccountId,
<T as Trait>::SessionKey,
>,
T: Trait + consensus::Trait<SessionKey=<T as Trait>::SessionKey>,
<T as consensus::Trait>::Log: From<consensus::RawLog<<T as Trait>::SessionKey>>
{
fn on_session_change(_: X, _: bool) {
use primitives::traits::Zero;
let next_authorities = <session::Module<T>>::validators()
let next_authorities = <consensus::Module<T>>::authorities()
.into_iter()
.map(T::ConvertAccountIdToSessionKey::convert)
.map(|key| (key, 1)) // evenly-weighted.
.collect::<Vec<(<T as Trait>::SessionKey, u64)>>();
@@ -365,22 +361,17 @@ impl<X, T> session::OnSessionChange<X> for SyncedAuthorities<T> where
}
impl<T> finality_tracker::OnFinalizationStalled<T::BlockNumber> for SyncedAuthorities<T> where
T: Trait,
T: session::Trait,
T: Trait + consensus::Trait<SessionKey=<T as Trait>::SessionKey>,
<T as consensus::Trait>::Log: From<consensus::RawLog<<T as Trait>::SessionKey>>,
T: finality_tracker::Trait,
<T as session::Trait>::ConvertAccountIdToSessionKey: Convert<
<T as system::Trait>::AccountId,
<T as Trait>::SessionKey,
>,
{
fn on_stalled(further_wait: T::BlockNumber) {
// when we record old authority sets, we can use `finality_tracker::median`
// to figure out _who_ failed. until then, we can't meaningfully guard
// against `next == last` the way that normal session changes do.
let next_authorities = <session::Module<T>>::validators()
let next_authorities = <consensus::Module<T>>::authorities()
.into_iter()
.map(T::ConvertAccountIdToSessionKey::convert)
.map(|key| (key, 1)) // evenly-weighted.
.collect::<Vec<(<T as Trait>::SessionKey, u64)>>();
+1
View File
@@ -193,5 +193,6 @@ fn dispatch_forced_change() {
Grandpa::on_finalise(11);
header = System::finalise();
}
let _ = header;
});
}