@@ -15,17 +15,13 @@ use num_traits::ToPrimitive;
1515use prost:: bytes:: Bytes ;
1616use rust_decimal:: Decimal ;
1717use serde_json:: json;
18- use sha2:: { Digest , Sha256 } ;
1918
2019use crate :: cli:: context:: ENV_VAR_WASM_DIR ;
2120use crate :: cli:: { self , args} ;
22- use crate :: config:: genesis:: genesis_config;
2321use crate :: config:: global:: GlobalConfig ;
2422use 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 ;
2723use crate :: node:: ledger:: tendermint_node;
28- use crate :: wallet:: { self , pre_genesis, Wallet } ;
24+ use crate :: wallet:: { self , pre_genesis, Alias , Wallet } ;
2925use crate :: wasm_loader;
3026
3127pub 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