比特币:比特币安全吗?深入探索比特币的安全模型

人们在讨论不同密码学货币的共识机制时经常会产生争议,主要是因为他们对这些密码学货币用来保护账本历史数据的安全模型缺乏了解。虽然每个共识机制的安全模型旨在防范各种理论上的攻击,但是了解这些模型的目的非常重要。

安全模型可以分为两个部分:假设和保证。如果用作输入的假设成立,则安全模型输出的保证也应成立。

让我们来深入探索比特币为其全节点运营者提供的安全模型。

求真

“用户间信任需求最小化是比特币的优势之一。我个人甚至认为这是比特币最大的优势。”——PieterWuille

分布式账本旨在提供有序的事件记录,因为在分布式系统中你不能单纯地信任时间戳。

新的参与者刚加入一个区块链网络时,会从软件硬编码的创世块开始下载所有可获得的区块,然后鉴别整条区块链的有效性。

比特币安全模型最重要的假设之一是绝大多数矿工都是诚实的——他们在努力保护区块链的安全性,而不是试图破坏它。实际上,纵观比特币的发展史,得益于有效的矿工激励机制,这个假设至今未被打破,虽然已经有人怀疑它能否长期保持。

有了这个假设作为前提,全节点运营者完全可以确信:

除矿工之外没人能增发比特币,而且比特币的供应量会严格按照发行计划表增加。

没有私钥就无法花费对应的比特币。

没有人可以重复花费同一笔比特币。

在比特币区块链强有力的保证下,全节点运营者还可以确信以下两点:

任何比特币区块都是在其时间戳的大约两小时内创建的。

他们正在同步的是“真实的”区块链历史。

从技术层面来讲,比特币区块需要经过大量检查:

所有区块都遵守共识规则:

每个区块都与其父块相连

每个区块都达到目标难度值,并且有充足的工作量证明

区块时间戳位于与上一最新区块之间的时间窗口内

默克尔根与区块锁记载的交易相匹配

区块大小不超过上限

每个区块的第一笔交易是coinbase交易

Coinbase输出不超过区块奖励

区块内包含的签名操作不超过许可范围

所有交易都遵守共识规则:

输入值和输出值都是合理的

交易只花费未花费输出

所有即将花费的输入都有有效签名

coinbase交易创建后的100个区块内,该coinbase交易的输出无法花费

当某笔交易仍处在区块确认的窗口期,其输出就不能花费

比特币全网未确认交易99,801笔:金色财经报道,据btc.com数据显示,目前比特币全网未确认交易数为99,801笔,24小时交易速率为3.93 txs/s。目前全网难度为18.67 T,预测下次难度下调1.84%%至18.33 T,距离调整还剩9 天 12 小时。[2020/12/19 15:43:31]

篇幅有限,其余规则不作赘述

热力学安全性

区块内的交易一经确认无法回滚,除非有人花费大量能源重写这条链。

只要没有攻击者拥有全网50%以上的算力,且诚实的节点可以快速通信,发生交易回滚的概率就会随着交易确认次数呈指数级下降。其它类型的攻击虽然没有这么高的能耗需求,但是实施起来很难。

来源:《比特币安全模型回顾》

从比特币矿工当前的累积工作量来看,攻击者需要计算出将近10^26个哈希值,才能从创世块开始构建出一条累积工作量证明更多的链。全节点会将这条链视为“合法”的链。

来源:http://bitcoin.sipa.be?

我们来计算一下51%攻击的成本:

一台蚂蚁矿机S9的功耗是0.1J/GH。

10^26?hash*0.1J/10^9hash=10^15?J

10^15?J=2,777,777,778kw/h*\$0.10kw/h=$277,777,778

撰写本文时,一个区块必须达到?253,618,246,641的目标难度值,这大约需要:

253,618,246,641*2^48?/65535=1.09*10^21?hash

1.09*10^21?hash*0.1J/10^9?hash=1.09*10^11?J

1.09*10^11J=30,278kw/h*\$0.10kw/h=$3,028

因此,我们可以说比特币具有热力学安全性。

你可以调整上述计算中的一些变量来降低成本,但我们可以肯定的是,仅重写整条区块链就需要价值数百万美元的电力。然而,在最坏的情况下,拥有如此强大算力的攻击者能够将交易回滚至2014年——我们很快就会深入探究其原因。

