├── .gitignore ├── src ├── lib.rs ├── traits.rs ├── main.rs ├── utils.rs ├── pubkey.rs ├── checksum.rs └── summators.rs ├── images └── truncator_logo.png ├── paper └── truncator_short_paper.pdf ├── Cargo.toml ├── graph-creator.py ├── README.md ├── graphdata ├── benches └── mining.rs ├── LICENSE └── Cargo.lock /.gitignore: -------------------------------------------------------------------------------- 1 | target 2 | -------------------------------------------------------------------------------- /src/lib.rs: -------------------------------------------------------------------------------- 1 | pub mod summators; 2 | pub mod traits; 3 | pub mod utils; 4 | -------------------------------------------------------------------------------- /images/truncator_logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MystenLabs/truncator/HEAD/images/truncator_logo.png -------------------------------------------------------------------------------- /paper/truncator_short_paper.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MystenLabs/truncator/HEAD/paper/truncator_short_paper.pdf -------------------------------------------------------------------------------- /src/traits.rs: -------------------------------------------------------------------------------- 1 | pub trait ByteStatisticsSummator { 2 | /// Output the sum of any summation strategy function over a bytes slice. 3 | fn sum(&self, bytes: &[u8]) -> u32; 4 | } 5 | -------------------------------------------------------------------------------- /src/main.rs: -------------------------------------------------------------------------------- 1 | #![allow(dead_code)] 2 | 3 | use fastcrypto::secp256k1; 4 | 5 | mod checksum; 6 | mod pubkey; 7 | 8 | fn main() { 9 | #[cfg(feature = "checksum")] 10 | { 11 | checksum::checksum(); 12 | } 13 | 14 | #[cfg(feature = "pubkey")] 15 | { 16 | pubkey::pubkeymine(); 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /src/utils.rs: -------------------------------------------------------------------------------- 1 | use crate::traits::ByteStatisticsSummator; 2 | use fastcrypto::hash::{Blake3, HashFunction}; 3 | use std::collections::HashMap; 4 | 5 | pub fn summator_statistics( 6 | msg: &str, 7 | retries: u32, 8 | summator: &dyn ByteStatisticsSummator, 9 | hashmap: &mut HashMap, 10 | ) { 11 | let msg_digest = Blake3::digest(msg.as_bytes()); 12 | for i in 0..retries { 13 | let msg_digest_plus_i = [msg_digest.as_ref(), &i.to_le_bytes()].concat(); 14 | let final_digest = Blake3::digest(&msg_digest_plus_i); 15 | let sum = summator.sum(final_digest.as_ref()); 16 | hashmap.insert(sum, **hashmap.get(&sum).get_or_insert(&0) + 1); 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /Cargo.toml: -------------------------------------------------------------------------------- 1 | [package] 2 | name = "truncator" 3 | version = "0.1.0" 4 | edition = "2021" 5 | license = "Apache-2.0" 6 | authors = ["Kostas Chalkias "] 7 | publish = ["crates-io"] 8 | description = "Crypto Truncator paper utilities" 9 | repository = "https://github.com/MystenLabs/truncator" 10 | 11 | [dependencies] 12 | fastcrypto = "0.1.3" 13 | rand = { version = "0.8.5", features = ["std"] } 14 | rust_secp256k1 = { version = "0.24.1", package = "secp256k1", features = ["recovery", "rand-std", "bitcoin_hashes", "global-context"] } 15 | 16 | [dev-dependencies] 17 | criterion = "0.4.0" 18 | signature = { version = "1.6.4", features = ["rand-preview"] } 19 | 20 | [features] 21 | pubkey = [] 22 | checksum = [] 23 | 24 | [[bench]] 25 | name = "mining" 26 | harness = false 27 | -------------------------------------------------------------------------------- /src/pubkey.rs: -------------------------------------------------------------------------------- 1 | use crate::secp256k1::Secp256k1KeyPair; 2 | use fastcrypto::traits::KeyPair; 3 | use rand::{rngs::StdRng, SeedableRng}; 4 | use std::time::Instant; 5 | 6 | const FIXED_BYTES_NUM: usize = 3; 7 | 8 | pub fn pubkeymine() { 9 | let mut count: u64 = rand::random(); 10 | 11 | let now = Instant::now(); 12 | 13 | loop { 14 | count += 1; 15 | 16 | let mut rng = StdRng::seed_from_u64(count); 17 | 18 | let newkey = Secp256k1KeyPair::generate(&mut rng); 19 | 20 | let newbytes = newkey.public().pubkey.serialize(); 21 | 22 | if newbytes[1..=FIXED_BYTES_NUM] == vec![100; FIXED_BYTES_NUM] { 23 | println!("{:?}", newbytes); 24 | println!("{:?}", &newbytes[1..3]); 25 | break; 26 | } 27 | } 28 | 29 | let elapsed = now.elapsed(); 30 | println!("Elapsed: {:.2?}", elapsed); 31 | } 32 | -------------------------------------------------------------------------------- /src/checksum.rs: -------------------------------------------------------------------------------- 1 | use std::collections::HashMap; 2 | use truncator::summators::W16Summator; 3 | use truncator::utils::summator_statistics; 4 | 5 | pub fn checksum() { 6 | let msg = "truncator"; 7 | 8 | let mut hashmap: HashMap = HashMap::new(); 9 | // Sometimes we prefer initializing hashmaps with zeros per sum for easier spreadsheet import. 10 | // for i in 0..1024 { 11 | // hashmap.insert(i as u32, 0); 12 | // } 13 | // Works with any summator implementation required for Truncator testing. 14 | let summator = W16Summator(); 15 | 16 | // compute sum statistics for the selected summator. 17 | summator_statistics(msg, 1_000_000, &summator, &mut hashmap); 18 | 19 | // print results, then you can copy copy-paste to spreadsheet for data analytics + charts. 20 | for (k, x) in hashmap { 21 | println!("{}, {}", k, x); 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /graph-creator.py: -------------------------------------------------------------------------------- 1 | import matplotlib as mpl 2 | mpl.use('pgf') 3 | from matplotlib import pyplot as plt 4 | import matplotlib.ticker as ticker 5 | 6 | 7 | sums = [] 8 | frequency = [] 9 | mydata = [] 10 | file1 = open('graphdata', 'r') 11 | 12 | while True: 13 | line = file1.readline() 14 | if not line: 15 | break 16 | newelems = line.strip().split(",") 17 | mydata.append([int((newelems[0])),int((newelems[1]))]) 18 | 19 | file1.close() 20 | 21 | sorteddata = sorted(mydata,key=lambda x: (x[0],x[1])) 22 | 23 | for elem in sorteddata: 24 | sums.append(elem[0]) 25 | frequency.append(elem[1]) 26 | 27 | plt.rc('text', usetex=True) 28 | plt.rc('font', family='serif', size='10') 29 | fig, ax1 = plt.subplots(figsize=(3.93, 2.4)) #set for IEEE 30 | 31 | ax1.plot(sums,frequency,linewidth=1) 32 | ax1.set_xlabel('Frequency') 33 | ax1.set_ylabel('Sum') 34 | plt.tight_layout() #prevent cut-off labels 35 | #plt.show() 36 | plt.savefig('wots.pgf') -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # truncator 2 | 3 |

4 | 5 |

6 | 7 | `truncator` is an experimental benchmarking library exploring compression techniques for cryptographic outputs via 8 | brute-force mining. It is part of the joint research project entitled "Truncator: Time-space Tradeoff of Cryptographic 9 | Primitives" by Foteini Baldimtsi (GMU & Mysten Labs), Konstantinos Chalkias (Mysten Labs), 10 | Panagiotis Chatzigiannis (Visa Research), and Mahimna Kelkar (Cornell University). 11 | 12 | ### Paper 13 | A 10-pager short paper is available here: [Truncator short paper](/paper/truncator_short_paper.pdf "Truncator: Time-space Tradeoff of Cryptographic 14 | Primitives") 15 | 16 | ### Abstract 17 | 18 | We're presenting mining-based techniques to reduce the size of various cryptographic outputs without loss of security. 19 | Our approach can be generalized for multiple primitives, such as key generation, signing, hashing and encryption 20 | schemes, by introducing a brute-forcing step to provers/senders aiming at compressing submitted cryptographic material. 21 | As a result, in systems that we can tolerate sender's work to be more demanding and time-consuming, 22 | we manage to optimize on verification, payload size and storage cost, especially when: 23 | - receivers have limited resources (i.e. mobile, IoT); 24 | - storage or data-size is financially expensive (i.e. blockchains, cloud storage and ingress cost); 25 | - multiple recipients perform verification/decryption/lookup (i.e. blockchains, TLS certs, IPFS lookups). 26 | 27 | 28 | Interestingly, mining can result in record-size cryptographic outputs, and we show that 5\%-12\% shorter hash digests 29 | and signatures are practically feasible even with commodity hardware. Obviously, the first thing that comes to mind is 30 | compressing addresses and transaction signatures in order to pay less gas fees in blockchain applications, but in fact 31 | even traditional TLS certificates and public keys, which are computed once and reused in every new connection, can be 32 | slightly compressed with this _mining_ trick without compromising security. The effects of 33 | _compressing once - then reuse_ at mass scale can be economically profitable in the long run for both the Web2 and 34 | Web3 ecosystems. 35 | 36 | Our paradigm relies on a brute-force search operation in order to craft the primitive's output such that it fits into 37 | fewer bytes, while the _missing_ fixed bytes are implied by the system parameters and omitted from the actual 38 | communication. While such compression requires computational effort depending on the level of compression, this cost is 39 | only paid at the source (typically in blockchains consisting of a single party) which is rewarded by lowered transaction 40 | fees, and the benefits of the compression are enjoyed by the whole ecosystem. As a starting point, we show how our 41 | paradigm applies to some basic primitives (commonly used in blockchain applications), and show how security is preserved 42 | using a bit security framework. Surprisingly, we also identified cases where wise mining strategies require 43 | proportionally less effort than naive brute-forcing, an example is WOTS (and inherently SPHINCS) post-quantum signatures 44 | where the target goal is to remove or compress the Winternitz checksum part. Moreover, we evaluate our approach for 45 | several primitives based on different levels of compression which concretely demonstrates the benefits (both in terms 46 | of financial cost and storage) if adopted by the community. 47 | 48 | Finally, as this work is inspired by the recent unfortunate buggy _gas golfing_ software in Ethereum, where weakly 49 | implemented functions incorrectly generated addresses (hashes) with _prefixed zeroes for gas optimization_, resulting in 50 | millions of losses, we expect our _Truncator_ approach to be naturally applied in the blockchain space as a secure 51 | solution to more succinct transactions, addresses and states. 52 | -------------------------------------------------------------------------------- /src/summators.rs: -------------------------------------------------------------------------------- 1 | use crate::traits::ByteStatisticsSummator; 2 | 3 | // const flags used to unset bits of a byte. 4 | const FIRST_4_BITS_SET: u8 = 0b11110000u8; 5 | const LAST_4_BITS_SET: u8 = 0b00001111u8; 6 | const FIRST_2_BITS_SET: u8 = 0b11000000u8; 7 | const SECOND_2_BITS_SET: u8 = 0b00110000u8; 8 | const THIRD_2_BITS_SET: u8 = 0b00001100u8; 9 | const LAST_2_BITS_SET: u8 = 0b00000011u8; 10 | 11 | /// Get the num of set bits of a slice, which simulates Lamport+ (Winternitz sum for w = 2). 12 | pub struct W2Summator(); 13 | 14 | /// Get the sum of a slice at two bits granularity, which simulates Winternitz sum for w = 4. 15 | pub struct W4Summator(); 16 | 17 | /// Get the sum of a slice at half byte granularity, which simulates Winternitz sum for w = 16. 18 | pub struct W16Summator(); 19 | 20 | /// Get the sum of a slice at single byte granularity, which simulates Winternitz sum for w = 256. 21 | pub struct W256Summator(); 22 | 23 | /// Get the num of "00" or "11" in a slice. 24 | pub struct Same2BitSummator(); 25 | 26 | /// Get the num of "0000" or "1111" in a slice. 27 | pub struct Same4BitSummator(); 28 | 29 | /// Get the num of "0000_0000" or "1111_1111" bytes in a slice. 30 | pub struct Same8BitSummator(); 31 | 32 | impl ByteStatisticsSummator for W2Summator { 33 | fn sum(&self, bytes: &[u8]) -> u32 { 34 | bytes.iter().map(|b| b.count_ones()).sum() 35 | // The above is equivalent to this: 36 | // let mut sum = 0; 37 | // for b in bytes { 38 | // sum += b.count_ones() 39 | // } 40 | // sum 41 | } 42 | } 43 | 44 | impl ByteStatisticsSummator for W4Summator { 45 | fn sum(&self, bytes: &[u8]) -> u32 { 46 | bytes 47 | .iter() 48 | .map(|b| { 49 | ((b >> 6) 50 | + ((b & SECOND_2_BITS_SET) >> 4) 51 | + ((b & THIRD_2_BITS_SET) >> 2) 52 | + (b & LAST_2_BITS_SET)) as u32 53 | }) 54 | .sum() 55 | } 56 | } 57 | 58 | impl ByteStatisticsSummator for W16Summator { 59 | fn sum(&self, bytes: &[u8]) -> u32 { 60 | bytes 61 | .iter() 62 | .map(|b| ((b >> 4) + (b & LAST_4_BITS_SET)) as u32) 63 | .sum() 64 | // The above is equivalent to this: 65 | // let mut sum = 0; 66 | // for b in bytes { 67 | // let left = (b >> 4) as u32; 68 | // let right = (b << FOUR_LAST_BITS) as u32; 69 | // sum += left + right; 70 | // } 71 | // sum 72 | } 73 | } 74 | 75 | impl ByteStatisticsSummator for W256Summator { 76 | fn sum(&self, bytes: &[u8]) -> u32 { 77 | bytes.iter().map(|b| *b as u32).sum() 78 | } 79 | } 80 | 81 | impl ByteStatisticsSummator for Same2BitSummator { 82 | fn sum(&self, bytes: &[u8]) -> u32 { 83 | bytes 84 | .iter() 85 | .map(|b| { 86 | // TODO: this can be better optimized via OR statements. 87 | let mut sum = 0; 88 | let b0 = (b & FIRST_2_BITS_SET).count_ones(); 89 | let b1 = (b & SECOND_2_BITS_SET).count_ones(); 90 | let b2 = (b & THIRD_2_BITS_SET).count_ones(); 91 | let b3 = (b & LAST_2_BITS_SET).count_ones(); 92 | 93 | if b0 == 0 || b0 == 2 { 94 | sum += 1; 95 | } 96 | if b1 == 0 || b1 == 2 { 97 | sum += 1; 98 | } 99 | if b2 == 0 || b2 == 2 { 100 | sum += 1; 101 | } 102 | if b3 == 0 || b3 == 2 { 103 | sum += 1; 104 | } 105 | sum 106 | }) 107 | .sum() 108 | } 109 | } 110 | 111 | impl ByteStatisticsSummator for Same4BitSummator { 112 | fn sum(&self, bytes: &[u8]) -> u32 { 113 | bytes 114 | .iter() 115 | .map(|b| { 116 | let mut sum = 0; 117 | let b0 = (b & FIRST_4_BITS_SET).count_ones(); 118 | let b1 = (b & LAST_4_BITS_SET).count_ones(); 119 | 120 | if b0 == 0 || b0 == 4 { 121 | sum += 1; 122 | } 123 | if b1 == 0 || b1 == 4 { 124 | sum += 1; 125 | } 126 | sum 127 | }) 128 | .sum() 129 | } 130 | } 131 | 132 | impl ByteStatisticsSummator for Same8BitSummator { 133 | fn sum(&self, bytes: &[u8]) -> u32 { 134 | bytes 135 | .iter() 136 | .map(|b| if *b == 0 || *b == 255 { 1 } else { 0 }) 137 | .sum() 138 | } 139 | } 140 | -------------------------------------------------------------------------------- /graphdata: -------------------------------------------------------------------------------- 1 | 410, 1720 2 | 530, 4289 3 | 569, 560 4 | 540, 2882 5 | 400, 1010 6 | 357, 49 7 | 312, 1 8 | 419, 2733 9 | 609, 25 10 | 306, 1 11 | 512, 7067 12 | 511, 7727 13 | 342, 13 14 | 379, 267 15 | 368, 102 16 | 434, 4919 17 | 428, 3886 18 | 481, 10937 19 | 425, 3549 20 | 392, 651 21 | 361, 50 22 | 346, 12 23 | 329, 4 24 | 430, 4212 25 | 574, 419 26 | 603, 34 27 | 333, 2 28 | 524, 5501 29 | 424, 3433 30 | 585, 206 31 | 455, 8549 32 | 510, 7713 33 | 572, 504 34 | 591, 109 35 | 381, 279 36 | 332, 3 37 | 397, 893 38 | 593, 108 39 | 526, 5011 40 | 552, 1628 41 | 541, 2850 42 | 395, 756 43 | 453, 8145 44 | 472, 10662 45 | 602, 47 46 | 562, 939 47 | 462, 9776 48 | 480, 10759 49 | 393, 680 50 | 583, 227 51 | 604, 33 52 | 594, 85 53 | 502, 8966 54 | 497, 9695 55 | 320, 1 56 | 606, 28 57 | 355, 34 58 | 394, 729 59 | 529, 4532 60 | 613, 12 61 | 319, 1 62 | 578, 305 63 | 348, 19 64 | 565, 783 65 | 487, 10712 66 | 486, 10605 67 | 374, 169 68 | 305, 1 69 | 387, 400 70 | 507, 8179 71 | 539, 3053 72 | 334, 4 73 | 624, 2 74 | 327, 3 75 | 442, 6425 76 | 469, 10163 77 | 516, 6699 78 | 337, 6 79 | 538, 3091 80 | 423, 3259 81 | 570, 512 82 | 636, 1 83 | 509, 8040 84 | 501, 9087 85 | 482, 10609 86 | 404, 1351 87 | 615, 16 88 | 471, 10472 89 | 360, 50 90 | 349, 17 91 | 633, 1 92 | 399, 1022 93 | 584, 201 94 | 432, 4645 95 | 463, 9675 96 | 514, 6935 97 | 588, 142 98 | 353, 29 99 | 375, 199 100 | 483, 10840 101 | 352, 31 102 | 408, 1629 103 | 522, 5701 104 | 437, 5375 105 | 493, 10035 106 | 496, 9766 107 | 409, 1746 108 | 459, 8954 109 | 506, 8312 110 | 575, 382 111 | 597, 64 112 | 405, 1389 113 | 343, 11 114 | 450, 7773 115 | 448, 7234 116 | 596, 71 117 | 358, 40 118 | 630, 3 119 | 528, 4690 120 | 534, 3676 121 | 590, 121 122 | 439, 5824 123 | 389, 513 124 | 475, 10801 125 | 347, 19 126 | 533, 3909 127 | 489, 10513 128 | 492, 10212 129 | 447, 7275 130 | 535, 3684 131 | 605, 37 132 | 637, 1 133 | 532, 3974 134 | 531, 4274 135 | 376, 206 136 | 557, 1217 137 | 416, 2365 138 | 520, 6021 139 | 415, 2343 140 | 339, 3 141 | 377, 209 142 | 505, 8595 143 | 515, 6920 144 | 431, 4357 145 | 456, 8619 146 | 631, 4 147 | 608, 27 148 | 441, 6220 149 | 499, 9422 150 | 542, 2667 151 | 457, 8992 152 | 561, 978 153 | 545, 2344 154 | 406, 1444 155 | 525, 5073 156 | 321, 1 157 | 470, 10524 158 | 388, 490 159 | 595, 91 160 | 307, 1 161 | 592, 114 162 | 458, 9043 163 | 640, 1 164 | 547, 2063 165 | 354, 31 166 | 382, 290 167 | 383, 360 168 | 589, 135 169 | 546, 2188 170 | 369, 110 171 | 465, 10043 172 | 403, 1261 173 | 440, 6103 174 | 523, 5464 175 | 438, 5666 176 | 351, 20 177 | 391, 575 178 | 639, 1 179 | 554, 1440 180 | 443, 6526 181 | 422, 3189 182 | 446, 7021 183 | 336, 7 184 | 378, 230 185 | 427, 3863 186 | 580, 290 187 | 479, 10472 188 | 518, 6444 189 | 548, 2006 190 | 356, 40 191 | 426, 3834 192 | 634, 1 193 | 503, 9032 194 | 488, 10695 195 | 521, 5830 196 | 330, 4 197 | 504, 8887 198 | 417, 2578 199 | 350, 9 200 | 555, 1355 201 | 581, 281 202 | 601, 43 203 | 429, 4182 204 | 485, 10650 205 | 460, 9218 206 | 449, 7532 207 | 617, 15 208 | 629, 2 209 | 338, 4 210 | 401, 1094 211 | 433, 4913 212 | 611, 31 213 | 344, 14 214 | 396, 785 215 | 553, 1588 216 | 559, 1131 217 | 345, 10 218 | 620, 10 219 | 359, 42 220 | 600, 52 221 | 365, 79 222 | 626, 3 223 | 412, 1969 224 | 610, 19 225 | 451, 8110 226 | 373, 147 227 | 623, 9 228 | 612, 17 229 | 598, 60 230 | 537, 3400 231 | 371, 135 232 | 614, 14 233 | 436, 5303 234 | 454, 8499 235 | 473, 10581 236 | 627, 2 237 | 445, 6733 238 | 663, 1 239 | 484, 10708 240 | 328, 2 241 | 549, 2020 242 | 385, 382 243 | 452, 8207 244 | 519, 6136 245 | 632, 2 246 | 461, 9454 247 | 324, 1 248 | 513, 7222 249 | 625, 6 250 | 340, 8 251 | 390, 548 252 | 543, 2581 253 | 536, 3328 254 | 622, 5 255 | 498, 9556 256 | 577, 366 257 | 579, 275 258 | 495, 9914 259 | 370, 123 260 | 380, 300 261 | 576, 356 262 | 444, 6638 263 | 621, 3 264 | 641, 1 265 | 398, 923 266 | 500, 9446 267 | 599, 51 268 | 363, 79 269 | 372, 140 270 | 364, 80 271 | 517, 6446 272 | 402, 1152 273 | 628, 4 274 | 586, 172 275 | 335, 5 276 | 618, 7 277 | 607, 18 278 | 466, 10213 279 | 568, 578 280 | 564, 830 281 | 619, 8 282 | 551, 1786 283 | 325, 1 284 | 560, 1095 285 | 494, 10136 286 | 413, 2108 287 | 418, 2671 288 | 331, 3 289 | 556, 1234 290 | 544, 2397 291 | 464, 9868 292 | 490, 10365 293 | 477, 10806 294 | 694, 1 295 | 550, 1769 296 | 421, 2988 297 | 587, 143 298 | 341, 9 299 | 571, 486 300 | 468, 10148 301 | 566, 705 302 | 467, 10157 303 | 476, 10766 304 | 563, 908 305 | 366, 97 306 | 407, 1519 307 | 386, 405 308 | 474, 10842 309 | 362, 69 310 | 367, 88 311 | 435, 5186 312 | 616, 14 313 | 648, 1 314 | 567, 653 315 | 420, 2847 316 | 638, 1 317 | 582, 248 318 | 508, 8090 319 | 491, 10469 320 | 384, 356 321 | 478, 10962 322 | 558, 1107 323 | 411, 1822 324 | 414, 2198 325 | 573, 487 326 | 527, 4887 -------------------------------------------------------------------------------- /benches/mining.rs: -------------------------------------------------------------------------------- 1 | #[macro_use] 2 | extern crate criterion; 3 | 4 | mod mining_benches { 5 | use super::*; 6 | use criterion::*; 7 | use fastcrypto::hash::{Blake3, HashFunction, Sha256, Sha3_256}; 8 | use fastcrypto::{ed25519::Ed25519KeyPair, secp256k1::Secp256k1KeyPair, traits::KeyPair}; 9 | use rand::{prelude::ThreadRng, thread_rng}; 10 | use signature::Signer; 11 | 12 | fn key_generation(c: &mut Criterion) { 13 | // Note that for 3 bytes, benchmarks are very slow. 14 | const FIXED_BYTES_NUM: [usize; 3] = [1, 2, 3]; 15 | 16 | for num in FIXED_BYTES_NUM { 17 | let mut csprng1: ThreadRng = thread_rng(); 18 | let mut csprng2 = csprng1.clone(); 19 | 20 | c.bench_function( 21 | &("Ed25519_keypair_gen_zerobytes=".to_owned() + &num.to_string()), 22 | move |b| { 23 | b.iter(|| loop { 24 | if Ed25519KeyPair::generate(&mut csprng1).public().as_ref()[1..=num] 25 | == vec![0u8; num] 26 | { 27 | break; 28 | } 29 | }) 30 | }, 31 | ); 32 | 33 | c.bench_function( 34 | &("ECDSA_secp256k1_keypair_gen_zerobytes=".to_owned() + &num.to_string()), 35 | move |b| { 36 | b.iter(|| loop { 37 | if Secp256k1KeyPair::generate(&mut csprng2).public().as_ref()[1..=num] 38 | == vec![0u8; num] 39 | { 40 | break; 41 | } 42 | }) 43 | }, 44 | ); 45 | } 46 | } 47 | 48 | fn signing(c: &mut Criterion) { 49 | // Note that for 3 bytes, benchmarks are very slow. 50 | const FIXED_BYTES_NUM: [usize; 3] = [1, 2, 3]; 51 | 52 | for num in FIXED_BYTES_NUM { 53 | let mut csprng1: ThreadRng = thread_rng(); 54 | let mut csprng2 = csprng1.clone(); 55 | let ed25519_keypair = Ed25519KeyPair::generate(&mut csprng1); 56 | let ecdsa_keypair = Secp256k1KeyPair::generate(&mut csprng2); 57 | let mut counter = 0u64; 58 | 59 | c.bench_function( 60 | &("Ed25519_sign_zerobytes=".to_owned() + &num.to_string()), 61 | move |b| { 62 | b.iter(|| loop { 63 | // Note that ed25519 signing is deterministic, thus we retry with a counter. 64 | counter = rand::random(); 65 | if ed25519_keypair 66 | .try_sign(&counter.to_le_bytes()) 67 | .unwrap() 68 | .as_ref()[1..=num] 69 | == vec![0u8; num] 70 | { 71 | break; 72 | } 73 | }) 74 | }, 75 | ); 76 | 77 | c.bench_function( 78 | &("ECDSA_secp256k1_sign_zerobytes=".to_owned() + &num.to_string()), 79 | move |b| { 80 | b.iter(|| loop { 81 | // Note that fastcrypto's ecdsa signing is deterministic, thus we retry 82 | // with a counter. 83 | counter = rand::random(); 84 | if ecdsa_keypair 85 | .try_sign(&counter.to_le_bytes()) 86 | .unwrap() 87 | .as_ref()[1..=num] 88 | == vec![0u8; num] 89 | { 90 | break; 91 | } 92 | }) 93 | }, 94 | ); 95 | } 96 | } 97 | 98 | fn hashing(c: &mut Criterion) { 99 | // Note that for 3 bytes, benchmarks are very slow. 100 | const FIXED_BYTES_NUM: [usize; 3] = [1, 2, 3]; 101 | 102 | for num in FIXED_BYTES_NUM { 103 | let mut counter = 0u64; 104 | 105 | c.bench_function( 106 | &("sha2_256_zerobytes=".to_owned() + &num.to_string()), 107 | move |b| { 108 | b.iter(|| loop { 109 | // Note that ed25519 signing is deterministic, thus we retry with a counter. 110 | counter = rand::random(); 111 | if Sha256::digest(&counter.to_le_bytes()).as_ref()[..num] == vec![0u8; num] 112 | { 113 | break; 114 | } 115 | }) 116 | }, 117 | ); 118 | 119 | c.bench_function( 120 | &("sha3_256_zerobytes=".to_owned() + &num.to_string()), 121 | move |b| { 122 | b.iter(|| loop { 123 | // Note that ed25519 signing is deterministic, thus we retry with a counter. 124 | counter = rand::random(); 125 | if Sha3_256::digest(&counter.to_le_bytes()).as_ref()[..num] 126 | == vec![0u8; num] 127 | { 128 | break; 129 | } 130 | }) 131 | }, 132 | ); 133 | 134 | c.bench_function( 135 | &("blake3_256_zerobytes=".to_owned() + &num.to_string()), 136 | move |b| { 137 | b.iter(|| loop { 138 | // Note that ed25519 signing is deterministic, thus we retry with a counter. 139 | counter = rand::random(); 140 | if Blake3::digest(&counter.to_le_bytes()).as_ref()[..num] == vec![0u8; num] 141 | { 142 | break; 143 | } 144 | }) 145 | }, 146 | ); 147 | } 148 | } 149 | 150 | fn combo_pubkey_and_hashing(c: &mut Criterion) { 151 | // Note that for 3 bytes, benchmarks are very slow. 152 | const FIXED_BYTES_NUM: [usize; 3] = [1, 2, 3]; 153 | 154 | for num in FIXED_BYTES_NUM { 155 | let mut csprng1: ThreadRng = thread_rng(); 156 | let mut csprng2 = csprng1.clone(); 157 | let mut csprng3 = csprng1.clone(); 158 | let mut csprng4 = csprng1.clone(); 159 | let mut csprng5 = csprng1.clone(); 160 | let mut csprng6 = csprng1.clone(); 161 | 162 | c.bench_function( 163 | &("Ed25519_sha2_256_pubkey_hashing_zerobytes=".to_owned() + &num.to_string()), 164 | move |b| { 165 | b.iter(|| loop { 166 | if Sha256::digest(Ed25519KeyPair::generate(&mut csprng1).public().as_ref()) 167 | .as_ref()[..num] 168 | == vec![0u8; num] 169 | { 170 | break; 171 | } 172 | }) 173 | }, 174 | ); 175 | 176 | c.bench_function( 177 | &("Ed25519_sha3_256_pubkey_hashing_zerobytes=".to_owned() + &num.to_string()), 178 | move |b| { 179 | b.iter(|| loop { 180 | if Sha3_256::digest( 181 | Ed25519KeyPair::generate(&mut csprng2).public().as_ref(), 182 | ) 183 | .as_ref()[..num] 184 | == vec![0u8; num] 185 | { 186 | break; 187 | } 188 | }) 189 | }, 190 | ); 191 | 192 | c.bench_function( 193 | &("Ed25519_blake3_256_pubkey_hashing_zerobytes=".to_owned() + &num.to_string()), 194 | move |b| { 195 | b.iter(|| loop { 196 | if Blake3::digest(Ed25519KeyPair::generate(&mut csprng3).public().as_ref()) 197 | .as_ref()[..num] 198 | == vec![0u8; num] 199 | { 200 | break; 201 | } 202 | }) 203 | }, 204 | ); 205 | 206 | c.bench_function( 207 | &("ECDSA_secp256k1_sha2_256_pubkey_hashing_zerobytes=".to_owned() 208 | + &num.to_string()), 209 | move |b| { 210 | b.iter(|| loop { 211 | if Sha256::digest( 212 | Secp256k1KeyPair::generate(&mut csprng4).public().as_ref(), 213 | ) 214 | .as_ref()[..num] 215 | == vec![0u8; num] 216 | { 217 | break; 218 | } 219 | }) 220 | }, 221 | ); 222 | 223 | c.bench_function( 224 | &("ECDSA_secp256k1_sha3_256_pubkey_hashing_zerobytes=".to_owned() 225 | + &num.to_string()), 226 | move |b| { 227 | b.iter(|| loop { 228 | if Sha3_256::digest( 229 | Secp256k1KeyPair::generate(&mut csprng5).public().as_ref(), 230 | ) 231 | .as_ref()[..num] 232 | == vec![0u8; num] 233 | { 234 | break; 235 | } 236 | }) 237 | }, 238 | ); 239 | 240 | c.bench_function( 241 | &("ECDSA_secp256k1_blake3_256_pubkey_hashing_zerobytes=".to_owned() 242 | + &num.to_string()), 243 | move |b| { 244 | b.iter(|| loop { 245 | if Blake3::digest( 246 | Secp256k1KeyPair::generate(&mut csprng6).public().as_ref(), 247 | ) 248 | .as_ref()[..num] 249 | == vec![0u8; num] 250 | { 251 | break; 252 | } 253 | }) 254 | }, 255 | ); 256 | } 257 | } 258 | 259 | criterion_group! { 260 | name = mining_benches; 261 | config = Criterion::default().significance_level(0.1).sample_size(10); 262 | targets = 263 | key_generation, 264 | signing, 265 | hashing, 266 | combo_pubkey_and_hashing, 267 | } 268 | } 269 | 270 | criterion_main!(mining_benches::mining_benches,); 271 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | Apache License 2 | Version 2.0, January 2004 3 | http://www.apache.org/licenses/ 4 | 5 | TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION 6 | 7 | 1. Definitions. 8 | 9 | "License" shall mean the terms and conditions for use, reproduction, 10 | and distribution as defined by Sections 1 through 9 of this document. 11 | 12 | "Licensor" shall mean the copyright owner or entity authorized by 13 | the copyright owner that is granting the License. 14 | 15 | "Legal Entity" shall mean the union of the acting entity and all 16 | other entities that control, are controlled by, or are under common 17 | control with that entity. For the purposes of this definition, 18 | "control" means (i) the power, direct or indirect, to cause the 19 | direction or management of such entity, whether by contract or 20 | otherwise, or (ii) ownership of fifty percent (50%) or more of the 21 | outstanding shares, or (iii) beneficial ownership of such entity. 22 | 23 | "You" (or "Your") shall mean an individual or Legal Entity 24 | exercising permissions granted by this License. 25 | 26 | "Source" form shall mean the preferred form for making modifications, 27 | including but not limited to software source code, documentation 28 | source, and configuration files. 29 | 30 | "Object" form shall mean any form resulting from mechanical 31 | transformation or translation of a Source form, including but 32 | not limited to compiled object code, generated documentation, 33 | and conversions to other media types. 34 | 35 | "Work" shall mean the work of authorship, whether in Source or 36 | Object form, made available under the License, as indicated by a 37 | copyright notice that is included in or attached to the work 38 | (an example is provided in the Appendix below). 39 | 40 | "Derivative Works" shall mean any work, whether in Source or Object 41 | form, that is based on (or derived from) the Work and for which the 42 | editorial revisions, annotations, elaborations, or other modifications 43 | represent, as a whole, an original work of authorship. For the purposes 44 | of this License, Derivative Works shall not include works that remain 45 | separable from, or merely link (or bind by name) to the interfaces of, 46 | the Work and Derivative Works thereof. 47 | 48 | "Contribution" shall mean any work of authorship, including 49 | the original version of the Work and any modifications or additions 50 | to that Work or Derivative Works thereof, that is intentionally 51 | submitted to Licensor for inclusion in the Work by the copyright owner 52 | or by an individual or Legal Entity authorized to submit on behalf of 53 | the copyright owner. For the purposes of this definition, "submitted" 54 | means any form of electronic, verbal, or written communication sent 55 | to the Licensor or its representatives, including but not limited to 56 | communication on electronic mailing lists, source code control systems, 57 | and issue tracking systems that are managed by, or on behalf of, the 58 | Licensor for the purpose of discussing and improving the Work, but 59 | excluding communication that is conspicuously marked or otherwise 60 | designated in writing by the copyright owner as "Not a Contribution." 61 | 62 | "Contributor" shall mean Licensor and any individual or Legal Entity 63 | on behalf of whom a Contribution has been received by Licensor and 64 | subsequently incorporated within the Work. 65 | 66 | 2. Grant of Copyright License. Subject to the terms and conditions of 67 | this License, each Contributor hereby grants to You a perpetual, 68 | worldwide, non-exclusive, no-charge, royalty-free, irrevocable 69 | copyright license to reproduce, prepare Derivative Works of, 70 | publicly display, publicly perform, sublicense, and distribute the 71 | Work and such Derivative Works in Source or Object form. 72 | 73 | 3. Grant of Patent License. Subject to the terms and conditions of 74 | this License, each Contributor hereby grants to You a perpetual, 75 | worldwide, non-exclusive, no-charge, royalty-free, irrevocable 76 | (except as stated in this section) patent license to make, have made, 77 | use, offer to sell, sell, import, and otherwise transfer the Work, 78 | where such license applies only to those patent claims licensable 79 | by such Contributor that are necessarily infringed by their 80 | Contribution(s) alone or by combination of their Contribution(s) 81 | with the Work to which such Contribution(s) was submitted. If You 82 | institute patent litigation against any entity (including a 83 | cross-claim or counterclaim in a lawsuit) alleging that the Work 84 | or a Contribution incorporated within the Work constitutes direct 85 | or contributory patent infringement, then any patent licenses 86 | granted to You under this License for that Work shall terminate 87 | as of the date such litigation is filed. 88 | 89 | 4. Redistribution. You may reproduce and distribute copies of the 90 | Work or Derivative Works thereof in any medium, with or without 91 | modifications, and in Source or Object form, provided that You 92 | meet the following conditions: 93 | 94 | (a) You must give any other recipients of the Work or 95 | Derivative Works a copy of this License; and 96 | 97 | (b) You must cause any modified files to carry prominent notices 98 | stating that You changed the files; and 99 | 100 | (c) You must retain, in the Source form of any Derivative Works 101 | that You distribute, all copyright, patent, trademark, and 102 | attribution notices from the Source form of the Work, 103 | excluding those notices that do not pertain to any part of 104 | the Derivative Works; and 105 | 106 | (d) If the Work includes a "NOTICE" text file as part of its 107 | distribution, then any Derivative Works that You distribute must 108 | include a readable copy of the attribution notices contained 109 | within such NOTICE file, excluding those notices that do not 110 | pertain to any part of the Derivative Works, in at least one 111 | of the following places: within a NOTICE text file distributed 112 | as part of the Derivative Works; within the Source form or 113 | documentation, if provided along with the Derivative Works; or, 114 | within a display generated by the Derivative Works, if and 115 | wherever such third-party notices normally appear. The contents 116 | of the NOTICE file are for informational purposes only and 117 | do not modify the License. You may add Your own attribution 118 | notices within Derivative Works that You distribute, alongside 119 | or as an addendum to the NOTICE text from the Work, provided 120 | that such additional attribution notices cannot be construed 121 | as modifying the License. 122 | 123 | You may add Your own copyright statement to Your modifications and 124 | may provide additional or different license terms and conditions 125 | for use, reproduction, or distribution of Your modifications, or 126 | for any such Derivative Works as a whole, provided Your use, 127 | reproduction, and distribution of the Work otherwise complies with 128 | the conditions stated in this License. 129 | 130 | 5. Submission of Contributions. Unless You explicitly state otherwise, 131 | any Contribution intentionally submitted for inclusion in the Work 132 | by You to the Licensor shall be under the terms and conditions of 133 | this License, without any additional terms or conditions. 134 | Notwithstanding the above, nothing herein shall supersede or modify 135 | the terms of any separate license agreement you may have executed 136 | with Licensor regarding such Contributions. 137 | 138 | 6. Trademarks. This License does not grant permission to use the trade 139 | names, trademarks, service marks, or product names of the Licensor, 140 | except as required for reasonable and customary use in describing the 141 | origin of the Work and reproducing the content of the NOTICE file. 142 | 143 | 7. Disclaimer of Warranty. Unless required by applicable law or 144 | agreed to in writing, Licensor provides the Work (and each 145 | Contributor provides its Contributions) on an "AS IS" BASIS, 146 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or 147 | implied, including, without limitation, any warranties or conditions 148 | of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A 149 | PARTICULAR PURPOSE. You are solely responsible for determining the 150 | appropriateness of using or redistributing the Work and assume any 151 | risks associated with Your exercise of permissions under this License. 152 | 153 | 8. Limitation of Liability. In no event and under no legal theory, 154 | whether in tort (including negligence), contract, or otherwise, 155 | unless required by applicable law (such as deliberate and grossly 156 | negligent acts) or agreed to in writing, shall any Contributor be 157 | liable to You for damages, including any direct, indirect, special, 158 | incidental, or consequential damages of any character arising as a 159 | result of this License or out of the use or inability to use the 160 | Work (including but not limited to damages for loss of goodwill, 161 | work stoppage, computer failure or malfunction, or any and all 162 | other commercial damages or losses), even if such Contributor 163 | has been advised of the possibility of such damages. 164 | 165 | 9. Accepting Warranty or Additional Liability. While redistributing 166 | the Work or Derivative Works thereof, You may choose to offer, 167 | and charge a fee for, acceptance of support, warranty, indemnity, 168 | or other liability obligations and/or rights consistent with this 169 | License. However, in accepting such obligations, You may act only 170 | on Your own behalf and on Your sole responsibility, not on behalf 171 | of any other Contributor, and only if You agree to indemnify, 172 | defend, and hold each Contributor harmless for any liability 173 | incurred by, or claims asserted against, such Contributor by reason 174 | of your accepting any such warranty or additional liability. 175 | 176 | END OF TERMS AND CONDITIONS 177 | 178 | APPENDIX: How to apply the Apache License to your work. 179 | 180 | To apply the Apache License to your work, attach the following 181 | boilerplate notice, with the fields enclosed by brackets "[]" 182 | replaced with your own identifying information. (Don't include 183 | the brackets!) The text should be enclosed in the appropriate 184 | comment syntax for the file format. We also recommend that a 185 | file or class name and description of purpose be included on the 186 | same "printed page" as the copyright notice for easier 187 | identification within third-party archives. 188 | 189 | Copyright [yyyy] [name of copyright owner] 190 | 191 | Licensed under the Apache License, Version 2.0 (the "License"); 192 | you may not use this file except in compliance with the License. 193 | You may obtain a copy of the License at 194 | 195 | http://www.apache.org/licenses/LICENSE-2.0 196 | 197 | Unless required by applicable law or agreed to in writing, software 198 | distributed under the License is distributed on an "AS IS" BASIS, 199 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 200 | See the License for the specific language governing permissions and 201 | limitations under the License. 202 | -------------------------------------------------------------------------------- /Cargo.lock: -------------------------------------------------------------------------------- 1 | # This file is automatically @generated by Cargo. 2 | # It is not intended for manual editing. 3 | version = 3 4 | 5 | [[package]] 6 | name = "aead" 7 | version = "0.5.1" 8 | source = "registry+https://github.com/rust-lang/crates.io-index" 9 | checksum = "5c192eb8f11fc081b0fe4259ba5af04217d4e0faddd02417310a927911abd7c8" 10 | dependencies = [ 11 | "crypto-common", 12 | "generic-array", 13 | ] 14 | 15 | [[package]] 16 | name = "aes" 17 | version = "0.8.1" 18 | source = "registry+https://github.com/rust-lang/crates.io-index" 19 | checksum = "bfe0133578c0986e1fe3dfcd4af1cc5b2dd6c3dbf534d69916ce16a2701d40ba" 20 | dependencies = [ 21 | "cfg-if", 22 | "cipher", 23 | "cpufeatures", 24 | ] 25 | 26 | [[package]] 27 | name = "aes-gcm" 28 | version = "0.10.1" 29 | source = "registry+https://github.com/rust-lang/crates.io-index" 30 | checksum = "82e1366e0c69c9f927b1fa5ce2c7bf9eafc8f9268c0b9800729e8b267612447c" 31 | dependencies = [ 32 | "aead", 33 | "aes", 34 | "cipher", 35 | "ctr", 36 | "ghash", 37 | "subtle", 38 | ] 39 | 40 | [[package]] 41 | name = "android_system_properties" 42 | version = "0.1.5" 43 | source = "registry+https://github.com/rust-lang/crates.io-index" 44 | checksum = "819e7219dbd41043ac279b19830f2efc897156490d7fd6ea916720117ee66311" 45 | dependencies = [ 46 | "libc", 47 | ] 48 | 49 | [[package]] 50 | name = "anes" 51 | version = "0.1.6" 52 | source = "registry+https://github.com/rust-lang/crates.io-index" 53 | checksum = "4b46cbb362ab8752921c97e041f5e366ee6297bd428a31275b9fcf1e380f7299" 54 | 55 | [[package]] 56 | name = "arrayref" 57 | version = "0.3.6" 58 | source = "registry+https://github.com/rust-lang/crates.io-index" 59 | checksum = "a4c527152e37cf757a3f78aae5a06fbeefdb07ccc535c980a3208ee3060dd544" 60 | 61 | [[package]] 62 | name = "arrayvec" 63 | version = "0.7.2" 64 | source = "registry+https://github.com/rust-lang/crates.io-index" 65 | checksum = "8da52d66c7071e2e3fa2a1e5c6d088fec47b593032b254f5e980de8ea54454d6" 66 | 67 | [[package]] 68 | name = "atty" 69 | version = "0.2.14" 70 | source = "registry+https://github.com/rust-lang/crates.io-index" 71 | checksum = "d9b39be18770d11421cdb1b9947a45dd3f37e93092cbf377614828a319d5fee8" 72 | dependencies = [ 73 | "hermit-abi", 74 | "libc", 75 | "winapi", 76 | ] 77 | 78 | [[package]] 79 | name = "autocfg" 80 | version = "1.1.0" 81 | source = "registry+https://github.com/rust-lang/crates.io-index" 82 | checksum = "d468802bab17cbc0cc575e9b053f41e72aa36bfa6b7f55e3529ffa43161b97fa" 83 | 84 | [[package]] 85 | name = "base64" 86 | version = "0.13.0" 87 | source = "registry+https://github.com/rust-lang/crates.io-index" 88 | checksum = "904dfeac50f3cdaba28fc6f57fdcddb75f49ed61346676a78c4ffe55877802fd" 89 | 90 | [[package]] 91 | name = "base64ct" 92 | version = "1.5.2" 93 | source = "registry+https://github.com/rust-lang/crates.io-index" 94 | checksum = "ea2b2456fd614d856680dcd9fcc660a51a820fa09daef2e49772b56a193c8474" 95 | 96 | [[package]] 97 | name = "bitcoin_hashes" 98 | version = "0.11.0" 99 | source = "registry+https://github.com/rust-lang/crates.io-index" 100 | checksum = "90064b8dee6815a6470d60bad07bbbaee885c0e12d04177138fa3291a01b7bc4" 101 | 102 | [[package]] 103 | name = "bitflags" 104 | version = "1.3.2" 105 | source = "registry+https://github.com/rust-lang/crates.io-index" 106 | checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" 107 | 108 | [[package]] 109 | name = "blake2" 110 | version = "0.10.4" 111 | source = "registry+https://github.com/rust-lang/crates.io-index" 112 | checksum = "b9cf849ee05b2ee5fba5e36f97ff8ec2533916700fc0758d40d92136a42f3388" 113 | dependencies = [ 114 | "digest 0.10.5", 115 | ] 116 | 117 | [[package]] 118 | name = "blake3" 119 | version = "1.3.1" 120 | source = "registry+https://github.com/rust-lang/crates.io-index" 121 | checksum = "a08e53fc5a564bb15bfe6fae56bd71522205f1f91893f9c0116edad6496c183f" 122 | dependencies = [ 123 | "arrayref", 124 | "arrayvec", 125 | "cc", 126 | "cfg-if", 127 | "constant_time_eq", 128 | "digest 0.10.5", 129 | ] 130 | 131 | [[package]] 132 | name = "block-buffer" 133 | version = "0.9.0" 134 | source = "registry+https://github.com/rust-lang/crates.io-index" 135 | checksum = "4152116fd6e9dadb291ae18fc1ec3575ed6d84c29642d97890f4b4a3417297e4" 136 | dependencies = [ 137 | "block-padding 0.2.1", 138 | "generic-array", 139 | ] 140 | 141 | [[package]] 142 | name = "block-buffer" 143 | version = "0.10.3" 144 | source = "registry+https://github.com/rust-lang/crates.io-index" 145 | checksum = "69cce20737498f97b993470a6e536b8523f0af7892a4f928cceb1ac5e52ebe7e" 146 | dependencies = [ 147 | "generic-array", 148 | ] 149 | 150 | [[package]] 151 | name = "block-padding" 152 | version = "0.2.1" 153 | source = "registry+https://github.com/rust-lang/crates.io-index" 154 | checksum = "8d696c370c750c948ada61c69a0ee2cbbb9c50b1019ddb86d9317157a99c2cae" 155 | 156 | [[package]] 157 | name = "block-padding" 158 | version = "0.3.2" 159 | source = "registry+https://github.com/rust-lang/crates.io-index" 160 | checksum = "0a90ec2df9600c28a01c56c4784c9207a96d2451833aeceb8cc97e4c9548bb78" 161 | dependencies = [ 162 | "generic-array", 163 | ] 164 | 165 | [[package]] 166 | name = "blst" 167 | version = "0.3.10" 168 | source = "registry+https://github.com/rust-lang/crates.io-index" 169 | checksum = "6a30d0edd9dd1c60ddb42b80341c7852f6f985279a5c1a83659dcb65899dec99" 170 | dependencies = [ 171 | "cc", 172 | "glob", 173 | "threadpool", 174 | "which", 175 | "zeroize", 176 | ] 177 | 178 | [[package]] 179 | name = "bulletproofs" 180 | version = "4.0.0" 181 | source = "registry+https://github.com/rust-lang/crates.io-index" 182 | checksum = "40e698f1df446cc6246afd823afbe2d121134d089c9102c1dd26d1264991ba32" 183 | dependencies = [ 184 | "byteorder", 185 | "clear_on_drop", 186 | "curve25519-dalek-ng", 187 | "digest 0.9.0", 188 | "merlin", 189 | "rand", 190 | "rand_core", 191 | "serde", 192 | "serde_derive", 193 | "sha3 0.9.1", 194 | "subtle-ng", 195 | "thiserror", 196 | ] 197 | 198 | [[package]] 199 | name = "bumpalo" 200 | version = "3.11.0" 201 | source = "registry+https://github.com/rust-lang/crates.io-index" 202 | checksum = "c1ad822118d20d2c234f427000d5acc36eabe1e29a348c89b63dd60b13f28e5d" 203 | 204 | [[package]] 205 | name = "byteorder" 206 | version = "1.4.3" 207 | source = "registry+https://github.com/rust-lang/crates.io-index" 208 | checksum = "14c189c53d098945499cdfa7ecc63567cf3886b3332b312a5b4585d8d3a6a610" 209 | 210 | [[package]] 211 | name = "cast" 212 | version = "0.3.0" 213 | source = "registry+https://github.com/rust-lang/crates.io-index" 214 | checksum = "37b2a672a2cb129a2e41c10b1224bb368f9f37a2b16b612598138befd7b37eb5" 215 | 216 | [[package]] 217 | name = "cbc" 218 | version = "0.1.2" 219 | source = "registry+https://github.com/rust-lang/crates.io-index" 220 | checksum = "26b52a9543ae338f279b96b0b9fed9c8093744685043739079ce85cd58f289a6" 221 | dependencies = [ 222 | "cipher", 223 | ] 224 | 225 | [[package]] 226 | name = "cc" 227 | version = "1.0.73" 228 | source = "registry+https://github.com/rust-lang/crates.io-index" 229 | checksum = "2fff2a6927b3bb87f9595d67196a70493f627687a71d87a0d692242c33f58c11" 230 | 231 | [[package]] 232 | name = "cfg-if" 233 | version = "1.0.0" 234 | source = "registry+https://github.com/rust-lang/crates.io-index" 235 | checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" 236 | 237 | [[package]] 238 | name = "chrono" 239 | version = "0.4.22" 240 | source = "registry+https://github.com/rust-lang/crates.io-index" 241 | checksum = "bfd4d1b31faaa3a89d7934dbded3111da0d2ef28e3ebccdb4f0179f5929d1ef1" 242 | dependencies = [ 243 | "iana-time-zone", 244 | "num-integer", 245 | "num-traits", 246 | "serde", 247 | "winapi", 248 | ] 249 | 250 | [[package]] 251 | name = "ciborium" 252 | version = "0.2.0" 253 | source = "registry+https://github.com/rust-lang/crates.io-index" 254 | checksum = "b0c137568cc60b904a7724001b35ce2630fd00d5d84805fbb608ab89509d788f" 255 | dependencies = [ 256 | "ciborium-io", 257 | "ciborium-ll", 258 | "serde", 259 | ] 260 | 261 | [[package]] 262 | name = "ciborium-io" 263 | version = "0.2.0" 264 | source = "registry+https://github.com/rust-lang/crates.io-index" 265 | checksum = "346de753af073cc87b52b2083a506b38ac176a44cfb05497b622e27be899b369" 266 | 267 | [[package]] 268 | name = "ciborium-ll" 269 | version = "0.2.0" 270 | source = "registry+https://github.com/rust-lang/crates.io-index" 271 | checksum = "213030a2b5a4e0c0892b6652260cf6ccac84827b83a85a534e178e3906c4cf1b" 272 | dependencies = [ 273 | "ciborium-io", 274 | "half", 275 | ] 276 | 277 | [[package]] 278 | name = "cipher" 279 | version = "0.4.3" 280 | source = "registry+https://github.com/rust-lang/crates.io-index" 281 | checksum = "d1873270f8f7942c191139cb8a40fd228da6c3fd2fc376d7e92d47aa14aeb59e" 282 | dependencies = [ 283 | "crypto-common", 284 | "inout", 285 | ] 286 | 287 | [[package]] 288 | name = "clap" 289 | version = "3.2.23" 290 | source = "registry+https://github.com/rust-lang/crates.io-index" 291 | checksum = "71655c45cb9845d3270c9d6df84ebe72b4dad3c2ba3f7023ad47c144e4e473a5" 292 | dependencies = [ 293 | "bitflags", 294 | "clap_lex", 295 | "indexmap", 296 | "textwrap", 297 | ] 298 | 299 | [[package]] 300 | name = "clap_lex" 301 | version = "0.2.4" 302 | source = "registry+https://github.com/rust-lang/crates.io-index" 303 | checksum = "2850f2f5a82cbf437dd5af4d49848fbdfc27c157c3d010345776f952765261c5" 304 | dependencies = [ 305 | "os_str_bytes", 306 | ] 307 | 308 | [[package]] 309 | name = "clear_on_drop" 310 | version = "0.2.5" 311 | source = "registry+https://github.com/rust-lang/crates.io-index" 312 | checksum = "38508a63f4979f0048febc9966fadbd48e5dab31fd0ec6a3f151bbf4a74f7423" 313 | dependencies = [ 314 | "cc", 315 | ] 316 | 317 | [[package]] 318 | name = "constant_time_eq" 319 | version = "0.1.5" 320 | source = "registry+https://github.com/rust-lang/crates.io-index" 321 | checksum = "245097e9a4535ee1e3e3931fcfcd55a796a44c643e8596ff6566d68f09b87bbc" 322 | 323 | [[package]] 324 | name = "core-foundation-sys" 325 | version = "0.8.3" 326 | source = "registry+https://github.com/rust-lang/crates.io-index" 327 | checksum = "5827cebf4670468b8772dd191856768aedcb1b0278a04f989f7766351917b9dc" 328 | 329 | [[package]] 330 | name = "cpufeatures" 331 | version = "0.2.5" 332 | source = "registry+https://github.com/rust-lang/crates.io-index" 333 | checksum = "28d997bd5e24a5928dd43e46dc529867e207907fe0b239c3477d924f7f2ca320" 334 | dependencies = [ 335 | "libc", 336 | ] 337 | 338 | [[package]] 339 | name = "criterion" 340 | version = "0.4.0" 341 | source = "registry+https://github.com/rust-lang/crates.io-index" 342 | checksum = "e7c76e09c1aae2bc52b3d2f29e13c6572553b30c4aa1b8a49fd70de6412654cb" 343 | dependencies = [ 344 | "anes", 345 | "atty", 346 | "cast", 347 | "ciborium", 348 | "clap", 349 | "criterion-plot", 350 | "itertools", 351 | "lazy_static", 352 | "num-traits", 353 | "oorandom", 354 | "plotters", 355 | "rayon", 356 | "regex", 357 | "serde", 358 | "serde_derive", 359 | "serde_json", 360 | "tinytemplate", 361 | "walkdir", 362 | ] 363 | 364 | [[package]] 365 | name = "criterion-plot" 366 | version = "0.5.0" 367 | source = "registry+https://github.com/rust-lang/crates.io-index" 368 | checksum = "6b50826342786a51a89e2da3a28f1c32b06e387201bc2d19791f622c673706b1" 369 | dependencies = [ 370 | "cast", 371 | "itertools", 372 | ] 373 | 374 | [[package]] 375 | name = "crossbeam-channel" 376 | version = "0.5.6" 377 | source = "registry+https://github.com/rust-lang/crates.io-index" 378 | checksum = "c2dd04ddaf88237dc3b8d8f9a3c1004b506b54b3313403944054d23c0870c521" 379 | dependencies = [ 380 | "cfg-if", 381 | "crossbeam-utils", 382 | ] 383 | 384 | [[package]] 385 | name = "crossbeam-deque" 386 | version = "0.8.2" 387 | source = "registry+https://github.com/rust-lang/crates.io-index" 388 | checksum = "715e8152b692bba2d374b53d4875445368fdf21a94751410af607a5ac677d1fc" 389 | dependencies = [ 390 | "cfg-if", 391 | "crossbeam-epoch", 392 | "crossbeam-utils", 393 | ] 394 | 395 | [[package]] 396 | name = "crossbeam-epoch" 397 | version = "0.9.11" 398 | source = "registry+https://github.com/rust-lang/crates.io-index" 399 | checksum = "f916dfc5d356b0ed9dae65f1db9fc9770aa2851d2662b988ccf4fe3516e86348" 400 | dependencies = [ 401 | "autocfg", 402 | "cfg-if", 403 | "crossbeam-utils", 404 | "memoffset", 405 | "scopeguard", 406 | ] 407 | 408 | [[package]] 409 | name = "crossbeam-utils" 410 | version = "0.8.12" 411 | source = "registry+https://github.com/rust-lang/crates.io-index" 412 | checksum = "edbafec5fa1f196ca66527c1b12c2ec4745ca14b50f1ad8f9f6f720b55d11fac" 413 | dependencies = [ 414 | "cfg-if", 415 | ] 416 | 417 | [[package]] 418 | name = "crypto-common" 419 | version = "0.1.6" 420 | source = "registry+https://github.com/rust-lang/crates.io-index" 421 | checksum = "1bfb12502f3fc46cca1bb51ac28df9d618d813cdc3d2f25b9fe775a34af26bb3" 422 | dependencies = [ 423 | "generic-array", 424 | "rand_core", 425 | "typenum", 426 | ] 427 | 428 | [[package]] 429 | name = "ctr" 430 | version = "0.9.2" 431 | source = "registry+https://github.com/rust-lang/crates.io-index" 432 | checksum = "0369ee1ad671834580515889b80f2ea915f23b8be8d0daa4bbaf2ac5c7590835" 433 | dependencies = [ 434 | "cipher", 435 | ] 436 | 437 | [[package]] 438 | name = "curve25519-dalek-ng" 439 | version = "4.1.1" 440 | source = "registry+https://github.com/rust-lang/crates.io-index" 441 | checksum = "1c359b7249347e46fb28804470d071c921156ad62b3eef5d34e2ba867533dec8" 442 | dependencies = [ 443 | "byteorder", 444 | "digest 0.9.0", 445 | "rand_core", 446 | "serde", 447 | "subtle-ng", 448 | "zeroize", 449 | ] 450 | 451 | [[package]] 452 | name = "darling" 453 | version = "0.14.1" 454 | source = "registry+https://github.com/rust-lang/crates.io-index" 455 | checksum = "4529658bdda7fd6769b8614be250cdcfc3aeb0ee72fe66f9e41e5e5eb73eac02" 456 | dependencies = [ 457 | "darling_core", 458 | "darling_macro", 459 | ] 460 | 461 | [[package]] 462 | name = "darling_core" 463 | version = "0.14.1" 464 | source = "registry+https://github.com/rust-lang/crates.io-index" 465 | checksum = "649c91bc01e8b1eac09fb91e8dbc7d517684ca6be8ebc75bb9cafc894f9fdb6f" 466 | dependencies = [ 467 | "fnv", 468 | "ident_case", 469 | "proc-macro2", 470 | "quote", 471 | "strsim", 472 | "syn", 473 | ] 474 | 475 | [[package]] 476 | name = "darling_macro" 477 | version = "0.14.1" 478 | source = "registry+https://github.com/rust-lang/crates.io-index" 479 | checksum = "ddfc69c5bfcbd2fc09a0f38451d2daf0e372e367986a83906d1b0dbc88134fb5" 480 | dependencies = [ 481 | "darling_core", 482 | "quote", 483 | "syn", 484 | ] 485 | 486 | [[package]] 487 | name = "digest" 488 | version = "0.9.0" 489 | source = "registry+https://github.com/rust-lang/crates.io-index" 490 | checksum = "d3dd60d1080a57a05ab032377049e0591415d2b31afd7028356dbf3cc6dcb066" 491 | dependencies = [ 492 | "generic-array", 493 | ] 494 | 495 | [[package]] 496 | name = "digest" 497 | version = "0.10.5" 498 | source = "registry+https://github.com/rust-lang/crates.io-index" 499 | checksum = "adfbc57365a37acbd2ebf2b64d7e69bb766e2fea813521ed536f5d0520dcf86c" 500 | dependencies = [ 501 | "block-buffer 0.10.3", 502 | "crypto-common", 503 | "subtle", 504 | ] 505 | 506 | [[package]] 507 | name = "ed25519-consensus" 508 | version = "2.0.1" 509 | source = "registry+https://github.com/rust-lang/crates.io-index" 510 | checksum = "e1dd91246c940272326f665724138660a183577ffb77b384a5e10d67d2d5075a" 511 | dependencies = [ 512 | "curve25519-dalek-ng", 513 | "hex", 514 | "rand_core", 515 | "serde", 516 | "sha2 0.9.9", 517 | "thiserror", 518 | "zeroize", 519 | ] 520 | 521 | [[package]] 522 | name = "either" 523 | version = "1.8.0" 524 | source = "registry+https://github.com/rust-lang/crates.io-index" 525 | checksum = "90e5c1c8368803113bf0c9584fc495a58b86dc8a29edbf8fe877d21d9507e797" 526 | 527 | [[package]] 528 | name = "eyre" 529 | version = "0.6.8" 530 | source = "registry+https://github.com/rust-lang/crates.io-index" 531 | checksum = "4c2b6b5a29c02cdc822728b7d7b8ae1bab3e3b05d44522770ddd49722eeac7eb" 532 | dependencies = [ 533 | "indenter", 534 | "once_cell", 535 | ] 536 | 537 | [[package]] 538 | name = "fastcrypto" 539 | version = "0.1.3" 540 | source = "registry+https://github.com/rust-lang/crates.io-index" 541 | checksum = "64612a260945ed18c20528abd087e6d2f3ca7036b615640f13e2a02cde24e890" 542 | dependencies = [ 543 | "aes", 544 | "aes-gcm", 545 | "base64ct", 546 | "blake2", 547 | "blake3", 548 | "blst", 549 | "bulletproofs", 550 | "cbc", 551 | "ctr", 552 | "curve25519-dalek-ng", 553 | "digest 0.10.5", 554 | "ed25519-consensus", 555 | "eyre", 556 | "fastcrypto-derive", 557 | "generic-array", 558 | "hex", 559 | "hkdf", 560 | "merlin", 561 | "once_cell", 562 | "rand", 563 | "readonly", 564 | "secp256k1", 565 | "serde", 566 | "serde_bytes", 567 | "serde_with", 568 | "sha2 0.10.6", 569 | "sha3 0.10.5", 570 | "signature", 571 | "thiserror", 572 | "tokio", 573 | "typenum", 574 | "zeroize", 575 | ] 576 | 577 | [[package]] 578 | name = "fastcrypto-derive" 579 | version = "0.1.2" 580 | source = "registry+https://github.com/rust-lang/crates.io-index" 581 | checksum = "c03a787de27aced05a5fdd0708d8c64c4ddc7ddddc1bb0321cf6173d993770d4" 582 | dependencies = [ 583 | "proc-macro2", 584 | "quote", 585 | "syn", 586 | ] 587 | 588 | [[package]] 589 | name = "fnv" 590 | version = "1.0.7" 591 | source = "registry+https://github.com/rust-lang/crates.io-index" 592 | checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" 593 | 594 | [[package]] 595 | name = "generic-array" 596 | version = "0.14.6" 597 | source = "registry+https://github.com/rust-lang/crates.io-index" 598 | checksum = "bff49e947297f3312447abdca79f45f4738097cc82b06e72054d2223f601f1b9" 599 | dependencies = [ 600 | "serde", 601 | "typenum", 602 | "version_check", 603 | ] 604 | 605 | [[package]] 606 | name = "getrandom" 607 | version = "0.2.7" 608 | source = "registry+https://github.com/rust-lang/crates.io-index" 609 | checksum = "4eb1a864a501629691edf6c15a593b7a51eebaa1e8468e9ddc623de7c9b58ec6" 610 | dependencies = [ 611 | "cfg-if", 612 | "libc", 613 | "wasi", 614 | ] 615 | 616 | [[package]] 617 | name = "ghash" 618 | version = "0.5.0" 619 | source = "registry+https://github.com/rust-lang/crates.io-index" 620 | checksum = "d930750de5717d2dd0b8c0d42c076c0e884c81a73e6cab859bbd2339c71e3e40" 621 | dependencies = [ 622 | "opaque-debug", 623 | "polyval", 624 | ] 625 | 626 | [[package]] 627 | name = "glob" 628 | version = "0.3.0" 629 | source = "registry+https://github.com/rust-lang/crates.io-index" 630 | checksum = "9b919933a397b79c37e33b77bb2aa3dc8eb6e165ad809e58ff75bc7db2e34574" 631 | 632 | [[package]] 633 | name = "half" 634 | version = "1.8.2" 635 | source = "registry+https://github.com/rust-lang/crates.io-index" 636 | checksum = "eabb4a44450da02c90444cf74558da904edde8fb4e9035a9a6a4e15445af0bd7" 637 | 638 | [[package]] 639 | name = "hashbrown" 640 | version = "0.12.3" 641 | source = "registry+https://github.com/rust-lang/crates.io-index" 642 | checksum = "8a9ee70c43aaf417c914396645a0fa852624801b24ebb7ae78fe8272889ac888" 643 | 644 | [[package]] 645 | name = "hermit-abi" 646 | version = "0.1.19" 647 | source = "registry+https://github.com/rust-lang/crates.io-index" 648 | checksum = "62b467343b94ba476dcb2500d242dadbb39557df889310ac77c5d99100aaac33" 649 | dependencies = [ 650 | "libc", 651 | ] 652 | 653 | [[package]] 654 | name = "hex" 655 | version = "0.4.3" 656 | source = "registry+https://github.com/rust-lang/crates.io-index" 657 | checksum = "7f24254aa9a54b5c858eaee2f5bccdb46aaf0e486a595ed5fd8f86ba55232a70" 658 | 659 | [[package]] 660 | name = "hkdf" 661 | version = "0.12.3" 662 | source = "registry+https://github.com/rust-lang/crates.io-index" 663 | checksum = "791a029f6b9fc27657f6f188ec6e5e43f6911f6f878e0dc5501396e09809d437" 664 | dependencies = [ 665 | "hmac", 666 | ] 667 | 668 | [[package]] 669 | name = "hmac" 670 | version = "0.12.1" 671 | source = "registry+https://github.com/rust-lang/crates.io-index" 672 | checksum = "6c49c37c09c17a53d937dfbb742eb3a961d65a994e6bcdcf37e7399d0cc8ab5e" 673 | dependencies = [ 674 | "digest 0.10.5", 675 | ] 676 | 677 | [[package]] 678 | name = "iana-time-zone" 679 | version = "0.1.50" 680 | source = "registry+https://github.com/rust-lang/crates.io-index" 681 | checksum = "fd911b35d940d2bd0bea0f9100068e5b97b51a1cbe13d13382f132e0365257a0" 682 | dependencies = [ 683 | "android_system_properties", 684 | "core-foundation-sys", 685 | "js-sys", 686 | "wasm-bindgen", 687 | "winapi", 688 | ] 689 | 690 | [[package]] 691 | name = "ident_case" 692 | version = "1.0.1" 693 | source = "registry+https://github.com/rust-lang/crates.io-index" 694 | checksum = "b9e0384b61958566e926dc50660321d12159025e767c18e043daf26b70104c39" 695 | 696 | [[package]] 697 | name = "indenter" 698 | version = "0.3.3" 699 | source = "registry+https://github.com/rust-lang/crates.io-index" 700 | checksum = "ce23b50ad8242c51a442f3ff322d56b02f08852c77e4c0b4d3fd684abc89c683" 701 | 702 | [[package]] 703 | name = "indexmap" 704 | version = "1.9.1" 705 | source = "registry+https://github.com/rust-lang/crates.io-index" 706 | checksum = "10a35a97730320ffe8e2d410b5d3b69279b98d2c14bdb8b70ea89ecf7888d41e" 707 | dependencies = [ 708 | "autocfg", 709 | "hashbrown", 710 | "serde", 711 | ] 712 | 713 | [[package]] 714 | name = "inout" 715 | version = "0.1.3" 716 | source = "registry+https://github.com/rust-lang/crates.io-index" 717 | checksum = "a0c10553d664a4d0bcff9f4215d0aac67a639cc68ef660840afe309b807bc9f5" 718 | dependencies = [ 719 | "block-padding 0.3.2", 720 | "generic-array", 721 | ] 722 | 723 | [[package]] 724 | name = "itertools" 725 | version = "0.10.5" 726 | source = "registry+https://github.com/rust-lang/crates.io-index" 727 | checksum = "b0fd2260e829bddf4cb6ea802289de2f86d6a7a690192fbe91b3f46e0f2c8473" 728 | dependencies = [ 729 | "either", 730 | ] 731 | 732 | [[package]] 733 | name = "itoa" 734 | version = "1.0.3" 735 | source = "registry+https://github.com/rust-lang/crates.io-index" 736 | checksum = "6c8af84674fe1f223a982c933a0ee1086ac4d4052aa0fb8060c12c6ad838e754" 737 | 738 | [[package]] 739 | name = "js-sys" 740 | version = "0.3.60" 741 | source = "registry+https://github.com/rust-lang/crates.io-index" 742 | checksum = "49409df3e3bf0856b916e2ceaca09ee28e6871cf7d9ce97a692cacfdb2a25a47" 743 | dependencies = [ 744 | "wasm-bindgen", 745 | ] 746 | 747 | [[package]] 748 | name = "keccak" 749 | version = "0.1.2" 750 | source = "registry+https://github.com/rust-lang/crates.io-index" 751 | checksum = "f9b7d56ba4a8344d6be9729995e6b06f928af29998cdf79fe390cbf6b1fee838" 752 | 753 | [[package]] 754 | name = "lazy_static" 755 | version = "1.4.0" 756 | source = "registry+https://github.com/rust-lang/crates.io-index" 757 | checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646" 758 | 759 | [[package]] 760 | name = "libc" 761 | version = "0.2.134" 762 | source = "registry+https://github.com/rust-lang/crates.io-index" 763 | checksum = "329c933548736bc49fd575ee68c89e8be4d260064184389a5b77517cddd99ffb" 764 | 765 | [[package]] 766 | name = "log" 767 | version = "0.4.17" 768 | source = "registry+https://github.com/rust-lang/crates.io-index" 769 | checksum = "abb12e687cfb44aa40f41fc3978ef76448f9b6038cad6aef4259d3c095a2382e" 770 | dependencies = [ 771 | "cfg-if", 772 | ] 773 | 774 | [[package]] 775 | name = "memoffset" 776 | version = "0.6.5" 777 | source = "registry+https://github.com/rust-lang/crates.io-index" 778 | checksum = "5aa361d4faea93603064a027415f07bd8e1d5c88c9fbf68bf56a285428fd79ce" 779 | dependencies = [ 780 | "autocfg", 781 | ] 782 | 783 | [[package]] 784 | name = "merlin" 785 | version = "3.0.0" 786 | source = "registry+https://github.com/rust-lang/crates.io-index" 787 | checksum = "58c38e2799fc0978b65dfff8023ec7843e2330bb462f19198840b34b6582397d" 788 | dependencies = [ 789 | "byteorder", 790 | "keccak", 791 | "rand_core", 792 | "zeroize", 793 | ] 794 | 795 | [[package]] 796 | name = "num-integer" 797 | version = "0.1.45" 798 | source = "registry+https://github.com/rust-lang/crates.io-index" 799 | checksum = "225d3389fb3509a24c93f5c29eb6bde2586b98d9f016636dff58d7c6f7569cd9" 800 | dependencies = [ 801 | "autocfg", 802 | "num-traits", 803 | ] 804 | 805 | [[package]] 806 | name = "num-traits" 807 | version = "0.2.15" 808 | source = "registry+https://github.com/rust-lang/crates.io-index" 809 | checksum = "578ede34cf02f8924ab9447f50c28075b4d3e5b269972345e7e0372b38c6cdcd" 810 | dependencies = [ 811 | "autocfg", 812 | ] 813 | 814 | [[package]] 815 | name = "num_cpus" 816 | version = "1.13.1" 817 | source = "registry+https://github.com/rust-lang/crates.io-index" 818 | checksum = "19e64526ebdee182341572e50e9ad03965aa510cd94427a4549448f285e957a1" 819 | dependencies = [ 820 | "hermit-abi", 821 | "libc", 822 | ] 823 | 824 | [[package]] 825 | name = "num_threads" 826 | version = "0.1.6" 827 | source = "registry+https://github.com/rust-lang/crates.io-index" 828 | checksum = "2819ce041d2ee131036f4fc9d6ae7ae125a3a40e97ba64d04fe799ad9dabbb44" 829 | dependencies = [ 830 | "libc", 831 | ] 832 | 833 | [[package]] 834 | name = "once_cell" 835 | version = "1.15.0" 836 | source = "registry+https://github.com/rust-lang/crates.io-index" 837 | checksum = "e82dad04139b71a90c080c8463fe0dc7902db5192d939bd0950f074d014339e1" 838 | 839 | [[package]] 840 | name = "oorandom" 841 | version = "11.1.3" 842 | source = "registry+https://github.com/rust-lang/crates.io-index" 843 | checksum = "0ab1bc2a289d34bd04a330323ac98a1b4bc82c9d9fcb1e66b63caa84da26b575" 844 | 845 | [[package]] 846 | name = "opaque-debug" 847 | version = "0.3.0" 848 | source = "registry+https://github.com/rust-lang/crates.io-index" 849 | checksum = "624a8340c38c1b80fd549087862da4ba43e08858af025b236e509b6649fc13d5" 850 | 851 | [[package]] 852 | name = "os_str_bytes" 853 | version = "6.3.1" 854 | source = "registry+https://github.com/rust-lang/crates.io-index" 855 | checksum = "3baf96e39c5359d2eb0dd6ccb42c62b91d9678aa68160d261b9e0ccbf9e9dea9" 856 | 857 | [[package]] 858 | name = "pin-project-lite" 859 | version = "0.2.9" 860 | source = "registry+https://github.com/rust-lang/crates.io-index" 861 | checksum = "e0a7ae3ac2f1173085d398531c705756c94a4c56843785df85a60c1a0afac116" 862 | 863 | [[package]] 864 | name = "plotters" 865 | version = "0.3.4" 866 | source = "registry+https://github.com/rust-lang/crates.io-index" 867 | checksum = "2538b639e642295546c50fcd545198c9d64ee2a38620a628724a3b266d5fbf97" 868 | dependencies = [ 869 | "num-traits", 870 | "plotters-backend", 871 | "plotters-svg", 872 | "wasm-bindgen", 873 | "web-sys", 874 | ] 875 | 876 | [[package]] 877 | name = "plotters-backend" 878 | version = "0.3.4" 879 | source = "registry+https://github.com/rust-lang/crates.io-index" 880 | checksum = "193228616381fecdc1224c62e96946dfbc73ff4384fba576e052ff8c1bea8142" 881 | 882 | [[package]] 883 | name = "plotters-svg" 884 | version = "0.3.3" 885 | source = "registry+https://github.com/rust-lang/crates.io-index" 886 | checksum = "f9a81d2759aae1dae668f783c308bc5c8ebd191ff4184aaa1b37f65a6ae5a56f" 887 | dependencies = [ 888 | "plotters-backend", 889 | ] 890 | 891 | [[package]] 892 | name = "polyval" 893 | version = "0.6.0" 894 | source = "registry+https://github.com/rust-lang/crates.io-index" 895 | checksum = "7ef234e08c11dfcb2e56f79fd70f6f2eb7f025c0ce2333e82f4f0518ecad30c6" 896 | dependencies = [ 897 | "cfg-if", 898 | "cpufeatures", 899 | "opaque-debug", 900 | "universal-hash", 901 | ] 902 | 903 | [[package]] 904 | name = "ppv-lite86" 905 | version = "0.2.16" 906 | source = "registry+https://github.com/rust-lang/crates.io-index" 907 | checksum = "eb9f9e6e233e5c4a35559a617bf40a4ec447db2e84c20b55a6f83167b7e57872" 908 | 909 | [[package]] 910 | name = "proc-macro2" 911 | version = "1.0.46" 912 | source = "registry+https://github.com/rust-lang/crates.io-index" 913 | checksum = "94e2ef8dbfc347b10c094890f778ee2e36ca9bb4262e86dc99cd217e35f3470b" 914 | dependencies = [ 915 | "unicode-ident", 916 | ] 917 | 918 | [[package]] 919 | name = "quote" 920 | version = "1.0.21" 921 | source = "registry+https://github.com/rust-lang/crates.io-index" 922 | checksum = "bbe448f377a7d6961e30f5955f9b8d106c3f5e449d493ee1b125c1d43c2b5179" 923 | dependencies = [ 924 | "proc-macro2", 925 | ] 926 | 927 | [[package]] 928 | name = "rand" 929 | version = "0.8.5" 930 | source = "registry+https://github.com/rust-lang/crates.io-index" 931 | checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404" 932 | dependencies = [ 933 | "libc", 934 | "rand_chacha", 935 | "rand_core", 936 | ] 937 | 938 | [[package]] 939 | name = "rand_chacha" 940 | version = "0.3.1" 941 | source = "registry+https://github.com/rust-lang/crates.io-index" 942 | checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88" 943 | dependencies = [ 944 | "ppv-lite86", 945 | "rand_core", 946 | ] 947 | 948 | [[package]] 949 | name = "rand_core" 950 | version = "0.6.4" 951 | source = "registry+https://github.com/rust-lang/crates.io-index" 952 | checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" 953 | dependencies = [ 954 | "getrandom", 955 | ] 956 | 957 | [[package]] 958 | name = "rayon" 959 | version = "1.5.3" 960 | source = "registry+https://github.com/rust-lang/crates.io-index" 961 | checksum = "bd99e5772ead8baa5215278c9b15bf92087709e9c1b2d1f97cdb5a183c933a7d" 962 | dependencies = [ 963 | "autocfg", 964 | "crossbeam-deque", 965 | "either", 966 | "rayon-core", 967 | ] 968 | 969 | [[package]] 970 | name = "rayon-core" 971 | version = "1.9.3" 972 | source = "registry+https://github.com/rust-lang/crates.io-index" 973 | checksum = "258bcdb5ac6dad48491bb2992db6b7cf74878b0384908af124823d118c99683f" 974 | dependencies = [ 975 | "crossbeam-channel", 976 | "crossbeam-deque", 977 | "crossbeam-utils", 978 | "num_cpus", 979 | ] 980 | 981 | [[package]] 982 | name = "readonly" 983 | version = "0.2.2" 984 | source = "registry+https://github.com/rust-lang/crates.io-index" 985 | checksum = "6c0e08c3b00fcae55ee1dac341e1b9b5bc942e7e1931957436ab00b4a5e8dc18" 986 | dependencies = [ 987 | "proc-macro2", 988 | "quote", 989 | "syn", 990 | ] 991 | 992 | [[package]] 993 | name = "regex" 994 | version = "1.6.0" 995 | source = "registry+https://github.com/rust-lang/crates.io-index" 996 | checksum = "4c4eb3267174b8c6c2f654116623910a0fef09c4753f8dd83db29c48a0df988b" 997 | dependencies = [ 998 | "regex-syntax", 999 | ] 1000 | 1001 | [[package]] 1002 | name = "regex-syntax" 1003 | version = "0.6.27" 1004 | source = "registry+https://github.com/rust-lang/crates.io-index" 1005 | checksum = "a3f87b73ce11b1619a3c6332f45341e0047173771e8b8b73f87bfeefb7b56244" 1006 | 1007 | [[package]] 1008 | name = "ryu" 1009 | version = "1.0.11" 1010 | source = "registry+https://github.com/rust-lang/crates.io-index" 1011 | checksum = "4501abdff3ae82a1c1b477a17252eb69cee9e66eb915c1abaa4f44d873df9f09" 1012 | 1013 | [[package]] 1014 | name = "same-file" 1015 | version = "1.0.6" 1016 | source = "registry+https://github.com/rust-lang/crates.io-index" 1017 | checksum = "93fc1dc3aaa9bfed95e02e6eadabb4baf7e3078b0bd1b4d7b6b0b68378900502" 1018 | dependencies = [ 1019 | "winapi-util", 1020 | ] 1021 | 1022 | [[package]] 1023 | name = "scopeguard" 1024 | version = "1.1.0" 1025 | source = "registry+https://github.com/rust-lang/crates.io-index" 1026 | checksum = "d29ab0c6d3fc0ee92fe66e2d99f700eab17a8d57d1c1d3b748380fb20baa78cd" 1027 | 1028 | [[package]] 1029 | name = "secp256k1" 1030 | version = "0.24.1" 1031 | source = "registry+https://github.com/rust-lang/crates.io-index" 1032 | checksum = "ff55dc09d460954e9ef2fa8a7ced735a964be9981fd50e870b2b3b0705e14964" 1033 | dependencies = [ 1034 | "bitcoin_hashes", 1035 | "rand", 1036 | "secp256k1-sys", 1037 | ] 1038 | 1039 | [[package]] 1040 | name = "secp256k1-sys" 1041 | version = "0.6.0" 1042 | source = "registry+https://github.com/rust-lang/crates.io-index" 1043 | checksum = "7058dc8eaf3f2810d7828680320acda0b25a288f6d288e19278e249bbf74226b" 1044 | dependencies = [ 1045 | "cc", 1046 | ] 1047 | 1048 | [[package]] 1049 | name = "serde" 1050 | version = "1.0.147" 1051 | source = "registry+https://github.com/rust-lang/crates.io-index" 1052 | checksum = "d193d69bae983fc11a79df82342761dfbf28a99fc8d203dca4c3c1b590948965" 1053 | dependencies = [ 1054 | "serde_derive", 1055 | ] 1056 | 1057 | [[package]] 1058 | name = "serde_bytes" 1059 | version = "0.11.7" 1060 | source = "registry+https://github.com/rust-lang/crates.io-index" 1061 | checksum = "cfc50e8183eeeb6178dcb167ae34a8051d63535023ae38b5d8d12beae193d37b" 1062 | dependencies = [ 1063 | "serde", 1064 | ] 1065 | 1066 | [[package]] 1067 | name = "serde_derive" 1068 | version = "1.0.147" 1069 | source = "registry+https://github.com/rust-lang/crates.io-index" 1070 | checksum = "4f1d362ca8fc9c3e3a7484440752472d68a6caa98f1ab81d99b5dfe517cec852" 1071 | dependencies = [ 1072 | "proc-macro2", 1073 | "quote", 1074 | "syn", 1075 | ] 1076 | 1077 | [[package]] 1078 | name = "serde_json" 1079 | version = "1.0.85" 1080 | source = "registry+https://github.com/rust-lang/crates.io-index" 1081 | checksum = "e55a28e3aaef9d5ce0506d0a14dbba8054ddc7e499ef522dd8b26859ec9d4a44" 1082 | dependencies = [ 1083 | "itoa", 1084 | "ryu", 1085 | "serde", 1086 | ] 1087 | 1088 | [[package]] 1089 | name = "serde_with" 1090 | version = "2.0.1" 1091 | source = "registry+https://github.com/rust-lang/crates.io-index" 1092 | checksum = "368f2d60d049ea019a84dcd6687b0d1e0030fe663ae105039bdf967ed5e6a9a7" 1093 | dependencies = [ 1094 | "base64", 1095 | "chrono", 1096 | "hex", 1097 | "indexmap", 1098 | "serde", 1099 | "serde_json", 1100 | "serde_with_macros", 1101 | "time", 1102 | ] 1103 | 1104 | [[package]] 1105 | name = "serde_with_macros" 1106 | version = "2.0.1" 1107 | source = "registry+https://github.com/rust-lang/crates.io-index" 1108 | checksum = "1ccadfacf6cf10faad22bbadf55986bdd0856edfb5d9210aa1dcf1f516e84e93" 1109 | dependencies = [ 1110 | "darling", 1111 | "proc-macro2", 1112 | "quote", 1113 | "syn", 1114 | ] 1115 | 1116 | [[package]] 1117 | name = "sha2" 1118 | version = "0.9.9" 1119 | source = "registry+https://github.com/rust-lang/crates.io-index" 1120 | checksum = "4d58a1e1bf39749807d89cf2d98ac2dfa0ff1cb3faa38fbb64dd88ac8013d800" 1121 | dependencies = [ 1122 | "block-buffer 0.9.0", 1123 | "cfg-if", 1124 | "cpufeatures", 1125 | "digest 0.9.0", 1126 | "opaque-debug", 1127 | ] 1128 | 1129 | [[package]] 1130 | name = "sha2" 1131 | version = "0.10.6" 1132 | source = "registry+https://github.com/rust-lang/crates.io-index" 1133 | checksum = "82e6b795fe2e3b1e845bafcb27aa35405c4d47cdfc92af5fc8d3002f76cebdc0" 1134 | dependencies = [ 1135 | "cfg-if", 1136 | "cpufeatures", 1137 | "digest 0.10.5", 1138 | ] 1139 | 1140 | [[package]] 1141 | name = "sha3" 1142 | version = "0.9.1" 1143 | source = "registry+https://github.com/rust-lang/crates.io-index" 1144 | checksum = "f81199417d4e5de3f04b1e871023acea7389672c4135918f05aa9cbf2f2fa809" 1145 | dependencies = [ 1146 | "block-buffer 0.9.0", 1147 | "digest 0.9.0", 1148 | "keccak", 1149 | "opaque-debug", 1150 | ] 1151 | 1152 | [[package]] 1153 | name = "sha3" 1154 | version = "0.10.5" 1155 | source = "registry+https://github.com/rust-lang/crates.io-index" 1156 | checksum = "e2904bea16a1ae962b483322a1c7b81d976029203aea1f461e51cd7705db7ba9" 1157 | dependencies = [ 1158 | "digest 0.10.5", 1159 | "keccak", 1160 | ] 1161 | 1162 | [[package]] 1163 | name = "signature" 1164 | version = "1.6.4" 1165 | source = "registry+https://github.com/rust-lang/crates.io-index" 1166 | checksum = "74233d3b3b2f6d4b006dc19dee745e73e2a6bfb6f93607cd3b02bd5b00797d7c" 1167 | dependencies = [ 1168 | "rand_core", 1169 | ] 1170 | 1171 | [[package]] 1172 | name = "strsim" 1173 | version = "0.10.0" 1174 | source = "registry+https://github.com/rust-lang/crates.io-index" 1175 | checksum = "73473c0e59e6d5812c5dfe2a064a6444949f089e20eec9a2e5506596494e4623" 1176 | 1177 | [[package]] 1178 | name = "subtle" 1179 | version = "2.4.1" 1180 | source = "registry+https://github.com/rust-lang/crates.io-index" 1181 | checksum = "6bdef32e8150c2a081110b42772ffe7d7c9032b606bc226c8260fd97e0976601" 1182 | 1183 | [[package]] 1184 | name = "subtle-ng" 1185 | version = "2.5.0" 1186 | source = "registry+https://github.com/rust-lang/crates.io-index" 1187 | checksum = "734676eb262c623cec13c3155096e08d1f8f29adce39ba17948b18dad1e54142" 1188 | 1189 | [[package]] 1190 | name = "syn" 1191 | version = "1.0.101" 1192 | source = "registry+https://github.com/rust-lang/crates.io-index" 1193 | checksum = "e90cde112c4b9690b8cbe810cba9ddd8bc1d7472e2cae317b69e9438c1cba7d2" 1194 | dependencies = [ 1195 | "proc-macro2", 1196 | "quote", 1197 | "unicode-ident", 1198 | ] 1199 | 1200 | [[package]] 1201 | name = "synstructure" 1202 | version = "0.12.6" 1203 | source = "registry+https://github.com/rust-lang/crates.io-index" 1204 | checksum = "f36bdaa60a83aca3921b5259d5400cbf5e90fc51931376a9bd4a0eb79aa7210f" 1205 | dependencies = [ 1206 | "proc-macro2", 1207 | "quote", 1208 | "syn", 1209 | "unicode-xid", 1210 | ] 1211 | 1212 | [[package]] 1213 | name = "textwrap" 1214 | version = "0.16.0" 1215 | source = "registry+https://github.com/rust-lang/crates.io-index" 1216 | checksum = "222a222a5bfe1bba4a77b45ec488a741b3cb8872e5e499451fd7d0129c9c7c3d" 1217 | 1218 | [[package]] 1219 | name = "thiserror" 1220 | version = "1.0.37" 1221 | source = "registry+https://github.com/rust-lang/crates.io-index" 1222 | checksum = "10deb33631e3c9018b9baf9dcbbc4f737320d2b576bac10f6aefa048fa407e3e" 1223 | dependencies = [ 1224 | "thiserror-impl", 1225 | ] 1226 | 1227 | [[package]] 1228 | name = "thiserror-impl" 1229 | version = "1.0.37" 1230 | source = "registry+https://github.com/rust-lang/crates.io-index" 1231 | checksum = "982d17546b47146b28f7c22e3d08465f6b8903d0ea13c1660d9d84a6e7adcdbb" 1232 | dependencies = [ 1233 | "proc-macro2", 1234 | "quote", 1235 | "syn", 1236 | ] 1237 | 1238 | [[package]] 1239 | name = "threadpool" 1240 | version = "1.8.1" 1241 | source = "registry+https://github.com/rust-lang/crates.io-index" 1242 | checksum = "d050e60b33d41c19108b32cea32164033a9013fe3b46cbd4457559bfbf77afaa" 1243 | dependencies = [ 1244 | "num_cpus", 1245 | ] 1246 | 1247 | [[package]] 1248 | name = "time" 1249 | version = "0.3.14" 1250 | source = "registry+https://github.com/rust-lang/crates.io-index" 1251 | checksum = "3c3f9a28b618c3a6b9251b6908e9c99e04b9e5c02e6581ccbb67d59c34ef7f9b" 1252 | dependencies = [ 1253 | "itoa", 1254 | "libc", 1255 | "num_threads", 1256 | "serde", 1257 | ] 1258 | 1259 | [[package]] 1260 | name = "tinytemplate" 1261 | version = "1.2.1" 1262 | source = "registry+https://github.com/rust-lang/crates.io-index" 1263 | checksum = "be4d6b5f19ff7664e8c98d03e2139cb510db9b0a60b55f8e8709b689d939b6bc" 1264 | dependencies = [ 1265 | "serde", 1266 | "serde_json", 1267 | ] 1268 | 1269 | [[package]] 1270 | name = "tokio" 1271 | version = "1.21.2" 1272 | source = "registry+https://github.com/rust-lang/crates.io-index" 1273 | checksum = "a9e03c497dc955702ba729190dc4aac6f2a0ce97f913e5b1b5912fc5039d9099" 1274 | dependencies = [ 1275 | "autocfg", 1276 | "pin-project-lite", 1277 | "tokio-macros", 1278 | ] 1279 | 1280 | [[package]] 1281 | name = "tokio-macros" 1282 | version = "1.8.0" 1283 | source = "registry+https://github.com/rust-lang/crates.io-index" 1284 | checksum = "9724f9a975fb987ef7a3cd9be0350edcbe130698af5b8f7a631e23d42d052484" 1285 | dependencies = [ 1286 | "proc-macro2", 1287 | "quote", 1288 | "syn", 1289 | ] 1290 | 1291 | [[package]] 1292 | name = "truncator" 1293 | version = "0.1.0" 1294 | dependencies = [ 1295 | "criterion", 1296 | "fastcrypto", 1297 | "rand", 1298 | "secp256k1", 1299 | "signature", 1300 | ] 1301 | 1302 | [[package]] 1303 | name = "typenum" 1304 | version = "1.15.0" 1305 | source = "registry+https://github.com/rust-lang/crates.io-index" 1306 | checksum = "dcf81ac59edc17cc8697ff311e8f5ef2d99fcbd9817b34cec66f90b6c3dfd987" 1307 | 1308 | [[package]] 1309 | name = "unicode-ident" 1310 | version = "1.0.4" 1311 | source = "registry+https://github.com/rust-lang/crates.io-index" 1312 | checksum = "dcc811dc4066ac62f84f11307873c4850cb653bfa9b1719cee2bd2204a4bc5dd" 1313 | 1314 | [[package]] 1315 | name = "unicode-xid" 1316 | version = "0.2.4" 1317 | source = "registry+https://github.com/rust-lang/crates.io-index" 1318 | checksum = "f962df74c8c05a667b5ee8bcf162993134c104e96440b663c8daa176dc772d8c" 1319 | 1320 | [[package]] 1321 | name = "universal-hash" 1322 | version = "0.5.0" 1323 | source = "registry+https://github.com/rust-lang/crates.io-index" 1324 | checksum = "7d3160b73c9a19f7e2939a2fdad446c57c1bbbbf4d919d3213ff1267a580d8b5" 1325 | dependencies = [ 1326 | "crypto-common", 1327 | "subtle", 1328 | ] 1329 | 1330 | [[package]] 1331 | name = "version_check" 1332 | version = "0.9.4" 1333 | source = "registry+https://github.com/rust-lang/crates.io-index" 1334 | checksum = "49874b5167b65d7193b8aba1567f5c7d93d001cafc34600cee003eda787e483f" 1335 | 1336 | [[package]] 1337 | name = "walkdir" 1338 | version = "2.3.2" 1339 | source = "registry+https://github.com/rust-lang/crates.io-index" 1340 | checksum = "808cf2735cd4b6866113f648b791c6adc5714537bc222d9347bb203386ffda56" 1341 | dependencies = [ 1342 | "same-file", 1343 | "winapi", 1344 | "winapi-util", 1345 | ] 1346 | 1347 | [[package]] 1348 | name = "wasi" 1349 | version = "0.11.0+wasi-snapshot-preview1" 1350 | source = "registry+https://github.com/rust-lang/crates.io-index" 1351 | checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" 1352 | 1353 | [[package]] 1354 | name = "wasm-bindgen" 1355 | version = "0.2.83" 1356 | source = "registry+https://github.com/rust-lang/crates.io-index" 1357 | checksum = "eaf9f5aceeec8be17c128b2e93e031fb8a4d469bb9c4ae2d7dc1888b26887268" 1358 | dependencies = [ 1359 | "cfg-if", 1360 | "wasm-bindgen-macro", 1361 | ] 1362 | 1363 | [[package]] 1364 | name = "wasm-bindgen-backend" 1365 | version = "0.2.83" 1366 | source = "registry+https://github.com/rust-lang/crates.io-index" 1367 | checksum = "4c8ffb332579b0557b52d268b91feab8df3615f265d5270fec2a8c95b17c1142" 1368 | dependencies = [ 1369 | "bumpalo", 1370 | "log", 1371 | "once_cell", 1372 | "proc-macro2", 1373 | "quote", 1374 | "syn", 1375 | "wasm-bindgen-shared", 1376 | ] 1377 | 1378 | [[package]] 1379 | name = "wasm-bindgen-macro" 1380 | version = "0.2.83" 1381 | source = "registry+https://github.com/rust-lang/crates.io-index" 1382 | checksum = "052be0f94026e6cbc75cdefc9bae13fd6052cdcaf532fa6c45e7ae33a1e6c810" 1383 | dependencies = [ 1384 | "quote", 1385 | "wasm-bindgen-macro-support", 1386 | ] 1387 | 1388 | [[package]] 1389 | name = "wasm-bindgen-macro-support" 1390 | version = "0.2.83" 1391 | source = "registry+https://github.com/rust-lang/crates.io-index" 1392 | checksum = "07bc0c051dc5f23e307b13285f9d75df86bfdf816c5721e573dec1f9b8aa193c" 1393 | dependencies = [ 1394 | "proc-macro2", 1395 | "quote", 1396 | "syn", 1397 | "wasm-bindgen-backend", 1398 | "wasm-bindgen-shared", 1399 | ] 1400 | 1401 | [[package]] 1402 | name = "wasm-bindgen-shared" 1403 | version = "0.2.83" 1404 | source = "registry+https://github.com/rust-lang/crates.io-index" 1405 | checksum = "1c38c045535d93ec4f0b4defec448e4291638ee608530863b1e2ba115d4fff7f" 1406 | 1407 | [[package]] 1408 | name = "web-sys" 1409 | version = "0.3.60" 1410 | source = "registry+https://github.com/rust-lang/crates.io-index" 1411 | checksum = "bcda906d8be16e728fd5adc5b729afad4e444e106ab28cd1c7256e54fa61510f" 1412 | dependencies = [ 1413 | "js-sys", 1414 | "wasm-bindgen", 1415 | ] 1416 | 1417 | [[package]] 1418 | name = "which" 1419 | version = "4.3.0" 1420 | source = "registry+https://github.com/rust-lang/crates.io-index" 1421 | checksum = "1c831fbbee9e129a8cf93e7747a82da9d95ba8e16621cae60ec2cdc849bacb7b" 1422 | dependencies = [ 1423 | "either", 1424 | "libc", 1425 | "once_cell", 1426 | ] 1427 | 1428 | [[package]] 1429 | name = "winapi" 1430 | version = "0.3.9" 1431 | source = "registry+https://github.com/rust-lang/crates.io-index" 1432 | checksum = "5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419" 1433 | dependencies = [ 1434 | "winapi-i686-pc-windows-gnu", 1435 | "winapi-x86_64-pc-windows-gnu", 1436 | ] 1437 | 1438 | [[package]] 1439 | name = "winapi-i686-pc-windows-gnu" 1440 | version = "0.4.0" 1441 | source = "registry+https://github.com/rust-lang/crates.io-index" 1442 | checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" 1443 | 1444 | [[package]] 1445 | name = "winapi-util" 1446 | version = "0.1.5" 1447 | source = "registry+https://github.com/rust-lang/crates.io-index" 1448 | checksum = "70ec6ce85bb158151cae5e5c87f95a8e97d2c0c4b001223f33a334e3ce5de178" 1449 | dependencies = [ 1450 | "winapi", 1451 | ] 1452 | 1453 | [[package]] 1454 | name = "winapi-x86_64-pc-windows-gnu" 1455 | version = "0.4.0" 1456 | source = "registry+https://github.com/rust-lang/crates.io-index" 1457 | checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" 1458 | 1459 | [[package]] 1460 | name = "zeroize" 1461 | version = "1.5.7" 1462 | source = "registry+https://github.com/rust-lang/crates.io-index" 1463 | checksum = "c394b5bd0c6f669e7275d9c20aa90ae064cb22e75a1cad54e1b34088034b149f" 1464 | dependencies = [ 1465 | "zeroize_derive", 1466 | ] 1467 | 1468 | [[package]] 1469 | name = "zeroize_derive" 1470 | version = "1.3.2" 1471 | source = "registry+https://github.com/rust-lang/crates.io-index" 1472 | checksum = "3f8f187641dad4f680d25c4bfc4225b418165984179f26ca76ec4fb6441d3a17" 1473 | dependencies = [ 1474 | "proc-macro2", 1475 | "quote", 1476 | "syn", 1477 | "synstructure", 1478 | ] 1479 | --------------------------------------------------------------------------------