本文介绍了Zama团队的fhEVM在token销售拍卖中的应用,重点介绍了社区成员Palra利用同态加密技术构建的链上保密单价拍卖系统,该系统允许参与者进行保密的竞标,同时确定统一的结算价格。文章还深入探讨了该方案中Fenwick树数据结构的使用,以及如何在保密性和可扩展性之间找到平衡。
/
2025 年 3 月 18 日
-
Zama 团队
Zama 的 fhEVM 的可编程隐私功能对于金融和代币应用尤其有用,例如代币销售拍卖,其中参与者的决策会受到其他人的影响。保密拍卖是 Zama 的赏金计划第 7 季 的重点。
本季的赏金挑战开发者构建一个 Solidity 智能合约系统,用于启动单一价格拍卖 (SPA),采用密封投标,拍卖一定数量的可替换资产。
我们收到了许多高质量的提交,选择获胜者并不容易。但经过仔细评估,有三个项目脱颖而出:
这篇文章重点介绍了社区成员 Palra 的获奖作品,该作品在保密性和可扩展性之间找到了平衡。
该赏金挑战开发者构建一个单一价格拍卖,采用密封投标,拍卖一定数量的可替换资产。参与者进行保密投标,指定他们想要购买的代币数量和他们愿意支付的价格。
结算价格由售出的最后一个代币决定——它是中标中的最低价格。中标者是在可用代币限制内出价最高的人,所有中标均以相同的价格结算。
例如,假设有 10 个资产要出售,有 4 个投标人:
结算价格为 42 USDC。投标人 A 获得 4 个代币,而投标人 C 获得 6 个代币(在要求的 8 个代币中)。两者都为每个代币支付 42 USDC。拍卖组织者收取 420 USDC (10 * 42)。
如果拍卖没有售罄,开发者必须定义一种解决方案机制,例如退款或以最低价格执行。除了处理边缘情况外,主要的技术挑战是计算结算价格。在 Solidity 中使用 TFHE 对保密投标进行排序和分类在计算上非常昂贵,并且受到 gas 限制(即区块大小限制)的约束。
大多数提交都优先考虑保密性,但这通常以大型拍卖的可扩展性为代价。 Palra 的获奖作品在两者之间取得了有趣的平衡。
获奖作品引入了两个关键的设计选择:(1)使用专用数据结构来存储投标,以及(2)选择部分隐藏——加密数量,同时保持价格可见。
该提交使用 Fenwick 树,这是一种非常适合 EVM 的数据结构。它支持三个关键操作——询问、更新和搜索——每个操作的复杂度为 O(log n),其中 n 是投标人的数量。这使其在拍卖中效率高,同时避免了成本高昂的初始化。该实现利用了其中的两个操作:
function update(Storage storage _this, uint16 atKey, euint128 quantity) internal {
if (atKey == 0) revert FT_InvalidPriceRange();
_this.largestIndex = TFHE.select(
TFHE.eq(quantity, 0),
_this.largestIndex,
TFHE.select(TFHE.gt(atKey, _this.largestIndex), TFHE.asEuint16(atKey), _this.largestIndex)
);
TFHE.allowThis(_this.largestIndex);
uint16 index = atKey;
while (index >= atKey) {
_this.tree[index] = TFHE.add(_this.tree[index], quantity);
TFHE.allowThis(_this.tree[index]);
unchecked {
index += lsb(index);
}
}
_this.tree[0] = TFHE.add(_this.tree[0], quantity);
TFHE.allowThis(_this.tree[0]);
}
要更深入地了解此功能的工作原理,请查看我们的文档。
在计算结算价格时,如果在树中找不到拍卖的总代币,系统将默认为最低注册价格。每次添加投标时,还会将最低投标价格与 Fenwick 树分开跟踪。
获奖作品引入了一个自定义 Solidity 库,HalfEncryptedFenwickTree。这种数据结构通过避免在结算拍卖时进行完全排序来提高可扩展性。值得注意的是,该库用途广泛,可以重新用于其他用例。
该提交还包含了 Zama 的 fhevm-contracts 存储库中的关键构建块,包括:
拍卖创建和初始化
首先,拍卖所有者部署一个包含以下参数的合约:
constructor(
address _auctioneer,
IConfidentialERC20 _auctionToken,
uint64 _auctionTokenSupply,
IConfidentialERC20 _baseToken,
uint256 _auctionEnd,
uint64 _minPrice,
uint64 _maxPrice
) Ownable(_auctioneer) EncryptedErrors(uint8(type(ErrorCodes).max))
创建拍卖后,所有者(组织者)必须存入拍卖的代币。这会触发一个对网关的请求,网关会验证存入的金额是否足以开始拍卖。
积极的投标阶段。
用户通过指定价格(以明文形式)和数量(加密形式)来提交投标。由于价格保持公开,因此确保拍卖保密性需要提交多个投标,包括 0 值投标——加密数量为 0 的投标。
function bid(
uint64 _price,
einput _encryptedQuantity,
bytes calldata _inputProof
) external onlyState(AuctionState.Active) nonReentrant {
例如,投标人 A 可能会以 10 USDC、50 USDC、100 USDC 和 1000 USDC 提交投标,所有投标都包含加密的数量。只有 100 USDC 的投标才会有非零数量。观察者会看到可能的价格,但不知道哪个投标是真实的。
该合约还包括错误处理,并在记录加密金额之前验证投标数量是否已正确转移。
拍卖结算。
拍卖结算阶段确定结算价格。
虽然将值插入 HalfEncryptedFenwickTree 不需要解密,但结算是一个迭代过程,涉及索引加密数量。在树上执行二进制搜索,根据加密值向左或向右分支。
结算依赖于异步解密方案,该方案的工作方式如下:
function stepWithdrawalDecryption()
external
onlyState(AuctionState.WithdrawalPending)
checkTimeLockTag(TL_TAG_COMPUTE_SETTLEMENT_STEP)
{
uint256[] memory cts = new uint256[](1);
bytes4 selector;
if (TFHE.isInitialized(_searchIterator.foundIdx)) {
cts[0] = Gateway.toUint256(_searchIterator.foundIdx);
selector = this.callbackWithdrawalDecryptionFinal.selector;
} else {
cts[0] = Gateway.toUint256(_searchIterator.idx);
selector = this.callbackWithdrawalDecryptionStep.selector;
}
Gateway.requestDecryption(cts, selector, 0, block.timestamp + CALLBACK_MAX_DURATION, false);
_startTimeLockForDuration(TL_TAG_COMPUTE_SETTLEMENT_STEP, CALLBACK_MAX_DURATION);
}
声明阶段
声明过程是拍卖的最后阶段。
虽然未经审计,但此实现为 EVM 约束内的密封拍卖提供了一种有希望的方法,利用 Zama 的 fhEVM 实现保密性。你可以在以下位置查看本季获奖赏金的完整实现:GitHub – palra/zama-bounty-confidential-auction。如果你希望了解代码的架构设计,请查看用户指南文档。请记住,智能合约存在风险,并且此提交是外部贡献者的概念验证。
未找到项目。
Concrete ↗ Concrete ML ↗ FHEVM ↗ TFHE-rs ↗
博客 文档 ↗ GITHUB ↗ FHE 资源 ↗ 研究论文 ↗ 赏金计划 ↗ FHE 状态操作系统
与专家交谈 联系我们 X Discord Telegram 所有社区频道
在电子时代,隐私对于一个开放的社会是必要的。隐私不是秘密。私事是不想让全世界知道的事,但秘密是不想让任何人知道的事。隐私是选择性地向世界展示自己的力量。如果双方有某种交易,那么双方都会记住他们的互动。每一方都可以谈论他们自己对这件事的记忆;谁能阻止它呢?可以对此立法,但言论自由,甚至比隐私更重要,是一个开放社会的基础;我们不寻求限制任何言论。如果许多人在同一个论坛上一起发言,每个人都可以向所有其他人发言,并将有关个人和其他各方的知识汇总在一起。电子通信的力量使这种群体言论成为可能,并且它不会仅仅因为我们可能想要它消失而消失。既然我们渴望隐私,我们必须确保交易的每一方只了解该交易直接需要的知识。既然任何信息都可以被谈论,我们必须确保我们尽可能少地透露。在大多数情况下,个人身份并不重要。当我在商店购买杂志并将现金交给店员时,没有必要知道我是谁。当我要求我的电子邮件提供商发送和接收消息时,我的提供商不需要知道我在与谁交谈或我说什么或其他人对我说什么;我的提供商只需要知道如何将消息发送到那里以及我欠他们多少费用。当我的身份被交易的底层机制揭示时,我就没有隐私。我不能在这里选择性地展示自己;我必须始终展示自己。因此,开放社会中的隐私需要匿名交易系统。到目前为止,现金一直是主要的此类系统。匿名交易系统不是秘密交易系统。匿名系统使个人能够在需要时并且仅在需要时才公开自己的身份;这是隐私的本质。开放社会中的隐私也需要密码学。如果我说了一些话,我希望只有我打算让他们听到的人才能听到。如果我的讲话内容对全世界开放,我就没有隐私。加密是为了表明对隐私的渴望,而使用弱密码加密是为了表明对隐私的渴望不太强烈。此外,在默认是匿名的情况下,有保证地揭示自己的身份需要密码签名。我们不能指望政府、公司或其他大型、无脸的组织出于他们的恩惠而给予我们隐私。对他们来说,谈论我们是有利的,我们应该期望他们会谈论。试图阻止他们的言论是与信息的现实作斗争。信息不仅仅是想自由,它渴望自由。信息扩展到填充可用的存储空间。信息是谣言的弟弟,更强大;信息脚步更快,眼睛更多,知道更多,但比谣言理解得更少。如果我们希望拥有任何隐私,我们必须捍卫自己的隐私。我们必须齐心协力,创建允许匿名交易发生的系统。几个世纪以来,人们一直在通过窃窃私语、黑暗、信封、紧闭的门、秘密握手和信使来捍卫自己的隐私。过去的技术不允许强大的隐私,但电子技术允许。我们这些密码朋克致力于构建匿名系统。我们正在使用密码学、匿名邮件转发系统、数字签名和电子货币来捍卫我们的隐私。密码朋克编写代码。我们知道必须有人编写软件来捍卫隐私,而且因为除非我们都这样做,否则我们无法获得隐私,所以我们将编写它。我们发布我们的代码,以便我们的密码朋克同伴可以练习和使用它。我们的代码可供全世界所有人免费使用。我们不太关心你是否不批准我们编写的软件。我们知道软件无法被销毁,并且广泛分散的系统无法被关闭。密码朋克谴责对密码学的监管,因为加密从根本上来说是一种私人的行为。事实上,加密行为将信息从公共领域中移除。即使是反对密码学的法律也只能达到一个国家的边界和暴力的手臂。密码学将不可避免地传播到整个地球,以及它使之成为可能的匿名交易系统。为了使隐私得到广泛传播,它必须成为社会契约的一部分。人们必须走到一起并部署这些系统以造福人类。隐私的范围仅限于一个人在社会中的同伴的合作。我们这些密码朋克寻求你的问题和你的担忧,并希望我们能够吸引你,以便我们不会欺骗自己。但是,我们不会因为有人可能不同意我们的目标而改变我们的方向。密码朋克正在积极参与使网络更安全以保护隐私。让我们一起加快速度。前进。埃里克·休斯著。1993 年 3 月 9 日。
- 原文链接: zama.ai/post/onchain-con...
- 登链社区 AI 助手,为大家转译优秀英文文章,如有翻译不通的地方,还请包涵~
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!