跳转至

介绍比特币

比特币是区块链技术的首次应用。在本章中,将向您详细介绍比特币技术。

随着第一种完全去中心化的数字货币的推出,比特币已经开始了一场革命,从网络和协议的角度来看,这种货币已经被证明是极其安全和稳定的。作为一种货币,比特币非常不稳定,波动性很大,尽管它很有价值。我们将在本章后面解释这一点。这也引发了学术和工业研究的极大兴趣,并引入了许多新的研究领域。

自 2008 年由中本聪推出以来,比特币获得了巨大的人气,目前它是世界上最成功的数字货币,投资了数十亿美元。在撰写本文时,这种货币的当前市值为 149,984,293,122 美元。它的受欢迎程度也显而易见,这体现在大量的用户和投资者,不断上涨的比特币价格,与比特币相关的日常新闻,以及提供基于比特币的在线交易的初创公司和公司的数量,现在它还在芝加哥商业交易所 ( 芝加哥商业交易所)以比特币期货的形式交易。

感兴趣的读者可以在 http://www.cmegroup.com/trading/bitcoin-futures.html阅读更多关于比特币期货的内容。

比特币发明者的名字中本聪被认为是一个假名,因为比特币发明者的真实身份是未知的。它建立在密码学、数字现金和分布式计算领域数十年的研究基础之上。在接下来的部分,为了提供理解比特币发明背后的基础所需的背景,呈现了一个简短的历史。

几十年来,数字货币一直是一个活跃的研究领域。创造数字现金的早期提议可以追溯到 20 世纪 80 年代初。1982 年,计算机科学家和密码学家 David Chaum 提出了一个方案,使用盲签名来构建不可追踪的数字货币。这项研究发表在一篇名为无法追踪支付的盲签名的研究论文中。

感兴趣的读者可以在http://www . hit . BME . Hu/~ buttyan/courses/bmevihim 219/2009/Chaum 阅读 David Chaum 描述他发明盲签名的密码原语的研究论文原文。BlindSigForPayment.1982.PDF

在这个方案中,银行将通过签署用户提供给它的一个盲随机序列号来发行数字货币。然后,用户可以使用由银行签名的数字令牌作为货币。这种方案的局限性在于银行必须跟踪所有用过的序列号。这是一个中央系统的设计,需要得到用户的信任。

后来,在 1988 年,David Chaum 和其他人提出了一个名为 e-cash 的改进版本,它不仅使用了盲签名,还使用了一些私人身份数据来编写消息,然后发送到银行。

这方面的原始研究论文可在http://citeseerx.ist.psu.edu/viewdoc/summary?获得 doi=10.1.1.26.5759

这一方案允许发现重复支出,但不能防止重复支出。如果在两个不同的地方使用同一个代币,那么双重消费者的身份就会暴露。电子现金只能代表固定金额。

Adam Back 是一名密码学家,现在是 Blockstream 的首席执行官,他参与了区块链的开发,在 1997 年引入了 hashcash。它最初被提议用来阻止电子邮件垃圾。hashcash 背后的想法是解决一个计算难题,这个难题很容易验证,但是计算起来相对困难。其想法是,对于单个用户和单封电子邮件,额外的计算工作可以忽略不计,但由于运行垃圾邮件活动所需的时间和资源将大幅增加,因此不鼓励有人发送大量垃圾邮件。

1998 年,曾供职于微软的计算机工程师戴伟提出了 B-money,引入了使用工作证明 ( PoW )来创造货币的想法。术语工作证明随后随着比特币出现并流行起来,但在戴伟的 B-money 中,通过提供一个先前未解决的计算问题的解决方案,引入了一种创造货币的方案。在论文中,它被称为对之前未解决的计算问题的解决方案。这个概念类似于 PoW,即通过广播一个以前未解决的计算问题的解决方案来创造货币。

原文可在http://www.weidai.com/bmoney.txt获得。

该系统的一个主要弱点是,拥有更高计算能力的对手可以在不允许网络调整到适当难度的情况下产生不请自来的金钱。该系统缺乏节点间共识机制的细节,并且一些安全问题如 Sybil 攻击也没有得到解决。与此同时,计算机科学家尼克·萨伯(Nick Szabo)引入了比特黄金(BitGold)的概念,这也是基于 PoW 机制,但与 B-money 存在相同的问题,只是网络难度级别是可调的。来自国际计算机科学研究所 ( ICSI )的托马斯·桑德和阿姆农·塔什马,1999 年在一篇名为可审计的匿名电子现金的研究论文下,伯克利引入了一个电子现金方案。这个方案,第一次用 Merkle 树来表示硬币,用零知识证明 ( ZKPs )来证明拥有硬币。

名为可审核、匿名电子现金的原始研究论文可在以下网站获得:http://www.cs.tau.ac.il/~amnon/Papers/ST.crypto99.pdf

在这个方案中,需要一个中央银行来记录所有用过的序列号。这个方案允许用户完全匿名。这是一个理论上的设计,由于低效的证明机制而无法实际实现。

可重复使用的工作证明于 2004 年由计算机科学家、开发者哈尔·芬尼(Hal Finney)推出,他是第一个从中本聪接收比特币的人。它使用亚当的 hashcash 方案作为创造货币所花费的计算资源的证明。这也是一个中央系统,它有一个中央数据库来记录所有用过异能令牌。这是一个在线系统,使用由可信计算平台(TPM 硬件)实现的远程证明。

前面提到的所有方案都是经过精心设计的,但从某个方面来说都很薄弱。具体来说,所有这些方案都依赖于用户需要信任的中央服务器。

比特币

2008 年,比特币通过一篇名为比特币:点对点电子现金系统的论文被引入。

这篇论文在https://bitcoin.org/bitcoin.pdf有售。

这是中本聪写的,据信是笔名,因为比特币发明者的真实身份是未知的,也是许多猜测的主题。论文中介绍的第一个关键思想是纯粹的点对点电子现金,它确实需要一个中间银行在点对点之间转移支付。

比特币是建立在数十年的密码学研究基础上的,如对 Merkle 树、哈希函数、公钥密码学和数字签名的研究。此外,比特币、B-money、hashcash 和加密时间戳等理念为比特币的发明奠定了基础。所有这些技术都巧妙地结合在比特币中,创造了世界上第一种去中心化的货币。比特币解决的关键问题是拜占庭将军问题的优雅解决方案,以及双重花费问题的实用解决方案。回想一下,这两个概念在 第一章区块链 101 都有解释。

如下图所示,自 2011 年以来,比特币的价值大幅增加,随后自 2017 年 3 月以来,比特币的价值大幅增加:

2017 年 3 月以来的比特币价格

对比特币的监管是一个有争议的话题,尽管这是自由主义者的梦想,但执法机构、政府和银行正在提议各种监管措施来控制比特币,比如纽约州金融服务局颁发的比特币许可证。这是颁发给从事虚拟货币相关活动的企业的许可证。由于高昂的成本和非常严格的与 BitLicense 相关的监管要求,许多公司已经从纽约撤回了他们的服务。

对于具有自由主义意识形态的人来说,比特币是一个可以代替银行用于商业的平台,但他们认为,由于监管,比特币可能成为另一个不可信的机构。比特币背后的最初想法是开发一个电子现金系统,它不需要可信的第三方,用户可以匿名。如果监管机构要求了解你的客户 ( KYC )支票和有关商业交易的详细信息,以促进监管过程,那么可能会有太多的信息需要分享,因此比特币可能对一些人不再有吸引力。

现在有许多举措正在采取,以监管比特币、加密货币和 ico 等相关活动。美国证券交易委员会 ( SEC )近日宣布,数字代币、硬币及相关活动如首次发行硬币 ( ICOs )属于证券范畴。这意味着,任何数字货币交易平台都需要在美国证券交易委员会(SEC)注册,并适用所有相关的证券法律法规。这直接影响了比特币的价格,在消息公布的当天,比特币价格下跌了近 10%。

感兴趣的读者可以在https://www.coindesk.com/category/regulation/了解更多关于比特币监管和其他相关活动的信息。