火币研习社:美元贬值预期加剧或为本轮推动比特币上升主要动因:比特币晚间尝试突破15000整数关口,最高冲高到了14999.9USD。目前美国大选拜登获胜的概率较大,市场对于外部环境动荡的担忧情绪已有所减弱,对后市方向态度统一。拜登为首的民主党准备了巨额财政刺激方案,市场对美元贬值预期加剧,美元指数出现跳水行情,或为推动比特币上升的主要动因之一。目前行情属于高位横盘之后的第二次突破行情,短时可能会有一些获利盘抛压造成的波动,但是上升趋势已经形成,并且前期所有阻力位已经突破,市场可能会进一步再创新高后,才会出现较大幅度的整理。短时持续关注上方15000整数关口的多空争夺。火币研习社提醒投资者注意风险控制。[2020/11/6 11:45:39]

另外请注意,购买和运行矿机所需的成本并未考虑在内。

抗女巫攻击

由于比特币协议认为累积工作量证明最多的链才是合法的链,新加入网络的对等节点只需与另一个诚实的对等节点建立连接,就可以找到合法的链。

这也被称为抗女巫攻击,这意味着攻击者无法通过运行多个不诚实的对等节点来向某个对等节点提供虚假信息。

上图显示了一个近乎最糟糕的情况:你的节点遭受了大规模女巫攻击,但是依然与一个诚实的节点保持连接,就可以通过这个节点连接至真正的区块链。只要有一个诚实的对等节点将真实的区块链数据传输给你的全节点,你的节点就会识破那些试图你的女巫攻击者,然后将它们忽略。

实时共识

当你的节点同步至区块链顶端时,你就会发现比特币协议通过其它一些有趣的属性来维护全网共识。

《比特币和其它密码学货币的研究视角及挑战》的作者指出,以下特性对密码学货币的稳定性来说至关重要:

最终共识。在任何时候,所有遵守规则的节点都要就最终的“合法”区块链的最新一个区块达成共识。

指数级收敛。深度为n的分叉的概率是O(2?n)。这使得用户坚信他们的交易可以在“k次确认”后得到永久结算。

活性。新区块会不断生成,支付适当交易费的有效交易会在合理时间内被打包上链。

正确性。在累积工作量证明最多的链上,所有区块内包含的交易都是有效的。

公平性。拥有全网总算力X%的矿工可以挖出大约X%的区块。

论文作者指出,比特币看起来具备上述特性,至少是在假设大部分矿工都保持诚实的前提下。这就是区块奖励和工作量证明机制想要达到的目的。

观点:比特币购买力没增加,不影响它抵抗扣押、审查和稀释:比特币咨询公司Bitcoin Advisory创始人Pierre Rochard刚刚发推称,“如果不认为比特币会上涨,就没必要囤积它”,这是一个普遍的误解,即使比特币的购买力没有增加,它仍然可以抵抗扣押、审查和稀释。基本面很重要![2020/6/23]

还有许多其它算法可以用来维护分布式系统中的共识,例如:

权益证明

币龄证明

质押证明

燃烧证明

活动量证明

耗时证明

联合共识

实用型拜占庭容错

上述算法创建了不同的安全模型——与工作量证明最明显的区别在于,基于这些算法的系统都是以消耗内部资源而非外部资源来达成共识的。受其影响,这些系统对网络中验证者的激励措施和信任需求各不相同,极大地改变了安全模型。

安全模型误区

一个常见的误区是,比特币有一个明确定义的安全模型。

事实上,无论是过去还是现在,比特币协议都没有一个正式定义的规范或安全模型。我们能做的最好的事情就是研究系统参与者的动机和行为,以便更好地理解和描述比特币的安全模型。

尽管如此,经常有人误解了比特币协议的一些特性。

一些区块链存在很严重的隐患,因为开发者在节点软件中增加了专断设定的已签名检查点,表示“开发人员已经确认区块X位于正确的那条链上”。这是一个极端中心化的单点问题。

值得一提的是,比特币有13个被硬编码的检查点,但是这些检查点并没有像被专断设定的检查点那样改变安全模型。最后一个检查点被添加到了BitcoinCore0.9.3内,区块高度是295000。这个区块的难度值是6,119,726,089,所需电力成本约为:

