针对dBFT设计的防御MEV攻击的解决方案|Neo专栏
共 3484字,需浏览 7分钟
·
2021-10-14 10:47
上一篇Neo专栏中
Neo核心开发者廖京辉,为我们介绍了
「他为N3开发的第一个智能合约」
以及在此过程中遇到的困难与解决方案
对N3开发平台的理解和想法👏👏
本篇Neo专栏中
他将为我们讲述
MEV(最大可提取价值)攻击的
生成原因和解决方案
以及一种针对dBFT设计的防御MEV攻击的方法😎
快来一起看看吧👀👇
什么是MEV攻击?🔍
区块链世界创世伊始,中本聪先生就定下了一些简单的规则,比如共识,签名,哈希,广播等等,这些规则一起构成了我们最初认识的区块链世界,很多到现在依然是各种区块链项目的基础。其中,交易公开和竞争记账权,就是比较典型的两个规则。
交易公开
交易公开是指任何人都可以查看和验证交易。其目的是为了避免中心化,避免有人作恶。
竞争记账权
竞争记账权是指全网所有节点共同竞争生成区块的权利,也即记账权。获得记账权的节点就可以把他收集起来的交易打包成一个交易列表,然后把交易列表整理成一个merkleTree并写到新区块里。记账权争夺是为了尽量让记账人的选择做到随机化,实现记账权的分散。
这个系统在以往的简单支付场景中是没有问题的,大家都是简单的发送交易。记账节点也完全没有任何作恶的空间,原本可以做的有效操作也无非就是验证交易签名而已,顺便捞点外快(区块奖励+手续费)。但是伴随着智能合约的引入,区块链被赋予了脚本执行的功能,用户除了可以发送简单的交易之外,还可以发布自己的智能合约脚本并在链上执行,交易的链上逻辑变得越来越复杂。在这个大背景下,以前专门针对简单交易场景而构造的区块链架构开始暴露出问题:矿工(议长for N3)的权限过大,其拥有对一个区块里打包的交易的排列顺序,打包与否的绝对控制权,甚至可以临时生成针对性的交易并打包到区块里。这种攻击就属于MEV(矿工可提取价值)攻击。
其实早在智能合约发布之前,议长权力的问题就已经初露端倪。在区块链远古的比特币时代,大家还只知道POW的时候,就有矿工发现打包交易获取的手续费收入相比挖出新块获取的奖励来说简直微不足道,打包交易远不如把验证交易的时间节省下来以挖掘新区块高效。因此那时就有人发现很多矿工是不打包任何交易的,直接挖掘空块,这样矿工就可以在收到新的区块之后立即投入下一个区块的挖掘,而比特币网络对此毫无办法。
不过所幸这样的情况大多发生在小矿工身上,比特币的算力又主要是矿场控制,只要头部矿场不这么干,那比特币网络照样可以正常运行。但是后来区块链进入了智能合约时代,以以太坊和Neo为代表的一大批支持智能合约的新一代区块链步入历史舞台,因为智能合约本身逻辑的复杂性,交易的顺序开始变得重要,不同的交易顺序甚至会有不同的交易结果。议长权利过大的问题更加暴露无遗。此外,由于这些平台对交易顺序的排序还遵循手续费排序原则,用户提交的交易手续费越多,那么交易就可以越早被打包,这就更加把原本只属于议长才拥有的决定交易顺序的权力下放给了所有用户。基于此,用户可以监控网络交易以及智能合约的状态,然后在合适的时间发布相应的交易,以实现利益最大化,DEX平台经常面临的三明治攻击就属于此范畴。并且因为这种攻击不再仅限于矿工,MEV攻击也被改称为MEV(最大可提取价值)攻击。
MEV攻击的解决方案💡
面对这种攻击,现在已经有了很多解决方案,比如Chainlink和Automata的第三方交易排序并且利用TEE来保证排序的公平性,主要思路就是把区块的打包权和交易列表的生成权进行分割,以避免议长对交易列表的攻击。同时,采取一种FIFO的方式来对交易进行排序,从而避免三明治攻击。
要防御MEV攻击,我们需要首先明确几个目标,只有实现了这几个目标,才能确定真的成功防御了MEV攻击:
议长不能决定交易的顺序
议长不能临时插入交易
议长不能从交易列表中剔除正常的交易
任何人都不能决定一个区块里的交易顺序
此外我们还需要一些假设来设计我们的方案,这些假设是我们设计anti MEV的前提,必须成立:
正常议员数量超过所有议员的2/3
合法的交易会存在于所有的正常节点中
正常的议长一定能与所有正常的议员进行通信
每一轮通信过程中所有的通信信息一定包含所有正常节点
dBFT防御MEV攻击🛡️
本文将介绍一种专门针对N3的dBFT共识合约设计的不依赖于第三方交易排序和TEE的、防御MEV攻击的协议。
和Chainlink和Automata的思路一致,我们也是需要把交易顺序的决定权从议长手里剥离开,让议长只有一轮共识的管理权(发起共识)和新区块的打包权(签名广播),而不能决定哪些交易可以被打包哪些不能被打包。可是这种方式需要依赖于第三方提供的服务,尤其是第三方还可能有中心化的风险,此外我们还不能使用TEE,只能在共识过程中下功夫。我们知道现有的dBFT过程是议长本地收集全网的交易,然后在共识开始的时候把这些交易打包好并广播出去,别的议员负责验证这些交易,当交易全部验证通过,则广播确认消息。在这个过程中,交易列表完全由议长负责。如果要把这个列表的生成权剥离开,那我们就需要有另一个可靠的机制来生成这个列表。
我的方案是在每一轮共识之前,先让每一个议员节点都广播一份自己的交易列表,为了避免在一个区块里发生三明治攻击,可以先按照交易手续费选出手续费最高的那些交易,然后把这些交易再按照原本的时间顺序进行排序。也就是说手续费可以让你的交易被提前打包,但是不会让你的交易排在同一个区块的交易的前面。议长收集超过2/3的节点的交易列表,然后在交易列表里进行检索,只有那些在超过了2/3个交易列表中都存在的交易才会被确认,最终确认的交易会按照手续费进行排序,然后取一个区块所能承载的最大数量的交易,再把这些交易按照一个综合的时间顺序进行排序,得到最终的交易列表。
这个原本的时间顺序是比较难确定的,毕竟是一个去中心化的系统,一笔交易同步到整个网络是需要一段时间的,所以每一个节点收到一笔交易的时间是可能有冲突的。因此为了给每一笔交易一个确定的顺序,我们需要用数学期望来尽可能排除网络的影响。假设总公式节点为n,恶意节点数小于f,计共识节点为CN_i,在第n轮共识CN_i提交的的共识列表为L_i。对于交易tx_j,其在列表L_i的顺序为L_i(tx_j)。则交易tx_j最终的交易顺序为 E(tx_i) = Sum(L_i(tx_j))/Count(i)。
但是上述的方案还有问题,因为我们是不能确定收集到的列表里有没有来自恶意节点的。如果恶意节点也提交了自己的交易,并且没有按照FIFO的顺序来组织交易,那么就有可能会影响我们上面公式计算的结果。因此为了进一步排除恶意节点的影响,我们还需要对每一个L_i(tx_j) 来计算求其所有顺序的异常值(outlier)并排除掉,之后再计算其期望。
当然,最终的交易顺序的确认也可以有别的可行的方案。比如逗比同学就提议说我们可以用随机数来随机排序最终的列表,用随机数来处理那些计算之后有相同下标的交易。
这个方案通过由共识的形式来生成交易列表,避免了议长对于交易列表的控制权,使得议长无法对交易列表进行任何非法操作。虽然最终的列表依然是由议长生成,但是基于我们的假设,议长没有办法对一个超过2/3是正常节点的共识系统进行攻击,因此成功实现目标1 2 3。然后由根据综合的时间顺序来避免了三明治攻击, 进而实现了目标4。相较于已有的方案,我们的方案是一个不依赖于可信第三方,不依赖于可信硬件的去中心化解决方案。To the best of our knowledge, 我们的方案是目前整个区块链世界里第一个实现去中心化Anti-MEV的不依赖于TEE的解决方案。
All in One · All in Neo
Neo是一个由社区驱动的开源平台。利用区块链技术与数字身份,开发者可以通过智能合约实现资产管理数字化与自动化。Neo致力于通过分布式网络建设下一代互联网基础设施,为区块链技术大规模落地奠定基础,以实现智能经济的宏大愿景。
自2016年上线至今,Neo主网已稳定运行超过四年。全新版本Neo N3已于2021年发布,提供了更高吞吐量、更强稳定性与安全性,带来了优化的智能合约系统及功能丰富的基础设施集合,旨在赋能开发者并加速企业级区块链创新。