Rust区块链开发库fuels-core的使用:Fuel区块链SDK核心组件,支持智能合约交互与链上操作

Rust区块链开发库fuels-core的使用:Fuel区块链SDK核心组件,支持智能合约交互与链上操作

fuels-core是Fuel区块链的Rust SDK核心组件,提供了与Fuel区块链交互的基础功能,包括智能合约部署、调用和链上操作。

安装

在项目目录中运行以下Cargo命令:

cargo add fuels-core

或者在Cargo.toml中添加:

fuels-core = "0.74.0"

基本功能

fuels-core提供了以下核心功能:

  • 钱包管理
  • 合约部署
  • 合约方法调用
  • 交易构建与发送
  • 区块链数据查询

示例代码

以下是一个完整的示例,展示如何使用fuels-core与Fuel区块链交互:

use fuels::{
    accounts::wallet::WalletUnlocked,
    prelude::*,
    tx::Receipt,
};

// 设置Fuel测试网节点URL
const NODE_URL: &str = "https://node.testnet.fuel.network";

#[tokio::main]
async fn main() -> Result<()> {
    // 1. 创建钱包
    let wallet = WalletUnlocked::new_random(None);
    println!("Wallet address: {:?}", wallet.address());

    // 2. 连接到Fuel节点
    let provider = Provider::connect(NODE_URL).await?;
    wallet.set_provider(provider.clone());

    // 3. 获取钱包余额
    let balance = wallet.get_asset_balance(&AssetId::default()).await?;
    println!("Wallet balance: {}", balance);

    // 4. 部署合约示例
    let compiled = Contract::load_sway_contract("path/to/contract/out/debug/contract.bin")?;
    let contract_id = Contract::deploy(&compiled, &wallet, TxParameters::default()).await?;
    println!("Contract deployed: {:?}", contract_id);

    // 5. 调用合约方法
    let contract_instance = MyContract::new(contract_id, wallet.clone());
    let response = contract_instance
        .some_method()
        .call()
        .await?;

    println!("Contract call response: {:?}", response.value);

    Ok(())
}

// 合约ABI绑定
abigen!(Contract(
    name = "MyContract",
    abi = "path/to/contract/out/debug/contract-abi.json"
));

功能说明

  1. 钱包创建:可以使用WalletUnlocked创建新钱包或导入现有私钥
  2. 节点连接:通过Provider连接到Fuel网络节点
  3. 余额查询:查询钱包中的原生代币余额
  4. 合约部署:从编译后的Sway合约二进制文件部署合约
  5. 合约调用:通过生成的合约绑定调用合约方法

高级功能

// 发送代币示例
async fn send_funds(wallet: &WalletUnlocked, to: Address, amount: u64) -> Result<()> {
    let tx = wallet
        .transfer(to, amount, AssetId::default(), TxParameters::default())
        .await?;
    
    println!("Transfer tx id: {:?}", tx.tx_id());
    Ok(())
}

// 事件监听示例
async fn listen_to_events(provider: &Provider) -> Result<()> {
    let mut events = provider.subscribe().await?;
    
    while let Some(event) = events.next().await {
        println!("New event: {:?}", event?);
    }
    
    Ok(())
}

完整示例代码

以下是一个更完整的示例,展示如何使用fuels-core进行Fuel区块链开发:

use fuels::{
    accounts::wallet::WalletUnlocked,
    prelude::*,
    types::transaction::TxParameters,
    tx::{Contract, Receipt},
};

// 定义合约ABI结构
abigen!(Contract(
    name = "CounterContract",
    abi = "examples/contracts/counter/out/debug/counter-abi.json"
));

// 测试网节点URL
const NODE_URL: &str = "https://node.testnet.fuel.network";

