主页 > 苹果手机imtoken怎么下载 > 第 3 章:比特币的机制(二)

第 3 章:比特币的机制(二)

苹果手机imtoken怎么下载 2023-05-11 06:01:21

3.4 个比特币区块

本章到目前为止,我们已经了解了单个交易是如何构建和赎回的。但正如我们在第 2 章中看到的,交易被分组到块中。为什么会这样?基本上,这是一种优化。如果矿工必须单独就每笔交易达成共识,那么系统可以接受的新交易的百分比会低得多。此外,块的哈希链比交易的哈希链短得多,因为可以将大量交易放入每个块中。这将使验证区块链数据结构的效率更高。

区块链是基于哈希的两种不同数据结构的巧妙组合。第一个是区块的哈希链。每个块都有一个块头,一个指向一些交易数据的哈希指针,以及一个指向序列中前一个块的哈希指针。第二个数据结构是包含该块中所有交易的每块树。这是一棵 Merkle 树,它允许我们以有效的方式消化一个块中的所有交易。正如我们在第 1 章中看到的,为了证明交易包含在特定区块中,我们可以提供一条通过树的路径,其长度与区块中的交易数量成对数。总而言之,一个区块由头数据和以树结构排列的交易列表组成。

图3.8 比特币区块链包含两种不同的哈希结构。第一个是区块哈希链,将不同的区块相互链接。第二个是在每个区块内部,即区块内交易的默克尔树。

标头主要包含关于我们在上一章中简要讨论过的挖掘问题的信息,我们将在第 5 章重新讨论。回想一下,区块的哈希标头必须以大量零开头才能使区块有效标头还包含一个“nonce”、一个时间戳和矿工可以更改的“位”,这表明该块被发现的难度。标头是挖掘中唯一的哈希值。因此,要验证区块链,我们需要做的就是查看标题。标头中包含的唯一交易数据是交易树的根——“mrkl_root”字段。

图3.9 coinbase 交易。 coinbase 交易会创建新的硬币。它不会转换以前的输出,并且它有一个空的哈希指针来表示它。它有一个可以包含任意数据的 coinbase 参数。 Coinbase 的价值是区块奖励加上该区块中包含的所有交易费用。

关于区块的另一个有趣的事情是它们在 Merkle 树中有一个特殊的交易,称为“coinbase”交易。这类似于 Scroogecoin 中的 CreateCoins。这就是比特币中发生的新硬币创造。它看起来像一个普通的交易,但有一些不同:(1)它总是有一个输入和一个输出,(2)输入不交换以前的输出,因此包含一个空的哈希指针,因为它正在铸造新的比特币而不是消耗现有的硬币,(3)目前产出的价值是25比特币多一点。产出价值是来自该区块的矿工它由两部分组成:平均挖矿奖励,其中由系统设定,每 210,000 个区块(约 4 年)减半,并从每个区块交易中收取交易费。4)@ >有一个特殊的完全任意的“coinbase”参数——矿工可以放任何他们想要的东西。

有趣的是,在比特币开采的第一个区块中,“coinbase”参数引用了涉及总理银行的泰晤士报故事。这被解释为对比特币创世区块进行政治评论的动机。这也是 2009 年 1 月 3 日之后开采的第一块矿块。证明。使用 coinbase 参数成为矿工支持不同新功能的一种方式。

为了更好地了解区块格式和交易格式,最好的方法是自己探索区块链。有许多网站可以访问这些数据,例如 blockchain.info。您可以查看交易图表,查看哪些交易兑换了其他交易,查找具有复杂脚本的交易,并查看区块结构以了解区块如何引用其他区块。由于区块链是一种公共数据结构,开发人员已经构建了漂亮的包装器来探索以图形方式。

3.5比特币网络

到目前为止,我们一直在讨论参与者发布交易并将其放到区块链上的能力,这就像魔术一样发生。实际上,这是通过比特币网络发生的。它是一个 p2p 点对点网络,它继承了点对点网络的许多想法,这些想法已被提出用于各种其他目的。在比特币网络中,所有节点都是点对点的。这里没有层次结构,没有特殊节点或主节点。它在 TCP 上运行并且具有随机拓扑,其中每个节点与其他随机节点对等。新节点可以随时加入。其实你可以下载比特币客户端,把你的电脑作为一个节点启动,它就会拥有和网络上所有其他节点一样的权限和功能。

网络随着时间的推移而变化,并随着节点的进入和离开而变得非常动态。没有明确的方法可以离开网络。相反,如果一个节点在一段时间内没有被听到——三个小时是硬编码到普通客户端的最后期限——其他节点开始忘记它。网络以这种方式优雅地处理离线节点。

