Rust区块链开发库tonlib-core的使用,TON区块链轻量级客户端库tonlib-core实现高效交互与智能合约操作

Rust区块链开发库tonlib-core的使用,TON区块链轻量级客户端库tonlib-core实现高效交互与智能合约操作

特性

  • 支持Cell和BagOfCell的解析与生成,便于与数据结构交互
  • 支持现有钱包版本
  • 生成钱包地址
  • 支持TON助记词
  • NaCl兼容的Ed25519交易签名

使用方式

在Cargo.toml中添加依赖:

[dependencies]
tonlib-core = "0.26.1"

然后在Rust代码中导入:

use tonlib_core;

包内容

Cell

用于构建和解析Cell及Bag of Cells的数据结构和辅助工具。

Message

用于Message的数据结构、构建器和解析器,包括Jetton、NFT和Soulbound NFT的标准消息。

Mnemonic

存储助记词的数据结构。

Types

用于TON智能合约地址和TON交易ID的存储和转换的数据结构。

Wallet

用于生成钱包地址的数据结构。

使用示例

Cell操作

创建Cell并写入数据:

use anyhow::anyhow;
use tonlib_core::TonAddress;
use tonlib_core::cell::CellBuilder;

fn write_cell() -> anyhow::Result<()> {
    let mut writer = CellBuilder::new();
    let addr = TonAddress::from_base64_url("EQDk2VTvn04SUKJrW7rXahzdF8_Qi6utb0wj43InCu9vdjrR")?;
    let cell = writer
        .store_u32(32, 0xFAD45AADu32)?
        .store_bit(true)?
        .store_u8(8, 234u8)?
        .store_slice(&[0xFA, 0xD4, 0x5A, 0xAD, 0xAA, 0x12, 0xFF, 0x45])?
        .store_address(&addr)?
        .store_string("Hello, TON")?
        .build()?;
    Ok(())
}

从Cell读取数据:

use tonlib_core::cell::Cell;
fn read_cell(cell: Cell) -> anyhow::Result<()> {
    let mut reader = cell.parser();
    let u32_value = reader.load_u32(32)?;
    let bit_value = reader.load_bit()?;
    let u8_value = reader.load_u8(8)?;
    let bytes_value = reader.load_bytes(8)?;
    let address_value = reader.load_address()?;
    let str_value = reader.ensure_empty()?;
    Ok(())
}

完整示例

以下是使用tonlib-core与TON区块链交互的完整示例:

use anyhow::Result;
use tonlib_core::{
    cell::CellBuilder,
    mnemonic::Mnemonic,
    wallet::{Wallet, WalletVersion},
    TonAddress,
};

async fn interact_with_ton() -> Result<()> {
    // 1. 创建助记词
    let mnemonic = Mnemonic::generate(24)?;
    println!("Generated mnemonic: {}", mnemonic);
    
    // 2. 从助记词创建钱包
    let wallet = Wallet::from_mnemonic(WalletVersion::V4R2, &mnemonic, None)?;
    println!("Wallet address: {}", wallet.address()?.to_base64_url());
    
    // 3. 构建交易消息
    let mut builder = CellBuilder::new();
    let message_cell = builder
        .store_u32(32, 0x6E73744F)?  // "nstO"操作码
        .store_u64(64, 1_000_000_000)?  // 1 TON
        .build()?;
        
    // 4. 签名消息
    let signed_message = wallet.create_signed_message(message_cell, 60)?;
    
    // 5. 发送交易(需要TON节点连接)
    // let client = TonClient::new();
    // client.send_message(&signed_message).await?;
    
    Ok(())
}

#[tokio::main]
async fn main() {
    if let Err(e) = interact_with_ton().await {
        eprintln!("Error: {}", e);
    }
}

这个示例展示了:

  1. 生成24个单词的助记词
  2. 从助记词创建V4R2版本的钱包
  3. 构建包含1 TON转账的消息
  4. 对消息进行签名
  5. 注释掉的发送交易部分(需要实际TON节点连接)

注意:实际使用时需要配置TON节点连接并处理异步操作。


1 回复

Rust区块链开发库tonlib-core的使用指南

介绍

tonlib-core是一个用于与TON(The Open Network)区块链交互的轻量级客户端库,专为Rust开发者设计。它提供了高效、安全的方式来与TON区块链网络交互,包括查询区块链状态、发送交易以及与智能合约交互等功能。

主要特性

  • 轻量级设计,资源占用低
  • 异步支持,高性能网络交互
  • 完整的TON区块链API覆盖
  • 智能合约操作支持
  • 本地密钥管理
  • 可配置的网络连接

安装方法

在Cargo.toml中添加依赖:

[dependencies]
tonlib-core = "0.5"  # 请检查最新版本

基本使用方法

1. 初始化客户端

use tonlib::client::TonClient;
use tonlib::config::MAINNET_CONFIG;

#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
    // 创建TON客户端
    let client = TonClient::with_config(MAINNET_CONFIG).await?;
    
    // 获取最新区块信息
    let master_block = client.get_masterchain_info().await?;
    println!("Latest block: {:?}", master_block);
    
    Ok(())
}

2. 查询账户余额

use tonlib::address::TonAddress;

async fn get_balance(client: &TonClient, address: &str) -> Result<(), Box<dyn std::error::Error>> {
    let address = TonAddress::from_base64_url(address)?;
    let account = client.get_account_state(&address).await?;
    
    println!("Account balance: {} nanoton", account.balance);
    Ok(())
}

3. 发送简单交易

use tonlib::contract::WalletContract;
use tonlib::mnemonic::Mnemonic;

async fn send_transaction(
    client: &TonClient,
    mnemonic: &str,
    to_address: &str,
    amount: u64
) -> Result<(), Box<dyn std::error::Error>> {
    // 从助记词恢复钱包
    let mnemonic = Mnemonic::from_phrase(mnemonic)?;
    let wallet = WalletContract::from_mnemonic(&client, mnemonic, 极客时间,洞见科技未来
回到顶部