区块链 - 快速指南


区块链 - 简介

近年来,区块链引起了很多热议。许多人将其描述为十年来最具颠覆性的技术。尤其是,金融市场可能是受影响最严重的市场。

该技术正在应用于许多垂直领域,如医疗保健、药品、保险、智能财产、汽车,甚至政府。

然而,迄今为止,区块链最成功的实现是比特币——一种点对点电子现金系统,顺便说一句,这也是区块链技术的第一个实现。因此,要了解区块链技术,最好了解比特币系统是如何设计和实现的。

在本文中,您将了解什么是区块链、它的架构、它是如何实现的以及它的各种功能。我将介绍比特币的实施,同时描述区块链的复杂性。

区块链架构并不是那么简单,许多人写了很好的文章、教程,包括几个视频。这些受众范围从新手到专业人士。在本教程中,我将重点关注对区块链架构的概念理解,同时考虑到新手和专业人士。在深入研究区块链之前,重要的是要知道为什么会出现这种新技术的需求?这个问题的答案在于所谓的双重支出

区块链 - 双重支出

考虑如图所示的情况 -

双重支出

从这里可以清楚地看到,鲍勃向丽莎提供 10 美元的钞票以换取一本书。一旦 Lisa 收到这张 10 美元的实物钞票,Bob 就无法将这笔钱重新用于其他交易,因为实物货币现在由 Lisa 拥有。

现在,考虑一下以数字形式支付款项的情况。如图所示 -

付费数字表格

由于货币兑换的格式是数字格式,因此它本质上是存储在鲍勃设备上某处的二进制物理文件。Bob 将该文件(数字货币)交给 Lisa 后,他还可以将该文件的副本交给 Alice。现在,两人都认为他们已经收到了这笔钱,但没有任何方法来验证数字货币的真实性,因此会将各自的货物交付给鲍勃。这称为双重支出,即发送者在多个地方花费相同的钱从多个供应商处获取服务或商品。

为了解决双重支出的问题,人们将采用一个集中的机构来监控所有交易。如图所示 -

中央集权

中央机构(通常是您的银行)维护着记录所有交易的分类账簿。现在,鲍勃必须将他的数字货币发送到银行,银行将在其分类账中记入鲍勃的账户借方。在确保鲍勃有足够的余额来支付他想要发送的数字货币后,会将钱发送给丽莎,记入其分类账中的账户。

现在,可以保证鲍勃不能双花这笔钱。如果每笔数字交易都通过这样的集中机构进行,那么双重支出的问题就会得到解决。这还为验证交易中收到的每个硬币(数字货币)的真实性提供了另一个好处。因此,假钱(重复的钱,如鲍勃使用副本向爱丽丝付款的情况)将很容易被发现并防止流通。

中心化权威的引入虽然解决了双重支出问题,但也带来了另一个主要问题——创建和维护中心化权威本身的成本。

由于银行需要资金来维持运营,因此他们开始削减为客户进行的每笔货币交易的佣金。有时这可能会变得非常昂贵,特别是在海外汇款时,整个交易可能涉及多个代理(银行)。

所有上述问题都可以通过引入数字货币(称为比特币)来解决。在深入研究比特币的设计和架构之前,我现在将向您简要介绍比特币的背景。

比特币 - 简史

比特币是由中本聪在 2008 年通过一篇名为《比特币:点对点电子现金系统》的研究式白皮书引入这个世界的。

比特币不仅解决了双重支付问题,还提供了更多优点,这里值得一提的一个优点是交易的匿名性。创建该系统并在该系统上交易了少量代币的中本聪对整个世界来说是完全匿名的。

试想,在这个社交媒体的世界里,当每个人的隐私都受到威胁时,世人至今无法追查谁是中本聪?事实上,我们不知道中本聪是个人还是一群人。谷歌搜索还显示,中本聪持有的比特币价值约 194 亿美元——这笔钱目前在比特币系统中仍然无人认领。那么什么是比特币——让我们来看看吧!

什么是比特币?

正如您之前所看到的,银行维护一个记录每笔交易的分类账。该分类账由银行私人持有和维护。中本聪提议让这个账本公开并由社区维护。

当你公开这样的账本时,你会想到几个考虑因素。该分类账必须是防篡改的,以便任何人都无法修改其条目。由于账本中的每个条目都是公开可见的,我们必须弄清楚如何保持匿名——显然你不希望世界上的每个人都知道我付给你一百万美元。

此外,由于只有一个账本记录世界上的每一笔交易,账本的大小将是另一个值得关注的问题。为这些错综复杂的问题提供解决方案并非易事,这就是我在这里尝试让您用简单的语言理解比特币底层架构的目的。

