diff --git a/Cargo.lock b/Cargo.lock
index 65a2666f9..949d8bb0d 100644
--- a/Cargo.lock
+++ b/Cargo.lock
@@ -939,6 +939,12 @@ dependencies = [
"percent-encoding",
]
+[[package]]
+name = "fuchsia-cprng"
+version = "0.1.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "a06f77d526c1a601b7c4cdd98f54b5eaabffc14d5f2f0296febdc7f357c6d3ba"
+
[[package]]
name = "fuchsia-zircon"
version = "0.3.3"
@@ -1020,6 +1026,12 @@ dependencies = [
"slab",
]
+[[package]]
+name = "gcc"
+version = "0.3.55"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "8f5f3913fa0bfe7ee1fd8248b6b9f42a5af4b9d65ec2dd2c3c26132b950ecfc2"
+
[[package]]
name = "generic-array"
version = "0.12.4"
@@ -1938,6 +1950,29 @@ dependencies = [
"proc-macro2",
]
+[[package]]
+name = "rand"
+version = "0.3.23"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "64ac302d8f83c0c1974bf758f6b041c6c8ada916fbb44a609158ca8b064cc76c"
+dependencies = [
+ "libc",
+ "rand 0.4.6",
+]
+
+[[package]]
+name = "rand"
+version = "0.4.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "552840b97013b1a26992c11eac34bdd778e464601a4c2054b5f0bff7c6761293"
+dependencies = [
+ "fuchsia-cprng",
+ "libc",
+ "rand_core 0.3.1",
+ "rdrand",
+ "winapi 0.3.9",
+]
+
[[package]]
name = "rand"
version = "0.7.3"
@@ -1983,6 +2018,21 @@ dependencies = [
"rand_core 0.6.3",
]
+[[package]]
+name = "rand_core"
+version = "0.3.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "7a6fdeb83b075e8266dcc8762c22776f6877a63111121f5f8c7411e5be7eed4b"
+dependencies = [
+ "rand_core 0.4.2",
+]
+
+[[package]]
+name = "rand_core"
+version = "0.4.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "9c33a3c44ca05fa6f1807d8e6743f3824e8509beca625669633be0acbdf509dc"
+
[[package]]
name = "rand_core"
version = "0.5.1"
@@ -2044,6 +2094,15 @@ dependencies = [
"num_cpus",
]
+[[package]]
+name = "rdrand"
+version = "0.4.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "678054eb77286b51581ba43620cc911abf02758c91f93f479767aed0f90458b2"
+dependencies = [
+ "rand_core 0.3.1",
+]
+
[[package]]
name = "redox_syscall"
version = "0.2.10"
@@ -2203,12 +2262,31 @@ dependencies = [
"smallvec",
]
+[[package]]
+name = "rust-crypto"
+version = "0.2.36"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f76d05d3993fd5f4af9434e8e436db163a12a9d40e1a58a726f27a01dfd12a2a"
+dependencies = [
+ "gcc",
+ "libc",
+ "rand 0.3.23",
+ "rustc-serialize",
+ "time 0.1.44",
+]
+
[[package]]
name = "rustc-demangle"
version = "0.1.21"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "7ef03e0a2b150c7a90d01faf6254c9c48a41e95fb2a8c2ac1c6f0d2b9aefc342"
+[[package]]
+name = "rustc-serialize"
+version = "0.3.24"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "dcf128d1287d2ea9d80910b5f1120d0b8eede3fbf1abe91c40d39ea7d51e6fda"
+
[[package]]
name = "rustc_version"
version = "0.2.3"
@@ -2649,6 +2727,7 @@ dependencies = [
"rstest",
"rstest_reuse",
"rusqlite",
+ "rust-crypto",
"secp256k1",
"serde",
"serde_derive",
diff --git a/Cargo.toml b/Cargo.toml
index b4ecf0fc5..2b975031d 100644
--- a/Cargo.toml
+++ b/Cargo.toml
@@ -14,7 +14,7 @@ resolver = "2"
edition = "2021"
[profile.release]
-debug = true
+debug = false
[lib]
name = "blockstack_lib"
diff --git a/clarity/src/vm/types/mod.rs b/clarity/src/vm/types/mod.rs
index 8ec216db9..023ca950f 100644
--- a/clarity/src/vm/types/mod.rs
+++ b/clarity/src/vm/types/mod.rs
@@ -1134,6 +1134,8 @@ impl StandardPrincipalData {
impl fmt::Display for StandardPrincipalData {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
let c32_str = self.to_address();
+ // f.write_str(c32_str.as_str()).unwrap();
+ // Ok(())
write!(f, "{}", c32_str)
}
}
diff --git a/stacks-common/Cargo.toml b/stacks-common/Cargo.toml
index bdfb96d59..0100eb324 100644
--- a/stacks-common/Cargo.toml
+++ b/stacks-common/Cargo.toml
@@ -31,6 +31,7 @@ slog-term = "2.6.0"
slog-json = { version = "2.3.0", optional = true }
chrono = "0.4.19"
libc = "0.2.82"
+rust-crypto = "0.2.36"
[dependencies.serde_json]
version = "1.0"
@@ -68,7 +69,7 @@ slog_json = ["slog-json"]
testing = []
[target.'cfg(all(any(target_arch = "x86_64", target_arch = "x86", target_arch = "aarch64"), not(target_env = "msvc")))'.dependencies]
-sha2 = { version = "0.10", features = ["asm"] }
+sha2 = { version = "0.10.2", features = ["asm"] }
[target.'cfg(any(not(any(target_arch = "x86_64", target_arch = "x86", target_arch = "aarch64")), target_env = "msvc"))'.dependencies]
-sha2 = { version = "0.10" }
\ No newline at end of file
+sha2 = { version = "0.10.2" }
\ No newline at end of file
diff --git a/stacks-common/src/address/c32.rs b/stacks-common/src/address/c32.rs
index 1978a661a..0f901b453 100644
--- a/stacks-common/src/address/c32.rs
+++ b/stacks-common/src/address/c32.rs
@@ -14,11 +14,16 @@
// You should have received a copy of the GNU General Public License
// along with this program. If not, see .
+use std::borrow::{Borrow, BorrowMut};
+use std::collections::HashMap;
use super::Error;
use sha2::Digest;
use sha2::Sha256;
use std::convert::TryFrom;
+use std::ops::Add;
+use std::sync::{Arc, Mutex, MutexGuard, Once};
+use libc::wchar_t;
const C32_CHARACTERS: &[u8; 32] = b"0123456789ABCDEFGHJKMNPQRSTVWXYZ";
@@ -289,7 +294,19 @@ fn c32_decode_ascii(input_str: &str) -> Result, Error> {
}
fn double_sha256_checksum(data: &[u8]) -> Vec {
- let tmp = Sha256::digest(Sha256::digest(data));
+ use crypto::digest::Digest;
+ use crypto::sha2::Sha256;
+ let mut tmp = vec![0u8; 32];
+ {
+ let mut d1 = Sha256::new();
+ d1.input(data);
+ d1.result(&mut tmp);
+ }
+ {
+ let mut d2 = Sha256::new();
+ d2.input(&tmp);
+ d2.result(&mut tmp);
+ }
tmp[0..4].to_vec()
}
@@ -363,13 +380,40 @@ pub fn c32_address_decode(c32_address_str: &str) -> Result<(u8, Vec), Error>
}
}
+static mut c32_address_cache: Option>> = None;
+static INIT: Once = Once::new();
+
pub fn c32_address(version: u8, data: &[u8]) -> Result {
- let c32_string = c32_check_encode(version, data)?;
- Ok(format!("S{}", c32_string))
+ INIT.call_once(|| {
+ unsafe {
+ *c32_address_cache.borrow_mut() = Some(Mutex::new(HashMap::new()))
+ }
+ });
+ let mut key = String::new();
+ key.push(version as char);
+ for &u in data {
+ key.push(u as char)
+ }
+ let mut cache = unsafe {
+ c32_address_cache.as_ref().unwrap().lock().expect("should be able to lock global cache")
+ };
+ let r = cache.get(&key[..]);
+ match r {
+ Some(s) => {
+ Ok(s.clone())
+ }
+ None => {
+ let c32_string = "S".to_string().add(c32_check_encode(version, data)?.as_str());
+ cache.insert(key, c32_string.clone());
+ Ok(c32_string)
+ }
+ }
}
#[cfg(test)]
mod test {
+ use std::time::SystemTime;
+ use libc::printf;
use super::super::c32_old::{
c32_address as c32_address_old, c32_address_decode as c32_address_decode_old,
};
@@ -478,6 +522,21 @@ mod test {
}
}
+ #[test]
+ fn test_encode() {
+ let start = SystemTime::now();
+ for r in 0..10000 {
+ // c32_check_encode(1, &[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1]).unwrap();
+ Sha256::digest(&[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1]);
+ // use crypto::digest::Digest;
+ // let mut digest = crypto::sha2::Sha256::new();
+ // let mut out: Vec = vec![0; 32];
+ // digest.input(&[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1]);
+ // digest.result(&mut out);
+ }
+ println!("Costs: {}", start.elapsed().unwrap().as_millis())
+ }
+
#[test]
fn test_simple() {
let hex_strings = &[