Skip to content
This repository was archived by the owner on Nov 15, 2023. It is now read-only.

Commit 9d2d020

Browse files
authored
Keystore overhaul (iter 2) (#13634)
* Remove bloat about remote keystore * Update docs and remove unused 'KeystoreRef' trait * Use wherever possible, MemoryKeystore for testing * Remove unrequired fully qualified method syntax for Keystore
1 parent ba95825 commit 9d2d020

File tree

44 files changed

+312
-457
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

44 files changed

+312
-457
lines changed

Cargo.lock

Lines changed: 0 additions & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

bin/node-template/node/src/service.rs

Lines changed: 1 addition & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,6 @@ use sc_client_api::BlockBackend;
55
use sc_consensus_aura::{ImportQueueParams, SlotProportion, StartAuraParams};
66
use sc_consensus_grandpa::SharedVoterState;
77
pub use sc_executor::NativeElseWasmExecutor;
8-
use sc_keystore::LocalKeystore;
98
use sc_service::{error::Error as ServiceError, Configuration, TaskManager, WarpSyncParams};
109
use sc_telemetry::{Telemetry, TelemetryWorker};
1110
use sp_consensus_aura::sr25519::AuthorityPair as AuraPair;
@@ -58,10 +57,6 @@ pub fn new_partial(
5857
>,
5958
ServiceError,
6059
> {
61-
if config.keystore_remote.is_some() {
62-
return Err(ServiceError::Other("Remote Keystores are not supported.".into()))
63-
}
64-
6560
let telemetry = config
6661
.telemetry_endpoints
6762
.clone()
@@ -147,36 +142,19 @@ pub fn new_partial(
147142
})
148143
}
149144

150-
fn remote_keystore(_url: &String) -> Result<Arc<LocalKeystore>, &'static str> {
151-
// FIXME: here would the concrete keystore be built,
152-
// must return a concrete type (NOT `LocalKeystore`) that
153-
// implements `Keystore`
154-
Err("Remote Keystore not supported.")
155-
}
156-
157145
/// Builds a new service for a full client.
158146
pub fn new_full(mut config: Configuration) -> Result<TaskManager, ServiceError> {
159147
let sc_service::PartialComponents {
160148
client,
161149
backend,
162150
mut task_manager,
163151
import_queue,
164-
mut keystore_container,
152+
keystore_container,
165153
select_chain,
166154
transaction_pool,
167155
other: (block_import, grandpa_link, mut telemetry),
168156
} = new_partial(&config)?;
169157

170-
if let Some(url) = &config.keystore_remote {
171-
match remote_keystore(url) {
172-
Ok(k) => keystore_container.set_remote_keystore(k),
173-
Err(e) =>
174-
return Err(ServiceError::Other(format!(
175-
"Error hooking up remote keystore for {}: {}",
176-
url, e
177-
))),
178-
};
179-
}
180158
let grandpa_protocol_name = sc_consensus_grandpa::protocol_standard_name(
181159
&client.block_hash(0).ok().flatten().expect("Genesis block exists; qed"),
182160
&config.chain_spec,

bin/node/cli/benches/block_production.rs

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -69,7 +69,6 @@ fn new_node(tokio_handle: Handle) -> node_cli::service::NewFullBase {
6969
transaction_pool: Default::default(),
7070
network: network_config,
7171
keystore: KeystoreConfig::InMemory,
72-
keystore_remote: Default::default(),
7372
database: DatabaseSource::RocksDb { path: root.join("db"), cache_size: 128 },
7473
trie_cache_maximum_size: Some(64 * 1024 * 1024),
7574
state_pruning: Some(PruningMode::ArchiveAll),

bin/node/cli/benches/transaction_pool.rs

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -64,7 +64,6 @@ fn new_node(tokio_handle: Handle) -> node_cli::service::NewFullBase {
6464
},
6565
network: network_config,
6666
keystore: KeystoreConfig::InMemory,
67-
keystore_remote: Default::default(),
6867
database: DatabaseSource::RocksDb { path: root.join("db"), cache_size: 128 },
6968
trie_cache_maximum_size: Some(64 * 1024 * 1024),
7069
state_pruning: Some(PruningMode::ArchiveAll),

bin/node/cli/src/service.rs

Lines changed: 18 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -595,7 +595,7 @@ mod tests {
595595
use sp_core::{crypto::Pair as CryptoPair, Public};
596596
use sp_inherents::InherentDataProvider;
597597
use sp_keyring::AccountKeyring;
598-
use sp_keystore::{Keystore, KeystorePtr};
598+
use sp_keystore::KeystorePtr;
599599
use sp_runtime::{
600600
generic::{Digest, Era, SignedPayload},
601601
key_types::BABE,
@@ -615,12 +615,13 @@ mod tests {
615615
sp_tracing::try_init_simple();
616616

617617
let keystore_path = tempfile::tempdir().expect("Creates keystore path");
618-
let keystore: KeystorePtr =
619-
Arc::new(LocalKeystore::open(keystore_path.path(), None).expect("Creates keystore"));
620-
let alice: sp_consensus_babe::AuthorityId =
621-
Keystore::sr25519_generate_new(&*keystore, BABE, Some("//Alice"))
622-
.expect("Creates authority pair")
623-
.into();
618+
let keystore: KeystorePtr = LocalKeystore::open(keystore_path.path(), None)
619+
.expect("Creates keystore")
620+
.into();
621+
let alice: sp_consensus_babe::AuthorityId = keystore
622+
.sr25519_generate_new(BABE, Some("//Alice"))
623+
.expect("Creates authority pair")
624+
.into();
624625

625626
let chain_spec = crate::chain_spec::tests::integration_test_config_with_single_authority();
626627

@@ -735,16 +736,16 @@ mod tests {
735736
// sign the pre-sealed hash of the block and then
736737
// add it to a digest item.
737738
let to_sign = pre_hash.encode();
738-
let signature = Keystore::sign_with(
739-
&*keystore,
740-
sp_consensus_babe::AuthorityId::ID,
741-
&alice.to_public_crypto_pair(),
742-
&to_sign,
743-
)
744-
.unwrap()
745-
.unwrap()
746-
.try_into()
747-
.unwrap();
739+
let signature = keystore
740+
.sign_with(
741+
sp_consensus_babe::AuthorityId::ID,
742+
&alice.to_public_crypto_pair(),
743+
&to_sign,
744+
)
745+
.unwrap()
746+
.unwrap()
747+
.try_into()
748+
.unwrap();
748749
let item = <DigestItem as CompatibleDigestItem>::babe_seal(signature);
749750
slot += 1;
750751

bin/node/executor/tests/submit_transaction.rs

Lines changed: 22 additions & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,6 @@ use sp_application_crypto::AppKey;
2222
use sp_core::offchain::{testing::TestTransactionPoolExt, TransactionPoolExt};
2323
use sp_keyring::sr25519::Keyring::Alice;
2424
use sp_keystore::{testing::MemoryKeystore, Keystore, KeystoreExt};
25-
use std::sync::Arc;
2625

2726
pub mod common;
2827
use self::common::*;
@@ -63,25 +62,16 @@ fn should_submit_signed_transaction() {
6362
t.register_extension(TransactionPoolExt::new(pool));
6463

6564
let keystore = MemoryKeystore::new();
66-
Keystore::sr25519_generate_new(
67-
&keystore,
68-
sr25519::AuthorityId::ID,
69-
Some(&format!("{}/hunter1", PHRASE)),
70-
)
71-
.unwrap();
72-
Keystore::sr25519_generate_new(
73-
&keystore,
74-
sr25519::AuthorityId::ID,
75-
Some(&format!("{}/hunter2", PHRASE)),
76-
)
77-
.unwrap();
78-
Keystore::sr25519_generate_new(
79-
&keystore,
80-
sr25519::AuthorityId::ID,
81-
Some(&format!("{}/hunter3", PHRASE)),
82-
)
83-
.unwrap();
84-
t.register_extension(KeystoreExt(Arc::new(keystore)));
65+
keystore
66+
.sr25519_generate_new(sr25519::AuthorityId::ID, Some(&format!("{}/hunter1", PHRASE)))
67+
.unwrap();
68+
keystore
69+
.sr25519_generate_new(sr25519::AuthorityId::ID, Some(&format!("{}/hunter2", PHRASE)))
70+
.unwrap();
71+
keystore
72+
.sr25519_generate_new(sr25519::AuthorityId::ID, Some(&format!("{}/hunter3", PHRASE)))
73+
.unwrap();
74+
t.register_extension(KeystoreExt::new(keystore));
8575

8676
t.execute_with(|| {
8777
let results =
@@ -106,19 +96,13 @@ fn should_submit_signed_twice_from_the_same_account() {
10696
t.register_extension(TransactionPoolExt::new(pool));
10797

10898
let keystore = MemoryKeystore::new();
109-
Keystore::sr25519_generate_new(
110-
&keystore,
111-
sr25519::AuthorityId::ID,
112-
Some(&format!("{}/hunter1", PHRASE)),
113-
)
114-
.unwrap();
115-
Keystore::sr25519_generate_new(
116-
&keystore,
117-
sr25519::AuthorityId::ID,
118-
Some(&format!("{}/hunter2", PHRASE)),
119-
)
120-
.unwrap();
121-
t.register_extension(KeystoreExt(Arc::new(keystore)));
99+
keystore
100+
.sr25519_generate_new(sr25519::AuthorityId::ID, Some(&format!("{}/hunter1", PHRASE)))
101+
.unwrap();
102+
keystore
103+
.sr25519_generate_new(sr25519::AuthorityId::ID, Some(&format!("{}/hunter2", PHRASE)))
104+
.unwrap();
105+
t.register_extension(KeystoreExt::new(keystore));
122106

123107
t.execute_with(|| {
124108
let result =
@@ -169,7 +153,7 @@ fn should_submit_signed_twice_from_all_accounts() {
169153
keystore
170154
.sr25519_generate_new(sr25519::AuthorityId::ID, Some(&format!("{}/hunter2", PHRASE)))
171155
.unwrap();
172-
t.register_extension(KeystoreExt(Arc::new(keystore)));
156+
t.register_extension(KeystoreExt::new(keystore));
173157

174158
t.execute_with(|| {
175159
let results = Signer::<Runtime, TestAuthorityId>::all_accounts()
@@ -227,13 +211,10 @@ fn submitted_transaction_should_be_valid() {
227211
t.register_extension(TransactionPoolExt::new(pool));
228212

229213
let keystore = MemoryKeystore::new();
230-
Keystore::sr25519_generate_new(
231-
&keystore,
232-
sr25519::AuthorityId::ID,
233-
Some(&format!("{}/hunter1", PHRASE)),
234-
)
235-
.unwrap();
236-
t.register_extension(KeystoreExt(Arc::new(keystore)));
214+
keystore
215+
.sr25519_generate_new(sr25519::AuthorityId::ID, Some(&format!("{}/hunter1", PHRASE)))
216+
.unwrap();
217+
t.register_extension(KeystoreExt::new(keystore));
237218

238219
t.execute_with(|| {
239220
let results =

bin/utils/chain-spec-builder/src/main.rs

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,6 @@
1919
use std::{
2020
fs,
2121
path::{Path, PathBuf},
22-
sync::Arc,
2322
};
2423

2524
use ansi_term::Style;
@@ -32,7 +31,7 @@ use sp_core::{
3231
crypto::{ByteArray, Ss58Codec},
3332
sr25519,
3433
};
35-
use sp_keystore::{Keystore, KeystorePtr};
34+
use sp_keystore::KeystorePtr;
3635

3736
/// A utility to easily create a testnet chain spec definition with a given set
3837
/// of authorities and endowed accounts and/or generate random accounts.
@@ -164,16 +163,17 @@ fn generate_chain_spec(
164163

165164
fn generate_authority_keys_and_store(seeds: &[String], keystore_path: &Path) -> Result<(), String> {
166165
for (n, seed) in seeds.iter().enumerate() {
167-
let keystore: KeystorePtr = Arc::new(
166+
let keystore: KeystorePtr =
168167
LocalKeystore::open(keystore_path.join(format!("auth-{}", n)), None)
169-
.map_err(|err| err.to_string())?,
170-
);
168+
.map_err(|err| err.to_string())?
169+
.into();
171170

172171
let (_, _, grandpa, babe, im_online, authority_discovery) =
173172
chain_spec::authority_keys_from_seed(seed);
174173

175174
let insert_key = |key_type, public| {
176-
Keystore::insert(&*keystore, key_type, &format!("//{}", seed), public)
175+
keystore
176+
.insert(key_type, &format!("//{}", seed), public)
177177
.map_err(|_| format!("Failed to insert key: {}", grandpa))
178178
};
179179

client/authority-discovery/src/worker/tests.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -697,7 +697,7 @@ fn addresses_to_publish_adds_p2p() {
697697
Arc::new(TestApi { authorities: vec![] }),
698698
network.clone(),
699699
Box::pin(dht_event_rx),
700-
Role::PublishAndDiscover(Arc::new(MemoryKeystore::new())),
700+
Role::PublishAndDiscover(MemoryKeystore::new().into()),
701701
Some(prometheus_endpoint::Registry::new()),
702702
Default::default(),
703703
);
@@ -731,7 +731,7 @@ fn addresses_to_publish_respects_existing_p2p_protocol() {
731731
Arc::new(TestApi { authorities: vec![] }),
732732
network.clone(),
733733
Box::pin(dht_event_rx),
734-
Role::PublishAndDiscover(Arc::new(MemoryKeystore::new())),
734+
Role::PublishAndDiscover(MemoryKeystore::new().into()),
735735
Some(prometheus_endpoint::Registry::new()),
736736
Default::default(),
737737
);

client/cli/src/commands/insert_key.rs

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -24,8 +24,7 @@ use clap::Parser;
2424
use sc_keystore::LocalKeystore;
2525
use sc_service::config::{BasePath, KeystoreConfig};
2626
use sp_core::crypto::{KeyTypeId, SecretString};
27-
use sp_keystore::{Keystore, KeystorePtr};
28-
use std::sync::Arc;
27+
use sp_keystore::KeystorePtr;
2928

3029
/// The `insert` command
3130
#[derive(Debug, Clone, Parser)]
@@ -67,9 +66,9 @@ impl InsertKeyCmd {
6766
let config_dir = base_path.config_dir(chain_spec.id());
6867

6968
let (keystore, public) = match self.keystore_params.keystore_config(&config_dir)? {
70-
(_, KeystoreConfig::Path { path, password }) => {
69+
KeystoreConfig::Path { path, password } => {
7170
let public = with_crypto_scheme!(self.scheme, to_vec(&suri, password.clone()))?;
72-
let keystore: KeystorePtr = Arc::new(LocalKeystore::open(path, password)?);
71+
let keystore: KeystorePtr = LocalKeystore::open(path, password)?.into();
7372
(keystore, public)
7473
},
7574
_ => unreachable!("keystore_config always returns path and password; qed"),
@@ -78,7 +77,8 @@ impl InsertKeyCmd {
7877
let key_type =
7978
KeyTypeId::try_from(self.key_type.as_str()).map_err(|_| Error::KeyTypeInvalid)?;
8079

81-
Keystore::insert(&*keystore, key_type, &suri, &public[..])
80+
keystore
81+
.insert(key_type, &suri, &public[..])
8282
.map_err(|_| Error::KeystoreOperation)?;
8383

8484
Ok(())
@@ -95,6 +95,7 @@ mod tests {
9595
use super::*;
9696
use sc_service::{ChainSpec, ChainType, GenericChainSpec, NoExtension};
9797
use sp_core::{sr25519::Pair, ByteArray, Pair as _};
98+
use sp_keystore::Keystore;
9899
use tempfile::TempDir;
99100

100101
struct Cli;

client/cli/src/config.rs

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -185,10 +185,10 @@ pub trait CliConfiguration<DCV: DefaultConfigurationValues = ()>: Sized {
185185
///
186186
/// By default this is retrieved from `KeystoreParams` if it is available. Otherwise it uses
187187
/// `KeystoreConfig::InMemory`.
188-
fn keystore_config(&self, config_dir: &PathBuf) -> Result<(Option<String>, KeystoreConfig)> {
188+
fn keystore_config(&self, config_dir: &PathBuf) -> Result<KeystoreConfig> {
189189
self.keystore_params()
190190
.map(|x| x.keystore_config(config_dir))
191-
.unwrap_or_else(|| Ok((None, KeystoreConfig::InMemory)))
191+
.unwrap_or_else(|| Ok(KeystoreConfig::InMemory))
192192
}
193193

194194
/// Get the database cache size.
@@ -505,7 +505,7 @@ pub trait CliConfiguration<DCV: DefaultConfigurationValues = ()>: Sized {
505505
let role = self.role(is_dev)?;
506506
let max_runtime_instances = self.max_runtime_instances()?.unwrap_or(8);
507507
let is_validator = role.is_authority();
508-
let (keystore_remote, keystore) = self.keystore_config(&config_dir)?;
508+
let keystore = self.keystore_config(&config_dir)?;
509509
let telemetry_endpoints = self.telemetry_endpoints(&chain_spec)?;
510510
let runtime_cache_size = self.runtime_cache_size()?;
511511

@@ -524,7 +524,6 @@ pub trait CliConfiguration<DCV: DefaultConfigurationValues = ()>: Sized {
524524
node_key,
525525
DCV::p2p_listen_port(),
526526
)?,
527-
keystore_remote,
528527
keystore,
529528
database: self.database_config(&config_dir, database_cache_size, database)?,
530529
trie_cache_maximum_size: self.trie_cache_maximum_size()?,

0 commit comments

Comments
 (0)