第 2 章. 比特币是怎么运作的

  • berry
  • 发布于 2025-02-06 11:20
  • 阅读 8

综合介绍

比特币系统与传统银行和支付系统不同,不需要对第三方进行信任。在比特币中,每个用户都可以使用在自己计算机上运行的软件来验证比特币系统的每个方面的正确运行,而不是依赖于中央受信任的权威机构。在本章中,我们将通过追踪单个交易在比特币系统中的流动,并观察其如何记录在区块链上,即所有交易的分布式日志,来从高层次审视比特币。后续章节将深入探讨交易背后的技术、网络和挖矿等内容。

比特币概述

比特币系统由拥有包含密钥的钱包的用户、在网络中传播的交易以及通过竞争性计算生成共识区块链的矿工组成,后者是所有交易的权威账簿。

本章中的每个示例都基于比特币网络上进行的实际交易,通过将资金从一个钱包发送到另一个钱包来模拟用户之间的交互。在跟踪交易通过比特币网络到区块链的过程中,我们将使用区块链浏览器网站来可视化每一步。区块链浏览器是一种网络应用程序,它充当比特币搜索引擎,允许您搜索地址、交易和区块,并查看它们之间的关系和流动。

一些受欢迎的区块链浏览器包括以下几种:

这些浏览器都具有搜索功能,可以接受比特币地址、交易哈希、区块编号或区块哈希,并从比特币网络中检索相应的信息。对于每个交易或区块示例,我们将提供一个URL,以便您自行查看并详细研究。

{% hint style="danger" %} 区块链浏览器隐私警告

在区块链浏览器上搜索信息可能会向其运营者透露您对该信息感兴趣,使他们能够将其与您的IP地址、浏览器详细信息、过去的搜索记录或其他可识别信息关联起来。如果您在本书中查找交易,区块链浏览器的运营者可能会猜测您正在学习比特币,这不应该是问题。但是,如果您查找自己的交易,运营者可能会猜测您收到了多少比特币、花费了多少比特币,以及当前拥有多少比特币。 {% endhint %}

从在线商店购买

在前一章中介绍的爱丽丝是一位新用户,她刚刚获得了自己的第一笔比特币。在“获取你的第一笔比特币”中,爱丽丝在第11页,与她的朋友乔见面,用一些现金换取了比特币。自那以后,爱丽丝又购买了额外的比特币。现在,爱丽丝将进行她的第一笔消费交易,购买鲍勃在线商店的一个高级播客剧集的访问权限。

鲍勃的网店最近开始接受比特币支付,通过在网站上添加比特币选项。鲍勃商店的价格以当地货币(美元)列出,但在结账时,顾客可以选择以美元或比特币支付。

爱丽丝找到了她想要购买的播客剧集,并前往结账页面。在结账时,除了通常的选项外,爱丽丝还可以选择使用比特币付款。结账购物车显示了以美元和比特币(BTC)计价的价格,以及比特币的当前汇率。

鲍勃的电子商务系统将自动生成一个包含发票的二维码(见图2-1)。

<figure><img src="https://img.learnblockchain.cn/masterbitcoin3/assets/2.1.png" alt=""><figcaption><p>图 2-1. 发票二维码</p></figcaption></figure>

不同于只包含目标比特币地址的二维码,这个发票是一个包含目标地址、支付金额和描述的QR编码URI。这使得比特币钱包应用程序能够预先填写用于发送付款的信息,同时向用户显示可读的描述。您可以使用比特币钱包应用程序扫描QR码,以查看Alice将看到的内容:bitcoin:bc1qk2g6u8p4qm2s2lh3gts5cpt2mrv5skcuu7u3e4?amount=0.01577764\&label=Bob%27s%20Store\&message=Purchase%20at%20Bob%27s%20Store

URI的组成部分:

  • 比特币地址:"bc1qk2g6u8p4qm2s2lh3gts5cpt2mrv5skcuu7u3e4"
  • 支付金额:"0.01577764"
  • 收款地址的标签:"Bob's Store"
  • 付款描述:"Purchase at Bob's Store"

