下面的预言机被设计成一种最小化信任和无需许可的方式来获取任何人都可以使用的代币价格。
预言机最基本的工作原理是让报告者以相同的价格提交限价买入价和卖出价。任何人都可以与这些订单进行掉期,只需支付少量费用(不接受部分成交)。如果在一定时间内无人接单,则表明价格合适,可用于结算。如果订单被接单,则接受者需要提供两种代币作为抵押,暗示新的价格,然后计时器重新开始。
预言机在争议期间使用指数级抵押品升级来增加操纵成本,并为用户提供一些关于总结算时间和延迟成本的统计保证。平均而言,报告准确价格所需的资金可能远低于根据报告价格结算的名义金额。其目标是取代目前集中式且可信的预言机中介机构,从而减少 DeFi 应用的故障点。
该设计依赖于 n 个自利参与者中的 1 个,这些参与者在经济上与外部立场不一致,由预言机在截止日期之前将其交易纳入其中。
该设计的一个明显限制是审查制度(提交不良价格 → 审查争议 → 获利)。这严格限制了预言机在 Layer-2 上的安全保障,并且在 FOCIL 实现之前,我们必须在 Layer-1 上使用更长的结算时间,以降低攻击者连续控制多个区块的可能性。
下面是一个简化的 Oracle 生命周期示例:
假设某个应用程序想要查询 WETH 兑USDC的价格。在价格请求中,他们指定
- 代币1:WETH
- 代币2: USDC
- 代币1金额:0.1 WETH
- 结算时间:10秒
- 乘数:1.5x
- 奖励:0.001 ETH
预言机合约余额现在为 0.001 ETH。
此价格请求会上传到链上,任何人都可以报告价格。假设ETH的价格为 3000 美元。下一步,报告者提交一份初始报告,在与其他所有人的竞争中胜出,赢得 0.001 ETH 的奖励。
由于应用程序使用预言机获取价格,我们假设有两个人处于相反的立场。这意味着,如果价格被报告得更高,一个人受益,另一个人受损,反之亦然。假设其中一个人完全被动,而另一个人主动,如果预言机认定 WETH 的价值低于预期,他将受益。因此,假设最初的报告者是这方的操纵者,因为他们能够出价The Block中的其他人。
在初步报告中,他们明确指出:
代币1金额:0.1 WETH
token2金额:150 USDC
预言机合约余额现在为 0.001 ETH、0.1 WETH 和 150 USDC。
这些报告余额暗示ETH价格为 1500 美元,而实际价格为 3000 美元。
假设无人对此报告提出异议,经过10秒的结算时间后,该报告可能会被结算并可供应用程序使用,但代价高昂。但是,提出异议是有利可图的,因此我们假设在10秒结束前会有异议者出现。
在争议中,他们明确指出:
代币1数量:0.15 WETH
token2数量:450 USDC
tokenToSwap: USDC
他们决定与初始报告者的 150 USDC进行兑换,这意味着他们选择USDC作为争议中的兑换代币。token1AmountNew 比初始报告者(使用价格请求的 1.5 倍乘数)的合约规则下报告的金额高出 50%。代币流向如下:
预言机合约从争议者那里收取 150 USDC ,然后将其添加到初始报告者原来的 150 USDC中,并将其全部发送给初始报告者,总共向初始报告者发送 300 USDC 。
接下来,预言机合约从争议者那里收取 450 USDC和 0.05 WETH,并将其添加到报告中。
合约余额现在为 0.001 ETH、0.15 WETH 和 450 USDC ,settlementTime 计时器重置为另外 10 秒。
假设操纵者妥协,并且10秒的结算时间过去了,任何人都可以来结算报告的价格。预言机价格为3000美元,而实际价格为3000美元。
在结算过程中,结算者只需指定要结算的报告。通常情况下,他们会收到价格请求者支付的ETH的结算者奖励,但在本例中我们假设为 0。结算过程中的代币流向如下:
初始报告者(操纵者)将从初始报告者奖励中获得 0.001 ETH 。这笔费用必须与竞价超过其他所有人成为第一个初始报告者所产生的 Gas 成本相抵。
争议者将获得 450 USDC和 0.15 WETH 的回报。
现在所有ETH和代币的合约余额均为 0。如果我们将预言机整个生命周期(包括价格请求、初始报告、争议和结算)的流量进行净额计算,我们可以看到以下情况:
初始报告人:
USDC:+150
WETH:-0.1
争议者:
USDC:-150
WETH:+0.1
假设ETH费用和初始报告者奖励净值接近于零。ETH 的真实价格为 3000 美元,因此操纵者损失 150 美元,争议者获利 150 美元,并且预言机价格公平地结算,可供应用程序使用。如果操纵者决定继续通过质疑诚实争议者的报告来操纵价格,他们的损失将呈指数级增长,且损失金额会随着报告价格的误差而增加。
Solidity 中的参考预言机实现有更多参数需要调整,例如交换费、升级暂停、争议延迟、时间模式(秒与块)等等,但简化版本对于激励机制如何运作是准确的。
对于给定的预言机实例,掉期费是一个重要参数。新的报告者需要向之前的报告者支付掉期费(以百分比表示),该费用在价格请求时设定。如果在指定的结算时间内,掉期费相对于背景市场波动过低,则由于重置计时器的争议更为常见,结算总时间可能会延长。另一方面,如果掉期费过高,则会使预言机价格的被动用户面临套利损失,因为主动操纵者可能会试图将价格结算在掉期费区间内,但远离真实价格。
因此,总体 Oracle 实例完成时间和最终用户的套利损失之间存在根本的权衡。
就完全被动的终端用户所承受的最大套利损失而言,该数字严格小于每轮内部预言机掉期费总额加上 Gas 费,再加上报告者的跳跃损失。我们将其称为有效掉期费 F(掉期费 + Gas 费 + 跳跃损失)。我们假设,如果价格超出 F,n 个自利参与者中的 1 个会提出异议。由于只有最终存续的价格才会对外部名义价格误差产生影响,因此可提取的总价值 <= F。
无论价格朝哪个方向变动,跳跃损失都会对报告者造成成本。代币价格可能会不连续地跳空超过 +/- F,当有人提出异议并修正价格后,报告者需要承担与独立掉期费相比的差额。乘数越高,报告者每轮承受的跳跃损失就越大,相对于上一轮报告的自然价格误差而言。
升级暂停是另一个重要参数。超过此暂停时间,争议可以继续进行,但不再需要提供指数级增长的抵押品。这样,您可以确保预言机实例不会升级到超出争议网络的可感知容量,同时仍然对操纵者施加高额惩罚。
完整的 Solidity 实现如下所示。需要注意的是,直接函数条目可能会添加外部合约重组/重放保护(例如,如果交易不在传递的区块号和时间戳内,则回滚,或者结算必须使用匹配价格请求的 stateHash),这可能会有所帮助,但无法消除风险。
非常乐意听取任何关于设计的反馈或批评,也乐意解答任何问题!我们希望为真正无信任的金融应用的开发做出贡献。