主页 > imtoken钱包app官方下载 > 比特币协议的工作原理(第 1 部分)

比特币协议的工作原理(第 1 部分)

imtoken钱包app官方下载 2023-03-06 06:58:41

译者:杨烁

原始链接:比特币协议的工作原理(第 1 部分)|巴比特

成千上万的文章试图解释比特币,一种在线的点对点货币。大多数文章一口气介绍了底层协议,省略了许多细节。即使是最深入的文章也会卡在关键位置。这篇文章的目的是以尽可能清晰易懂的方式解释比特币协议背后的要点。我们从基本原理开始,建立对比特币协议的广泛理论理解,然后深入细节,检查比特币交易中的元数据。

深入理解协议是困难的,因为很容易将比特币视为理所当然,并思考如何用它来投机和赚钱,是否是泡沫,比特币是否意味着税收的终结等等。想想很有趣,但这些想法严重限制了你的理解。理解比特币的协议本身将打开原本无法实现的视角。例如,该协议是比特币内置脚本语言的基础,它允许您使用比特币创建新的金融工具,例如智能合约。新的金融工具反过来又可以创造新的市场和人与人之间的新合作行为,说到乐趣,这才是真正的乐趣所在!

我将在以后的文章中解释比特币脚本和智能合约。在本文中,我将重点介绍比特币协议的细节。要理解这篇文章,你需要熟悉公钥密码学及其相关的数字签名,(请理解两个概念)。还要熟悉(散列)散列函数(将任意长度的输入转换为固定长度的输出)。这些概念很棒,如果你不这样做,我建议你花一些时间来熟悉它们。

比特币基于密码学,这可能会让您感到惊讶,它不是一种货币吗?这是一种发送秘密信息的方法吗?事实上,比特币试图解决的问题绝大多数是关于保护交易——确保人们不能窃取别人的东西或冒充别人等。在原子的物理世界中,我们用锁、签名、银行保险箱等等。在信息世界中,我们使用密码学来确保安全。这就是为什么比特币的核心是加密协议。

本文的策略是逐层构建比特币。我们将从一种非常简单的数字货币开始,我们暂时将其称为“Infocoin”以将其与比特币区分开来。当然,我们第一个版本的Infocoin会有很多不足,所以我们会经历几次迭代,每次迭代都会引入一两个新概念。几次之后,我们就会有一个完整的比特币协议。我们将一起重塑比特币。

这种方法比一开始直接解释比特币要慢。但即使你一眼就能理解比特币的原理,也很难理解为什么比特币会被设计成这样。缓慢、循序渐进的迭代解释的美妙之处在于,它可以让你更清楚地了解比特币的每一个元素。

最后我应该说我对比特币世界还比较陌生。 2011年粗心大意,2013年初才真正深入,有错误的地方欢迎大家指正。

第 1 步:签署意向书

如何设计货币?

从表面上看,数字货币听起来是不可能的。假设一个人——我们叫她爱丽丝——有一些他想花掉的数字货币。如果 Alice 可以使用一串字符作为钱,我们如何阻止她一遍又一遍地使用同一个字符串呢?如果我们能解决这个问题,我怎样才能防止其他人伪造字符串并从 Alice 那里窃取?

这些只是将信息当作金钱来解决的众多问题中的两个。在 Infocoin 的第一个版本中,我们想出了一种方法让 Alice 提供一个字符串作为货币,并想出一种方法来保护它不被伪造。假设爱丽丝想给另一个人鲍勃一个信息币。爱丽丝需要写下一条消息:“我,爱丽丝,想给鲍勃一个信息币”。然后,她使用私钥(随机生成的 64 位数字)对这条消息进行数字签名以产生结果。并将这个签名的结果字符发布到全世界。

比特币是怎么做的_比特币可以做空吗_莱特币和比特币是通用货币吗

这种方法不是很令人印象深刻,但它有一些优点。世界上任何人都可以使用 Alice 的公钥来验证 Alice 确实是签名者。任何人都不可能生成签名的结果(这个签名只能从 Alice 拥有的私钥生成,原理见上文提到的数字签名),所以 Alice 不能回去说“不,我没有给鲍勃那个信息币“。通过这种方式,协议提供了爱丽丝实际上打算给鲍勃一个信息币的证据。同样,没有其他人可以生成这样的签名消息,这可以防止其他人伪造 Alice 的消息。当然,Alice 发布了她的消息之后,其他人可以复制该消息,但在发布之前是不可能伪造的。因此,在消息发布之前证明意图并防止消息被伪造是该协议中真正值得注意的功能。

