如何用 fuels-rs WalletsConfig 批量生成多资产测试钱包(完整指南)
【免费下载链接】fuels-rsFuel Network Rust SDK项目地址: https://gitcode.com/GitHub_Trending/fu/fuels-rs
写合约或脚本测试时,经常要一次性准备 N 个测试钱包,并且让每个钱包持有指定资产、指定数量的币。在 fuels-rs 里,WalletsConfig就是描述这套注资方案的结构体:把它交给launch_custom_provider_and_get_wallets,SDK 会自动拉起本地节点,再按配置批量生成已注资的钱包列表。本文按「配置路线 → 断言验证 → 避坑」的顺序讲清整个过程。
一次配齐:WalletsConfig 能拿到什么
WalletsConfig只包含两个字段:钱包数量,以及一组资产描述。每个资产由AssetConfig { id, num_coins, coin_amount }表示,即资产AssetId、钱包内该资产的枚数、每枚金额(见 packages/fuels-test-helpers/src/wallets_config.rs)。配置完成后,你拿到的是一份Vec<Wallet>,钱包已按索引生成且地址可预测,直接下标取用即可,例如让wallets[0]转给wallets[1]。
最小准备:依赖与 tokio 环境
launch_custom_provider_and_get_wallets是异步函数,测试需跑在tokio::test环境里。参考 examples/wallets/Cargo.toml 声明 dev-dependencies:
[dev-dependencies] fuels = { features = ["default", "accounts-keystore"] } rand = "0.8" tokio = { features = ["full"] }路线 A:只配基础资产(WalletsConfig::new / default)
如果钱包只需要基础资产——32 字节全零的AssetId::zeroed(),也就是唯一能付 gas 的资产——直接用WalletsConfig::new或WalletsConfig::default()。三个入参都是Option,传None取默认值:
| 参数 | 含义 | 默认值 |
|---|---|---|
| num_wallets | 钱包个数 | 10 |
| num_coins | 每钱包币数 | 1 |
| coin_amount | 每枚币金额 | 1_000_000_000 |
use fuels::prelude::*; // 三个参数按需指定,None 的项取默认值;下面的数字仅为演示 let config = WalletsConfig::new(Some(5), Some(3), Some(100)); let wallets = launch_custom_provider_and_get_wallets(config, None, None).await?;完全不想调参时,WalletsConfig::default()等价于上表默认值,返回 10 个各持 1 枚、金额 1_000_000_000 基础资产币的钱包。
路线 B:🛠 多资产测试钱包配置(AssetConfig + new_multiple_assets)
当测试要覆盖多个自定义资产时,先逐个构造AssetConfig,再交给WalletsConfig::new_multiple_assets(num_wallets, assets)。
为什么基础资产不能省?因为链上交易费用只能由基础资产支付。new会替你隐式加入基础资产,而new_multiple_assets只认你传入的列表——漏掉它,钱包手里全是自定义资产,任何一笔转账都会因付不起 gas 而失败。
use fuels::prelude::*; use rand::Fill; let mut rng = rand::thread_rng(); let base = AssetConfig { id: AssetId::zeroed(), num_coins: 2, coin_amount: 4 }; let mut asset_id = AssetId::zeroed(); asset_id.try_fill(&mut rng)?; // 随机一个自定义 AssetId let custom = AssetConfig { id: asset_id, num_coins: 6, coin_amount: 8 }; let config = WalletsConfig::new_multiple_assets(1, vec![base, custom]); let wallets = launch_custom_provider_and_get_wallets(config, None, None).await?;⚠️加粗重点:
new_multiple_assets的assets列表中必须包含AssetId::zeroed()对应的基础资产条目。
上面 2/4/6/8 是演示取值,实际按测试需要替换。传入前还可用访问器num_wallets()和assets()自检配置是否符合预期。
多资产场景下的断言写法:get_balances 与 get_asset_balance
验证注资结果有两个 API:get_asset_balance(&asset_id)查单个资产余额;get_balances()返回HashMap<String, u128>,键是资产 ID 的十六进制字符串(即asset_id.to_string())。仓库 e2e 测试(e2e/tests/wallets.rs 的test_wallet_balance_api_multi_asset)即按此断言:条目数等于配置的资产数,单项余额等于num_coins * coin_amount:
let balances: HashMap<String, u128> = wallet.get_balances().await?; assert_eq!(balances.len() as u64, number_of_assets); for asset_id in asset_ids { let balance: u128 = wallet.get_asset_balance(&asset_id).await?; assert_eq!(balance, (coins_per_asset * amount_per_coin) as u128); }测试中用到的 7、21、11 等只是该用例的取值,换成你配置的资产数与金额即可。
避坑清单
- 确定性地址:
launch_provider_and_get_wallet、launch_custom_provider_and_get_wallets生成的钱包地址由序号派生,具有确定性,重复运行地址不变(见 docs/src/wallets/test-wallets.md)。 - gas 只认基础资产:32 字节全零
AssetId之外的资产付不了交易费用,多资产配置务必手动补上。 - helper 性能上限:绕开
WalletsConfig、直接用setup_multiple_assets_coins/setup_single_asset_coins注资时,币数与资产数过大会显著拉长运行时间,官方建议最多 1_000_000 枚币,或同时不超过 1000 枚币和资产。 - 后两个参数:
launch_custom_provider_and_get_wallets的node_config、chain_config在仓库示例中均传None,使用默认节点配置即可。
【免费下载链接】fuels-rsFuel Network Rust SDK项目地址: https://gitcode.com/GitHub_Trending/fu/fuels-rs
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考