比特币的增长也是因为所谓的网络效应。也被称为需求方规模经济,这是一个基本上意味着使用网络的用户越多,网络就越有价值的概念。随着时间的推移,比特币网络的增长呈指数级增长。用户数量的增加在很大程度上是由财务收益驱动的。此外,比特币的稀缺性和内置的通胀控制机制赋予了它价值,因为只有 2100 万个比特币可以开采,此外,矿工奖励每四年减半。尽管比特币的价格波动很大,但它在过去几年里大幅上涨。目前(撰写本文时),比特币价格为 9250 美元。

比特币定义

比特币可以有多种定义;它是一种协议,一种数字货币,一个平台。它是点对点网络、协议和软件的结合,促进了名为比特币的数字货币的创建和使用。这种对等网络中的节点使用比特币协议相互交谈。

注意,大写 B 的比特币用于指代比特币协议,而小写 B 的比特币用于指代货币比特币。

随着比特币的发明,货币的去中心化第一次成为可能。此外,在比特币中,双重支出问题得到了优雅而巧妙的解决。例如,当一个用户同时向两个不同的用户发送硬币,并且它们被独立地验证为有效交易时,就会出现重复消费问题。比特币通过使用分布式账本(区块链)永久记录每一笔交易,并通过实施交易验证和确认机制,解决了重复支出问题。这个过程将在我们介绍挖掘概念的章节中解释。

比特币——鸟瞰

在这一部分,我们将从用户的角度来看比特币网络。交易是如何进行的,它是如何从用户传播到网络的,交易是如何被验证的,最后以块的形式累积。我们将看看比特币网络的各种参与者和组件。最后,还将提供一些关于所有参与者和组件如何相互作用以形成比特币网络的讨论。

首先,让我们看看比特币网络的主要组成部分是什么。比特币由这里列出的元素组成。随着本章的深入,我们将进一步阐述这些要素。

  • 数字键
  • 地址
  • 处理
  • 区块链
  • 矿工
  • 比特币网络
  • 钱包(客户端软件)

现在,我们将看到用户将如何使用比特币网络。下面的例子将帮助你理解从最终用户的角度来看比特币网络是什么样子。我们会看到,一个比特币交易涉及哪些行为者和成分。最常见的交易之一是向他人汇款,因此在下面的例子中,我们将看到如何在比特币网络上从一个用户向另一个用户汇款。

向某人付款

这个例子将演示如何使用比特币网络将钱从一个用户发送到另一个用户。这个过程包括几个步骤。例如,我们正在为移动设备使用区块链钱包。

这些步骤描述如下:

  1. 首先,用户通过电子邮件或其他方式(如 SMS、聊天应用程序或实际上任何适当的通信机制)向发送者发送其比特币地址来请求支付。汇款人也可以发起转账,向另一个用户汇款。在这两种情况下,受益人的地址都是必需的。作为一个例子,这里显示了创建支付请求的区块链钱包:

比特币支付请求(使用区块链钱包)

  1. 发送者要么输入接收者的地址,要么扫描编码有比特币地址、金额和可选描述的二维码。钱包应用程序识别这个二维码,并将其解码成类似于Please send <Amount> BTC to the Bitcoin address <receiver's Bitcoin address>的东西。
  2. 这将看起来像这里显示的值:Please send 0.00033324 BTC to the Bitcoin address 1JzouJCVmMQBmTcd8K4Y5BP36gEFNn1ZJ3
  3. This is also shown in the screenshot presented here:

比特币支付 QR 码

前面截图中显示的二维码被解码为bitcoin://1JzouJCVmMQBmTcd8K4Y5BP36gEFNn1ZJ3?amount=0.00033324,可以在比特币钱包中作为 URL 打开。

  1. 在发送方的钱包应用中,通过遵循一些规则来构造这种交易,并广播到比特币网络。在广播之前,使用发送方的私钥对该事务进行数字签名。如何创建、数字签名、广播、验证和添加事务到块将在下面的章节中变得清楚。从用户的角度来看,一旦二维码被解码,交易将类似于以下截图所示:

使用区块链钱包发送 BTC

请注意,在前面的屏幕截图中有许多字段,如 From、To、BTC 和 Fee。虽然其他字段不言自明,但值得注意的是,费用是根据交易的规模计算的,费率是一个取决于网络中交易量的值。这用 Satoshis/byte 表示。比特币网络中的费用保证了你的交易会被矿商纳入区块。

最近,比特币的费用如此之高,以至于即使是小额交易也要收取高额费用。这是因为采矿者可以自由选择要核实和添加的交易,并选择收费较高的交易。创建数千笔交易的大量用户也在造成这种高费用情况中发挥了作用,因为交易彼此竞争,首先被选中,而采矿者选中费用最高的交易。该费用通常也是由比特币钱包软件在发送交易之前自动估算和计算的。交易费用越高,你的交易就越有可能被优先选中并被包含在区块中。这项任务由矿工来完成。采矿和矿工是一个概念,我们将在本章稍后在比特币采矿的背景下研究这个概念。

交易发送后,它将出现在区块链钱包软件中,如下所示:

交易已发送

  1. 在这个阶段,交易已经被构建、签名并被发送到比特币网络。该交易将被矿工获得,以进行验证并包含在区块中。另请注意,在前面的屏幕截图中,此交易的确认正在等待中。一旦交易被验证、包含在块中并被挖掘,这些确认将开始出现。此外,将从要转让的原始价值中扣除适当的费用,并支付给将其纳入区块进行开采的矿工。

此流程如下图所示,其中 0.001267 BTC(约 11 美元)的付款从发送方地址发出,并支付到接收方地址(从 1Jz 开始)。0.00010622 英镑(约 95 美分)的费用也作为采矿费从交易中扣除。

交易流程可视化(Blockchain.info)

前面的屏幕截图直观地显示了交易如何在网络上从起点(发送者)流向右边的接收者。

此处显示了事务的各种属性的汇总视图:

取自 Blockchain.info 的交易快照

查看前面的屏幕截图,有许多包含不同值的字段。这里列出了重要的字段及其用途和说明:

  • Size:这是事务的大小,以字节为单位。
  • 重量:这是自推出隔离见证 ( SegWit )版比特币以来,为区块和交易规模给出的新指标。
  • 收到时间:这是收到交易的时间。
  • 包括在块中:这显示包括事务处理的区块链上的块号。
  • 确认:这是矿工对该事务的确认次数。
  • 总投入:这是事务处理中总投入的数量。
  • 总产出:这是事务中总产出的数量。
  • 费用:这是收取的总费用。
  • 每字节费用:该字段表示总费用除以交易中的字节数。例如每字节 10 次。
  • 每重量单位费用:对于传统交易,使用总字节数 4* 计算。对于 SegWit 事务,它是通过将 SegWit 标记、标志和见证字段组合为一个重量单位,并将其他字段的每个字节组合为四个重量单位来计算的。

该笔交易在比特币网络上的交易 ID 为d28ca5a59b2239864eac1c96d3fd1c23b747f0ded8f5af0161bae8a616b56a1d,可以通过https://blockchain.info/提供的服务使用https://block chain . info/tx/d 28 ca 5a 59 b 2239864 ea C1 c 96d 3 FD 1c 23 b 747 f 0 ded 8 F5 af 0161 BAE 8 a 616 b 56 a 1d链接进行进一步探索。在交易发送到网络后,该交易 ID 在钱包软件中可用。从那里可以使用在线提供的许多比特币区块链探索者中的一个来进一步探索。我们以https://blockchain.info/为例。

比特币交易被序列化,以便在网络上传输,并以十六进制格式编码。例如,前面的交易也显示在这里。我们将在后面的事务部分看到如何解码这种十六进制编码的事务,以及事务由哪些字段组成。