我没有说这个协议中的钱是什么。需要明确的是:钱实际上就是信息本身。也就是说,代表“我,爱丽丝,想给鲍勃一个信息币”签名的字符串。以后的协议将类似,所有数字货币都只是越来越详细的消息字符。

使用序列号唯一标识货币

我们第一个版本的 Infocoin 的问题是 Alice 可以反复向 Bob 发送相同的签名消息。假设 Bob 收到 10 份消息“我,Alice,想给 Bob 一个 infocoin”。这是否意味着 Alice 给了 Bob 10 个不同的信息币?还是爱丽丝给了鲍勃一个信息币,只是为了不小心重复了这条信息?又或者她想骗鲍勃相信她给了他 10 个信息币,而实际上发给外界的信息只证明她只给了一个信息币。

我们想要的是 infocoin 有一个独特的身份。它需要一个标签或序列号。 Alice 可以签署消息“我,Alice,想给 Bob 一个序列号为 8740348 的信息币”。之后,如果 Alice 再签一条消息“我 Alice,想给 Bob 一个序列号为 8770431 的 infocoin”,那么 Bob 和其他人就会知道这两个是不同的 infocoin。

要使此解决方案发挥作用,我们必须有一个值得信赖的序列号来源。生成序列号的一种方法是建立一个机构,例如银行。银行会为infocoin生成序列号,记录谁拥有哪个infocoin,并验证交易的真实性。

更详细地说,假设 Alice 去银行说“我想从我的账户中提取一个 infocoin”。银行从她的账户中扣除了一个 infocoin,并给了她一个从未使用过的新序列号,比如说“1234567”。然后,当 Alice 想向 Bob 发送一个 infocoin 时,她签署了新消息“我,Alice,想给 Bob 一个序列号为 1234567 的 infocoin”。但 Bob 不仅接受了 infocoin,还联系了银行确认了两件事。首先,编号为 1234567 的 infocoin 确实属于 Alice。其次,爱丽丝还没有花掉那个信息币。然后银行更新其记录以显示信息币现在属于 Bob 而不是 Alice。

让每个人都成为银行

上面的解决方案看起来很有希望。但是,我们可以做更多雄心勃勃的事情。我们可以从该协议中删除银行。这极大地改变了货币本身的性质。这意味着不会有一个组织负责该货币。当您考虑中央银行拥有多少权力(控制货币发行)时,这意味着巨大的变化。

方法是让每个人共同努力成为一家银行。特别是,我们假设每个使用 infocoin 的人都完整记录了哪个 infocoin 属于哪个人。您可以将其视为记录所有 infocoin 交易的共享公共分类帐。我们称其为“区块链”,因为这就是比特币中的名称。

现在,让我们假设爱丽丝想给鲍勃一个信息币。她签署了消息“我,爱丽丝,想给鲍勃一个序列号为 1234567 的信息币”。并将签名后的消息输出给 Bob,Bob 可以使用自己的区块链进行检查,“OK,确实那个 infocoin 是 Alice 给我的”。如果他的支票没有问题,他会向全网公布 Alice 的消息和他接受这个 infocoin 的消息。然后所有人都会更新他们的区块链。

莱特币和比特币是通用货币吗_比特币可以做空吗_比特币是怎么做的

我们仍然有“序列号从哪里来”的问题,但它实际上很容易解决,所以我稍后会解释。更难的问题是该协议允许 Alice 重复使用她的 infocoin。她可以发布签名消息“我,爱丽丝,想给 Bob 一个序列号为 1234567 的信息币”,她还可以发布一条签名消息,说“我,爱丽丝,想给查理一个序列号为 1234567 的信息币”。 Bob 和 Charlie 都使用他们自己的区块链来验证 infocoin 确实是由 Alice 发送的。假设他们同时检查(在他们都知道对方之前),他们都会发现,是的,我的区块链证明硬币属于爱丽丝。所以他们都接受该交易并将他们的接受信息发布到整个网络。现在有一个问题。网络上的其他人应该如何更新他们的区块链?简单地实现统一的交易账本似乎是不可能的。即使每个人都同意以同样的方式更新他们的区块链,Bob 和 Charlie 这两个人中的一个也一定被骗了。

