欢迎光临
我们一直在努力

fuels-rs 实战:用 WalletsConfig 一次配好多资产测试钱包

fuels-rs 实战:用 WalletsConfig 一次配好多资产测试钱包

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

fuels-rs(Fuel Network Rust SDK)里,WalletsConfig 是批量生成测试钱包的配置入口:声明钱包数、每种多资产的币数与金额,它就能启动本地节点一次注资完成。读完你就能在合约或脚本测试里,稳定拿到一批余额可预期的钱包并逐项校验。

场景:合约测试里一次要准备多个已注资的钱包

写流动性池、多方转账这类测试时,你经常不止需要一个钱包:得有一个出资产的主钱包,再加上几个接收方,而且每个钱包除了付 gas 的基础资产,还得持有特定的代币 A、代币 B,数量各有讲究。一个个手动造币、再逐钱包转账,代码又长又脆。WalletsConfig 的思路是"声明式"——把"几个钱包、每种资产几枚、每枚多少"写成配置,交给 launch_custom_provider_and_get_wallets,SDK 负责起节点、造币、注资,直接还你一个 Vec<Wallet>。

环境与依赖:先把 tokio 异步环境搭好

为什么测试必须跑在 tokio 里

launch_custom_provider_and_get_wallets 是异步函数,内部要启动本地节点并与之通信,所以测试函数需要 async fn 并标注 #[tokio::test],否则 .await 没处落脚。

dev-dependencies 精简写法

参考仓库里的 examples/wallets/Cargo.toml,测试项目只需要这三行:

[dev-dependencies]
fuels = { features = ["default", "accounts-keystore"] }
rand = "0.8"
tokio = { features = ["full"] }

rand 用来生成随机的自定义 AssetId,tokio 提供完整的异步运行时,feature 开 full 即可。

两种配置方式按需选

只用基础资产时:WalletsConfig::new 三个参数都能省

如果所有钱包只需要付 gas 用的基础资产,WalletsConfig::new 就够了。它的三个入参都是 Option,传 None 时取默认值:10 个钱包、每钱包 1 枚币、每枚 1_000_000_000(对应 DEFAULT_NUM_WALLETS、DEFAULT_NUM_COINS、DEFAULT_COIN_AMOUNT,定义在 packages/fuels-test-helpers/src/wallets_config.rs)。想偷懒还可以直接 WalletsConfig::default(),效果和三个参数全传 None 一样:

use fuels::prelude::*;

// 5 个钱包,每个 3 枚币,每枚 100
let config = WalletsConfig::new(Some(5), Some(3), Some(100));
let wallets = launch_custom_provider_and_get_wallets(config, None, None).await?;

返回的 wallets 按下标取用即可,比如 wallets[0] 转账给 wallets[1]。

多资产各自控量时:new_multiple_assets + AssetConfig

要给不同资产分别定币数和金额,就用 AssetConfig 逐个描述,再整体交给 WalletsConfig::new_multiple_assets(钱包数, 资产列表):

use fuels::prelude::*;
use rand::Fill;

let mut rng = rand::thread_rng();

// 基础资产(全零 AssetId)必须手动加进列表
let base = AssetConfig { id: AssetId::zeroed(), num_coins: 2, coin_amount: 4 };

let mut token_a = AssetId::zeroed();
token_a.try_fill(&mut rng)?;
let asset_a = AssetConfig { id: token_a, num_coins: 6, coin_amount: 8 };

let config = WalletsConfig::new_multiple_assets(1, vec![base, asset_a]);
let wallets = launch_custom_provider_and_get_wallets(config, None, None).await?;

这里有个坑:走 new_multiple_assets 时,WalletsConfig::new 那种"自动带上基础资产"的行为没有了,你必须自己把 AssetId::zeroed() 这条 AssetConfig 塞进列表。原因很简单——链上交易手续费只认这个全零 AssetId 的基础资产,漏了它,钱包里只有代币没有气,第一笔交易就会因付不起 gas 而失败。

拿到钱包列表后,用 get_balances 校验注资结果

单资产查询:get_asset_balance

想知道某个资产手里有多少,直接点查:

let balance: u128 = wallets[0].get_asset_balance(&AssetId::zeroed()).await?;

全资产查询:条目数与金额的双重断言

get_balances 一次拿回所有资产,返回 HashMap<String, u128>,键是资产 ID 的十六进制字符串。校验思路是两层:map 的条目数应等于你配置的资产数;每个资产的余额应等于该资产的 num_coins * coin_amount。仓库端到端测试 e2e/tests/wallets.rs 里的 test_wallet_balance_api_multi_asset 就是这套写法,最小断言如下:

let balances: HashMap<String, u128> = wallets[0].get_balances().await?;
assert_eq!(balances.len(), 2); // 配置了 2 种资产
assert_eq!(balances[&token_a.to_string()], 6 * 8); // num_coins * coin_amount

第一条防"资产漏注",第二条防"金额注错",两条都过才算注资成功。

容易踩的坑

  • 生成的测试钱包地址是确定性的:同样的配置反复运行,拿到的地址不变,方便把断言写死。
  • gas 只能由基础资产支付,所以多资产配置里永远要手动保留 AssetId::zeroed() 这一项,别只留自定义代币。
  • launch_custom_provider_and_get_wallets 有后两个可选参数,文档示例里都传 None,没有特殊需求保持一致即可。
  • 启动前想自检配置,可以用 num_wallets() 和 assets() 两个访问器,把数量、资产清单打出来对一眼,比节点起来后才报错省事。
  • 如果不走 WalletsConfig,改用 setup_multiple_assets_coins / setup_single_asset_coins 这类 helper,注意规模:币数超过 1_000_000,或币数与资产数同时超过 1000,运行时间会明显拉长,测试里建议控制规模。

建议先跑一遍 WalletsConfig::default(),确认节点启动和断言都没问题,再按需切到 new_multiple_assets 把多资产配置叠上去,问题也好定位。

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

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

赞(0)
未经允许不得转载:171主机测评 » fuels-rs 实战:用 WalletsConfig 一次配好多资产测试钱包
分享到: 更多 (0)

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址