回想一下,节点连接到随机节点并且没有任何类型的地理拓扑。现在您开始移动一个新节点并想要加入网络。你从一个你知道的节点开始一个简单的消息。这通常称为您的种子节点,有几种不同的方法可以通过查找种子节点列表来尝试连接。你发送一条特殊的信息说:“告诉我你知道的网络中所有其他节点的地址。”您可以对想要了解的新节点重复此过程。然后,您可以选择一个对应的,您将因此成为比特币网络的全功能成员。说到随机性,有几个步骤,理想的结果是你对应一个随机的节点集。要加入网络,您只需要知道如何联系已经在网络上的节点。

互联网有什么好处?当然是维护区块链。因此,要发布交易,我们希望整个网络都能听到它。这是通过一个简单的洪水算法(有时称为八卦协议)来实现的。如果 Alice 想付给 Bob 一些钱,她的客户会创建她的节点并将交易发送给她的所有对等节点。这些节点中的每一个都执行一系列检查以确定是否接受和传达交易。如果检查通过,则节点依次将其发送给所有对等节点。听到交易的节点将其放入他们已经听到但尚未在区块链上的交易池中。如果一个节点听到一个已经在其交易池中的交易,它将不会进一步广播它。这确保了洪水协议终止并且交易不会永远环绕网络。请记住,每笔交易都由其哈希唯一标识,因此在池中查找交易很容易。

当节点听到新交易时,他们如何决定是否应该传播它?这里有四个检查步骤。第一个也是最重要的检查是交易验证——交易必须对当前区块链有效。该节点为每个先前兑换的输出运行脚本,并确保脚本返回 true。其次,他们检查这里兑换的输出没有被花费。第三,如前所述,它们不会转发已经看到的交易。第四,默认情况下,节点只会接受和继承基于小白名单脚本的“标准”脚本。

所有这些检查都只是健全性检查。表现良好的节点实施这些以保持网络正常运行,但没有规定节点必须遵循这些特定步骤。由于是点对点网络,任何人都可以加入,因此节点可能会转发双花、非标准交易或完全无效的交易。这就是为什么每个节点都必须自己检查的原因。

由于网络中的延迟,节点最终可能会对待处理交易池有不同的看法。这在尝试双花时变得特别有趣和重要。假设 Alice 试图向 Bob 和 Charlie 支付相同的比特币,并且几乎同时发送两笔交易。有些节点会先听到 Alice→Bob 的交易,而其他节点会先听到 Alice→Charlie 的交易。当节点听到其中一个交易时,会将其添加到其交易池中,如果稍后听到另一个交易,则将其视为双花。节点将丢弃后一个交易并且不会将其通信或将其添加到其交易池中。因此,节点将暂时不同意将哪些交易放入下一个区块。这称为竞争条件。

好消息是这完全没问题。无论谁挖下一个区块,基本上都会打破平局,并决定两个待处理交易中的哪一个将永久进入一个区块。假设 Alice→Charlie 交易变成了一个区块。当 Alice→Bob 交易的节点听到这个区块时,他们会从内存池中删除该交易,因为它是双花。当 Alice→Charlie 交易的节点听到这个区块时,他们会从内存池中删除该交易,因为它已经嵌入到区块链中。所以一旦区块传播到网络,就不会再有分歧了。

网络位置很重要,因为默认行为是让节点挂在他们首先听到的任何内容上。如果两个冲突的交易或区块发布在网络中的两个不同位置,它们将开始泛滥整个网络,而节点首先看到的交易将取决于它在网络中的位置。

当然,这假设每个节点都实现了这些逻辑,它们首先保存他们听到的任何内容。但是,没有中央机构来强制执行这一点,节点可以自由地实施他们想要选择保留哪些交易以及是否转发它们的任何其他逻辑。我们将在第 5 章更多地关注矿工激励。

确认交易和更换费用为零的侧边栏。在第 2 章中,我们研究了零确认交易,一旦在网络上广播,接收者就会接受这些交易。这并不是为了防止双重支出而设计的。但正如我们所见,在交易冲突的情况下,矿工的默认行为是包含他们首先收到的交易,这使得零确认交易的双重支出变得相当困难。因此,由于方便,零确认交易变得普遍。

自 2013 年以来,人们一直有兴趣将默认政策更改为替换费用 (RBF),如果节点听到包含更高费用的冲突交易,他们将替换其交易池中的待处理交易。这是矿工的理性行为,并且至少在短期内给了他们更好的费用。然而,在实践中,替代费用将使双重支付更容易对抗零确认攻击。