这个底层架构就是区块链,这就是本教程的内容。要了解区块链架构,您需要了解它所基于的一些关键功能。那么,让我们开始了解 PKI——公钥密码学。

区块链 - 公钥密码学

公钥密码术或简称 PKI 也称为非对称密码术。它使用两对密钥——公钥和私钥。密钥是一个长二进制数。公钥在全球范围内分发,顾名思义是真正公开的。私钥应严格保密,切勿丢失。

就比特币而言,如果您丢失了比特币钱包的私钥,那么您钱包中的全部内容将立即容易被盗,并且在您意识到之前,您所有的钱(钱包中的内容)都会消失得无影无踪。系统中的机制来追踪谁偷了它——这就是我前面提到的系统中的匿名性。

PKI通过加解密机制实现认证和消息保密两大功能。我现在将解释这两个功能 -

验证

当两方交换消息时,在发送者和接收者之间建立信任非常重要。特别是,接收者必须信任消息的来源。回到我们之前的场景(如图 1 所示),Bob 向 Lisa 汇款以从她那里购买一些商品,让我们看看 PKI 如何在 Bob 和 Lisa 之间建立这种信任。看下图 -

验证

首先,如果鲍勃想给丽莎寄一些钱,他必须创建自己的私钥/公钥。请注意,两个密钥始终配对在一起,并且您不能混合不同个人或不同实例的私钥和公钥。

现在,鲍勃说他要向丽莎汇 10 美元。因此,他创建了一条消息(纯文本消息),其中包含 Bob(发送者)的公钥、Lisa(接收者)的公钥以及金额(10 美元)。

消息中还添加了这笔汇款的目的,例如“我想向您购买南瓜”。现在,整个消息已使用 Bob 的私钥进行签名。当Lisa收到这条消息时,她将使用PKI和Bob的公钥的签名验证算法来确保该消息确实源自Bob。PKI 的工作原理超出了本教程的范围。有兴趣的读者可以访问此站点以获取有关 PKI 的更详细讨论。这确定了消息发起者的真实性。现在,让我们看看消息隐私。

消息隐私

现在,丽莎已收到付款,她想发送鲍勃想要购买的电子书的链接。因此,丽莎会创建一条消息并将其发送给鲍勃,如图所示 -

消息隐私

Lisa 创建一条消息,例如“这是您请求的我的电子书的链接”,使用她在 Bob 的请求消息中收到的 Bob 的公钥对其进行签名,并使用在两者之间共享的某个秘密密钥对该消息进行加密HTTPS 握手期间。

现在,Lisa 确信只有 Bob 可以使用 Bob 单独持有的私钥来解码该消息。此外,拦截该消息的人将无法恢复其内容,因为该内容是由仅由鲍勃和爱丽丝持有的密钥加密的。这向丽莎保证,只有鲍勃才能访问她的电子书。

了解了 PKI 所暗示的身份验证和消息隐私这两个功能后,让我们继续看看比特币如何利用 PKI 来保护我在“什么是比特币?”一章中提到的公共分类账。

据您所知 - 最流行的 PKI 算法是RSAECDSA,比特币使用后一种。

区块链 - 哈希

PKI 中最重要的功能之一是哈希函数。哈希函数将任意大小的数据映射为固定大小的数据。比特币使用 SHA-256 哈希函数,生成大小为 256 位(32 字节)的哈希(输出)。如图所示 -

散列

Bob 在向 Lisa 下订单时,创建了一条与上图类似的消息。该消息通过哈希函数进行哈希处理,生成 32 字节哈希值。此哈希值的美妙之处在于,对于所有实际目的,哈希值(256 位数字)对于消息内容而言被认为是唯一的。如果消息被修改,哈希值就会改变。不仅如此,给定哈希值,不可能重建原始消息。

在了解了哈希的重要性之后,让我们继续讨论比特币中的另一个概念:挖矿。

比特币 - 挖矿

当 Bob 为 Lisa 创建购买请求时,他不会将其单独发送给 Lisa。相反,请求消息在他所连接的整个网络上广播。鲍勃的网络如图所示。

矿业

该消息发送到所有连接的节点(机器)。图中的一些节点被标记为矿工。这些机器运行用于挖掘比特币消息的软件。现在我将向您解释这种采矿的含义。

采矿流程

由于整个网络分布广泛,网络中的每个矿工都有望在任何给定时间段收到来自多个供应商的多条消息。矿工所做的是将这些消息组合在一个块中。如图所示 -

采矿流程

