Rust实用工具库tari_utilities的使用:高效处理加密、哈希和基础数据结构操作
Rust实用工具库tari_utilities的使用:高效处理加密、哈希和基础数据结构操作
Tari Utilities
![Security audit badge]
![Clippy badge]
![Coverage Status]
这个crate是Tari加密货币项目的一部分,提供了一系列在Tari项目中常用的实用工具。
主要功能模块
bit
提供整数和位数组之间转换的函数
byte_array
提供数据类型作为字节数组或十六进制字符串表示的trait
convert
尝试将一系列T类型转换为U类型的函数
encoding
处理base58编码和解码的trait
epoch_time
用u64表示时间的数据结构
extend_bytes
允许调用append_raw_bytes和获取类型原始字节的trait
fixed_set
描述大小为n的固定集合的数据结构
hash
简单的Hashable trait,描述对象应如何被哈希
hex
二进制和十六进制字符串之间转换的函数
locks
RwLock的宏
message_format
处理从二进制、json或base64转换的MessageFormat trait
Hidden
用于在日志中隐藏敏感信息的包装类型
功能标志
可以通过功能标志移除某些功能:
std
允许使用epoch_time、encoding和safe_array
zero
包含zeroize支持
serialize
包含serde支持
borsh
包含borsh支持
default
包含所有功能标志
示例代码
以下是使用tari_utilities进行哈希和hex转换的完整示例:
use tari_utilities::{hex::Hex, hash::Hashable};
use sha2::{Sha256, Digest};
// 定义可哈希的结构体
#[derive(Debug)]
struct Transaction {
sender: String,
receiver: String,
amount: u64,
}
impl Hashable for Transaction {
fn hash(&self) -> Vec<u8> {
let mut hasher = Sha256::new();
hasher.update(self.sender.as_bytes());
hasher.update(self.receiver.as_bytes());
hasher.update(self.amount.to_be_bytes());
hasher.finalize().to_vec()
}
}
fn main() {
// 创建交易实例
let tx = Transaction {
sender: "Alice".to_string(),
receiver: "Bob".to_string(),
amount: 100,
};
// 计算交易哈希
let tx_hash = tx.hash();
// 将哈希值转换为hex字符串
let hex_hash = tx_hash.to_hex();
println!("Transaction hash (hex): {}", hex_hash);
// 从hex字符串还原字节数组
let restored_bytes = Vec::from_hex(&hex_hash).unwrap();
assert_eq!(tx_hash, restored_bytes);
println!("Original bytes: {:?}", tx_hash);
println!("Restored bytes: {:?}", restored_bytes);
}
另一个使用byte_array和fixed_set的示例:
use tari_utilities::{byte_array::ByteArray, fixed_set::FixedSet};
// 测试ByteArray trait
fn test_byte_array<T: ByteArray>(data: &T) {
println!("Original: {:?}", data);
println!("As hex: {}", data.to_hex());
println!("As bytes: {:?}", data.as_bytes());
}
// 测试FixedSet
fn test_fixed_set() {
let mut set = FixedSet::<10>::default();
set.insert(5);
set.insert(3);
set.insert(8);
println!("Set contains 5: {}", set.contains(&5));
println!("Set contains 7: {}", set.contains(&7));
println!("Set items: {:?}", set.iter().collect::<Vec<_>>());
}
fn main() {
// 测试ByteArray
let num = 123456u64;
test_byte_array(&num);
// 测试FixedSet
test_fixed_set();
}
完整示例demo
以下是一个结合多个tari_utilities功能的完整示例,展示如何使用加密哈希、base58编码和固定集合:
use tari_utilities::{hex::Hex, hash::Hashable, encoding::Base58, fixed_set::FixedSet};
use sha2::{Sha256, Digest};
// 定义可哈希的数据结构
#[derive(Debug)]
struct BlockHeader {
version: u32,
prev_hash: Vec<u8>,
timestamp: u64,
nonce: u64,
}
impl Hashable for BlockHeader {
fn hash(&self) -> Vec<u8> {
let mut hasher = Sha256::new();
hasher.update(self.version.to_be_bytes());
hasher.update(&self.prev_hash);
hasher.update(self.timestamp.to_be_bytes());
hasher.update(self.nonce.to_be_bytes());
hasher.finalize().to_vec()
}
}
// 实现Base58编码
fn encode_and_decode(hash: &[u8]) {
let encoded = hash.to_base58();
println!("Base58 encoded: {}", encoded);
let decoded = Vec::from_base58(&encoded).unwrap();
assert_eq!(hash, decoded.as_slice());
println!("Base58 decoded matches original");
}
fn main() {
// 1. 创建区块头并计算哈希
let header = BlockHeader {
version: 1,
prev_hash: vec![0; 32], // 初始哈希全0
timestamp: 1630000000,
nonce: 12345,
};
let header_hash = header.hash();
println!("Header hash (hex): {}", header_hash.to_hex());
// 2. Base58编码演示
encode_and_decode(&header_hash);
// 3. 使用FixedSet存储已验证的交易哈希
let mut verified_tx_set = FixedSet::<100>::default();
verified_tx_set.insert(header_hash[0] as usize); // 简单示例,实际应用中会使用完整哈希
println!("Set contains first byte of hash: {}",
verified_tx_set.contains(&(header_hash[0] as usize)));
// 4. 使用Hidden类型保护敏感信息
let sensitive = tari_utilities::Hidden::new("secret key".to_string());
println!("Sensitive info hidden in logs: {:?}", sensitive);
}
要使用tari_utilities,请在你的Cargo.toml中添加以下依赖:
[dependencies]
tari_utilities = "0.8.0"
sha2 = "0.10"
这个示例展示了:
- 使用Hashable trait为自定义结构计算SHA256哈希
- Base58编码解码功能
- FixedSet固定大小集合的使用
- Hidden类型保护敏感信息不在日志中泄露
- 十六进制字符串转换功能
Rust实用工具库tari_utilities的使用指南
tari_utilities
是Tari项目中的一个实用工具库,提供了加密、哈希和基础数据结构操作等功能,特别适合区块链和加密货币相关开发。
主要功能
- 加密操作:提供常用的加密算法和工具
- 哈希计算:支持多种哈希算法
- 字节操作:高效的字节数组处理
- 数据结构:优化的基础数据结构
安装方法
在Cargo.toml中添加依赖:
[dependencies]
tari_utilities = "0.4"
使用示例
1. 哈希计算
use tari_utilities::hash::Hashable;
#[derive(Clone)]
struct MyData {
field1: u32,
field2: String,
}
impl Hashable for MyData {
fn hash(&self) -> Vec<u8> {
let mut hasher = tari_utilities::hash::blake2::Blake256::new();
hasher.update(&self.field1.to_le_bytes());
hasher.update(self.field2.as_bytes());
hasher.finalize().to_vec()
}
}
let data = MyData {
field1: 42,
field2: "hello".to_string(),
};
let hash = data.hash();
println!("Hash: {:?}", hash);
2. 字节数组操作
use tari_utilities::ByteArray;
let mut bytes = [0u8; 32];
bytes.copy_from_slice(b"this is a 32 byte array.........");
println!("Byte array: {:?}", bytes.to_hex());
3. 加密工具
use tari_utilities::encryption::{decrypt, encrypt, generate_key};
let key = generate_key();
let message = b"secret message";
let encrypted = encrypt(&key, message).unwrap();
let decrypted = decrypt(&key, &encrypted).unwrap();
assert_eq!(message, decrypted.as_slice());
4. 可变长度整数编码
use tari_utilities::varint::VarInt;
let num = 1234567890u64;
let encoded = num.encode_varint();
let (decoded, remaining) = u64::decode_varint(&encoded).unwrap();
assert_eq!(num, decoded);
assert!(remaining.is_empty());
高级功能
默克尔树实现
use tari_utilities::merkle_tree::{MerkleTree, MerkleTreeError};
fn main() -> Result<(), MerkleTreeError> {
let leaves = vec![
vec![1, 2, 3],
vec![4, 5, 6],
vec![7, 8, 9],
vec![10, 11, 12],
];
let tree = MerkleTree::create(&leaves)?;
let root = tree.get_root();
println!("Merkle root: {:?}", root);
let proof = tree.create_proof(2)?; // Proof for 3rd element
assert!(proof.verify(&root, &leaves[2]));
Ok(())
}
性能提示
- 对于大量数据的哈希计算,考虑重用Hasher实例
- 使用
ByteArray
特性可以避免不必要的内存分配 - 加密操作使用硬件加速时性能最佳
tari_utilities
库经过优化,特别适合高性能要求的区块链应用场景。
完整示例Demo
下面是一个整合了多个功能的完整示例:
use tari_utilities::{
hash::Hashable,
ByteArray,
encryption::{encrypt, decrypt, generate_key},
varint::VarInt,
merkle_tree::{MerkleTree, MerkleTreeError}
};
// 1. 哈希计算示例
#[derive(Clone)]
struct Transaction {
amount: u64,
recipient: String,
}
impl Hashable for Transaction {
fn hash(&self) -> Vec<u8> {
let mut hasher = tari_utilities::hash::blake2::Blake256::new();
hasher.update(&self.amount.to_le_bytes());
hasher.update(self.recipient.as_bytes());
hasher.finalize().to_vec()
}
}
// 2. 加密示例
fn crypto_demo() {
let key = generate_key();
let message = b"blockchain transaction";
let encrypted = encrypt(&key, message).unwrap();
let decrypted = decrypt(&key, &encrypted).unwrap();
println!("Decrypted message: {:?}", String::from_utf8_lossy(&decrypted));
}
// 3. 默克尔树示例
fn merkle_tree_demo() -> Result<(), MerkleTreeError> {
let transactions = vec![
Transaction { amount: 100, recipient: "Alice".to_string() }.hash(),
Transaction { amount: 200, recipient: "Bob".to_string() }.hash(),
Transaction { amount: 300, recipient: "Charlie".to_string() }.hash(),
];
let tree = MerkleTree::create(&transactions)?;
println!("Merkle root: {:?}", tree.get_root());
Ok(())
}
fn main() -> Result<(), MerkleTreeError> {
// 哈希示例
let tx = Transaction {
amount: 1000,
recipient: "Dave".to_string(),
};
println!("Transaction hash: {:?}", tx.hash());
// 加密示例
crypto_demo();
// 字节数组操作
let mut buffer = [0u8; 32];
buffer.copy_from_slice(b"this is a test buffer.........");
println!("Buffer hex: {}", buffer.to_hex());
// 可变长度整数
let large_num = 9876543210u64;
let encoded = large_num.encode_varint();
let (decoded, _) = u64::decode_varint(&encoded).unwrap();
println!("Varint encoded/decoded: {} -> {}", large_num, decoded);
// 默克尔树
merkle_tree_demo()?;
Ok(())
}
这个完整示例展示了:
- 自定义数据结构实现Hashable特性
- 使用加密功能保护敏感数据
- 字节数组的十六进制表示
- 可变长度整数编码
- 构建默克尔树验证交易完整性
所有功能都集成在一个完整的区块链交易处理示例中,展示了tari_utilities在真实场景中的应用。