类别:区块链 / 日期:2021-09-18 / 浏览:781

做者: Jameson Lopp

翻译&校对: 闵敏 & 阿剑

(续前)平安模子误区

别的,每个区块链系统都将创世块硬编码到了节点软件中。你可能会觉得,“共享汗青” (即,账本)是一种社会契约 —— 一旦某个区块的汗青足够悠久,收集中的所有参与者之间城市达成共识,认为那个区块永久都不会被回滚。当开发者选定一个早期挖出的区块并用它来创建查抄点时,更多是做为一种公认的完好性查抄,而非对汗青的客不雅描述。

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

正如我们能够从代码中看到的那样,Bitcoin Core 0.13 目前利用由 Pieter Wuille、Matt Corallo、Luke Dashjr、Christian Decker、Jeff Garzik 和 Jonas Schnelli 运行的 DNS 种子。任何人都能够利用 Pieter Wuille 的比特币种子生成器软件或 Matt Corallo 的软件来运行 DNS 种子。但是,他们必需说服某个全节点实现的开发者将他们的 DNS 种子主机添加至对方的软件。

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

因而,一个新的节点只需可以毗连到一个没有遭受攻击的 DNS 种子即可,那个种子会返回诚笃节点的 IP 地址。但是,为了防备所有 DNS 节点因某种原因全都无法拜候的情况,还有一个备用计划 —— 一个被硬编码到软件中的可靠节点 IP 地址的列表,会跟着每个新版本发布而更新。

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

没有绝对平安性

从更深条理来看,你在运行一个全节点时,会在必然水平上信赖你正在运行的硬件和软件。

你能够接纳多种办法将你的二进造文件的签名与 van der Laan 的停止查对,以此验证软件能否可靠,但是很少会有人愿意惹那个费事。至于若何验证硬件的可靠性,那是个棘手的问题。若是你需要一个平安的硬件处理计划,最接近的选择是 ORWL。若是有人试图窜改 ORWL,会触发它的 “自毁” 机造。

深切摸索比特币的平安模子(下)  软件 节点 Bitcoin 安全性 比特币 第1张

但是,因为 CPU、RAM 等重要硬件凡是都是专有的,你永久也无法 100% 确定它们不会遭到入侵。

比特币的分权造衡

当你起头研究比特币系统中差别参与者之间的关系时,会发现本身如坠五里雾中。

运行全节点的目标是庇护你的金融主权。那就意味着,一旦你安拆并运行了特定版本的软件,即表白你与该软件以及其他所有收集参与者都达成了一项协议 —— 不只你会遵守该软件的规则,并且其他收集参与者也必需遵守那些规则。

因而,若是人们想要对软件的规则做出无法向后兼容的更改,你必需运行新版本的软件来暗示你明白同意那些规则更改。另一方面,若是是向后兼容的规则更改,即便你差别意,也能够在收集中实行。

有人高度归纳综合了比特币内部的分权造衡:

深切摸索比特币的平安模子(下)  软件 节点 Bitcoin 安全性 比特币 第2张

比特币治理的三大权利部分:

全节点(能够否决矿工和开发者)矿工(能够否决开发者)开发者(能够帮忙其别人绕开某些否决)

需要留意的是,全节点软件不会主动更新,那是设想使然。主动更新会招致权利的天平向开发者倾斜,闪开发者能够在未经节点和矿工答应的情况下强迫更改规则。

可惜的是,固然规则更改在手艺层面上有可能是向后兼容的,但是多年来的经历告诉我们足够有创意的软分叉也是能够实现违犯旧版本规则的更改的。例如,Vitalik Buterin 曾经提过如许一个设想:通过软分叉将比特币的区块时间从 10 分钟缩短到 2 分钟,那一定会加快比特币的发行速度。

面临不喜好的软分叉,全节点有一张王牌:操纵硬分叉与其他撑持软分叉的矿工划清边界。那(在设想上)施行起来很难,并且引发了关于若何权衡共识和找到经济比重高的节点等诸多问题。