01000000017d3876b14a7ac16d8d550abc78345b6571134ff173918a096ef90ff0430e12408b0000006b483045022100de6fd8120d9f142a82d5da9389e271caa3a757b01757c8e4fa7afbf92e74257c02202a78d4fbd52ae9f3a0083760d76f84643cf8ab80f5ef971e3f98ccba2c71758d012102c16942555f5e633645895c9affcb994ea7910097b7734a6c2d25468622f25e12ffffffff022c820000000000001976a914c568ffeb46c6a9362e44a5a49deaa6eab05a619a88acc06c0100000000001976a9149386c8c880488e80a6ce8f186f788f3585f74aee88ac00000000  

综上所述,比特币网络中的支付交易可以分为以下几个步骤:

  1. 交易开始于发送者用他们的私钥签署交易
  2. 事务被序列化,以便可以通过网络传输
  3. 交易被广播到网络
  4. 监听事务的矿工拾取事务
  5. 矿工验证交易的有效性
  6. 事务被添加到候选/建议的块中进行挖掘
  7. 一旦被挖掘出来,结果就会被广播到比特币网络上的所有节点

在本章的以下部分中,挖掘、事务和其他相关概念将变得更加清晰。现在,在下一节中,将介绍各种不同面值的比特币。

比特币是一种数字货币,有多种面值,如下表所示。发送者或接收者可以请求任何金额。最小的比特币面额是 Satoshi。比特币货币单位描述如下:

比特币面值

现在将向您逐一介绍比特币的构建模块。首先,我们将看看用于表示比特币网络上的所有权和价值转移的密钥和地址。

数字键和地址

在比特币网络上,拥有比特币和通过交易转移价值依赖于私钥、公钥和地址。在第六章公钥加密中,我们已经涵盖了这些概念,在这里我们将看到私钥和公钥是如何在比特币网络中使用的。

椭圆曲线密码 ( ECC )用于在比特币网络中生成公钥和私钥对。

比特币中的私钥

私钥需要安全保管,通常只存放在所有者一方。私钥用于对交易进行数字签名,以证明比特币的所有权。

私钥基本上是在secp256k1 ECDSA 曲线建议指定的范围内随机选择的 256 位数字。从0x10xFFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFE BAAE DCE6 AF48 A03B BFD2 5E8C D036 4140的任何随机选择的 256 位数字都是有效的私钥。

私钥通常使用钱包导入格式 ( WIF )进行编码,以便于复制和使用。这是一种以不同格式表示完整大小的私钥的方式。WIF 可以转换成私钥,反之亦然。这里描述了这些步骤。

以下是私钥的一个示例:

A3ED7EC8A03667180D01FB4251A546C2B9F2FE33507C68B7D9D4E1FA5714195201

当它被转换成 WIF 格式时,看起来像这样:

L2iN7umV7kbr6LuCmgM27rBnptGbDVc8g4ZBm6EbgTPQXnj1RCZP

感兴趣的读者可以使用以下网站提供的工具做一些实验: http://gobittest.appspot.com/PrivateKey

此外,迷你私钥格式有时用于创建最多 30 个字符的私钥,以允许在物理空间有限的地方存储,例如,在物理硬币上蚀刻或在抗损坏的 QR 码中编码。QR 码变得更抗损坏,因为更多的点可以用于纠错,而更少的点用于对私钥进行编码。使用迷你私钥格式编码的私钥有时也被称为迷你密钥。迷你私钥的第一个字符始终是大写字母S。迷你私钥可以被转换成正常大小的私钥,但是现有的正常大小的私钥不能被转换成迷你私钥。卡萨修斯实体比特币就使用了这种格式。

感兴趣的读者可以在这里找到更多信息https://en.bitcoin.it/wiki/Casascius_physical_bitcoins

一张 Casascius 实物比特币的安全全息纸,带有 minikey 和 QR 码

比特币核心客户端还允许对包含私钥的钱包进行加密。

比特币中的公钥

公钥存在于区块链上,所有网络参与者都可以看到它。由于公钥与私钥的特殊数学关系,公钥是从私钥派生出来的。一旦用私钥签名的交易在比特币网络上广播,节点就使用公钥来验证该交易确实是用相应的私钥签名的。这个验证过程证明了比特币的所有权。

比特币使用基于secp256k1标准的 ECC。更具体地说,它利用 ECDSA 来确保资金保持安全,并且只能由合法所有者使用。如果需要刷新相关的密码学概念,可以参考第六章,公钥密码学中对 ECC 的讲解。公钥的长度为 256 位。公钥可以用未压缩或压缩的格式表示。公钥基本上是椭圆曲线上的 xy 坐标。在未压缩格式中,公钥以十六进制格式的前缀0x4呈现。 xy 坐标长度均为 32 位。与未压缩格式的 65 字节相比,压缩的公钥总共有 33 字节长。公钥的压缩版本只包括 x 部分,因为 y 部分可以从中派生出来。

公钥的压缩版本工作的原因是,如果 ECC 图形被可视化,它揭示了 y 坐标可以在 x 轴之下或者在 x 轴之上,并且由于曲线是对称的,所以只需要存储素数域中的位置。如果 y 是偶数,则它在 x 轴上方,如果是奇数,则它在 x 轴下方。这意味着不是将 xy 都存储为公钥,而是仅将 x 与关于 y 是偶数还是奇数的信息一起存储。

最初,比特币客户端使用未压缩密钥,但从比特币核心客户端 0.6 开始,压缩密钥被作为标准。这使得区块链中用于存储公钥的空间减少了近 50%。

键由各种前缀标识,如下所述:

  • 未压缩的公钥使用0x04作为前缀
  • 如果公钥的 32 位部分 y 为奇数,则压缩公钥从0x03开始
  • 如果公钥的 y 32 位部分是偶数,则压缩公钥从0x02开始

比特币中的地址

一个比特币地址是通过获取一个私钥的相应公钥并散列两次来创建的,第一次使用 SHA-256 算法,然后使用 RIPEMD-160。然后,产生的 160 位哈希以版本号为前缀,最后使用 Base58Check 编码方案进行编码。比特币地址长度为 26-35 个字符,以数字13开头。

典型的比特币地址如下所示:

1ANAguGG8bikEv2fYsTBnRUmx7QUcK58wt  

这通常也编码在 QR 码中,以便于分发。前面比特币地址的二维码如下截图所示:

比特币地址的二维码 1 anagug G8 bike v2 fy stbnrumx 7 quck 58 wt

目前有两种类型的地址,常用的 P2PKH 和另一种 P2SH 类型,分别以数字13开头。在早期,比特币使用直接支付到 Pubkey,现在被 P2PKH 取代。这些类型将在本章后面解释。但是,直接支付到 Pubkey 仍然在比特币中用于 coinbase 地址。地址不应使用一次以上;否则,可能会出现隐私和安全问题。避免地址重用在一定程度上规避了匿名问题,比特币还有一些其他安全问题,如交易延展性、Sybil 攻击、种族攻击和自私挖掘,这些问题需要不同的方法来解决。

比特币协议的所谓隔离见证软分叉升级解决了交易延展性问题。这个概念将在本章后面解释。

来自 bitaddress.org,私人钥匙和比特币地址在一个纸质钱包里

Base58Check 检查编码

