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(())
}
主要功能
- 合约部署和交互:提供简单API部署智能合约并与之交互
- ABI支持:通过abigen!宏生成类型安全的合约绑定
- 交易构建:支持构建和发送各种类型的区块链交易
- 钱包集成:与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(())
}
代码说明
-
初始化部分:
- 连接到本地Fuel节点
- 创建随机钱包用于部署和交互
-
合约部署:
- 从文件加载合约字节码
- 使用
Contract::deploy
方法部署合约
-
合约交互:
- 加载合约ABI定义
- 使用
method()
调用合约函数 - 处理返回结果
-
测试部分:
- 设置测试环境
- 部署测试合约
- 验证合约函数行为
-
高级功能:
- 事件监听使用
subscribe_contract_events
- 批量交易使用
ScriptTransactionBuilder
- 事件监听使用
最佳实践提示
- 在生产环境中添加错误处理和重试逻辑
- 为交易设置适当的gas参数
- 定期检查库的更新版本
- 使用类型安全的ABI绑定来减少运行时错误
这个完整示例展示了从合约部署到测试的完整流程,包含了基本的交互操作和高级功能演示。开发者可以根据实际需求修改和扩展这个示例。