尧图网络 高端网站定制 · 原创设计
免费咨询热线
400-888-6620
免费获取方案
fhEVM 测试网实验利器:深入解析 host-contracts 中的 mock-coprocessor 明文重放守护进程
fhEVM 测试网实验利器深入解析 host-contracts 中的 mock-coprocessor 明文重放守护进程【免费下载链接】fhevmFHEVM, a full-stack framework for integrating Fully Homomorphic Encryption (FHE) with blockchain applications项目地址: https://gitcode.com/GitHub_Trending/fh/fhevmmock-coprocessor 是 fhEVM 仓库 host-contracts 子项目下提供的一个长期运行的 TypeScript 守护进程它在无真实密码学、无 FHE、无 MPC的前提下模拟生产环境 FHEVM coprocessor 的行为轮询链上已部署的FHEVMExecutor与ConfidentialBridge事件在明文域内重放每一次 FHE 运算并把(handle → clearText)结果存入共享 SQLite 数据库。读完本文你将掌握它的架构设计、事件处理原理、配置参数与三种 CLI 用法并能在真实测试网上用它驱动端到端集成冒烟测试。为什么需要假的 coprocessor在生产环境中FHEVM 的 coprocessor 负责监听链上事件、执行同态加密运算、生成证明并回写结果整个链路依赖复杂的 TFHE 密码学、SNS 消息队列与多签名输入验证。当开发者只想验证合约逻辑、事件流转、跨链桥接、端到端集成冒烟测试时启动一条完整的 coprocessor 集群成本过高且排障困难。mock-coprocessor 正是为此而生它把链上事件 → 密文结果这一过程用明文算术等价替换从而让 dApp 开发者可以在真实测试网Sepolia / Amoy上跑通FHE.fromExternal(...)、FheAdd、FheIfThenElse、跨链HandleBridged等完整流程而无需接触任何真实加密组件。原文档明确划定了它的边界见 README.mdScope.无真实密码学、无 FHE、无 MPC。它只基于事件日志 算术 一个 EIP-712 签名的输入包构建器模拟生产 relayer 会发出的东西。适用于端到端集成冒烟测试不适用于在任意安全上下文中充当真实 coprocessor 的替身。架构总览按链拆分的轮询工作线程原文档给出了最核心的架构图┌───────────────────────────┐ RPC: Sepolia ──poll──▶ │ chain-worker (sepolia) │ ─┐ └───────────────────────────┘ │ ├─▶ MockDb (SQLite) ┌───────────────────────────┐ │ handle → clearText RPC: Amoy ──poll──▶ │ chain-worker (amoy) │ ─┘ └───────────────────────────┘对应的三个核心组成部分均可在scripts/mock-coprocessor/目录下找到实现每个链一个 chain worker轮询eth_getLogs目标地址来自该链部署快照chain/addresses/.env.hostFHEVM_EXECUTOR_CONTRACT_ADDRESS与CONFIDENTIAL_BRIDGE_CONTRACT_ADDRESS。实现见 chain-worker.ts。事件解析与分发日志按照与 test/coprocessorUtils.ts 相同的 ABI定义在 abi/events.ts解析然后分发给两个 handlerhandlers/fhe-executor.ts覆盖全部 FHE 操作符TrivialEncrypt、FheAdd/Sub/Mul/Div/Rem/BitAnd/BitOr/BitXor/Shl/Shr/Rotl/Rotr、Eq/Ne/Ge/Gt/Le/Lt、Min/Max、Cast、Not/Neg、VerifyInput、IfThenElse、Rand/RandBounded、Sum、IsIn、MulDiv由 test/coprocessorUtils.ts 的insertHandleFromEvent移植而来。handlers/bridge.ts处理HandleBridged把源链明文复制到目标链 handle与FallbackGrantedPlaintext桥所有者手动断言明文。共享 SQLite 存储所有 worker 共享同一个 SQLite 连接持久化(handle → clearText)供独立的pnpm mock:query进程读取。服务编排与优雅退出service.ts 是编排层读取配置、打开共享MockDb、为每条链runChainWorker、并通过AbortController把SIGINT/SIGTERM转发给所有 worker让当前轮询周期完整结束后再关库退出。sqlite3 会在内部串行化写操作因此多 worker 共享单连接是安全的。轮询引擎只处理活事件的链上光标chain-worker.ts 实现了一个关键设计live-events-only。启动时读取cursor latestBlockNumber并只保存在内存中不落盘、不回溯因此重启后不会补捞错过的历史事件。每个轮询周期读取head latestBlockNumber若head cursor对FHEVMExecutor与ConfidentialBridge分别eth_getLogs查询[cursor1, min(head, cursor1maxBlockRange)]解析并按照(blockNumber, transactionIndex, logIndex)排序——这一点很关键FHE handler 依赖操作数事件先于派生事件的顺序逐条分发到对应 handler推进cursor重放跨链 pending bridge 队列已追上头部则 sleeppollIntervalMs否则立即继续。错误处理任何 RPC/handler 错误只记录日志并 sleeperrorBackoffMs后重试不推进 cursor。配合 DB 层的INSERT OR IGNORE重放天然幂等reorg 后重处理是安全的。启动日志会打印initialised at chain head N — only events from block N1 onwards will be processed。向测试网提交验证用交易时必须等守护进程打印出这行初始头部日志之后否则交易所在区块可能落在 cursor 之前而被跳过。数据模型SQLite 里的 handle → clearText 映射db.ts 是 mock 的全部意义所在——每个 FHE handle全局唯一映射到其十进制明文字符串CREATE TABLE IF NOT EXISTS ciphertexts ( handle TEXT PRIMARY KEY, clear_text TEXT NOT NULL, updated_at INTEGER NOT NULL DEFAULT (strftime(%s,now)) )写入策略分两类INSERT OR IGNORE默认重放同一事件是无操作保证幂等INSERT OR REPLACE仅用于FheRand/FheRandBounded这类非确定性操作因为每个事件是新鲜随机数的唯一事实来源reorg 后重处理必须覆盖旧值见 handlers/fhe-executor.ts 中FheRand分支的注释。handle 统一按小写十六进制存储查询时同样归一化。DB 文件默认路径与清空方式由MOCK_COPROCESSOR_DB_PATH与pnpm mock:reset控制。明文重放FHE 操作符的逐事件处理handlers/fhe-executor.ts 是明文重放的核心其行为与测试 mock test/coprocessorUtils.ts 保持一致仅做了三处调整不依赖 hardhat 的ethers.provider操作数明文改从MockDb读取、写入幂等、操作数缺失时直接抛错而非无限重试。类型位宽表与 handle 元数据每个 FHE 类型的位宽由 handle 的第 30 字节handle[30]决定与 FHEVMExecutor.sol 中_appendMetadataToPrehandle的编码一致handle[30]类型位宽0ebool12euint883euint16164euint32325euint64646euint1281287eaddress1608euint256256所有算术结果最终都会对2^位宽取模modN减法为负时先补2^位宽再取模确保与链上 FHE 语义一致。各操作符的明文算法要点TrivialEncrypt / TrivialEncryptBytes直接把事件中的明文pt写入resulthandle二元运算Add/Sub/Mul/BitAnd/BitOr/BitXor/Shl/Shr/Rotl/Rotr/比较族/Min/Max统一按scalarByte 0x01判定右操作数是标量直接用args[2]还是密文 handle从 DBlookupFheDiv / FheRem当前仅支持标量除数非标量会显式抛Non-scalar div not implemented yetFheNot / FheNeg按位取反带掩码FheNeg再1取模实现二补数FheIfThenElsecontrol 1n ? ifTrue : ifFalseFheRandcrypto.getRandomValues生成该位宽内的随机 bigint用 REPLACE 写入FheRandBounded生成log2(upperBound)位宽的随机数FheSum遍历values[]逐项 lookup 累加后取模FheIsIn判断 value 是否在 set 的明文集合中返回 0/1FheMulDivlhs * rhs / divisor后取模支持标量/密文右操作数VerifyInput只校验输入 handle 已在 DB 中注册不产生新密文返回noop若缺失会大声报错提示 relayer/input-verifier 路径未被模拟要么手动预置 handle要么只用 TrivialEncrypt 流程。从源码结构看新增 FHE 操作符时需要在 abi/events.ts 添加事件签名、在 handlers/fhe-executor.ts 实现明文处理并与coprocessorUtils.ts保持同步——文件注释明确要求二者保持 lockstep。跨链桥接处理pending 重试队列handlers/bridge.ts 处理三种桥接事件HandleBridged(receiverDapp, srcHandle, dstHandle, guid)目标链桥已从srcHandle派生出dstHandle。处理方式是在共享 DB 中查srcHandle明文并写入dstHandle。若源链事件尚未处理不同链轮询速度不同导致乱序就把映射加入内存重试队列每个轮询周期重试FallbackGrantedPlaintext(dstHandle, plaintext)桥所有者手动断言dstHandle的解码结果直接信任该断言链上检查已保证 chainId、version、fheType 与明文范围一致BridgeHandle(senderDapp, srcHandle, dstChainId, guid)纯信息性事件源侧宣告一次桥接调用无需处理返回noop。重试条目带有attemptsLeft受RUNTIME.bridgeRetryLimit控制默认 20耗尽后丢弃并大声告警——通常是因为守护进程在源链交易出块之后才启动live-only 模式跳过了它此时需要重启并重新提交交易。输入包构建器模拟 relayer 的 EIP-712 加密输入input.ts 是另一个半场离线模拟 relayer / input-verifier 流程让调用FHE.fromExternal(externalEuintXX, bytes inputProof)的 dApp 也能在没有真实 coprocessor 的测试网上跑通。它实现自 test/fhevmjsMocked.ts 的规范算法保证同一(contract, user, inputs)元组算出的 handle 与生产 relayer逐字节一致。handle 布局32 字节byte 0..20 keccak 摘要随机噪声进入 preimage byte 21 input 索引 i byte 22..29 host chainId大端 uint64 byte 30 FheType tag byte 31 HANDLE_VERSION ( 0)由于每个输入的 32 字节随机噪声进入 keccak preimagehandle 是非确定性的——调用方必须使用buildEncryptedInput返回的 handle仅凭明文重新计算会得到不同值。构建流程与 inputProof 打包buildEncryptedInput依次完成构造每输入 blobFheType字节 || BE(value) || random32→keccak256(concat(blobs))得到 hash → 每输入keccak(hash || idx)并覆写元数据字节 → 用CiphertextVerification类型做 EIP-712 签名domain 为name: InputVerification、chainId: gatewayChainId、verifyingContract: inputVerificationAddress→ 打包 inputProofnumHandles(1B) | numSigners(1B) | handles(32B*n) | sigs(65B*m) | extraData(0x00)链上InputVerifier会校验每位 signer 一个 EIP-712 签名且签名者数量 ≥ threshold、(contract, user, contractChainId)绑定进签名摘要、handle 的 chainId/type/version 字节正确。签名 v 值被显式加 27 归一化到{27,28}。buildAndRegisterEncryptedInput在构建 bundle 的同时把每个(handle, cleartext)写入 mock DB这样守护进程的VerifyInputhandler 能在交易上链后立即解析出结果——operator 应在广播 dApp 交易之前立即调用它。配置详解链表与环境变量链配置CHAINS 表config.ts 内置四条链每条链属于testnet或mainnet环境守护进程每次只运行当前环境的两条链由BRIDGE_ENV选择默认testnet环境链名chainIdLZ eidRPC 环境变量RPC 默认值地址快照testnetsepolia1115511140161SEPOLIA_RPC_URLhttps://sepolia.drpc.orgaddresses-sepolia/.env.hosttestnetpolygonAmoy8000240267POLYGON_AMOY_RPC_URLhttps://rpc-amoy.polygon.technologyaddresses-amoy/.env.hostmainnetethereum130101ETHEREUM_MAINNET_RPC_URLhttps://eth.llamarpc.comaddresses-ethereum/.env.hostmainnetpolygon13730109POLYGON_MAINNET_RPC_URLhttps://polygon-rpc.comaddresses-polygon/.env.host地址快照文件必须包含FHEVM_EXECUTOR_CONTRACT_ADDRESS与CONFIDENTIAL_BRIDGE_CONTRACT_ADDRESS后者缺失时桥事件不会被传播缺失会直接抛错并提示先运行task:deployAllHostContracts并参考addresses/BRIDGE_DEPLOYMENT.md快照地址。新增一条链只需在CHAINS中加一个条目无需改动其他代码路径BRIDGE_ENV接受mainnet/main/prod或testnet/test/空值其他值直接抛错。RUNTIME 运行参数环境变量默认值作用MOCK_COPROCESSOR_POLL_INTERVAL_MS5000追平头部后的轮询间隔毫秒MOCK_COPROCESSOR_MAX_BLOCK_RANGE1000每次eth_getLogs的最大区块跨度多数公共 RPC 上限 1k–10kMOCK_COPROCESSOR_ERROR_BACKOFF_MS10000失败轮询周期后的退避时间MOCK_COPROCESSOR_DB_PATHscripts/mock-coprocessor/mock-coprocessor.dbSQLite 持久化路径MOCK_COPROCESSOR_BRIDGE_RETRY_LIMIT20pending 桥映射最大重试次数所有参数均可用环境变量覆盖以适配特定 RPC 的限流策略而无需改动源码。运行方式三个 CLI 子命令入口是 index.ts通过 package.json 的三个 npm 脚本暴露1.pnpm mock:daemon— 常驻轮询默认子命令pnpm mock:daemon # 或直接 npx ts-node --transpile-only scripts/mock-coprocessor/index.ts daemon启动后打印starting service for 2 chain(s): sepolia(eid40161), polygonAmoy(eid40267)与dbpath。等每条链打印initialised at chain head N后再提交测试交易。Ctrl-CSIGINT触发优雅退出当前轮询周期完成后关库。2.pnpm mock:query handle— 查询明文pnpm mock:query 0x1234...abcdhandle 会被规范化为 32 字节十六进制ethers.toBeHex。若该 handle 已在 DB 中stdout 打印十进制明文并退出码 0否则打印错误提示守护进程可能仍在追赶或该 handle 从未产生并退出码 1。该命令可独立于 daemon 在另一个进程运行因为 SQLite 表是持久化的。3.pnpm mock:encrypt— 构造加密输入包pnpm mock:encrypt --contract addr --user addr --type euint64|... --value num --host-chain-id chainId五个必填 flag 缺失时退出码 2 并打印 usage--host-chain-id必须是正整数。它读取根目录.env中的 coprocessor 签名者密钥构建(handle, inputProof)包并写入 mock DBstdout 打印机器友好的handle.../inputProof...便于eval $(...)或awk消费。--type支持bool/ebool、uint4..uint256、euint4..euint256、address/eaddress别名bool 值接受true/false/1/0address 值会做地址格式校验。内部还会交叉检查私钥派生地址与COPROCESSOR_SIGNER_ADDRESS_i是否一致不一致直接拒绝生成注定被链上 InputVerifier 拒绝的证明。encrypt依赖的环境变量包括CHAIN_ID_GATEWAYEIP-712 domain chainId、INPUT_VERIFICATION_ADDRESS、NUM_COPROCESSORS与PRIVATE_KEY_COPROCESSOR_ACCOUNT_0..N-1。已知局限与使用注意事项综合源码与文档使用时有几点必须注意live-events-only守护进程不会跨重启补捞事件游标不持久化。验证交易必须在上文初始头部日志之后提交不模拟 relayer/input-verifier 全流程VerifyInput只校验 handle 已在 DB 中真实输入证明需通过pnpm mock:encrypt预置或手动insertCiphertext无任何安全语义明文与 handle 一一对应仅存在于本地 SQLite绝不能在生产/安全场景中充当 coprocessor非标量 FheDiv/FheRem 未实现遇到会直接抛错跨链乱序依赖重试队列源链事件迟迟不到时pending 映射会耗尽bridgeRetryLimit后被丢弃。深入阅读指引架构与边界README.md事件 ABI与测试 mock 同步维护abi/events.ts明文重放逻辑移植自测试 mockhandlers/fhe-executor.ts、test/coprocessorUtils.ts跨链桥事件与重试队列handlers/bridge.ts输入包构建与 EIP-712 签名input.ts、test/fhevmjsMocked.ts链配置与运行参数config.tsCLI 入口与 npm 脚本index.ts、package.json【免费下载链接】fhevmFHEVM, a full-stack framework for integrating Fully Homomorphic Encryption (FHE) with blockchain applications项目地址: https://gitcode.com/GitHub_Trending/fh/fhevm创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
RELATED