我们把这个问题称为“双花”(以下简称“双花”),乍一看,这样的双花似乎不太可能成功。毕竟,如果 Alice 先向 Bob 发送消息,然后 Bob 将消息发送给其他所有人(包括 Charlie),那么其他所有人都会更新他们的区块链。这时,查理就不会被爱丽丝欺骗了。所以看起来双花只能在很短的时间内实现。但是,即使这个时间很短,也不建议出现这个问题。更糟糕的是,爱丽丝可以使用一些技巧来延长期限。例如,她可以使用网络分析软件来查找 Bob 和 Charlie 之间的通信何时有很长的延迟。或者可以采取一些措施来故意干扰它们之间的网络连接。如果她能稍微放慢这种沟通的速度,就可以让她的双花成功变得容易得多。

如何解决这个问题?最简单的方法是,当 Alice 向 Bob 发送 infocoin 时,Bob 不应该自己验证交易。并且他应该将这个待处理的交易发布到整个infocoin网络,让其他人帮助判断交易是否合理。如果他们共同决定交易是合理的,那么 Bob 可以去接受 infocoin,然后每个人都会更新他们的区块链。这种类型的协议可以防止双重支出,因为如果 Alice 想向 Bob 和 Charlie 发送相同的 infocoin,网络的其余部分会注意到并告诉 Bob 和 Charlie 交易有问题,那么交易将不被允许通过。

更具体地说,假设爱丽丝想给鲍勃一个信息币。和之前一样,她签署了一条消息,“我,Alice,想给 Bob 一个序列号为 1234567 的信息币”,并将签名的消息发送给 Bob。同样和以前一样,鲍勃使用他自己的区块链来检查硬币是否属于爱丽丝。但协议不同。 Bob 不直接接受,而是将 Alice 的消息通告给全网。网络的其他成员检查爱丽丝是否拥有信息币,如果是,他们会发布一条消息说“是的,爱丽丝确实有信息币 1234567,现在是时候将它转移给鲍勃了”。一旦足够多的人宣布了这个消息,每个人都会更新他的区块链以显示 infocoin 1234567 现在属于 Bob,并且交易完成。

该协议仍有许多不确定性。例如,“一次足够多的人做新闻”是什么意思,多少人就够了?不可能是整个 infocoin 网络,因为我们事先不知道 infocoin 网络上的是谁。同样,它不能是用户的固定部分。我们并不急于澄清这些问题。在这里,我要指出这个解决方案的一个严重问题,解决这个问题将有助于同时解决上述问题。

工作量证明

假设 Alice 想要在上述协议中进行双花,他需要负责整个 infocoin 网络。假设她使用自动化系统在 infocoin 网络上建立了许多不同身份的帐户,假设有 10 亿个。和以前一样,她试图双花,给 Bob 和 Charlie 相同的 infocoin,但是当 Bob 和 Charlie 要求 infocoin 网络验证交易时,Alice 的背心充斥着网络,告诉 Bob 和 Charlie 他们可以通过这笔交易,并且可能会诱骗他们中的一个或两个接受交易。

有一个聪明的方法,使用一种叫做“工作量证明”的方法。该方法不直观,需要结合两个概念,1)手动使检查交易的过程花费了大量的计算开销; 2)奖励他们帮助检查交易。激励网络上的人们用奖励来验证交易。增加交易验证开销的好处是验证不再由拥有多个账户的人控制,而仅由他可以提供的总计算能力控制。正如我们将看到的,通过一些巧妙的设计,我们可以让作弊者不必花费大量的计算资源来达到作弊的目的,从而使其变得不切实际。

这是工作量证明的重点。但要真正理解工作量证明,我们需要深入研究更具体的细节。

假设 Alice 向全网宣布“我,Alice,想给 Bob 一个序列号为 1234567 的信息币”。当网络的其余部分听到这个消息时,每个人都将其添加到待处理交易列表中,而这些交易都还没有被整个网络传递。例如,网络上名为 David 的人可能有以下待处理交易列表:

我,Tom,想给 Sue 一个序列号为 1201174 的信息币。

比特币是怎么做的_莱特币和比特币是通用货币吗_比特币可以做空吗

我,Sydney,想给 Cynthia 一个序列号为 1295618 的信息币。

我,爱丽丝,想给鲍勃一个序列号为 1234567 的信息币。

大卫检查了自己的区块链,认为上述交易是合理的。他想帮助将这个验证消息发布到整个网络。然而,在此之前,验证交易协议需要大卫解决一个计算难题——工作量证明。如果他没有得到谜题的解决方案,网络的其他成员将不会接受他的验证。