{% hint style="warning" %} 请尝试使用您的钱包扫描此内容,查看地址和金额,但请勿发送资金。 {% endhint %}

Alice使用她的智能手机扫描显示屏上的条形码。她的智能手机显示了向Bob's Store支付的正确金额,并选择发送以授权支付。几秒钟后(大约与信用卡授权相同的时间),Bob在注册机上看到了交易。

{% hint style="info" %} 比特币网络可以进行分数值的交易,例如,从毫比特币(比特币的1/1000)到1/100,000,000比特币,即被称为 “聪” 的单位。本书在谈论大于一个比特币的金额以及使用小数表示法时,使用与美元和其他传统货币相同的复数规则,比如“10比特币”或“0.001比特币”。相同的规则也适用于其他比特币记账单位,如毫比特币和 “聪”。

{% endhint %}

您可以使用区块浏览器来检查区块链数据,比如 Alice 交易中向 Bob 支付的款项。

在接下来的章节中,我们将更详细地研究这笔交易。我们将看到 Alice 的钱包如何构建它,它是如何在网络中传播的,如何被验证的,最后,Bob 如何在随后的交易中花费这笔金额。

比特币交易

简单来说,一笔交易告诉网络,某些比特币的所有者已经授权将该价值转移到另一个所有者名下。新所有者现在可以通过创建另一笔交易来授权将比特币转移到另一个所有者名下,如此往复,形成所有权链。

交易输入和输出

交易就像双重记账簿中的条目一样。每笔交易包含一个或多个输入,用于花费资金。在交易的另一侧,有一个或多个输出,用于接收资金。输入和输出不一定相等。相反,输出的总和略小于输入,差额代表隐含的交易费,这是矿工在区块链中包含交易时收取的一笔小费。比特币交易显示为双重记账簿中的条目,如图 2-2 所示。

交易还包含每笔比特币金额(输入)的所有权证明,以数字签名的形式,由所有者提供,任何人都可以进行独立验证。在比特币术语中,花费是指签署一笔交易,将价值从先前的交易转移到由比特币地址标识的新所有者名下。

<figure><img src="https://img.learnblockchain.cn/masterbitcoin3/assets/2.2.png" alt=""><figcaption><p>图 2-2. 在比特币交易中,可以将其视为双重记账簿中的条目</p></figcaption></figure>

交易链

Alice的支付给Bob的商店使用了先前交易的输出作为其输入。在前一章中,Alice以现金换取了她朋友Joe的比特币。我们在图2-3中将其标记为Transaction 1(Tx1)。

Tx1发送了0.001比特币(100,000 satoshi)到由Alice的密钥锁定的输出。她向Bob的商店的新交易(Tx2)引用了先前的输出作为输入。在插图中,我们使用箭头显示该引用,并通过将输入标记为“Tx1:0”来标示。在实际交易中,引用是指Alice从Joe那里收到资金的交易的32字节交易标识符(txid)。“:0”表示Alice收到资金的输出的位置;在这种情况下,是第一个位置(位置0)。

如所示,实际的比特币交易并不明确包含其输入的价值。要确定输入的价值,软件需要使用输入的引用来查找要花费的先前交易输出。

Alice的Tx2包含两个新输出,一个支付75,000 satoshi购买播客,另一个支付20,000 satoshi作为找零返回给Alice。

\

<figure><img src="https://img.learnblockchain.cn/masterbitcoin3/assets/2.3.png" alt=""><figcaption><p>图 2-3. 交易链是指一系列交易,其中一个交易的输出是下一个交易中的输入</p></figcaption></figure>

{% hint style="info" %} 比特币交易的序列化格式——软件用于发送交易的数据格式——使用最小的定义在链上价值单位的整数来编码要转移的价值。当比特币刚刚创建时,这个单位没有名称,一些开发者简单地称之为基本单位。后来,许多用户开始将这个单位称为“聪”(satoshi),以纪念比特币的创造者。在本书的图2-3和其他一些插图中,我们使用“聪”值,因为这是协议本身使用的单位。 {% endhint %}