6,119,726,089*2^48?/65535=2.62*10^19?hash

2.62*10^19?hash*0.1J/10^9?hash=2.62*10^9?J

2.62*10^9?J=728kw/h*\$0.10kw/h=\$73

因此,如果女巫攻击者将一个新加入的节点围住,几乎不需要任何成本就可以在较低的区块高度创建较短的区块链,但是不能超过检查点。

如果女巫攻击者将一个节点从同步超过区块高度295,000的网络分离出来,就能以每个区块73美元的成本开始提供虚假区块,至少是在发生难度调整之前。但是,受害节点同步的区块链越长,攻击者创建一条累积工作量证明更多的链所需的成本越高。

GregMaxwell?和?PieterWuille?都表示,他们希望某天能完全移除检查点。BitcoinCore的维护负责人WladimirvanderLaan指出,对于那些想要了解比特币安全模型的人来说,检查点是经常产生困惑的根源。

动态 | USDT占比特币交易比重升至70.39%:据Cryptocompare数据显示,目前比特币交易情况按照交易币种排名,排在第一的是USDT,占比回升至70.39%;排在第二的是美元,占比为12.47%;排在第三的是QC,占比为5.26%;排在第四的是日元,占比为3.43%;排在第五的是欧元,占比为2.84%。[2019/6/7]

可以说,位于区块高度?295,000的检查点意味着,全节点“相信”?BitcoinCore开发者所说的2014年4月9日之前的区块都是有效的。但是,全节点依然会检查每个区块头里的默克尔哈希值,也就是说,交易历史的有效性依然受到工作量证明的保护。首次同步历史区块链时,这些旧的检查点可以改善性能,尽管libsecp256k1的引入让性能差异变得不那么明显。

检查点存在的目的主要有三个:

防止节点的内存被有效但低工作量证明的区块头占满。

跳过早期区块内的签名。

估量同步进度。

在撰写这篇文章时,GregMaxwell提出使用累积工作量证明检查来代替检查点。一旦节点成功同步了某条包含超过?5.4*10^24次哈希计算工作量的链,累积工作量证明较少的那条链就会被拒绝。这恰好与2014年9月创建的区块320,000的工作量大致相符,这时单个区块的难度值约为27,000,000,000。

来源:Blockchain.info

当难度值为27,000,000,000时,挖矿需要计算大约27,000,000,000*2^48?/65535=1.16*10^20次哈希函数。

1.16*10^20?hash*0.1J/10^9?hash=1.16*10^10?J

1.16*10^10J=3,222kw/h*\$0.10kw/h=\$322

因此,根据提议进行修改后,如果女巫攻击者将一个需要从头开始同步的全新节点完全包围起来,就可以从任一区块开始向这个节点发送虚假的区块数据,而且几乎不需要成本。如果女巫攻击者将一个已经同步超过区块320,000的节点完全包围起来,那么从区块?320,000开始向该节点发送每个虚假区块的成本是322美元。

简而言之,如果一个实体可以完全控制你的节点的网络连接,无论是采用哪种方式对节点的初始同步进行检查,攻击成本都相对较低;如果你的节点的网络连接不受任何实体的控制,就可以轻而易举地忽略来自攻击者的区块。

比特币再次猛涨至15800美元 是对之前深幅下跌的报复性反弹:根据bitfinex数据显示,美国时间26日凌晨3:00,比特币价格由13688美元开始上涨,凌晨5点后价格跳涨至15399美元,午后价格再度上涨至15950美元,之后价格维持在15800美元位置,截至美国时间27日凌晨3:00,比特币价格收于15744美元。

前几日比特币价格大幅下跌之后,市场对于比特币信心仍在,大部分投资者等待抄底入场,场外USDT价格一度创下新高,这表明大量投资者在等待机会买入比特币,因此此次比特币上涨并非偶然现象,是对此前深幅下跌的报复性反弹。[2017/12/27]

另外,每个区块链系统都将创世块硬编码到了节点软件中。你可能会觉得,“共享历史”是一种社会契约——一旦某个区块的历史足够悠久,网络中的所有参与者之间都会达成共识,认为这个区块永远都不会被回滚。当开发者选定一个早期挖出的区块并用它来创建检查点时,更多是作为一种公认的完整性检查,而非对历史的客观描述。

