著名的链上聚合器 1inch 发布了最新功能 Fusion Swap,该功能旨在让客户在交易过程中免除手续费,零滑点并减少用户被 MEV 的风险。
原文作者:Cobo 安全团队
原文来源:Cobo Global
根据 1inch 官方文档对 Fusion 功能的介绍,Fusion 功能实现上是基于 1inch V5 聚合器合约。不同的是这次 1inch 在此基础上引入了新的概念,名为 resolver。我们首先来看看官方对 resolver 的定义:
从描述上看,不难发现 resolver 是专门用于处理 Fusion Swap 订单的,也就是说针对 Fusion Swap 类型的订单,只有注册的 resolver 才可以处理。为此,1inch 也提供了一份关于如何成为 resolver 的流程:
从指引上来看,成为 resolver 的条件是抵押 1inch 代币,不过这里最关键的信息在第一条:成为 resolver 的条件是需要抵押额在所有抵押中的前 5 才能获得处理 Fusion Swap 订单的资格,并且这个订单只能由 resolver 来处理。
除了 resolver 之外,描述中同时也提到了另外一个名词—— Dutch Auction,从描述上来看,就是一个兑换率会随着时间不断减少的限价订单。这里似乎有点矛盾。为什么已经是限价订单了,还可以兑换率不断变化?为了弄清楚这个问题,Cobo 安全团队专门去体验了一下。找到了一些关键的信息:
以上是 Cobo 安全团队其中的一笔兑换交易的细节。从调用的函数中来看,Fusion Swap 功能其实就是调用了最新的 V5 Aggreation 合约的 fillOrderTo 函数,该函数确实是一个只用于处理限价单的函数,通过 makingAmount / takingAmount 来确定对应的兑换比率,并在函数逻辑中把交易最后返回的 amount 和 takingAmount 进行对比,检查是否满足限价条件(相应逻辑这里不展开,有兴趣可自行探讨),交易中的兑换率是需要用户签名的,无法更改。所以这里无论怎么看都是纯纯的限价订单。那动态的兑换率又是如何实现的呢?我们一起来看看 1inch 官方针对 Dutch Auction 的描述,如下:
Cobo 安全团队从中摘取了一些关键信息:
1、这个限价订单是存在等待时间的。2、限价订单最开始的兑换比率是用用户理想情况能兑换出的代币数量来计算得出的。3、随着订单等待时间的推移,兑换比率会逐渐下降,也就是说用户能得到的代币数量会越来越少。
明白了这些信息后,结合实际体验过程中的所调用的函数和 resolver 的作用,不难推断出其实 Fusion Swap 功能就是利用限价订单的模式,把兑换率设置为用户可以获得的最低数量的代币反向计算出来的兑换率,然后剩余的浮动部分,也就是用户额外能得到的交给 resolver 来决定。随着时间的推移,用户能得到的部分会越来越少,但是这个“少”仅仅是 resolver 决定的少,而并不体现在链上,毕竟用户签名的订单信息,已经设置了最低的兑换率。
在 1inch 的文档中,有对这部分做了一个详细的图表,我们拿其中一个来进行分析:
通过这个图,其实不难发现,在等待的过程中,订单发布给 resolver 后,兑换率是随着区块推移分成3段不同的斜率下降的,并不是一个匀速的过程。在这个过程中,等待10个区块后的斜率最大,最后跌到用户设置的最低兑换率中。整个过程中,用户最大损失为 0.1% 左右。按目前以太坊 12 秒一个区块来看,15个区块就是 3 分钟的的时间,也就是说如果用户的订单发布了3 分钟之后如果没有任何 resolver 愿意成交,那么作为用户,就需要承担 0.1% 左右的损失。而这个图只是其中一个例子。根据不同的兑换交易对和市场情况,曲线可能会存在不同的形态,即用户最低代币返回数量也会有所不同。通过上面的简单分析,其实我们已经可以对 Fusion Swap 这个功能下一些简单的定义,方便我们后续的一些分析:
1、用户签名一笔限价订单,兑换率设置为当前价格的 99.9%。2、交易本身只会由 resolver 进行处理,类似进了交易隐私池,别人无法抢跑用户的交易。3、resolver 有权选择是否处理这笔订单,并调整用户设置的最低代币返回数量部分以外的数量,这个浮动部分最低可以是0。4、订单最长的等待时间为 3 分钟。
通过上面的分析同时结合 Cobo 安全团队的体验来看,Fusion Swap 这个功能的优缺点如下:
优点——手续费
Fusion Swap 本身的订单直接交给 resolver 进行处理,用户本身只需要负责签名,该过程特别适合一些刚好就没了手续费或者以太坊网络突然繁忙导致预留手续费不够的情况,特别是网络繁忙的时候——一般都是市场出现下跌的情况,这种场景下可以零手续费快速交易的场景显然是非常重要的。
优点——MEV Protect
延续 resolver 的话题,由于 resolver 本身来处理交易,在交易超大额(100万 美金 以上),用户可以不考虑可能的被抢跑的风险,相当于交易放进了一个隐私池中,会有 resolver 专门去处理你的交易。
缺点——时间成本
一笔完成的交易需要最长等待 3 分钟的时间来完成,在市场瞬间下跌或者波动比较大的情况,由于 resolver 无法找到合适的兑换率导致用户无法快速成交订单。最终在 10 个区块之后承担大斜率的兑换率下降,严重影响收益。如果同样的兑换场景下, Gas fee 多给一点,只需 12s 就成交了。
缺点——隐含的滑点损耗
通过上面的分析,我们知道 Fusion Swap 这个功能并不是描述所说的零滑点,而是兑换的过程的滑点,即等待的过程中滑点已经产生了。以上面 1inch 给出的图为例,这个滑点最大是 0.1%,50,000 USDC 最差的情况下会损失 50 USDC 左右。但是结合 Cobo 安全团队的多次体验,这个滑点的部分并不能由用户来签名在进行前端交互时决定,用户在签名交易订单的过程中,只能签名设置交易返回的最小值。所以理论上,resolver 可以无视市场真实价格,直接按照用户签名的最低返回数量来撮合用户的交易订单。由于算法本身并不透明,用户无法预估真实的返回额,导致用户需要自行承担这部分的风险。相比之下,使用 1inch 传统的兑换,在网络繁忙的时候交易费也仅为 40 美元,远低于用户需要承受的损失 50 美元。
为了真实还原,Cobo 安全团队也做了适当的模拟,如下:
通过真实的交易过程,可以发现用户实际的兑换滑点在 0.6% 左右,而签名中的 takingAmount 也是只指定了最低返回数量。
结合使用体验上,1inch 的 Fusion Swap 功能,除了官方提到的优点之外,用户还需结合自身的场景和使用情况来使用这个功能。在行情波动较大的时候,由于无法预知兑换率的斜率,可能会导致等待时间中用户需要承担较大的损失。从分析来看,等待时间是 Fusion Swap 最大的不可控因素。但是总体来看,该功能适合价格波动较小的时候进行兑换或者进行稳定币之间的兑换,这种情况下就不需要担心因为时间流逝而导致兑换率下降。在市场行情波动较大的情况下,尝试使用 1inch 的传统兑换会是一个较好的选择。