ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

fhEVM js-sdk 测试地址簿解析:从助记词到确定性合约地址的推导全流程

fhEVM js-sdk 测试地址簿解析:从助记词到确定性合约地址的推导全流程 fhEVM js-sdk 测试地址簿解析从助记词到确定性合约地址的推导全流程【免费下载链接】fhevmFHEVM, a full-stack framework for integrating Fully Homomorphic Encryption (FHE) with blockchain applications项目地址: https://gitcode.com/GitHub_Trending/fh/fhevm本文档以 fhEVM 仓库 sdk/js-sdk/test/ADDRESSES.md 为骨架系统讲解 js-sdk 测试基础设施中测试账户与合约地址是如何从固定助记词确定性推导出来的。它直接服务于本地 anvil/localstack 测试环境、SDK 测试套件与浏览器端 e2e 测试读者读完后可以掌握一条助记词如何派生出多个部署者账户index 派生、这些账户如何按 nonce 通过 CREATE 语义推导出 ACL、FHEVMExecutor、KMSVerifier 等宿主合约地址以及如何用cast命令行与仓库源码互相验证这些地址。一、这份文档是什么测试环境的确定性地址账本ADDRESSES.md不是一份营销文档而是 js-sdk 测试设施中单点维护的地址清单single source of truth。它记录了测试助记词FHEVM_REPO_MNEMONIC同时是 test/infra/config.ts 中的DEFAULT_DEPLOYER_MNEMONIC由该助记词在不同 BIP-39 index 下派生的部署者私钥与账户地址index5 与 index9由这些部署者账户按固定 nonce 通过 CREATE 推导出的宿主合约地址并标注了合约类型、版本v0.11.0 / v0.12.0 / v0.13.0与适用链localstack / chainId31337。整个 js-sdk 测试矩阵test/ 目录下的 vitest 单测、test/infra/ 的 anvil 编排、test/chains/ 的链配置都依赖这套地址的确定性同一助记词 同一索引 同一 nonce在任何机器、任何时候都得到同一地址从而保证 CI 与本地环境的可复现性。二、助记词与账户派生一条助记词两个部署者ADDRESSES.md首先给出核心助记词FHEVM_REPO_MNEMONICadapt mosquito move limb mobile illegal tree voyage juice mosquito burger raise father hope layer该助记词在仓库中的正式定义位于 sdk/js-sdk/test/infra/config.tsexport const DEFAULT_DEPLOYER_MNEMONIC adapt mosquito move limb mobile illegal tree voyage juice mosquito burger raise father hope layer; export const DEFAULT_DEPLOYER_INDEX 5;由此派生两个部署者账户账户派生方式私钥地址主部署者FHEVM_REPO_MNEMONIC, index5, pathdefault0x7697c90f7863e6057fbe25674464e14b57f2c670b1a8ee0f60fb87eb9b615c4d0x8B8f5091f8b9817EF69cFC1E8B2f721BafF60DF4辅助部署者FHEVM_REPO_MNEMONIC, index9, pathdefault0x2d24c36c57e6bfbf90c43173481cc00edcbd1a3922de5e5fdb9aba5fc4e0fafd0xc45994e4098271c3140117ebD5c74C70dd56D9cd文档给出的私钥派生命令依赖 Foundry 的cast需先cast wallet import或用cast wallet private-key直接由助记词推导# index9 的私钥 cast wallet private-key adapt mosquito move limb mobile illegal tree voyage juice mosquito burger raise father hope layer 9 # index5 的私钥 cast wallet private-key adapt mosquito move limb mobile illegal tree voyage juice mosquito burger raise father hope layer 5两个部署者对应两套测试部署场景index9用于 localstack 链localstack:v0.11.0的宿主合约部署对应 test/chains/localstack.ts 等链配置index5用于fhevm/solidity/config中 chainId31337 的 cleartext 部署Foundry 测试网对应 test/infra/config.ts 中 v12 slotchainId 31337。从源码结构看v12 槽位使用独立部署者助记词FIRST_ANVIL_MNEMONIC见 test/infra/config.ts以保证 legacy 与 current 两套协议栈地址不冲突——因为 SDK 会按合约地址缓存协议版本两个链共享地址会互相碰撞。三、核心机制合约地址 f(部署者, nonce) 的 CREATE 推导地址簿后半部分的所有合约地址都遵循以太坊 CREATE 语义由部署者地址与部署 nonce 共同决定与链无关、与部署时间无关。仓库 test/infra/anvil/fhevmAddresses.ts 是这一机制的源码实现import { getContractAddress } from viem; import { mnemonicToAccount } from viem/accounts; import { DEFAULT_DEPLOYER_INDEX } from ../config.js; // CREATE nonce of each host contract, fixed by the deploys creation order. const HOST_NONCE { acl: 1, fhevmExecutor: 3, kmsVerifier: 4, inputVerifier: 5, hcuLimit: 6, protocolConfig: 7, kmsGeneration: 8, pauserSet: 9, } as const; export function deriveFhevmHostAddresses(mnemonic: string, index: number DEFAULT_DEPLOYER_INDEX): FhevmHostAddresses { const from mnemonicToAccount(mnemonic, { addressIndex: index }).address; const at (nonce: number): string getContractAddress({ from, nonce: BigInt(nonce) }); return { acl: at(HOST_NONCE.acl), inputVerifier: at(HOST_NONCE.inputVerifier), kmsVerifier: at(HOST_NONCE.kmsVerifier), protocolConfig: at(HOST_NONCE.protocolConfig), }; }这段代码同时印证了两个要点部署顺序即 nonce 顺序部署脚本按ACL → FHEVMExecutor → KMSVerifier → InputVerifier → HCULimit → ProtocolConfig → KMSGeneration → PauserSet的固定顺序逐个CREATE因此每个合约占用固定 nonce地址可预先离线计算文件头注释给出验证锚点deriveFhevmHostAddresses(DEFAULT_DEPLOYER_MNEMONIC, 5).acl 0x50157CFfD6bBFA2DECe204a89ec419c23ef5755D与地址簿第 8 项完全一致证明该地址清单与代码推导逻辑互为校验。需要区分两个概念账户地址由助记词经 BIP-39/BIP-32 派生即钱包地址与合约地址由部署者地址 nonce 经 CREATE 推导。地址簿中 index5/9 两项是账户地址其余都是合约地址。四、地址与合约映射速查表4.1 localstack:v0.11.0 部署组部署者 index9序号合约部署 nonce地址—部署者账户index9—0xc45994e4098271c3140117ebD5c74C70dd56D9cd1ACL10x05fD9B5EFE0a996095f42Ed7e77c390810CF660c2FHEVMExecutor30xcCAe95fF1d11656358E782570dF0418F59fA40e13KMSVerifier40xa1880e99d86F081E8D3868A8C4732C8f65dfdB114InputVerifier50x857Ca72A957920Fa0FB138602995839866Bd40055HCULimit60xAb30999D17FAAB8c95B2eCD500cFeFc8f658f15d6PauserSet70x52054F36036811ca418be59e41Fc6DD1b9e4F4c8对应验证命令cast wallet address用私钥反查账户地址cast compute-address用部署者 nonce正向计算合约地址# address of FHEVM_REPO_MNEMONIC, index9 pathdefault cast wallet private-key adapt mosquito move limb mobile illegal tree voyage juice mosquito burger raise father hope layer 9 cast wallet address --private-key 0x2d24c36c57e6bfbf90c43173481cc00edcbd1a3922de5e5fdb9aba5fc4e0fafd cast compute-address 0xc45994e4098271c3140117ebD5c74C70dd56D9cd --nonce 1 # ACL cast compute-address 0xc45994e4098271c3140117ebD5c74C70dd56D9cd --nonce 3 # FHEVMExecutor cast compute-address 0xc45994e4098271c3140117ebD5c74C70dd56D9cd --nonce 4 # KMSVerifier cast compute-address 0xc45994e4098271c3140117ebD5c74C70dd56D9cd --nonce 5 # InputVerifier cast compute-address 0xc45994e4098271c3140117ebD5c74C70dd56D9cd --nonce 6 # HCULimit cast compute-address 0xc45994e4098271c3140117ebD5c74C70dd56D9cd --nonce 7 # PauserSet4.2 fhevm/solidity/config chainId31337 部署组部署者 index5序号合约部署 nonce适用版本地址—部署者账户index5——0x8B8f5091f8b9817EF69cFC1E8B2f721BafF60DF41PauserSet0v0.11.0, v0.12.00x34e3eD8472e409dbF8FDf933cA996DC75e4Be1262ACL1所有版本0x50157CFfD6bBFA2DECe204a89ec419c23ef5755D3FHEVMExecutor3所有版本0xe3a9105a3a932253A70F126eb1E3b589C643dD244KMSVerifier4所有版本0x901F8942346f7AB3a01F6D7613119Bca447Bb0305InputVerifier5所有版本0x36772142b74871f255CbD7A3e89B401d3e45825f6HCULimit6所有版本0x233ff88A48c172d29F675403e6A8e302b0F032D97ProtocolConfig7v0.13.00x44aA028fd264C76BF4A8f8B4d8A5272f6AE25CAc8KMSGeneration8v0.13.00x216be43148dB537BeddBC268163deb1a802b55539PauserSet9v0.13.00xded0D2a71268DC12622BdD1b55d68a1CB5662327对应验证命令# address of FHEVM_REPO_MNEMONIC, index5 pathdefault cast wallet private-key adapt mosquito move limb mobile illegal tree voyage juice mosquito burger raise father hope layer 5 cast wallet address --private-key 0x7697c90f7863e6057fbe25674464e14b57f2c670b1a8ee0f60fb87eb9b615c4d # nonce0 → 0x34e3eD8472e409dbF8FDf933cA996DC75e4Be126 (PauserSet, 旧版本) cast compute-address 0x8B8f5091f8b9817EF69cFC1E8B2f721BafF60DF4 --nonce 0 # nonce1 → ACL所有版本 cast compute-address 0x8B8f5091f8b9817EF69cFC1E8B2f721BafF60DF4 --nonce 1 # nonce3 → FHEVMExecutor所有版本 cast compute-address 0x8B8f5091f8b9817EF69cFC1E8B2f721BafF60DF4 --nonce 3 # nonce4 → KMSVerifier所有版本 cast compute-address 0x8B8f5091f8b9817EF69cFC1E8B2f721BafF60DF4 --nonce 4 # nonce5 → InputVerifier所有版本 cast compute-address 0x8B8f5091f8b9817EF69cFC1E8B2f721BafF60DF4 --nonce 5 # nonce6 → HCULimit所有版本 cast compute-address 0x8B8f5091f8b9817EF69cFC1E8B2f721BafF60DF4 --nonce 6 # nonce7 → ProtocolConfigv0.13.0 cast compute-address 0x8B8f5091f8b9817EF69cFC1E8B2f721BafF60DF4 --nonce 7 # nonce8 → KMSGenerationv0.13.0 cast compute-address 0x8B8f5091f8b9817EF69cFC1E8B2f721BafF60DF4 --nonce 8 # nonce9 → PauserSetv0.13.0 cast compute-address 0x8B8f5091f8b9817EF69cFC1E8B2f721BafF60DF4 --nonce 9注HOST_NONCE中 ACL 固定为 nonce1而旧版v0.11.0/v0.12.0在 nonce0 处多部署了一个早期 PauserSetv0.13.0 起 PauserSet 移到 nonce9即HOST_NONCE.pauserSet这正是地址簿两组数据存在差异的原因。五、地址簿与测试设施的联动关系地址簿中的地址并不是孤立存在的它们被 js-sdk 测试设施多处引用链配置消费合约地址test/chains/localstack.ts 等defineFhevmChain配置中acl、inputVerifier、kmsVerifier、protocolConfig字段填写的正是地址簿中的地址例如 ACL0x05fD9B5E...、InputVerifier0x857Ca72A...、KMSVerifier0xa1880e99...。SDK 运行时通过这些地址解析并缓存协议版本slot 编排消费部署者test/infra/config.ts 中每个 slot 定义了独立的 chainId、端口与 TFHE 密钥版本其中 v12 slot 使用 chainId 31337、端口 8544、TFHE 1.5.4v13 slot 使用 chainId 31338、端口 8546、TFHE 1.6.2——这与地址簿 chainId31337 的分组一致anvil 启动即地址推导test/infra/anvil/spawn-anvils.ts 通过startAnvils(anvilSpecs())拉起测试链而 fhevmAddresses.ts 的作用正是在部署前离线算出各槽位地址让 gateway 无需解析部署产物即可按槽位提供地址RPC/测试合约参数test/chains/chain-defaults.json 记录了各链localstack、sepolia、mainnet、polygon 等的 RPC 地址与测试合约fheTestAddress与地址簿一起构成完整的测试拓扑。六、安全边界与使用提醒这份地址簿属于测试设施专用使用时必须注意助记词与私钥均硬编码在仓库中仅供本地 anvil / 测试网 / 模拟环境使用任何情况下都不得用于持有真实资产的主网账户地址的确定性依赖部署顺序 nonce 顺序一旦部署脚本调整了合约创建顺序整套地址簿即失效必须同步更新 ADDRESSES.md 与 fhevmAddresses.ts 中的HOST_NONCE若需在本地复现需安装 Foundry提供cast命令与 Node 环境并通过cast compute-address/cast wallet或viem的getContractAddress双向校验。总结sdk/js-sdk/test/ADDRESSES.md以极简的清单形式浓缩了 fhEVM js-sdk 测试设施中助记词 → 账户 → 合约地址的完整确定性推导链路一条FHEVM_REPO_MNEMONIC助记词在 index5 与 index9 处派生出两个部署者再由固定 nonce 经 CREATE 语义推导出 ACL、FHEVMExecutor、KMSVerifier、InputVerifier、HCULimit、ProtocolConfig、KMSGeneration、PauserSet 等宿主合约地址。理解这套机制是排查本地测试环境地址不一致、部署顺序变更导致地址漂移、以及参与 js-sdk 测试矩阵开发的基本功。【免费下载链接】fhevmFHEVM, a full-stack framework for integrating Fully Homomorphic Encryption (FHE) with blockchain applications项目地址: https://gitcode.com/GitHub_Trending/fh/fhevm创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进