这篇是前几个月的Sundaeswap的可搬砖套利的小特性(bug)的记录,目前特性已经被修复,所以也没法用了

Sundaeswap是Cardano链上上线的第二个去中心化交易所(Decentralized exchange, Dex),由于Cardano使用的UTXO模型的原因,所以它在实现的本质上还是一种挂单交易的方式,不过流动性相比于直接挂单的交易所更好

在上线前三个月存在一个特性,可以在Sundaeswap的首页查询到一个币种的多个交易池,但是在实际的swap界面上只能默认流动性最高的池子。

image-20220814121457096

交易池:放入了不同币种对的一种抽象模型,可以放入一种币种在交易池中换取另外一种币种,现在的去中心化交易所使用的都是一类公式。

做一个简单的举例,假设人民币比美元是6:1,那么就可以创建一个交易池放入600人民币和100美元,这样其他人就可以在里面交易,而交易池可以得到手续费。如果不按照比例来进行设置,那么其他人就存在一定的套利空间,导致交易池出现损失。

在抓包后可以发现,Sundaeswap进行一次交易要经过下面的一系列操作

  • 本地根据流动性、滑点、手续费计算得到该笔交易中能够获取到的另外一个币种的最低限制数量
  • 交易信息发送到sundaeswap的服务器上,生成一笔未签名的交易的cbor,这里的交易信息包含了地址、输入币种、输出币种以及具体数量信息
  • 返回本地让本地的钱包进行签名,发送交易到链上
  • 交易完成,钱包收到目标币种
  • 如果交易池不能满足最低限制数量,则会在链上一直等待交易可以完成

在交易信息中还包含了一个重要的字段:目标交易池标识,这里的标识就是一个整形数据,标识从哪个交易池进行交易

如果目标交易池中没有现在需要兑换的币种,那么这笔交易同样会一直卡在链上,直到撤销这笔交易返回代币

在swap页面不能选择交易池,这就会导致默认的交易池价格会一直变动(因为频繁会有人兑换),而其他的交易池价格不会或者很少发生变动(其他人没有发现可以修改json数据来更改交易池)

于是这就会导致存在多个交易池的币种存在套利空间,在默认交易池出现频繁的价格波动的时候就可以来回薅

顺便说一下自动做市(Auto Market Maker, AMM)在这种场景下的可套利计算方法

假设有两个币种A和B,它们有两个交易池在DEX上,在一个交易池中有a个A币种,b个B币种,在另外一个交易池中有c个A币种,d个B币种

并且a/b和c/d的差距比较大,这种情况下就有可套利空间

现在我放入x个A币种到第一个交易池中得到y个B币种,再将它放入到第二个交易池中换出A币种

根据AMM的输出计算公式(白皮书参考:SundaeSwap Fundamentals),可以得到
$$
y = b - \frac{ab}{x + a}
$$
同样,在另外一个交易池中进行兑换,输出z个A币种
$$
z = c - \frac{cd}{y + d}
$$
套利空间也就是$z - y$,这里最后化简后得到一个关于x的方程,在之前计算的时候不太好找极大值。然后发现在1w以内对计算机来说计算量也不是很大,就直接用python写程序直接求极大值了。