一次造好十几个注资钱包:fuels-rs 中用 WalletsConfig 批量配置测试钱包
【免费下载链接】fuels-rsFuel Network Rust SDK项目地址: https://gitcode.com/GitHub_Trending/fu/fuels-rs
在 fuels-rs 里写合约或脚本测试时,WalletsConfig能把"起本地节点 + 批量生成已注资测试钱包"压缩成一行调用:钱包数量、每钱包币数、每枚币金额都可精确指定,多资产场景也能逐个控制,再配合get_balances做余额断言,整条链路就闭环了。
什么场景下你会需要它
写 Fuel 合约测试时,你大概率会撞上这几类需求:
- 一次要造很多钱包:比如验证转账、多签、投票逻辑,手动
Wallet::random逐个建再手动注资,代码又长又重复; - 每个钱包持有的资产不同:测试 token 合约时,钱包既要能付 gas,又得有特定
AssetId的自定义代币,数量还得对得上断言; - 要可复现的注资结果:同一个配置跑两次,余额必须一样,方便写
assert_eq!。
launch_custom_provider_and_get_wallets就是干这个的:传入一个WalletsConfig,它会启动本地测试节点、按配置给每个钱包注币,最后返回Vec<Wallet>。
三步跑通第一个测试
第 1 步:加依赖。参考 examples/wallets/Cargo.toml,测试 crate 的 dev-dependencies 里需要fuels、rand、tokio(launch_custom_provider_and_get_wallets是异步方法,得在#[tokio::test]里跑):
[dev-dependencies] fuels = { features = ["default", "accounts-keystore"] } rand = "0.8" tokio = { features = ["full"] }第 2 步:写配置并启动。WalletsConfig::new接收三个Option<u64>,依次为钱包数、每钱包币数、每枚币金额,传None就取默认值(10 个钱包、1 枚币、每枚 1_000_000_000,常量定义见 packages/fuels-test-helpers/src/wallets_config.rs)。示例值取自官方文档,可按需替换:
use fuels::prelude::*; let config = WalletsConfig::new(Some(5), Some(3), Some(100)); let wallets: Vec<Wallet> = launch_custom_provider_and_get_wallets(config, None, None).await?;后两个None是节点与链配置,用默认本地节点即可。第 3 步:按索引取钱包,wallets[0]转给wallets[1]这类操作直接就能做。如果完全不想配参数,WalletsConfig::default()会给出 10 个钱包、每钱包 1 枚币 × 1_000_000_000 的初始余额。
进阶:按资产精确注资
当"所有钱包只有基础资产"不够用时(比如钱包得持有一个自定义代币),改用WalletsConfig::new_multiple_assets(钱包数, Vec<AssetConfig>)。每个AssetConfig三个字段描述一个资产的注资方案:id(资产 ID)、num_coins(发几枚)、coin_amount(每枚多少)。
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)?; // 随机生成一个自定义资产 ID let token = AssetConfig { id: asset_id, num_coins: 6, coin_amount: 8, }; let config = WalletsConfig::new_multiple_assets(1, vec![base, token]); let wallets = launch_custom_provider_and_get_wallets(config, None, None).await?;⚠️ 这里有个容易忽略的点:用new_multiple_assets时必须手动把基础资产(AssetId::zeroed(),即 32 字节全零 ID)放进 assets 列表,官方文档对此有专门强调(见 docs/src/wallets/test-wallets.md)。原因是链上交易费用只能由基础资产支付,忘了加它,钱包就付不起 gas,任何转账和合约调用都会失败。传入前可以用num_wallets()和assets()两个访问器自查配置。
怎么确认钱包真的有钱(余额断言怎么写)
断言的视角是两条:get_balances的条目数 = 配置的资产数,每个资产的余额 = 币数 × 金额。get_balances返回HashMap<String, u128>,键是资产 ID 的十六进制字符串(转义方式见 docs/src/wallets/checking-balances-and-coins.md);单资产则用get_asset_balance(&id)。仓库端到端测试 e2e/tests/wallets.rs 的test_wallet_balance_api_multi_asset就是这个写法(其中 7 个资产、每资产 21 枚币、每枚 11 是测试里的取值):
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 = wallet.get_asset_balance(&asset_id).await?; assert_eq!(balance, (coins_per_asset * amount_per_coin) as u128); assert_eq!(balances[&asset_id.to_string()], (coins_per_asset * amount_per_coin) as u128); }单资产场景更简单:默认配置下基础资产余额应恰好等于DEFAULT_NUM_COINS * DEFAULT_COIN_AMOUNT,examples 里的get_balances测试就是这么断言的(examples/wallets/src/lib.rs)。
踩坑清单(现象 → 原因 → 正确做法)
现象:同一配置每次跑出来的钱包地址都一样,以为是 bug。原因:
launch_custom_provider_and_get_wallets生成的钱包是确定性地址,密钥由序号推导(见 packages/fuels-test-helpers/src/accounts.rs),文档也明确说明这一点。正确做法:当成特性用——方便复现测试;但不要依赖"换次跑就换地址"。现象:多资产钱包一提交交易就报 gas 不足。原因:
new_multiple_assets不会自动补基础资产。正确做法:assets 列表里永远显式放一条id: AssetId::zeroed()的AssetConfig。现象:
balances.get(&asset_id)永远取不到值。原因:map 的键是资产 ID 的 hex 字符串,不是AssetId本身。正确做法:用balances.get(&asset_id.to_string())查。现象:绕过
WalletsConfig直接用setup_multiple_assets_coins/setup_single_asset_coins造币时,测试时间爆炸。原因:这两个 helper 的开销随币数/资产数增长。正确做法:文档建议最多1_000_000枚币,或同时不超过1000枚币和 1000 种资产。
✅ 小结:WalletsConfig解决的是"测试钱包准备"这件重复劳动——声明数量、资产和金额,一行起节点拿钱包,断言照币数 × 金额写就行。下一步建议结合 docs/src/wallets/test-wallets.md 里setup_custom_assets_coins等 helper,探索不需要完整WalletsConfig的轻量注资场景。
【免费下载链接】fuels-rsFuel Network Rust SDK项目地址: https://gitcode.com/GitHub_Trending/fu/fuels-rs
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考