袁超
(四川大学电子信息学院,成都610065)
区块链技术近年来得到迅速的发展和广泛的应用。作为区块链技术的底层实现,中本聪提出的分布式记账系统比特币,可以在无权限设置的情况下利用POW(工作量证明)达成共识。但是比特币的缺点也很明显,在比特币中,块大小限制为1MB,平均块挖掘时间为10分钟。单个事务的大小在200字节到1K字节之间。在这些限制下,比特币每秒只能验证3-7个事务[1],存在严重的网络拥堵情况。为了解决该问题,一方面,比特币Core开发组提出了隔离验证[2]和闪电网络[3]锁定区块大小为1M的解决方案,另一方面,BitcoinABC开发组认为隔离验证和闪电网络确实是不错的技术,但并不是成熟的技术,解决不了现阶段比特币网络拥堵的问题。把区块大小锁定为1M也让主链变得毫无价值,闪电网络也会导致非常严重的中心化问题。主张将区块大小进行扩容,将区块上限由1MB提升为32MB。然而这些大区块支持者中的激进派发现在比特币上实现大区块无望,Core开发组是不会做出妥协的。一些开发者决定在2017年8月1日对比特币进行硬分叉创造一种新型的数字货币——比特币现金BCH。BCH修改了比特币的代码,删除了隔离验证(SegWit),取消了区块大小1M的限制,提升了交易速度、降低转账费用。这产生了比特币的第一次硬分叉,并诞生了BCH(比特币现金)。
历史总是有惊人的相似之处,仅仅15个月后,BCH的硬分叉也已经到来。实际上,这两次硬分叉,都是源于社区的分裂。而两次社区分裂的背后,都是改革派与“原教旨主义派”之争。这一次改革派,是比特大陆为首的Bitcoin ABC社群阵营。“原教旨主义派”,是CSW(Craig Steven Wright)主导的Bitcoin SV社群阵营。比特大陆投资的Bitcoin ABC开发团队认为,在维持区块大小在32MB的情况下,应该让BCH往基础建设公链发展。这样一来,BCH便能像以太坊一样,开拓出更多应用场景。以CSW主导的Bitcoin SV社群阵营,则希望BCH仍像当年中本聪论文描述的那样,对操作码严格限制,专注在转账交易本身,并希望将区块最终扩容为128MB。最终,BCH于11月16日进行了分叉创建出bchabc和bchsv两条平行的区块链,然而过程并不顺利,在分叉期间整个区块充斥着粉尘交易攻击,会影响矿池的内存池,从而导致大量的事务堆积和更高的采矿费。更为严重的是重放交易攻击。是主链分叉时候出现的一种特殊情况,分叉中两条链上的地址和私钥算法相同,交易格式也完全相同,导致在其中一条链上的交易在另一条链上很可能是完全合法的。所以当在其中一条链上发起的交易,放到另一条链上去重新广播,可能也会得到确认。导致同一笔数字货币产生了两次交易。
现有的研究中目前存在的论文主要是针对51%攻击造成的重放攻击,并提出解决方案,对于分叉过程中的重放攻击最直接的方法就是分叉后对不同的链上的财产进行转移,不要存在分叉前的地址里。对于警惕性较低的用户目前存在较大的威胁。
对于粉尘攻击,现有的研究中暂未出现相关的论文,解决粉尘攻击需要矿工们达成共识,拒绝打包交易量过低的垃圾交易,为了区块链的价值更多地打包有意义的交易。然而目前并没有一套有效的共识方案来解决这个问题。为了区块链的健康发展,需要对矿工节点进行改进。
2008年,中本聪提出一种完全通过点对点技术实现的电子现金系统(比特币)。该方案的核心价值在于基于工作量证明的解决方案,使现金系统在点对点环境下运行,并能够防止双花攻击。如今比特币已经诞生十年,大量数字货币诞生,但对双花攻击的讨论仍然停留在比特币51%攻击上。研究发现,数字货币双花攻击还有很多种形式。本文介绍硬分叉途中产生的双花攻击,即区块链上的重放攻击,如:在BCH分叉完成后,BCH ABC公链出现3笔总计超5,000万USDT超大额转账。凌晨02:41,开头为qqfq7hhtp的地址向开头为qzemyvck5的地址转帐48009枚BCH;凌晨3点13分,开头为qzdr8muc9的地址收到开头为qr8e7zcay等地址转来的80000枚BCH。值得一提的是,安全人员监测到这两笔大额转账在BCH SV公链上存在同样交易,并且第一笔的交易哈希值完全一样。此次双花攻击并没有调用51%的算力,但是依旧会产生双花。与区块链内发生的重放攻击51%攻击不同,这是存在分叉币的情况下才会出现的重放攻击。在进行分叉产生新币之后,代码修改较少,导致在其中一条链上的交易在另一条链上很可能是完全合法的。所以在其中一条链上发起的交易,攻击者可以复制到另一条链上重新广播,也会得到确认。这就是区块链特色的“重放攻击”。
普通用户在主链分叉为两条链时,同时拥有两条链的资产,分叉链上的重放攻击可能导致一条链上的资产被盗取。在交易所中的分叉币之间,不断存取一种币,可能会导致另一种分叉币无故流失,这也可以通过重放攻击实现。图1描述了对用户账户的重放攻击。
图1 在分叉链上进行的重放攻击
由于硬分叉的特性,普通的用户账户会得到空投的分叉代币,攻击者通过在分叉区块链上重放交易,从而在未经用户许可的情况下获取用户的分叉代币。
在观察区块链BCH分叉过程中,除了重放攻击外,还存在一种区块链的攻击——粉尘攻击,恶意用户使用低价值的粉尘交易充斥网络,使矿工的mempool被快速占用,导致新的正常交易转发到矿工节点时无法处理,造成区块的长时间堵塞;与此同时,为了抢占交易被打包的机会,市场会自发抬高交易手续费。
由区块链浏览器数据显示,BCH在区块高度556767处发生分叉。由于持续不断的粉尘攻击,区块大小明显扩大,矿工节点mempool和采矿费大小呈正相关扩大。通过绘制图来说明交易数量,mempool大小和平均交易费的关系,显示攻击的效果。这些数据是通过爬取2018年11月6号556734区块到556833 bch区块浏览器上记录的区块大小,支付给矿工平均费用和mempool大小,通过简化,数据范围在[0-1],并绘制出交易数,mempool和采矿费的关系图。如图1所示。
从图2中可以看出粉尘攻击造成的高交易数和mempool大小、采矿费正相关。可以看出粉尘攻击造成的影响是合法的用户提出的交易在攻击期间将支出更高的采矿费,此外还会导致整个区块的堵塞,需要确认的交易将由于区块堵塞停留在区块链中。
图2 交易数、mempool和采矿费
实现粉尘攻击有多重手段,有的是作为交易的发起者,在全网发送很多手续费高,但是转账金额非常小的无意义交易,矿工就会优先打包这些交易,从而堵塞区块链,此攻击成本较高,技术要求较低,此次硬分叉期间就存在大量的高手续费的无意义交易。还有一种成本较低的攻击方案,攻击者拥有比特币网络中的一个完整节点,在其机器上有完整的区块链和一个mempool,假设攻击者钱包中的余额足够大,可以分成大量的小额交易,每个小额交易都能支付采矿费。攻击者还控制了一组sybils账户(被恶意操控进行协同攻击的虚假账户),每个账户都有多个公共地址,攻击者和sybil账户知道彼此的公共地址。此外攻击者和sybils有客户端软件和脚本[1]能够发起大量的“原始交易”[2]。当具备这些条件后,将完整节点中挖掘出来的交易都分散输入进sybil的UTXO(未花费的交易输出)里,然后,所有的sybil账户都会生成“原始交易”以最小的价值进行相互交换。交易率将远远高于网络的吞吐量,导致交易积压,从而增加了mempools的大小。
重放攻击能成功的关键在于,两条分叉链的代码修改较少,同一条交易可能在两条链上都是合法的。
比较高效的解决方案是开启重放保护,通过添加随机数、时间戳,或者流水号,在两条链间形成保护,让一条链上的事务在另一条链上无效被识别,以确保两条数据共享链保持独立运行状态,并防止两链间出现相互多次识别的情况。所以在区块链发生硬分叉时除了用户对链上的财产进行转移之外,还可以通过开启重放保护的方式防御。
为了对抗粉尘攻击,提出一系列对于采矿节点的改进。当采矿节点正常运行时,接收incoming transactions并存入mempool,当检测到 incoming transactions异常增多时,不直接存入mempool,而是存入本地缓存,进行筛选。由于不同区块链的大小不同,能够抵御粉尘攻击的程度也不同,bch区块最大容量8MB,大约是40000笔交易。btc区块最大容量1MB,大约3000比交易。由于单笔交易大小范围在100byte-4000byte不等,以区块容量的变化速率作为是否受到粉尘攻击的标准,2018年11月6号发生粉尘攻击开始时区块556765至556767中交易数由952迅速变成13202后变成20861,区块大小也由0.3MB迅速变成4MB,所以本防御方案设定当检测到区块大小变化超过5倍时(倍数越小检测越严格),判定为可能受到粉尘攻击。或者区块大小达到最大容量80%时判定可能受到了粉尘攻击。同样当发现区块大小变化缩小超过5倍,或者区块小于最大容量20%时判断为恢复到正常区块状态。当判定疑似遭受粉尘攻击时,将incoming transactions存入缓存,并筛选。
筛选方法上,首先检测incoming transactions是否属于无意义交易(发起人与接收人一致),如果属于无意义在区块拥堵结束前将不会转入mempool,在剔除掉无意义交易之后,提出了三种进一步筛选设计:基于费用、基于确认数,以及基于验证码的筛选设计。
(1)基于费用的设计
在基于费用的设计中,针对攻击者的两种攻击策略,对转发费和采矿费设置最低和最高的阈值,最低阈值可以通过允许接受低手续的粉尘交易来抵制攻击者的策略,最终目的是将其挖掘到区块中。最高阈值可以过滤掉高手续费的粉尘交易来抵制攻击者的策略,过滤掉攻击者的粉尘交易,从而减少mempool的大小。主要设计流程如图3所示。
图3 基于费用的设计
(2)基于确认数的设计
在基于确认值的设计中,主要针对的是攻击者低手续费的攻击策略,如图4所示对每个传入的交易,计算其父交易的数量,设置average age并将其初始化为0,接下来,通过每个父交易的确认数总和除以父交易的总数来计算事务的平均确认数。对每个进入的交易获得平均确认数之后,申请一个mempool上的最小平均确认数过滤器,最小平均确认数可以取任何大于0的数。根据比特币开发者指南[3],确认数为6时被认为是最合适的。任何交易只有满足最小平均确认数,才会被mempool接收。通过这种方式攻击者控制的采矿节点和Sybil节点生成的所有未确认交易将会被mempool拒绝,如果攻击者仍想要对网络进行粉尘攻击,将不得不开采自己发出的所有交易并等待获得符合要求的确认值。因此,这增加了攻击的成本并且减少了可以发起攻击的时间窗口。
图4 基于确认年龄的设计
(3)基于验证码的设计
在基于验证码的设计中,主要是针对攻击脚本的防御,当采矿节点接收到由普通账户发起的交易时,为了保证是用户发起而不是攻击脚本批量发起,需要向账户客户端发送6位的随机验证码,只要用户接收到验证码并将验证码正确的返回给采矿节点,采矿节点便将交易转入mempool。通过添加一步验证码的方法,使攻击者的脚本失效,从而使攻击者发起的粉尘攻击无法进入mempool。流程设计如图5所示。
图5 基于验证码的设计
进行了三个实验分别测试三种方案的防御效果。生成了1800个符合区块链格式的交易,其中300个是发起者等于接收者的无意义交易,300个是高额采矿费率的恶意占用区块资源的交易,300个是以最低费率恶意占用mempool的交易,剩余的900个合法交易采矿费分布在最小和最大采矿费的范围内。
使用混淆矩阵,把合法交易定义为正面,恶意交易定义为负面,分别统计了不同采矿费率下,不同平均年龄下的TP TN FN FP并计算出精准度,准确率和召回率,如图6-图8。
图6 基于采矿费的设计
图7 基于平均年龄的设计
图8 基于验证码的设计
在丢弃粉尘攻击数量上,基于验证码的设计效果最好,并且对合法用户影响最小,但是实现较麻烦,需要同时改进采矿节点和SPV钱包节点。
在设计上更容易实现的是基于采矿费的设计和基于平均年龄的设计。当攻击不严重时,基于费用的设计在mempool大小的优化中更有效,但是,会影响攻击者和合法用户。当攻击严重时,基于时间的设计帮助合法用户同时丢弃最大量的粉尘交易更有效。
在本文中,提出了区块链硬分叉中的重放攻击和粉尘攻击,其中重放攻击最有效的应对方法是在硬分叉前通过随机数、时间戳,或者流水号区分开两条区块链。对于粉尘攻击设计了三种防御方案,其中基于验证码的设计,对粉尘攻击防御效果最好,但兼容性较差。相对兼容性较好的基于费用的设计和基于平均年龄的设计中,当攻击不严重时基于费用的设计防御效果更有效,但是会影响正常用户,相反当攻击严重时,基于时间的设计防御效果更有效。