区块链

2008年由中本聪第一次提出了区块链的概念,在随后的几年中区块链成为了电子货币比特币的核心组成部分,被用作所有交易的公共账簿。通过利用点对点网络和分布式时间戳服务器,区块链数据库能够进行自主管理。区块链成为第一个解决重复消费问题的数字货币。区块链是比特币的底层技术和基础架构。区块链本质上是一个去中心化的数据库。狭义来讲,区块链是一种按照时间顺序将数据区块以顺序相连的方式组合成的一种链式数据结构, 并以密码学方式保证的不可篡改和不可伪造的分布式账本。一句话概括,如果互联网技术解决的是通讯问题的话,区块链技术解决的是信任问题。区块链技术因为是跑在一个完全P2P的网络里的,完全不知道运行在网络里的哪里,拥有绝佳的保密性和安全性。

 

区块链(blockchain)技术是维护一个不断增长的数据记录的分布式数据库,这些数据通过密码学的技术和之前被写入的所有数据关联,使得第三方甚至是节点的拥有者难以篡改。区块(block)包含有数据库中实际需要保存的数据,这些数据通过区块组织起来被写入数据库。链(chain)通常指的是利用Merkle tree等方式来校验当前所有区块是否被修改。以比特币的区块链为例,你可以把区块链想象成一个比特币的公共账本,这个账本:1.存放在互联网的各个比特币节点上,每个节点都有一份完整的备份2.里面记录着自比特币诞生以来的所有比特币转账交易3.账本是分区块存储的,每一块包含一部分交易记录。每一个区块都会记录着前一区块的id,形成一个链状结构,因而称为区块链4.当你要发起一笔比特币交易的时候只需把交易信息广播到p2p网络中,矿工把你的交易信息记录成一个新的区块连到区块链上,交易就完成了。

区块链的进化方式

▪ 区块链1.0——数字货币

▪ 区块链2.0——数字资产与智能合约

▪ 区块链3.0——DAO、DAC(区块链自洽组织、区块链自洽公司)-->区块链大社会(科学,医疗,教育etc,区块链+人工智能)。

理解区块链

      区块链的理念:将一个基于节点的去中心化共识协议与工作量证明(PoW)机制结合在一起。节点通过PoW机制获得参与到系统的权利,每隔一段时间将交易打包到区块中,从而创建出不断增长的区块链。

      如何去中心化:区块链系统中的每一个区块,负责记录交易信息,每个用户的收支情况都被永久的存储在区块中供他人查询。每个节点都会保存一份完整的交易数据,所有这些节点组成了区块链的分布式数据库系统,任何一个节点的数据出现问题,都不会影响整个系统的运转。

      工作量证明机制:工作量证明(PoW),简单理解就是一份证明,用来确认你在系统中做过一定量的工作。相较于低效的监测工作的整个过程,通过对工作结果进行认证来证明完成了相应的工作量,则是一种非常高效的方式。而这种"工作证明"一般都会花费一定的时间才能得到。

工作量证明机制(PoW)

 工作量证明机制,是一种应对拒绝服务攻击(DoS)和其他服务滥用的经济对策。它要求发起者进行一定量的运算作为代价,也就意味着需要消耗计算机一定的时间。哈希现金(HashCash) 类似于验证码(CAPTCHA),其原理是在邮件的消息头中增加一个包含收件人地址、发送时间和盐随机数的hashcash stamp的散列值,但是满足前20位都是0的散列值才是合法的。这就需要发送者在正式发送前需要通过调整盐的值进行多次计算,在满足该条件后才能成功发送。但是我们不希望发送者在算出这个stamp后继续复用,所以HashCash规定了过期的stamp是非法的(即发送时间 > stamp时间)。区块链也是采用了类似hashcash的工作量证明方法,对区块头中的数据做双重SHA256运算( 即SHA256(SHA256(HEADER)) ),与当前网络的目标值做对比,如果小于目标值,则完成工作量证明。

