本文作者:Michael Zhu 编译:Cointime Candice
编者按:这篇文章是我们正在进行的Web3拍卖系列的一部分。 第一部分是关于设计链上拍卖的具体技术挑战(和机会)的概述。第二部分是关于清理市场和避免gas战争的文章。第三部分和第四部分通过介绍两种密封竞价拍卖的实施方式来探讨拍卖理论如何转化为实践。
在这个系列的过程中,为了弥合拍卖理论和可以在链上建立的东西之间的差距,我们已经探索了不同的策略,每一个都有其独特的细微差别。特别是,我们专注于密封竞价的实施方式、二次价格(Vickrey)拍卖,这在艺术品、木材和广告空间的销售中已经使用了几十年。但由于实施私人出价有难度,我们很少看到它们使用智能合约以无信任的方式完成。公共区块链的透明性可以防止不诚实的中介机构审查出价或操纵拍卖结果;但他们必须找到保护用户隐私的新解决方案,这也给开发者带来了挑战。
在我们之前的拍卖实施中,我们使用了两种方法来保持链上出价的隐私:第一种方法(OverCollaterifiedAuction)是牺牲资本效率为代价保护隐私,通过过度抵押来隐藏投标价值(即竞标者锁定的抵押品超过出价要求)。这导致我们的第二个设计(SneakyAuction),它使用CREATE2操作码来掩盖区块链上其他转让的投标。但实证分析表明,这种方法不能有效地隐藏偏离以太坊上通常交易金额的非常大的出价。
在这篇文章中,我们回到了一个新颖的跨链方法(称为AztecConnectAuction),它可以为任何规模的出价提供隐私,而不需要额外的抵押品。依靠多个区块链实现了任何单个区块链都无法实现的功能,并为开发人员在实现自己的协议时提供了一组不同的好处和权衡因素。在我们的案例中,我们使用Aztec Connect来利用Aztec的ZK rollup的匿名性,同时保留以太坊L1结算的优势。
我们已经把这项以及之前的拍卖实施添加到GitHub上的Auction Zoo存储库中。我们希望你能在这些基础上,分享你的想法,并向我们发送你的反馈。
如何运作
首先快速回顾一下Vickrey拍卖会:竞标者用密封的信封向拍卖人提交私人出价(传统上是针对单一物品)。出价最高者获胜,但支付第二高的出价金额。为了在链上转化这些特征,我们的新拍卖遵循了与之前相同的蓝图:在“竞价阶段”,出价被抵押并承诺,在随后的“揭晓阶段”中,出价不会显示其准确价值。一旦揭晓阶段结束,拍卖就可以结束,中标人向卖方支付第二高出价的金额(Vickrey支付规则)。我们的拍卖实施方式的不同之处在于,在投标阶段如何隐藏出价——这一次,我们将使用一种即使对于大额出价也具有资本效率的机制。
通过“拆分”隐藏出价
在OverCollateralizedAuction中,隐私依靠过度抵押来隐藏确切的出价值。在SneakyAuction中,我们能够通过使用CREATE2操作码来隐藏出价交易的意图,从而实现出价隐私——交易的价值是公开可见的,但交易与正常的ETH转账是无法区分的。
另一种方法是通过将一个竞标交易分割成多个不可连接的交易来混淆其价值。想象一下,一个拍卖商收到三张支票,分别为100美元、200美元和300美元,每张都用隐形墨水签署。这三张支票可能是由同一个竞标者签署的,出价为600美元。或者,它们可能是三份单独的投标书,由三位独立的竞标者签署。或者,可能有两个竞标者,其中一个将其投标分成两张支票。使支票金额是公开的,基本的投标价值也是隐藏的,直到签名被揭晓。
为了在链上实现这一点,竞标者可以从不可链接的钱包地址在多个支付交易中发送他们的投标抵押品。对于每一笔交易,他们都会提供一个哈希承诺,在以后可以打开该承诺,将各个部分链接起来——例如,承诺可以计算为keccak256(totalBidValue、bidderId、nonce),其中具有相同bidderId和totalBid值的付款是同一投标的一部分。随机的nonce值防止通过暴力恢复出价。
作为保护竞标者隐私的一种方式,其基本概念是有意义的,但这种方法的一个缺点是,它要求竞标者有多个非链接的钱包地址,并为他们打算用于投标的金额提供资金。但即使是逃避业余的以太坊侦探也需要谨慎,更不用说像Chainalysis或TRM这样的机构取证工具了,这在实践中很难实现。
更糟糕的是,公开和永久地链接所有使用过的地址的出价。因此,要在随后的拍卖中出价,你需要一组新的未链接的地址。我们只能求助于另一个工具:Aztec Connect,来解决这一问题。
Aztec Connect进行匿名竞标
Aztec Connect是一个框架,允许用户从Aztec的ZK rollup的隐私中访问以太坊L1上的智能合约。以太坊上的rollup处理器合约可以调用遵守特定接口的兼容桥梁合约,允许Aztec用户使用托管资产与这些合约进行交互。桥接合约通常插入L1上现有的DeFi协议;例如,Uniswap、Lido和Element Finance已经实施了桥接。
Aztec Connect为我们的拍卖提供的关键属性是匿名性:发起Aztec Connect交易的Aztec账户对观察者是隐藏的。匿名性使我们能够模仿上一节所述的使用非链接地址的方案。揭示出价不会揭示出用于出价的Aztec账户,所以同一个账户可以在多个拍卖中使用而不影响隐私。
沟通承诺
仅仅是匿名性还不足以进行竞标,我们还需要将哈希承诺与随后可在揭晓阶段打开的每笔付款相关联。回顾一下,在OverCollaterifiedAction中,承诺被作为参数提供给commitBid</code<函数,该函数在存储中记录了承诺和抵押金额。在SneakyAction中,抵押品被发送到未部署的CREATE2合约,其地址用作哈希承诺。
在Aztec Connect桥接合约中,所有跨链调用都通过桥接的convert函数进行路由(见下图)。资产参数通常会区分调用的意图,例如,在Lido桥中,如果输入资产是ETH,则convert函数会将其转换为包装的stETH;如果输入被包装的资产为stETH,则convert函数将其转换为ETH。竞标者将用以ETH为输入资产调用convert函数(每次支付一次)来在我们的拍卖合同中出价。
有时,仅凭资产不足以确定调用的预期行为。例如,Uniswap桥允许用户在Uniswap v3上私下交换代币。为此,用户必须指定交易路径,即要交换的资产池——为了获得将ETH卖给DAI的最佳汇率,你可能想用30个基点的池子将ETH交易到USDC,然后用1个基点的池子将USDC交易到DAI。为了指定这个交易路径,用户必须提供所使用的两个资金池的中间代币(USDC)和费用层级(30 bps和1 bps)。
convert函数的auxData参数是这种 "辅助数据 "被传递到桥接的方式。然而,请注意,auxData只有64位!(这是呼叫数据大小和证明成本之间权衡的产物——更多auxData需要更长的证明时间和更高的gas成本。64位在大多数使用情况下都达到了平衡)这意味着桥接在使用辅助数据时需要节约:Uniswap桥接通过代表代币和费用层来编码路径。
我们的第一直觉可能是使用auxData来实现哈希承诺。但在加密上auxData只有64位是不够安全的。聪明的编码技巧在这里行不通——任何压缩承诺的尝试都会危及其安全性。我们需要通过创新来规避auxData的局限性。
虚拟资产和重新利用inputValue
除了auxData之外,convert中唯一可以用来编码任意数据的参数是inputValue——在Aztec Connect交易中使用的输入资产的数量。但是我们可以使用inputValue来编码我们的哈希承诺吗?为了用参数来编码加密安全的哈希承诺(大约256位),竞标者必须拥有大量的输入资产,以至于任何具有实际货币价值的资产都是不可能的。
幸运的是,Aztec Connect具有虚拟资产的概念,用来代表Aztec网络不支持的资产。对于我们的用例来说,最重要的是,桥接可以在convert调用中铸造任意数量的虚拟资产。这促使我们通过Aztec Connect进行以下两个事务处理,以传递哈希承诺:
- 在第一笔交易中,输入资产是ETH,输出资产是虚拟的。竞标者存入ETH抵押品,并获得(2256–1)单位的虚拟资产作为回报。更新存储槽以表示哈希承诺“正在进行”。
- 在第二笔交易中,输入资产是步骤1中收到的虚拟资产。inputValue被解释为哈希承诺并与当前时间戳一起存储。
通过这两步程序,我们规避了auxData的大小限制,并将每笔付款与安全的哈希承诺相关联。这种方法的缺点是每次付款需要两次交易。
如何比较
现在,我们已经为Aztec Connect拍卖提供了一个可行的实施方案,我们可以将其与之前的两个实施方案(OverCollateralizedAuction和SneakyAuction)进行比较——特别是在gas成本、用户体验和隐私方面。
Gas成本
AztecConnectAuction的createAuction、endAuction和withdrawCollateral函数的gas成本与我们以前的实施方案差不多。承诺和揭晓投标的成本与抵押品被分割成的数量成正比。下表显示了分为两部分的投标的预估gas成本。
用户体验
尽管AztecConnectAuction遵循与我们之前的实施方式类似的流程(竞标阶段、揭晓阶段、拍卖结束),但也有一些奇怪的用户体验存在于跨链操作之处。
卖家不需要桥接任何资产或进行任何Aztec交易,就能在拍卖结束时在L1上支付。另一方面,竞标者在Aztec上进行一些操作,而在以太坊上进行其他操作:
- 投标通过Aztec Connect进行承诺和担保。这意味着竞标者必须已经持有Aztec的ETH,或者在出价前以其他方式进行桥接。
- 竞标在以太坊上揭晓。揭示出价需要大量的调用数据(甚至我们的inputValue技巧还不够),所以它必须直接在以太坊上完成。
- 一旦拍卖结束,竞标者可以选择将抵押物提取到以太坊或Aztec。竞标者可以通过调用拍卖合同上的withdrawCollaborative函数提取到以太坊。如果他们想将ETH保留在L2上(例如,在未来的拍卖中出价),他们可以通过Aztec Connect交易提取到他们的Aztec账户。
最后,还有两个实际存在的复杂问题:首先,对竞标的承诺需要每件抵押品有两个Aztec Connect交易。我们可以在前端将其抽象为单个用户交互,以获得更无缝的体验。其次,这些交易应在整个投标期间进行分配,以最大限度地保护隐私。我们可以将这个任务委托给机器人,由它代表竞标者提交交易。
总而言之,卖家的用户体验与我们之前的实施方案几乎相同。竞拍者的经历则更为复杂,他们需要进行多次交易才能出价,并且在拍卖过程中必须与以太坊和Aztec进行互动。
隐私
AztecConnectAuction与我们之前的两个实施方式相比有一个明显的优势,就是它可以在不损害资本效率的情况下为高价值拍卖提供隐私。在OverCollateralizedAuction中,当投标本身需要大量抵押品时,过度抵押的成本就会加剧。在SneakyAuction中,隐私依赖于外生的ETH转移,通常不足以隐藏高价值的竞标。
与SneakyAction一样,AztecConnectAuction也允许竞标者过度抵押他们的出价来获得额外的隐私。出价隐私也会随着同时进行的拍卖的数量而增加——如果两次拍卖同时处于各自的出价阶段,那么一次拍卖的出价会对另一次拍卖产生干扰。竞标者在投标期间保持匿名,而竞标的总数量是隐藏的。
也就是说,AztecConnectAuction有自己的注意事项。竞标者需要注意他们留下的链上足迹,这可能会损害他们的隐私:
- 付款时间:人类竞标者可能无意中以一种可能削弱其竞标隐私的方式确定其付款时间(例如,快速连续付款或在若干天内同一时间付款)。
- 流入和支付金额:在竞拍之前或竞拍期间向Aztec公司的存款可能预示这些资金将用于竞拍。竞标者需要考虑资金流入、付款金额和时间之间的相互作用。例如,向Aztec存入10 ETH,然后迅速支付5 ETH、3 ETH和2 ETH,很容易让人怀疑这些付款是同一竞标的一部分。
这些考虑因素并非我们的拍卖独有;在私有区块链和公共区块链之间架设资产必然会引入隐私泄露的可能性(Aztec的文档提供了更多关于跨链隐私细微差别的细节)。好消息是,像这个拍卖会这样与Aztec兼容的应用程序的扩散创造了更多将资产长期保留在Aztec上的理由,而不是反复桥接。Aztec上更多的活动增加了其隐私集,这加强了基于Aztec的应用程序的价值主张,从而产生了更多的活动,实现了一个良性循环。
通过利用Aztec的私有rollup来匿名竞价活动,这次对链上密封竞价拍卖的尝试让我们走出了以太坊L1的围墙。我们的第三个密封出价拍卖方案——匿名加抵押品分割——有自己的隐私特征和细微差别,我们将其与之前的设计进行了比较,其他人可能也希望将其与自己的方法进行比较。
我们的拍卖实施方案是为数不多的原生跨链智能合约协议之一,这些协议依赖于跨多个区块链进行操作,从而实现任何单链都无法实现的功能。随着跨链基础设施的不断成熟,我们预计会出现利用不同区块链独特功能的原生跨链协议。我们希望我们的密封投标拍卖为这里的可能性提供一些灵感。
本文由CoinTime整理编译,转载请注明来源。
所有评论