Skip to content

Commit 05f690f

Browse files
committed
WIP
1 parent baac62c commit 05f690f

File tree

16 files changed

+1006
-439
lines changed

16 files changed

+1006
-439
lines changed

apps/src/lib/cli/context.rs

Lines changed: 22 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ use namada::types::masp::*;
1414
use super::args;
1515
use crate::cli::utils;
1616
use crate::client::tx::ShieldedContext;
17-
use crate::config::genesis::genesis_config;
17+
use crate::config::genesis::{self, genesis_config};
1818
use crate::config::global::GlobalConfig;
1919
use crate::config::{self, Config};
2020
use crate::wallet::Wallet;
@@ -99,18 +99,28 @@ impl Context {
9999
);
100100
let chain_dir =
101101
global_args.base_dir.join(default_chain_id.as_str());
102-
let genesis_file_path = global_args
103-
.base_dir
104-
.join(format!("{}.toml", default_chain_id.as_str()));
102+
103+
// let genesis_file_path = global_args
104+
// .base_dir
105+
// .join(format!("{}.toml", default_chain_id.as_str()));
106+
// let genesis =
107+
// genesis_config::read_genesis_config(&genesis_file_path);
108+
// let native_token = genesis.native_token;
109+
// let default_genesis =
110+
// genesis_config::open_genesis_config(genesis_file_path)?;
111+
// let wallet = Wallet::load_or_new_from_genesis(
112+
// &chain_dir,
113+
// default_genesis,
114+
// );
105115
let genesis =
106-
genesis_config::read_genesis_config(&genesis_file_path);
107-
let native_token = genesis.native_token;
108-
let default_genesis =
109-
genesis_config::open_genesis_config(genesis_file_path)?;
110-
let wallet = Wallet::load_or_new_from_genesis(
111-
&chain_dir,
112-
default_genesis,
113-
);
116+
genesis::chain::Finalized::read_toml_files(&chain_dir)
117+
.expect("Missing genesis files");
118+
let native_token = genesis.get_native_token().clone();
119+
let wallet = if Wallet::exists(&chain_dir) {
120+
Wallet::load(&chain_dir).unwrap()
121+
} else {
122+
genesis.derive_wallet(&chain_dir, None, None)
123+
};
114124