从手艺上来说,那种硬分叉能够通过将挖矿算法从双 SHA256 改成另一种哈希函数来实现。一旦胜利,所有 SHA256 ASIC 矿机将无法用来挖比特币。因而,节点运营者应该时刻警觉比特币生态中发作的变革,并提醒矿工越权会有被代替的风险。

许多博弈论城市讨论矿工操做及其比照特币平安性的威胁,我在之前的文章中揣测了挖矿生态可能会发作如何的变革。固然比特币挖矿的中心化水平不尽如人意,但是迄今为行仍然运做优良。那是因为比特币矿工投入了大量资金,他们不会冒着庞大的丧失在一个遭到所有人监视的系统中做恶。

SPV 平安性

良多比特币用户利用轻量级客户端而非全节点拜候收集,因为前者需要消耗的资本要少得多,但仍然可以供给很强的平安性。

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

深切摸索比特币的平安模子(下)  软件 节点 Bitcoin 安全性 比特币 第3张中本聪在白皮书中写道,SPV 客户端 “无法自行验证交易,但是通过把交易与区块链联系关系起来,它能够看到收集中的节点已经承受了该交易,跟着越来越多区块上链,则进一步证明收集已经承受了该交易”。SPV 假设颠末 X 个区块确认后的交易伪形成本极高。

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

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

SPV 客户端能够查询某个地址的相关交易。虽然对等节点利用虚假交易来棍骗 SPV 客户端会付出很高的代价(需要挖出一个带有充实 PoW 的区块),但是它们能够谎称 SPV 客户端用来查询交易的布隆过滤器(bloom filter)没有成果。别的还要留意的一点是,因为布隆过滤器的缺陷,SPV 在隐私性上遭受了严峻毁坏。

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

在 SPV 形式下,只要你所毗连的节点将某个交易转发给你,你就只能相信那个交易是有效的。若是攻击者可以确保你所毗连的节点都是他的,就能够向你发送一个完全无效的交易(破费底子不存在的钱),而你会承认那个交易是有效的。

关于通俗用户来说,SPV 的平安性已经 “足够高” 了。虽然如斯,我们还能够操纵 SPV 欺诈证明对其停止改良。固然人们已经就欺诈证明停止了一些讨论,但是关于若何将它们构建到比特币协议内的提案尚未实现。

比特币收集没有 127.0.0.1

若是你没有运行全节点(以及现实用它来验证交易),那你至少要在必然水平上信赖第三方,那会招致平安性模子产生差别。请留意,那不需要所有用户和企业间接在 Bitcoin Core 的 RPC API 上构建他们的软件。

一些替代根底设备设置装备摆设包罗但不限于:

1)利用安卓版比特币钱包、GreenAddress 或 Stash 等挪动钱包设置装备摆设仅查询你本身的全节点的钱包。

深切摸索比特币的平安模子(下)  软件 节点 Bitcoin 安全性 比特币 第4张2)在 SPV 节点库(如 BitcoinJ)上构建应用并将那些应用设置成仅毗连你本身的全节点。在 BitcoinJ 中,那能够通过定义你本身的 SeedPeer 并在初始化过程中将其传递给你的 PeerGroup 来实现。通过 libBitcoin,你能够利用该示例定义与特定节点的收集毗连。

3)构建一个兼容 Bitcoin Core 的 JSON-RPC API 的代办署理办事器。那个 API 不只会向第三方办事发送一些挪用,也会通过挪用当地全节点主动验证第三方办事返回的数据。BitGo 的 BitGoD 软件就是一个例子。那种混合模子能够到达一举两得的效果:你能够利用第三方供给的高级功用,同时保留本身的金融主权。

全节点:为自在故

显然,运行本身的全节点是最平安的计划,需要的假设也起码。构建一台可以运行可靠全节点的计算机只需几百美圆。你无妨算一下那笔账,再决定能否值得付出那些来庇护本身的金融主权。

感激 Kristov Atlas、Eric Martindale、Andrew Miller 和 Kiara Roble 对本文的审阅和反应。

 可能感兴趣的文章

最近发表