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"
));
功能说明
- 钱包创建:可以使用
WalletUnlocked
创建新钱包或导入现有私钥 - 节点连接:通过
Provider
连接到Fuel网络节点 - 余额查询:查询钱包中的原生代币余额
- 合约部署:从编译后的Sway合约二进制文件部署合约
- 合约调用:通过生成的合约绑定调用合约方法
高级功能
// 发送代币示例
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(())
}
注意事项
- 使用前请确保已安装最新版本的Rust
- 测试时需要Fuel测试网的测试代币
- 合约部署需要先编译Sway合约
- 生产环境建议使用更安全的密钥管理方式
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(())
}
注意事项
- 确保Fuel节点正在运行并可以访问
- 测试时可以使用Fuel本地节点或测试网
- 生产环境请妥善保管私钥
- 交易需要足够的Gas费用
fuels-core
提供了强大的功能来与Fuel区块链交互,更多详细用法可以参考官方文档和示例代码。