Rust燃料生态系统库fuels-programs的使用:区块链智能合约开发与交互工具

Rust燃料生态系统库fuels-programs的使用:区块链智能合约开发与交互工具

fuels-programs是Fuel区块链生态系统的Rust库,用于智能合约开发和交互。

安装

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

cargo add fuels-programs

或者在Cargo.toml中添加:

fuels-programs = "0.74.0"

示例代码

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

use fuels_programs::{
    abigen,
    prelude::*,
    tx::Receipt,
};

// 生成合约绑定
abigen!(MyContract, "my_contract.json");

#[tokio::main]
async fn main() -> Result<()> {
    // 设置钱包和提供者
    let wallet = Wallet::new_from_private_key("your_private_key_here");
    let provider = Provider::connect("node_url").await?;
    
    // 部署合约
    let contract_id = Contract::deploy(
        "path/to/contract.bin",
        &wallet,
        TxParameters::default(),
        StorageConfiguration::default(),
    )
    .await?;
    
    // 实例化合约
    let contract = MyContract::new(contract_id, wallet.clone());
    
    // 调用合约方法
    let response = contract
        .some_method_call()
        .append_variable_outputs(1)
        .call()
        .await?;
    
    // 处理响应
    for receipt in response.receipts {
        if let Receipt::Return { val, .. } = receipt {
            println!("Return value: {}", val);
        }
    }
    
    Ok(())
}

完整示例demo

以下是一个更完整的示例,展示如何使用fuels-programs进行完整的智能合约开发和交互流程:

use fuels_programs::{
    abigen,
    prelude::*,
    tx::{Receipt, Transaction},
    types::contract_id::ContractId,
};

// 生成合约绑定 - 这里假设我们有一个简单的计数器合约
abigen!(
    CounterContract,
    r#"[
        {"type":"function","name":"increment","inputs":[],"outputs":[{"name":"","type":"u64"}]},
        {"type":"function","name":"count","inputs":[],"outputs":[{"name":"","type":"u64"}]}
    ]"#
);

#[tokio::main]
async fn main() -> Result<()> {
    // 1. 设置测试钱包
    let private_key = "0x..."; // 替换为你的私钥
    let wallet = Wallet::new_from_private_key(private_key)?;
    
    // 2. 连接到测试网络节点
    let provider = Provider::connect("beta-3.fuel.network").await?;
    wallet.set_provider(provider.clone());
    
    // 3. 部署合约
    let contract_bytecode = include_bytes!("counter_contract.bin");
    let contract_id = Contract::deploy(
        contract_bytecode,
        &wallet,
        TxParameters::default(),
        StorageConfiguration::default(),
    )
    .await?;
    
    println!("合约部署成功,ID: {:?}", contract_id);
    
    // 4. 实例化合约
    let counter = CounterContract::new(contract_id, wallet.clone());
    
    // 5. 调用合约方法
    // 获取初始计数
    let initial_count = counter.count().call().await?.value;
    println!("初始计数: {}", initial_count);
    
    // 增加计数
    let increment_tx = counter.increment().call().await?;
    
    // 6. 处理交易响应
    for receipt in increment_tx.receipts {
        match receipt {
            Receipt::Return { val, .. } => {
                println!("方法返回新计数值: {}", val);
            }
            Receipt::Log { .. } => {
                // 处理日志事件
            }
            _ => {}
        }
    }
    
    // 7. 验证计数已更新
    let updated_count = counter.count().call().await?.value;
    println!("更新后计数: {}", updated_count);
    
    Ok(())
}

主要功能

  1. 合约部署和交互:提供简单API部署智能合约并与之交互
  2. ABI支持:通过abigen!宏生成类型安全的合约绑定
  3. 交易构建:支持构建和发送各种类型的区块链交易
  4. 钱包集成:与Fuel钱包无缝集成进行签名和账户管理

许可证

Apache-2.0许可证


1 回复

Rust燃料生态系统库fuels-programs的使用:区块链智能合约开发与交互工具

完整示例Demo

下面是一个完整的Fuel智能合约开发示例,包含了合约部署、交互和测试的全流程:

use fuels::prelude::*;
use fuels::contract::contract::Contract;
use fuels::signers::wallet::WalletUnlocked;
use fuels::types::ContractId;