那么大卫想要解决什么问题呢?为了解释这一点,我们使用了网络上每个人都知道的固定哈希函数——包括协议本身。比特币使用众所周知的 SHA-256 散列函数,但任何加密散列函数都可以在这里使用。让我们将大卫的这组待处理交易标记为“L”,以供将来参考。这组待处理的交易相当于区块链中的一个块(block)(-理解这个块很重要,一个块是交易信息的集合,一个块包含很多交易)。假设 David 在块“L”之后添加了一个数字 x(称为 nonce,一个临时随机数)并对它们的组合进行哈希处理。假设我们使用 L="Hello, world!"作为某些交易的代币。然后添加一个临时随机数,让我们从“x=0”开始。

h("hello", world! 0) =

1312af178c253f84028d480a6adc1e25e81caa44c749ec81976192e2ec934c64

大卫要解决的问题(工作量证明)是找一个随机数x,当我们把这个x加到L后面,对组合进行hash时,结果以几个0开头。这个谜题的难度可以通过调整开头的零个数来调整。一个简单的“工作证明”只需要 3 或 4 个前导零的散列,一个硬“工作证明”可能需要更多的前导零,比如 15 个连续的零。上述情况比特币是怎么做的,x=0的hash结果不成功,因为结果不是以0开头的。那我们试试x=1,

可以看到当x=1时它不起作用

h("Hello, world!1") = 
  e9afc424b79e4f6ab42d99c81156d3a17228d6e1eef4139be78e948a9332a7d8

然后尝试 x=2, Then x=3, 4, 5.... 最后,当我们找到 x=4350 时,我们得到

h("Hello, world!4250") = 
  0000c3af42fc31103f1fdc0151fa747ff87349a4714df7cc52ea464e12dcd4e9

比特币可以做空吗_比特币是怎么做的_莱特币和比特币是通用货币吗

这个随机数 x 给我们一个结果是四个前导零的散列。这足以解决一个简单的“工作量证明”难题。

让这个谜题难以解开的是比特币是怎么做的,密码哈希函数的结果总是随机的,输入值的任何微小变化都会完全改变整个哈希函数的输出,以至于难以预测。因此,如果我们需要输出以 10 个零开始,那么 David 平均需要 1610 ≈ 1012 个不同的 x 来找到合适的值。这是一项非常具有挑战性的任务,需要大量的计算能力。

显然,我们可以通过指定需要多少个零来控制工作量证明难题的难度。事实上,比特币协议通过对上面的工作量证明稍作修改,就可以更好地控制拼图的难度。它不再指定需要多少个起始零,而是指定块的哈希输出结果应小于或等于目标值。这个目标值是自动调整的,保证比特币的每个区块(block)平均需要Take 10分钟来解决。

好的,假设大卫很幸运,找到了一个合适的 x(nonce),恭喜他! (他会因为找到这个答案而获得奖励)。他会宣布他已经证明了这个区块中的交易,同时公布了她找到的 x 的值,infocoin 的其他参与者可以证明 x 的工作证明的有效解决方案。然后他们更新他们的区块链以包含 David 发布的交易。

为了使工作量证明计划发挥作用,网络中的参与者应该需要一种激励机制来帮助验证交易。如果没有激励措施,没有人愿意花费他们的计算机能力来帮助验证交易。如果网络参与者不愿意花费计算能力,整个系统将无法运行。因此,我们可以通过给他们一些信息币来奖励成功验证交易的任何人。如果向他们提供足够的 infocoin 奖励,则可以激励他们参与验证。

在比特币协议中,这个验证过程被称为“挖矿”。每个交易区块的成功验证将获得比特币作为奖励。一开始是奖励50个比特币。但每验证 210,000 个区块(即大约每 4 年左右),奖励就会减半。到目前为止只发生过一次,这意味着验证一个区块的奖励现在是 25 个比特币。减半过程将持续到大约 2140 年。届时,挖矿的奖励将减少到 10-8 个比特币。而 10-8 个比特币是比特币的最小单位(称为一个 Satoshi),所以到 2140 年,比特币总量将停止增长。然而,这并没有消除验证交易的动机,比特币可以允许参与者增加验证交易的费用,以奖励那些验证交易的人。比特币早期,交易手续费几乎为零,但随着比特币的普及,交易手续费会逐渐增加,现在除了25比特币奖励外,变成了额外的激励。

您可以将工作量证明视为验证交易的竞赛。每个参与者花费一部分计算能力。一个矿工的中奖几率大致等于他们控制的算力总量与全网算力的比值。例如,如果一个矿工控制了全网 1% 的算力,那么他获胜的概率也在 1% 左右。因此,提供大量计算能力是竞争力的基础,不诚实的矿工只有很小的机会破坏验证过程,除非他们花费大量的计算机资源。

