From 1e6e255934a7581795c4da16d130b6851fd9147c Mon Sep 17 00:00:00 2001 From: Calvin Lau Date: Sun, 24 Nov 2019 15:36:16 +0800 Subject: [PATCH 1/2] Problem: (CRO-603) Bech32 address always encoded with initialized network Solution: Add network argument to to_cro() --- chain-core/src/init/address.rs | 33 ++++++++++------ chain-core/src/init/network.rs | 18 +++++---- chain-core/src/tx/data/address.rs | 54 +++++++++++++-------------- client-rpc/src/rpc/transaction_rpc.rs | 2 + client-rpc/src/rpc/wallet_rpc.rs | 2 +- 5 files changed, 61 insertions(+), 48 deletions(-) diff --git a/chain-core/src/init/address.rs b/chain-core/src/init/address.rs index 3c0d869a8..12873d4df 100644 --- a/chain-core/src/init/address.rs +++ b/chain-core/src/init/address.rs @@ -31,6 +31,8 @@ use std::fmt; use tiny_keccak::{Hasher, Keccak}; use crate::common::{H256, HASH_SIZE_256}; +#[cfg(feature = "bech32")] +use crate::init::network::{get_bech32_human_part_from_network, Network}; #[derive(Debug)] #[cfg_attr(feature = "serde", derive(Serialize, Deserialize))] @@ -49,8 +51,8 @@ impl ::std::error::Error for CroAddressError {} // DCRO: devnet/regnet transfer #[cfg(feature = "bech32")] pub trait CroAddress { - fn to_cro(&self) -> Result; - fn from_cro(encoded: &str) -> Result; + fn to_cro(&self, network: Network) -> Result; + fn from_cro(encoded: &str, network: Network) -> Result; } /// Keccak-256 crypto hash length in bytes @@ -187,18 +189,18 @@ impl RedeemAddress { #[cfg(all(feature = "bech32", feature = "hex"))] impl CroAddress for RedeemAddress { - fn to_cro(&self) -> Result { + fn to_cro(&self, network: Network) -> Result { let checked_data: Vec = self.0.to_vec().to_base32(); - let encoded = bech32::encode(super::network::get_bech32_human_part(), checked_data) - .expect("bech32 crms encoding"); + let encoded = bech32::encode(get_bech32_human_part_from_network(network), checked_data) + .expect("bech32 encoding error"); Ok(encoded.to_string()) } - fn from_cro(encoded: &str) -> Result { + fn from_cro(encoded: &str, network: Network) -> Result { let (human_part, u5_bytes) = bech32::decode(encoded).map_err(|e| CroAddressError::Bech32Error(e.to_string()))?; - if human_part != super::network::get_bech32_human_part() { + if human_part != get_bech32_human_part_from_network(network) { return Err(CroAddressError::InvalidNetwork); } @@ -384,10 +386,17 @@ mod tests { #[test] fn should_be_correct_textual_address() { - let a = RedeemAddress::from_str("0x0e7c045110b8dbf29765047380898919c5cb56f4").unwrap(); - let b = a.to_cro().unwrap(); - assert_eq!(b.to_string(), "dcro1pe7qg5gshrdl99m9q3ecpzvfr8zuk4h5rm547c"); - let c = RedeemAddress::from_cro(&b).unwrap(); - assert_eq!(c, a); + let network = Network::Devnet; + + let redeem_address = + RedeemAddress::from_str("0x0e7c045110b8dbf29765047380898919c5cb56f4").unwrap(); + let bech32_address = redeem_address.to_cro(network).unwrap(); + assert_eq!( + bech32_address.to_string(), + "dcro1pe7qg5gshrdl99m9q3ecpzvfr8zuk4h5rm547c" + ); + + let restored_redeem_address = RedeemAddress::from_cro(&bech32_address, network).unwrap(); + assert_eq!(redeem_address, restored_redeem_address); } } diff --git a/chain-core/src/init/network.rs b/chain-core/src/init/network.rs index c6d7b7eb2..561c735fd 100644 --- a/chain-core/src/init/network.rs +++ b/chain-core/src/init/network.rs @@ -61,20 +61,24 @@ pub fn get_network() -> Network { /// Given the chosen network, it returns the human readable part of Bech32 address pub fn get_bech32_human_part() -> &'static str { - unsafe { - match chosen_network::NETWORK { - Network::Mainnet => "cro", - Network::Testnet => "tcro", - Network::Devnet => "dcro", - } + get_bech32_human_part_from_network(get_network()) +} + +/// Returns the human readable part of Bech32 address of the provided network +pub fn get_bech32_human_part_from_network(network: Network) -> &'static str { + match network { + Network::Mainnet => "cro", + Network::Testnet => "tcro", + Network::Devnet => "dcro", } } +/// Given the chosen network, it returns bip44 cointype pub fn get_bip44_coin_type() -> u32 { get_bip44_coin_type_from_network(get_network()) } -/// Given the chosen network, it returns bip44 cointype +/// Returns bip44 cointype of the provided network /// 1 0x80000001 Testnet (all coins) /// 394 0x8000018a CRO Crypto.com Chain pub fn get_bip44_coin_type_from_network(network: Network) -> u32 { diff --git a/chain-core/src/tx/data/address.rs b/chain-core/src/tx/data/address.rs index 9e35a785b..7af3e1017 100644 --- a/chain-core/src/tx/data/address.rs +++ b/chain-core/src/tx/data/address.rs @@ -13,7 +13,7 @@ use crate::init::address::{CroAddress, CroAddressError}; use bech32::{self, u5, FromBase32, ToBase32}; #[cfg(all(feature = "bech32", feature = "hex"))] -use crate::init::network::get_bech32_human_part; +use crate::init::network::{get_bech32_human_part_from_network, get_network, Network}; /// TODO: opaque types? type TreeRoot = H256; @@ -27,35 +27,30 @@ pub enum ExtendedAddr { OrTree(TreeRoot), } -#[cfg(all(feature = "bech32", feature = "hex"))] -impl ExtendedAddr { - fn get_string(&self, hash: TreeRoot) -> String { - let checked_data: Vec = hash.to_vec().to_base32(); - - bech32::encode(get_bech32_human_part(), checked_data) - .expect("bech32 should be successful in ExtendedAddr get_string") - } -} - #[cfg(all(feature = "bech32", feature = "hex"))] impl CroAddress for ExtendedAddr { - fn to_cro(&self) -> Result { + fn to_cro(&self, network: Network) -> Result { match self { ExtendedAddr::OrTree(hash) => { - let encoded = self.get_string(*hash); + let checked_data: Vec = hash.to_vec().to_base32(); + let encoded = bech32::encode( + get_bech32_human_part_from_network(network), + checked_data, + ) + .expect("bech32 encoding error"); Ok(encoded.to_string()) } } } - fn from_cro(encoded: &str) -> Result { + fn from_cro(encoded: &str, _network: Network) -> Result { bech32::decode(encoded) .map_err(|e| CroAddressError::Bech32Error(e.to_string())) - .and_then(|a| Vec::from_base32(&a.1).map_err(|_e| CroAddressError::ConvertError)) - .and_then(|src| { - let mut a: TreeRoot = [0 as u8; 32]; - a.copy_from_slice(&src.as_slice()); - Ok(ExtendedAddr::OrTree(a)) + .and_then(|decoded| Vec::from_base32(&decoded.1).map_err(|_e| CroAddressError::ConvertError)) + .and_then(|hash| { + let mut tree_root_hash: TreeRoot = [0 as u8; 32]; + tree_root_hash.copy_from_slice(&hash.as_slice()); + Ok(ExtendedAddr::OrTree(tree_root_hash)) }) } } @@ -63,7 +58,7 @@ impl CroAddress for ExtendedAddr { #[cfg(all(feature = "bech32", feature = "hex"))] impl fmt::Display for ExtendedAddr { fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { - write!(f, "{}", self.to_cro().unwrap()) + write!(f, "{}", self.to_cro(get_network()).unwrap()) } } @@ -72,7 +67,7 @@ impl FromStr for ExtendedAddr { type Err = CroAddressError; fn from_str(s: &str) -> Result { - ExtendedAddr::from_cro(s).map_err(|_e| CroAddressError::ConvertError) + ExtendedAddr::from_cro(s, get_network()).map_err(|_e| CroAddressError::ConvertError) } } @@ -82,19 +77,22 @@ mod test { #[test] fn should_be_correct_textual_address() { - let mut ar = [0; 32]; - ar.copy_from_slice( + let network = Network::Devnet; + + let mut tree_root_hash = [0; 32]; + tree_root_hash.copy_from_slice( &hex::decode("0e7c045110b8dbf29765047380898919c5cb56f400112233445566778899aabb") .unwrap(), ); - let a = ExtendedAddr::OrTree(ar); - let b = a.to_cro().unwrap(); + let extended_addr = ExtendedAddr::OrTree(tree_root_hash); + let bech32_addr = extended_addr.to_cro(network).unwrap(); assert_eq!( - b, + bech32_addr, "dcro1pe7qg5gshrdl99m9q3ecpzvfr8zuk4h5qqgjyv6y24n80zye42as88x8tg" ); - let c = ExtendedAddr::from_cro(&b).unwrap(); - assert_eq!(c, a); + + let restored_extended_addr = ExtendedAddr::from_cro(&bech32_addr, network).unwrap(); + assert_eq!(restored_extended_addr, extended_addr); } #[test] diff --git a/client-rpc/src/rpc/transaction_rpc.rs b/client-rpc/src/rpc/transaction_rpc.rs index 1bdbca187..223774cb6 100644 --- a/client-rpc/src/rpc/transaction_rpc.rs +++ b/client-rpc/src/rpc/transaction_rpc.rs @@ -82,6 +82,7 @@ mod test { use super::*; use chain_core::init::address::CroAddress; use chain_core::init::coin::Coin; + use chain_core::init::network::Network; use chain_core::tx::data::address::ExtendedAddr; use client_common::PrivateKey; @@ -95,6 +96,7 @@ mod test { let outputs = vec![TxOut::new( ExtendedAddr::from_cro( "dcro1zz30nheum6vnug3mjs0j4kw4w739tca8cuqae2kdjmt8suhv693qcs3qyn", + Network::Devnet, ) .unwrap(), Coin::new(750).unwrap(), diff --git a/client-rpc/src/rpc/wallet_rpc.rs b/client-rpc/src/rpc/wallet_rpc.rs index d5d6516cf..7d03150e5 100644 --- a/client-rpc/src/rpc/wallet_rpc.rs +++ b/client-rpc/src/rpc/wallet_rpc.rs @@ -132,7 +132,7 @@ where fn create_staking_address(&self, request: WalletRequest) -> Result { self.client .new_staking_address(&request.name, &request.passphrase) - .map(|extended_addr| extended_addr.to_string()) + .map(|staked_state_addr| staked_state_addr.to_string()) .map_err(to_rpc_error) } From 99a3ea6ec420107264da65566af64da3dc122867 Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Sun, 24 Nov 2019 22:52:17 +0000 Subject: [PATCH 2/2] Bump serde_json from 1.0.41 to 1.0.42 Bumps [serde_json](https://github.com/serde-rs/json) from 1.0.41 to 1.0.42. - [Release notes](https://github.com/serde-rs/json/releases) - [Commits](https://github.com/serde-rs/json/compare/v1.0.41...v1.0.42) Signed-off-by: dependabot-preview[bot] --- Cargo.lock | 24 ++++++++++++------------ client-core/Cargo.toml | 2 +- client-rpc/Cargo.toml | 2 +- 3 files changed, 14 insertions(+), 14 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 72a2e7dd1..ab4fda5e4 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -343,7 +343,7 @@ dependencies = [ "secp256k1zkp 0.13.0 (git+https://github.com/crypto-com/rust-secp256k1-zkp.git?rev=8b9a38b870a7759fcdbd4a5d435b5ba873c70afd)", "serde 1.0.102 (registry+https://github.com/rust-lang/crates.io-index)", "serde_derive 1.0.102 (registry+https://github.com/rust-lang/crates.io-index)", - "serde_json 1.0.41 (registry+https://github.com/rust-lang/crates.io-index)", + "serde_json 1.0.42 (registry+https://github.com/rust-lang/crates.io-index)", "sha3 0.8.2 (registry+https://github.com/rust-lang/crates.io-index)", "starling 3.1.2 (registry+https://github.com/rust-lang/crates.io-index)", "structopt 0.3.5 (registry+https://github.com/rust-lang/crates.io-index)", @@ -364,7 +364,7 @@ dependencies = [ "quickcheck 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", "secp256k1zkp 0.13.0 (git+https://github.com/crypto-com/rust-secp256k1-zkp.git?rev=8b9a38b870a7759fcdbd4a5d435b5ba873c70afd)", "serde 1.0.102 (registry+https://github.com/rust-lang/crates.io-index)", - "serde_json 1.0.41 (registry+https://github.com/rust-lang/crates.io-index)", + "serde_json 1.0.42 (registry+https://github.com/rust-lang/crates.io-index)", "sgx_tstd 1.0.9 (git+https://github.com/baidu/rust-sgx-sdk.git?rev=v1.0.9)", "sha2 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", "static_assertions 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)", @@ -480,7 +480,7 @@ dependencies = [ "secp256k1zkp 0.13.0 (git+https://github.com/crypto-com/rust-secp256k1-zkp.git?rev=8b9a38b870a7759fcdbd4a5d435b5ba873c70afd)", "secstr 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)", "serde 1.0.102 (registry+https://github.com/rust-lang/crates.io-index)", - "serde_json 1.0.41 (registry+https://github.com/rust-lang/crates.io-index)", + "serde_json 1.0.42 (registry+https://github.com/rust-lang/crates.io-index)", "sled 0.29.2 (registry+https://github.com/rust-lang/crates.io-index)", "tendermint 0.10.0 (git+https://github.com/crypto-com/tendermint-rs.git?rev=2b2e5650c5f1e62cd055cc1d3f51dee4ab427403)", "websocket 0.24.0 (registry+https://github.com/rust-lang/crates.io-index)", @@ -515,7 +515,7 @@ dependencies = [ "secp256k1zkp 0.13.0 (git+https://github.com/crypto-com/rust-secp256k1-zkp.git?rev=8b9a38b870a7759fcdbd4a5d435b5ba873c70afd)", "secstr 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)", "serde 1.0.102 (registry+https://github.com/rust-lang/crates.io-index)", - "serde_json 1.0.41 (registry+https://github.com/rust-lang/crates.io-index)", + "serde_json 1.0.42 (registry+https://github.com/rust-lang/crates.io-index)", "tendermint 0.10.0 (git+https://github.com/crypto-com/tendermint-rs.git?rev=2b2e5650c5f1e62cd055cc1d3f51dee4ab427403)", "tiny-bip39 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)", "tokio 0.1.22 (registry+https://github.com/rust-lang/crates.io-index)", @@ -564,7 +564,7 @@ dependencies = [ "parity-scale-codec 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)", "secstr 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)", "serde 1.0.102 (registry+https://github.com/rust-lang/crates.io-index)", - "serde_json 1.0.41 (registry+https://github.com/rust-lang/crates.io-index)", + "serde_json 1.0.42 (registry+https://github.com/rust-lang/crates.io-index)", "structopt 0.3.5 (registry+https://github.com/rust-lang/crates.io-index)", "tiny-bip39 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)", "zeroize 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)", @@ -725,7 +725,7 @@ dependencies = [ "quest 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)", "secstr 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)", "serde 1.0.102 (registry+https://github.com/rust-lang/crates.io-index)", - "serde_json 1.0.41 (registry+https://github.com/rust-lang/crates.io-index)", + "serde_json 1.0.42 (registry+https://github.com/rust-lang/crates.io-index)", "structopt 0.3.5 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -1317,7 +1317,7 @@ dependencies = [ "hyper 0.10.16 (registry+https://github.com/rust-lang/crates.io-index)", "serde 1.0.102 (registry+https://github.com/rust-lang/crates.io-index)", "serde_derive 1.0.102 (registry+https://github.com/rust-lang/crates.io-index)", - "serde_json 1.0.41 (registry+https://github.com/rust-lang/crates.io-index)", + "serde_json 1.0.42 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -1331,7 +1331,7 @@ dependencies = [ "jsonrpc-pubsub 14.0.3 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", "serde 1.0.102 (registry+https://github.com/rust-lang/crates.io-index)", - "serde_json 1.0.41 (registry+https://github.com/rust-lang/crates.io-index)", + "serde_json 1.0.42 (registry+https://github.com/rust-lang/crates.io-index)", "url 1.7.2 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -1344,7 +1344,7 @@ dependencies = [ "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", "serde 1.0.102 (registry+https://github.com/rust-lang/crates.io-index)", "serde_derive 1.0.102 (registry+https://github.com/rust-lang/crates.io-index)", - "serde_json 1.0.41 (registry+https://github.com/rust-lang/crates.io-index)", + "serde_json 1.0.42 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -2423,7 +2423,7 @@ dependencies = [ [[package]] name = "serde_json" -version = "1.0.41" +version = "1.0.42" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "itoa 0.4.4 (registry+https://github.com/rust-lang/crates.io-index)", @@ -2794,7 +2794,7 @@ dependencies = [ "prost-amino-derive 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", "rand_os 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", "serde 1.0.102 (registry+https://github.com/rust-lang/crates.io-index)", - "serde_json 1.0.41 (registry+https://github.com/rust-lang/crates.io-index)", + "serde_json 1.0.42 (registry+https://github.com/rust-lang/crates.io-index)", "sha2 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", "signatory 0.12.0 (registry+https://github.com/rust-lang/crates.io-index)", "signatory-dalek 0.12.0 (registry+https://github.com/rust-lang/crates.io-index)", @@ -3727,7 +3727,7 @@ dependencies = [ "checksum serde 1.0.102 (registry+https://github.com/rust-lang/crates.io-index)" = "0c4b39bd9b0b087684013a792c59e3e07a46a01d2322518d8a1104641a0b1be0" "checksum serde_bytes 0.11.2 (registry+https://github.com/rust-lang/crates.io-index)" = "45af0182ff64abaeea290235eb67da3825a576c5d53e642c4d5b652e12e6effc" "checksum serde_derive 1.0.102 (registry+https://github.com/rust-lang/crates.io-index)" = "ca13fc1a832f793322228923fbb3aba9f3f44444898f835d31ad1b74fa0a2bf8" -"checksum serde_json 1.0.41 (registry+https://github.com/rust-lang/crates.io-index)" = "2f72eb2a68a7dc3f9a691bfda9305a1c017a6215e5a4545c258500d2099a37c2" +"checksum serde_json 1.0.42 (registry+https://github.com/rust-lang/crates.io-index)" = "1a3351dcbc1f067e2c92ab7c3c1f288ad1a4cffc470b5aaddb4c2e0a3ae80043" "checksum sgx_alloc 1.0.9 (git+https://github.com/baidu/rust-sgx-sdk.git?rev=v1.0.9)" = "" "checksum sgx_backtrace_sys 1.0.9 (git+https://github.com/baidu/rust-sgx-sdk.git?rev=v1.0.9)" = "" "checksum sgx_build_helper 0.1.0 (git+https://github.com/baidu/rust-sgx-sdk.git?rev=v1.0.9)" = "" diff --git a/client-core/Cargo.toml b/client-core/Cargo.toml index faf8889b4..ba8273b39 100644 --- a/client-core/Cargo.toml +++ b/client-core/Cargo.toml @@ -26,7 +26,7 @@ rustls = {version = "0.16", features = ["dangerous_configuration"]} yasna = { version = "0.3.0", features = ["bit-vec", "num-bigint", "chrono"] } bit-vec = "0.6.1" num-bigint = "0.2.3" -serde_json = "1.0.41" +serde_json = "1.0.42" uuid = { version = "0.8.1", features = ["v4"] } websocket = "0.24.0" jsonrpc-core = "14.0" diff --git a/client-rpc/Cargo.toml b/client-rpc/Cargo.toml index 054ec05d2..63e37d55c 100644 --- a/client-rpc/Cargo.toml +++ b/client-rpc/Cargo.toml @@ -11,7 +11,7 @@ chain-core = { path = "../chain-core" } client-common = { path = "../client-common" } client-core = { path = "../client-core" } client-network = { path= "../client-network"} -serde_json = "1.0.41" +serde_json = "1.0.42" jsonrpc-http-server = "14.0" jsonrpc-core = "14.0" jsonrpc-core-client = "14.0"