3

“一笔交易” 的胜利

 4 years ago
source link: https://learnblockchain.cn/article/904
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

如何应对区块的堵塞攻击?

3QjuuuN.jpg!web

作者:NEST爱好者_九章天问

如果问我区块链上,有什么攻击是不可避免的,我会回答: 堵塞攻击和51%攻击 。51%攻击我们下次再谈,今天单论这堵塞攻击。

所谓堵塞攻击,是用交易占据区块,使其他人的交易无法打包。

有人把堵塞攻击比作区块链上的 DDOS攻击 :不是寻找系统漏洞,而是“合规”地占用资源,令系统停摆。二者确有相似之处,抽象出来:一是“合规”,即攻击是系统允许的;二是非漏洞,即任何系统都可能被攻击,再完美也一样;三是抢占资源,攻击者占用系统资源,其他人被动排除在外。

仔细看这些特点,似乎并不是一个纯粹的技术问题,也不是一个单纯的安全问题。 堵塞攻击是一个经济学问题,或者博弈问题 。现以以太坊网络为例,我们先研究堵塞攻击的最佳逻辑,其次则研究对抗堵塞攻击的思路。

ZRz6fuA.jpg!web

假设一个区块的gaslimit上限是1000万,最小的单笔交易是2万, 则堵塞一个区块有两种方案 :第一种是用大量高gasprice的小型交易区堵塞区块;第二种是用一笔高gasprice的大型交易(这里大型和小型是以gaslimit来度量的,大型交易是尽可能占满整个区块的交易,如gaslimit为1000万)来堵塞。比如gasprice都是1000(312 以太坊网络拥堵的情况下,保证迅速打包的gasprice也在1000倍以内),则两种方案计算出来的gas成本是一致的,这是从自己的立场出发计算的结果。

但从矿工和竞争者的角度看,二者是有差异的。

先说竞争者,即希望突破堵塞攻击的交易者。如果是小型交易,则竞争者完全可以通过一笔更高的gasprice,抢在攻击者之前打包,比如用2000的gaceprice去竞争,原则上一定排在诸多的gasprice为1000的小型交易前面;但对于一笔大型交易,由于矿工考虑最大化gas的组合,而不是最高gasprice的交易优先,则竞争者可能就被阻挡在外。这是因为,大型交易的总gas为1000万 * 1000,而包含小型交易的gas为2万 * 2000+其余交易,这里其余交易是备选的第三方交易,一般gasprice较低。在这两个交易组合里,理性的矿工会选择大型交易的组合,从而使竞争者即使出了更高的gasprice,由于其单笔交易的gas较低也会被排除在外。 因此堵塞攻击从有效性来讲,高gasprice的大型交易更有优势

根据当前以太坊网络的交易情况,一个1000倍gasprice的大型交易的手续费为,1000w * 1000=10 ETH,以来堵塞一个区块,那么堵塞10分钟的成本在500ETH。 如果外部激励足够大(外部激励即当前行为之外的奖励),堵塞1个小时也就是3000ETH,这很可能是值得的 。注意到,1000倍gasprice只是基于一个统计数据的假设,并没有基于一个链上应用来分析。

7j6nYny.jpg!web

考虑一个链上应用,比如 DeFi,其经济性存在对区块的依赖,即在N个区块内,需要完成一笔交易,否则会造成X个ETH的损失。如果该应用不做任何设计的话,按照之前的假设,10 * N 个 ETH 的堵塞攻击即可造成X个ETH的损失。这里有几种情况:1.X个ETH的损失可以变成攻击者的收益, 则当X>10N时,攻击便是一种完全理性的激励 。2.X个ETH的损失并不能变成攻击者的收益,则此种情况和X<10N一样,便成为一种恶意行为:通过破坏该应用的有效性使得资产从该应用中流出。

这两种情况应当分开考虑应对方案,但不管哪种情况,核心是如何使得堵塞攻击失效:总有一笔交易能够在临界条件触发前完成,这就是我们说的“一笔交易的胜利”。

对于第一种情况,应用需要做两种设计:首先应当根据经济规模或某种异常条件提升N的大小,变成N1;其次提升完成一笔交易的激励收益:比如完成一笔交易的收益从a个ETH提升到b个ETH,其中b>a,并且b>10eth,即堵塞一个区块的成本变成bETH,总成本从 10 * NETH 变成 b * N1ETH,只要 b * N1ETH > X,则攻击的外部激励失效。

RJnENf2.jpg!web

对于第二种情况,应对恶意攻击的最好办法,即是安排一种停机机制,包含两种含义: 其一是攻击造成的成本几何级数提升,使得攻击者无法达到目的,从而放弃攻击,比如NEST系统的beta系数设计,是目前区块链行业内第一个内置停机系统的设计,我们可以借鉴,比如让临界区块数N可以级数提升 。其次,根据“一笔交易的胜利”难度自动调整应用的可执行性,当完成“一笔交易的胜利”变得非常紧迫时,可以让应用暂时不能执行,使得攻击者失去了攻击目标。这两种安排由于比较开放,需要更深入的边界条件的分类研究。

当然,以上分析都是假设矿工是完全理性且只考虑打包的gas收益,不考虑可能的黑名单、自愿牺牲部分利益抵制堵塞攻击等行为,通过这些人性化的安排,也可以间接实现抗攻击的目的,但我们更倾向于在应用端进行设计。

由于当前链上应用还在探索期,没有人认真思考过堵塞攻击的攻防,这对未来应用的发展十分不利,想想当年FOMO3D的结局,希望不要在DeFi行业发生。 我们以此文提醒行业,小心堵塞攻击,在开发应用合约时,尽可能用各种巧妙的方案来争取“一笔交易的胜利”

3QjuuuN.jpg!web

