主页 > token.im官网 > 比特币开发者指南(一)---区块链

比特币开发者指南(一)---区块链

token.im官网 2023-05-10 07:52:25

免责声明:本文为翻译,原文地址为官网

开发人员指南旨在提供帮助理解比特币和开始构建比特币应用程序所需的应用程序所需的信息,但它不是规范。 要充分利用本文档,您可能需要安装最新的比特币客户端(Bitcoin-Core,可以直接从源代码构建或作为预编译版本下载)。

最好问有关比特币开发的问题。 有关此文档(在 Bitcoin.org 上)的错误或问题可以提交到邮件列表。

区块链

区块链提供了比特币的公共分类账——一种有序的、带有时间戳的交易记录。 该系统用于防止双重支出和交易记录被篡改的问题。

比特币网络中的每个完整节点都存储整个区块链的副本比特币开发者,其中每个块都经过验证。 当一些节点有相同的块时,就说它们已经达成“一致”。 本节介绍比特币使用的一些共识规则。

区块链概述

比特币分叉影响比特币总量_比特币开发者_外国的比特币便宜中国的比特币贵为什么?

上图显示了区块链的简化版本。 一个或多个交易消息被收集在区块的交易部分。 交易信息以默克尔树的形式组织起来,默克尔树的根存放在区块的头部。 前一个区块的哈希值也存储在区块头中,这样就可以将区块连接成一个有序的字符串。 这样可以保证如果要修改一个交易信息,不仅要修改当前块,而且要修改当前块之后的所有块。

交易通过区块,也形成了一条无形的字符串。 比特币钱包软件存储发送到钱包或从钱包发送的“Satoshi”(比特币的单位)。 虽然从用户的角度来看,“中本聪”是从一个用户转移到另一个用户,但比特币的中本聪实际上是从一笔交易转移到另一笔交易。 (译者注:这个理解了比特币的原理就可以理解了)。 每笔交易都将上一笔交易中的中本聪输出作为下一笔交易的输入,将下一笔交易的输出作为下一笔交易的输入,以此类推。 你可以看到下面的图片:

比特币分叉影响比特币总量_比特币开发者_外国的比特币便宜中国的比特币贵为什么?

单个交易可以产生多个输出,就像将“Satoshi”发送到多个地址的情况一样,但每个输出在整个区块链中只能花费一次。 禁止对输出进行任何第二次引用,因为这会导致双花问题。

输出绑定到交易标识符(TXID),这是实际交易信息的哈希值。

由于每笔交易的输出只能花费一次,所以整个区块链上的输出可以分为未花费的(Unspent Transaction Outputs:UTXO)和已经花费的。 付款消息仅在输入为 UTXO 时有效。

除了 coinbase 交易(稍后描述),如果交易的输出超过其输入,它将被拒绝。 但如果输入超过输出,差额将作为交易费来奖励下一个出块的用户。 比如上图中,每笔交易的输入比输出多10000聪,这10000聪作为交易手续费。

工作量证明 (PoW)

区块链由网络上的所有匿名节点维护,因此比特币需要每个区块来证明它在“铸造”时消耗了足够的工作量。 这是为了确保如果不可信节点想要篡改区块链信息,它们必须比诚实节点消耗更多的工作量,因为诚实节点只需要添加新区块(译者注:试图篡改旧区块的节点需要支付额外的工作来创建被篡改的块)。

区块链这种一对一的有序结构,如果要篡改,就必须对区块之后的所有区块进行篡改。 这样,修改一个块的成本就变成了修改这个块和所有后续块的工作量,从而放大了工作量证明的影响。

区块链工作量证明利用密码学中散列函数的随机性。 一个好的加密哈希算法会将任意数据转换成看似随机的数字。 只要数据中的任何一位发生变化,数据的哈希就会变得完全不同,所以无论数据如何变化,都无法掌握其哈希值变化的规律。

为了证明你确实投入了一定的工作量来创建一个块,你必须找到一个小于某个阈值的哈希值。 例如,如果最大可能的哈希值是 $2{256}-1$,那么只需要 $2 = 2 ^ {256 - 255} = 2 就可以生成小于 $2{255}$ ^{1}$ 的哈希值尝试不同类型的组合。

在上面的示例中,平均每两次尝试都会产生一个有效的哈希值。 鉴于目标哈希是已知的,您甚至可以预测每个计算的哈希达到阈值的成功概率。 比特币每次计算哈希值达到阈值的概率与尝试次数成线性关系(译者注:尝试次数越多,成功概率越大---废话o|||)。