所以,无论是在 RBF 世界中防止或阻止双重支出的技术问题,还是比特币应该尽可能支持零确认还是放弃它的哲学问题,替代费用的问题都是有争议的。 我们不会深入讨论这场旷日持久的辩论,但比特币最近通过了“选择加入”RBF 网络,在该网络中,交易可以(使用序列号字段)将自己标记为有资格被更高费用的交易取代。

到目前为止,我们一直在讨论交易广播。每当矿工发现新区块时,宣布新区块的逻辑几乎与传播新交易的逻辑相同,并且两者都受制于相同的竞争条件。如果同时挖出两个有效区块,则只能将其中一个纳入长期共识链。最终会包含哪些区块将取决于其他节点建立在哪些区块上,没有进入共享链的区块将被孤立。

验证区块比验证交易更复杂。除了验证标头并确保哈希值在可接受的范围内之外,节点还必须验证块中包含的每个事务。最后,如果一个节点基于块视图(实际上是块树)的样子比特币的逻辑和思想内涵,它只会转发一个构建在最长分支上的块。这避免了创建分叉。但就像交易一样,节点可以根据需要实现不同的逻辑——它们可能会传达无效的区块或从区块链早期构建的区块。这将构建一个分叉,但没关系。该协议旨在承受这种情况。

图表3.10 块传播时间 该图表显示了一个块到达网络中不同百分比的节点所需的平均时间。

洪水算法的延迟是多少?图 3.10 中的图表显示了新块传播到网络中每个节点的平均时间。这条线显示了第 25、50 和 75 个百分位数的旅行时间。可以看出,传播时间基本上与块的大小成正比。这是因为网络带宽是瓶颈。较大的块需要 30 多秒才能传播到网络中的大多数节点。所以它不是一个特别有效的协议。在互联网上,30 秒是相当长的时间。在比特币的设计中,有一个简单的网络,结构简单,节点相等,可以进出,优先考虑效率。因此,一个块可能需要经过许多节点才能到达网络中最远的节点。如果网络为了效率而设计为自上而下,我们可以确保任意两个节点之间的路径都很短。

网络规模很难衡量网络的规模,因为它是动态的,没有中央权威。一些研究人员提出了一些估计。在高端,据说有超过一百万个 IP 地址将在给定的一个月内至少暂时充当比特币节点。另一方面,似乎只有大约 5,000 到 10,000 个节点永久连接并完全验证他们听到的每笔交易。这似乎是一个令人惊讶的低数字,但在撰写本文时,没有证据表明完全验证节点的数量正在上升,实际上它可能正在下降。

存储要求 完全验证节点必须保持永久连接才能听到所有数据。节点离线的时间越长,它就越需要赶上重新加入网络。此类节点还必须存储整个区块链,并且需要良好的网络连接才能听到每笔新交易并将其转发给对等方。存储需求目前低于数十 GB(参见图 3.11),这在单个商用桌面的能力范围内。

图3.11.区块链的大小。一个完全验证节点必须存储整个区块链,在 2014 年底是 26 GB。

最后,完全验证节点必须维护一整套未使用的交易输出,即可以花费的硬币。理想情况下,这应该存储在 RAM 中,以便节点在听到网络上的新交易时可以快速查找它尝试声明交易输出,运行脚本,查看签名是否有效,并将交易添加到交易池截至 2014 年年中,区块链中有超过 4400 万笔交易,其中 1200 万笔未使用。幸运的是,它仍然足够小,可以在高效的数据结构中放入不到 1G 的 RAM。

轻量级节点。与完全验证节点相反,有轻量级节点,也称为瘦客户端或简单支付验证 (SPV) 客户端。事实上,比特币网络上的绝大多数节点都是轻量级节点。这与完全验证节点不同,因为它们不存储整个区块链。他们只存储他们需要验证的内容,即他们关心的特定交易的一部分。如果您使用钱包程序,通常会包含一个 SPV 节点。该节点会下载代表付款到您地址的区块头和交易。

SPV 节点不会完全验证节点的安全级别。由于节点有块头,它可以检查这些块是否难以挖掘,但不能检查一个块中包含的每个交易是否真的有效,因为它没有交易历史,也不知道未使用的交易输出 .SPV 的集合节点只能验证实际影响它们的事务。因此,他们基本上信任完整的验证者来验证所有其他交易。这不是一个糟糕的安全交易。他们假设如果矿工在挖掘这个块时遇到困难,那么完整的验证者正在做艰苦的工作,这是一个非常昂贵的过程,他们也可能会进行一些验证以确保该块不会被拒绝。

