作者:Subhashish C. 来源:medium 翻译:善欧巴,金色财经
拥有比特币意味着什么?现在大多数人都听说过比特币。也就是说,它是一种完全数字化的货币,没有政府发行,也不需要银行来管理账户和验证交易。没有人真正知道是谁发明了它。
然而许多人不知道这个问题的答案,至少不完全知道。
为了实现这一目标,并确保这个答案背后的技术细节让人感到有动力,我们将逐步介绍您如何发明自己的比特币版本。
我们将从您使用公共分类账与您的朋友跟踪付款开始。然后,随着你越来越不信任你的朋友和世界,如果你足够聪明,引入一些密码学工具来帮助规避信任的需要,你最终得到的就是所谓的“加密货币”。
比特币只是加密货币的第一个实施示例,现在还有数千种加密货币在与传统货币进行交易。走上自己发明的道路有助于为了解游戏中的一些较新的玩家并认识到哪里有不同设计选择的空间奠定基础。
事实上,我选择这个主题的原因之一是为了回应去年针对这些货币的关注、投资和……嗯……炒作的重新飞跃。我不会评论或推测当前或未来的汇率,但我认为我们都同意,任何想要购买加密货币的人都应该真正知道它是什么。
不仅仅是与黄金开采的模糊联系进行类比,我的意思是对计算机在发送、接收和创建加密货币时所做的事情的实际直接描述。
顺便说一句,值得强调的一件事是,尽管你和我将在这里深入研究底层细节,这需要一些时间,但你实际上不需要知道这些细节来使用加密货币,就像你不需要知道这些细节一样。当您刷信用卡时,无需了解幕后发生的详细情况。与任何其他数字支付一样,有很多应用程序可以让您轻松发送和接收这些货币。不同之处在于,其背后的骨干不是验证交易的银行,而是基于密码学中的一些数学原理的去中心化去信任验证的巧妙系统。
账本和数字签名
首先,先把加密货币的想法放在一边几分钟。我们将从更实际的事情开始这个故事:账本和数字签名。
如果您和您的朋友经常兑换货币,支付您应得的晚餐费用等,那么一直兑换现金可能会很不方便。因此,您可能会保留一个公共分类账,记录您将来打算支付的款项。
Alice 付给 Bob 20 美元,Bob 付给 Charlie 40 美元,诸如此类。这个分类账将是公开的,每个人都可以访问,就像一个任何人都可以访问并添加新行的网站。每个月月底,大家都会查看交易清单并统计所有内容。如果你花的钱比收到的多,你就把这笔钱放进锅里;如果你收到的钱比你花的多,你就把那么多钱拿出来。
因此,成为该系统一部分的协议看起来是这样的:任何人都可以向分类账中添加行,并且在每个月末,每个人都会聚在一起用真实的钱进行结算。像这样的公共分类账的一个问题是,当任何人都可以添加一行时,如何阻止鲍勃在未经爱丽丝批准的情况下进入并写入“爱丽丝向鲍勃支付 100 美元”?我们如何相信所有这些交易都是发送者所期望的?
这就是密码学的第一个部分:数字签名。就像手写签名一样,这里的想法是爱丽丝应该能够在交易旁边添加一些东西,证明她已经看到并批准了它。而且其他人应该不可能伪造她的签名。
乍一看,数字签名似乎根本不可能,因为构成签名的任何数据都可以由任何计算机读取和复制,那么如何防止伪造呢?其工作原理是每个人都会生成所谓的公钥/私钥对,每个密钥对看起来都像一些位串。私钥有时也称为“秘密”密钥,因此我们可以将其缩写为 sk,而将公钥缩写为 pk。顾名思义,密钥是您应该保密的东西。
在现实世界中,无论您签署什么文档,您的手写签名看起来都是一样的。数字签名要强大得多,因为它会根据不同的消息而变化。它看起来像一串 1 和 0,通常类似于 256 位,即使稍微改变消息也会完全改变该消息上的签名应该是什么样子。形式上,生成签名涉及一些既取决于消息本身又取决于您的私钥的功能。
私钥确保只有您可以生成签名,并且它取决于消息这一事实意味着没有人可以复制您的签名之一以将其伪造到另一消息上。
与此相关的是验证签名是否有效的功能,这就是公钥发挥作用的地方。它所做的只是输出 true 或 false,以指示这是否是由与您用于验证的公钥关联的私钥创建的签名。我不会详细介绍这些函数到底是如何工作的,但其想法是,如果您不知道密钥,则完全不可能找到有效的签名。
具体来说,没有比使用公钥猜测和检查随机签名是否有效更好的策略了,直到找到一个有效的签名。有 2²⁵⁶ 256 位的可能签名,您需要找到有效的签名。这是一个大得愚蠢的数字。称其为天文巨星,未免太过于相信天文学了。
这么说吧,当您根据给定消息和公钥验证签名时,您可以非常有信心地认为,某人生成签名的唯一方法是他们知道与公钥关联的秘密密钥。
这里有一个小问题:如果 Alice 签署了一笔交易,如“Alice 向 Bob 支付 100 美元”,即使 Bob 无法在新消息上伪造 Alice 的签名,他也可以从消息/签名开始多次复制同一行组合有效。
为了解决这个问题,我们在您签署交易时,消息必须包含与该交易关联的一些唯一 ID。这样,如果 Alice 多次向 Bob 支付 100 美元,则每笔交易都需要一个全新的签名。
好吧,太棒了,数字签名消除了对我们初始协议的很大程度的信任。
账本就是货币
但即便如此,这仍然依赖于某种荣誉制度。也就是说,您相信每个人都会遵守并在每个月底以现金结算。但是,例如,如果查理欠了数千美元的债并且拒绝露面怎么办?
恢复现金结算的唯一真正原因是,如果有些人,我指的是你,查理,欠了很多钱。因此,也许你有一个聪明的想法,只要你有办法防止人们支出超出他们的收入,你实际上就不必用现金结算。
你可能会做的就是首先让每个人向彩池中支付 100 美元,并让分类账的前几行显示“爱丽丝获得 100 美元,鲍勃获得 100 美元,等等。现在,当有人花费超过他们已经记在账本上了。
例如,在每个人都以 100 美元开始后,如果前两笔交易是“查理向爱丽丝支付 50 美元”和“查理向鲍勃支付 50 美元”,如果他尝试添加“查理向您支付 20 美元”,那么这将是无效的,因为无效,就好像他从未签署一样。
请注意,这意味着您需要了解交易的完整历史记录才能验证新交易是否有效。对于加密货币来说,或多或少也是如此,尽管还有一点优化的空间。
有趣的是,这一步在某种程度上消除了账本和实物现金之间的联系。理论上,如果世界上每个人都使用这个账本,那么你可以一辈子只在这个账本上发送和接收资金,而无需转换为真正的美元。
为了强调这一点,我们开始将账本上的数量称为“LedgerDollars”,简称 LD。你当然可以自由地将 LedgerDollars 兑换成真正的美元,例如,也许 Alice 在现实世界中给 Bob 一张 10 美元的钞票,以换取他在公共分类账中添加并签署交易“Bob 向 Alice 支付 10 LedgerDollars”。
但协议中并不能保证这样的交换。现在,它更类似于您在公开市场上将美元兑换成欧元或任何其他货币的方式,它只是它自己独立的东西。
这是了解比特币或任何其他加密货币的第一件重要的事情:它是什么?交易的历史就是货币。当然,由于人们使用现金进行购买,比特币资金不会进入分类账,我将在几分钟内了解新资金如何进入分类账。
在此之前,我们当前的 LedgerDollars 系统之间存在更显着的差异
去中心化:加密货币如何运作
到目前为止,我已经说过这个分类帐是一些公共场所,就像一个任何人都可以添加新行的网站。但这需要信任一个中心位置。也就是说,谁托管该网站?谁控制添加新行的规则?
为了消除这种信任,我们将让每个人保留自己的账本副本。然后,为了进行交易,例如“Alice 向 Bob 支付 100 LedgerDollars”,您需要向全世界广播,以便人们在自己的私人 Ledgers 上收听和记录。但除非我们做更多的事情,否则这个系统就会糟糕得离谱。
如何让每个人都同意什么是正确的账本?当 Bob 收到交易“Alice 向 Bob 支付 10 LedgerDollars”时,他如何确定其他人都收到并相信同一笔交易?他稍后可以使用这 10 个 LedgerDollars 与 Charlie 进行交易。真的,想象一下您自己正在收听正在广播的交易。您如何确定其他人都以相同的顺序记录相同的交易?
现在我们遇到了一个有趣的难题:您能否提出一个协议来说明如何接受或拒绝交易以及以什么顺序,以便您可以确信世界上遵循相同协议的任何其他人都有一个看起来像的个人分类账和你的一样吗?
这是原始比特币论文中解决的问题。
从高层次来看,比特币提供的解决方案是信任投入最多计算工作的账本。我将花一些时间来解释这到底意味着什么,其中涉及到称为“加密哈希函数”的东西。我们将建立的总体想法是,如果您使用计算工作作为信任的基础,您就可以做到这一点,以便欺诈性交易和冲突的账本将需要不可行的计算量。
再说一次,这已经超出了任何人使用这样的货币所需要知道的范围。但这是一个非常酷的想法,如果你理解它,你就理解了比特币和其他加密货币的核心。
加密哈希函数
哈希函数接受任何类型的消息或文件,并输出固定长度的位串,例如 256 位。此输出称为消息的“散列”或“摘要”,它看起来是随机的。这不是随机的;对于给定的输入,它总是给出相同的输出。但其想法是,当您稍微更改输入时,也许只编辑一个字符,生成的哈希值就会完全改变。
事实上,对于我在这里展示的哈希函数(称为 SHA256),当您稍微更改输入时输出发生变化的方式是完全不可预测的。你看,这不仅仅是一个哈希函数;它是一个哈希函数。它是一个加密哈希函数。这意味着反向计算是不可行的。
如果我向您展示一些由 1 和 0 组成的特定字符串,并要求您查找一条输入消息,以便该消息的 SHA256 哈希值给出这个确切的位字符串,您将没有比猜测和检查更好的方法了。
您可能认为可以通过真正挖掘函数工作原理的细节来对所需的输入进行逆向工程,但没有人找到一种方法来做到这一点。有趣的是,没有证据表明反向计算很困难,但现代安全性很大程度上依赖于加密哈希函数。
如果您要查看浏览器现在与 YouTube 或与银行建立的安全连接背后的算法是什么,您可能会在其中看到 SHA256 这样的名称。
目前,我们的重点只是这样的函数如何证明特定的交易列表与大量的计算工作相关。
拥有比特币意味着什么?工作证明和区块链。
想象一下,有人向您展示了一个交易列表,他们说:“我找到了一个特殊的数字,这样当您将这个数字放在交易列表的末尾,并将 SHA256 应用于整个交易时,输出的前 30 位都是零。” 您认为他们找到这个号码有多难?对于随机消息,散列恰好以 30 个连续零开头的概率为 230 分之一,大约是十亿分之一。
由于 SHA256 是一种加密哈希函数,因此找到此类特殊数字的唯一方法是通过猜测和检查。因此,这个人几乎肯定必须检查大约十亿个不同的数字才能找到这个特殊的数字。一旦知道这个数字,您就可以快速验证该哈希值是否确实以 30 个零开头。
换句话说,您可以验证他们是否完成了大量工作,而无需您自己进行同样的工作。这称为“工作证明”。
重要的是,所有这些工作本质上都与该交易列表相关。如果你改变其中一笔交易,即使是轻微的改变,它也会完全改变哈希值,所以你必须再进行十亿次猜测才能找到一个新的工作量证明,一个新的数字,使得被改变的哈希值可以被改变。与这个新数字一起列出的都是以 30 个零开头的。
现在回想一下我们的分布式账本情况。每个人都在广播交易,我们希望有一种方式让每个人都就正确的账本达成一致。正如我所说,原始比特币论文背后的核心思想是让每个人都信任投入最多工作的账本。
其工作方式是首先将给定的分类账组织成块,其中每个块由交易列表以及工作证明组成。也就是说,一个特殊的数字,使得整个块的哈希值以一堆零开头。
目前假设它必须以 60 个零开头,但稍后我将回到您如何选择该数字。就像交易仅在由发送者签名时才被视为有效一样,区块也仅在具有工作证明时才被视为有效。另外,为了确保有一种标准方法来对这些块进行排序,我们将进行排序,以便一个块必须包含前一个块的哈希值。
这样,如果您更改任何块,或者尝试交换两个块的顺序,它会更改其后面的块,从而更改该块的哈希值,从而更改下一个块,依此类推。这需要重做所有工作,并为每个块找到一个新的特殊编号,使其哈希值以 60 个零开头。
由于区块是这样链接在一起的,因此通常称为“区块链”,而不是称为分类账。
作为我们更新协议的一部分,我们现在将允许世界上的任何人成为“区块创建者”。这意味着他们将侦听正在广播的交易,将它们收集到一个块中,然后做一大堆工作来找到使该块的哈希值以 60 个零开头的特殊数字,然后广播出该块他们发现。
为了奖励区块创建者所做的所有这些工作,当她构建一个区块时,我们将允许她在顶部包含一项特殊交易,在该交易中,她凭空获得 10 个 LedgerDollars。这称为区块奖励。这是我们关于是否接受交易的通常规则的一个特殊例外;它不是来自任何人,因此不必签名。
这也意味着我们经济中的 LedgerDollars 总数随着每个新区块的增加而增加。创建区块通常被称为“挖矿”,因为它需要大量工作,并且它将新的货币引入经济中。但是,当您听到或读到有关矿工的信息时,请记住,他们真正所做的是创建区块、广播这些区块,并因此获得新的资金奖励。
从矿工的角度来看,每个区块就像一张微型彩票,每个人都在尽可能快地猜测数字,直到一个幸运的人找到一个使该区块的哈希值以许多零开头的数字,并因此而获得奖励。
我们的协议现在对使用该系统的人的工作方式是,您不再监听交易,而是监听矿工广播的新块,更新您自己的区块链个人副本。
关键的补充是,如果您听说两个不同的区块链具有相互冲突的交易历史,您会遵循最长的一个,也就是投入最多工作的那个。如果有平局,请等待,直到您听到有额外的区块使平局变得更长。因此,即使没有中央权威,并且每个人都维护自己的区块链副本,如果每个人都同意优先考虑投入最多工作的区块链,我们就有办法达成去中心化共识。
双重支出
要了解为什么这会成为一个值得信赖的系统,并了解在什么时候您应该相信付款是合法的,了解如何欺骗该系统中的某人会很有帮助。
如果爱丽丝想用一个欺诈性的区块来愚弄鲍勃,她可能会尝试向他发送一个包含她向他支付 100 个 LedgerDollars 的区块,但不会将该区块广播到网络的其他部分。这样其他人就认为她还拥有那 100 块 LedgerDollars。
为此,她必须先于所有其他矿工(每个人都在自己的区块上工作)找到有效的工作证明。这可能会发生!也许爱丽丝比其他人都先赢得了这张小型彩票。但是鲍勃仍然会听到其他矿工发出的广播,因此为了让他相信欺诈性区块,爱丽丝必须自己完成所有工作,以不断向鲍勃区块链中的这个特殊分叉添加区块,这与他从其他矿工那里听到的不同矿工们。
请记住,根据协议,鲍勃始终信任他所知道的最长的链。如果爱丽丝碰巧比网络上所有其他矿工加起来更快地找到区块,她也许能够将这种情况保持几个区块。
但是,除非 Alice 拥有所有矿工中接近 50% 的计算资源,否则所有其他矿工正在处理的区块链的增长速度将超过 Alice 为 Bob 提供的单个欺诈性区块链的增长速度。因此,随着时间的推移,鲍勃将拒绝他从爱丽丝那里听到的消息,转而支持其他人正在研究的更长的链。
请注意,这意味着您不必立即信任您立即听到的新块。相反,您应该等待在其上添加几个新块。如果您还没有听说过任何更长的区块链,您可以相信这个区块是其他人正在使用的同一条链的一部分。
区块时间、减半和交易费用
至此,我们已经实现了所有主要想法。这种基于工作量证明的分布式账本系统或多或少是比特币协议的工作原理,以及许多其他加密货币的工作原理。
只有一些细节需要澄清。之前我说过,工作量证明可能是找到一个特殊的数字,使得区块的哈希值以 60 个零开头。实际比特币协议的工作方式是定期更改零的数量,以便平均需要 10 分钟才能找到一个区块。
因此,随着网络上的矿工越来越多,挑战变得越来越难,以至于这种微型彩票每 10 分钟大约只有一名中奖者。许多较新的加密货币的出块时间要短得多。
比特币中的所有资金最终都来自于一些区块奖励。这些奖励是每个区块 50 比特币。
有一个名为“ Block Explorer ”的很棒的网站,您可以在其中查看比特币区块链,如果您查看链上的前几个区块,您会发现它们除了给予矿工的 50 比特币奖励之外不包含任何交易。
每 210,000 个区块(大约每 4 年),奖励就会减少一半。所以现在每个区块的奖励是 12.5 比特币,而且由于这个奖励随着时间的推移呈几何级数减少,所以比特币的存在量永远不会超过 2100 万个。
然而,这并不意味着矿工将停止赚钱。除了区块奖励之外,矿工还可以获得交易费。其工作原理是,每当您进行付款时,您都可以选择包含一小笔交易费用,该费用将支付给包含该付款的任何区块的矿工。
您这样做的原因是为了激励矿工将您广播的交易实际包含到下一个区块中。
你看,在比特币中,每个区块仅限于约 2,400 笔交易,许多批评者认为这是不必要的限制。相比之下,Visa 平均每秒处理约 1,700 笔交易,每秒可处理超过 24,000 笔交易。比特币处理速度较慢意味着交易费用较高,因为这决定了矿工选择将哪些交易包含在新区块中。
这远未全面涵盖加密货币。我在这里没有触及许多细微差别和替代设计选择,但希望这可以为任何希望通过进一步阅读添加更多分支的人提供稳定的“等待但为什么”式的理解树干。
就像我在开头所说的那样,本文背后的动机之一是大量资金已经开始流向加密货币,对于进入这个游戏的人们来说,至少了解该技术的基础知识是有益的。