只有当它包含的哈希值达到目标值时,一个新块才会被剪切到区块链中。 这个目标值是通过共识协议获得的。 每 2016 个区块,比特币网络使用存储在这些 2016 个区块的标头中的时间戳来计算生成这些 2016 个区块的第一个到最后一个区块所花费的时间。 理想值为 1209600s(即两周)。

(注意:Bitcoin Core实现中的一个一次性bug会导致难度重复更新,原来每2016个区块更新一次难度变成每2015个区块更新一次,这会产生一个小的偏差)

因为每个区块头的哈希值必须小于一个目标阈值,并且一个区块连接到前一个区块的后面,如果要传播一个改变的区块,平均来说,将花费所有的哈希计算从那个区块到当前最新区块的整个网络。 只有当你拥有全网大部分算力时,你才能轻松发起51%攻击(你可以改变比特币区块链的交易历史,有工作表明这种攻击不大于50%的算力)整个网络的能力,攻击成功的可能性也很大)。

区块头提供了一些可以改变的字段,比如专用的nonce字段,所以为了不需要等待新的交易到达就可以得到新的hash值比特币开发者,只需要改变nonce字段即可。 此外,仅使用 80 字节的块头来计算用于证明工作量的哈希值。 因此,包含大量交易不会增加计算哈希所需的IO,添加额外的交易只需重新计算Merkle树的根哈希即可。

区块链高度和分叉

任何成功将区块头的哈希值调整到目标阈值以下的矿工都可以将整个区块添加到区块链中(当然前提是该区块是有效的)。 这些区块可以通过区块高度(从该区块到创世区块的区块数)进行索引,区块高度为0。例如,2016年区块是第一次调整区块链难度系数。

比特币分叉影响比特币总量_外国的比特币便宜中国的比特币贵为什么?_比特币开发者

当两个或两个以上的矿工在同一个区块上挖出新的区块时,可能会出现多个高度相同的区块。 这会在区块链上创建一个分支(如上图所示)。

当矿工同时在区块链末端生成区块时,每个矿工都可以自由选择继续在哪个区块上工作。 在没有其他考虑的情况下,如下所述,节点通常选择他们首先发现的块。

最后一个矿工会在某个相同高度的分叉上产生一个新的区块,这样这个分叉就会比其他分叉有更多的工作量。 假设一个分支只包含有效块,一般节点会继续以最大的工作量在链上寻找新的块,并丢弃旧的分支块。 (哪些旧块通常被称为孤块或孤立块,这些术语也用于描述真正的孤块(即它之前没有块))。

分叉有可能长期存在,比如不同的矿工有不同的工作目的。 例如:当诚实的矿工正在努力扩展区块链时,一些矿工正在发起 51% 攻击以篡改交易历史。

由于在存在分支的情况下多个块可能具有相同的高度,因此不应将块高度用作全局唯一标识符。 取而代之的是块头的哈希值(通常是十六进制和颠倒的字节顺序)。

交易数据

每个区块必须包含一个或多个交易。 块中包含的交易集中的第一个必须是 coinbase 交易。 该交易也称为生成交易。 本次交易包含一定数量的比特币奖励和交易手续费奖励。

Coinbase 交易的输出(UTXo)(即新铸造的比特币)不能立即使用,必须等待 100 个新区块生成后才能使用。 这可以防止矿工花费后来被证明是孤立的比特币。

虽然区块不需要包含 coinbase 交易,但几乎所有矿工都会包含这样的交易来收取他们的交易费用和额外的交易奖励。

所有交易,包括 coinbase 交易,都以原始二进制形式编码在块中。

这种原始形式的交易信息的哈希被用作交易标识符。 这些交易标识符用于构建 Merkle 树。 由于构建 Merkle 树需要偶数个叶子节点,如果有基数个交易,则最后一笔交易会生成自己的副本。

包含五笔交易的 Merkle 树如下所示:

       ABCDEEEE ....... 默克尔树的树根
      /        \
   ABCD        EEEE
  /    \      /
 AB    CD    EE ....... E和他自己组成一组
/  \  /  \  /
A  B  C  D  E ......... 5个交易

在简单支付验证 (SPV) 一章中,摩尔树允许客户自己验证交易是否已包含在区块中(由区块头中的 Merkle 树证明)。 无全节点可信:伪造一个区块头代价高昂,Merkle 树中间节点的哈希不可篡改,否则验证失败。

