目录
引言
随着隐私计算在链上应用的兴起,Zama 的 FHEVM 提供了一种原生支持同态加密的 Solidity 编程方式。但与传统 ERC20/ERC721 的开发和测试逻辑不同,FHEVM 下的 confidential token 涉及加密输入、密文余额、proof 验证、coprocessor 初始化等额外步骤,容易让初学者在测试时踩坑。本文通过对比普通代币与 FHE 代币的测试脚本,并列出常见报错与解决方法,帮助开发者快速入门 Zama 开发、少走弯路。
一、普通 ERC20/ERC721 测试脚本
直接传数字
:mint(alice, 1000)
直接查余额
:balanceOf(alice) 得到 1000
断言
:expect(balance).to.equal(1000)
不需要加密/解密
不需要 proof/handle
不需要特殊初始化
二、Zama FHEVM(confidential token)测试脚本
不能直接传数字,要先“加密”:
查余额拿到的是密文,要“解密”才能断言:
const encryptedAmount = await fhevm
.createEncryptedInput(contractAddress, owner.address)
.add64(clearAmount)
.encrypt();
const encryptedBalance = await contract.confidentialBalanceOf(alice.address);
// 解密成明文
const clearBalance = await fhevm.userDecryptEuint(FhevmType.euint64, ethersjs.hexlify(encryptedBalance), contractAddress, alice);
expect(clearBalance).to.equal(1000);
每次操作都要加密输入、解密输出
需要 proof/handle 作为加密凭证
需要初始化 FHEVM 环境(本地测试时)
三、ZAMA DEX 报错
1、FHE Proof 校验失败 / fromExternal Revert
问题描述
: 合约在调用 fromExternal 方法时发生 revert,通常是由于生成 proof 的用户地址、合约地址与实际调用时不一致,或 FHEVM 预编译未初始化导致的。
解决方案
:
继承 SepoliaConfig: 确保合约继承自 @fhevm/solidity/config/ZamaConfig.sol 中的 SepoliaConfig,以自动初始化 FHEVM coprocessor 和解密 oracle。
import { SepoliaConfig } from "@fhevm/solidity/config/ZamaConfig.sol";
contract MyERC20 is SepoliaConfig {
// 合约代码
}
无需手动初始化 coprocessor,适用于在 Sepolia 测试网或本地 Hardhat 网络上进行开发和测试。
2、权限校验失败(onlyOwner)
问题描述
: 在调用 mint 方法时,由于合约的 owner 是部署者(deployer),而调用者是 Alice,导致权限校验失败。
解决方案
:
统一生成 Proof 和调用: 由合约的 owner(部署者)生成 proof 并调用 mint 方法,将代币铸造给 Alice。
const encryptedAmount = await fhevm
.createEncryptedInput(contractAddress, deployer.address)
.add64(amount)
.encrypt();
const tx = await contract
.connect(deployer)
.mint(alice.address, encryptedAmount.handles[0], encryptedAmount.inputProof);
await tx.wait();
3、 本地 Mock/FHEVM 路径和初始化问题
问题描述
:
在本地测试时,FHEVM 预编译未初始化,或导入路径错误,导致 FHE 相关方法无法正常工作。
解决方案
:
使用官方库路径:确保在合约中使用官方库路径,如 @fhevm/solidity/lib/FHE.sol,而非 mock 路径。
import { FHE, euint32, externalEuint32 } from "@fhevm/solidity/lib/FHE.sol";
总结
Zama 的 FHEVM 带来了全新的链上隐私资产形态,但也引入了对测试环境配置、加密流程和调用逻辑的更高要求。开发者在进行本地测试或部署合约时,需要特别注意 proof 的生成方、调用方一致性、FHEVM 环境初始化,以及使用官方推荐路径进行合约导入。熟练掌握这些规则,才能更稳定、高效地构建安全的隐私 DApp 与 Token 系统。