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

发布时间:2026/9/13 17:24:51
fuels-rs 测试钱包配置实战:用 WalletsConfig 从批量钱包到多资产余额校验
fuels-rs 测试钱包配置实战用 WalletsConfig 从批量钱包到多资产余额校验【免费下载链接】fuels-rsFuel Network Rust SDK项目地址: https://gitcode.com/GitHub_Trending/fu/fuels-rs给 Fuel Network 合约或脚本写测试时常见痛点是怎么一次准备多个测试钱包并精确控制每个钱包持有哪几种资产、各持有多少枚币。本文基于 fuels-rs 的WalletsConfig结构体按声明配置 → 启动本地节点 → 断言余额的顺序走一遍帮助你在自己的测试工程里完成测试钱包的搭建、使用与结果校验。学完本文你能做到 3 件事用一行配置启动本地测试节点拿到一批已注入基础资产的钱包列表用WalletsConfig::new_multiple_assets指定每个钱包对特定AssetId的持币枚数与单枚金额用get_balances/get_asset_balance对余额的条目数量与具体金额写可复现的断言添加 dev 依赖并开启测试所需 featurelaunch_custom_provider_and_get_wallets是异步函数测试需运行在tokio::test环境中。依赖组合与 examples/wallets/Cargo.toml 保持一致即可依赖配置作用fuelsfeatures [default, accounts-keystore]SDK 主入口keystore 供密钥相关测试使用randworkspace 版本随机生成自定义AssetIdtokiofeatures [full]提供#[tokio::test]异步运行时[dev-dependencies] fuels { features [default, accounts-keystore] } rand 0.8 tokio { features [full] }启动本地节点并领取一批基础资产钱包如果所有钱包只需要基础资产用于支付 gasAssetId为 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 的VecWallet且每个钱包基础资产余额为 500use fuels::prelude::*; #[tokio::test] async fn launch_base_asset_wallets() - Result() { let config WalletsConfig::new(Some(4), Some(2), Some(250)); let wallets: VecWallet 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(()) }wallets是VecWallet可以直接按索引取用例如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返回HashMapString, 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: HashMapString, 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_wallet或launch_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),仅供参考