FHEVM Hardhat 3 插件
Hardhat 3 用于开发和测试 FHEVM 合同的插件.
文件和资源:
- 建立哈达特
- FHEVM 实例
- Hardhat 3 实例项目: 不是一个随时可用的模板,而是一个工作项目文件夹,您可以用作自己设置的模型
同行依赖关系列表
此 Hardhat 插件依赖于以下对等依赖来正确运行 .
@fhevm/sdkhardhatviem
如果您的软件包管理器没有自动安装端点依赖性( pnpm 或 npm < 7) , 请将它们添加到您的软件包中 手动.
安装
npm install --save-dev @fhevm/hardhat-plugin-v3
将插件注册到您的 hardhat.config.ts数字 :
import fhevmPlugin from '@fhevm/hardhat-plugin-v3';
import { defineConfig } from 'hardhat/config';
export default defineConfig({
plugins: [fhevmPlugin],
});
QQ快起步:有FHEVM的"你好世界"
最小工程:一个存储两个加密值,添加这些值的合同,以及解密总和的测试.
1. 安装
npm install --save-dev hardhat @nomicfoundation/hardhat-toolbox-mocha-ethers @fhevm/hardhat-plugin-v3 @fhevm/sdk viem
npm install @fhevm/solidity
2. 创建 contracts/APlusB.sol
// SPDX-License-Identifier: BSD-3-Clause-Clear
pragma solidity ^0.8.24;
import { FHE, euint8, externalEuint8 } from "@fhevm/solidity/lib/FHE.sol";
import { ZamaEthereumConfig } from "@fhevm/solidity/config/ZamaConfig.sol";
contract APlusB is ZamaEthereumConfig {
euint8 private _a;
euint8 private _b;
euint8 private _aplusb;
function setA(externalEuint8 inputA, bytes calldata inputProof) external {
_a = FHE.fromExternal(inputA, inputProof);
FHE.allowThis(_a);
}
function setB(externalEuint8 inputB, bytes calldata inputProof) external {
_b = FHE.fromExternal(inputB, inputProof);
FHE.allowThis(_b);
}
function computeAPlusB() external {
_aplusb = FHE.add(_a, _b);
FHE.allowThis(_aplusb);
FHE.allow(_aplusb, msg.sender);
}
function aplusb() public view returns (euint8) {
return _aplusb;
}
}
3. 创建 hardhat.config.ts
见 Hardhat 3 配置指南 详细参考.
import fhevmPlugin from '@fhevm/hardhat-plugin-v3';
import hardhatToolboxMochaEthers from '@nomicfoundation/hardhat-toolbox-mocha-ethers';
import { defineConfig } from 'hardhat/config';
export default defineConfig({
plugins: [hardhatToolboxMochaEthers, fhevmPlugin],
solidity: {
version: '0.8.27',
// ⚠️ FHEVM requires at least the "cancun" EVM version
settings: { evmVersion: 'cancun' },
},
});
4. 创建 test/APlusB.ts
在Hardhat 3中,FHEVM API住在网络连接上,而不是在 hre。 。 。 .
import { expect } from 'chai';
import { network } from 'hardhat';
const { ethers, fhevm } = await network.connect();
describe('APlusB', function () {
it('uint8: add 80 to 123 should equal 203', async function () {
const [alice] = await ethers.getSigners();
const contract = await ethers.deployContract('APlusB');
const contractAddress = await contract.getAddress();
// 1. Encrypt and store `a`
const a = await fhevm.helpers.encryptUint8({ value: 80, contractAddress, userAddress: alice.address });
await (await contract.setA(a.externalEuint8, a.inputProof)).wait();
// 2. Encrypt and store `b`
const b = await fhevm.helpers.encryptUint8({ value: 123, contractAddress, userAddress: alice.address });
await (await contract.setB(b.externalEuint8, b.inputProof)).wait();
// 3. Compute the FHE sum on chain
await (await contract.computeAPlusB()).wait();
// 4. Decrypt the result as alice
const clear = await fhevm.helpers.decryptUint8({
euint8: await contract.aplusb(),
contractAddress,
userAddress: alice.address,
});
expect(clear).to.eq(203n);
});
});
5. 运行
npx hardhat test
插件 API 欺骗表
所有帮助者都住在连接处 fhevm 对象 : const { fhevm } = await network.connect();
fhevm.helpers - 加密
每一个都要 { value, contractAddress, userAddress } 返回时 { external<Type>, inputProof }。 。 。 .
| 函数 | value |
|---|---|
encryptBool | boolean |
encryptUint8 | number | bigint |
encryptUint16 | number | bigint |
encryptUint32 | number | bigint |
encryptUint64 | number | bigint |
encryptUint128 | number | bigint |
encryptUint256 | number | bigint |
encryptAddress | string |
fhevm.helpers ——解密(用户解密,需要ACL允许+许可)
每一个都要 { <handle>, contractAddress, userAddress, options? }。 。 。 .
| 函数 | 处理参数 | 回返 |
|---|---|---|
decryptBool | ebool | boolean |
decryptUint8 | euint8 | number |
decryptUint16 | euint16 | number |
decryptUint32 | euint32 | number |
decryptUint64 | euint64 | bigint |
decryptUint128 | euint128 | bigint |
decryptUint256 | euint256 | bigint |
decryptAddress | eaddress | `0x${string}` |
fhevm.helpers ——公开解密(要求) FHE.makePubliclyDecryptable(中文(简体) )
每一个都要 { <handle> } 只有这个.
| 函数 | 处理参数 | 回返 |
|---|---|---|
decryptPublicBool | ebool | boolean |
decryptPublicUint8 | euint8 | number |
decryptPublicUint16 | euint16 | number |
decryptPublicUint32 | euint32 | number |
decryptPublicUint64 | euint64 | bigint |
decryptPublicUint128 | euint128 | bigint |
decryptPublicUint256 | euint256 | bigint |
decryptPublicAddress | eaddress | `0x${string}` |
每个 decryptPublic* 有一个 decryptPublic*WithSignatures 双胞胎返回 { clearValue, checkSignaturesArgs },用于
测试链上签名验证.
fhevm.cleartextDb ——直接读取清晰文本(仅测试,绕行ACL)
每一个都要 { <handle> } 即使没有人能看到价值 也只能回答.
| 函数 | 处理参数 | 回返 |
|---|---|---|
readBool | ebool | boolean |
readUint8 | euint8 | number |
readUint16 | euint16 | number |
readUint32 | euint32 | number |
readUint64 | euint64 | bigint |
readUint128 | euint128 | bigint |
readUint256 | euint256 | bigint |
readAddress | eaddress | `0x${string}` |
fhevm.client - 生下来的 @fhevm/sdk 客户端
以上帮手为便利包装. 当你需要的东西 他们不覆盖 - 或者当你想要测试
@fhevm/sdk API本身——达到 fhevm.client,基础 FhevmClient 从 @fhevm/sdk,并称其行动
直接说.
const { fhevm } = await network.connect();
const { encryptedValues, inputProof } = await fhevm.client.encryptValues({
values: [{ type: 'euint8', value: 80 }],
contractAddress,
userAddress,
});
FHEVM 文件和实例
欲了解更多FHEVM实例和详细文件,请前往 这里