2022 年 11 月 16 日
迈克尔·朱
编者按:这篇文章是我们正在进行的关于 web3 万物拍卖系列的一部分。 部分1 概述了拍卖设计,以及在无需许可的区块链环境中特定于机制设计的技术挑战(和机遇)。 部分2 是一篇关于清理市场和避免天然气战争的文章。 部分3 分享了规范拍卖类型的概述、理论如何转化为实践以及我们首次实施新颖的密封投标 Vickrey 拍卖。
链上拍卖是 web3 中最有趣(且无处不在)的设计空间之一——从 NFT 销售到抵押品拍卖——带来了实施和研究的新格局。 虽然拍卖机制设计已经存在了几个世纪,并且在最近几十年随着网络和电子商务的出现而发展,但我们现在才将这些方法应用于智能合约。
我们也开始看到更多区块链原生的拍卖设计,包括 我们的 开放源码 Vickrey 拍卖的 Solidity 实施,以及来自社区的几个有趣的发展(包括 建议 为了提高效率,新 理论成果和两个 黑客马拉松获奖者 实现 密封投标拍卖)。 在我们的第一个设计中,我们在隐私和资本效率之间做出了权衡:我们使用超额抵押(投标人锁定比他们的投标所需的更多的抵押品)来强制中标者付款,而不通过抵押品透露准确的投标价值数量。 通过锁定更多资本,您可以以更大的机会成本获得更多隐私。 但是,如果我们可以拥有出价隐私呢? 也完全不需要 超额抵押?
这篇文章介绍了一种新的拍卖设计,我们称之为“SneakyAuction”,它结合了 CREATE2
操作码和状态证明,以保证投标隐私,而无需投标人锁定比要求更多的抵押品。 我们首先分解它的工作原理,然后将其与我们之前的实现 (OverCollateralizedAuction) 在 gas 成本、用户体验和隐私方面进行比较。 我们还将实现添加到我们的 拍卖动物园 GitHub 上的存储库,以便您可以分叉它,在它的基础上构建,并在我们深入研究更多机制时跟随它; 同时,更多关于它的工作原理以及与我们过去设计的比较如下。
运作方式: 使用 CREATE2 承诺投标
我们需要满足两个要求才能在链上创建“最终公开”的密封投标拍卖。 首先,投标需要在投标期间保密,然后在投标结束时公开; 提交-显示方案(用户发布哈希提交值,然后稍后显示他们的输入)可以在链上复制这种机制。 第二个要求是抵押:投标必须有抵押品支持,以确保获胜者有足够的资金来履行他们的承诺。
在我们的超额抵押 Vickrey 实施中,潜在买家通过调用 commitBid
功能,提供哈希承诺和要托管的抵押品。 这种方法满足要求,但有一些缺点。 即使出价本身被哈希隐藏, commitBid
交易公开并立即表明用户的意图:“我想参加这次拍卖,这是我的出价的抵押品。” 如果没有超额抵押,两者的可见性(和可链接性) 意图 和 抵押 会显示出价。 但是,如果我们能够混淆交易的意图,我们或许能够在不依赖超额抵押的情况下实现投标隐私。
CREATE2
操作码,在介绍 EIP-1014 并包含在君士坦丁堡硬分叉中,为我们提供了一种方法来做到这一点。 这 CREATE
和 CREATE2
操作码都用于部署智能合约,但它们在部署地址的计算方式上有所不同。 这 CREATE
部署地址被计算为部署者地址和随机数的哈希值; 这 CREATE2
另一方面,部署地址被计算为合约字节码和构造函数参数、任意盐和部署者地址的哈希值(详情).
CREATE2
通常在工厂模式中用于将合约部署到可预测的地址——例如, UniswapV3Pool部署器 合同用途 CREATE2
将每个矿池合约部署到一个地址,该地址是代币对和费用层的函数。 CREATE2
也可用于(重新)部署可升级的智能合约,尤其是在 变质 合同模式。
对我们来说更重要的是, CREATE2
部署地址可以作为对输入字节码和参数定义的任何行为的哈希承诺。 如果构造函数参数对出价进行编码,则 CREATE2
地址可以作为投标承诺。
此外,合约本身可以充当保险库——投标人可以将 ETH 发送到 CREATE2
金库地址 在部署合约之前 在一次简单的转账中抵押并承诺他们的出价! 由于投标人没有金库地址的私钥,抵押品在出价显示之前被锁定,此时 SneakyAuction 合约部署并解锁金库。
这种方法使得交易与转移到外部拥有地址 (EOA) 无法区分。 出价交易与区块链上的其他转账一样隐藏在众目睽睽之下。 然而,一个重要的警告是:这个看似整洁的解决方案也使得难以确定 ,尤其是 抵押品被锁定。 在公开任何出价之前为金库提供资金对于拍卖安全至关重要。 否则,投机取巧的买家可能会等到公布期结束时(此时大多数出价已经公布)来决定是否抵押他们的金库。 我们需要确保金库被抵押 投标期间, 不是在揭露期间,使用另一种工具:状态证明。
使用状态证明追溯验证抵押品
确保金库在投标期间被抵押的一种方法是检查其在过去区块的余额。 通过查询存档节点在链下完成此操作相对容易; 但在链上(无需信任)更难完成。 EVM的 BALANCE
操作码读取地址的当前余额,但不存在这样的操作码来检索 过去 平衡。 事实上,唯一提供任何类型的历史状态访问的 EVM 操作码是 BLOCKHASH
,它返回最后 256 个块之一的哈希值。 幸运的是——在一些链下帮助下——blockhash 对我们的用例来说已经足够好了。
blockhash 是块头的哈希值,其中包括(在其他元数据中) 状态根 那个街区。 状态根是a的根节点 默克尔-帕特里夏树,其中每个叶节点对应于一个特定的地址并包含地址' 平衡 在那个街区。 我们不能在链上直接访问这些叶子节点,但是我们可以验证一个叶子节点的内容是否正确。 事实上, eth_getProof
支持的RPC方法 炼金术 (在其他提供者中)返回执行此验证所需的 Merkle 证明(Leo Zhang 提供了一个 深入解释 这在以太坊轻客户端环境中是如何工作的)。 这意味着通过一点链下帮助(一次 RPC 调用),投标人可以向 SneakyAuction 合约证明他们的金库在投标期间已被抵押。
在我们的实施中, 第一次出价 公开拍卖存储前一个区块的区块哈希。 该交易有效地将拍卖从投标阶段过渡到展示阶段——所有 随后的出价 revealed 必须提供 Merkle 证明,证明他们的金库在该区块之前(即在首次出价被披露之前)已得到充分抵押。 请注意, 第一 revealBid
理想情况下,交易将通过私人交易池(例如 Flashbots)提交; 否则,观察内存池(查看显示的出价的价值)的投标人可以抢先交易并进行最后一秒的出价。
LibBalanceProof
为了最大限度地降低投标人的成本,我们写了一个 gas-optimized 图书馆 验证建立在链上的余额证明 合同的 由 Aragon 团队(他们在 2018 年开创了链上存储证明)编写,以及 Hamdi Allam 的链上合约 RLP解码. 我们的库使用了许多依赖于状态 trie 的特定结构的低级技巧和优化,因此它不能用于通用的 Merkle-Patricia trie 证明。 作为回报,它允许 SneakyAuction 合约以少于 30,000 gas 验证保险库过去的余额。
我们还写了一个轻量级的 JavaScript 包装器 等加工。为 eth_getProof
远程过程调用方法。 给定一个地址和块号,它返回余额证明和 RLP 序列化块头,可用于显示出价。
它如何比较
让我们将我们新的 SneakyAuction 方法与我们上次发布的 OverCollateralizedAuction 设计进行比较,以及技术设计师或用户关心的几个关键维度:gas 成本、用户体验和隐私。
煤气费
SneakyAuction 的 revealBid
, endAuction
及 withdrawCollateral
功能需要部署 SneakyVault
,因此它们比 OverCollateralizedAuction 对应物更昂贵。 revealBid
特别昂贵,因为它还验证了一个余额证明,大约需要 25,000 gas。
基于 Foundry 单元测试的不同操作的近似 gas 成本
用户体验
尽管这两个实现遵循相似的整体流程(出价阶段、展示阶段、拍卖结束),但在用户体验上存在一些差异。 SneakyAuction 有一些小缺点:
- 将 ETH 发送到未部署的金库的体验,虽然它可以被前端抽象掉,但对于在区块浏览器上检查其出价交易的用户来说,可能会造成混淆。
- 使用 OverCollateralizedAuction,如果所有出价都已显示,则可以提前结束拍卖。 这在 SneakyAuction 中是不可能的,因为合约无法知道已经提交了多少次出价。
- 投标人可以更新他们的出价并通过调用 OverCollateralizedAuction 充值他们的抵押品
commitBid
再次。 在 SneakyAuction 中,一旦投标的金库被抵押,投标人就无法进行更新。
隐私政策
OverCollateralizedAuction 的投标隐私依赖于投标人选择锁定额外的抵押品(因此旁观者知道投标的上限但不知道确切的金额)。 另一方面,SneakyAuction, 从与拍卖本身完全无关的链上活动中获得隐私:在拍卖投标期间发生的 ETH 转账。
为简单起见,我们假设每个出价都使用单次 ETH 转账进行抵押。 我们观察到:
- 抵押交易应该是任何人第一次与链上的金库地址进行交互。
- 我们不希望任何其他交易在剩余的投标期内触及金库地址。
- 没有交易可以源自保险库地址(因为没有人拥有私钥)。
在投标期间向其他“未触及”地址的 ETH 转移似乎是投标——换句话说,它们是隐藏投标交易的“噪音”。 为了帮助量化 SneakyAuction 的隐私,我们可以查看此噪声分布的形状。
该直方图显示了年初至今每日 ETH 转移(在以太坊主网上)到未触及地址的分布,说明了 24 小时竞价期的噪声分布。 我们可以看到大多数交易都落在 [0.001, 1] ETH 范围内,这意味着预期出价在该范围内的拍卖将具有最强的隐私性。 另一方面,典型的噪音可能无法为预期出价大于 10 ETH 的拍卖提供足够的隐私——在该范围内很少有超过 100 笔交易,因此吸引许多出价的拍卖会在分布中产生明显的峰值.
从该数据的另一个角度来看,这些散点图描绘了 15 年 2022 月 XNUMX 日的转移,并叠加了两个假设拍卖的出价:
直觉上,观察者更容易识别第二次拍卖的出价。 实际上,您可以使用聚类算法,例如 期望最大化 (EM) 算法来预测哪些交易是出价。
但是,还有一些其他因素可以使 SneakyAuction 在实践中更加私密(因此更具吸引力):
- 更长的投标期:隐私随着投标期的长度而增加——投标期越长,隐藏投标的转移就越多。
- 并发拍卖:隐私与并发拍卖的数量成比例——如果两个拍卖同时处于投标阶段,则一个拍卖的出价会成为另一个拍卖的噪音。
SneakyAuction 也可以从超额抵押中获益——因为 SneakyVault 将任何多余的 ETH 返还给投标人,投标人可以选择超额抵押以获得更多隐私。 因此,从某种意义上说,SneakyAuction 提供了比我们之前的实现更严格的隐私保护。
SneakyAuction 隐私机制的一个简单推论是它隐藏了 数 投标期间的投标。 这是优于仅隐藏出价的 OverCollateralizedAuction 的优势——为给定拍卖做出的出价承诺的数量是完全公开的(并且可能泄露拍卖的竞争力)。
***
虽然我们的第一个密封投标拍卖将现实世界的特征转化为链上设计决策,但我们的第二个设计依赖于一种新颖实用的机制来利用区块链的公共性质:密封投标“隐藏”在不相关的区块链活动。
尽管这种新方法是一种无需过度抵押即可实现投标隐私的便捷方式,但它不一定适用于所有拍卖(例如具有许多高价值投标的拍卖)。 对于预期出价较低(尤其是在较长时间段内)的拍卖,隐私得到改善。
***
此处表达的观点是引用的个人 AH Capital Management, LLC (“a16z”) 人员的观点,而不是 a16z 或其关联公司的观点。 此处包含的某些信息是从第三方来源获得的,包括来自 a16z 管理的基金的投资组合公司。 虽然取自被认为可靠的来源,但 a16z 并未独立验证此类信息,也不就该信息的当前或持久准确性或其在特定情况下的适用性做出任何陈述。 此外,该内容可能包含第三方广告; a16z 未审查此类广告,也不认可其中包含的任何广告内容。
此内容仅供参考,不应被视为法律、商业、投资或税务建议。 您应该就这些事项咨询您自己的顾问。 对任何证券或数字资产的引用仅用于说明目的,并不构成投资建议或提供投资咨询服务的要约。 此外,本内容并非针对也不打算供任何投资者或潜在投资者使用,并且在任何情况下都不得在决定投资于 a16z 管理的任何基金时作为依据。 (投资 a16z 基金的要约仅通过私募备忘录、认购协议和任何此类基金的其他相关文件提出,并应完整阅读。)任何提及、提及或提及的投资或投资组合公司所描述的并不代表对 a16z 管理的车辆的所有投资,并且不能保证这些投资将是有利可图的,或者将来进行的其他投资将具有类似的特征或结果。 由 Andreessen Horowitz 管理的基金进行的投资清单(不包括发行人未允许 a16z 公开披露的投资以及对公开交易的数字资产的未宣布投资)可在 https://a16z.com/investments 获得/。
其中提供的图表仅供参考,在做出任何投资决定时不应依赖。 过去的表现并不预示未来的结果。 内容仅在所示日期生效。 这些材料中表达的任何预测、估计、预测、目标、前景和/或意见如有更改,恕不另行通知,并且可能与他人表达的意见不同或相反。 有关其他重要信息,请参阅 https://a16z.com/disclosures