从白皮书的视角看“隐藏链”和“双花”
by Steve Shadders
8月 13, 2021 (1min read)
简介 Bitcoin SV最近遭到了攻击,攻击者拥有大量算力,试图骗取价值数百万美元的BSV。像这样的事件总是迫使...

简介

Bitcoin SV最近遭到了攻击,攻击者拥有大量算力,试图骗取价值数百万美元的BSV。像这样的事件总是迫使你以全新的方式重新思考比特币的基础和原理。

本文将概述攻击过程和为抵御攻击所做的动员和努力,讨论为了促成最终积极的结果而采取的应对措施。我们还重新审视了比特币白皮书,探寻在这样的攻击场景下应该如何正确的回应。

简而言之,我完全相信矿工会按照白皮书的指引行事。我比以往任何时候都更有信心,即便面对攻击者拥有压倒性优势算力的情况,比特币也依旧牢固且有生命力。

背景

第一次攻击

2021年6月24日,BSV主网发生了4个区块的重组,看起来与使用Hat­­hor协议聚合挖矿的新矿工“Zulupool”有关。当时,它们的节点有着大量的算力但连通性不好,所以区块重组只是个意外。Bitcoin SV基础架构团队联系了该矿工,希望提供技术支持以改善他们与其他矿工的连通性,但没有收到回复。

7月的第一周,又发生了多次类似长度的区块重组。我们再次联系了Zulupool,但他们却表示这些区块并不是自己生产的。攻击者通过在coinbase交易中使用“Zulupool”的名字和支付地址来冒充他们从而混淆视听。我们认为Zulupool的说法是可信的,他们实际上并没有挖出与重组有关的区块,原因会在下文解释。

Bitcoin SV基础架构团队立即设置了检查双花交易的工具,同时联系比特币协会和BSV矿工,建立起合适的交流反馈渠道。比特币协会同时向各交易所发出预警,让他们留意和识别是否有可疑的双花交易。在第一次攻击后,我们就部署了工具来自动检测和通知交易双花,没有任何受害者联系我们告知他们遭受了损失。(后来从Bitmart数字资产交易所公开的法庭文件中了解到,攻击者通过将非法双花的BSV交易成其他币种,让他们受到了损失。)

在这些工具准备妥当后,攻击者消失了数周。

第二次攻击

8月3日和4日,在三次不同的时间段,未知的恶意攻击者秘密挖掘了包含双花交易的隐藏链,这些双花交易涉及价值数百万美元的BSV。之后攻击者在BSV网络上一次性的公布了这些长度暂时超过诚实链的隐藏链。这次,攻击者冒充了诚实矿工TAAL。

响应

继上次攻击后,比特币基础架构团队做了充足的准备,因此这次欺诈区块被发布后几秒就被团队检测到了。我们迅速联系了愿意用自己的算力拒绝欺诈区块的已知的诚实矿工,最终抵御了攻击者的分叉,并成功防止了双花的发生。与此同时,比特币协会联系了诸多交易所,告知他们正在发生的事情,并建议他们采取保护性措施,让他们与大多数矿工的做法保持一致。

在8月3日和4日三次试图从交易所盗取资金都失败后,攻击者最终放弃了尝试,他们显然已经意识到,诚实的矿工会拒绝包含双花交易的隐藏区块。

注意到在此期间,比特币协会发布了诚实矿工用来拒绝攻击者先前隐藏的、包含了双花交易的区块的命令。众所周知,诚实矿工可能需要一些时间才能超越攻击者的链,这也为其它(非矿工)Bitcoin SV节点运营商(例如监听区块的应用)提供了一种机制,可以选择跟随大多数诚实矿工在期望能成为最长链上持续构建的链。第二次攻击没有发生双花。攻击者花费了大约20万美元,希望能通过欺诈获得更大的经济收益,但未能如愿,最终损失了20万美元。与此同时,网络一直畅通无阻,不仅处理的交易量破了纪录,甚至还诞生了创纪录的1GB区块。