找零

除了一个或多个用于支付比特币接收者的输出之外,许多交易还将包括一个用于支付比特币花费者的输出,称为找零输出。这是因为交易输入,就像货币票据一样,不能部分使用。如果你在商店购买了价值5美元的物品,但使用了一张20美元的钞票来支付,你希望收到15美元的找零。同样的概念适用于比特币交易输入。如果你购买了价值5比特币的物品,但只有价值20比特币的输入可供使用,那么你会向商店所有者发送一个价值5比特币的输出,以及一个价值15比特币的输出作为找零(不计入交易费用)。

在比特币协议层面上,找零输出(以及支付它的地址,称为找零地址)与支付输出之间没有区别。

重要的是,找零地址不必与输入地址相同,并且出于隐私原因,通常是来自所有者钱包的新地址。在理想情况下,两种不同的输出使用从未见过的地址,并且在其他方面看起来完全相同,防止任何第三方确定哪些输出是找零输出,哪些是支付输出。然而,出于说明的目的,我们在图2-3中为找零输出添加了阴影。

并非每个交易都有找零输出。那些没有找零输出的交易被称为无找零交易,它们只能有一个单一的输出。如果要花费的金额与交易输入减去预期的交易费用的金额大致相同,则无找零交易才是一个实际的选择。在图2-3中,我们看到Bob创建了Tx3作为一个无找零交易,用于花费他在Tx2中收到的输出。

\

币种选择

在支付时,不同的钱包使用不同的策略来选择要使用的输入,称为币种选择。

它们可能会聚合许多小额输入,或者使用一个等于或大于所需支付的输入。除非钱包能够以恰好匹配所需支付加上交易费用的方式聚合输入,否则钱包将需要产生一些找零。这与人们如何处理现金非常相似。如果你总是使用口袋里最大的钞票,你最终会得到满口的零钱。如果你只使用零钱,你经常只会有大钞票。人们下意识地在这两个极端之间找到平衡,而比特币钱包开发者致力于编程这种平衡。

常见的交易形式

一种非常常见的交易形式是简单支付。这种类型的交易有一个输入和两个输出,如图2-4所示。

<figure><img src="https://img.learnblockchain.cn/masterbitcoin3/assets/2.4.png" alt=""><figcaption><p>图 2-4. 最常见的交易</p></figcaption></figure>

另一种常见的交易形式是合并交易,它将多个输入合并成一个输出(图2-5)。这相当于在现实世界中将一堆硬币和纸币换成一张更大的纸币。 有时,钱包和企业会生成这样的交易来清理大量较小的金额。

<figure><img src="https://img.learnblockchain.cn/masterbitcoin3/assets/2.5.png" alt=""><figcaption><p>图 2-5. 合并交易聚合资金</p></figcaption></figure>

最后,区块链上经常看到的另一种交易形式是支付批处理,它支付给多个输出,代表多个收款方(图2-6)。商业实体有时会使用这种类型的交易来分发资金,比如在向多名员工支付工资时。

<figure><img src="https://img.learnblockchain.cn/masterbitcoin3/assets/2.6.png" alt=""><figcaption><p>图 2-6. 批处理交易分配资金</p></figcaption></figure>

构建交易

Alice 的钱包应用程序包含了选择输入和生成输出的所有逻辑,以构建符合 Alice 规格的交易。Alice 只需要选择目的地、金额和交易费用,剩下的事情都在钱包应用程序中进行,她不需要看到详细信息。重要的是,如果一个钱包已经知道它控制的输入,即使它完全离线,它也可以构建交易。就像在家里写支票,然后把它放在信封里寄给银行一样,交易不需要在连接到比特币网络时构建和签名。

获取正确的输入