// 定义一个简单的计数器合约
#[tokio::main]
async fn main() -> Result<()> {
    // 1. 初始化客户端和钱包
    let provider = Provider::connect("127.0.0.1:4000").await?;
    let wallet = WalletUnlocked::new_random(None);
    
    // 2. 部署合约
    let contract_bytecode = include_bytes!("counter_contract.bin");
    let contract_id = Contract::deploy(
        &contract_bytecode[..],
        &provider,
        &wallet,
        TxParameters::default()
    ).await?;
    
    println!("合约部署成功,ID: {:?}", contract_id);
    
    // 3. 加载ABI并实例化合约
    let abi = load_abi("counter_contract-abi.json")?;
    let contract = Contract::new(contract_id, abi, provider.clone(), wallet.clone());
    
    // 4. 调用合约函数 - 获取初始值
    let initial_value = contract
        .method("get_count", ())
        .call()
        .await?;
    println!("初始计数器值: {:?}", initial_value.value);
    
    // 5. 调用合约函数 - 增加计数器
    let _ = contract
        .method("increment_count", (5,))
        .call()
        .await?;
    
    // 6. 再次获取计数器值
    let new_value = contract
        .method("get_count", ())
        .call()
        .await?;
    println!("新的计数器值: {:?}", new_value.value);
    
    // 7. 测试合约
    test_counter_contract().await?;
    
    Ok(())
}

// 测试合约
#[tokio::test]
async fn test_counter_contract() -> Result<()> {
    // 设置测试环境
    let (provider, wallet) = setup_test_provider_and_wallet().await;
    
    // 部署合约
    let contract_bytecode = include_bytes!("counter_contract.bin");
    let contract_id = Contract::deploy(
        &contract_bytecode[..],
        &provider,
        &wallet,
        TxParameters::default()
    ).await?;
    
    // 加载ABI
    let abi = load_abi("counter_contract-abi.json")?;
    let contract = Contract::new(contract_id, abi, provider.clone(), wallet.clone());
    
    // 测试初始值
    let initial = contract.method("get_count", ()).call().await?;
    assert_eq!(initial.value, 0);
    
    // 测试增加计数器
    let _ = contract.method("increment_count", (10,)).call().await?;
    let after_increment = contract.method("get_count", ()).call().await?;
    assert_eq!(after_increment.value, 10);
    
    Ok(())
}

// 事件监听示例
async fn listen_to_events(contract_id: ContractId) -> Result<()> {
    let provider = Provider::connect("127.0.0.1:4000").await?;
    
    // 订阅合约事件
    let mut events = provider.subscribe_contract_events(&contract_id).await?;
    
    println!("开始监听合约事件...");
    while let Some(event) = events.next().await {
        match event {
            Ok(e) => println!("收到事件: {:?}", e),
            Err(err) => eprintln!("事件错误: {:?}", err),
        }
    }
    
    Ok(())
}

// 批量交易示例
async fn batch_transactions(contract: &Contract) -> Result<()> {
    // 创建批量交易构建器
    let mut tx_builder = ScriptTransactionBuilder::prepare_batch();
    
    // 添加多个调用
    tx_builder
        .add_contract_call(contract.method("increment_count", (1,))?)
        .add_contract_call(contract.method("increment_count", (2,))?)
        .add_contract_call(contract.method("increment_count", (3,))?);
    
    // 发送批量交易
    let tx = tx_builder.finalize(&contract.provider(), &contract.signer()).await?;
    let receipts = contract.provider().send_transaction(tx).await?;
    
    println!("批量交易结果:");
    for receipt in receipts {
        println!("{:?}", receipt);
    }
    
    Ok(())
}

代码说明

  1. 初始化部分

    • 连接到本地Fuel节点
    • 创建随机钱包用于部署和交互
  2. 合约部署

    • 从文件加载合约字节码
    • 使用Contract::deploy方法部署合约
  3. 合约交互

    • 加载合约ABI定义
    • 使用method()调用合约函数
    • 处理返回结果
  4. 测试部分

    • 设置测试环境
    • 部署测试合约
    • 验证合约函数行为
  5. 高级功能

    • 事件监听使用subscribe_contract_events
    • 批量交易使用ScriptTransactionBuilder

最佳实践提示

  1. 在生产环境中添加错误处理和重试逻辑
  2. 为交易设置适当的gas参数
  3. 定期检查库的更新版本
  4. 使用类型安全的ABI绑定来减少运行时错误

这个完整示例展示了从合约部署到测试的完整流程,包含了基本的交互操作和高级功能演示。开发者可以根据实际需求修改和扩展这个示例。

回到顶部