比特币地址使用 Base58Check 编码。这种编码用于限制各种字符之间的混淆,例如 0OIl,因为它们在不同的字体中看起来是一样的。编码基本上采用二进制字节数组,并将它们转换成人类可读的字符串。该字符串由一组 58 个字母数字符号组成。更多解释和逻辑可以在比特币源代码中的base58.h源文件(https://github.com/bitcoin/bitcoin/blob/master/src/base58.h)中找到:

/**
* Why base-58 instead of standard base-64 encoding?
* - Don't want 0OIl characters that look the same in some fonts and
* could be used to create visually identical looking data.
* - A string with non-alphanumeric characters is not as easily accepted as input.
* - E-mail usually won't line-break if there's no punctuation to break at.
* - Double-clicking selects the whole string as one word if it's all alphanumeric.
*/

虚荣的地址

由于比特币地址基于 base-58 编码,因此有可能生成包含人类可读消息的地址。一个例子如下所示:

QR 中编码的虚荣心公共地址

虚空地址是使用纯暴力方法生成的。下面的屏幕截图显示了一个带有虚拟地址的纸质钱包示例:

从 https://bitcoinvanitygen.com/生成的虚名地址

在前面的截图中,右下角显示了带有 QR 码的公共梳妆台地址。纸质钱包可以物理存储,作为私人钥匙电子存储的替代方案。

多重签名地址

顾名思义,这些地址需要多个私钥。实际上,这意味着为了发行硬币,需要一组特定的签名。这也被称为N 个中的 M 个多信号。这里 M 代表释放比特币所需的 N 个密钥的阈值或最小签名数。

处理

交易是比特币生态系统的核心。交易可以简单到只是将一些比特币发送到一个比特币地址,也可以根据要求相当复杂。每个事务至少由一个输入和输出组成。投入可以被认为是在以前的交易中产生的硬币,而产出可以被认为是正在产生的硬币。如果交易是铸造新硬币,那么没有输入,因此不需要签名。如果交易是将硬币发送给其他用户(比特币地址),则需要由发送者用他们的私钥签名,并且还需要参考之前的交易,以显示硬币的来源。事实上,硬币是 Satoshis 中表示的未使用的交易输出。

交易没有加密,在区块链公开可见。块由事务组成,可以使用任何在线区块链浏览器查看这些事务。

事务生命周期

以下步骤描述了事务生命周期:

  1. 用户/发送者使用钱包软件或一些其他接口发送交易。
  2. 钱包软件使用发送者的私钥对交易进行签名。
  3. 使用洪泛算法将交易广播到比特币网络。
  4. 监听事务的挖掘节点(挖掘器)验证该事务并将其包含在下一个要挖掘的块中。就在事务被放入块中之前,它们被放入一个称为事务池的特殊内存缓冲区中。下一节将解释事务池的用途。
  5. 采矿开始,这是一个确保区块链安全并产生新硬币作为对花费适当计算资源的矿工的奖励的过程。这一概念将在本章后面更详细地解释。
  6. 一旦挖掘器解决了 PoW 问题,它就向网络广播新挖掘的块。本章稍后将详细解释 PoW。
  7. 节点验证该块并进一步传播该块,然后开始生成确认。

  8. 最后,确认开始出现在接收者的钱包中,在大约三次确认之后,交易被认为是最终确定和确认的。但是,三到六只是一个推荐数字;即使在第一次确认之后,交易也可以被认为是最终的。等待六次确认背后的关键思想是,在三次确认后,重复消费的可能性几乎消除了。

交易费用

交易费用由矿商收取。收取的费用取决于交易的规模和重量。交易费用的计算方法是减去投入的总和和产出的总和。

可以使用一个简单的公式:

费用=总和(投入)-总和(产出)

这些费用被用作对矿商的激励,以鼓励他们在矿商正在创建的区块中包括用户交易。所有的事务都在内存池中结束,挖掘器从内存池中根据事务的优先级挑选事务,并将其包含在建议的块中。本章稍后将介绍优先级的计算;然而,从交易费用的角度来看,费用较高的交易会更快被矿商接受。

对于各种类型的操作,例如发送事务、包含在块中以及由节点进行中继,根据不同的规则来计算费用。比特币协议没有固定费用,也不是强制性的;即使没有费用的交易也会在适当的时候处理,但可能需要很长时间。然而,由于比特币网络上的高交易量和相互竞争的投资者,这不再可行,因此建议始终提供费用。在某些情况下,交易确认的时间通常从 10 分钟到超过 12 小时不等。交易时间取决于交易费用和网络活动。如果网络非常繁忙,自然交易将需要更长的时间来处理,如果你支付更高的费用,那么你的交易更有可能首先被矿工选中,因为更高的费用有额外的激励。

事务池

也称为内存池,这些池基本上是由节点在本地内存(计算机 RAM)中创建的,以便维护块中尚未确认的事务的临时列表。通过验证后,事务根据其优先级被包含在一个块中。

交易数据结构

高层次的事务包含元数据、输入和输出。事务被合并以创建一个块。

交易数据结构如下表所示:

| 字段 | 尺寸 | 描述 | | 版本号 | 4 字节 | 用于指定挖掘器和节点用于事务处理的规则。 | | 输入计数器 | 1-9 字节 | 交易中包含的输入数量(正整数)。 | | 输入列表 | 可变的 | 每个输入由几个字段组成,包括Previous Tx hashPrevious Txout-indexTxin-script lengthTxin-script和可选的序号。块中的第一个事务也称为 coinbase 事务。它指定一个或多个事务输入。 | | 输出计数器 | 1-9 字节 | 表示输出数量的正整数。 | | 输出列表 | 可变的 | 交易中包含的输出。 | | 锁定时间 | 4 字节 | 本字段定义交易生效的最早时间。它或者是 Unix 时间戳,或者是块高度。 |

一个示例事务如下所示。这是本章开始时提供的第一个支付交易示例中的解码交易。

{ 
   "lock_time":0, 
   "size":226, 
   "inputs":[ 
      { 
         "prev_out":{ 
            "index":139, 
        "hash":"40120e43f00ff96e098a9173f14f1371655b3478bc0a558d6dc17a4ab176387d" 
         }, 
"script":"483045022100de6fd8120d9f142a82d5da9389e271caa3a757b01757c8e4fa7afbf92e74257c02202a78d4fbd52ae9f3a0083760d76f84643cf8ab80f5ef971e3f98ccba2c71758d012102c16942555f5e633645895c9affcb994ea7910097b7734a6c2d25468622f25e12" 
      } 
   ], 
   "version":1, 
   "vin_sz":1, 
   "hash":"d28ca5a59b2239864eac1c96d3fd1c23b747f0ded8f5af0161bae8a616b56a1d", 
   "vout_sz":2, 
   "out":[ 
      { 
         "script_string":"OP_DUP OP_HASH160 c568ffeb46c6a9362e44a5a49deaa6eab05a619a OP_EQUALVERIFY OP_CHECKSIG", 
         "address":"1JzouJCVmMQBmTcd8K4Y5BP36gEFNn1ZJ3", 
         "value":33324, 
         "script":"76a914c568ffeb46c6a9362e44a5a49deaa6eab05a619a88ac" 
      }, 
      { 
         "script_string":"OP_DUP OP_HASH160 9386c8c880488e80a6ce8f186f788f3585f74aee OP_EQUALVERIFY OP_CHECKSIG", 
         "address":"1ET3oBGf8JpunjytE7owyVtmBjmvcDycQe", 
         "value":93376, 
         "script":"76a9149386c8c880488e80a6ce8f186f788f3585f74aee88ac" 
      } 
   ] 
} 

如前面的代码所示,事务由许多结构组成。所有这些元素都将在以下小节中进行描述。

[计]元数据

事务的这一部分包含一些值,比如事务的大小、输入和输出的数量、事务的散列和一个lock_time字段。每个事务都有一个指定版本号的前缀。这些字段显示在前面的示例中:lock_timesizeversion

输入

通常,每个输入花费一个先前的输出。每个输出都被认为是未用完的事务输出 ( UTXO ),直到一个输入消耗了它。UTXO 是未用完的事务输出,可以作为新事务的输入使用。

交易输入数据结构如下表所示:

| 字段 | 尺寸 | 描述 | | 交易散列 | 32 字节 | 这是以前使用 UTXO 的事务的散列。 | | 产出指数 | 4 字节 | 这是以前事务输出的索引,即 UTXO 要花费的时间。 | | 脚本长度 | 1-9 字节 | 这是解锁脚本的大小。 | | 解锁脚本 | 可变的 | 满足锁定脚本要求的输入脚本(ScriptSig)。 | | 序号 | 4 字节 | 通常禁用或包含锁定时间。禁用由'0xFFFFFFFF'表示。 |

在前面的例子中,输入在"inputs" : [部分定义。

输出

输出有三个字段,它们包含发送比特币的指令。第一个字段包含 Satoshis 的数量,而第二个字段包含锁定脚本的大小。最后,第三个字段包含一个锁定脚本,该脚本包含需要满足的条件,以便输出被花费。本节稍后将讨论使用锁定和解锁脚本以及生成输出的事务开销的更多信息。

交易输出数据结构如下所示:

| 字段 | 尺寸 | 描述 | | 价值 | 8 字节 | 要传输的 Satoshis 的正整数总数 | | 脚本大小 | 1-9 字节 | 锁定脚本的大小 | | 锁定脚本 | 可变的 | 输出脚本(ScriptPubKey) |

在前面的例子中,两个输出显示在"OUT":[部分。

确认

使用比特币的脚本语言进行验证,这将在下一节详细介绍。

脚本语言

比特币使用一种简单的基于堆栈的语言,称为 script 来描述比特币如何被花费和转移。它不是图灵完整的,也没有循环来避免比特币网络上长时间运行/挂起脚本的任何不良影响。这种脚本语言基于类似语法的第四编程语言,并使用反向波兰符号,其中每个操作数后面都跟有操作符。使用后进先出 ( LIFO )栈从左到右对其进行评估。

脚本使用各种操作码或指令来定义它们的操作。操作码也称为字、命令或函数。比特币节点的早期版本有一些操作码,由于在设计中发现了错误,这些操作码不再使用。

脚本操作码的各种类别是常量、流控制、堆栈、逐位逻辑、拼接、算术、加密和锁定时间。

通过组合ScriptSigScriptPubKey来评估事务脚本。ScriptSig是解锁脚本,而ScriptPubKey是锁定脚本。这是如何评估要花费的交易的:

  1. 首先,它被解锁,然后被花掉
  2. ScriptSig由希望解锁交易的用户提供
  3. ScriptPubkey是交易输出的一部分,规定了花费输出所需满足的条件
  4. 换句话说,输出被包含条件的ScriptPubKey锁定,当满足条件时将解锁输出,然后硬币可以被兑换

常用操作码

所有操作码都在比特币参考客户端源代码的script.h文件中声明。

这个可以从https://gIthub处的链接进入。com/bItcoIn/bItco /src/scrIpt/scrI h 下有如下注释: /** Script opcodes */

这里列出了最常用的操作码的描述。这张表摘自《比特币开发者指南:

| 操作码 | 描述 | | OP_CHECKSIG | 这需要一个公钥和签名,并验证事务散列的签名。如果匹配,那么TRUE被推送到堆栈上;否则,FALSE被推送。 | | OP_EQUAL | 如果输入完全相等,则返回1;否则,返回0。 | | OP_DUP | 这复制了堆栈中的顶部项目。 | | OP_HASH160 | 输入被散列两次,第一次用 SHA-256,然后用 RIPEMD-160。 | | OP_VERIFY | 如果顶层堆栈值不为真,则将事务标记为无效。 | | OP_EQUALVERIFY | 这个和OP_EQUAL一样,但是之后运行OP_VERIFY。 | | OP_CHECKMULTISIG | 这将获取第一个签名,并将其与每个公钥进行比较,直到找到匹配项,并重复此过程,直到检查完所有签名。如果所有的签名都是有效的,那么返回一个值1作为结果;否则,返回0。 |

交易类型

比特币中有各种脚本来处理从源到目的地的价值转移。根据交易的要求,这些脚本从非常简单到非常复杂不等。这里讨论的是标准交易类型。使用IsStandard()IsStandardTx()测试评估标准交易,通常只有通过测试的标准交易才允许在比特币网络上挖掘或广播。但是,非标准交易在网络上是有效和允许的。

以下是标准交易类型:

  • 支付到公钥哈希 ( P2PKH ): P2PKH 是最常用的交易类型,用于向比特币地址发送交易。交易的格式如下所示:
      ScriptPubKey: OP_DUP OP_HASH160 <pubKeyHash> OP_EQUALVERIFY OP_CHECKSIG
      ScriptSig: <sig> <pubKey>

ScriptPubKeyScriptSig参数连接在一起并被执行。本节稍后将给出一个示例,我们将对此进行更详细的解释。

  • 支付给脚本哈希 ( P2SH ): P2SH 用于将交易发送给脚本哈希(即以3开头的地址),并在 BIP16 中标准化。除了传递脚本之外,还会评估 rename 脚本,并且该脚本必须有效。该模板如下所示:
      ScriptPubKey: OP_HASH160 <redeemScriptHash> OP_EQUAL
      ScriptSig: [<sig>...<sign>] <redeemScript>
  • MultiSig(Pay to MultiSig):M-of-N MultiSig 交易脚本是一种复杂类型的脚本,它可以构建一个要求多个签名有效才能兑现交易的脚本。使用这个脚本可以构建各种复杂的交易,比如托管和存款。模板如下所示:
      ScriptPubKey: <m> <pubKey> [<pubKey> . . . ] <n> OP_CHECKMULTISIG
      ScriptSig: 0 [<sig > . . . <sign>]

原始 multisig 已经过时,multisig 通常是 P2SH rename 脚本的一部分,在前面的要点中提到过。

  • Pay to Pubkey :这个脚本是一个非常简单的脚本,常用于 coinbase 交易。它现在已经过时了,曾用于旧版比特币。在这种情况下,公钥存储在脚本中,解锁脚本需要用私钥对事务进行签名。

该模板如下所示:

      <PubKey> OP_CHECKSIG
  • 空数据/OP_RETURN :该脚本用于在区块链上存储任意数据,收取费用。消息的长度限制为 40 个字节。该脚本的输出是不可恢复的,因为OP_RETURN无论如何都无法通过验证。这种情况下不需要ScriptSig

该模板非常简单,如下所示:

      OP_RETURN <data>

下图显示了 P2PKH 脚本的执行:

P2PKH 脚本执行

在通过比特币网络传输之前,所有交易最终都会被编码成十六进制格式。这里以十六进制格式显示了一个示例交易,该交易是在 mainnet 上运行的比特币节点上使用bitcoin-cli检索的:

$ bitcoin-cli getrawtransaction "d28ca5a59b2239864eac1c96d3fd1c23b747f0ded8f5af0161bae8a616b56a1d" 
{ 
  "result": "01000000017d3876b14a7ac16d8d550abc78345b6571134ff173918a096ef90ff0430e12408b0000006b483045022100de6fd8120d9f142a82d5da9389e271caa3a757b01757c8e4fa7afbf92e74257c02202a78d4fbd52ae9f3a0083760d76f84643cf8ab80f5ef971e3f98ccba2c71758d012102c16942555f5e633645895c9affcb994ea7910097b7734a6c2d25468622f25e12ffffffff022c820000000000001976a914c568ffeb46c6a9362e44a5a49deaa6eab05a619a88acc06c0100000000001976a9149386c8c880488e80a6ce8f186f788f3585f74aee88ac00000000", 
  "error": null, 
  "id": null 
} 

请注意,这与本章开始时作为示例介绍的事务相同。

比特币基地交易

coinbase 事务或生成事务总是由挖掘器创建,并且是块中的第一个事务。它被用来创造新的硬币。它包含一个特殊字段,也称为coinbase,作为 coinbase 事务的输入。该事务还允许使用多达 100 字节的任意数据来存储任意数据。在 genesis block 中,这笔交易包含了来自《泰晤士报》的最著名的评论:

"《泰晤士报》03/1/2009 财政大臣濒临第二次银行救助."

这条消息证明了创世纪区块的开采时间不早于 2009 年 1 月 3 日。这是因为第一个比特币区块(genesis block)创建于 2009 年 1 月 3 日,这篇新闻摘录摘自当天的报纸。

coinbase 事务输入与通常的事务输入具有相同数量的字段,但是该结构包含 coinbase 数据大小和 coinbase 数据字段,而不是解锁脚本大小和解锁脚本字段。此外,它没有指向前一个事务的引用指针。该结构如下表所示:

| 字段 | 尺寸 | 描述 | | 交易散列 | 32 字节 | 设置为全零,因为不使用哈希引用 | | 产出指数 | 4 字节 | 设置为0xFFFFFFFF | | 比特币基地数据长度 | 1-9 字节 | 2 字节-100 字节 | | 数据 | 可变的 | 任何数据 | | 序号 | 4 字节 | 设置为0xFFFFFFFF |

契约

根据比特币核心开发者指南的定义,合同基本上是使用比特币系统执行金融协议的交易。这是一个简单的定义,但具有深远的影响,因为它允许用户设计可以在许多现实世界场景中使用的复杂契约。合同允许开发一个完全分散的、独立的、降低风险的平台。

可以使用比特币脚本语言建立各种合同,如托管、仲裁和小额支付渠道。一个脚本的当前实现非常有限,但是各种类型的契约仍然有可能被开发。例如,只有在多方签署交易时才释放资金,或者可能只有在一定时间过去后才释放资金。这两种情况都可以使用 multisig 和事务锁定时间选项来实现。

事务处理

这个验证过程是由比特币节点执行的。以下是比特币开发者指南中的描述:

  1. 检查语法,确保事务的语法和数据结构符合协议提供的规则。
  2. 验证没有事务输入和输出为空。
  3. 检查字节大小是否小于最大块大小。
  4. 产值必须在允许的货币范围内(0 到 2100 万 BTC)。
  5. 所有输入都必须有指定的先前输出,coinbase 事务除外,它不应被中继。
  6. 验证nLockTime不得超过 31 位。(nLockTime指定交易不包含在块中的时间。)
  7. 为了使事务有效,它不应少于 100 字节。
  8. 标准事务中签名操作的数量应该少于或不多于两个。
  9. 拒绝非标准交易;例如,ScriptSig只允许将数字压入堆栈。ScriptPubkey没有通过isStandard()的检查。isStandard()检查指定只允许标准交易。
  10. 如果在主分支的池或块中已经有匹配的事务,则拒绝该事务。
  11. 如果每个输入的引用输出存在于池中的任何其他事务中,则该事务将被拒绝。
  12. 对于每个输入,必须存在一个引用的输出未用交易。
  13. 对于每个输入,如果引用的输出交易是 coinbase,它必须有至少 100 个确认;否则,交易将被拒绝。

  14. 对于每个输入,如果引用的输出不存在或已经被花费,则交易将被拒绝。

  15. 使用引用的输出事务来获取输入值,验证每个输入值以及总和是否在 0-2100 万 BTC 的允许范围内。如果输入值之和小于输出值之和,则拒绝交易。

  16. 如果交易费用太低,无法进入空区块,则拒绝交易。
  17. 每个输入解锁脚本必须有相应的有效输出脚本。

交易延展性

比特币中的交易延展性是由于比特币实现中的一个 bug 而引入的。由于这个 bug,对手有可能更改事务的事务 ID,从而导致看起来某个事务没有被执行的情况。这可能会出现重复存款或取款的情况。换句话说,这个漏洞允许在比特币交易被确认之前更改其唯一 ID。如果在确认之前更改了 ID,交易似乎根本就没有发生,这可能会导致这些攻击。

区块链

区块链是比特币网络上所有交易的带时间戳、有序且不可变的公共账本。每个块由链中的散列来标识,并通过引用前一个块的散列来链接到其前一个块。

下表列出了模块的结构,随后是详细的图表,提供了区块链结构的详细视图。

街区的结构

下表显示了块的结构:

| 字段 | 尺寸 | 描述 | | 块大小 | 4 字节 | 这是街区的大小。 | | 块标题 | 80 字节 | 这包括下一节描述的块标题中的字段。 | | 交易计数器 | 可变的 | 该字段包含块中的事务总数,包括 coinbase 事务。大小范围为 1-9 字节 | | 处理 | 可变的 | 块中的所有事务。 |

块标题的结构

下表描述了块标题的结构:

| 字段 | 尺寸 | 描述 | | 版本 | 4 字节 | 指示要遵循的块验证规则的块版本号。 | | 前一个块的头哈希 | 32 字节 | 这是前一个块头的双 SHA-256 散列。 | | Merkle 根哈希 | 32 字节 | 这是块中包含的所有事务的 Merkle 树的双 SHA-256 散列。 | | 时间戳 | 4 字节 | 该字段包含 Unix 纪元时间格式的数据块的大致创建时间。更准确地说,这是矿工开始散列报头的时间。(矿工角度的时间。) | | 难度目标 | 4 字节 | 这是网络/区块的当前难度目标。 | | 目前 | 4 字节 | 这是一个任意的数字,矿工反复改变它以产生一个低于难度目标的散列。 |

如下图所示,区块链是一个数据块链,其中每个数据块都通过引用前一个数据块头的哈希链接到其前一个数据块。这种链接确保了除非记录事务的块和其后的所有块都被修改,否则任何事务都不能被修改。第一个区块不与任何先前的区块链接,被称为创世区块。

区块链、块、块标题、事务和脚本的可视化

上图显示了比特币区块链的高级概述。在左侧,从上到下显示了模块。每个块包含事务和块标题,它们在右侧被进一步放大。在顶部,首先,块标题被展开以显示块标题中的各种元素。然后,在右侧,块标题的 Merkle root 元素以放大视图显示,显示 Merkle root 是如何计算的。我们之前已经详细讨论过 Merkle 树,如果需要修改概念,可以参考第五章对称密码。进一步向下的事务也被放大,以显示事务的结构及其包含的元素。此外,请注意,通过展示锁定和解锁脚本的样子,对事务进行了进一步的阐述。这张图显示了许多组件,我们将在本章中讨论所有这些组件。

创世街区

这是比特币区块链的第一块。创世纪块被硬编码在比特币核心软件中。它在chainparams.cpp文件中(https://github . com/bit coin/bit coin/blob/master/src/chain params . CPP):

static CBlock CreateGenesisBlock(uint32_t nTime, uint32_t nNonce, uint32_t nBits, int32_t nVersion, const CAmount& genesisReward) 
{ 
   const char* pszTimestamp = "The Times 03/Jan/2009 Chancellor on brink of second bailout for banks"; 
   const CScript genesisOutputScript = CScript() <<  
ParseHex("04678afdb0fe5548271967f1a67130b7105cd6a828e03909a67962e0ea1f61deb649f6bc3f4cef38c4f35504e51ec112de5c384df7ba0b8d578a4c702b6bf11d5f") << OP_CHECKSIG; 
   return CreateGenesisBlock(pszTimestamp, genesisOutputScript, nTime, nNonce, 
   nBits, nVersion, genesisReward); 
} 

比特币通过执行严格的交易验证规则和通过挖掘来防止重复支出。只有在前面的交易验证部分解释的严格规则检查和成功的 PoW 解决方案之后,交易和块才会被添加到区块链中。块高度是区块链中特定块之前的块数。区块链目前的高度(截至 2018 年 3 月 6 日)为 512,328 块。战俘被用来保卫区块链。每个块包含一个或多个事务,其中第一个事务是 coinbase 事务。coinbase 事务有一个特殊的条件,防止它们在至少 100 个块之前被耗尽,以避免以后该块可能被声明为陈旧的情况。

当一个块被解决,并且每个其他仍在寻找散列难题的解决方案的挖掘者都在该块上工作时,旧块被创建。挖掘和散列谜题将在本章后面详细讨论。由于不再需要对该块进行操作,因此该块被视为陈旧块。

孤立块也称为分离块,并且在某个时间点被网络接受为有效块,但是当创建不包括该最初接受的块的证明较长的链时被拒绝。它们不是主链的一部分,有时会发生在两个矿工设法同时生产区块的时候。

最新的块版本是版本 4,它是由 BIP65 提出的,自比特币核心客户端 0.11.2 以来一直在使用,因为在nVersion字段中的 BIP9 位的实现被用于指示软分叉更改。

由于比特币的分布式特性,网络分叉可以自然发生。在两个节点同时宣告有效块的情况下,可能会导致两个区块链具有不同事务的情况。这是一种不可取的情况,但比特币网络只能通过接受最长的链来解决这一问题。在这种情况下,较小的链将被视为孤立链。如果对手设法获得网络散列率(计算能力)的 51%的控制权,那么他们可以强加他们自己的交易历史版本。

随着比特币协议的变化,区块链也会出现分叉。在软分叉的情况下,选择不升级到支持更新协议的最新版本的客户端仍然能够正常工作和操作。在这种情况下,前一个块和新块都是可以接受的,从而使软 fork 向后兼容。

在软分叉的情况下,只有矿工需要升级到新的客户端软件,以便利用新的协议规则。计划中的升级不一定会创建分叉,因为所有用户都应该已经更新了。另一方面,硬分叉会使以前有效的块失效,并要求所有用户进行升级。有时会添加新的事务类型作为软分叉,任何更改(如块结构更改或主要协议更改)都会导致硬分叉。截至 2017 年 10 月 29 日,比特币区块链的当前大小约为 139 GB。

下图显示了区块链的大小随时间的变化:

截至 2017 年 10 月 29 日区块链的当前面积

大约每 10 分钟就有新的数据块添加到区块链中,并且每 2016 个数据块动态调整一次网络难度,以保持新数据块稳定地添加到网络中。

网络难度使用以下公式计算:

目标=上一个目标时间/2016 * 10 分钟*

难度和目标是可以互换的,代表的是同一个东西。Previous target 代表旧的目标值,time 是生成前 2016 个块所花费的时间。网络难度基本上就是矿工找一个新块有多难,也就是现在的哈希拼图有多难。

在下一节中,将讨论挖掘,这将解释如何解决哈希难题。

采矿

采矿是将新的区块添加到区块链的过程。块包含由比特币网络上的挖掘节点通过挖掘过程验证的交易。块,一旦开采和验证被添加到区块链,保持区块链增长。由于 PoW 的要求,该过程是资源密集型的,在 PoW 中,矿工竞争以找到小于网络难度目标的数字。这种寻找正确值的困难(有时也称为数学难题)是为了确保在新提议的区块可以被接受之前,所需的资源已经被采矿者使用。矿工通过解决 PoW 问题来铸造新硬币,PoW 问题也称为部分哈希反转问题。这个过程消耗大量的资源,包括计算能力和电力。这一过程还可以保护系统免受欺诈和双重消费攻击,同时向比特币生态系统添加更多虚拟货币。

大约每 10 分钟就会产生一个新的区块,以控制比特币的产生频率。这个频率需要由比特币网络维护,并在比特币核心客户端中编码,以便控制货币供应。当矿工通过解谜发现新的方块时,他们会得到新的硬币作为奖励。矿商将交易纳入他们提议的区块,就可以获得交易费。新数据块以大约每 10 分钟的固定速率创建。大约每 4 年,每 210,000 个区块,新比特币的创造速度就会下降 50%。比特币刚推出的时候,区块奖励是 50 个比特币;然后在 2012 年,这个减少到 25 个比特币。2016 年 7 月,这进一步降低到 12.5 个硬币(12 个硬币),下一次降低估计是在 2020 年 7 月 4 日。这将减少硬币奖励进一步下降到大约六个硬币。

每天大约产生 144 块,即 1728 个比特币。实际硬币的数量每天都不同;然而,每天的数据块数量保持在 144 个。比特币的供应也是有限的,到 2140 年,将有近 2100 万个比特币最终被创造出来,此后将不会再有新的比特币被创造出来。然而,比特币矿商仍将能够通过收取交易费从这个生态系统中获利。

矿工的任务

一旦一个节点连接到比特币网络,比特币矿工就要执行几项任务:

  1. 与网络同步:一旦一个新节点加入比特币网络,它就会通过向其他节点请求历史区块来下载区块链。这是在比特币矿工的背景下提到的;然而,这不一定只是矿工的任务。
  2. 交易验证:网络上广播的交易由全节点通过验证和确认签名和输出进行验证。
  3. 块验证:挖掘器和完整节点可以开始验证它们接收到的块,方法是根据某些规则对它们进行评估。这包括验证块中的每个交易以及验证随机数值。
  4. 创建新块:矿工在验证网络上广播的交易后,通过组合这些交易提出一个新块。
  5. 执行工作证明:这项任务是采矿过程的核心,这是矿工通过解决计算难题找到有效区块的地方。块报头包含 32 位随机数字段,并且要求挖掘者重复改变随机数,直到结果散列小于预定目标。
  6. 获取奖励:一旦某个节点解决了 hash puzzle (PoW),立即广播结果,其他节点验证并接受分块。由于与大约同时发现的另一个区块发生冲突,新铸造的区块有轻微的机会不被网络上的其他矿工接受,但一旦被接受,矿工将获得 12.5 个比特币和任何相关的交易费用。

采矿奖励

当比特币在 2009 年诞生时,采矿奖励曾经是 50 个比特币。每 210,000 个方块后,方块奖励减半。2012 年 11 月,比特币价格减半至 25 比特币。目前,自 2016 年 7 月以来,该价格为每块 12.5 BTC。下一次减半是在 2020 年 6 月 12 日星期五,此后,区块奖励将减少到每区块 6.25 BTC。这种机制被硬编码在比特币中,以监管、控制通胀和限制比特币的供应。

工作证明

这证明已经花费了足够的计算资源来构建有效的块。PoW 基于这样一种思想,即每次选择一个随机节点来创建一个新块。在该模型中,节点相互竞争,以便根据它们的计算能力按比例被选择。以下等式总结了比特币的 PoW 要求:

H ( N || P_hash || Tx || Tx ||。。。Tx) <目标

其中 N 为 nonce, P_hash 为前一个块的 hash, Tx 表示该块中的事务, Target 为目标网络难度值。这意味着前面提到的串联字段的散列应该小于目标散列值。

找到这个随机数的唯一方法是蛮力方法。一旦某个挖掘者遇到某个模式的某个数量的零,该块立即被广播并被其他挖掘者接受。

挖掘算法

挖掘算法由以下步骤组成。

  1. 从比特币网络中检索前一个块的头。
  2. 将网络上广播的一组事务组合成一个待建议的块。
  3. 使用 SHA-256 算法计算前一个块的头与一个随机数和新提出的块的双重散列。
  4. 检查结果散列是否低于当前难度级别(目标),然后求解 PoW。作为成功 PoW 的结果,所发现的块被广播到网络,并且矿工获得奖励。
  5. 如果结果散列不小于当前难度级别(目标),则在递增 nonce 之后重复该过程。

随着比特币网络的哈希速率增加,32 位 nonce 的总量很快耗尽。为了解决这个问题,实现了额外随机数解决方案,其中 coinbase 事务被用作额外随机数的来源,以提供更大范围的随机数供挖掘器搜索。

使用以下流程图可以直观地看到这一过程:

采矿过程

挖掘难度随着时间的推移而增加,可以由单 CPU 笔记本电脑挖掘的比特币现在需要专门的挖掘中心来解决哈希难题。可以使用比特币命令行界面使用以下命令来查询当前难度级别:

$ bitcoin-cli getdifficulty 
1452839779145

这个数字代表了比特币网络的难度等级。回想一下前面的章节,矿工们竞相寻找问题的解决方案。事实上,这个数字表明,找到一个低于网络难度目标的散列是多么困难。所有成功挖掘的块必须包含小于该目标数的哈希。该数字每 2 周或 2016 个数据块更新一次,以确保保持平均 10 分钟的数据块生成时间。

比特币网络难度呈指数增长,下图显示了一年内的难度水平:

过去一年的采矿难度

上图显示了比特币网络在去年一段时间内的困难程度,并且这种困难程度已经显著增加。之所以挖掘难度增加,是因为在比特币中,区块生成时间必须始终在 10 分钟左右。这意味着,如果块被快速硬件挖掘得太快,那么难度就会增加,因此块生成时间可以保持在每个块大约 10 分钟。反之亦然,如果每 10 分钟不开采一次,难度就会降低。难度,每 2016 块计算一次(两周一次)并相应调整。如果前一组 2016 区块在不到两周的时间内开采,那么难度将会增加。类似地,如果在两周多的时间内发现了 2016 个区块(如果每 10 分钟开采一次区块,则 2016 个区块需要 2 周才能开采完),则难度会降低。

哈希速率

哈希速率基本上代表每秒计算哈希的速率。换句话说,这是比特币网络中的矿工计算哈希以找到一个块的速度。在比特币的早期,由于使用了 CPU,它的规模非常小。然而,随着专用矿池和专用集成电路的出现,这种情况在过去几年里呈指数增长。这导致了比特币网络的难度增加。下面的哈希速率图显示了哈希速率随时间的增长,目前以 Exa 哈希为单位进行测量。这意味着在 1 秒钟内,比特币网络矿工每秒计算超过 240 亿次哈希。

截至 2018 年 3 月的散列率(以 Exa-hashes 衡量),显示了一年的时间

采矿系统

久而久之,比特币矿工用各种方法开采比特币。由于挖掘背后的核心原理是基于双 SHA-256 算法,加班专家已经开发了复杂的系统来计算越来越快的散列。以下是对比特币中使用的不同类型的挖掘方法以及它们如何随时间演变的回顾。

中央处理器

CPU 挖掘是最初的比特币客户端中第一个可用的挖掘类型。用户甚至可以使用笔记本电脑或台式电脑来挖掘比特币。CPU 挖掘不再有利可图,现在使用更先进的挖掘方法,如基于 ASIC 的挖掘。自从比特币引入以来,CPU 挖掘只持续了大约一年多,不久矿工们就开始探索和尝试其他方法。

国家政治保卫局。参见 OGPU

由于比特币网络难度的增加以及寻找更快采矿方法的普遍趋势,矿工们开始使用 PC 中可用的 GPU 或显卡来进行采矿。GPU 支持通常使用 OpenCL 语言编程的更快的并行计算。与 CPU 相比,这是一个更快的选择。用户还使用超频等技术来获得 GPU 能力的最大优势。此外,使用多个图形卡的可能性增加了图形卡用于比特币挖掘的流行程度。然而,GPU 采矿有一些限制,例如过热和需要专门的主板和额外的硬件来容纳多个显卡。从另一个角度来看,由于需求增加,显卡变得非常昂贵,这影响了游戏玩家和图形软件用户。

现场可编程门阵列 (Field Programmable Gata Array 的缩写)

甚至 GPU 采矿也没有持续多久,很快矿工们找到了另一种使用 FPGAs 进行采矿的方法。现场可编程门阵列 ( FPGA )基本上是一个集成电路,可以通过编程来执行特定的操作。FPGAs 通常用硬件描述语言 ( HDLs )编程,比如 Verilog 和 VHDL。双 SHA-256 很快成为 FPGA 程序员的一个有吸引力的编程任务,几个开源项目也开始了。与 GPU 相比,FPGA 提供了更好的性能;然而,诸如可访问性、编程难度以及对编程和配置 FPGA 的专业知识的要求等问题导致了比特币挖矿的 FPGA 时代的短暂。

ASICs 的出现导致基于 FPGA 的采矿系统迅速被淘汰。在 FPGA 采矿有利可图的时期,开发了 X6500 miner、Ztex 和 Icarus 等采矿硬件。各种 FPGA 制造商,如 Xilinx 和 Altera,生产可用于编程挖掘算法的 FPGA 硬件和开发板。需要注意的是,GPU 挖矿对于其他一些加密货币比如 Zcoin(https://zcoin.io/guide-on-how-to-mine-zcoin-xzc/)在一定程度上还是有利可图的,但是比特币不行,因为比特币的网络难度很高,只有并行运行的 ASICs(专用硬件)才能产生一定的合理利润。

专用集成电路(ApplicationSpecificIntegratedCircuits)

专用集成电路 ( ASIC )被设计来执行 SHA-256 操作。这些特殊的芯片由不同的制造商出售,并且提供非常高的散列率。这种方法曾经奏效过一段时间,但是由于采矿难度的快速增加,单体 ASICs 不再有利可图。

目前,采矿是个人力所不及的,因为需要花费大量的精力和金钱来建立一个有利可图的采矿平台。现在,平行使用数千个 ASIC 单元的专业采矿中心向用户提供采矿合同,以代表他们进行采矿。没有技术限制,单个用户可以并行运行数千个 ASICs,但这需要专用的数据中心和硬件,因此,单个人的成本可能会高得令人望而却步。以下是四种类型的采矿硬件:

中央处理器

国家政治保卫局。参见 OGPU

现场可编程门阵列 (Field Programmable Gata Array 的缩写)

专用集成电路

采矿池

当一群矿工一起开采一个区块时,就形成了一个矿池。如果区块被成功开采,则池管理器接收 coinbase 交易,然后负责将奖励分配给投入资源开采该区块的一组矿工。这与单独挖掘相比是有利可图的,在单独挖掘中,只有一个单独的挖掘者试图解决部分散列求逆函数(散列难题),因为在挖掘池中,奖励被支付给池中的每个成员,而不管他们(更具体地说,他们的单个节点)是否解决了难题。

有各种各样的模型可供矿池管理者用来支付给矿工,例如每股支付 ( PPS )模型和比例模型。在 PPS 模型中,采矿池管理器向参与采矿活动的所有矿工支付固定费用,而在比例模型中,份额是根据解决哈希难题所花费的计算资源量来计算的。

现在存在许多商业池,它们通过云和易于使用的 web 界面提供采矿服务合同。最常用的有 ant pool(https://www.antpool.com)、BTC(https://btc.com)、BTC TOP(http://www . BTC . TOP)。下图显示了所有主要挖掘池的哈希能力的比较:

截至 2017 年 10 月 28 日的挖掘池及其哈希能力(哈希速率)

资料来源:https://blockchain.info/pools

如果一个池通过生成超过 51%的比特币网络散列率来控制超过 51%的网络,则可能发生挖掘集中化。

正如前面在简介部分所讨论的,51%的攻击可以导致成功的双支出攻击,它可以影响共识,事实上在比特币网络上强加另一个版本的交易历史。

这个事件在比特币历史上发生过一次,当时 GHash。大型矿池 IO 设法获得了超过 51%的网络容量。学术界已经提出了理论解决方案,如两阶段 PoW(http://hacking distributed . com/2014/06/18/how-to-disentifice-large-bit coin-mining-pools/),以抑制大型矿池。该方案引入了第二个密码难题,该难题导致挖掘池要么暴露它们的私钥,要么提供它们的挖掘池的散列率的相当大的部分,从而降低池的整体散列率。

各种类型的硬件在商业上可用于采矿目的。目前,最赚钱的是 ASIC 采矿,专业硬件可从许多供应商获得,如 Antminer、AvalonMiner 和 Whatsminer。除非花费大量的金钱和精力来建造你自己的采矿设备,甚至是数据中心,否则单独采矿现在是没有多少利润的。以目前的难度系数(2018 年 3 月),如果用户设法生产 12 TH/s 的哈希速率,他们可以希望每天获得 0.0009170 BTC(约 6 美元),这与采购可以生产 12 TH 的设备所需的投资相比非常低。包括电费等运营成本在内,这并不十分有利可图。

例如,Antminer S9 是一款高效的 ASIC 矿机,产生的哈希功率为 13.5 TH/s,似乎每天都能产生一些利润,这是事实,但一台 Antminer S9 的成本约为 1700 英镑,加上电费,投资回报几乎是在开采一年后产生的约 0.3 BTC。投资似乎还可以,但也要考虑这样一个事实,即比特币网络的难度会随着时间的推移而不断增加,在一年内挖掘会变得更加困难,而挖掘硬件将在几个月内耗尽其效用。

摘要

本章一开始,我们从用户的角度介绍了比特币以及交易的运作方式。然后,我们从技术角度介绍了事务。后来我们讨论了比特币中使用的公钥和私钥。

在下一节中,我们介绍了地址及其不同的类型,随后讨论了事务、类型和用法。接下来,我们看了区块链,他详细解释了区块链是如何工作的,以及比特币区块链包含哪些不同的组件。

在本章的最后几节,我们介绍了挖掘过程和相关概念。


我们一直在努力

apachecn/AiLearning

【布客】中文翻译组