news 2026/9/10 12:17:08

如何用 fuels-rs 以自定义共识参数与创世币启动本地 Fuel 测试链

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
如何用 fuels-rs 以自定义共识参数与创世币启动本地 Fuel 测试链

如何用 fuels-rs 以自定义共识参数与创世币启动本地 Fuel 测试链

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

当你为合约或交易编写测试时,默认启动的本地节点使用的是默认共识参数和随机生成的初始币。如果你的测试需要验证特定的交易限制(如单交易最大 gas、最大输入数量)或自定义费用参数,并且要指定某个地址持有确定的创世币数量,fuels-rs(Fuel Network Rust SDK)提供了完整的操作路径:通过fuels::test_helpers中的setup_test_provider(),把自定义的ChainConfig(包含共识参数)和创世币一起交给一个短生命周期本地节点,并拿回一个连接该节点的Provider。本文基于仓库内的 cookbook 文档 docs/src/cookbook/custom-chain.md 与对应示例 custom_chain 测试 编写。

准备条件

示例代码位于工作区成员 examples/cookbook,其依赖声明如下,可直接照抄到自己的项目:

fuels = { version = "0.77.0", features = ["default"] } rand = "0.8.5" tokio = { version = "1.34.0", features = ["full"] }

工作区 Cargo.toml 要求 Rust 工具链rust-version = "1.93.0",SDK 当前版本为0.77.0

启动本地节点有两种方式,见 docs/src/connecting/short-lived.md:

  • 在本机安装fuel-core节点二进制(安装步骤参见 docs/src/getting-started.md 中指向的 Fuel 工具链安装指南);
  • 或者启用fuel-core-libfeature,把fuel-core作为库运行,无需安装二进制:fuels = { version = "0.77.0", features = ["fuel-core-lib"] }

以下代码默认在#[tokio::test]中运行,因为setup_test_provider是异步函数。

第一步:定义自定义共识参数

ConsensusParametersTxParametersFeeParameters等子参数组成,通过set_*方法写入。下面这段代码来自 cookbook 示例,把单交易最大 gas 设为 1000、最大输入数设为 2、gas 价格因子设为 10:

use fuels::{ prelude::*, tx::{ConsensusParameters, FeeParameters, TxParameters}, }; let tx_params = TxParameters::default() .with_max_gas_per_tx(1_000) .with_max_inputs(2); let fee_params = FeeParameters::default().with_gas_price_factor(10); let mut consensus_parameters = ConsensusParameters::default(); consensus_parameters.set_tx_params(tx_params); consensus_parameters.set_fee_params(fee_params); let chain_config = ChainConfig { consensus_parameters, ..ChainConfig::default() };

TxParametersFeeParameters的其余字段保持默认值(Default::default()后只覆盖了上述 builder 方法设置的字段),ChainConfigconsensus_parameters外也全部取默认。

第二步:生成创世币并绑定到地址

启动节点前,先用setup_single_asset_coins造出创世币。它接收持有地址、资产 ID、币的数量和每枚币的数量,返回Vec<Coin>,可直接传给setup_test_provider。示例中的持有者是一个随机生成的签名者:

let signer = PrivateKeySigner::random(&mut thread_rng()); let coins = setup_single_asset_coins( signer.address(), Default::default(), DEFAULT_NUM_COINS, DEFAULT_COIN_AMOUNT, );

其中:

  • 资产 ID 传Default::default(),即基础资产(用于付 gas);
  • DEFAULT_NUM_COINSDEFAULT_COIN_AMOUNTfuels::test_helpers导出的常量,定义在 packages/fuels-test-helpers/src/wallets_config.rs:DEFAULT_NUM_COINS = 1DEFAULT_COIN_AMOUNT = 1_000_000_000
  • rand::thread_rng来自上面声明的rand依赖。

如果需要多个资产或精确控制每种资产的币数与数量,可以改用setup_multiple_assets_coinssetup_custom_assets_coins,函数签名与说明见 packages/fuels-test-helpers/src/lib.rs。

第三步:启动节点并获取 Provider

setup_test_provider的签名为:

pub async fn setup_test_provider( coins: Vec<Coin>, messages: Vec<Message>, node_config: Option<NodeConfig>, chain_config: Option<ChainConfig>, ) -> Result<Provider>