例如,要验证交易 D 是否已添加到区块中,SPV 客户端只需要 C、AB 和 EEEE 的哈希加上 Merkle 树的根哈希。 客户不需要了解其他交易的任何信息。 如果这个区块中的5笔交易是在当前允许的最大大小为500,000字节的区块中(译者注:现在是4M),那么下载整个区块需要500K的数据,下载我们验证交易的信息只有140字节(包括块头)是必需的。

注:(译者注:这是比特币客户端的一个bug,有兴趣的可以查看详情)

一致性规则变更

为了保持区块链的一致性,所有全节点(译者注:相对于SPV客户端)使用相同的规则来验证区块的有效性。 但是,有时需要更改一致性规则以引入新功能或防止网络被滥用。 新规则实施后,使用旧规则的节点更新到新节点需要一定的时间,在这个过程中一致性会被打破。

译者注:这里有几段主要是解释软分叉和硬分叉,但是在我看来,没有意义,所以没有翻译。 这里简单介绍一下译者个人的理解:软分叉是指升级后老用户虽然不能识别用户发送的交易,但是会接受,不会拒绝,所以不会有分叉; 而硬分叉则是老用户直接拒绝创建新的交易,显然会造成分叉。 还有一点:硬分叉应该导致永久分叉。 (不知道我理解的对不对)

外国的比特币便宜中国的比特币贵为什么?_比特币开发者_比特币分叉影响比特币总量

比特币开发者_外国的比特币便宜中国的比特币贵为什么?_比特币分叉影响比特币总量

对共识协议的更改以不同的方式激活。 在比特币出现的前两年,中本聪通过在客户端进行一些向后兼容的更改,立即执行了新规则,并做出了几次软分叉。 多个软分叉(例如:BIP30)在某个预先设定的日期或当比特币区块链达到固定高度时被激活。 这些由预设时间点引起的分叉被称为用户激活软分叉(User Activated Soft Forks,UASF),这些软分叉依赖于大量有效全节点的共同努力,在某个时间点后强制执行某些新规则。

之后,软分叉等待大多数(通常为 75% 和 95%)的哈希算力表示接受新规则。 一旦达到阈值(75% 或 95%),所有节点都会执行新规则。 这种分叉称为矿工激活软分叉(MASF)。

其他资源:BIP16、BIP30 和 BIP34 这些改进也旨在帮助软分叉。 BIP50描述了一种通过临时降级升级后的节点来解决意外硬分叉的方法,同时也描述了临时降级解除时发生的人工分叉。 Gavin Andresen 给出了一份文件“如何实施未来的规则变更”。

货叉检测

未升级的节点可能会在两种类型的分支机构中使用和分发不正确的信息,从而造成多种可能导致经济损失的情况。 特别是,未升级的节点可以中继和接受升级节点认为无效的交易,因此包含这些交易的区块永远不会成为公认的最佳(最长)区块链的一部分。 未升级的节点也可以拒绝中继已经添加或即将添加到最佳区块链的区块或交易,从而提供不完整的信息(信息被丢弃,因此信息不完整)。

Bitcoin Core 包括检测硬分叉的代码,它检查区块链的工作量证明。 如果一个未升级的节点在区块链头中收到工作量证明,它可以证明至少有六个连续区块比它认为有效的最佳链多(译者注:网络上最长的链已超过其本地chain by at least 6), 节点在 getnetworkinfoRPC 结果中报告警报并运行 -alertnotify 命令(需要配置)。 这警告运营商未升级的节点无法切换到最好的区块链。

全节点还可以检查区块和交易版本号。 如果在最近几个区块中看到的一个区块或交易的版本号高于该节点使用的版本号,则不会认为它使用当前(最新)的共识规则。 Bitcoin Core 通过 getnetworkinfoRPC 和 -alertnotify 命令(如果已设置)报告此情况。

无论如何,交易和区块数据不应该取决于它是来自使用最新规则的节点还是来自使用旧规则的节点。

SPV 客户端可以通过连接到多个完整节点并确保它们都在具有相同块高度的同一条链上(加上或减去一些可能由于网络延迟引起的不一致)来检测硬分叉。 一旦检测到不一致,客户端可以断开与弱链的连接并连接到强链。

SPV 客户还应监控区块和交易版本号的增量,以确保他们使用当前和最新的共识规则处理收到的交易并创建新交易。