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