在比特币系统中,节点完成工作量证明后,就代表获得这个区块的交易记账权。系统会通过PoW机制让矿工们竞争记账权,谁在单位时间内执行的运算更多,谁就有更高的概率获得区块的记账权。获得记账权的矿工将把该区块广播到网络中,全网其他节点在验证区块满足特定的条件后,其区块会被链接在主链上,从而在全网范围内形成对当前网络状态的一次共识,该矿工也会得到系统奖励的一定数量的代币。所有的区块通过这种形式链接在一起,形成了区块链的主链,从创世区块到当前生成的最新区块,所有历史交易数据都是公开透明的。区块是用于记录交易信息的,区块头中的数据参与了PoW的过程。

区块链系统

一般说来,区块链系统由数据层、网络层、共识层、激励层、合约层和应用层组成。 其中,数据层封装了底层数据区块以及相关的数据加密和时间戳等技术;网络层则包括分布式组网机制、数据传播机制和数据验证机制等;共识层主要封装网络节点的各类共识算法;激励层将经济因素集成到区块链技术体系中来,主要包括经济激励的发行机制和分配机制等;合约层主要封装各类脚本、算法和智能合约,是区块链可编程特性的基础;应用层则封装了区块链的各种应用场景和案例。该模型中,基于时间戳的链式区块结构、分布式节点的共识机制、基于共识算力的经济激励和灵活可编程的智能合约是区块链技术最具代表性的创新点

区块的组成

每个区块由区块头和区块体两部分组成。区块头中主要包含前一个区块的Hash地址(Prevhash)、时间戳(Timestamp)、随机数(Nonce)、当前区块的目标Hash值(CurrentTarget)。Merkle树的根值(Merkle Root)等信息;区块体中则包含了具体的交易数量(TX NUM)和自上一个区块生成以来发生的所有交易的列表。这个交易列表就是记账本,每一笔交易都会被永久地记入区块中,任何人都可以查询。而且交易都会伴随数字签名,确保交易不可篡改及真实有效性,所有交易都将通过Merkle树的Hash运算产生一个唯一的Merkle根值记录到区块头中。

状态转移与UTXO交易模式

      从技术的角度出发,比特币记账本可以看做是一个状态转移的系统。持有人对现存的所有比特币的持有情况,可以理解为系统当前的一种状态。

      可以发现,交易的过程就是一个从输入到输出的过程,一个资金流转的过程,并且创世区块和后来挖矿产生的奖励区块不适用于这个公式(创世区块是整个链上的第一个区块;挖矿的奖励区块是凭空产生的,是发行代币的方式)。除此之外,其他的交易都必须要依据现有的输入来产生新的输出。而现有的输入必然是从这个持有人在上一笔交易中的输出得到的。假如小王要给小李再转5个比特币,这笔交易的输入(5个币)必须是上一笔交易(小明给小王转账)中未被使用的输出(20个币)。这个未被使用的交易输出也叫做UTXO(Unspent TX Output),是比特币交易的基本单位。也可以简单理解为空闲的、未被占用的金额,就像已经花出去的钱(你上一笔交易的UTXO)是不可能再花一遍的(已成为别人的UTXO)。一笔交易可以包括一个或多个输入和一个或多个输出,每个输入包含一个对现有UTXO的引用和与持有者私钥创建的密码学签名;每个输出包含一个新的加入到状态中的UTXO。

对于交易中的每个输入和状态,有如下的定义:

1.如果引用的UTXO不在当前的状态中,则会返回错误;如果签名与引用的UTXO的持有者签名不一致,也会返回错误。

2.如果所有输入的UTXO总额与所有输出的UTXO总额不等,会返回错误。

3.返回的新状态NEW_STATE中,移除了所有输入的UTXO,增加了所有输出的UTXO。