成为 SPV 节点可以节省大量成本。区块头只有区块链大小的 1/1000 左右。因此,不是存储数十 GB,而是仅存储数十兆字节。即使是智能手机也可以轻松充当比特币网络中的 SPV 节点。

由于比特币依赖于开放协议,理想情况下,会有许多不同的实现无缝交互。这样,如果其中存在错误,就不太可能导致整个网络瘫痪。好消息 是的,该协议已成功重新实施。在 C++ 和 Go 中有实现,人们正在做很多其他的事情。坏消息是网络上的大多数节点都在运行比特币库,用 C++ 编写并由比特币核心开发人员维护,其中一些节点运行之前没有更新的旧版本。无论如何,大多数人都在运行这个常见客户端的一些变体。

3.6 限制和改进

最后,我们将讨论比特币协议的一些内置限制,以及改进它们的挑战。当比特币在 2009 年被提出时,比特币协议中存在许多硬编码限制,直到人们真正意识到它可以发展成为一种全球重要的货币。其中包括每个区块的平均时间、区块的大小、一个区块中签名操作的次数,以及货币的可分割性、比特币的总数以及对区块奖励结构的限制。

现有比特币总数的限制和采矿奖励的结构可能永远不会改变,因为改变它们的经济影响太大了。矿工和投资者在这个系统上下了大赌注,假设比特币的奖励结构和比特币的有限供应将保持原计划。如果这种情况发生变化比特币的逻辑和思想内涵,将对人们产生巨大的经济影响。所以社会基本上同意这些方面,无论选择是否明智,都不会改变。

还有其他一些变化似乎让每个人都变得更好,因为事后看来,一些初步的设计选择似乎不太正确。其中最主要的是影响系统吞吐量的限制。比特币网络进程每秒可以处理多少笔交易?该限制来自对块大小的硬编码限制。每个块限制为一兆字节,大约是一百万字节。每笔交易至少有 250 个字节。将 1,000,000 分成 250 份,我们可以看到每个区块有 4,000 笔交易的限制,并且每 10 分钟发现一次,因此每秒大约有 7 笔交易,这是比特币网络可以处理的。更改这些限制似乎只需要调整源代码文件中的某个常量。然而,在实践中很难做出这样的改变,我们将很快解释原因。

那么每秒七笔交易怎么样?这大大低于任何主要信用卡处理器的吞吐量。据说 Visa 的网络平均每秒处理约 2,000 笔交易,在繁忙时段每秒可处理 10,000 笔交易。即使是比 Visa 更新、更小的 Paypal,在高峰时段每秒也可以处理 100 笔交易。这比比特币高出一个数量级。

人们长期以来担心的另一个限制是比特币选择的加密算法是固定的。只有几种哈希算法可用,并且只有一种签名算法 ECDSA 在特定的椭圆曲线上,称为 secp256k1。有人担心,在比特币的生命周期中,人们希望它会很长——算法可能会被破解。密码学家可能会想出一个我们没有预见到的聪明的新攻击,使算法不安全。哈希函数也是如此;事实上,哈希函数在过去十年中在密码分析方面取得了稳步进展。包含在比特币中的 SHA-1 已经存在一些已知的加密缺陷,但并不致命。为了改变这一点,我们必须扩展比特币脚本语言以支持新的加密算法。

更改协议。我们如何将新功能引入比特币协议?您可能认为这很简单 - 只需发布新版本的软件并告诉所有节点升级即可。实际上,它相当复杂。在实践中,不可能假设每个节点都会升级。网络中的某些节点将无法获取新软件或无法及时获取。虽然一些节点运行的是旧版本,但大多数节点升级的影响在很大程度上取决于软件更改的性质。我们可以区分两种类型的更改:导致硬分叉的更改和导致软分叉的更改。

硬分叉。我们可以进行的一种更改引入了以前被认为无效的新功能。也就是说,较新版本的软件会将块识别为有效,而较旧的软件将拒绝它们为有效。现在考虑当大多数节点升级时会发生什么,但有些节点没有升级。不久之后,最长的分支将包含旧节点认为无效的块。因此旧节点将脱离并使用区块链中的分叉来排除具有新功能的块。在升级他们的软件之前,他们会认为他们的(较短的)分支是最长的有效分支。

这种变化被称为硬分叉变化,因为它分裂了区块链。网络中的每个节点将位于一侧或另一侧,具体取决于运行的协议版本。当然,这些分支再也不会连在一起了。这被社区认为是不可接受的,因为如果不升级其软件,旧节点将有效地从比特币网络中删除。

