区块链 - 快速指南
区块链 - 简介
近年来,区块链引起了很多关注。许多人将其描述为十年来最具颠覆性的技术。特别是金融市场可能是受影响最大的市场。
该技术正在被应用于许多垂直领域,如医疗保健、医药、保险、智能资产、汽车,甚至政府。
然而,到目前为止,区块链最成功的实现是比特币 - 一种点对点电子现金系统,顺便说一下,这也是区块链技术的首次实现。因此,要了解区块链技术,最好了解比特币系统的设计和实现方式。
在本文中,您将了解什么是区块链、它的架构、如何实现及其各种功能。我将在描述区块链的复杂性的同时介绍比特币的实现。
区块链架构并不那么简单,许多人已经撰写了很好的文章、教程,包括几个视频。这些受众从新手到专业人士不等。在本教程中,我将重点介绍区块链架构的概念理解,同时考虑新手和专业人士。在深入研究区块链之前,重要的是要知道为什么需要这项新技术?这个问题的答案在于所谓的双重 − 支出。
区块链 - 双重支出
考虑图像 − 中所示的情况
从这里可以清楚地看到,鲍勃正在向丽莎出示一张 10 美元的钞票以换取一本书。一旦 Lisa 收到这张 10 美元的实物钞票,Bob 就无法再将这笔钱用于其他交易,因为实物货币现在在 Lisa 手中。
现在,考虑以数字形式支付的情况。这在图像 − 中说明。
由于货币兑换的格式是数字格式,因此它本质上是存储在 Bob 设备某处的二进制物理文件。Bob 将此文件(数字货币)交给 Lisa 后,他还可以将该文件的副本交给 Alice。现在,两人都认为他们已经收到了钱,而没有任何手段来验证数字货币,因此会将各自的商品交付给 Bob。这被称为双重支付,即发送者在多个地方花费相同的钱来从多个供应商处获得服务或商品。
为了解决双重支付问题,可以采用集中式机构来监控所有交易。这在图像 − 中进行了说明
集中式机构(通常指您的银行)维护一本记录所有交易的账簿。现在,Bob 必须将他的数字货币发送给银行,银行会在其账簿中记入 Bob 的账户借方。在确保 Bob 有足够的余额来支付他想要发送的数字货币后,会将钱发送给 Lisa,并在其账簿中记入她的账户。
现在,可以保证 Bob 不会双重支付这笔钱。如果每笔数字交易都通过这样的中心化机构进行,那么双重支付问题就会得到解决。这还提供了另一个好处,即验证交易中收到的每枚硬币(数字货币)的真实性。因此,假钱(重复的钱,例如 Bob 使用副本向 Alice 付款的情况)将很容易被检测到并阻止流通。
虽然引入中心化机构解决了双重支付问题,但也带来了另一个主要问题——创建和维护中心化机构本身的成本。
由于银行需要资金来运营,他们开始削减为客户进行的每笔货币交易的佣金。这有时会变得非常昂贵,尤其是在海外转账时,整个交易可能涉及多个代理商(银行)。
通过引入称为比特币的数字货币,解决了上述所有问题。在深入研究比特币的设计和架构之前,我将简要介绍一下比特币的背景。
比特币 - 简史
2008 年,中本聪通过一份题为比特币:一种点对点电子现金系统的研究式白皮书,将比特币引入了这个世界。
比特币不仅解决了双重支付问题,还提供了许多其他优势,其中值得一提的优势就是交易的匿名性。创建该系统并在该系统上交易了一些货币的中本聪对整个世界来说是完全匿名的。
试想一下,在这个社交媒体的世界里,当每个人的隐私受到威胁时,世界到目前为止还无法追踪到谁是中本聪?事实上,我们不知道中本聪是个人还是一群人。谷歌搜索还发现,中本聪持有的比特币价值约 194 亿美元——这笔钱现在在比特币系统中无人认领。那么什么是比特币——让我们来看看吧!
什么是比特币?
如前所述,银行维护一个记录每笔交易的账本。这个账本由银行私人持有和维护。中本聪提议让这个账本公开并由社区维护。
当你将这样一个账本公开时,你会想到几个注意事项。这个账本必须是防篡改的,这样就没有人可以修改它的条目。由于账本中的每个条目都是公开可见的,我们必须想办法保持匿名——显然你不想让世界上的每个人都知道我付给你一百万美元。
此外,由于世界上只有一个账本记录每一笔交易,账本的大小将是另一个大问题。提供这些复杂问题的解决方案并非易事,这就是我在这里尝试让你用简单的语言理解比特币的底层架构的原因。
这个底层架构就是区块链,这就是本教程的内容。要了解区块链架构,您需要了解它所基于的一些关键特性。那么,让我们开始使用 PKI - 公钥加密。
区块链 - 公钥加密
公钥加密或简称 PKI 也称为非对称加密。它使用两对密钥 - 公钥和私钥。密钥是一个很长的二进制数。公钥在全球范围内分发,顾名思义,它是真正公开的。私钥必须严格保密,绝不能丢失。
对于比特币,如果您丢失了比特币钱包的私钥,您的钱包中的所有内容将立即容易被盗,在您不知不觉中,您的所有资金(钱包中的资金)都将消失,系统中没有任何机制可以追踪谁偷了它 - 这就是我之前提到的系统中的匿名性。
PKI 实现两个功能 - 身份验证和通过加密/解密机制实现的消息隐私。我现在将解释这两个功能 −
身份验证
当双方交换消息时,在发送者和接收者之间建立信任非常重要。特别是,接收者必须信任消息的来源。回到我们之前的场景(如图 1 所示),Bob 向 Lisa 汇款以从她那里购买一些商品,让我们看看 PKI 如何在 Bob 和 Lisa 之间建立这种信任。查看下图 −
首先,如果 Bob 想要向 Lisa 汇款,他必须创建自己的私钥/公钥。请注意,这两个密钥始终是配对的,您不能混合不同个人或不同实例的私钥和公钥。
现在,Bob 说他要向 Lisa 汇款 10 美元。因此,他创建了一条消息(纯文本消息),其中包含 Bob(发送者)的公钥、Lisa(接收者)的公钥和金额(10 美元)。
这笔汇款的目的(例如"我想从你那里买南瓜")也添加到消息中。现在使用 Bob 的私钥对整个消息进行签名。当 Lisa 收到此消息时,她将使用 PKI 的签名验证算法和 Bob 的公钥来确保该消息确实来自 Bob。PKI 的工作原理超出了本教程的范围。感兴趣的读者可以参阅此网站,了解有关 PKI 的更详细讨论。这确定了消息发起者的真实性。现在,让我们看看消息隐私。
消息隐私
现在,由于 Lisa 已收到付款,她想发送 Bob 想要购买的电子书的链接。因此,Lisa 将创建一条消息并将其发送给 Bob,如图所示 −
Lisa 创建一条消息,例如"这是您请求的我的电子书的链接",使用她在 Bob 的请求消息中收到的 Bob 的公钥对其进行签名,并使用在 HTTPS 握手期间两人共享的某个密钥加密该消息。
现在,Lisa 确信只有 Bob 可以使用 Bob 独自持有的私钥解码该消息。此外,拦截该消息的人将无法恢复其内容,因为内容是由只有 Bob 和 Alice 持有的密钥加密的。这向 Lisa 保证了只有 Bob 才能访问她的电子书。
了解了 PKI 隐含的身份验证和消息隐私这两个功能后,让我们继续看看比特币如何利用 PKI 来保护我在"什么是比特币?"一章中提到的公共账本。
供您参考 − 最流行的 PKI 算法是 RSA 和 ECDSA,比特币使用后者。
区块链 - 哈希
PKI 中最重要的功能之一是哈希函数。哈希函数将任意大小的数据映射到固定大小的数据。比特币使用 SHA-256 哈希函数,该函数产生大小为 256 位(32 字节)的哈希(输出)。这在图像中说明 −
Bob 在向 Lisa 下订单时,创建了一条类似于上面显示的消息。此消息通过哈希函数进行哈希处理,该函数产生 32 字节哈希。此哈希的优点在于,出于所有实际目的,哈希(256 位数字)被视为消息内容的唯一性。如果修改了消息,哈希值将发生变化。不仅如此,给定一个哈希值,就不可能重建原始消息。
在了解了哈希的重要性之后,让我们继续讨论比特币中的另一个概念,即挖矿。
比特币 - 挖矿
当 Bob 为 Lisa 创建购买请求时,他不会将其单独发送给 Lisa。相反,请求消息会在他所连接的整个网络上广播。Bob 的网络如图所示。
消息发送到所有连接的节点(机器)。图中的某些节点被标记为矿工。这些机器运行用于挖掘比特币消息的软件。现在我将向您解释挖矿的含义。
挖矿过程
由于整个网络分布广泛,网络中的每个矿工预计都会在任何给定时间段内收到来自多个供应商的多条消息。矿工所做的就是将这些消息组合成一个区块。如图所示 −
在形成一个消息块后,矿工使用前面描述的哈希函数在该块上创建哈希值。现在,如您所知,如果任何第三方修改此块的内容,其哈希值将失效。顺便说一句,每条消息都带有时间戳,因此没有人可以在不影响块的哈希值的情况下修改其时间顺序。因此,块中的消息完全不会被篡改。进一步解释了如何使用这一事实来保护网络中的所有交易。
区块链 - 链接区块
由各个矿工创建的区块被链接在一起,形成所谓的真正分布式公共账本。
链中的每个区块都包含多个消息(交易),如图 8 所示。链中的区块可能来自任何矿工。在创建区块链时,我们遵守将前一个区块的哈希值添加到当前区块的规则。
因此,矿工在创建区块时,会获取链中最后一个区块的哈希值,将其与自己的一组消息相结合,并为其新创建的区块创建哈希值。这个新创建的区块现在成为链的新末端,因此随着矿工向链中添加越来越多的区块,链会不断增长。
区块链 - 工作量证明
由于所有交易都带有时间戳,我们需要在对等网络上实现分布式时间戳服务器。这需要一些额外的实现,这就是我现在要描述的工作量证明。对于每个区块,我们现在再添加一个名为 Nonce 的项目,如下图所示 −
Nonce 是一个数字,使得区块的哈希值符合某个标准。此标准可能是生成的哈希的前四位数字必须为零。
因此,生成的哈希看起来像 000010101010xxx。通常,矿工从 Nonce 值 0 开始,并不断增加它,直到生成的哈希满足指定的标准。
请注意,哈希生成是随机的,并且不受您的控制 - 也就是说,您无法强制哈希函数生成某个哈希。因此,可能需要多次迭代才能生成具有四个前导零的所需哈希。在比特币系统中生成一个区块的预期时间为 10 分钟。一旦矿工成功挖掘出该区块,他就会将其发布到系统中,使其成为链中的最后一个区块。
请注意,有多个矿工在竞争生成合法区块。比特币系统会奖励第一个成功的矿工一定的比特币。一般来说,拥有更多计算能力的矿工可能是早期的赢家。这可能会导致那些拥有巨大处理能力的人对整个系统发起攻击。我将在本教程的最后描述这些攻击以及如何缓解这些攻击。
区块链 - 网络和挖矿
我现在将总结上述步骤;这就是网络中发生的事情 −
任何想要从在网络上做广告的第三方获得服务的人都会首先创建交易(向所需收件人发送消息)。
在给定的时间段内,可能有许多发送者(买家)和接收者(卖家)创建此类交易。
所有交易都会在网络上广播到所有节点。请注意,给定交易不必到达网络中的每个其他节点。
每个节点将新交易组装成一个区块。请注意,每个区块中的交易集独立于其他区块中的交易集,并且自然会与其他区块不同。这没关系;系统确保在合理的时间内,网络上广播的每笔交易都会包含在某个区块中。通常,发送者会通过向矿工提供一定数量的比特币来激励节点。矿工可以选择优先将那些具有更高激励的矿工纳入区块。
节点现在致力于寻找其组装区块的工作量证明。
当节点找到工作量证明时,它会在网络上广播组装的区块。
接收新区块的节点只有在验证区块中的所有交易均有效且尚未使用后才会接受它。
如果区块被接受为有效,则正在处理自己的新区块的节点必须重新组装其区块中的交易,确保交易不会重复。节点现在致力于寻找其新创建区块上的工作量证明;在执行此操作时,它将把已接受块的哈希值作为前一个哈希值。
同样,区块链会永远增长。
现在,我们已经了解了整个系统的工作原理,让我描述一些副作用以及如何解决它们。
区块链 - 对矿工的激励
正如我们在比特币 - 挖矿一章中看到的那样,矿工可能会在任何给定的时间段内被大量交易淹没。系统中预先定义了区块的最大大小,因此区块中只能包含一定数量的交易。
区块中的交易数量由预定义的区块大小和每个区块的平均长度决定。这里的一个重要提示是,发送者不应该在消息中包含太多信息,以使其简短,从而激励矿工在其他长消息之前接受它。
发送者通常还会以一定数量的比特币为单位添加交易费,以激励矿工尽早将其纳入其区块。
构建区块链的另一个后果是其大小。在一段时间内,整个区块链可能会变得太大,节点无法将其存储在其磁盘上。这可以通过使用下面描述的 Merkle 树来解决。
区块链 - Merkle 树
节点中的磁盘空间问题很容易解决,因为区块中的所有交易都在 Merkle 树中进行哈希处理,如图所示 −
区块头现在包含前一个区块的哈希、Nonce 和 Merkle 树中当前区块中所有交易的 Root Hash。由于此 Root Hash 包含区块内所有交易的哈希,因此可以修剪这些交易以节省磁盘空间。所以现在您的区块链将如下图所示 −
这可以节省大量磁盘空间。普通客户只希望从其他人那里收到付款,他们就会使用这种策略。但是,矿工需要保存完整的区块链。现在出现了一个问题,接收者如何在无法追踪收到的硬币来源的情况下验证付款。接下来将对此进行解释。
区块链 - 付款验证
考虑这样一种情况,作为供应商,您可能希望验证过去进行的某笔付款。由于您在机器上保存的区块链仅包含如上图所示的区块头,因此您正在搜索的交易在区块链副本中缺失。
您现在可以在区块链副本中向后搜索,直到找到所需交易带有时间戳的区块。现在,请求所选区块的 merkle 树,您将获得您正在寻找的交易。如下图所示 −
在这里,我们假设您正在寻找 Tx103。虽然您可能看不到 Tx103 的内容,但您知道它已被其所属的区块和链中的所有后续区块接受。因此,您可以放心地信任此交易并继续开展业务。
区块链 - 解决冲突
正如我们所见,比特币网络包含多个矿工。两个不同的矿工可能同时解决工作量证明,从而将他们的区块添加到链中最后一个已知区块。如下图所示 −
现在,我们在区块 3 之后有两个分支。这两个分支都是有效的。因此,下一个开采的区块可以添加到任一分支中。假设矿工将新开采的区块添加到区块 104-A,则包含区块 104-A 的分支将比包含区块 104-B 的分支更长。如下图所示 −
在比特币架构中,最长的分支总是获胜,较短的分支将被清除。因此必须清除区块 104-B。在清除此区块之前,此区块中的所有交易都将返回到交易池,以便对其进行挖掘并添加到某个未来区块中。这就是解决冲突的方法,并且系统只维护一个区块链。
区块链 - 隐私
由于记录所有比特币交易的账本是真正公开的,因此隐私受到威胁。世界上任何人都能知道谁付钱给谁?传统银行系统能够通过保密其记录来维护这种隐私。
比特币系统中的隐私是通过不同的策略实现的。请注意,我们说比特币的发送者需要知道向谁付款。因此,他要求获得他希望付款的供应商的公钥。此公钥可以是匿名的。
从某种意义上说,作为某些服务的供应商,当有人问您将付款发送到哪里时,您只需向他发送您的公钥。此公钥与您的关联不会记录在账本的任何地方。这样,此交易之外的任何人都只会知道交易了多少钱以及将钱支付给了哪个公钥。
为了实现更高程度的隐私,对于每笔交易,您可以为每笔交易生成一个新的私钥/公钥,以便第三方无法将您进行的多个交易归为一类。对于局外人来说,这仅仅意味着进行了多笔较小金额的交易,并且它们永远不会链接到一个共同的来源。
最后,任何基于互联网的在线系统都容易受到滥用。现在,我将描述几种可能针对比特币系统的攻击类型以及如何缓解这些攻击。
比特币 - 缓解攻击
我将讨论比特币系统中三种不同类型的可能攻击 −
竞争攻击
作为攻击者,您可能会快速连续地将同一枚硬币发送给不同的供应商,可能使用两台不同的机器。如果供应商在交付货物之前不等待区块确认,他们很快就会意识到交易在挖掘过程中被拒绝。解决此类攻击的方法是,供应商必须等待至少一个区块确认,然后才能发送货物。
芬尼攻击
在这种情况下,攻击者是矿工。矿工用他的交易挖掘一个区块,但不在系统中发布它。他现在在第二个交易中使用相同的硬币,然后发布预先挖掘的区块。显然,第二笔交易最终会被其他矿工拒绝,但这需要一些时间。为了降低这种风险,卖家应该等待至少六个区块确认后再发货。
51%攻击
在这种攻击中,我们提出了一个不切实际的假设,即某人拥有 51% 的网络计算能力。这种攻击中的攻击者会挖掘一个私有区块链,然后对硬币进行双重支付。
由于他拥有大部分计算能力,因此可以保证他的私有区块链在某个时间点会比"诚实"网络的链条更长。然后,他在系统中发布他的私人区块链,使诚实区块链中先前记录的所有交易无效。
这种攻击是虚构的,因为获取等于或超过整个网络计算能力 51% 的计算能力非常昂贵。
区块链 - 结论
在这个简短的教程中,您将以比特币为例了解区块链的几个概念。比特币是区块链的第一个成功实现。今天,世界已经在多个行业中发现了区块链技术的应用,这些行业需要信任而不需要中央权威的参与。欢迎来到区块链的世界。
进一步阅读 −
Satoshi − 的原始论文比特币:点对点电子现金系统
官方网站 − Bitcoin.org