一次造好十几个注资钱包:fuels-rs 中用 WalletsConfig 批量配置测试钱包

📅 发布时间:2026/9/13 6:09:52
一次造好十几个注资钱包:fuels-rs 中用 WalletsConfig 批量配置测试钱包
一次造好十几个注资钱包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它会启动本地测试节点、按配置给每个钱包注币最后返回VecWallet。三步跑通第一个测试第 1 步加依赖。参考 examples/wallets/Cargo.toml测试 crate 的 dev-dependencies 里需要fuels、rand、tokiolaunch_custom_provider_and_get_wallets是异步方法得在#[tokio::test]里跑[dev-dependencies] fuels { features [default, accounts-keystore] } rand 0.8 tokio { features [full] }第 2 步写配置并启动。WalletsConfig::new接收三个Optionu64依次为钱包数、每钱包币数、每枚币金额传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: VecWallet 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(钱包数, VecAssetConfig)。每个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返回HashMapString, 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: HashMapString, 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_AMOUNTexamples 里的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),仅供参考