比特币的信任系统是如何构建的
扫描二维码
随时随地手机看文章
比特币是一种去中心化的数字货币,它建立在信任系统的基础上,并以诸如椭圆曲线的各种性质等密码难题为基础。在不深入研究比特币数学方面的情况下,要正确理解本文的关键思想,不需要深入了解密码学。但是,您应该对私钥和公钥有基本的了解。
“我在哪儿签名?”
每次您想授权付款时,都会要求您进行某种形式的验证。核实的目的是,一旦你以自己的名义批准了一笔交易,这笔交易就不可逆转。当然,在某些情况下,您可能希望添加一个条款,即如果某些条件没有得到满足,付款必须向另一个方向进行托管。但一旦一项交易获得授权并签署,就会成为定局。唯一的问题是:你能完全肯定地证实它确实是由它所代表的人授权的吗?使用签名来识别用户的问题是一个老问题。曾经有一段时间,人们用昂贵的徽记密封信件,以证明信件 确实来自某个权威机构。
封信与应用封信的做法已被PGP密钥所取代。PGP密钥很有趣,因为在某些方面它们与比特币密钥非常相似。让我们花一分钟看看PGP,然后看看比特币是如何建立在这个基础上的。
有两种使用PGP密钥的方法:
1. 用于加密和解密电子邮件。如果有人截获了邮件,他们就无法破译邮件内容。
2. 签署消息。如果有人拦截,他们能够验证消息的真实性。
PGP有效地替代了密封装置。过程如下。首先,必须生成公钥-私钥对。现在你写电子邮件。完成之后,您拿着您的私钥和电子邮件,通过PGP签名程序运行它,然后会出现一个签名。此签名只能由持有私钥的人生成。怎么能确定呢?您获取消息和签名,并通过提供发送方公钥的PGP验证程序运行它。这个程序会告诉你这封邮件是否真的是由他声称的那个人写的。唯一需要回答的问题是:如何获得公钥?这是一个有趣的问题,因为加密技术没有为您提供任何机制。它完全掌握在用户手中。通常,在PGP的情况下,用户上传他们的一些中央服务器公钥,这样任何人都可以取。
比特币使用了一个非常类似的公钥加密过程。然而,比特币程序不需要对消息进行签名,而是允许您对交易进行签名。
比特币交易如何签署?
现在你已经了解了PGP加密是如何工作的,你可以开始考虑比特币签名了。不过这有点棘手。天真的想法是,当您创建一个交易提供从您的帐户中扣除X数量的比特币并将其转移到Y时,您只需要签署这个建议。但这有一个问题。如果您只是在创建交易,说明您想要转移资产,那么谁会验证您确实有钱?这将需要一些中央权力进行核查。比特币的设计初衷并非如此。因为权力最终掌握在用户手中。比特币提出了一个绝妙的解决方案。这个想法是这样的:只有在过去的某个时候你收到了比特币,你才有可能拥有比特币。这样,唯一可以声明事务的人,就是持有私钥的人。因此,比特币签名有双重用途:
· 它验证您是事务的真正创建者,并且
· 你确实拥有你将要转移的比特币。
后者是最基本的。我们将在其他帖子中看到这是如何形成钱包(或账户集合)的基础。顺便说一下,以太坊以略不同的方式介绍了一个独立帐户的概念。但比特币只是一个交易链。因此,对于所有权来说,你必须扫描交易链并使用它们,你必须解锁它们并在交易中使用它们。
附注: 您可能想知道:以太坊为什么有一个较好的设计,因为它允许创建账户。这取决于用例。设计上的简洁性使系统保持流线型,比特币确实实现了价值储存的目的。
每个事务都由输入和输出组成。每个输入都包含一些以前的事务。每一项产出都包括资金被送往的目的地。当您签署一个事务时,您同时签署输入和输出。通过对输入的签名,您实际上是在说您是这些代币的真正所有者。通过对输出结果的签名,您就同意确实希望将这些代币发送到指定的地址。为了保持资金流动,交易的每个输出都被用作另一个交易的输入。
输出消耗为输入
足够的理论。让我们看一个真实的交易。
这是通过电线传输的实际交易。我们无法从中了解任何东西。我们如何解释它?一个词: 协议。
协议是一个标准的用于定义交换数据的方法,从计算机networkIf的交易协议规则中,我们可以看到交易是如何构造的。
交易协议
输入交易协议
输出交易协议
让我们根据协议分解交易。
头
包含元数据信息。例如,它告诉程序这是一条事务消息。
版本
允许向后兼容性。如果使用新字段更新协议,则旧事务不应变得不可识别。
事务目击者
这是作为隔离证人变更的一部分而引入的一个领域。我们改天再看。
引用的事务
事 务仅包含对正在使用的前一个事务的特定输出的引用。它使用事务哈希值和输出索引号(从0开始)的组合。如果需要,程序可以使用它的哈希值获取整个事务。使用索引号,它知道将哪个输出用作输入。
要计算事务哈希值,您需要连接事务的完整十六进制表示,并计算该字符串的SHA256两次。
序列
见https://bitcoin.stackexchange.com/a/55113。
价值
发送的金额(以satoshi表示)。
锁定时间
解锁此事务的块号或时间戳。
公钥脚本(scriptPubKey)
事务的目的地。隐藏在这个脚本中的是接收方的公钥哈希值,表示为十六进制。要获得相应的比特币地址,只需将此十六进制转换为Base58。
签名脚本(scriptSig)
与scriptPubKey类似,scriptSig包含授权事务的签名。除了签名本身之外,所有部分都已签名。
现在我们知道了编码的规则,让我们解码它:
有一个事务输入,即hash2936ee6a0db4e4901988503bb6e966128dd5fa01bcf08451f78a1d5b08dbbd6事务的第0个索引,有两个输出。其中一个是0.05 BTC,地址为3swtkzdetsfxyjqgdwtvpqulv64rvktbzthukvxxre4th6tsgxnrg
其余33.54 BTC,地址为3q7mcidryx4d9pefdeqckuq2iug4i4efb8buho7gflckepynwkr4h。
您可能已经注意到,与其简单地调用公钥和签名,还不如调用公钥脚本和签名脚本。这是一个非常强大的概念,我们将在其他时间深入探讨。但我将留给您这样一个想法:有时您希望创建一个可编程事务,以便它只在满足某些条件时才执行。例如,如果发现有问题,您可能希望返回刚购买的商品。或者你的经理想要批准你做的每一笔交易。脚本支持有趣的用例,并且正在进行进一步改进脚本的工作。
交易是比特币分散式对等电子现金系统的关键组成部分。公钥密码学确保了没有人可以只接受您创建的交易并更改它,这样一来,比特币现在的地址将与您打算发送的目的地不同。它还确保除了私钥所有者之外,任何人都不能访问发送给他的资金。
概括地说:交易是不可逆转的,也是无可争辩的。要使用以前事务的输出作为新事务的输入,您需要私钥。这允许您对消息进行签名。要将资产发送到某个帐户,需要它们的公钥。交易是比特币系统的核心特征之一。
但这并不是信任体系的全部。如果我创建一个事务,广播它,然后快速创建另一个事务,并广播那个事务,会怎么样?谁来废除其中一个?一般来说,世卫组织确保系统中的所有事务都公平地进行。如果比特币需要一个实体来检查一切是否公平公正,它就不会被认为是去中心化的。在这篇文章的第二部分中,你将看到如何可以在没有一个中心机构的情况下,确保一切事物顺利运行。
上面探讨了如何以加密方式密封交易,从而使除所有者之外的任何人都无法对其进行j决策。我们简要地讨论了这些交易是如何通过网络提交并广播到整个网络的。我们还讨论了接收方如何接收这些交易并在后续交易中使用它们,从而创建一个顺序,在这个顺序中,先前交易的输出作为新交易的输入使用。
创建交易之后,需要在某个地方写下它,以便以后可以引用它。这需要一个存储模型,其中所有的交易都可以被记录(也称为分类账)。为什么我们需要以前的交易?因为为了验证某笔交易是正确的而不是欺诈的,您必须从一开始就跟踪它(从Nakamoto的账户开始)。我建议你暂停一下思考为什么需要这样做?有没有更有效的方法来处理这个问题?
这显然是一个乏味的过程!在每分钟发生数百万个交易的情况下,您不可能花费所有的计算资源来试图弄清楚交易是如何构造的。这里有一种简单而优雅的方法可以解决这个问题。将一组交易存储在块中,并将这些块链接在一起。而不是在接受的单个交易上盖章。通过这种方式,在检查某个交易是否确实正确而非欺诈时,您只需获取前面引用的交易及其块,并对其进行验证即可。
这总结了比特币的存储模式。但是如何进行沟通呢?区块链中有不同的角色—每个角色都有自己的角色集。有些正在向区块链添加块。有些只是简单地将块传递给其他块—确保所有块都被考虑在内。有些正在创建/传输实际的交易。有些只是验证这些交易。有些只是监视区块链上发生的活动。但这一切是如何在不受外部影响的情况下以一种自我维持的方式发生的呢?
在我们深入研究理论之前,我想介绍一下系统中的一些关键角色。稍后我们将进一步阐述其目的。这些参与者(更具体地说:节点)可能以某种形式重叠,但在概念上是独立的实体。
钱包
钱包(也称为简单支付验证节点)有两种功能:
1. 它需要扫描区块链来查看哪些交易属于他
2. 它需要创建向网络广播(并最终挖掘)的交易。
种子
在任何时刻,每个节点都连接到若干其他任意节点;形成点对点节点的网格状结构。然而,为了发现其他节点,一个节点必须首先连接到“种子”节点——这将引入其他节点。
矿工
矿工将块放入区块链中。它们汇集所有未经确认的交易;按照开矿费(最高)对它们进行排序,并将其添加到区块链中。然后将这个新挖掘的块广播到网络的其他部分。简而言之,矿商的工作就是将交易转换为块。
中继器
中继器只是监视活动。他们可以判断网络的健康状况;参与消息传递;或者查询区块链以获得其他统计信息。
在上述文中我们在讨论中提到,对于一个具有加密签名的交易系统,仍然有可能滥用该系统。如何确保添加到区块链上的交易没有被篡改?如果一个淘气的参与者开始用不正确的交易/消息轰炸系统,该怎么办?如果有人同时将x个BTC发送给A和x个BTC发送给B,会怎么样?哪一个是有效的?如果矿商接受两个不同的交易呢?节点之间如何协调一致地进行网络更改?可以用一个问题来概括:这个体系是如何监管的?
这些都是密码学上的、受保护的、不受信任的网络中的难题——在某种意义上说,任何一方都不能危害生态系统。所有节点必须符合网络规则,如有异议,一组节点可以对当前的区块链进行快照;
提出的比特币解决方案中的一个关键概念是形成一个定义良好的块顺序。如果您已经订购了块,并且得到了所有对等方的一致同意,那么同一个交易不可能在区块链中出现多次。一个简单的方法可以是简单地向块(1,2,3…)添加索引。更好的方法是添加时间戳而不是数字,因为时间戳还提供关于块创建时间的额外信息,每个块随后可以引用前面的时间戳(假设每个时间戳是惟一的)。在我们的系统中仍然有一个明显的问题。你能看出来是什么吗?
任何人都可以在任何时候创建一个块,并可以向网络发送几十个块的垃圾邮件。这将导致网络瘫痪,比特币将完全无法使用。在Bitcoin白皮书中提出的解决方案如下:当向区块链添加一个块时,矿商被要求破解一个密码难题,并将产生的哈希值添加到块中。这个谜题的设计方法是这样的:它很容易验证是否正确解出了,但如果事先不知道答案,就很难解出。此外,比特币网络还可以定期调整这个谜题。例如,2019年初,采矿难度比两年前提高了1800%左右。这样做是为了抵消采矿机哈希功率的上升,并在系统中保持平衡。当然,如果矿商没有开采这些交易的动机,所有这些工作都将毫无意义。这就是所有交易都要收费的原因——费用由矿商承担。在2140年之前,矿工们还将获得一些BTC作为继续采矿的额外激励。这个额外工作产生的哈希值也用于排序;而不是依赖于时间戳。但是,我们仍然在块上使用时间戳,因为它们为我们提供了有价值的信息。
到目前为止,我们已经有了一个带有时间戳的、受垃圾邮件保护的、链接在一起的块,这些块由看起来相当可靠的交易组成。让我们进一步测试它。矿工有可能做出恶意行为吗?例如,他可以在一个块中引入一个从来没有人请求过的交易吗?如果两个不同的块包含由两个不同的矿商几乎同时产生的一组相同的交易,该怎么办?
这是两个不同的问题,但值得探讨。为了解决第一个问题,我们需要介绍比特币区块链如何巧妙地处理哈希值。哈希值是一种固定大小的数据,用于确保某些输入的完整性。首先,我们计算一个块中所有交易的哈希值。然后,我们使用一种称为Merkle根构造的技术来计算根哈希值。这个哈希值可以看作:所有的哈希值。简单来说,根哈希保证了块中所有交易的完整性。矿机或中继器不可能引入不属于原始块的交易,因为这会破坏整个块的哈希值。很好,那么同时生产多个块呢?
这就有点复杂了,因为比特币论文并没有给出一个具体的答案。相反,它被留在了一场碰运气的游戏中。不幸的是,必须有人输掉这场战斗。让我们画一幅画。假设中国的矿商X和美国的矿商Y的区块中都包含了交易T。x 产生块 b1 和产生的区块链是 [。.。a→b1], 而 y 的区块链看起来像 [。.。a→b2]。这两个块被广播和转发, 直到最终74% 的节点知道一个区块链 [。.。a→b1], 而18% 的人知道区块链为 [。.。a→b2]。这两个区块链似乎都是有效的, 尽管相互矛盾。现在,德国的一名矿工Y把区块链看成是[…a→B1],他制作了另一个C块并广播它。他的范围是94%的节点。所有以前和区块链[…A→B2]打交道的矿商,现在都看到了这个新的区块链[…A→B1 C],他们将决定放弃之前的链条,代之以最新的版本。如果他们不这样做,而是继续使用旧的开采链,他们就有可能将开采区块拱手让给大多数。最后,最流行的区块链版本被认为是标准版本。这就是为什么一般建议等到6个块后才接受交易,因为区块链的状态可能会发生变化。作为一个挖掘人员,您希望能够访问尽可能多的节点,否则您的所有努力都有可能白费。另一方面,矿业权力的统一也给比特币网络的分散化带来了风险。如果一组矿工获得51%的哈希值功率,他们可以有效地从他们喜欢的区块链中剥离出来。这是对比特币区块链的实际威胁,目前没有任何安全措施确保未来不会发生这种情况。反对这一观点的人认为这是极不可能的,而且会损害所有参与者的利益。
垃圾邮件保护(工作证明)结合区块链分支和最终的合并意味着我们应该在交易广播之后等待一段时间,然后才能有足够的信心说它已经在区块链网络中持久化。通常,开采一个新区块需要10分钟。如果我们等6个区块,我们的交易就会被深埋在账本里,我们可以非常自信地说,交易已经完成了。但是没有人喜欢喝等一个小时的咖啡。这就是比特币的瓶颈。这项技术不能用于日常使用,但却引领了互联网货币的发展。记住,比特币本身就是各种试图创造虚拟货币的高潮。所以,在我看来,说这项技术已经达到顶峰是不正确的。有很多改进的建议。下一个版本的加密货币可能在利用比特币(Bitcoin, et al)提出的概念的同时,处理当前系统面临的问题(比如波动性和交易速度)。