#[tokio::main]
async fn main() -> Result<()> {
    // 1. 初始化钱包
    let private_key = "a144..."; // 替换为你的私钥
    let wallet = WalletUnlocked::new_from_private_key(private_key.parse()?, None);
    
    // 2. 连接Fuel节点
    let provider = Provider::connect(NODE_URL).await?;
    wallet.set_provider(provider.clone());
    
    // 3. 查询余额
    let balance = wallet.get_asset_balance(&AssetId::default()).await?;
    println!("当前余额: {}", balance);
    
    // 4. 部署计数器合约
    let bytecode = Contract::load_sway_contract("examples/contracts/counter/out/debug/counter.bin")?;
    let contract_id = Contract::deploy(&bytecode, &wallet, TxParameters::default()).await?;
    println!("合约部署成功,ID: {:?}", contract_id);
    
    // 5. 实例化合约
    let instance = CounterContract::new(contract_id, wallet.clone());
    
    // 6. 调用合约方法
    // 获取当前计数器值
    let result = instance.methods().get_count().call().await?;
    println!("当前计数值: {}", result.value);
    
    // 增加计数器值
    let _ = instance.methods().increment().call().await?;
    
    // 再次查询计数器值
    let result = instance.methods().get_count().call().await?;
    println!("增加后的计数值: {}", result.value);
    
    Ok(())
}

注意事项

  1. 使用前请确保已安装最新版本的Rust
  2. 测试时需要Fuel测试网的测试代币
  3. 合约部署需要先编译Sway合约
  4. 生产环境建议使用更安全的密钥管理方式

fuels-core是Fuel生态系统的重要组成部分,为Rust开发者提供了构建去中心化应用的基础工具。


1 回复

fuels-core:Fuel区块链SDK核心组件使用指南

fuels-core是Fuel区块链的Rust SDK核心组件,提供了与Fuel区块链交互的基础功能,包括智能合约交互和链上操作。

主要功能

  • 连接Fuel节点
  • 管理钱包和账户
  • 与智能合约交互
  • 发送交易
  • 查询链上数据

安装

在Cargo.toml中添加依赖:

[dependencies]
fuels-core = "0.24"

基本使用方法

1. 连接到Fuel节点

use fuels::prelude::*;

#[tokio::main]
async fn main() -> Result<()> {
    // 连接到本地测试节点
    let provider = Provider::connect("http://127.0.0.1:4000").await?;
    
    // 或者连接到测试网
    // let provider = Provider::connect("https://beta-3.fuel.network").await?;
    
    Ok(())
}

2. 创建钱包

use fuels::prelude::*;

#[tokio::main]
async fn main() -> Result<()> {
    // 生成新钱包
    let wallet = WalletUnlocked::new_random(None);
    
    println!("钱包地址: {}", wallet.address());
    println!("私钥: {}", wallet.signer().unwrap().private_key());
    
    Ok(())
}

3. 与智能合约交互

假设你有一个简单的智能合约:

contract Counter {
    value: u64 = 0;
    
    fn increment() {
        value += 1;
    }
    
    fn get() -> u64 {
        value
    }
}

使用fuels-core与之交互:

use fuels::{
    prelude::*,
    types::contract_id::ContractId,
};

#[tokio::main]
async fn main() -> Result<()> {
    // 设置provider和钱包
    let provider = Provider::connect("http://127.0.0.1:4000").await?;
    let wallet = WalletUnlocked::new_random(None);
    
    // 部署合约
    let compiled = Contract::load_sway_contract("path/to/counter/out/debug/counter.bin")?;
    let contract_id = Contract::deploy(&compiled, &wallet, TxParameters::default()).await?;
    
    println!("合约部署成功,ID: {:?}", contract_id);
    
    // 调用合约方法
    let instance = Counter::new(contract_id, wallet.clone());
    
    // 调用increment方法
    instance.increment().call().await?;
    
    // 查询当前值
    let current_value = instance.get().call().await?.value;
    println!("当前计数器值: {}", current_value);
    
    Ok(())
}

4. 发送和接收资产

use fuels::prelude::*;