除了检查点之外,节点如何实现自引导也是一个问题。目前,比特币节点的自引导流程是检查节点是否在本地存储了之前从对等节点那里了解到的数据。如果没有的话,节点将查询一组被硬编码到软件中的“DNS种子”。这些种子负责维护一个连接良好的比特币节点的列表,并将这个列表返回给你的节点。

正如我们可以从代码中看到的那样,BitcoinCore?0.13目前使用由?PieterWuille、MattCorallo、LukeDashjr、ChristianDecker、JeffGarzik和JonasSchnelli?运行的DNS种子。任何人都可以使用?PieterWuille的比特币种子生成器软件或?MattCorallo的软件来运行DNS种子。但是,他们必须说服某个全节点实现的开发者将他们的DNS种子主机添加至对方的软件。

新节点的引导过程仅仅依赖6个DNS种子,这看似又是一个极端中心化的单点问题。但是别忘了,比特币的安全模型只需要你连接到一个诚实的对等节点,就足以抵御女巫攻击。

因此,一个新的节点只需能够连接到一个没有遭受攻击的DNS种子即可,这个种子会返回诚实节点的IP地址。但是,为了防范所有DNS节点因某种原因全都无法访问的情况,还有一个备用方案——一个被硬编码到软件中的可靠节点IP地址的列表,会随着每个新版本发布而更新。

在围绕这些初始化参数构建的安全模型下,全节点运营者不需要信任X个DNS种子或Y个?BitcoinCore软件开发者会向他们提供真实的数据,只需要相信有1/X的DNS节点没有遭受攻击,或1/Y的?BitcoinCore软件开发者会诚实地审查被硬编码的对等节点更改的有效性即可。

没有绝对安全性

从更深层次来看,你在运行一个全节点时,会在一定程度上信任你正在运行的硬件和软件。

你可以采用多种方法将你的二进制文件的签名与?vanderLaan的进行核对,以此验证软件是否可靠,但是很少会有人愿意惹这个麻烦。至于如何验证硬件的可靠性,这是个棘手的问题。如果你需要一个安全的硬件解决方案,最接近的选择是?ORWL。如果有人试图篡改ORWL,会触发它的“自毁”机制。?

但是,由于CPU、RAM等重要硬件通常都是专有的,你永远也无法100%确定它们不会遭到入侵。

比特币的分权制衡

当你开始研究比特币系统中不同参与者之间的关系时,会发现自己如坠五里雾中。

运行全节点的目的是保护你的金融主权。这就意味着,一旦你安装并运行了特定版本的软件,即表明你与该软件以及其他所有网络参与者都达成了一项协议——不仅你会遵守该软件的规则,而且其他网络参与者也必须遵守这些规则。

因此,如果人们想要对软件的规则做出无法向后兼容的更改,你必须运行新版本的软件来表示你明确同意这些规则更改。另一方面,如果是向后兼容的规则更改,即使你不同意,也可以在网络中实行。

有人高度概括了比特币内部的分权制衡:

比特币治理的三大权力部门:

全节点

矿工

开发者

需要注意的是,全节点软件不会自动更新,这是设计使然。自动更新会导致权力的天平向开发者倾斜,让开发者可以在未经节点和矿工许可的情况下强制更改规则。

可惜的是,虽然规则更改在技术层面上有可能是向后兼容的,但是多年来的经验告诉我们足够有创意的软分叉也是可以实现违背旧版本规则的更改的。例如,VitalikButerin曾经提过这样一个设想:通过软分叉将比特币的区块时间从10分钟缩短到2分钟,这必然会加快比特币的发行速度。

面对不喜欢的软分叉,全节点有一张王牌:利用硬分叉与其他支持软分叉的矿工划清界限。这执行起来很难,而且引发了关于如何衡量共识和找到经济比重高的节点等诸多问题。

从技术上来说,这种硬分叉可以通过将挖矿算法从双?SHA256改成另一种哈希函数来实现。一旦成功,所有SHA256ASIC矿机将无法用来挖比特币。因此,节点运营者应该时刻警惕比特币生态中发生的变化,并提醒矿工越权会有被取代的风险。

