news 2026/9/13 11:40:20

FHEVM Foundry 开发环境搭建指南:Soldeer 依赖管理、forge-fhevm 集成与安装验证

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
FHEVM Foundry 开发环境搭建指南:Soldeer 依赖管理、forge-fhevm 集成与安装验证

FHEVM Foundry 开发环境搭建指南:Soldeer 依赖管理、forge-fhevm 集成与安装验证

【免费下载链接】fhevmFHEVM, a full-stack framework for integrating Fully Homomorphic Encryption (FHE) with blockchain applications项目地址: https://gitcode.com/GitHub_Trending/fh/fhevm

本指南面向希望使用 Foundry 开发全同态加密(FHE)智能合约的 Solidity 工程师,系统讲解在 FHEVM 生态中搭建 Foundry 工程环境的两种途径:克隆官方 FHEVM Foundry 模板,或在已有 Foundry 项目中以 Soldeer 方式引入forge-fhevm。读完本文,你将掌握foundry.tomlremappings.txt的完整配置方法、forge soldeer install的依赖安装流程,以及如何用一个最小测试用例验证整套环境是否安装成功,并了解测试底层 FHEVM host 合约栈的部署原理。

环境前提

开始之前,请确保本机已安装最新版本的 [Foundry] 工具链(包含forgecastanvil三个核心命令)。推荐使用官方foundryup安装脚本完成安装,安装后可通过以下命令确认版本:

forge --version cast --version anvil --version

后续所有步骤均假设forge已在 PATH 中可用,并且当前网络环境能够访问 Soldeer 依赖仓库。

方案一:克隆官方 FHEVM Foundry 模板(推荐)

官方维护了一个开箱即用的 FHEVM Foundry 模板仓库(仓库名fhevm-foundry-template),它内置了完整的可运行工程:

  • foundry.tomlremappings.txt两份关键配置文件;
  • 一个示例FHECounter加密计数器合约;
  • 配套的测试用例;
  • 针对本地 Anvil 节点与 Sepolia 测试网的部署脚本。

对于初次接触 FHEVM 的开发者,这是最快、最稳妥的起步方式。

第一步:克隆模板

git clone <fhevm-foundry-template 仓库地址> cd fhevm-foundry-template

第二步:使用 Soldeer 安装依赖

模板使用 [Soldeer](Foundry 官方依赖管理器)管理依赖,安装命令只有一条:

forge soldeer install

该命令会将以下依赖拉取到项目根目录下的dependencies/目录中:

依赖包作用
forge-fhevmFoundry 原生的 FHEVM 测试库,提供FhevmTest基类与加密/解密辅助函数
@fhevm/solidityFHEVM Solidity 合约库(含FHE.sol等核心模块)
encrypted-types加密类型定义(euint8euint64ebool等)
OpenZeppelin contracts标准库依赖(代理、工具库等)
forge-stdFoundry 标准测试库

第三步:编译并运行测试

forge build forge test -vvv

forge build会以foundry.toml中声明的 EVM 版本与编译器版本完成编译;forge test -vvv则会执行模板自带的示例FHECounter测试。如果环境配置正确,你会看到FHECounter相关测试全部通过,这表明 FHEVM host 合约栈已成功部署到 Foundry 的测试 EVM 中,加密输入、执行与解密断言的完整链路均可正常工作。

方案二:为已有 Foundry 项目集成 forge-fhevm

如果你已经有一个正在开发的 Foundry 项目,不需要迁移,只需以 Soldeer 依赖的方式把forge-fhevm加进来即可。官方模板中的foundry.tomlremappings.txt是经过验证的"标准答案",精确的锁定版本请以模板仓库中的实际文件为准——本文下面给出的配置形态与模板保持一致,仅需将占位符替换为实际版本号。

1. 配置foundry.toml

forge-fhevm面向 Cancun EVM 和较新的 Solidity 编译器。一个典型的配置如下:

[profile.default] src = "src" out = "out" libs = ["dependencies"] test = "test" script = "script" evm_version = "cancun" # solc = "0.8.x" # 以模板中当前测试通过的版本为准 [dependencies] # 以模板 foundry.toml 中的当前版本为准 forge-std = "..." "@encrypted-types" = "..." "@fhevm-solidity" = "..." forge-fhevm = { git = "<forge-fhevm 仓库地址>", rev = "..." } [soldeer] remappings_version = false recursive_deps = true

