区块链的三大底层技术及基础部件和架构设计
不少投资机构都瞄准了区块链。今年,就连人工智能也没有区块链那么受欢迎。所以大家应该擦亮眼睛看看区块链的这个计划是否可靠,是否只是想出丑,或者是否真的有可能。
最底层的三项技术
谈起区块链,最好先抛开不同货币的价格。你知道价格。贵与便宜是人类无法控制的。但基于区块链技术的项目可以实现真正的可持续发展。因此,了解区块链的技术比炒币更好。
“区块链”三个字并不能解释这项技术的一切。如果一定要用一个完全表达它的名字,我想应该是“点对点加密不可篡改数据库”。
不是数据库(如MySQL、MongoDB)也不是数据库类型(如SQL、NoSQL),而是提升数据库技术本身的数据库架构,考虑数据如何保证可靠性以及如何防范数据库服务从离线。因此,它不能与具有通用名称的数据库进行比较。您还可以在特定的 区块链 实施期间使用其他数据库来存储和检索数据。
加密数据连接
在我们日常的数据库中,无论是关系型还是非关系型,我们的各种记录之间都可能存在联系,但对于区块链来说,需要的是一条数据。存在与另一个数据的连接。即使实际业务逻辑中没有任何关系,但它始终存在于链上,离开链就无法存在。从一个数据到另一数据总是有一条路径。如果您不相信我,请继续阅读。
“区块”代表了区块链数据连接的终极呈现。一条记录,无论它是什么信息,最终都会出现在一个块(或其检索信息)中。块之间的数据连接是“链表”。会编程的人都知道什么是链表,就是最后一个数据有一个索引键,指向前面的数据。因此,区块链的任何两条数据最终总是可以通过这些索引键链接起来,数据无法逃脱这个逻辑。
但是“区块链”三个字并不能说明这样的数据结构和普通数据库结构的区别,因为上面介绍的链表数据结构只要你愿意,都可以用普通数据库来建立。
真正的价值在于,区块链利用了密码学的原理和现有的加密技术,对索引连接进行了层层加密,所以在保存的数据中,这些索引键不是那么明显,但却是需要的。通过各种计算。例如,当一个区块保存一堆交易信息时,它使用默克尔树来保存。父节点是两个子节点双重哈希的结果,merkle算法保证交易信息不可修改。
这里我们不需要知道加密的具体用途。我们需要了解的是,区块链充满了加密,这是一个重要的特征。
数据无法被操纵
区块链的数据无法被操纵,每个人都这么说。但实际上数据是可以修改的。它只是意味着更改后它会识别它,并且更改数据所在块之后的所有块都将失效。区块链网络具有同步逻辑。整个区块链网络始终维护所有节点使用的最长链。修改完成后,网络同步时修改的东西会被覆盖。这是无法改变的一方面。
更有趣的是,区块链通过加密控制确保对数据的访问需要严格控制,而这些控制几乎不可伪造,难以操纵。加密并不意味着不可篡改,而是可以通过加密与经济原理的结合来实现。还带有一点玄学的味道。纯粹在技术上实现的东西必须有理论来支撑。但是它就是这样啊。这就是传说中的挖矿。
挖矿过程实际上就是矿工努力创建区块的过程。如果该矿已经被开采,则意味着该矿工有资格创建新的区块。您如何看待挖矿?通过一系列复杂的加密算法,从0到无穷大,我们找到与难度相匹配的哈希值。获得这个价值就意味着挖矿。这个算法过程被称为“共识机制”,它是定义记账权的一种形式。共识机制有很多种。区块链最适合使用哪种共识机制,完全取决于区块链的实际目标和经济原则。选择。
挖矿完毕,我们以比特币为例。然后矿工需要将广播到网络的交易打包到这个区块中。交易是否合法?发起交易的人是否伪造了交易?为了保证一笔交易的合法性,必须从之前已有的区块中找到交易来源的真实性。如何验证交易的真实性?交易源的 Merkle 根提取存储在前一个块中。只要找到交易所在的区块并进行签名检查,就可以判断交易是否合法。通过不断加密区块中的所有交易来获得merkle root hash。因此,只要交易是假的,你就不会得到merkle root hash。在这里,加密也有助于实现数据可靠性。
除了这些,加密在区块链身上无处不在。这些加密规则和算法让区块链一切都遵循一种模式,所以操纵数据的成本极高,所以参与的人对操纵数据不感兴趣,甚至害怕。 。形而上学又来了。
点对点网络让数据永不下线
如果区块链没有p2p网络,按照前面的描述,有加密系统,有链特性,然后在某个(组)上运行) 。但发明者想玩更大的游戏。加密系统使数据不可变。但如果我只是扔一颗核弹,炸毁你的机房,那不是不能操纵,而是完了。
为了防止机房被核弹炸毁,发明者在区块链设计了一个点对点网络(客户端与客户端直接通信,无需经过特定服务器)。简单来说,在这个点对点的网络中,每个人的电脑都存储着相同的数据结构(实际上是一个完整的“块”和“链”)。它们通过网络连接并同步。当矿工创建一个新块时,其他人会将该块与他们维护的数据结构同步。因此,无论网络中的哪个节点被炸,其他节点都还活着,新朋友可以将这些节点的数据同步到自己的电脑上。如果你想让区块链的数据消失,那就炸毁地球。
这种与点对点网络的连接称为“去中心化”。只要网络上有一个节点存在,区块链的数据就不会消失。
更让政客们害怕的是,节点的用户可以随意查看这些保存的数据,没关系,完全向公众开放。由于节点用户已经同步了数据,所以他可以随心所欲地使用。这是您的数据,您可以根据需要使用它。试想一下,有一天淘宝说我要把自己的数据放到区块链...我不忍心看...
基本技术概念
上面只是解释了为什么区块链是区块链。这一部分要讲的是,现在区块链就在大家面前,我们需要分析一下区块链所使用的具体技术点或者架构。
块
块已经讨论过了。那么到底什么是块呢?块是区块链的主要数据存储结构。一个区块由两部分组成:区块头和区块体。区块头是区块的最高点。
区块链的区块结构示意图(注:缺少版本信息)
对于区块来说,这是一种特殊的数据结构。区块头包含一些固定的信息:版本(客户端版本,每次更新客户端软件这个信息都会不同)、区块高度(实际上表示它在链上的哪个区块)、区块哈希(区块的哈希值)挖矿得到的)、前一个区块的区块摘要(该字段是关键点的重点,是创建链表结构的关键)、时间戳(区块创建时间)、难度和Nonce(这两个字段是相关的)到挖矿,后面讲挖矿的时候会详细讨论)、merkle root(区块体merkle root的哈希值,merkle树后面会简单介绍,详细内容会在更多文章))。除了这些字段之外,如果您创建自己的 区块链,还可以向块头添加其他信息。
块体是存储特定内容的地方。在比特币中,区块的核心存储一段时间的交易信息。在其他区块中,这里不一定保存交易信息,但可以保存其他信息。简而言之,块体存储了该块用于什么业务的具体业务信息。
在一些区块链实现中,区块可能有区块预览,用于在区块创建后保存某些信息。该信息可以在创建块头和块体后添加。示例包括块长度、容量和其他信息。
这是一个区块。块头的前一个哈希字段存储前一个块的哈希值。因此,通过这个区块,你就知道哪个区块是前一个区块,前一个区块又可以知道前一个区块,直到整个链可以追溯到第一个区块。他就是区块链。
区块如何形成链的示意图
与上图类似,下一个区块总是指向前一个区块。一旦创建了一个块并且后续块指向它,就无法对其进行修改,因为修改后必须重新计算所有哈希值。但我们知道,哈希算法的特点是,如果想要得到哈希值,就需要用原来的内容再次进行哈希算法。因此,如果给定的内容与原始内容不同,您将无法获得哈希值。因此,某个区块链在中间修改得到的哈希不能被后面的区块所指向,区块链就被破解了。当损坏的区块链加入网络时,他要么无法被其他节点识别并且不被视为合法节点,要么他必须重新同步并将网络最长的链复制到本地计算机以覆盖原始链。 。链。
但是你可能有两个疑问:1.这个blockHash不是内容的hash。如何保证区块链中的信息不被修改?如果我不改blockHash,只改内容,不就可以隐藏了吗? 2、如果两个块同时指向一个块,但是两个块的块体不同怎么办?
第一个问题,我们需要通过挖矿和merkle树的结合来理解这个原理。第二个问题,其实这种情况很常见。挖矿成功的概率实际上是100%。关键在于哪个矿工先挖矿。通常,当矿工挖矿时,会向全网广播。其他发现没有矿石的矿工停止。但由于网络延迟等情况,短时间内可能会有多个矿工同时挖矿。他们都创建新的区块并在网络上广播它们。这种情况称为“分叉”。
如果发生分支,有两种方法。但这是让自然在没有人为干预的情况下顺其自然。后来开采新区块的矿工自己决定将哪个分支的最后一个区块用作前一个区块。如果在相对较短的区块数量内,一条链明显长于另一条链,那么较长的链将被保留,较短的链将被丢弃,矿工们会白白地挖掘短链的工作。同步时,各网络节点选择当前最长的同步链。后来的矿工在创建新区块时也会选择最长的链。
但是还有另一种情况,就是短链的矿工不肯放弃,或者两条链短时间内无法分出胜负,最终每条链后面都跟着很多块。您不能拥有两个帐户进行团体转账。如果最终发现两个帐户不同,就会出现问题。因此,当这种情况发生时,矿工们决定分头行动。换句话说,一个区块链变成了两条链,其中一条复制了之前所有的链,成为一条独立的链。从此,两条链条不再相连。尽管前面的区块完全相同,但后面的区块井里的水不会干扰河里的水。这种情况被称为“硬分叉”,这就是比特币现金的诞生。新生成的链继承了之前的区块,但接下来的区块完全由开采这条链的矿工决定。硬分叉的好处是,对于原来的用户来说,一份资产会突然变成两份?
至于区块体,确实是根据区块链应用的业务需求来设计的。例如,比特币被设计为交易模型。区块链的所有交易记录都被汇总起来,这是一笔长账。每分钱的来龙去脉都写得清清楚楚。如果红十字会利用区块链来捐款的话,就不会这么大惊小怪了。但其他应用不一定是交易模型,例如用来记录医疗信息、用来记录用户的位置……所以,至于区块链技术本身,我们先到此为止,然后再谈谈比特币。独特的技术。
挖矿与共识机制
挖矿我已经讲过很多次了。简单来说,挖矿就是一群矿工争夺创建新区块的权利的过程。在加密货币的世界中,如果你抓住了这个权利,你就可以在区块的开头为自己添加一笔交易。交易的钱是凭空获得的,所以也被称为“挖矿奖励”。 ,而且金额相当大,所以矿工们都争先恐后地抢占这个记账权。但在其他非货币应用中,如果没有这样的奖励,怎么能挖矿呢?这对于区块链来说也是一个神秘而神秘的话题,至今仍然没有答案。
那么挖矿的技术算法流程是怎样的呢?
矿机在程序中规定了如何获取哈希值,这个规定称为共识机制。每个矿工根据这个共识机制执行一定的算法,看谁先得到一个合格的结果,并且可以很容易地检查这个结果是否满足条件(通过检查是否满足共识机制)。不同的区块链有不同的共识机制。目前比较知名的有PoW和PoS,以及由这两者衍生的其他共识机制。
为了清楚地解释挖矿过程,我们仅使用PoW,然后使用比特币进行演示。
SHA256(SHA256(version + prevHash + merkleRoot + time + currentDifficulty + nonce )) 矿工执行上面的公式。只要满足上述公式(执行结果为真),就会被挖矿。现在我们将解释这个公式。
- 矿机执行双sha256操作。操作参数实际上就是区块头中的所有信息。然而,由于该块尚未创建,因此该信息被暂时保存。如果您保留记账权,该信息将被记录。因此,区块哈希不需要记录在区块头中,因为它是可以计算的。版本
- 是当前运行矿机的客户端软件版本。每次版本更新时,部分参数可能会发生变化。这会产生效果,例如区块大小从 1M 扩大到 2M,但对于挖矿算法而言保持不变
- prevHash 是前一个区块的哈希值
- merkleRoot 是暂时存储在内存中的交易 关于当前矿机A通过Merkle算法得到的根哈希,Merkle下面讲一下。
- time 是当前时间戳
- currentDifficulty 是当前难度。当前的难度是通过公式计算出来的。这个公式是
currentDifficulty = diff_1_target/ TARGET
这个公式中的 diff_1_target 可以认为是一个常数,在比特币客户端中不变,其值为 0x1d00ffff。当然,它确实可以改变,但是无论它如何改变,它的值始终是相同的,所以我们仍然将它视为一个常量。下面我们就来说说TARGET。 - nonce是一个正整数,nonce的值就是矿工要寻找的值。当矿工开始执行double sha256算法时,nonce值为0。如果执行一次后不满足上式,则nonce加1并再次执行算法。如果公式不行,继续加1,再重复一遍,就可以了。添加直到找到与上面公式匹配的随机数,然后您就会找到一个地雷。因此,每次您选择我的时,这个随机数都可能不同。它的出现完全是随机的。那是什么完全取决于运气。不过没关系,如果你看每个区块中的nonce值,你就会知道矿工进行了多少次操作,也就会知道这个矿井挖矿的难度有多大。
- TARGET 是比较的目标值。这是一个特定的值。比特币的发明者希望在 10 分钟内生成一个区块,所以 TARGET 最初设计的目的是让 currentDifficulty 达到正确的值,以保证 10 分钟。一个街区。但实际情况并不能保证10分钟内出块。如果计算能力降低,时间就会增加。然后调整难度,将出块时间尽可能重置为10分钟左右。因此,TARGET在2016年每个区块(每两周)改变一次。如果实际情况是2016个区块的生成时间超过2周,那么TARGET就会相应增加,降低当前的难度。接下来的2016年区块难度将会降低。反之,则增加难度。这个调整算法本文不做详细介绍。因此,TARGET是2016年不变的一个值,但总体上发生了变化。区块生成时间的目标是 10 分钟左右。
这被认为是比特币挖矿。矿工们每天都会看着他们的机器,重复这个公式并日复一日、年复一年地赚钱。
当矿工找到随机数时,他就获得了记账权,并且可以检索内存中的交易信息并将其包装在块体中。 merkle root是通过交易记录计算出来的,因此矿工在打包过程中不可能做任何事情。一旦伪造交易,区块链中封装的交易将无法获得挖矿所用的merkle root。 ,不可能获得挖矿时发现的hash。
当然,其实比特币挖矿的问题可能比较多,比如nonce溢出,矿池……
Merkle Tree
我已经提到过很多次Merkle了,它到底是什么?默克尔树是一种数据结构。在比特币中,这是一棵二叉树,即每个父节点有两个子节点。我之前写过一篇文章《区块链如何运用merkle tree验证交易真实性》,详细介绍了 Merkle Tree 的一些原理和问题。这里的重点是做一个科普,我就不深究了。
区块头中的 Merkle 根从何而来?这是通过对区块主干中的记录执行 Merkle 算法获得的。以比特币为例,一个区块包含n笔交易。我们将这些交易分为两组并得到 n/2 组。如果有奇数,则复制最后一笔交易的副本来替换该数字。首先对每笔交易的哈希值进行哈希处理,这样就得到了 n 个哈希值,然后对每个哈希组进行双重哈希:
parentHash = sha256(sha256( hash1 + hash2 ))
也就是说,该组是两个哈希值连接并计算新的哈希值。这个新的哈希值是这两个哈希值的父节点。获取到所有组的父节点后,按照相同的逻辑获取父节点,依此类推,最终得到一个根节点,即 Merkle 根。
Merkle算法大致是这样的,但不限于区块链领域。它可以用在任何其他控制领域,这里提到的算法不一定要得到两者之一,而是可以是其中之一。该算法简称merkle,是一种对多条记录进行操作以获得根提取的算法。
可以想象,对算法中涉及的任何交易进行微小的更改都会导致不同的merkle root,因此只需要在块中保存merkle root。这就是密码学的力量。
区块链擅长什么,不擅长什么?
区块链的数据有两大特点:1.公开透明,任何节点都有完整的权利查看数据; 2. 难以伪造或操纵。因此,区块链非常适合两类场景:1.证据;2.证据。 2、监督。如果有关区块链的信息在法律上是可以接受的,那么侵权方在提供有关区块链的证据时就无法为自己辩护。试想一下,如果税收全部转移到区块链身上,那么全体公民征收的税收最终用在哪里就一目了然了。这可能是一些人感到害怕的一点。
但区块链有两大缺点:1.需要挖矿,存在分支风险。换句话说,归属于区块链的数据需要很长时间才能成为无法更改的可靠数据。 2、分块时,数据被分割存储,导致查询出现巨大问题,极大影响效率。因此,区块链 不适合即时性要求较高的场景,无论是信息交换的即时性(如聊天)还是查询的即时性(如搜索引擎)。
区块链不是万能的。对于某些服务来说,中心化的模式显然更高效、更便宜,但为了普及他们却坚持要像区块链那样。就看韭菜是否长在一起了。另一个担忧是,由于有关区块链的信息公开透明且无法删除,这会对个人数据的保护造成很大危害。试想一下,如果那个修理关西电脑的人通过区块链的网络介绍自己。照片发现...受影响的人受到的伤害...即使人死后也不会消失...
区块链应用程序
随着趋势的出现,区块链应用程序纷纷出现。但目前相对成熟的模式只有三种:1.比特币;2.比特币。 2.以太坊智能合约; 3.比特股。剩下的就不多说了,读者自己去体会吧。
一个区块链应用程序,它的架构是什么?除了区块链之外,还需要哪些技术来支持呢?
区块链应用架构图(邵琪峰等人《区块链技术:架构及进展》)
比特币、以太坊等区块链应用与区块链本人的关联度比较高,这意味着区块链作为数据库不能成为应用相对独立的。 module A与我们现在流行的B/S架构略有不同。在区块链应用程序中,区块链被拆解并与应用程序的其他层集成,最终实现应用程序的整体功能。
以比特币为例,谈谈区块链应用程序如何拥有比区块链本人更多的部分。比特币是一个基于区块链的计费系统。除了区块链之外,这还包括: 1. 交易模式; 2、身份认证系统(类似PKI); 3.智能合约。
交易模型
交易模型是存储在区块链中的交易记录。比特币任何货币的来龙去脉之所以清晰,是因为它依赖于交易模型。在我们的现实中,银行帐号只能告诉您当前帐户中有多少钱、过去花了多少钱、赚了多少钱以及还欠多少钱。但它并没有告诉你“你花的一定数额的钱来自你一定数额的收入”。但比特币不得不说这个逻辑。一笔交易由两部分组成:“输入”和“输出”。例如,如果您想转账 10 BTC,您的账户必须有一个或多个 10 BTC 或更多金额的“输入”,而输出则是您想要将 10 BTC 转账给谁。但有一种情况,当总“投入”金额达到10.5 BTC时该怎么办,就像你有100块钱的毛泽东,你花70块钱买东西,那么你“需要换”。因此,有时“输出”之一会转移到自身,这就是“变化”。
一笔比特币交易的输入输出示意图
其实输出在另一笔交易中,是这笔新交易的输入。
在区块链中,这些交易记录,以及输入输出数据,都是按照现实记录的。此外,还必须进行merkle计算,并将merkle根存储在区块头中。
身份认证系统
既然是交易,就必须包含交易双方的身份。比特币交易的每一端都有两个账户。它并不关心是谁,而是使用密码算法来确保是哪个账户发起交易,并且发起交易的人必须对交易信息进行签名。
您可能听说过非对称加密、公钥和私钥。比特币账户最关键的就是私钥。一旦您丢失私钥,您将无法证明您是该账户的所有者,也无法对该账户的转账进行签名操作。您不能再在此帐户上花钱。硬币,也丢了硬币。
那么签约流程是怎样的呢?我如何证明我发送了这笔交易?我怎样才能证明钱已经转给我了?
密钥、地址和钱包
密钥 通常指保护比特币资产的所有者用户对应的私钥。在某些情况下,私钥和公钥被含糊地统称为密钥。这里我们使用狭义的私钥解释。
地址大多数情况下,比特币支付地址指的是公钥的嵌入(有时除了公钥之外还有脚本)。
钱包 存储私钥的比特币客户端软件,通常以有序文件或简单数据库的形式实现。比特币钱包包含私钥和公钥数据,尽管理论上不需要存储公钥数据。
一般情况下,用户的公钥和比特币地址被认为是相同的,但实际上并非如此。比特币地址是一串比公钥短得多的字符,主要是为了方便输入。公钥用于各种非对称加密。
比特币地址的比特币公钥
公钥和地址在比特币网络中公开,只有私钥由用户自己保存,不能提供给任何人。当一笔交易发起时,交易的发起者用自己的“自己的私钥”和“接收者的公钥”对交易进行签名。然后,网络的其余部分可以使用发起者的公钥来验证交易是否是由他发起的。是的,接收者必须提供自己的私钥进行解密操作,以证明交易确实发送给他们。比特币客户端(钱包)负责加密、解密和签名。
智能合约
比特币本身已经具备了智能合约的雏形,但其使用的编程语言脚本能力比较弱,能够实现的合约逻辑并不复杂。在此基础上,以太坊扩展了链上的智能合约部分,大大提高了智能合约的编程能力。
在前述的输入和输出中,输出实际上是作为另一笔新交易的输入。比特币输出不仅仅是告诉系统要转移多少钱到哪个地址,输出实际上是一个比特币脚本。该脚本还经过了复杂的非对称加密。要运行此脚本并发行货币并使用此货币作为您自己的交易的输入,您必须首先使用您自己的私钥对脚本进行解码,然后运行该脚本。运行后,你可以用这笔钱作为你自己交易的输入。结合之前的知识,只有相应的私钥才能解密。因此,只有匹配输出记录对应的比特币地址的用户才能对脚本进行逆向工程并获得资金。
这个过程中,“剧本”是关键。除了上面最简单的传输逻辑外,还可以通过一些条件判断来实现稍微复杂的编程。例如,只有满足某些条件,解码脚本才能运行。因此,基于这样的设计,可以利用比特币的脚本系统来实现多重签名、担保合约等功能,这就是智能合约的雏形。
结论
我刚刚开始研究区块链。一定有很多东西我不完全理解,有些地方有误解。但对于想了解这个领域的朋友,希望你先了解一下区块链背后的技术原理(没必要把技术细节看透),看一些比较成熟、正宗的资料(无意中发现前人已经网络上出现了《计算机学报》类似评论的文章,读者可以阅读文字《区块链技术:架构及进展》),而不是相信自己听到的。
作者:付子哥
链接:https://juejin.im/post/5aa1f997518825558251f00b
来源:掘金。商业转载请联系作者获得许可。非商业转载请注明来源。
版权声明
本文仅代表作者观点,不代表Code前端网立场。
本文系作者Code前端网发表,如需转载,请注明页面地址。
发表评论:
◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。