尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

fuels-rs 如何用 WalletsConfig 批量生成多资产注资测试钱包

fuels-rs 如何用 WalletsConfig 批量生成多资产注资测试钱包 fuels-rs 如何用 WalletsConfig 批量生成多资产注资测试钱包【免费下载链接】fuels-rsFuel Network Rust SDK项目地址: https://gitcode.com/GitHub_Trending/fu/fuels-rs在 fuels-rs 中编写合约或脚本测试时经常需要一次性批量准备多个已注资的测试钱包并精确控制每个钱包持有哪些资产、各持有多少。本文介绍 WalletsConfig 的三种构造方式以及如何调用 launch_custom_provider_and_get_wallets 拿到钱包列表、再逐资产核对余额。环境与依赖在依赖fuels的测试项目里Cargo.toml 中补充如下 dev-dependencies参照 examples/wallets/Cargo.toml[dev-dependencies] fuels { features [default, accounts-keystore] } rand 0.8 tokio { features [full] }fuels开启default与accounts-keystore两个 featurerand用于多资产场景下生成随机AssetIdlaunch_custom_provider_and_get_wallets是异步方法测试必须跑在#[tokio::test]环境里三种配置方式速览WalletsConfig提供三种构造入口覆盖从不挑参数到完全指定构造方式参数参数含义与默认值WalletsConfig::default()无10 个钱包每钱包 1 枚基础资产币每枚 1_000_000_000WalletsConfig::new(num_wallets, num_coins, coin_amount)3 个Optionu64传None即取默认10 个钱包 / 每钱包 1 枚 / 每枚 1_000_000_000WalletsConfig::new_multiple_assets(num_wallets, assets)u64VecAssetConfig无默认值资产的 id、币数、金额需逐个指定三个默认值对应 packages/fuels-test-helpers/src/wallets_config.rs 中的常量DEFAULT_NUM_WALLETS10、DEFAULT_NUM_COINS1、DEFAULT_COIN_AMOUNT1_000_000_000。批量生成基础资产注资测试钱包只付 gas 的场景基础资产就够了它的AssetId是 32 字节全零值。完全走默认用default()想微调就通过new逐项传入use fuels::prelude::*; #[tokio::test] async fn base_asset_wallets() - Result() { // 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?; // 返回 VecWallet可按索引直接取用 assert_eq!(wallets.len(), 5); Ok(()) }new的三个参数都是Optionu64任一传None都会落回对应默认值返回值是VecWallet做转账测试时可以直接写wallets[0]转给wallets[1]多资产钱包的注资配置AssetConfig有三个字段逐个描述一种资产的注资量id: AssetId—— 资产标识num_coins: u64—— 币的数量coin_amount: u64—— 单枚金额自定义资产 id 可用rand::Fill随机生成完整写法如下use fuels::prelude::*; use rand::Fill; #[tokio::test] async fn multi_asset_wallets() - Result() { let mut rng rand::thread_rng(); // 两个随机 id 的自定义资产 let mut asset_id_1 AssetId::zeroed(); asset_id_1.try_fill(mut rng)?; let mut asset_id_2 AssetId::zeroed(); asset_id_2.try_fill(mut rng)?; let assets vec![ // 基础资产必须手动列入 AssetConfig { id: AssetId::zeroed(), num_coins: 2, coin_amount: 4 }, AssetConfig { id: asset_id_1, num_coins: 6, coin_amount: 8 }, AssetConfig { id: asset_id_2, num_coins: 10, coin_amount: 12 }, ]; let config WalletsConfig::new_multiple_assets(1, assets); let wallets launch_custom_provider_and_get_wallets(config, None, None).await?; assert_eq!(wallets.len(), 1); Ok(()) }使用new_multiple_assets时必须手动把基础资产AssetId::zeroed()32 字节全零连同币数与金额加进assets否则钱包没有可用于支付 gas 的资产。传入启动函数之前还可以调用访问器num_wallets()与assets()自查钱包数和资产清单是否符合预期。多资产钱包的余额断言写法 单资产查询用get_asset_balance一次查全部用get_balances。后者返回HashMapString, u128键是资产 id 的十六进制字符串let balance: u128 wallet.get_asset_balance(asset_id).await?; // 键为资产 id 的字符串形式 let balances: HashMapString, u128 wallet.get_balances().await?; let base_balance balances.get(AssetId::zeroed().to_string()).unwrap();断言时先核对条目数、再核对金额get_balances的条目数应等于配置的资产数每个资产的余额应等于num_coins * coin_amountlet balances wallet.get_balances().await?; assert_eq!(balances.len() as u64, assets.len() as u64); for asset in assets { let balance wallet.get_asset_balance(asset.id).await?; assert_eq!(balance, (asset.num_coins * asset.coin_amount) as u128); }e2e/tests/wallets.rs 中的test_wallet_balance_api_multi_asset也是按此思路断言的该测试取 7 个资产、每资产 21 枚币、每枚 11。常见坑与注意launch_provider_and_get_wallet/launch_custom_provider_and_get_wallets生成的钱包是确定性地址同一配置多次运行会得到相同地址交易费用只能由基础资产支付多资产配置里漏掉AssetId::zeroed()是最常见的报错原因若绕开WalletsConfig、改用setup_multiple_assets_coins/setup_single_asset_coins这类 helper币数或资产数过大时会显著拖慢运行建议最多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),仅供参考
返回列表