fuels-rs 测试钱包配置实战:用 WalletsConfig 从批量钱包到多资产余额校验
2026/9/13 17:24:41 网站建设 项目流程

fuels-rs 测试钱包配置实战:用 WalletsConfig 从批量钱包到多资产余额校验

【免费下载链接】fuels-rsFuel Network Rust SDK项目地址: https://gitcode.com/GitHub_Trending/fu/fuels-rs

给 Fuel Network 合约或脚本写测试时,常见痛点是:怎么一次准备多个测试钱包,并精确控制每个钱包持有哪几种资产、各持有多少枚币。本文基于 fuels-rs 的WalletsConfig结构体,按"声明配置 → 启动本地节点 → 断言余额"的顺序走一遍,帮助你在自己的测试工程里完成测试钱包的搭建、使用与结果校验。

学完本文你能做到 3 件事:

  1. 用一行配置启动本地测试节点,拿到一批已注入基础资产的钱包列表
  2. WalletsConfig::new_multiple_assets指定每个钱包对特定AssetId的持币枚数与单枚金额
  3. get_balances/get_asset_balance对余额的条目数量与具体金额写可复现的断言

添加 dev 依赖并开启测试所需 feature

launch_custom_provider_and_get_wallets是异步函数,测试需运行在tokio::test环境中。依赖组合与 examples/wallets/Cargo.toml 保持一致即可:

依赖配置作用
fuelsfeatures = ["default", "accounts-keystore"]SDK 主入口,keystore 供密钥相关测试使用
randworkspace 版本随机生成自定义AssetId
tokiofeatures = ["full"]提供#[tokio::test]异步运行时
[dev-dependencies] fuels = { features = ["default", "accounts-keystore"] } rand = "0.8" tokio = { features = ["full"] }

启动本地节点并领取一批基础资产钱包

如果所有钱包只需要基础资产(用于支付 gas,AssetId为 32 字节全零值),用WalletsConfig::new。三个参数均为Option,传None时取默认值,常量定义见 packages/fuels-test-helpers/src/wallets_config.rs:

参数None时的默认值说明
num_walletsDEFAULT_NUM_WALLETS = 10生成的钱包数量
num_coinsDEFAULT_NUM_COINS = 1每个钱包持有的基础资产币数
coin_amountDEFAULT_COIN_AMOUNT = 1_000_000_000每枚币的金额

WalletsConfig::default()与三项全传None等价。下面的示例配置 4 个钱包、每钱包 2 枚币、单枚 250(示例取值,按测试需要替换),预期得到长度为 4 的Vec<Wallet>,且每个钱包基础资产余额为 500:

use fuels::prelude::*; #[tokio::test] async fn launch_base_asset_wallets() -> Result<()> { let config = WalletsConfig::new(Some(4), Some(2), Some(250)); let wallets: Vec<Wallet> = launch_custom_provider_and_get_wallets(config, None, None).await?; assert_eq!(wallets.len(), 4); let balance: u128 = wallets[0].get_asset_balance(&AssetId::zeroed()).await?; assert_eq!(balance, 500); Ok(()) }

walletsVec<Wallet>,可以直接按索引取用,例如wallets[0]wallets[1]转账。

指定每个资产的币数与金额:new_multiple_assets + AssetConfig

要控制每个钱包持有特定AssetId的币数与单枚金额,先用AssetConfig逐个描述,再交给WalletsConfig::new_multiple_assets。下面的示例构造 1 个钱包、3 种资产(数值均为示例取值):

使用new_multiple_assets时必须手动把基础资产(AssetId::zeroed())连同币数与金额加进assets列表,否则钱包没有可用于支付 gas 的资产。

use fuels::prelude::*; use rand::Fill; let mut rng = rand::thread_rng(); let base = AssetConfig { id: AssetId::zeroed(), num_coins: 3, coin_amount: 10, }; let mut asset_a_id = AssetId::zeroed(); asset_a_id.try_fill(&mut rng)?; let asset_a = AssetConfig { id: asset_a_id, num_coins: 5, coin_amount: 30, }; let config = WalletsConfig::new_multiple_assets(1, vec![base, asset_a]); // 两个访问器可在启动前自检配置 assert_eq!(config.num_wallets(), 1); assert_eq!(config.assets().len(), 2); let wallets = launch_custom_provider_and_get_wallets(config, None, None).await?;

随机AssetId的生成方式(AssetId::zeroed()+try_fill)与 examples/wallets/src/lib.rs 中custom_assets_wallet示例一致。

校验结果:用 get_balances 断言条目数与金额

get_balances返回HashMap<String, u128>,键是资产 ID 的十六进制字符串,值是对应余额(说明见 docs/src/wallets/checking-balances-and-coins.md)。断言思路参考 e2e/tests/wallets.rs 中的test_wallet_balance_api_multi_asset:条目数应等于配置的资产数,单个资产余额应等于num_coins * coin_amount。上一节示例对应的可复制断言如下:

use std::collections::HashMap; let wallet = &wallets[0]; let balances: HashMap<String, u128> = wallet.get_balances().await?; assert_eq!(balances.len(), 2); // 与 assets 列表长度一致 assert_eq!( *balances.get(&asset_a_id.to_string()).unwrap(), (5 * 30) as u128, ); assert_eq!( *balances.get(&AssetId::zeroed().to_string()).unwrap(), (3 * 10) as u128, );

边界与坑点速记

  • ⚠️ 由launch_provider_and_get_walletlaunch_custom_provider_and_get_wallets生成的钱包具有确定性地址(见 docs/src/wallets/test-wallets.md)。
  • 基础资产是唯一可支付交易费用的资产,其AssetId为 32 字节全零值;多资产配置别漏加它。
  • 若改走setup_multiple_assets_coins/setup_single_asset_coins(不经过WalletsConfig),文档建议总币数不超过1_000_000,或币与资产同时不超过1000,否则运行时间会明显变长。
  • 文档示例中launch_custom_provider_and_get_wallets的后两个参数均传None,本文为保持一致同样如此。

【免费下载链接】fuels-rsFuel Network Rust SDK项目地址: https://gitcode.com/GitHub_Trending/fu/fuels-rs

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询