Alice 的钱包应用程序首先需要找到可以支付给 Bob 的金额的输入。大多数钱包跟踪钱包中地址所有可用的输出。因此,Alice 的钱包会包含来自 Joe 交易的交易输出的副本,该交易是用现金交换的(参见“获取您的第一个比特币”)。在全节点上运行的比特币钱包应用程序实际上包含了每个已确认交易的未花费输出,称为 UTXO(未花费的交易输出)。然而,由于全节点使用的资源更多,许多用户钱包运行轻量级客户端,仅跟踪用户自己的 UTXO。

在这种情况下,这个单一的 UTXO 足以支付播客。如果不是这样,Alice 的钱包应用程序可能需要合并几个较小的 UTXO,就像从钱包中选取硬币一样,直到它找到足够支付播客的金额。在这两种情况下,可能需要得到一些找零,我们将在下一节中看到,当钱包应用程序创建交易输出(支付)时。

创建输出

交易输出是使用一段脚本创建的,该脚本大致表示“此输出支付给可以提供与 Bob 公钥地址对应的密钥的签名的任何人”。因为只有 Bob 拥有与该地址对应的密钥的钱包,所以只有 Bob 的钱包可以提供这样的签名以后花费这个输出。因此,Alice 将输出值与对 Bob 的签名需求绑定起来。

此交易还将包括第二个输出,因为 Alice 的资金比播客的费用更多。Alice 的找零输出在与付款给 Bob 的同一交易中创建。实质上,Alice 的钱包将她的资金分成两个输出:一个给 Bob,一个退回给她自己。然后,她可以在随后的交易中花费找零输出。

最后,为了使交易及时被网络处理,Alice 的钱包应用程序将添加一个小费。这个费用在交易中没有明确说明;它是通过输入和输出之间的差值来隐含的。矿工收取这笔交易费作为将交易包含在区块中的费用。

{% hint style="info" %} 查看从Alice到Bob商店的交易 {% endhint %}

将交易添加到区块链中

Alice 的钱包应用程序创建的交易包含确认资金所有权和指定新所有者所需的一切。现在,这个交易必须被传输到比特币网络中,其中它将成为区块链的一部分。在接下来的部分中,我们将看到一个交易如何成为一个新区块的一部分,以及如何进行挖矿。最后,我们将看到,一旦新区块被添加到区块链上,随着更多的区块被添加,网络对其的信任程度也在增加。

传输交易

由于交易包含了处理所需的所有信息,因此它被传输到比特币网络的方式或位置并不重要。比特币网络是一个点对点网络,每个比特币节点通过连接到其他几个比特币节点来参与其中。比特币网络的目的是向所有参与者传播交易和区块。

交易是如何传播的

比特币点对点网络中的节点是具有完全验证新交易正确性所需的软件逻辑和数据的程序。节点之间的连接通常被可视化为图中的边(线),而节点本身则是节点(点)。因此,比特币节点通常被称为“全验证节点”,或简称为全节点。

Alice的钱包应用可以通过任何类型的连接发送新交易到任何比特币节点:有线、WiFi、移动等。它还可以将交易发送到其他程序(如区块浏览器),该程序将其中继到节点。她的比特币钱包不必直接连接到Bob的比特币钱包,并且她也不必使用Bob提供的互联网连接,尽管这两种选择也是可能的。任何收到未见过的有效交易的比特币节点都会将其转发到其连接的所有其他节点,这种传播技术称为gossiping协议。因此,交易迅速传播到点对点网络中的大多数节点,在几秒钟内就能到达。

Bob的视角

如果Bob的比特币钱包应用直接连接到Alice的钱包应用,那么Bob的钱包应用可能是第一个接收到交易的。然而,即使Alice的钱包将交易通过其他节点发送,它也将在几秒钟内到达Bob的钱包。Bob的钱包将立即识别Alice的交易为一笔进账款,因为它包含了一个可由Bob的密钥兑现的输出。Bob的钱包应用程序还可以独立验证交易是否格式良好。如果Bob正在使用自己的完整节点,他的钱包可以进一步验证Alice的交易只花费了有效的UTXO。

比特币挖矿

