diff --git a/apps/src/lib/client/utils.rs b/apps/src/lib/client/utils.rs index c4a4972b0d7..eec0e5f8f43 100644 --- a/apps/src/lib/client/utils.rs +++ b/apps/src/lib/client/utils.rs @@ -26,9 +26,7 @@ use crate::config::genesis::genesis_config::{ self, GenesisConfig, HexString, ValidatorPreGenesisConfig, }; use crate::config::global::GlobalConfig; -use crate::config::{ - self, Config, TendermintMode, DEFAULT_WASM_CHECKSUMS_GAS_FILE, -}; +use crate::config::{self, Config, TendermintMode}; use crate::facade::tendermint::node::Id as TendermintNodeId; use crate::facade::tendermint_config::net::Address as TendermintAddress; use crate::node::ledger::tendermint_node; @@ -425,7 +423,7 @@ pub fn init_network( // Find the sha256 from checksums.json let name = format!("{}.wasm", name); // Full name in format `{name}.{sha256}.wasm` - let full_name = checksums.0.get(&name).unwrap(); + let full_name = checksums.0.get(&name).unwrap().get("hash").unwrap(); let hash = full_name .split_once('.') .unwrap() @@ -668,7 +666,6 @@ pub fn init_network( fs::rename(&temp_dir, &chain_dir).unwrap(); // Copy the WASM checksums - //FIXME: hange wasm_checksums_path to wasm_path? let wasm_dir_full = chain_dir.join(config::DEFAULT_WASM_DIR); fs::create_dir_all(&wasm_dir_full).unwrap(); fs::copy( @@ -677,16 +674,6 @@ pub fn init_network( ) .unwrap(); - // Copy the gas checksums - fs::copy( - &wasm_checksums_path - .parent() - .unwrap() - .join(DEFAULT_WASM_CHECKSUMS_GAS_FILE), - wasm_dir_full.join(config::DEFAULT_WASM_CHECKSUMS_GAS_FILE), - ) - .unwrap(); - config.validator.iter().for_each(|(name, _config)| { let validator_dir = global_args .base_dir @@ -711,16 +698,6 @@ pub fn init_network( ) .unwrap(); - // Copy the gas checksums - fs::copy( - &wasm_checksums_path - .parent() - .unwrap() - .join(DEFAULT_WASM_CHECKSUMS_GAS_FILE), - wasm_dir_full.join(config::DEFAULT_WASM_CHECKSUMS_GAS_FILE), - ) - .unwrap(); - // Write the genesis and global config into validator sub-dirs genesis_config::write_genesis_config( &config, @@ -862,20 +839,6 @@ pub fn init_network( release_wasm_checksums_path, ) .unwrap(); - let release_wasm_checksums_gas_path = - PathBuf::from(config::DEFAULT_BASE_DIR) - .join(chain_id.as_str()) - .join(config::DEFAULT_WASM_DIR) - .join(DEFAULT_WASM_CHECKSUMS_GAS_FILE); - release - .append_path_with_name( - &wasm_checksums_path - .parent() - .unwrap() - .join(DEFAULT_WASM_CHECKSUMS_GAS_FILE), - release_wasm_checksums_gas_path, - ) - .unwrap(); // Gzip tar release and write to file let release_file = archive_dir diff --git a/apps/src/lib/config/mod.rs b/apps/src/lib/config/mod.rs index f3d52040bd6..811289c790a 100644 --- a/apps/src/lib/config/mod.rs +++ b/apps/src/lib/config/mod.rs @@ -26,9 +26,6 @@ pub const DEFAULT_WASM_DIR: &str = "wasm"; /// The WASM checksums file contains the hashes of built WASMs. It is inside the /// WASM dir. pub const DEFAULT_WASM_CHECKSUMS_FILE: &str = "checksums.json"; -/// The WASM checksums gas file contains the gas cost of built WASMs. it is inside -/// the WASM dir. -pub const DEFAULT_WASM_CHECKSUMS_GAS_FILE: &str = "gas_checksums.json"; /// Chain-specific Namada configuration. Nested in chain dirs. pub const FILENAME: &str = "config.toml"; /// Chain-specific Tendermint configuration. Nested in chain dirs. diff --git a/apps/src/lib/wasm_loader/mod.rs b/apps/src/lib/wasm_loader/mod.rs index 9a075fbcf88..2c78bf6f8c8 100644 --- a/apps/src/lib/wasm_loader/mod.rs +++ b/apps/src/lib/wasm_loader/mod.rs @@ -31,7 +31,7 @@ pub enum Error { /// including SHA256 hash #[derive(Debug, Serialize, Deserialize)] #[serde(transparent)] -pub struct Checksums(pub HashMap); +pub struct Checksums(pub HashMap>); const S3_URL: &str = "https://namada-wasm-master.s3.eu-west-1.amazonaws.com"; @@ -132,8 +132,9 @@ pub async fn pre_fetch_wasm(wasm_directory: impl AsRef) { // load json with wasm hashes let checksums = Checksums::read_checksums_async(&wasm_directory).await; - join_all(checksums.0.into_iter().map(|(name, full_name)| { + join_all(checksums.0.into_iter().map(|(name, map)| { let wasm_directory = wasm_directory.as_ref().to_owned(); + let full_name = map.get("hash").unwrap().to_owned(); // Async check and download (if needed) each file tokio::spawn(async move { @@ -267,8 +268,10 @@ pub fn read_wasm( if let Some(os_name) = file_path.as_ref().file_name() { if let Some(name) = os_name.to_str() { let wasm_path = match checksums.0.get(name) { - Some(wasm_filename) => { - wasm_directory.as_ref().join(wasm_filename) + Some(map) => { + wasm_directory.as_ref().join(map.get("hash").ok_or_else( + || eyre!("Missing hash field in checksum"), + )?) } None => { if !file_path.as_ref().is_absolute() { diff --git a/tests/src/e2e/setup.rs b/tests/src/e2e/setup.rs index 551815306c3..a9d0fd3ce33 100644 --- a/tests/src/e2e/setup.rs +++ b/tests/src/e2e/setup.rs @@ -138,7 +138,7 @@ pub fn network( Some(get_all_wasms_hashes(&working_dir, Some("vp_"))); genesis.parameters.tx_whitelist = Some(get_all_wasms_hashes(&working_dir, Some("tx_"))); - genesis.parameters.gas_table = Some(get_gas_checksums(&working_dir)); + genesis.parameters.gas_table = Some(get_all_wasms_gas(&working_dir)); // Run the provided function on it let genesis = update_genesis(genesis); @@ -918,15 +918,16 @@ pub fn get_all_wasms_hashes( ) -> Vec { let checksums_path = working_dir.join("wasm/checksums.json"); let checksums_content = fs::read_to_string(checksums_path).unwrap(); - let checksums: HashMap = + let mut checksums: HashMap> = serde_json::from_str(&checksums_content).unwrap(); let filter_prefix = filter.unwrap_or_default(); checksums - .values() + .values_mut() .filter_map(|wasm| { - if wasm.contains(filter_prefix) { + let hash = wasm.get_mut("hash").expect("Missing hash in checksum"); + if hash.contains(filter_prefix) { Some( - wasm.split('.').collect::>()[1] + hash.split('.').collect::>()[1] .to_owned() .to_lowercase(), ) @@ -937,19 +938,20 @@ pub fn get_all_wasms_hashes( .collect() } -pub fn get_gas_checksums(working_dir: &Path) -> BTreeMap { - let gas_checksums_path = working_dir.join("wasm/gas_checksums.json"); - let gas: BTreeMap = - serde_json::from_reader(fs::File::open(gas_checksums_path).unwrap()) +pub fn get_all_wasms_gas(working_dir: &Path) -> BTreeMap { + let checksums_path = working_dir.join("wasm/checksums.json"); + let checksums: HashMap> = + serde_json::from_reader(fs::File::open(checksums_path).unwrap()) .unwrap(); - gas.into_iter() - .map(|(full_name, gas)| { + checksums + .values() + .map(|map| { ( - full_name.split('.').collect::>()[1] + map.get("hash").unwrap().split('.').collect::>()[1] .to_owned() .to_lowercase(), - gas, + map.get("gas").unwrap().parse::().unwrap(), ) }) .collect() diff --git a/wasm/checksums.py b/wasm/checksums.py index 06de5d5173a..31590cb6396 100644 --- a/wasm/checksums.py +++ b/wasm/checksums.py @@ -4,7 +4,6 @@ import os gas = json.load(open("wasm/gas.json")) -gas_checksums = {} checksums = {} for wasm in sorted(glob.glob("wasm/*.wasm")): @@ -15,24 +14,14 @@ else os.path.splitext(basename)[0].split(".")[0] ) file_key = "{}.wasm".format(file_name) - file_hash = hashlib.sha256(open(wasm, "rb").read()).hexdigest() - extended_file_name = "{}.{}.wasm".format(file_name, file_hash) - checksums[file_key] = extended_file_name - - # Add gas to checksum gas - gas_checksums[extended_file_name] = gas[file_key] - - os.rename(wasm, "wasm/{}".format(checksums[file_key])) - -# Prune unused gas entries if needed (in case of a tx/vp removal) -for k in list(gas.keys()): - if k not in checksums: - del gas[k] + extended_file_name = "{}.{}.wasm".format( + file_name, hashlib.sha256(open(wasm, "rb").read()).hexdigest() + ) + checksums[file_key] = {"hash": extended_file_name, "gas": str(gas[file_key])} -json.dump(gas, open("wasm/gas.json", "w"), indent=4, sort_keys=True) -json.dump(gas_checksums, open("wasm/gas_checksums.json", "w"), indent=4, sort_keys=True) + os.rename(wasm, "wasm/{}".format(checksums[file_key]["hash"])) -updated_wasms = list(checksums.values()) +updated_wasms = [value["hash"] for value in checksums.values()] for wasm in sorted(glob.glob("wasm/*.wasm")): basename = os.path.basename(wasm) diff --git a/wasm/gas_checksums.json b/wasm/gas_checksums.json deleted file mode 100644 index b83eb3af774..00000000000 --- a/wasm/gas_checksums.json +++ /dev/null @@ -1,20 +0,0 @@ -{ - "tx_bond.d014ccb0df538af3ffba99bcde354d2117a95fa6906aa96b1873ca29628e20c5.wasm": 1, - "tx_change_validator_commission.69f92cb21b49b6b0a2fec8a3e6b24ceb4016b37fe064e913f6fcfe9eb719381b.wasm": 1, - "tx_ibc.8faa70660152a6fc4998a845ac310f92c04cb89692c5ad1940f031ab7e935470.wasm": 1, - "tx_init_account.f22219a40cc0208ac13f4529ebbf75f55ef3113ae3384ccb16c7c1e646f86462.wasm": 1, - "tx_init_proposal.94bc8a4bf27f12f8c0cd102ee1a63be0320f5e1d2f540c0dfd510c9324dc3842.wasm": 1, - "tx_init_validator.7f8357d4554450ba52dc5c7aa6a2ef3ce40cc7c92a6eba79bcd163715e96eee1.wasm": 1, - "tx_reveal_pk.e208af69e7c52beb29ce53334015dc0ce84167d3d943667755bad7c6bc2f2535.wasm": 1, - "tx_transfer.d2e59b592e11f4c25cb5035fdf69089c84a968702e6e325775c1a9bf23db7c89.wasm": 1, - "tx_unbond.db724ffa2345002de0dea3b3dc219e98c6f27f9a980002e93f6cef2c892d34ca.wasm": 1, - "tx_update_vp.7bc74c63fe03776ed26aa5b07eac4416ac36840f2dd39336c42ae1619babe911.wasm": 1, - "tx_vote_proposal.d0b03343e585666300d7f01ada1cc51bb5a74fc25005b9b26daef213ca73e00f.wasm": 1, - "tx_withdraw.885702764693e40408baa6fa82530d4b0693d63880187eef2fe8abfd27497e7b.wasm": 1, - "vp_implicit.462af49196f257d271f75d613e063750c934df1133b4cf3eb44d46c4ce5be668.wasm": 1, - "vp_masp.5574a272dbac031e4e14109fabcd864ab3069a0d21ae3b782cce2d91893d1999.wasm": 1, - "vp_testnet_faucet.50444d2a47159773cbbe01c26b9a54732de8bbab4133e61a3937f0a1b8723dd4.wasm": 0, - "vp_token.70175441c32efc3cdc0bf33790857ab0a56aabc3309dc39b0e8d5c331a7ad7fe.wasm": 1, - "vp_user.2b543ec54932a8a5a9f402913f857406dd1e52255d692515f70bc1c393bc85e2.wasm": 1, - "vp_validator.cd261fd4b5d67db72ace5eb281d6a9e58f1b00cde6c96cd0b0a8bcf5f38eaf41.wasm": 1 -} \ No newline at end of file