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"

这个示例展示了:

  1. 使用Hashable trait为自定义结构计算SHA256哈希
  2. Base58编码解码功能
  3. FixedSet固定大小集合的使用
  4. Hidden类型保护敏感信息不在日志中泄露
  5. 十六进制字符串转换功能

1 回复

Rust实用工具库tari_utilities的使用指南

tari_utilities是Tari项目中的一个实用工具库,提供了加密、哈希和基础数据结构操作等功能,特别适合区块链和加密货币相关开发。

主要功能

  1. 加密操作:提供常用的加密算法和工具
  2. 哈希计算:支持多种哈希算法
  3. 字节操作:高效的字节数组处理
  4. 数据结构:优化的基础数据结构

安装方法

在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(())
}

性能提示

  1. 对于大量数据的哈希计算,考虑重用Hasher实例
  2. 使用ByteArray特性可以避免不必要的内存分配
  3. 加密操作使用硬件加速时性能最佳

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(())
}

这个完整示例展示了:

  1. 自定义数据结构实现Hashable特性
  2. 使用加密功能保护敏感数据
  3. 字节数组的十六进制表示
  4. 可变长度整数编码
  5. 构建默克尔树验证交易完整性

所有功能都集成在一个完整的区块链交易处理示例中,展示了tari_utilities在真实场景中的应用。

回到顶部