115125
// If the WASM dir specified, put it in the config
116126
match global_args.wasm_dir.as_ref() {

apps/src/lib/client/utils.rs

Lines changed: 87 additions & 129 deletions
Original file line numberDiff line numberDiff line change
@@ -15,17 +15,13 @@ use num_traits::ToPrimitive;
1515
use prost::bytes::Bytes;
1616
use rust_decimal::Decimal;
1717
use serde_json::json;
18-
use sha2::{Digest, Sha256};
1918

2019
use crate::cli::context::ENV_VAR_WASM_DIR;
2120
use crate::cli::{self, args};
22-
use crate::config::genesis::genesis_config;
2321
use crate::config::global::GlobalConfig;
2422
use crate::config::{self, genesis, Config, TendermintMode};
25-
use crate::facade::tendermint::node::Id as TendermintNodeId;
26-
use crate::facade::tendermint_config::net::Address as TendermintAddress;
2723
use crate::node::ledger::tendermint_node;
28-
use crate::wallet::{self, pre_genesis, Wallet};
24+
use crate::wallet::{self, pre_genesis, Alias, Wallet};
2925
use crate::wasm_loader;
3026

3127
pub const NET_ACCOUNTS_DIR: &str = "setup";
@@ -102,7 +98,7 @@ pub async fn join_network(
10298
let validator_alias_and_pre_genesis_wallet =
10399
validator_alias_and_dir.map(|(validator_alias, pre_genesis_dir)| {
104100
(
105-
validator_alias,
101+
Alias::from(validator_alias),
106102
pre_genesis::ValidatorWallet::load(&pre_genesis_dir)
107103
.unwrap_or_else(|err| {
108104
eprintln!(
@@ -184,16 +180,6 @@ pub async fn join_network(
184180
.await
185181
.unwrap();
186182

187-
// Move the genesis file
188-
fs::rename(
189-
unpack_dir
190-
.join(config::DEFAULT_BASE_DIR)
191-
.join(format!("{}.toml", chain_id.as_str())),
192-
base_dir_full.join(format!("{}.toml", chain_id.as_str())),
193-
)
194-
.await
195-
.unwrap();
196-
197183
// Move the global config
198184
fs::rename(
199185
unpack_dir
@@ -210,6 +196,76 @@ pub async fn join_network(
210196
.unwrap();
211197
}
212198

199+
// Read the genesis files
200+
let genesis = genesis::chain::Finalized::read_toml_files(&chain_dir)
201+
.unwrap_or_else(|err| {
202+
eprintln!(
203+
"Failed to read genesis TOML files from {} with {err}.",
204+
chain_dir.to_string_lossy()
205+
);
206+
cli::safe_exit(1)
207+
});
208+
209+
// Try to find validator data when using a pre-genesis validator
210+
let validator_alias = validator_alias_and_pre_genesis_wallet
211+
.as_ref()
212+
.map(|(alias, _wallet)| alias.clone());
213+
let validator_keys = validator_alias_and_pre_genesis_wallet.as_ref().map(
214+
|(_alias, wallet)| {
215+
let tendermint_node_key: common::SecretKey = wallet
216+
.tendermint_node_key
217+
.try_to_sk()
218+
.unwrap_or_else(|_err| {
219+
eprintln!(
220+
"Tendermint node key must be common (need to change?)"
221+
);
222+
cli::safe_exit(1)
223+
});
224+
(tendermint_node_key, wallet.consensus_key.clone())
225+
},
226+
);
227+
let node_mode = if validator_alias.is_some() {
228+
TendermintMode::Validator
229+
} else {
230+
TendermintMode::Full
231+
};
232+
233+
// Derive config from genesis
234+
let config = genesis.derive_config(
235+
&chain_dir,
236+
node_mode,
237+
validator_alias,
238+
allow_duplicate_ip,
239+
);
240+
241+
// Try to load pre-genesis wallet, if any
242+
let pre_genesis_wallet_path = base_dir.join(PRE_GENESIS_DIR);
243+
let pre_genesis_wallet = Wallet::load(&pre_genesis_wallet_path);
244+
// Derive wallet from genesis
245+
let wallet = genesis.derive_wallet(
246+
&chain_dir,
247+
pre_genesis_wallet,
248+
validator_alias_and_pre_genesis_wallet,
249+
);
250+
251+
// Save the config and the wallet
252+
config.write(&base_dir, &chain_id, true).unwrap();
253+
wallet.save().unwrap();
254+
255+
// Setup the node for a genesis validator, if used
256+
if let Some((tendermint_node_key, consensus_key)) = validator_keys {
257+
let tm_home_dir = chain_dir.join("tendermint");
258+
259+
// Write consensus key to tendermint home
260+
tendermint_node::write_validator_key(&tm_home_dir, &consensus_key);
261+
262+
// Write tendermint node key
263+
write_tendermint_node_key(&tm_home_dir, tendermint_node_key);
264+
265+
// Pre-initialize tendermint validator state
266+
tendermint_node::write_validator_state(&tm_home_dir);
267+
}
268+
213269
// Move wasm-dir and update config if it's non-default
214270
if let Some(wasm_dir) = wasm_dir.as_ref() {
215271
if wasm_dir.to_string_lossy() != config::DEFAULT_WASM_DIR {
@@ -240,97 +296,6 @@ pub async fn join_network(
240296
}
241297
}
242298

243-
// Setup the node for a genesis validator, if used
244-
if let Some((validator_alias, pre_genesis_wallet)) =
245-
validator_alias_and_pre_genesis_wallet
246-
{
247-
let tendermint_node_key: common::SecretKey = pre_genesis_wallet
248-
.tendermint_node_key
249-
.try_to_sk()
250-
.unwrap_or_else(|_err| {
251-
eprintln!(
252-
"Tendermint node key must be common (need to change?)"
253-
);
254-
cli::safe_exit(1)
255-
});
256-
257-
let genesis_file_path =
258-
base_dir.join(format!("{}.toml", chain_id.as_str()));
259-
let mut wallet = Wallet::load_or_new_from_genesis(
260-
&chain_dir,
261-
genesis_config::open_genesis_config(genesis_file_path).unwrap(),
262-
);
263-
264-
let address = wallet
265-
.find_address(&validator_alias)
266-
.unwrap_or_else(|| {
267-
eprintln!(
268-
"Unable to find validator address for alias \
269-
{validator_alias}"
270-
);
271-
cli::safe_exit(1)
272-
})
273-
.clone();
274-
275-
let tm_home_dir = chain_dir.join("tendermint");
276-
277-
// Write consensus key to tendermint home
278-
tendermint_node::write_validator_key(
279-
&tm_home_dir,
280-
&pre_genesis_wallet.consensus_key,
281-
);
282-
283-
// Derive the node ID from the node key
284-
let node_id = id_from_pk(&tendermint_node_key.ref_to());
285-
// Write tendermint node key
286-
write_tendermint_node_key(&tm_home_dir, tendermint_node_key);
287-
288-
// Pre-initialize tendermint validator state
289-
tendermint_node::write_validator_state(&tm_home_dir);
290-
291-
// Extend the current wallet from the pre-genesis wallet.
292-
// This takes the validator keys to be usable in future commands (e.g.
293-
// to sign a tx from validator account using the account key).
294-
wallet.extend_from_pre_genesis_validator(
295-
address,
296-
validator_alias.into(),
297-
pre_genesis_wallet,
298-
);
299-
300-
wallet.save().unwrap();
301-
302-
// Update the config from the default non-validator settings to
303-
// validator settings
304-
let base_dir = base_dir.clone();
305-
let chain_id = chain_id.clone();
306-
tokio::task::spawn_blocking(move || {
307-
let mut config = Config::load(&base_dir, &chain_id, None);
308-
309-
config.ledger.tendermint.tendermint_mode =
310-
TendermintMode::Validator;
311-
// Validator node should turned off peer exchange reactor
312-
config.ledger.tendermint.p2p_pex = false;
313-
// Remove self from persistent peers
314-
config
315-
.ledger
316-
.tendermint
317-
.p2p_persistent_peers
318-
.retain(|peer| {
319-
if let TendermintAddress::Tcp {
320-
peer_id: Some(peer_id),
321-
..
322-
} = peer
323-
{
324-
node_id != *peer_id
325-
} else {
326-
true
327-
}
328-
});
329-
config.write(&base_dir, &chain_id, true).unwrap();
330-
})
331-
.await
332-
.unwrap();
333-
}
334299
if !dont_prefetch_wasm {
335300
fetch_wasms_aux(&base_dir, &chain_id).await;
336301
}
@@ -356,28 +321,6 @@ pub async fn fetch_wasms_aux(base_dir: &Path, chain_id: &ChainId) {
356321
wasm_loader::pre_fetch_wasm(&wasm_dir).await;
357322
}
358323

359-
/// Length of a Tendermint Node ID in bytes
360-
const TENDERMINT_NODE_ID_LENGTH: usize = 20;
361-
362-
/// Derive Tendermint node ID from public key
363-
pub fn id_from_pk(pk: &common::PublicKey) -> TendermintNodeId {
364-
let mut bytes = [0u8; TENDERMINT_NODE_ID_LENGTH];
365-
366-
match pk {
367-
common::PublicKey::Ed25519(_) => {
368-
let _pk: ed25519::PublicKey = pk.try_to_pk().unwrap();
369-
let digest = Sha256::digest(_pk.try_to_vec().unwrap().as_slice());
370-
bytes.copy_from_slice(&digest[..TENDERMINT_NODE_ID_LENGTH]);
371-
}
372-
common::PublicKey::Secp256k1(_) => {
373-
let _pk: secp256k1::PublicKey = pk.try_to_pk().unwrap();
374-
let digest = Sha256::digest(_pk.try_to_vec().unwrap().as_slice());
375-
bytes.copy_from_slice(&digest[..TENDERMINT_NODE_ID_LENGTH]);
376-
}
377-
}
378-
TendermintNodeId::new(bytes)
379-
}
380-
381324
/// Initialize a new test network from the given configuration.
382325
///
383326
/// For any public keys that are not specified in the genesis configuration,
@@ -546,6 +489,21 @@ pub fn init_network(
546489
release_file.to_string_lossy()
547490
);
548491
}
492+
493+
// After the archive is created, try to copy the built WASM, if they're
494+
// present with the checksums. This is used for local network setup, so
495+
// that we can use a local WASM build.
496+
let checksums = wasm_loader::Checksums::read_checksums(&wasm_dir_full);
497+
for (name, full_name) in checksums.0 {
498+
// try to copy built file from the Namada WASM root dir
499+
let file = std::env::current_dir()
500+
.unwrap()
501+
.join(crate::config::DEFAULT_WASM_DIR)
502+
.join(&full_name);
503+
if file.exists() {
504+
fs::copy(file, wasm_dir_full.join(&full_name)).unwrap();
505+
}
506+
}
549507
}
550508

551509
/// Initialize genesis validator's address, consensus key and validator account

0 commit comments

Comments
 (0)