MEVless,MEV解决之道
什么是MEV
MEV攻击(最大可提取价值攻击)是一种利用对交易排序的控制,通过重新排序、插入或排除特定交易,来获取额外利润的区块链行为。
最常见的形式是三明治攻击,攻击者在用户的买入交易前后分别插入自己的交易,利用价格操纵实现套利,导致用户支付更高的价格。其他形式包括抢先交易、清算套利等。
需要指出的是,三明治攻击、front-running攻击对于区块链生态而言基本算是百害而无一利的。因为它会导致用户交易的利润受损以使自己受益, 它和三角套利这样的不同,三角套利本身是可以对区块链带来流动性的;而三明治攻击和抢跑攻击本身是伤害流动性的,当没有交易发生的时候, 这两类攻击也就随之消失。由此可见,三明治攻击和抢跑攻击对区块链(尤其是defi)的负面作用极大,堪称业界毒瘤。
MEVless协议
前提
MEVless 适用的攻击场景:
- 三明治攻击
- front-running攻击
MEVless适用的链:
在这里,笔者不建议在L1公链这一层(尤其是通用的区块链,像ETH,solana)使用MEVless协议,因为MEVless需要对区块本身做一些针对性修改,这是专门为了抗MEV而设计的,未必适用于 其他业务类型(尤其是不需要抗MEV的业务类型)。 笔者建议将MEVless放在一些专用的defi应用链 或者 L2上,然后最后回到ETH L1上进行结算。
原理
MEVless的原理在于约束矿工对交易定序的行为,我们的做法是在排序的时候不让矿工看到具体的交易内容。 并且在看不到交易内容的情况下进行交易排序,此时由于不知道具体交易内容,则即使是矿工 也无法进行MEV攻击,排完序之后需要将该顺序发布到公网中使其他节点和用户也获悉。此时交易顺序已然定型并入块,那么之后提交具体交易内容的时候便会强制按照这个共识的顺序执行,不再有MEV的操作空间了。
我们将链上的区块分成两个类型:
- 定序区块,定序区块只完成三件事:接收交易hash,扣除用户的预付款,给出交易定序的承诺,定序区块的出块间隔时间可以短于执行区块
- 执行区块,执行区块与寻常区块无异,只需要按照之前的定序区块里承诺的排序执行交易即可
这两种区块交替出块,比如创世区块之后,单数块高的区块即为定序区块,双数块高的区块即为执行区块
流程
-
区块N(定序区块)开始出块
-
用户将交易hash发送到链上,并支付一定的预付款。预付款有两部分构成:
1)交易Hash的gasFee: 用作交易Hash的存储和排序时的计算费用,这部分费用一般是固定且必须有的
2)额外小费:用户为了该交易能够排序尽可能靠前而支付的额外费用,该部分数额不固定且可以没有 -
链节点收到交易hash之后,会完成如下步骤:
- 检查交易账户是否有足够的钱支付预付款
- 根据预付款的金额的大小对交易hash进行从高到低排序
- 扣除交易账户的预付款金额
- 把排好的交易顺序作为承诺存入区块中并公布到P2P网络
-
用户订阅查询到自己刚刚发出的交易Hash在链上承诺的排序序号之后,发送具体的交易内容到链上 和DA(DA为可选项)
-
区块N+1(执行区块)开始出块
-
链节点收到交易内容之后,会完成如下步骤:
- 从DA拉取交易内容(如果此时上个区块里所有承诺排序的txHash都有对应的交易内容,那么跳过该步骤)
- 检查交易内容是否与之前承诺定序的txHash匹配,如不匹配则舍弃
- 按之前承诺的顺序执行交易
依此下去周而复始
DA的作用(可选)
在该方案中,可能会出现当交易内容发往链上之后,矿工看到该笔交易有利可图,于是可能会恶意扣下该笔交易以使得交易无法上链然后等待用户下次重新发送相同的交易再来进行攻击, 此时不仅用户的交易利润依然会被侵蚀,还会因为之前发送的交易hash白白多交一笔预付款。
所以,我们需要DA(比如 ETH Blob)来确保用户发送出来的交易一定能够上链,这样哪怕出块节点恶意扣留了该笔交易,其他的验证节点和全节点也能够收到该笔交易内容, 并在后续的出块过程中执行该笔交易。这样,出块节点为了防止自己跟其他节点出现状态不一致的情况就会不得不把该笔交易也包含到自己出的区块中。
在这个过程中,DA是为用户多提供了一层保障,并不是必选项,如果用户觉得该交易在P2P网络中已充分传播到足够的全节点,也可以不使用DA。
引入DA也可以防止该链的矿工群体以联合垄断的方式扣留用户交易。
优势
- 相较于加密内存池而言,MEVless方案的开销更小,不需要解密这种对CPU、内存而言的高耗能操作,并且MEVless
只先对交易Hash定序,一个hash只有32字节长度,甚至可以更短,定序完成之后传播 对 网络带宽的负担也很轻。 - 相较于PBS而言,MEVless从MEV攻击的源头交易定序权开始进行约束,因为在定序前屏蔽了攻击者对交易信息的情报,封杀了攻击者进行MEV攻击的先决条件
- 有利于去中心化执行和结果可验证。所有抗MEV的方式步骤都是写死在代码层,只要全节点按照该代码执行,结果即是确定的,很难在黑箱操作中进行MEV攻击
- 与隐私内存池节点不同的地方在于,隐私内存池并不会在知晓具体交易内容前将承诺的交易顺序发布到全网节点进行共识,而MEVless会将承诺的交易顺序发布到全网让每个全节点共识后写入区块中以确保交易会按承诺的顺序执行
投机性MEV
前文我们讨论了普通的MEV攻击,但是如果攻击者无法看到具体的交易内容无法定点狙杀交易的时候,他们可能会采取另一种方式来攻击,即投机性MEV攻击。
这种攻击方式具体体现在:在MEVless中,攻击者可以提前埋伏好一个交易 并把该交易的hash提交到链上,等待执行区块开始时,大家都提交交易内容的时候,攻击者可以根据其他用户提交的交易内容 来判断并计算自己是否有攻击收益,如果有则提交自己的交易内容,如果没有的话就选择拒绝提交自己的交易内容,实现三明治攻击。
这种方式在MEVless协议中很难成立, 因为投机需要成本,而当攻击者发现无利可图选择放弃提交自己的交易内容的时候,他之前提交txHash时候所支付的预付款便等于白白浪费了,并且攻击者越想让自己的交易在排序中靠前, 那么他所需要的预支付的成本就越大。
那么,一定会有读者疑惑,如果是出块节点自己进行MEV攻击,那么这部分预支付款相当于是自己给自己,完全弥补了攻击成本,这种情况下,又该如何解呢?
共识层优化
确实,当出块节点自己进行MEV攻击时,这部分预支付款会被自己的出块奖励所覆盖,所以不会存在攻击成本的浪费。那我们削弱这种投机方式的思路是:让矿工无法预测下一个区块是否轮到自己出块,这样他投机成本就会陡增。为此,我们需要在共识层去增添如下设计:
- 准入共识:proof of Burn L1-token,人们必须在 L1 上烧掉一些 L1 代币(ETH/usdt/usdc)才能获得加入矿工组的权利。
- 出块共识:VDF based on L1 hash,我们使用 ETH L1上最新区块的hash作为输入,以 VDF 生成随机输出值,并比较所有矿工的输出值,获得(输出值 * 销毁L1代币数量)最大值的节点将成为该轮区块的出块节点。
- 最终共识:将上面步骤中出的区块每3个ETH slot为一个周期上传到ETH L1上,并在选择(输出值 * 销毁L1代币数量)数值最大的那一个分叉作为finalized分支,一旦在ETH上finalized,并不可回滚。
并且,这种共识设计,在去中心化越来越高的情况下抗MEV效果越好,因为矿工越多,那么每个矿工节点就越难预料自己是否是下个出块节点,他们投机式MEV的风险就越高。