当然,即使不诚实的矿工破坏整个区块链的可能性很小,我们也没有足够的信心将其用作货币。特别是,我们还没有最终解决双花问题。

我将立即分析双花问题,但在此之前,我想为 Infocoin 的概念添加一个重要的细节。理想情况下,我们希望 Infocoin 网络统一交易发生的顺序。如果我们没有统一的顺序,那么在特定时间谁拥有哪个 infocoin 就不是很清楚了。为了帮助解决这个问题。我们要求新块(block)必须包含一个指向前一个块的指针,这个指针实际上是前一个块的哈希结果。所以基本上,区块链本身就是一系列包含交易信息的线性区块,一个接一个,每个区块都包含一个指向前一个区块的指针。

有时,区块链上会发生分叉。发生这种情况是因为,有时,两个矿工几乎同时验证一个区块的交易。它们同时发布到网络上,有些人用一种方法更新他们的区块链,另一些人用另一种方法更新他们的区块链。

比特币是怎么做的_比特币可以做空吗_莱特币和比特币是通用货币吗

这造成了我们想要避免的情况——交易顺序不明确,谁拥有哪个 infocoin 不明确。幸运的是,有一种简单的方法可以删除分支。规则是这样的:如果出现分叉情况,那么网络上的人继续维护两个分叉,无论如何,矿工只在最长的区块链上工作。

假设我们有一个分支,其中一些矿工首先收到块 A,一些矿工首先收到块 B。那些收到 A 区块的矿工将继续沿着他们的分叉挖矿,而其​​他人则沿着 B 区块的分叉挖矿。我们假设 B 分支的矿工先成功挖到下一个区块:

当他们收到这条消息时,A 分支上的矿工你会注意到 B 分支现在最长,所以会切换到 B 分支。 A 分支上的工作将很快停止,以便每个人都以相同的顺序在区块链上工作。然后块 A 将被忽略。当然,A 区块中所有待处理的交易会一直处于待处理状态,然后会被放到 B 分支上的新区块中,这样所有的交易最终都会被验证。

类似地,如果 A 分支上的矿工先挖下一个区块,那么 B 分支上工作的人就会停下来前往 A 分支。

无论结果如何,此过程都确保区块链具有统一的顺序。在比特币中,直到1)它存在于最长分支的块中,2)之后至少有 5 个经过验证的块,交易才算作确认。在这种情况下,我们说交易有“6 个确认”。这给了整个网络时间来统一块的顺序。我们也在 Infocoin 中使用相同的方案。

现在我们了解了年表,让我们回过头来想想如果一个不诚实的人想要双花怎么办。假设 Alice 想要给 Bob 和 Charlie 相同的交易。一种可能性是让她同时用两笔交易验证一个区块。假设她有百分之一的计算能力,她可能有幸验证了这个区块。不幸的是,即使她解决了工作量证明难题,这种双重花费也会立即被其他人发现并拒绝。所以我们不必担心这种可能性。

但另一种可能性是,她试图分别宣布这两笔交易。她可能会向一些矿工宣布一项交易,而向另一位矿工宣布另一笔交易,她希望这两笔交易都得到验证。幸运的是,在这种情况下,正如我们刚才所说,网络最终只会确认其中一项交易。所以,这不是问题。

另一种可能性是 Alice = Bob,这意味着 Alice 试图给 Charlie 一个硬币,同时她把硬币给了自己,因为她可以有多个帐户。在这种情况下,Alice 的策略是等到 Charlie 接受了 Infocoin,这大致是在最长的区块链中交易被确认 6 次之后。然后,她尝试解析具有她发送给自己的交易的区块的另一个分支。

不幸的是,此时 Alice 已经落后最长的区块链 6 步。她很难跟上最长的树枝。其他矿工不会帮助她,因为他们都需要在最长的分支上工作才能获得奖励。除非 Alice 解决工作量证明的速度比网络其余部分的总和更快(即她可能拥有整个网络 50% 以上的计算能力)。当然,她可能运气好,以 1% 的算力解决了一个区块,但同时赶上 6 个,相当于 1/1006 = 10-12 。这种情况可以说是零思考。

当然,严格来说,Alice 不能双花。这只是一个合理的推论。最初的比特币白皮书没有进行严格的安全分析,只是类似于我这里的非正式推论。安全小组仍在分析比特币的安全性和潜在缺陷,详情请参阅此列表。