各配置项的作用如下:

  • libs = ["dependencies"]:告诉编译器 Soldeer 的依赖安装在dependencies/目录,编译时需要在导入解析中包含该目录;
  • evm_version = "cancun"forge-fhevm依赖 Cancun EVM 引入的字节码特性(如TSTORE瞬态存储),是 host 合约正常工作的硬性要求,不要随意降低;
  • [dependencies]:声明依赖清单;其中forge-fhevm是 git 依赖,需要指定rev锁定提交;
  • [soldeer] remappings_version = false:Soldeer 生成 remapping 时不携带版本号后缀,便于保持导入路径稳定;
  • [soldeer] recursive_deps = true:允许递归解析依赖的依赖。

作为参考,本仓库内的真实工程也采用了类似的配置:host-contracts/foundry.toml将编译器锁定为solc = '0.8.24',开启了optimizer = trueoptimizer_runs = 200,并将forge-std版本固定为1.11.0(见[dependencies]段);library-solidity/foundry.toml同样锁定solc = '0.8.24'并将forge-std固定为1.11.0。这些文件可以作为你挑选编译器与依赖版本时的参照。

2. 安装依赖

配置完成后执行:

forge soldeer install

Soldeer 会将[dependencies]中声明的包逐一物化到dependencies/目录下。

3. 添加 remappings

Soldeer 将每个依赖物化到dependencies/<name>-<version>/目录,因此remappings.txt需要为每个导入前缀建立一条映射。配置形态如下:

@fhevm/host-contracts/=dependencies/forge-fhevm-<rev>/src/fhevm-host/ @fhevm/solidity/=dependencies/@fhevm-solidity-<version>/ encrypted-types/=dependencies/@encrypted-types-<version>/ forge-fhevm/=dependencies/forge-fhevm-<rev>/src/ forge-std/=dependencies/forge-std-<version>/src

各条映射的含义:

  • forge-fhevm/dependencies/forge-fhevm-<rev>/src/:核心映射,使import {FhevmTest} from "forge-fhevm/FhevmTest.sol"可被正确解析;
  • @fhevm/solidity/dependencies/@fhevm-solidity-<version>/:解析@fhevm/solidity/lib/FHE.sol等合约库导入;
  • encrypted-types/dependencies/@encrypted-types-<version>/:解析EncryptedTypes.sol等加密类型导入;
  • @fhevm/host-contracts/dependencies/forge-fhevm-<rev>/src/fhevm-host/:暴露 FHEVM host 合约(ACLFHEVMExecutor等)供测试基类引用;
  • forge-std/dependencies/forge-std-<version>/src:Foundry 标准库映射。

请把<version>/<rev>占位符替换为 Soldeer 实际写入dependencies/的目录名(查看该目录即可获得准确版本),也可以直接复制模板仓库的remappings.txt,在后续升级依赖时再按需调整。

验证安装:最小测试用例

环境是否真正可用,最快的方式是编写一个极简测试,验证FhevmTest基类能否在setUp()阶段把 FHEVM host 合约部署到测试 EVM 中。创建test/Setup.t.sol

// test/Setup.t.sol // SPDX-License-Identifier: MIT pragma solidity ^0.8.27; import {FhevmTest} from "forge-fhevm/FhevmTest.sol"; contract SetupTest is FhevmTest { function test_setupDeploys() public view { // setUp() 会在确定性的地址上部署全部 FHEVM host 合约 assertTrue(address(_executor) != address(0)); assertTrue(address(_acl) != address(0)); } }

然后单独运行该测试:

forge test --match-test test_setupDeploys -vv

若测试通过,说明:

  1. Soldeer 依赖安装无误,forge-fhevm/FhevmTest.sol导入解析成功;
  2. FhevmTest.setUp()已按预期部署了FHEVMExecutor_executor)与ACL_acl)等 host 合约;
  3. 当前 Solidity 编译器版本与evm_version = "cancun"组合可以正常编译运行。

底层原理:setUp() 究竟做了什么

理解了"验证用例为什么能通过",才算真正吃透这套环境。FhevmTest继承自 Foundry 的Test,其setUp()的核心工作是把生产环境中的 FHEVM host 合约栈原样重建到测试 EVM 里。这一点在本仓库的host-contracts/fhevm-foundry/HostContractsDeployerTestUtils.sol中有完整的源码级实现,可作为理解forge-fhevm内部机制的参照:

  • 确定性地址部署:host 合约(ACLFHEVMExecutorKMSVerifierInputVerifierHCULimitPauserSetProtocolConfigKMSGeneration)通过deployCodeTo写入固定的规范地址。这些地址由FHEVMHostAddresses.sol定义,例如仓库内sdk/js-sdk/contracts/src/v0.13.0/host-contracts/addresses/FHEVMHostAddresses.sol中记录了一批固定的规范地址常量(aclAddfhevmExecutorAddinputVerifierAddkmsVerifierAddhcuLimitAddprotocolConfigAddkmsGenerationAddpauserSetAdd)。
  • 模拟生产部署方式_deployACL_deployFHEVMExecutor等辅助函数按照生产环境的真实部署方式,先向规范地址写入空代理(Empty UUPS Proxy)的运行时代码,再以 owner 身份调用upgradeToAndCall完成实现合约的升级与初始化,最后通过vm.label为代理与实现打上标签便于调试。
  • 交叉合约权限真实生效:由于 host 合约栈被完整重建,跨合约的权限校验(如ACLOwnable、槽位读取、Pauser 集合等)在测试中的行为与链上完全一致,而不是逐个 mock。
  • 模拟签名者:测试环境与主网唯一的偏差在于输入签名者与 KMS 签名者使用了固定的 mock 私钥(MOCK_INPUT_SIGNER/MOCK_KMS_SIGNER),这使得测试中的 EIP-712 证明可以确定性生成。详细辅助函数清单见docs/solidity-guides/foundry/api.md