比特币白皮书对矿工行为的

负责执行比特币协议规则的矿工,应根据比特币白皮书中定义的“先见原则”(first seen rule),适时采取行动拒绝无效交易和包含无效交易的区块。

什么是“先见原则”?

“先见原则”就是以“最先被看到”为原则。

当我们想决定一系列事件的顺序时,要进行直接观察来决定谁“最先被看到”。比特币区块链提供了一种机制,可以将对一组对等节点的直接观察,转换为一系列事件首次出现时的准确记录。

在讨论“先见原则”时,我们需要注意区分两种主观视角。

一种视角是在事件发生时参与者正在网络上活动。通过观察他们能直接掌握谁先出现的第一手信息。当两个相关事件发生的间隔时间很长(超过广播延迟)时,直接观察的结果是无可争议的。我们称之为“观察视角(point-of-view)”。

另一个视角是人们事后根据历史得出的结论。我们称之为“历史视角”。由于他们在事件发生时并未出现,所以无法直接观察事件发生的顺序,只能以节点通过最长区块链记录下的信息为依据。如果这些观察者像他们最近一样可靠的按照先见原则来产生记录,那么对于两个相关事件(双花)谁先发生的问题,“观察视角”和“历史视角”将给出相同的结论,这正是比特币的主要目的。通过顺序正确的记录,新加入网络的参与者可以准确的了解所有UTXO的状态,确保他们在之后确认比特币交易时,这些比特币都是存在的并且都是尚未花费的。

在加入网络时,如果网络中同时存在多个具有争议(相互竞争的区块包含了双花交易)的活跃链,新的参与者可能会对一小段“历史视角”产会困惑。但这种情况比较少见并且可以在短时间内解决。而且解决争议也仅与在此期间加入网络的矿工有关。其他的区块链监听者依旧只需要进行观察,因为他们并不参与创建记录。与此同时,对于绝大多数没有争议的交易,即使在这个窗口期产生,也依旧是清晰和明确的。

有趣的问题是,比特币白皮书是否描述了“观察视角”或“历史视角”。 这引出了另一个问题:是否应该接受包含明显错误记录的更长的链。如果白皮书描述了“观察视角”,那么毫无疑问,节点应该拒绝不正确的记录(区块)。只有当你无法知道事件发生的顺序必须依赖节点共识时,才需要“历史视角”。

我自己的理解是,白皮书描述了一种将“历史视角”转换为可信记录的机制,从而形成十分准确的“历史视角”数据。

试想,如果“历史视角”是决策机制,那么白皮书中的好几处陈述都无法自圆其说。比如下面的几段内容。

1节:简介

目标:

“一个点对点的分布式时间戳服务器对交易产生的时序生成可计算的证明”

注意到在生成时序证明之前,必须先通过对事件发生时的主观观察来确定事件发生的先后顺序。大多数节点在当时接受了这些观测结果(以区块的形式)就是一种确认,意味着这些观测结果是正确的,并且被当时网络中活跃的大多数观测节点所认同。

利用点对点现金系统欺诈的定义:

“在计算上无法逆转的交易将保护卖家免受欺诈”

也就是说,交易在接收和接受后发生逆转,被作者视为欺诈。

2节:交易

双花交易出现时对有效交易的定义:

“我们需要一种方式让收款人知道以前的所有者没有签署任何更早的交易。就我们而言,最早的交易是最重要的交易,因此我们不关心后来的尝试双花的交易。”

请注意,最长的区块链中不可能出现同一笔交易的两个版本。仅从区块时间戳也不能确切的断定两个竞争区块实际谁先产生或谁先公开广播。因此,这里的“最早”一词仅适用于当时网络上活跃节点主观观察到的结果。

没有对区块中的交易赋予特殊权重或其他考虑来改变和覆盖“最早”的概念。

公开广播的必要性:

“确认没有漏掉交易的唯一方式就是知道所有交易”

“所有交易”包括已确认的和未确认的交易。

