ARTICLE · INTELLIGENCE

战地情报 · 详情页

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

基于 FHEVM 与 OpenZeppelin 的 ERC-7984 封装:将普通 ERC-20 转换为机密代币的完整实战指南

基于 FHEVM 与 OpenZeppelin 的 ERC-7984 封装:将普通 ERC-20 转换为机密代币的完整实战指南 基于 FHEVM 与 OpenZeppelin 的 ERC-7984 封装将普通 ERC-20 转换为机密代币的完整实战指南【免费下载链接】fhevmFHEVM, a full-stack framework for integrating Fully Homomorphic Encryption (FHE) with blockchain applications项目地址: https://gitcode.com/GitHub_Trending/fh/fhevm本文以 ZAMA FHEVM 开源仓库 docs/examples/openzeppelin/ERC7984ERC20WrapperMock.md 为骨架讲解如何利用 OpenZeppelin 机密合约库中的ERC7984ERC20Wrapper在 FHE全同态加密加持下把非机密 ERC-20 一键封装为机密 ERC-7984 代币。读完本文你将掌握封装wrap的两步流程、合约与测试的完整写法、目录放置规范以及仓库源码中FHE与ZamaConfig的底层支撑原理。一、为什么需要“封装”一个机密代币ERC-7984 是 OpenZeppelin 机密合约库中的机密同质化代币标准余额与转账金额全部以密文形式上链同时保持代币的全部功能。但现实世界中有大量存量 ERC-20 资产用户希望在不发行全新代币的前提下把这些公开余额的资产引入隐私域。封装wrap正是连接两个世界的桥梁用户把公开的 ERC-20 按1:1比例存入封装合约合约铸造等额的机密 ERC-7984赎回unwrap则是反向操作。相关两个方向的完整示例都位于仓库 docs/examples/openzeppelin 目录下本文讲解的 ERC-20 → ERC-7984ERC7984ERC20WrapperMock.md反向赎回 ERC-7984 → ERC-20swapERC7984ToERC20.md。封装的两步核心流程按照原文档的说明ERC7984ERC20Wrapper内部以两个步骤完成交换且顺序不可颠倒代币转入合约调用SafeERC20.safeTransferFrom()从调用者账户转入 ERC-20 代币若转入失败余额不足、未授权等会自动revert保证“先扣款”机密铸造合约向接收者铸造等额的 ERC-7984 机密代币该步在机密域内执行保证必然成功。这种“先锁定公开资产、再铸造机密资产”的模型保证了封装过程资产守恒也避免出现只铸币不收资产或只收资产不铸币的中间状态。二、环境准备与工程搭建在动手写合约之前需要准备 FHEVM 开发环境与 OpenZeppelin 机密合约库。仓库 docs/examples/openzeppelin/README.md 给出了标准流程前置条件Node.js 20Hardhat^2.24可访问 FHEVM 网络并配置好 Zama gateway/relayer机密计算与解密均依赖该基础设施。工程初始化步骤# 1. 克隆 FHEVM Hardhat 模板仓库并进入目录 git clone https://github.com/zama-ai/fhevm-hardhat-template conf-token cd conf-token # 2. 安装项目依赖 npm ci # 3. 安装 OpenZeppelin 机密合约库 npm i openzeppelin/confidential-contracts # 4. 编译合约 npm run compile # 5. 运行测试套件 npm test说明openzeppelin/confidential-contracts提供了ERC7984、ERC7984ERC20Wrapper等机密合约原语FHE 底层能力则来自 ZAMA 的fhevm/solidity包即本仓库 library-solidity 目录的发布形态包含 lib/FHE.sol 与 config/ZamaConfig.sol。三、封装合约ERC7984ERC20WrapperExample.sol原文档给出的封装合约非常精简完整代码见 ERC7984ERC20WrapperMock.md// SPDX-License-Identifier: BSD-3-Clause-Clear pragma solidity ^0.8.27; import {ZamaEthereumConfig} from fhevm/solidity/config/ZamaConfig.sol; import {IERC20} from openzeppelin/contracts/interfaces/IERC20.sol; import {ERC7984ERC20Wrapper, ERC7984} from openzeppelin/confidential-contracts/token/ERC7984/extensions/ERC7984ERC20Wrapper.sol; contract ERC7984ERC20WrapperExample is ERC7984ERC20Wrapper, ZamaEthereumConfig { constructor( IERC20 token, string memory name, string memory symbol, string memory uri ) ERC7984ERC20Wrapper(token) ERC7984(name, symbol, uri) {} }继承体系逐层拆解ERC7984ERC20Wrapper封装逻辑本体。构造函数接收被包装的IERC20 token并在内部持有underlying()引用前文所述的safeTransferFrom转入与机密_mint铸造流程都在其中实现ERC7984机密代币基类接收name、symbol、uri合约元数据 URI三个参数提供confidentialBalanceOf、confidentialTransfer等机密操作ZamaEthereumConfigZama 的 FHE 网络配置。从仓库源码 library-solidity/config/ZamaConfig.sol 可以看到getCoprocessorConfig()按block.chainid路由到不同网络的协处理器配置Ethereum 主网chainId1、Polygon137、Sepolia11155111、Polygon Amoy80002以及本地 Hardhat/Anvil31337在不支持的链上会revert ZamaProtocolUnsupported()。其中ZamaEthereumConfig特指 Ethereum 主网 / Sepolia / 本地开发网络这一组见 ZamaConfig.sol。构造参数速查表参数类型含义示例值tokenIERC20被封装的基础 ERC-20 代币地址await erc20.getAddress()namestring机密代币名称Confidential Tokensymbolstring机密代币符号cTKNuristring合约元数据 URIhttps://example.com/wrapped四、目录放置规范重要原文档特别强调必须把.sol文件放到your-project-root-dir/contracts/.ts测试文件放到your-project-root-dir/test/。这样 Hardhat 才能按默认约定完成编译与测试。your-project-root-dir/ ├── contracts/ │ └── ERC7984ERC20WrapperExample.sol # 合约 └── test/ └── ERC7984Wrapper.test.ts # 测试五、测试用例ERC7984Wrapper.test.ts原文档提供的测试验证了封装的初始化正确性——名称、符号以及底层代币引用import { expect } from chai; import { ethers, fhevm } from hardhat; describe(ERC7984ERC20WrapperExample, function () { let wrapper: any; let erc20: any; let owner: any; let user: any; const WRAP_AMOUNT 1000; beforeEach(async function () { [owner, user] await ethers.getSigners(); // Deploy a mock ERC20 token (OZ ERC20Mock takes name, symbol, decimals) erc20 await ethers.deployContract(ERC20Mock, [Test ERC20, TERC, 18]); // Deploy the wrapper wrapper await ethers.deployContract(ERC7984ERC20WrapperExample, [ await erc20.getAddress(), Confidential Token, cTKN, https://example.com/wrapped ]); }); describe(Initialization, function () { it(should set the correct name, async function () { expect(await wrapper.name()).to.equal(Confidential Token); }); it(should set the correct symbol, async function () { expect(await wrapper.symbol()).to.equal(cTKN); }); it(should reference the correct underlying token, async function () { expect(await wrapper.underlying()).to.equal(await erc20.getAddress()); }); }); });测试要点解读Mock 代币ERC20Mock是 OpenZeppelin 测试工具合约构造参数依次为名称、符号、小数位这里用 18 位与主流 ERC-20 一致部署顺序先部署底层erc20再以其地址部署wrapper这与合约构造函数的依赖关系一一对应断言对象name()、symbol()由 ERC-7984 基类返回机密代币元数据underlying()返回被封装的基础 ERC-20 地址验证“包装引用”是否正确建立测试中声明了WRAP_AMOUNT 1000常量可在此基础上扩展“先 approve、再 wrap、最后断言机密余额”的完整封装用例仓库 swapERC7984ToERC20.md 的测试即对同一wrapper部署流程做了复用。运行测试npx hardhat test test/ERC7984Wrapper.test.ts六、源码级原理封装背后的 FHE 调用链封装之所以能“保证成功”是因为机密铸造发生在 FHE 密文域内不依赖调用者的链上状态。结合仓库 library-solidity/lib/FHE.sol可以还原底层关键函数明转密FHE.asEuint64(uint64)把公开数值转换为euint64密文句柄FHE.sol这是“按 1:1 铸造”时把明文数量带入机密域的基础外部密文接入FHE.fromExternal(externalEuint64, bytes memory inputProof)接收链下 SDK 生成的外部密文句柄与零知识证明并校验FHE.sol封装后的转账/铸造可复用此路径机密授权与公钥解密FHE.allowTransient(euint64, address)与FHE.makePubliclyDecryptable(euint64)FHE.sol用于把密文句柄的查看/解密权限授予合约或公众是实现“持有者查看自己的机密余额”的前提解密验证FHE.checkSignatures校验网关返回的阈值解密签名保证链上接受的明文数值与密文一致——这正是反向赎回示例finalizeSwap中“先机密转账、再解密结算”两步式流程的信任根基见 swapERC7984ToERC20.md。此外ZamaEthereumConfig将 ACL、协处理器、KMSVerifier 等 Zama 协议合约地址注入到CoprocessorConfig中ZamaConfig.sol使上述 FHE 操作在不同网络上都能路由到正确的基础设施。七、实战扩展方向原文档docs/examples/openzeppelin/erc7984.md还提供了若干可直接套用的扩展模式可见铸造mint(address to, uint64 amount) external onlyOwner配合FHE.asEuint64(amount)适合代币经济模型中需要透明的场景机密铸造/销毁confidentialMint/confidentialBurn接收externalEuint64inputProof由 SDK 离线加密后上链实现全程隐私总量可见性重写_update在每次状态更新后用FHE.allow(confidentialTotalSupply(), owner())向 owner 授权解密最新总量句柄赎回路径参考 swapERC7984ToERC20.md 的swapConfidentialToERC20finalizeSwap两步式设计实现从机密代币回到 ERC-20 的闭环。封装与赎回组合起来便构成了一条完整的“公开资产 ↔ 机密资产”双向通道这是构建隐私 DeFi、机密支付与合规化数字资产场景的常见基础组件。【免费下载链接】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

延伸阅读

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