Merkle

      Merkle树是数据结构中的一种树结构,可以是二叉树,也可以是多叉树,具有树的所有特点。由于Merkle树中会进行Hash运算,所以也被称为Hash树。在了解Merkle树之前,先来看看Hash算法及HashList。

      Hash算法是一种可以将任意长度的数据转换成固定长度字符串的算法。是一种安全散列算法。最显著的特点是几乎不可逆、无冲突。Hash算法最常见的应用就是对数据完整性的校验。例如我们在下载一些文件时,资源提供方会给出一个MD5或者SHA的值,这个值实际上就是资源在经过Hash运算后的值,用户下载数据后,可以对数据进行Hash,然后跟这个值比对,如果相同,就说明数据在传输过程中无损坏或篡改。

 

      缺点:当下载较大的文件时,如果出现Hash值不匹配的情况,那么就要重新下载整个文件。

      这种通过对整个文件进行Hash运算来判断数据是否损坏的方法,效率很低下。如果将文件分割成一个个小的数据块,分别对其做Hash,就得到了HashList。在点对点网络中传输数据时,会从多个节点同时下载数据。假设某些节点网络不稳定或者数据不可信,那么为了验证数据的准确性,就会采用HashList,如果某些数据块损坏了,只需要重新下载这些小的数据块即可,无需重新下载整个文件。

      通常在下载数据前,会先从可信数据源那里获取一个Root Hash值。Root Hash是将HashList中每个数据块的Hash值拼接到一起,再做一次Hash运算所得到的值。这个值用来校验HashList是否正确。得到Root Hash后,会再下载该数据的HashList。判断HashList正确后,才开始文件数据的下载。最后将下载的数据块做Hash后与HashList做比对,如果出现不一致,则说明数据被损坏,需要重新下载该数据块。

      然后回过头来再看Merkle树,它的底层与HashList一样,都是将数据分成小数据块,然后分别计算其Hash值。但是再往上一层就不同了,它不是把所有的Hash值合并到一起做Hash,而是将两个相邻的Hash值拼接在一起进行Hash运算,产生一个新的Hash。例如Block1的Hash值201w与Block2的Hash值0mzc合并Hash后产生新的3ali Hash值。而如果两两匹配后出现孤立的Hash值,则直接将其做Hash,例如Block5。最终产生一个Root Hash值,通常称为Merkle Root。

同样,在下载前,会先从可信数据源中获取正确的Merkle Root,然后再从其他节点下载Merkle树,通过Merkle Root来辨别Merkle树的真伪。如果发现不匹配,则从其他节点继续下载该Merkle树,直到获得一个与可信Merkle Root相匹配的Merkle树。

      由于Merkle树是逐级分支的,所以它可以从任意一个分支开始下载并验证。考虑Root->d063->09yk->a8b5->Block3这个分支,如果对这个分支的Hash值验证通过后,就可以下载Block3的数据了。而在HashList中需要先得到整个Hash值列表后才能使用Root Hash验证。

      在区块链系统中,最下层的叶节点中存放的是交易数据,每个中间层的节点都是它的两个子节点的Hash,根节点也是它的两个子节点的Hash,代表Merkle树的顶部。如果有攻击者恶意篡改交易数据,或者篡改Merkle树的某一部分,必然导致上层节点的Hash值变动,最终导致验证不通过。

 

      了解了Merkle树的结构后,如果我们要查找某一笔交易,首先,可以根据区块头中的时间戳确认交易存在的具体区块。而Merkle Root也是放在区块头中的,如果我们从Merkle Root开始向下查找,假设底层有n笔交易数据,那么找到所需的步骤为log2(n),其实就是算法中的二分查找。简化支付验证(Simplified Payment Verification)就是利用这种方案,实现了轻量级的钱包客户端,只需下载区块头及相关交易的分支,即可对交易进行确认。但是它也存在一些缺点:

1.容易遭到全节点的拒绝服务,所以要保证较多的与全节点的连接,而且要保证这些节点是可信的;

2.spv(简化支付验证)客户端向全节点请求的交易必须与它的密钥一致,这样全节点会看到该客户端的相应用户的公钥,造成隐私泄露。

  

原文地址:https://www.cnblogs.com/tester-l/p/8258406.html