“为了在没有可信方的情况下实现这一目标,交易必须被公开”

这种公开广播至关重要,它让网络上所有的活动节点都能进行主观观察,这使我们回到……

回到“目标”:

“收款人需要证据,能证明当时大多数节点都认同这个交易他们是第一次收到”

从收款人的角度来看这很重要,因为他们需要确认自己收到的比特币是有效的。

再次重申,以双花事件发生时网络中活跃节点的主观观测结果为依据,才有可能达成这个目标。这正是交易必须被公开宣布的原因。

5节:网络

网络定义的说明:

“新交易被广播到所有节点”

这非常明确。在广播交易的同时隐藏相同交易的冲突版本违反了这条规则,而且定义明确说明了广播的交易是有效的,隐藏的交易是无效的双花交易。

区块必须被广播:

“当节点找到了区块的工作量证明,就广播给所有节点”

这条规则明确了何时需要广播区块。就是在找到一个有效的工作量证明并生成有效的区块头后,立即执行。

有效区块包含的交易(里的资金)必须尚未花费:

“只有当区块中的所有交易都有效且尚未花费时,节点才会接受该区块。”

正如我们之前看到的,“尚未花费”是从观察者角度的描述。如果他们之前观察到了跟新区块中任一交易相冲突的交易,则该区块无效。

区块竞争:

如果两个节点同时广播了下一个区块的不同版本,其他节点收到这些不同版本的区块的顺序是不同的。在这种情况下,他们会基于先收到的区块继续构建,但同时会保存其他分支以防止它在之后变得更长。当找到下一个工作量证明并且某个分支变得更长时,这种关系就会被打破;在其他分支上构建的节点就会切换到更长的链上。”

中本聪在本节没有说明隐藏竞争区块的情况,而只讨论了几乎同时广播的竞争区块。在截然不同的时间点看到竞争区块的场景,仅在白皮书中抵御网络攻击的章节里有所讨论。

11节:计算

比特币白皮书明确了挖掘隐藏的区块链是不诚实的:

交易发出后,不诚实的发送者会开始在包含该交易替代版本的平行链上秘密挖掘

秘密挖掘区块的矿工被认为是“攻击者”:

“了解攻击者现在仍然可以追赶上的概率……”

12节:总结

我们在这里又看到了对比特币目标的描述

“为了解决这个问题,我们提出了一个使用工作量证明的点对点网络来记录交易的公共历史,从计算能力的角度考虑,当诚实节点控制了大部分CPU算力时,这些交易就无法被攻击者逆转。”

时间戳服务器的目的是防止“攻击者”更改在事件实际发生时,网络中的大多数节点都主观观察到并已认同的 “公共”历史记录。这些记录包括被观察到的事件(交易和区块)的出现顺序。这并不意味着成功的隐藏区块攻击应该被视为“诚实的”记录,尤其是在事件发生时链上活跃的每个人都知道它是不诚实的。

有效的区块:

“他们用自己的CPU算力投票,通过努力延长有效区块来表示自己接受了这些区块,并拒绝在无效区块上构建”

这回到了有效区块的定义。我们已经从第5节了解到:有效的区块只包含有效的交易,还从第2节了解到:有效的交易一定是当时诚实的参与者主观观察到的任意一组双花交易中最先被看到的交易。

最后让我们跳回到摘要的最后一句话

“节点可以随意离开和重新加入网络,接受最长工作量证明的链作为他们离开后的网络事件的证明”

当你不在场时接受最长工作量证明的链作为网络事件的证明,和你身处事件发生过程中明知最长链无效却依然接受它,这两者有着明显的区别。第1节中概述的目标是生成这样的证明,并且当时处于活跃状态的节点有责任生成该证明。白皮书明确指出,无效的历史应该被意识到它们无效的节点拒绝,并在其位置写入正确的历史,确保正确的历史可以成为最长工作量证明链的一部分。

这正是攻击发生时,那时所有诚实的矿工所做的事。

代码不是法律也不是比特币的定义