因此,test_setupDeploys_executor_acl非空,正是"host 合约栈已按规范地址完成部署"的直接证据。需要提醒的是:被测合约自身必须继承 Zama 配置(例如ZamaEthereumConfig),这样合约内的FHE.*调用才会路由到setUp()部署的这些 host 合约上。

常见配置问题排查

  • 编译报 "Source not found":通常是remappings.txt缺失或映射路径与dependencies/实际目录名不一致,请核对版本占位符;
  • evm_version相关报错:确认foundry.tomlevm_version = "cancun"未被覆盖,且 Solc 版本足够新以支持 Cancun 特性;
  • forge soldeer install后 import 仍失败:检查libs是否包含"dependencies",并确认[soldeer]段未被遗漏;
  • 版本对齐:本仓库各工程当前锁定solc 0.8.24forge-std 1.11.0(参见host-contracts/foundry.tomllibrary-solidity/foundry.toml),可优先以此为基准挑选版本。

后续进阶路径

  • 环境就绪后,可参考 编写 FHEVM Foundry 测试,学习FhevmTest的加密辅助函数(encryptUint64等)与三种解密模式(decrypt/publicDecrypt/userDecrypt);
  • 部署环节请阅读 使用 Foundry 部署 FHEVM 合约,覆盖本地 Anvil 节点与 Sepolia 测试网两种部署流程;
  • 完整的FhevmTest辅助函数速查表见 forge-fhevm API 参考;
  • 各网络(主网 / Sepolia)FHEVM host 合约的规范地址清单见 合约地址;
  • 对 Foundry 工作流的整体介绍可回看 Foundry 章节导读。

【免费下载链接】fhevmFHEVM, a full-stack framework for integrating Fully Homomorphic Encryption (FHE) with blockchain applications项目地址: https://gitcode.com/GitHub_Trending/fh/fhevm

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

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

433M超外差接收+EV1527解码:从原理图到PCB的完整遥控开关设计

简介&#xff1a;433M无线遥控开关模块硬件设计资料&#xff0c;面向电子工程师、嵌入式爱好者与智能家居开发者&#xff0c;解决了从无线收发原理到220V开关执行的整体设计参考需求。资源共91个文件&#xff0c;压缩包约11.19MB&#xff0c;核心为Altium Designer的PCB与原理图…

作者头像 李华
网站建设 2026/9/13 11:37:37

Java运算符详解:从基础到高级应用

1. Java运算符基础概述在Java编程语言中&#xff0c;运算符是构成表达式的基本元素&#xff0c;用于对变量和值执行各种操作。作为一门强类型静态语言&#xff0c;Java提供了丰富的运算符类型&#xff0c;每种运算符都有其特定的语法规则和使用场景。理解这些运算符的工作原理和…

作者头像 李华
网站建设 2026/9/13 11:34:40

Zulip Heroku 集成:将应用构建与发布事件实时推送到团队聊天

Zulip Heroku 集成&#xff1a;将应用构建与发布事件实时推送到团队聊天 【免费下载链接】zulip Zulip server and web application. Open-source team chat that helps teams stay productive and focused. 项目地址: https://gitcode.com/GitHub_Trending/zu/zulip 本…

作者头像 李华
网站建设 2026/9/13 11:31:49

AUTOSAR BswM模块:汽车ECU模式管理核心解析

1. AUTOSAR BswM模块概述BswM&#xff08;Basic Software Mode Manager&#xff09;是AUTOSAR标准中的核心系统服务模块&#xff0c;负责协调ECU内部不同模块的工作模式与状态转换。作为AUTOSAR基础软件&#xff08;BSW&#xff09;的关键组件&#xff0c;它通过规则驱动的决策…

作者头像 李华