第四个参数就是你前面构造的chain_config。节点行为由第三个参数NodeConfig控制,默认值(DbType::InMemoryutxo_validation: trueTrigger::Instantsilent: true等)定义在 packages/fuels-test-helpers/src/node_types.rs,一般测试场景直接取默认即可:

let node_config = NodeConfig::default(); let _provider = setup_test_provider(coins, vec![], Some(node_config), Some(chain_config)).await?;

调用成功后,Provider已连接到一个运行你自定义ChainConfig的本地节点;节点进程随测试进程存活,测试结束后由setup_test_provider内部持有的句柄一并释放(源码中通过tokio::spawn+pending()持有句柄直到 provider 侧生命周期结束,见 packages/fuels-test-helpers/src/lib.rs)。

注意:如果第四个参数传Nonesetup_test_provider会回退到一个内置的 testnet 配置——它把交易大小上限提到10_000_000、合约大小上限提到1_000_000。要精确控制共识参数时必须显式传入Some(chain_config)

验证共识参数与链配置确实生效

仓库内的测试用例给出了两种核对方式,可直接照搬:

方式一:整份对比共识参数。调用provider.consensus_parameters()取回链上生效的参数,与本地构造的ConsensusParameters直接相等比较(见 test_setup_test_client_consensus_parameters_config):

let retrieved_parameters = provider.consensus_parameters().await?; assert_eq!(retrieved_parameters, consensus_parameters);

方式二:通过chain_info()抽查关键字段。如果ChainConfig里还设置了chain_name等字段,可以用provider.chain_info()核对链名与具体参数值(见 test_chain_config_and_consensus_parameters):

let chain_info = provider.chain_info().await?; assert_eq!(chain_info.name, chain_name); assert_eq!( chain_info.consensus_parameters.tx_params().max_inputs(), max_inputs );

cargo test运行测试;若测试通过,输出默认被隐藏,需要查看println!输出时可加-- --nocapture(见 docs/src/testing/basics.md)。

限制与注意事项

  • 该流程启动的是短生命周期、内存数据库的测试节点,定位为合约/交易测试环境,不是持久化部署方案。需要持久存储时,可在NodeConfig中把database_type设为DbType::RocksDb(Some(path)),并配合rocksdbfeature 使用(见 docs/src/connecting/short-lived.md 与 examples/cookbook/src/lib.rs 中的create_or_use_rocksdb示例)。
  • 示例中的数值(1_000210)是 cookbook 演示用的配置值,应按自己的测试目标替换;本文档不承诺这些数值对真实网络有任何含义。
  • ChainConfigNodeConfig等类型来自fuel-core-chain-config/fuels-test-helpers,字段含义以 packages/fuels-test-helpers/src/node_types.rs 中的定义为准,不要凭字段名推断未在文档中说明的行为。

完整参考实现:docs/src/cookbook/custom-chain.md 对应的 custom_chain 测试,以及参数验证测试所在的 packages/fuels-test-helpers/src/lib.rs。

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

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

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/10 12:15:40

Telegram SMS终极指南:在Android设备上搭建智能短信转发机器人

Telegram SMS终极指南&#xff1a;在Android设备上搭建智能短信转发机器人 想要在Android设备上搭建一个智能的短信转发机器人吗&#xff1f;Telegram SMS是一款强大的开源应用&#xff0c;可以将您手机收到的短信自动转发到Telegram聊天中&#xff0c;让您随时随地通过Telegr…

作者头像 李华
网站建设 2026/9/10 12:15:14

高光谱影像分类实战:基于(2D)2PCA与双通道CNN-SVM

简介&#xff1a;这是一份基于Python实现的高光谱遥感影像识别与分类完整项目&#xff0c;面向毕业设计、课程设计及项目开发场景。项目针对高光谱数据维数灾难导致的休斯现象&#xff0c;提出基于波段组合(2D)2PCA的高光谱降维方法&#xff0c;降低数据冗余并提升后续处理效率…

作者头像 李华
网站建设 2026/9/10 12:14:02

VGG16人脸表情识别实战:从迁移学习到实时推理完整指南

简介&#xff1a;面向图像识别初学者与深度学习开发者&#xff0c;这份资源基于VGG16网络实现人脸表情识别&#xff0c;可精准区分愤怒、快乐、惊讶、厌恶、悲伤、恐惧六种表情&#xff0c;从数据集的整理与扩充、图像尺寸统一和归一化&#xff0c;到网络结构微调、训练参数配置…

作者头像 李华