作者:NEST爱好者_九章天问

如果问我区块链上,有什么攻击是不可避免的,我会回答: 堵塞攻击和51%攻击 。51%攻击我们下次再谈,今天单论这堵塞攻击。

所谓堵塞攻击,是用交易占据区块,使其他人的交易无法打包。

有人把堵塞攻击比作区块链上的 DDOS攻击 :不是寻找系统漏洞,而是“合规”地占用资源,令系统停摆。二者确有相似之处,抽象出来:一是“合规”,即攻击是系统允许的;二是非漏洞,即任何系统都可能被攻击,再完美也一样;三是抢占资源,攻击者占用系统资源,其他人被动排除在外。

仔细看这些特点,似乎并不是一个纯粹的技术问题,也不是一个单纯的安全问题。 堵塞攻击是一个经济学问题,或者博弈问题 。现以以太坊网络为例,我们先研究堵塞攻击的最佳逻辑,其次则研究对抗堵塞攻击的思路。

ZRz6fuA.jpg!web

假设一个区块的gaslimit上限是1000万,最小的单笔交易是2万, 则堵塞一个区块有两种方案 :第一种是用大量高gasprice的小型交易区堵塞区块;第二种是用一笔高gasprice的大型交易(这里大型和小型是以gaslimit来度量的,大型交易是尽可能占满整个区块的交易,如gaslimit为1000万)来堵塞。比如gasprice都是1000(312 以太坊网络拥堵的情况下,保证迅速打包的gasprice也在1000倍以内),则两种方案计算出来的gas成本是一致的,这是从自己的立场出发计算的结果。

但从矿工和竞争者的角度看,二者是有差异的。

先说竞争者,即希望突破堵塞攻击的交易者。如果是小型交易,则竞争者完全可以通过一笔更高的gasprice,抢在攻击者之前打包,比如用2000的gaceprice去竞争,原则上一定排在诸多的gasprice为1000的小型交易前面;但对于一笔大型交易,由于矿工考虑最大化gas的组合,而不是最高gasprice的交易优先,则竞争者可能就被阻挡在外。这是因为,大型交易的总gas为1000万 1000,而包含小型交易的gas为2万 2000+其余交易,这里其余交易是备选的第三方交易,一般gasprice较低。在这两个交易组合里,理性的矿工会选择大型交易的组合,从而使竞争者即使出了更高的gasprice,由于其单笔交易的gas较低也会被排除在外。 因此堵塞攻击从有效性来讲,高gasprice的大型交易更有优势

根据当前以太坊网络的交易情况,一个1000倍gasprice的大型交易的手续费为,1000w * 1000=10 ETH,以来堵塞一个区块,那么堵塞10分钟的成本在500ETH。 如果外部激励足够大(外部激励即当前行为之外的奖励),堵塞1个小时也就是3000ETH,这很可能是值得的 。注意到,1000倍gasprice只是基于一个统计数据的假设,并没有基于一个链上应用来分析。

7j6nYny.jpg!web

考虑一个链上应用,比如 DeFi,其经济性存在对区块的依赖,即在N个区块内,需要完成一笔交易,否则会造成X个ETH的损失。如果该应用不做任何设计的话,按照之前的假设,10 * N 个 ETH 的堵塞攻击即可造成X个ETH的损失。这里有几种情况:1.X个ETH的损失可以变成攻击者的收益, 则当X>10N时,攻击便是一种完全理性的激励 。2.X个ETH的损失并不能变成攻击者的收益,则此种情况和X<10N一样,便成为一种恶意行为:通过破坏该应用的有效性使得资产从该应用中流出。

这两种情况应当分开考虑应对方案,但不管哪种情况,核心是如何使得堵塞攻击失效:总有一笔交易能够在临界条件触发前完成,这就是我们说的“一笔交易的胜利”。

对于第一种情况,应用需要做两种设计:首先应当根据经济规模或某种异常条件提升N的大小,变成N1;其次提升完成一笔交易的激励收益:比如完成一笔交易的收益从a个ETH提升到b个ETH,其中b>a,并且b>10eth,即堵塞一个区块的成本变成bETH,总成本从 10 NETH 变成 b N1ETH,只要 b * N1ETH > X,则攻击的外部激励失效。

RJnENf2.jpg!web

对于第二种情况,应对恶意攻击的最好办法,即是安排一种停机机制,包含两种含义: 其一是攻击造成的成本几何级数提升,使得攻击者无法达到目的,从而放弃攻击,比如NEST系统的beta系数设计,是目前区块链行业内第一个内置停机系统的设计,我们可以借鉴,比如让临界区块数N可以级数提升 。其次,根据“一笔交易的胜利”难度自动调整应用的可执行性,当完成“一笔交易的胜利”变得非常紧迫时,可以让应用暂时不能执行,使得攻击者失去了攻击目标。这两种安排由于比较开放,需要更深入的边界条件的分类研究。

当然,以上分析都是假设矿工是完全理性且只考虑打包的gas收益,不考虑可能的黑名单、自愿牺牲部分利益抵制堵塞攻击等行为,通过这些人性化的安排,也可以间接实现抗攻击的目的,但我们更倾向于在应用端进行设计。

由于当前链上应用还在探索期,没有人认真思考过堵塞攻击的攻防,这对未来应用的发展十分不利,想想当年FOMO3D的结局,希望不要在DeFi行业发生。 我们以此文提醒行业,小心堵塞攻击,在开发应用合约时,尽可能用各种巧妙的方案来争取“一笔交易的胜利”

本文参与登链社区写作激励计划 ,好文好收益,欢迎正在阅读的你也加入。

  • 发表于 13分钟前
  • 阅读 ( 10 )
  • 学分 ( 0 )
  • 分类:安全/漏洞

About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK