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