比特币是一个描述预期行为的经济系统。因此软件和算法不会改变和覆盖这个特性。软件本身是算法的一种实现,它会在几乎所有的情况下自动执行预设的目标,但算法从来都不是完美的。在具有对抗性的系统中,尝试用算法对规则编码可能会导致该算法被有违本意的利用,被别有用心的人用来攻击系统。现实情况是,有些规则也很难以预防攻击的方式编码。

根据规则编码来自动检测包含双花交易的区块并孤掉这个区块便是一个例子。为了这个目标,我多次尝试定义一个可行的规则集,这对于一般场景很容易做到,也会很好的保护用户,但这可能被攻击者利用,用精心策划的攻击让区块链分叉。

即便是先见原则本身,在网络延迟下也很难可靠的编码,虽然在大多数情况下可以通过代码强制让区块竞争来解决,但涉及多组双花的复杂情况可能会引起两组节点的持续不一致,最终导致永久分叉。我非常确信这就是为什么最初的比特币会按当时那样的方式编码,而不是在毫秒级的时间内鲁莽的强制执行这个规则。

关键的一点是,代码并不完美,有时候需要人为干预。这在比特币的整个历史中都发生过。比特币的目标是对网络上发生的事件产生永久和可靠的记录。为了实现这个目标,节点需要观察、记录并在必要时人为干预以确保记录准确且没有欺诈。矿工们可以独立的执行这些操作,几乎不需要协调,因为面对真相大家都能相对容易的达成共识。

这些记录超越了区块链中记录的内容本身。这些记录可以很好的作为过去事件进一步发展的证据。匹配数百台独立机器的日志文件是一个更加手动的过程,但该证据同样有用。

MinerID的作用

近期有很多问题和讨论聚焦于MinerID在应对近期攻击时起到的作用。我们看到的不寻常之处在于,攻击者冒充了其他矿工(Zulupool和TAAL),甚至还使用了这些矿工的支付地址。TAAL被假冒是很明显的,因为按照惯例TAAL会用自己的MinerID对他们挖掘的区块签名,所以大量未签名区块的出现就是一个危险信号,表明TAAL被冒名顶替了。这个方法正好可以更容易的识别攻击者的区块。

MinerID 可以为矿工积累来之不易的工作量证明声誉,在帮助用户与矿工建立信任方面发挥更多的作用。未来,它将确保矿工在遭受攻击或遇到其他关键的网络事件时,彼此之间拥有快速可靠的通信渠道。

有关 MinerID 的更多详细信息请参考:https://github.com/bitcoin-sv-specs/brfc-minerid

未来如何进行响应

这次的响应虽然有效且可以复制,但还能进一步优化。可以改变Bitcoin SV节点软件的一些默认行为,还有许多其他的缓解措施、工具以及操作流程等。

众所周知,出于安全方面的考虑,这些措施将在部署完成后才会公开,以避免暗示出潜在的攻击向量。比特币基础架构团队中许多优秀的人一直在研究这些问题,并且会持续的做下去,直到把我们从这些事件中得到的经验和积累,都转化为行动和代码响应。

这次事件反映出的主要问题之一,是我们需要主动监控网络上的事件,需要有经验的人参与进来,需要企业用户间保持健壮的沟通渠道。任何有价值的金融系统都配套了全天候不间断运行的运营中心和监控系统。Bitcoin SV网络上已经有了这些设施,并且现在的系统监控能力更强也更具关联性。

总结

比特币白皮书从根本上描述了比特币协议正常运行所需的一系列行为。其中大部分可以通过算法实现自动化,并且随着时间的推移其自动化的程度也越高。当算法被恶意利用但未发现潜在的攻击向量时,用算法表达规则的做法便不总是可行的,这也是为什么偶尔需要人工判断和人为干预。比特币并不是代码,它是多个独立的参与方按照规则集行事的一个系统,在这个系统里,参与方会集体拒绝破坏规则的其他参与方。

Articles-zh