#[tokio::main]
async fn main() -> Result<()> {
    // 设置provider
    let provider = Provider::connect("http://127.0.0.1:4000").await?;
    
    // 创建两个钱包
    let wallet1 = WalletUnlocked::new_random(None);
    let wallet2 = WalletUnlocked::new_random(None);
    
    // 给钱包1充值
    wallet1.fund(&provider, 100_000_000, None).await?;
    
    // 从钱包1发送资产到钱包2
    let tx = wallet1.transfer(
        wallet2.address(),
        50_000_000,
        None,
        TxParameters::default(),
    ).await?;
    
    println!("交易ID: {:?}", tx.tx_id);
    
    // 查询钱包2余额
    let balance = wallet2.get_asset_balance(&Default::default()).await?;
    println!("钱包2余额: {}", balance);
    
    Ok(())
}

高级功能

1. 批量交易

use fuels::prelude::*;

#[tokio::main]
async fn main() -> Result<()> {
    let provider = Provider::connect("http://127.0.0.1:4000").await?;
    let wallet = WalletUnlocked::new_random(None);
    wallet.fund(&provider, 100_000_000, None).await?;
    
    // 创建批量交易构建器
    let mut tb = TransactionBuilder::default();
    
    // 添加多个操作
    tb.add_transfer(
        wallet.address(),
        wallet.address(),
        10_000_000,
        None,
    );
    
    tb.add_transfer(
        wallet.address(),
        wallet.address(),
        20_000_000,
        None,
    );
    
    // 构建并发送交易
    let tx = tb.finalize(&wallet, TxParameters::default()).await?;
    provider.send_transaction(tx).await?;
    
    Ok(())
}

2. 事件监听

use fuels::prelude::*;

#[tokio::main]
async fn main() -> Result<()> {
    let provider = Provider::connect("http://127.0.0.1:4000").await?;
    
    // 订阅新区块事件
    let mut stream = provider.subscribe_blocks().await?;
    
    while let Some(block) = stream.next().await {
        println!("新区块: {:?}", block?.header.height);
    }
    
    Ok(())
}

完整示例代码

以下是一个完整的Fuel区块链交互示例,包含钱包创建、资产转移和智能合约交互:

use fuels::{
    prelude::*,
    types::contract_id::ContractId,
};

// 定义智能合约ABI
abi!(Counter, "path/to/counter/abi.json");

#[tokio::main]
async fn main() -> Result<()> {
    // 1. 连接到本地Fuel节点
    let provider = Provider::connect("http://127.0.0.1:4000").await?;
    
    // 2. 创建两个钱包
    let wallet1 = WalletUnlocked::new_random(None);
    let wallet2 = WalletUnlocked::new_random(None);
    
    // 3. 给钱包1充值
    wallet1.fund(&provider, 100_000_000, None).await?;
    println!("钱包1地址: {}", wallet1.address());
    
    // 4. 部署Counter智能合约
    let compiled = Contract::load_sway_contract("path/to/counter/out/debug/counter.bin")?;
    let contract_id = Contract::deploy(&compiled, &wallet1, TxParameters::default()).await?;
    println!("合约部署成功,ID: {:?}", contract_id);
    
    // 5. 与合约交互
    let counter = Counter::new(contract_id, wallet1.clone());
    
    // 调用increment方法
    counter.increment().call().await?;
    
    // 查询当前值
    let value = counter.get().call().await?.value;
    println!("当前计数器值: {}", value);
    
    // 6. 转账操作
    let tx = wallet1.transfer(
        wallet2.address(),
        50_000_000,
        None,
        TxParameters::default(),
    ).await?;
    
    println!("转账交易ID: {:?}", tx.tx_id);
    
    // 7. 查询余额
    let balance = wallet2.get_asset_balance(&Default::default()).await?;
    println!("钱包2余额: {}", balance);
    
    Ok(())
}

注意事项

  1. 确保Fuel节点正在运行并可以访问
  2. 测试时可以使用Fuel本地节点或测试网
  3. 生产环境请妥善保管私钥
  4. 交易需要足够的Gas费用

fuels-core提供了强大的功能来与Fuel区块链交互,更多详细用法可以参考官方文档和示例代码。

回到顶部