Alice的交易现在已经在比特币网络上传播开来。它只有在被包括在一个区块中并由全节点验证之后,才会成为区块链的一部分。详细解释请参见第12章。

比特币的防伪系统基于计算。交易被捆绑成区块。区块有一个非常小的头部,必须以非常特定的方式形成,需要巨大的计算量才能得到正确,但验证正确却只需要很少的计算量。挖矿过程在比特币中有两个目的:

  • 矿工只有通过创建符合比特币所有共识规则的区块,才能获得合法收入。因此,矿工通常被激励只在他们的区块和他们建立在上面的区块中包含有效的交易。这允许用户可以选择性地做一个基于信任的假设,即在区块中的任何交易都是有效的交易。
  • 挖矿目前在每个区块中创建新的比特币,几乎像中央银行印刷新货币一样。每个区块中创建的比特币数量是有限的,并且随着时间的推移而减少,遵循固定的发行时间表。

挖矿实现了成本和回报之间的微妙平衡。挖矿使用电力来解决计算问题。成功的矿工将以新的比特币和交易费的形式获得奖励。然而,只有当矿工仅包含有效交易时,才会收到奖励,并且比特币协议的共识规则决定了什么是有效的。这种微妙的平衡为比特币提供了没有中央权威的安全性。

挖矿被设计成一种分散的抽奖。每个矿工可以通过创建一个包含他们想要挖掘的新交易和一些额外数据字段的候选区块来创建自己的彩票。矿工将候选区块输入到一个专门设计的算法中,该算法会对数据进行混淆(或“哈希”),产生的输出与输入数据完全不同。这个哈希函数对于相同的输入总是产生相同的输出,但是没有人可以预测对于一个新输入,即使与之前的输入略有不同,输出会是什么样子。如果哈希函数的输出与比特币协议确定的模板匹配,那么矿工就赢得了彩票,比特币用户将接受带有其交易的区块作为有效区块。如果输出与模板不匹配,矿工将对其候选区块进行微小更改,然后再次尝试。截至本文撰写时,矿工需要尝试的候选区块数量约为168亿亿。这也是哈希函数需要运行的次数。

然而,一旦找到了一个中奖组合,任何人都可以通过只运行一次哈希函数来验证区块是否有效。这使得有效区块成为需要大量工作才能创建,但只需要微不足道的工作来验证的东西。简单的验证过程能够以概率论的方式证明工作已经完成,因此生成这个证明所需的数据——在这种情况下就是区块——被称为工作证明(PoW)。

交易被添加到新的区块中,优先考虑具有最高费率的交易,并遵循其他几个标准。每个矿工在收到上一个区块后立即开始挖掘一个新的候选区块,知道其他某个矿工赢得了该轮抽奖。他们立即创建一个新的候选区块,并承诺与前一个区块相关联,填充交易,并开始为候选区块计算PoW。每个矿工在他们的候选区块中都包含一个特殊的交易,该交易支付他们自己的比特币地址,即区块奖励加上候选区块中包含的所有交易的交易费之和。如果他们找到了使候选区块成为有效区块的解决方案,那么在他们成功地将区块添加到全球区块链并且包含的奖励交易可以被花费之后,他们将获得这个奖励。参与矿池的矿工已经设置了他们的软件来创建分配奖励给矿池地址的候选区块。从那里,奖励的一部分按照他们贡献的工作量比例分配给矿池矿工的成员。

Alice的交易被网络捕获并包含在未验证交易的池中。一旦被全节点验证,它就被包含在一个候选区块中。大约五分钟后,Alice的交易首次被她的钱包传输后,一个矿工找到了区块的解,并将其宣布给网络。在其他每个矿工验证了获胜区块之后,他们开始生成下一个区块的新抽奖。

