十年匠心定制 · 商业建站与技术教学双线并行 咨询热线:400-886-1026 service@lmnt.cn
ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

fuel-core 本地调试指南:debug 构建、环境变量注入、P2P 参数配置与 CLion / VS Code 断点调试实战

fuel-core 本地调试指南:debug 构建、环境变量注入、P2P 参数配置与 CLion / VS Code 断点调试实战 fuel-core 本地调试指南debug 构建、环境变量注入、P2P 参数配置与 CLion / VS Code 断点调试实战【免费下载链接】fuel-coreRust full node implementation of the Fuel v2 protocol.项目地址: https://gitcode.com/GitHub_Trending/fu/fuel-core本文基于 fuel-coreRust 实现的 Fuel v2 协议全节点官方调试文档 docs/developers/debugging.md系统讲解如何在 macOS / Linux 上构建并运行 fuel-core 的 debug 构建、如何通过环境变量与.env文件间接注入 CLI 参数、如何配置 P2P 网络密钥与网络名以及如何修复端口占用、RocksDB 打开失败、panic 等典型本地运行问题并在 CLion 与 Visual Studio Code 中配置可打断点的运行配置。读完后你可以独立搭建一套可断点调试的本地 fuel-core 节点开发环境。一、环境前提操作系统与 Rust 工具链构建 Fuel 节点官方支持macOS 和 Linux两个平台。fuel-core 使用 Rust 编写构建过程基于 stable Rust 工具链官方建议使用最新版本的 Rust。系统级依赖包括 clang 等的完整要求见 README 的 System Requirements 章节其中给出了各发行版的一键安装命令例如# macOS brew update brew install cmake # Debian apt update apt install -y cmake pkg-config build-essential git clang libclang-dev # Arch pacman -Syu --needed --noconfirm cmake gcc pkgconf git clang此外README 要求安装wasm32-unknown-unknown目标用于状态转换字节码相关编译rustup target add wasm32-unknown-unknown从源码结构看仓库采用 Cargo workspace 组织节点二进制位于 bin/fuel-core业务逻辑聚合在 crates/fuel-core。后者通过 Cargo feature 控制可选服务编译p2p依赖 fuel-core-p2p 与 fuel-core-sync、relayer依赖 fuel-core-relayer、rocksdb、rpc、parallel-executor等这正是调试文档反复强调--all-features的原因——只有编译期打开了对应 feature运行时才允许启用相应服务。二、构建与运行 debug 构建2.1 为什么必须用 debug 构建调试文档明确指出IDE 依赖 debug 构建才能提供完整的断点调试能力。默认情况下cargo build与cargo run生成的就是 debug 构建其特点是包含调试符号、最小化优化专为调试与开发设计。开发调试阶段应使用cargo run直接编译 运行而不是先cargo install安装再运行可执行文件——前者能保证二进制始终与当前源码一致后者安装的是 release 优化产物断点行为不可靠。2.2 标准运行命令运行 fuel-core 客户端的推荐命令为cargo run --all-features --bin fuel-core -- run ARGUMENTS其中--all-features编译时打开全部 feature包括 P2P 与 Relayer 服务所需依赖。调试文档推荐始终带上该参数--bin fuel-core指定节点二进制位于bin/fuel-coreCLI 定义在 bin/fuel-core/src/cli.rsrun节点的子命令CLI 中还包含snapshot、rollback、generate-fee-contract、archive等子命令见 cli.rs 中的 Fuel 枚举ARGUMENTS任意 run 子命令参数。查看完整参数列表cargo run --bin fuel-core run --help输出中每个参数旁边会标注对应的环境变量名[env: XXX]形式。README 中给出的示例节选如下$ ./target/debug/fuel-core run --help USAGE: fuel-core run [OPTIONS] OPTIONS: --snapshot SNAPSHOT Snapshot from which to do (re)genesis. Defaults to local testnet configuration [env: SNAPSHOT] ...2.3 推荐同时启用 P2P 与 Relayer调试文档建议在本地节点中默认启用 P2P 与 Relayer 服务对应两个运行时标志运行时标志依赖的编译 feature作用--enable-p2pp2p启用 P2P 网络服务连接 Fuel 网络--enable-relayerrelayer启用 Relayer 服务L1 消息中继两个标志只有在编译时包含相应 feature 时才有效--all-features会隐式满足这一点。这与 crates/fuel-core/Cargo.toml 中p2p [dep:fuel-core-p2p, dep:fuel-core-sync]、relayer [dep:fuel-core-relayer]的 feature 定义完全对应。三、通过环境变量与 .env 文件间接注入 CLI 参数除了直接在命令行写参数fuel-core 支持用环境变量间接供给 CLI 参数每个 CLI 参数在run --help输出中都有对应的环境变量名。这样做的核心好处是同一套配置可以在不同 IDE、不同 IDE 配置间无缝复用——shell、终端、IDE 的 Environment variables 面板里设置的变量值对任何启动方式都生效。设置环境变量的方式有三种在 shell 配置文件如~/.zshrc中永久定义在当前终端会话中临时设置在工作目录放置.env文件。其中第 3 种方式有一个编译期前提必须用envfeature 编译客户端将env加入 feature 列表或直接使用--all-features。从源码可以确认其实现bin/fuel-core/Cargo.toml 定义了env [dep:dotenvy]featuredotenvy 0.15而 bin/fuel-core/src/cli.rs 中的init_environment()在开启envfeature 时调用dotenvy::dotenv()从工作目录加载.env文件未开启时直接返回None。因此.env文件应放在本地仓库根目录即你执行命令的工作目录下。调试文档给出的一个例子设置环境变量NETWORKbeta-4与传--network beta-4等效。此外两个与日志相关的环境变量值得在调试时牢记在 cli.rs 的初始化逻辑 中定义RUST_LOG控制日志过滤级别调试时建议设为info或debugREADME 说明遵循tracing_subscriber的 EnvFilter 语法未设置时默认为infoHUMAN_LOGGING设为false时输出机器可解析的 JSON 结构化日志否则输出带 ANSI 彩色、行号的人类可读日志。四、P2P 网络密钥对生成与网络名当节点以--enable-p2p运行编译 feature 为p2p时客户端会尝试加入某个 Fuel 网络这要求额外提供--keypair与--network两个参数。4.1 生成密钥对仓库自带fuel-core-keygen工具二进制运行cargo run --bin fuel-core-keygen new控制台上会打印新生成的密钥对包含secret与派生标识。把其中的secret值传给节点的--keypair参数即可。从 crates/keygen/src/lib.rs 的实现可以确认其输出结构new_key()使用系统熵源StdRng::from_entropy随机生成SecretKey再按KeyType派生不同的公开标识block-production类型由公钥派生链上账户地址Input::owner用于区块生产签名peering类型由同一 secret 构造 libp2p secp256k1 Keypair派生PeerId用于 P2P 网络中的节点身份parse_secret()则做反向验证给定 secret 重新推导地址 / PeerId方便核对密钥合法性。也就是说new命令输出的 secret 是同一个值同时决定你的 P2P PeerId与你的出块地址--keypair传的就是这个 secret。4.2 指定要加入的网络--network参数声明要加入的网络名称该名称在对等点发现peer discovery阶段使用。例如传参方式--network beta-4加入 Beta 4 网络等效环境变量方式NETWORKbeta-4。调试文档同时提示节点网络运维的更多细节可参考 Fuel 官方节点运维指南仓库外的 Fuel 文档中心本文不展开。五、常见问题排查5.1 端口被占用Address Already In UseError: Address already in use (os error 48)含义目标端口上已经有本地进程在监听。可能是另一个 fuel-core 实例也可能是本机其他任意软件。解决端口被其他程序占用——换一个端口--port PORT或设置PORT环境变量端口被另一个 fuel-core 实例占用——结束旧进程。macOS / Linux 步骤# 1. 查看占用该端口的进程PORT 换成实际端口号 lsof -i :PORT # 2. 找到并记录目标进程 PID # 3. 结束进程 kill -9 PID # 4. 重新运行节点命令5.2 RocksDB 打开失败Error: Failed to open rocksdb, you may need to wipe a pre-existing incompatible db rm -rf ~/.fuel/db该错误有两种成因多个本地进程同时访问同一个 RocksDB 实例RocksDB 不支持多进程共享同一数据目录数据库是由旧版本代码创建的与当前代码的 schema 不兼容。处理方式若存在其他正在访问该库的 fuel-core 进程先将其终止若无其他进程则属于版本不兼容删除数据库目录后重建rm -rf ~/.fuel/db从源码可以确认默认路径bin/fuel-core/src/cli.rs 中default_db_path()返回~/.fuel/db若你通过--db-path自定义过路径则删除对应实际路径。README 的 Troubleshooting 还给出一个更具体的变体——切换代码版本后报Column families not opened: column-0 ... column-11的 panic本质同样是旧库 schema 与当前代码列族定义不匹配解法相同rm -rf ~/.fuel/db。5.3 数据库 Schema 不匹配导致的 Panicthread main panicked at source slice length (64) does not match destination slice length (32), .../fuel-types-0.36.0/src/array_types.rs:389:16当你在不同数据库 schema 的代码版本间切换例如git checkout到旧 tag 调试后直接启动节点客户端可能进入致命状态并 panic。处理顺序删除数据库rm -rf ~/.fuel/db或对应自定义路径后重试若 RocksDB 相关的数据库错误持续出现可改用内存数据库绕开持久化问题--db-type in-memory。README 也强调对许多开发场景in-memory状态不持久化就是最有用的调试形态./target/debug/fuel-core run --db-type in-memory5.4 补充macOS 文件描述符限制README 的 Troubleshooting 还记录了另一个 macOS 上常见的调试坑部分 macOS 版本默认文件描述符上限较低RocksDB 会报Too many open files甚至fatal runtime error: Rust cannot catch foreign exceptions。临时调高当前 shell 的上限建议写入~/.zshrculimit -n 10240六、推荐 IDECLion 与 VS Code调试文档的核心观点开发期间应把 Cargo 指令的执行交给 IDE并让 IDE 的调试器接管进程而不是手动在终端里cargo run——这样才能打断点、单步执行、检查变量。官方推荐 CLion 与 Visual Studio Code 两款 IDE。6.1 CLion 配置前置条件CLion 需安装官方 JetBrains Rust 插件Plugin 菜单中搜索 Rust 并 Install。创建运行配置点击 CLion 窗口右上角的配置下拉菜单选择 Edit Configurations...在 Run/Debug Configurations 窗口点击 选择 CargoName 字段填写描述性名称如Run Fuel ClientCommand 字段填入run --all-features --bin fuel-core -- run ARGUMENTS其中ARGUMENTS为所需 CLI 参数参考run --help的 CLI 文档若你通过环境变量配置节点见第三节在此的 Environment variables 面板中设置对应变量。建议将RUST_LOG设为info或debugWorking directory 默认应为本地仓库根目录若缺失或被改动请手动填回点击 Apply / OK 保存。可选设置Before launchCLion 默认在 Before launch 中加入了 Build 步骤。可以保留——这样 CLion 先在 CLion 自身的运行窗口里完成构建随后cargo run检测到二进制已存在会直接进入执行阶段跳过重复构建。也可以移除或自定义以形成个性化构建流。运行与调试在下拉菜单选中该配置点 Run 按钮启动节点或点 Debug 按钮以调试模式启动在需要检查的代码位置设置断点CLion 会在断点处暂停执行允许查看变量并单步执行。6.2 Visual Studio Code 配置前置条件安装 CodeLLDB 扩展Extensions 面板搜索 CodeLLDB 并 Install。创建运行配置点击左侧活动栏的 Run and Debug 图标VS Code 会提示创建launch.json点击后选择CodeLLDB 调试器VS Code 会生成launch.json骨架在 Run and Debug 菜单的下拉中选择 Add Configuration...type填lldbrequest填launchname填描述性名称如Run Fuel Clientcargo下的args数组填build、--all-features、--binfuel-core顶层args数组填run、--enable-p2p、--enable-relayer后面追加其他 CLI 值每个值用引号包裹保存launch.json。完整示例配置可追加到现有launch.json的配置列表中{ version: 0.2.0, configurations: [ { type: lldb, request: launch, name: Run Fuel Client, cargo: { args: [ build, --all-features, --binfuel-core ] }, args: [ run, --enable-p2p, --enable-relayer, --utxo-validation, --poa-instant, false ] } ] }注意示例中--poa-instant false的用法README 同样说明设置--poa-instantfalse可禁用本地节点的自动出块日志输出Block production disabled适合只想调试导入 / 查询逻辑而不想被自动产块干扰的场景--utxo-validation则开启 UTXO 校验。运行与调试进入 Run and Debug 页选中该配置后点 Run 按钮启动节点在需要检查的代码处设置断点VS Code 会在断点处暂停支持变量检查与单步执行。七、替代配置按需裁剪 feature 与服务开发者可以创建多套运行配置来实验不同组合或定位特定功能服务级裁剪运行时省略--enable-p2p及其相关 P2P 参数如--keypair、--network即启动无 P2P 的节点省略--enable-relayer及其相关参数即启动无 Relayer 的节点。把每种参数组合保存为独立的 IDE 配置可方便地切换调试目标。编译级裁剪feature通过显式指定 feature 列表改变编译内容例如只编译 Relayer、完全不编译 P2Pcargo run --features relayer --bin fuel-core -- run --enable-relayer ARGUMENTS这种写法会跳过p2pfeature 引入的 fuel-core-p2p / fuel-core-sync 编译适合专注于 Relayer 逻辑、希望缩短构建时间的场景。反之若只调试 P2P可用--features p2p对称地裁剪 Relayer。八、调试环境速查表项目命令 / 取值说明标准调试启动cargo run --all-features --bin fuel-core -- run ARGUMENTSdebug 构建 全 feature查看参数与环境变量cargo run --bin fuel-core run --help每个参数旁标注[env: XXX]启用 P2P / Relayer--enable-p2p/--enable-relayer需对应编译 feature生成密钥cargo run --bin fuel-core-keygen new输出 secret传给--keypair指定网络--network beta-4或NETWORKbeta-4用于对等点发现.env支持编译 featureenvdotenvy 加载工作目录.env--all-features隐含包含日志级别RUST_LOGdebug默认infoHUMAN_LOGGINGfalse输出 JSON内存数据库--db-type in-memory状态不持久化适合多数开发场景禁用出块--poa-instantfalse避免自动产块干扰调试端口冲突--port PORT/lsof -i :PORTkill -9 PIDos error 48数据库不兼容rm -rf ~/.fuel/db默认库路径见default_db_path()macOS FD 上限ulimit -n 10240规避 RocksDBToo many open files掌握以上内容后你就具备了在本地完整复现、断点调试 fuel-core 节点全链路P2P 入网、Relayer 中继、GraphQL 服务、RocksDB 持久化所需的全部环境与排障手段。【免费下载链接】fuel-coreRust full node implementation of the Fuel v2 protocol.项目地址: https://gitcode.com/GitHub_Trending/fu/fuel-core创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表