相关推荐

三款AI写论文工具实测:从开题到查重怎么选才不踩坑?

三款AI写论文工具实测:从开题到查重怎么选才不踩坑?

写论文这事,最怕的不是写不出来,而是写得心里没底。 题目改了七八版还怕选重了,文献下载了两百篇越读越乱,参考文献格式调到崩溃,交稿前还得担心重复率和AIGC检测。今年开学季一到,又有一波人在搜"AI论…

📅 2026/9/12 19:33:34
ARM嵌入式语音唤醒引擎静态代码审计实战

ARM嵌入式语音唤醒引擎静态代码审计实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

📅 2026/9/12 19:33:34
智慧金融风控平台架构演进与实时决策技术

智慧金融风控平台架构演进与实时决策技术

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

📅 2026/9/12 19:33:34
MORE NEWS

更多资讯

📰

护网行动实战指南:蓝队防守、红队攻击与AWD攻防演练全解析

聊聊护网行动。每年一到护网季,安全圈就像被上了发条,甲方乙方都停不下来:蓝队通宵盯告警,红队半夜搞突破,评估组拿着规则看表现。作为一个连续参与过多次护网、身份从边界巡检到蓝队研判再到红队外聘都干过的人&#…

📰

智驾数据闭环湖仓实战: Apache Paimon 分层建模实践