软分叉。我们可以对比特币进行的第二种更改是添加使验证规则更严格的功能。也就是说,它们限制一组有效的交易或一组有效的块,以便旧版本将接受所有块,而新版本将拒绝一些块。这种变化称为软分叉,它避免了硬分叉引入的永久分裂。

想象一下,当我们引入一个更改软件版本的新软分叉时会发生什么。运行新软件的节点将执行一些新的更严格的规则。如果大多数节点切换到新软件,这些节点将能够执行新规则。引入软分叉依赖于足够多的节点来切换到新版本的协议,以便他们可以执行新规则,因为他们知道旧节点将无法执行新规则,因为他们没有听说过。

年长的矿工冒着挖掘无效区块的风险,因为它们包含一些在新的更严格规则下无效的交易。然而,老节点至少会弄清楚他们的一些区块被拒绝了,即使他们不明白为什么。这可能会促使他们的运营商升级他们的软件。此外,如果他们的分叉被新矿工超越,老矿工将切换到它。这是因为新矿工认为有效的区块也被老矿工认为有效。因此,不会有硬分叉;相反,会有很多小的临时分叉。

通过软分叉进行更改的典型示例是付费脚本哈希,我们在本章前面已经讨论过。比特币协议的第一个版本中没有 Pay-to-script-hash。这是一个软分叉,因为从旧节点的角度来看,有效的付费脚本哈希交易仍将正确验证。正如旧节点所解释的那样,该脚本很简单 - 它对数据值进行哈希处理并检查哈希是否与输出脚本中指定的值匹配。旧节点不知道(现在需要)运行值本身的附加步骤以查看它是否是有效脚本。我们依靠新节点来执行脚本实际兑换此交易的新规则。

那么我们可以用软分叉添加什么?支付脚本哈希是成功的。也可以通过软分叉添加新的加密方案。我们还可以向 Coinbase 参数添加一些额外的元数据以使其有意义。今天,coinbase 参数接受任何值。但是,将来我们可以说这个coinbase必须有一些特定的格式。提出的一个想法是,在每个新区块中,coinbase 包含整个未使用交易树的 Merkle 根。这只会导致软分叉,因为旧节点可能会在不需要新的 coinbase 参数的情况下挖掘被网络拒绝的块,但它们会赶上并加入网络中正在挖掘的主链。

其他更改可能需要硬分叉。诸如向比特币添加新的操作码、更改块或交易大小限制或各种错误修复之类的事情。修复我们之前讨论的错误,MULTISIG 指令从堆栈中弹出一个额外的值,所有这些都需要一个硬分叉来实现。这就是为什么即使有一个令人讨厌的错误,将其放入协议中并让人们解决它更容易,而不是对比特币进行硬分叉更改。即使它们很好,在当前的比特币环境中也不太可能发生硬分叉变化。然而,从头开始,这些想法已经在替代加密货币中经过测试并证明是成功的。我们将在第 10 章讨论更多细节。

侧边栏:比特币区块大小难题。由于比特币的日益普及,截至 2016 年初,一个区块的 1M 空间被填满已经很普遍(尤其是因为随机性,一个区块需要 10 多分钟才能找到) 首先,导致一些交易有等待一个或多个附加块进入区块链。增加块大小限制需要硬分叉。

是否以及如何解决区块链有限的交易带宽的问题已经得到了比特币社区的足够关注。这种讨论多年前就开始了,但在达成共识方面进展甚微,而且变得更加激进,升级为马戏团。我们将在第 7 章讨论比特币的社区、政治和治理。

根据块大小的解决方案,本章中的一些细节可能会稍微过时。提高比特币交易处理能力的技术细节很有趣,我们鼓励您在线阅读更多内容。

此时,您应该熟悉比特币的技术机制以及比特币节点的运作方式。然而,人类不是比特币节点,你永远不会在脑海中运行比特币节点。那么,作为一个人,你如何实际与这个网络进行交互,以便它可以充当一种货币呢?如何找到一个节点来广播你的交易?如何将比特币兑换成现金?你如何存储你的比特币?所有这些问题对于构建一种真正适用于人而不只是软件的货币至关重要,我们将在下一章中回答这些问题。

进一步阅读

在线资源。在本章中,我们讨论了很多技术细节,您可能会觉得难以一次全部吸收。为了补充本章中的材料,上网查看我们在实践中讨论的一些内容是很有用的。有许多网站允许您检查区块和交易并查看它们的外观。一个这样的“区块链浏览器”网站

一本专注于开发并涵盖技术细节的比特币书籍(尤其是第 5、6 和 7 章):

安东尼奥普洛斯

,Andreas M. 掌握比特币:解锁数字加密货币。奥莱利

媒体,2014.掌握比特币:解锁数字加密货币

p>