许多博弈论都会讨论矿工操作及其对比特币安全性的威胁,我在之前的文章中推测了挖矿生态可能会发生怎样的变化。虽然比特币挖矿的中心化程度不尽如人意,但是迄今为止依然运作良好。这是因为比特币矿工投入了大量资金,他们不会冒着巨大的损失在一个受到所有人监视的系统中作恶。

SPV安全性

很多比特币用户使用轻量级客户端而非全节点访问网络,因为前者需要消耗的资源要少得多,但依然能够提供很强的安全性。

使用简易支付验证的客户端会下载整条链上所有区块的区块头的完整副本。这就意味着,自比特币诞生以来,下载和存储需求会随时间的推移呈线性增长。详情见比特币白皮书的第8节。

中本聪在白皮书中写道,SPV客户端“无法自行验证交易,但是通过把交易与区块链关联起来,它可以看到网络中的节点已经接受了该交易,随着越来越多区块上链,则进一步证实网络已经接受了该交易”。SPV假设经过X个区块确认后的交易伪造成本极高。

SPV看似具备堪比全节点的安全性,但是它引入了额外的假设:只要一个区块的区块头和工作量证明有效,它包含的所有交易也都是有效的。因为SPV客户端不会验证本文第1节中提到的所有共识规则,所以它们假设响应交易查询请求的节点已经验证过了共识规则。

另一个较小的安全性差异在于对等节点有可能向你隐瞒信息。如果你运行了一个全节点,对等节点可以向你隐瞒未确认的交易和区块。但是,一旦你从对等节点那里获得了一个区块,就没人可以向你隐瞒这个区块中的任何交易。另一方面,如果你运行的是SPV客户端,对等节点有可能向你提供区块头,然后隐瞒对应区块中的交易信息。

SPV客户端可以查询某个地址的相关交易。尽管对等节点使用虚假交易来SPV客户端会付出很高的代价,但是它们可以谎称SPV客户端用来查询交易的布隆过滤器没有结果。另外还要注意的一点是,由于布隆过滤器的缺陷,SPV在隐私性上遭受了严重破坏。

BitcoinJ在一篇文章中很好地阐述了SPV的安全性模型。关于未确认交易,他们指出:

在SPV模式下,只要你所连接的节点将某个交易转发给你,你就只能相信这个交易是有效的。如果攻击者能够确保你所连接的节点都是他的,就可以向你发送一个完全无效的交易,而你会认可这个交易是有效的。

对于普通用户来说,SPV的安全性已经“足够高”了。尽管如此,我们还可以利用SPV欺诈证明对其进行改进。虽然人们已经就欺诈证明进行了一些讨论,但是关于如何将它们构建到比特币协议内的提案尚未实现。

比特币网络没有127.0.0.1

如果你没有运行全节点,那你至少要在一定程度上信任第三方,这会导致安全性模型产生差异。请注意,这不需要所有用户和企业直接在BitcoinCore的RPCAPI上构建他们的软件。

一些替代基础设施配置包括但不限于:

1)使用安卓版比特币钱包、GreenAddress?或?Stash?等移动钱包配置仅查询你自己的全节点的钱包。

2)在SPV节点库上构建应用并将这些应用设置成仅连接你自己的全节点。在?BitcoinJ中,这可以通过定义你自己的?SeedPeer?并在初始化过程中将其传递给你的PeerGroup?来实现。通过?libbitcoin,你可以使用该示例定义与特定节点的网络连接。

3)构建一个兼容?BitcoinCore的JSON-RPCAPI的代理服务器。这个API不仅会向第三方服务发送一些调用,也会通过调用本地全节点自动验证第三方服务返回的数据。BitGo的BitGoD软件就是一个例子。这种混合模型可以达到两全其美的效果:你可以使用第三方提供的高级功能,同时保留自己的金融主权。

全节点:为自由故

显然,运行自己的全节点是最安全的方案,需要的假设也最少。构建一台能够运行可靠全节点的计算机只需几百美元。你不妨算一下这笔账,再决定是否值得付出这些来保护自己的金融主权。

感谢KristovAtlas、EricMartindale、AndrewMiller和KiaraRoble对本文的审阅和反馈。

郑重声明: 本文版权归原作者所有, 转载文章仅为传播更多信息之目的, 如作者信息标记有误, 请第一时间联系我们修改或删除, 多谢。

金星链

[0:15ms0-1:810ms