形成消息块后,矿工使用前面描述的散列函数在该块上创建散列。现在,正如您所知,如果任何第三方修改了该块的内容,则其哈希值将变得无效。顺便说一句,每条消息都带有时间戳,因此任何人都无法在不影响块的哈希值的情况下修改其时间顺序。因此,块中的消息完全不会被篡改。进一步解释了如何使用这一事实来保护网络中的所有交易。

区块链 - 链接块

各个矿工创建的区块被链接在一起,形成所谓的真正的分布式公共分类账。

链接块

链中的每个块都包含多个消息(交易),如图 8 所示。链中的块可能来自任何矿工。在创建区块链时,我们观察到前一个区块的哈希值被添加到当前区块的规则。

因此,矿工在创建区块时,会获取链中最后一个区块的哈希值,将其与自己的消息集结合起来,并为其新创建的区块创建哈希值。这个新创建的块现在成为链的新末端,因此随着矿工添加越来越多的块,链不断增长。

区块链 - 工作量证明

由于所有交易都带有时间戳,因此我们需要在点对点网络上实现分布式时间戳服务器。这需要一些额外的实现,这就是我现在将描述的工作量证明。对于每个块,我们现在添加一个名为Nonce的项目,如下图所示 -

工作量证明

Nonce 是一个数字,使得块的哈希满足特定的标准。该标准可以是生成的哈希值的前四位数字必须为零。

因此,生成的哈希值将类似于 000010101010xxx。一般来说,矿工从 Nonce 值 0 开始,并不断增加它,直到生成的哈希满足指定的标准。

请注意,哈希生成是随机的,并且超出您的控制范围 - 也就是说,您不能强制哈希函数生成特定的哈希。因此,可能需要多次迭代才能生成具有四个前导零的所需哈希值。比特币系统生成一个区块的预计时间是10分钟。一旦矿工成功开采该区块,他就会将其释放到系统中,使其成为链中的最后一个区块。

请注意,有多个矿工竞争生成合法区块。比特币系统通过给予第一个成功的矿工一定的比特币来奖励他。一般来说,拥有更多算力的矿工可能是早期的赢家。这可能会导致拥有巨大处理能力的人对整个系统进行攻击。我将在本教程的最后描述这些攻击以及如何缓解这些攻击。

区块链 - 网络与挖矿

我现在总结一下上述步骤;这就是网络中发生的情况 -

  • 任何想要从在网络上做广告的第三方获得服务的人首先创建一个交易(向所需接收者发送消息)。

  • 在给定的时间段内,可能有许多发送者(买家)和接收者(卖家)创建此类交易。

  • 所有交易都在网络上广播到所有节点。请注意,给定的事务不一定必须到达网络中的每个其他节点。

  • 每个节点将新交易组装成一个块。请注意,每个块中的交易集合独立于其他块创建的块中的交易集合,并且自然会与其他块中的交易集合不同。这并不重要;系统确保网络上广播的每笔交易都在合理的时间内包含在某个区块中。一般来说,发送者会通过向矿工提供一定数量的比特币来激励节点。矿工可能会选择优先考虑那些具有更高激励措施的区块。

  • 该节点现在致力于为其组装的区块寻找工作量证明。

  • 当节点找到工作量证明时,它会在网络上广播组装好的区块。

  • 接收新区块的节点只有在验证该区块中的所有交易均有效并且尚未花费后才会接受它。

  • 如果该块被接受为有效,则正在处理自己的新块的节点将必须重新组装其块中的交易,以确保交易不会重复。该节点现在致力于在其新创建的块上查找工作量证明;这样做时,它将把接受块的哈希值作为前一个哈希值。

  • 同样,区块链将永远持续增长。

现在,我们已经了解了整个系统的工作原理,让我描述一些副作用以及如何解决它们。

区块链——对矿工的激励

正如我们在比特币 - 挖矿一章中看到的那样,矿工在任何给定时间段都可能被大量交易淹没。区块的最大大小是在系统中预先定义的,因此区块中只能包含一定数量的交易。

区块中的交易数量由预定义的区块大小和每个区块的平均长度决定。这里的一个重要提示是,发送者不应在其消息中包含太多信息,以免使其简短,从而激励矿工在其他冗长的消息之前接受它。

发送者通常还会根据一定数量的比特币添加交易费用,以激励矿工尽早纳入其区块。

构建区块链的另一个后果是它的规模。在一段时间内,整个区块链可能会变得太大,以至于节点无法将其存储在其磁盘上。这是通过使用下面描述的默克尔树来解决的。

区块链-默克尔树

节点中的磁盘空间问题很容易克服,因为块中的所有交易都在 Merkle 树中进行哈希处理,如图所示 -

默克尔树