包含Alice的交易的获胜区块成为了区块链的一部分。包含Alice的交易的区块被视为对该交易的一个确认。在包含Alice的交易的区块通过网络传播后,要创建一个包含Alice的交易的另一个版本的替代区块(例如一个不支付Bob的交易)将需要执行与将所有比特币矿工创建一个完全新的区块相同的工作量。当存在多个可供选择的替代区块时,比特币全节点选择具有最高总PoW的有效区块链,称为最佳区块链。为了让整个网络接受一个替代区块,还需要在替代区块之上挖掘一个额外的新区块。

这意味着矿工有选择的余地。他们可以与Alice一起寻找一个替代方案,而不是支付给Bob的交易,也许Alice会支付给矿工之前支付给Bob的一部分钱。这种不诚实的行为将需要他们花费精力创建两个新区块。相反,行为诚实的矿工可以创建一个新区块,并收取其中包含的所有交易的费用,加上区块补贴。通常,以不诚实的方式创建两个区块以换取小额额外付款的高成本远远低于诚实地创建一个新区块,这使得确认的交易不太可能被故意更改。对于Bob来说,这意味着他可以开始相信来自Alice的支付是可靠的。

{% hint style="info" %} 您可以查看包含Alice交易的区块。 {% endhint %}

大约19分钟后,包含Alice交易的区块被广播,另一个矿工挖掘出了一个新区块。因为这个新区块是建立在包含Alice交易的区块之上的(给予Alice交易两个确认),Alice的交易现在只能在挖掘出两个替代区块——再加上一个建立在它们之上的新区块——的情况下才能被更改,总共需要挖掘三个区块才能让Alice收回她发送给Bob的钱。每个在包含Alice交易的区块之上挖掘的区块都被视为额外的确认。随着区块越来越多地堆叠在一起,撤销交易变得更加困难,从而让Bob对Alice的支付越来越有信心。

在图2-7中,我们可以看到包含Alice交易的区块。在它下面是数十万个区块,彼此链接在一起,形成一个区块链,一直回溯到块#0,称为创世块。随着新区块的“高度”增加,整个链的计算难度也会增加。按照惯例,任何具有超过六个确认的区块都被认为非常难以更改,因为重新计算六个区块(加上一个新区块)需要大量计算。我们将在第12章中更详细地探讨挖矿过程以及它如何增强信心。

<figure><img src="https://img.learnblockchain.cn/masterbitcoin3/assets/2.7.png" alt=""><figcaption><p>图 2-7. Alice的交易被包含在一个区块中</p></figcaption></figure>

花费交易

现在,Alice的交易已经嵌入到区块链中作为一个区块的一部分,它对所有比特币应用程序都是可见的。每个比特币完整节点都可以独立验证交易的有效性和可支配性。完整节点验证从比特币首次生成在一个区块中开始的资金转移,直到它们到达Bob的地址的每一笔后续交易。轻量级客户端可以通过确认交易是否在区块链中,并在其后经过了几个区块的挖掘,从而部分验证支付,从而提供了矿工为其付出了大量努力的保证(参见“轻量级客户端”第228页)。

Bob现在可以花费来自此交易和其他交易的输出。例如,Bob可以通过从Alice的播客付款中转移价值来向承包商或供应商支付费用。随着Bob花费来自Alice和其他客户的付款,他扩展了交易链。假设Bob向他的网页设计师Gopesh支付了一个新的网站页面。现在,交易链将如图2-8所示。

<figure><img src="https://img.learnblockchain.cn/masterbitcoin3/assets/2.8.png" alt=""><figcaption><p>图 2-8. Alice的交易作为从Joe到Gopesh的交易链的一部分</p></figcaption></figure>

在本章中,我们看到了交易如何构建一个链条,将价值从一个所有者转移到另一个所有者手中。我们还跟踪了Alice的交易,从她的钱包创建的那一刻开始,通过比特币网络,最终到记录在区块链上的矿工。在本书的其余部分,我们将深入探讨钱包、地址、签名、交易、网络和挖矿背后的具体技术。

点赞 0
收藏 0
分享
本文参与登链社区写作激励计划 ,好文好收益,欢迎正在阅读的你也加入。

0 条评论

请先 登录 后评论