系列一我们用七篇文章走完了智驾数据闭环的全景——从 8 环节模型、厂商对标、架构蓝图、全局 ID、11 张 ADS 表、闭环度量到存储治理。但有一个关键问题始终没有展开:这 79 张 Paimon 表到底是怎么设计出来的?很多团队做湖仓,最容易踩的坑不…

📰

基于Simulink的PEMFC静态与动态仿真建模实战指南

用 Simulink 做基于质子交换膜燃料电池(PEMFC)的仿真建模,是这些年燃料电池系统开发中最常见的第一步。我在做车用燃料电池系统的仿真工作时,发现很多刚接触这块的人总喜欢直接找现成模型,结果要么是模型复杂到看不懂每…

📰

虚拟化集群集体失联?时间同步故障排查与加固实战

凌晨2点18分,手机被监控告警轰炸到震动模式都拦不住。我眯着眼划开屏幕,整个人瞬间清醒:9台服务器,同一分钟,全部失联。HTTP探针超时、ICMP丢包、SSH登录失败,监控面板上一整片刺眼的红色,像是有…

📰

Kubernetes健康检查与优雅关机最佳实践

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

📰

3C零件厚度测量传感器怎么选?MLD25激光位移传感器选型与实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

TODAY

今日更新

THIS WEEK

本周精选

THIS MONTH

本月热门

读完文章,想聊聊您的网站?

告诉我们您的行业与需求,资深顾问一对一梳理方案与报价,全程免费。

📞 💬