块头现在包含前一个块的哈希值、Nonce 以及Merkle 树中当前块中所有交易的根哈希值。由于该根哈希包括块内所有交易的哈希,因此可以修剪这些交易以节省磁盘空间。所以现在你的区块链将如下图所示 -

根哈希

这可以节省大量磁盘空间。此策略适用于只想接收他人付款的普通客户。然而,矿工需要保存完整的区块链。现在的问题是,接收方如何在无法追踪收到的代币来源的情况下验证付款。接下来对此进行解释。

区块链-支付验证

考虑这样一种情况,作为供应商,您可能希望验证过去支付的特定付款。由于您计算机上持有的区块链仅包含如上图所示的块头,因此您正在搜索的交易在区块链副本中丢失。

现在,您可以在区块链副本中向后搜索,直到找到带有所需交易时间戳的块。现在,请求所选块的 Merkle 树,您将获得您正在查找的交易。如下图所示 -

付款验证

在这里,我们假设您正在寻找 Tx103。虽然您可能看不到 Tx103 的内容,但您知道它已被它所属的块以及链中的所有后续块接受。因此,您可以放心地信任此交易并继续您的业务。

区块链 - 解决冲突

正如我们所见,比特币网络包含多个矿工。两个不同的矿工有可能同时解决工作量证明,从而将他们的区块添加到链中最后一个已知的区块中。如下图所示 -

解决冲突

现在,我们在区块 3 之后有两个分支。这两个分支都是有效的。因此,下一个开采的区块可能会添加到任一分支中。假设矿工将新开采的区块添加到区块104-A,则包含区块104-A的分支将比包含区块104-B的分支更长。如下图所示 -

比特币架构

在比特币架构中,最长的分支总是获胜,较短的分支被清除。因此 104-B 区必须进行净化。在清除该块之前,该块中的所有交易都将返回到交易池中,以便它们被挖掘并添加到未来的某个块中。这就是解决冲突的方式,系统只维护一个区块链。

区块链 - 隐私

由于记录所有比特币交易的账本真正公开,隐私受到威胁。世界上任何人都能够知道谁付钱给谁?传统的银行系统能够通过对其记录保密来维护这种隐私。

比特币系统中的隐私是通过不同的策略实现的。请注意,我们说过比特币的发送者需要知道向谁付款。因此,他要求提供他想要付款的供应商的公钥。该公钥可以是匿名的。

从某种意义上说,作为某些服务的供应商,当有人询问您将付款发送到哪里时,您只需向他发送您的公钥即可。该公钥与您的关联不会记录在分类账中的任何位置。这样,交易之外的任何人都只会知道交易了多少钱以及钱支付到哪个公钥。

为了实现更高程度的隐私,对于每笔交易,您都可以为每笔交易生成一个新的私钥/公钥,以便第三方无法将您进行的多笔交易分组在一起。对于局外人来说,这仅仅意味着进行了多次较小价值的交易,并且它们永远不会链接到共同的来源。

最后,任何基于互联网的在线系统都容易受到滥用。我现在将描述对比特币系统的几种可能的攻击类型以及如何缓解这些攻击。

比特币 - 减轻攻击

我将讨论比特币系统中三种不同类型的可能攻击 -

种族攻击

作为攻击者,您可能会使用两台不同的机器快速连续地将同一个硬币发送给不同的供应商。如果供应商在发货前不等待区块确认,他们很快就会意识到交易在挖矿过程中被拒绝。针对这种攻击的解决方案是,供应商必须等待至少一个区块确认才能发出货物。

芬尼攻击

在这种情况下,攻击者就是矿工。矿工用他的交易开采一个区块,并且不会将其释放到系统中。他现在在第二笔交易中使用相同的硬币,然后释放预开采的区块。显然,第二笔交易最终会被其他矿工拒绝,但这需要一些时间。为了降低这种风险,卖方在放货之前应等待至少六个区块确认。

51% 攻击

在这种攻击中,我们提出了一个不切实际的假设,即某人拥有网络 51% 的计算能力。在这种攻击中,攻击者会挖掘一个私有区块链,并在其中双倍花费硬币。

由于他拥有大部分计算能力,因此可以保证他的私有区块链在某个时间点将比“诚实”网络的链更长。然后,他在系统中释放他的私有区块链,使之前记录在诚实区块链中的所有交易都无效。

这种攻击是虚构的,因为获取等于或超过全网算力51%的算力是非常昂贵的。

区块链 - 结论

在这个简短的教程中,我们以比特币作为案例研究,向您介绍了区块链的几个概念。比特币是区块链的第一个成功实施。如今,世界已经在多个行业中发现了区块链技术的应用,这些行业需要无需中心化机构参与的信任。欢迎来到区块链世界。

进一步阅读 -