区块链技术指南笔记(三):区块链运作的核心技术

在学习区块链的时候,有很多知识点,作为读者的我们不能第一时间去消化它(也没必要第一遍就弄懂),某些方面的设计思想看的也是一知半解。我遇到这种情况,一般会将书多看几遍,再去寻找各个知识点之间的关系,从而了解设计者的构思。例如在本科刚开始学习操作系统时,书中的概念又多又新,看书都没有精神。但是,当我们去思考为什么会这么做的时候,再去看待一些问题就会发现操作系统中很多思想和我们生活中处理一些事物的做法很像。有一次我去人才中心提档案,在提交文件的时候少了身份证复印件,那个大姐让我赶快去复印拿给她,当我复印完回去的时候,发现她在处理别人的事情。但是,当她看到我后,向我招手示意,于是我"插到"最前面完成了要办的手续,等我的事办完了,她又着手别人的事(这一过程是不是很像进程的调度?其中涉及资源问题,进程的优先级问题等)。区块链的基本知识就好像是积木一样,有了这些积木就拥有了搭建一个房子的材料。至于如何搭,那就要学习它们之间的关系了。上一篇的笔记是一些基本概念,它可以使我们对区块链技术中所包含的知识有所了解,至于区块链是怎么运作的,并没有涉及太多。正如原书中的编写思路,在介绍完基础概念后,便向读者介绍了区块链运作的核心技术。在学习过程中,有的概念会重复出现。我的建议是不要跳过这些部分,哪怕是快速的浏览一遍,加深印象也不错。

将区块链的基础架构分为三层。分别是应用层、数据层和网络层。

其中应用层包括:可编程货币、可编程金融等。

数据层包括:公共总账本、共识算法和密码学等。

网络层包括:P2P网络、TCP/IP协议等。

首先,在网络层之上,区块链是建立在TCP/IP通信协议和对等网络的基础上的一个分布式系统,和传统带中心的分布式系统不一样,它不依靠中心化的服务器节点来转发消息,而是每一个节点都参与消息的转发。因此P2P网络比传统网络具有更高的安全性,任何一个节点被攻击都不会影响整个网络,所有的节点都保存着整个系统的状态信息。

其次,在数据层面上,区块链就是一个只可追加、不可更改的分布式数据库系统,是一个分布式账本。如果是公开的块链,也就是公有链,那么这个账本可以被任何人在任何地方进行查询,完全公开透明。在区块链网络中,节点通过使用共识算法来维持网络中账本数据库的一致性。同时采用密码学的签名和哈希算法来确保这个数据库不可篡改,不能作伪,并且可追溯。例如,在比特币系统中,只有在控制了50%的网络算力时才有比较大的概率对区块链进行重组以修改账本信息。由于比特币系统的设计者中本聪在系统设计中巧妙的加入了带有经济激励的挖矿工作量证明(PoW)机制,使得即使拥有网络50%以上算力的人也不会损害其自身利益而发起对网络的攻击。因此,比特币系统在上线7年多来一直持续不断地正常运行,没有出现过因为比特币系统本身缺陷而造成的安全故障。

再次,在应用层面,我们可以用区块链代替传统的登记、清算系统。国信证券分析报告指出,通过区块链的点对点分布式的时间戳服务器来生成依照时间前后排列并加以记录的电子交易证明,可以解决双重支付问题,从而带来结算成本趋零的可能性。

在应用方面,区块链平台能够提供编程环境让用户编写智能合约。通过智能合约,可以把业务规则转化成在区块链平台自动执行的合约,该合约的执行不依赖可信任的第三方,也不受人为的干预。理论上只要一旦部署,一旦符合合约执行的条件就会自动执行。执行结果也可以在区块链上供公开检查,提供了合约的公正性和透明性。因此,智能合约可以降低合约建立、执行和仲裁中所涉及的中间机构成本。区块链的智能合约奠定了未来建立可编程货币、可编程金融,甚至是可编程社会的基础。

 

区块链具有去中心化、可靠数据库、开源可编程、集体维护、安全可信、交易准匿名性等特点。如果一个系统不具有以上特征,将不能被视为基于区块链技术的应用。

(1)去中心化

区块链数据的存储、传输、验证等过程均基于分布式的系统结构,整个网络中不依赖一个没有中心化的硬件或管理机构。作为区块链一种部署模式,公共链网络中所有参与的节点都可以具有同等的权利和义务。

(2)可靠数据库

区块链系统的数据库采用分布式存储,任一参与节点都可以拥有一份完整的数据库拷贝。除非能控制系统中超过一半以上的算力,否则在节点上对数据库的修改都将是无效的。参与系统的节点越多,数据库的安全性就越高。并且区块链数据的存储还带有时间戳,从而为数据添加了时间维度,具有极高的可追溯性。

(3)开源可编程

区块链系统通常是开源的,代码高度透明公共链的数据和程序对所有人公开,任何人都可以通过接口查询系统中的数据。并且区块链平台还提供灵活的脚本代码系统,支持用户创建高级的智能合约、货币和去中心化应用。例如,以太坊平台即提供了图灵完备的脚本语言,供用户来构建任何可以精确定义的智能合约或交易类型。

(4)集体维护

系统中的数据块由整个系统中所有具有记账功能的节点来共同维护,任一节点的损坏或失去都不会影响整个系统的运作。

(5)安全可靠性

区块链技术采用非对称密码学原理对交易进行签名,使得交易不能被伪造;同时利用哈希算法保证交易数据不能被轻易篡改,最后借助分布式系统各节点的工作量证明等共识算法形成强大的算力来抵御破坏者的攻击,保证区块链中的区块以及区块内的交易数据不可篡改和不可伪造,因此具有极高的安全性。

(6)准匿名性

区块链系统采用与用户公钥挂钩的地址来做用户标识,不需要传统的基于PKI的第三方认证中心颁发数字证书来确认身份。通过在全网节点运行共识算法,建立网络中诚实节点对全网状态的共识,间接地建立了节点间的信任。用户只需要公开地址,不需要公开真实身份,而且同一个用户可以不断变换地址。因此,在区块链上的交易不和用户真实身份挂钩,只是和用户的地址挂钩,具有交易的准匿名性。

区块链技术的核心优势是去中心化,能够通过运用哈希算法、数字签名、时间戳、分布式共识和经济激励等手段,在节点无需互相信任的分布式系统中建立信用,实现点对点交易和协作,从而为中心化机构普遍存在的高成本、低效率和数字存储不安全等问题提供了解决方案。

 

区块链运作的核心技术

1.区块链的连接

每个区块分为区块头和区块体(含交易数据)两个部分。区块头包括用来实现区块链接的前一区块的哈希值(又称散列值)和用于计算挖矿的随机数(nonce)。前一区块的哈希值实际是上一个区块头部的哈希值,而计算随机数规则决定了哪个矿工可以获得记录区块的权力。区块链的链接模型如下:

区块链技术指南笔记(三):区块链运作的核心技术

2.共识机制

区块链是伴随比特币诞生的,是比特币的基础技术架构。可以将区块链理解为一个基于互联网的去中心化记账系统。类似比特币这样的去中心化数字货币系统,要求在没有中心节点的情况下保证各个诚实节点记账的一致性,就需要区块链来完成。所以区块链技术的核心是在没有中心控制的情况下,在互相没有信任的基础的个体之间就交易的合法性等达成共识的共识机制。

区块链的共识机制目前主要有4类:PoW、PoS、DPoS、分布式一致性算法。

PoW(工作量证明)

工作量证明,也就像比特币的挖矿机制,矿工通过把网络尚未记录的现有交易打包到一个区块,然后不断遍历尝试来寻找一个随机数,使得新区块加上随机数的哈希值满足一定的难度条件例如前面10位是零。找到满足条件的随机数,就相当于确定了区块链最新的一个区块,也相当于获得了区块链的本轮记账权。矿工把满足挖矿难度条件的区块在网络中广播出去,全网其他节点在验证区块满足挖矿难度条件,同时区块里的交易数据符合协议规范后,将各自把区块链接到自己版本的区块链上,从而在全网形成对当前网络状态的共识。

优点:完全去中心化,节点*进出,避免了建立和维护中心化信用机构的成本。只要网络破坏者的算力不超过网络总算力的50%,网络的交易状态就能达成一致。

缺点:目前比特币挖矿造成大量的资源浪费;另外挖矿的激励机制也造成矿池算力的高度集中,背离了当初去中心化设计的初衷。更大的问题是PoW机制的共识达成的周期较长,每秒只能最多做7笔交易,不适合商业应用。

 

PoS(权益证明)

权益证明要求节点提供拥有一定数量的代币证明来获取竞争区块链记账权的一种分布式共识机制。如果单纯依靠代币余额来决定记账者必然使得富有者生出,导致记账权的中心化,降低共识的公正性,因此不同的PoS机制在权益证明的基础上,采用不同方式来增加记账权的随机性来避免中心化。例如点点币PoS机制中,拥有最长链龄的比特币获得记账权的几率就越大。NXT和Blackcoin则采用一个公式来预测下一个记账的节点。拥有多的代币被选为记账节点的概率就会大。未来以太坊也会从目前的PoW机制转为PoS,目前,以太坊的PoS机制将采用节点赌注来赌下一区块,赌中者有额外以太币奖,赌不中者会被扣以太币的方式来达成下一区块的共识。

优点:在一定程度上缩短了共识达成的时间,降低了PoW机制的资源浪费。

缺点:破坏者对网络攻击的成本低,网络的安全性有待验证。另外拥有代币数量大的节点获得记账权的几率更大,会使得网络的共识受少数富裕账户支配,从而失去公正性。

 

DPoS(股份授权证明)

股权授权证明机制类似于董事会投票。比特股采用的PoS机制是持股者投票选出一定数量的见证人,每个见证人按序有两秒的权限时间生成区块,若见证人在给定的时间片不能生成区块,区块生成权限交给下一个时间片对应的见证人。持股人可以随时通过投票更换这些见证人。DPoS的这种设计使得区块的生成更为快速,也更加节能。

优点:大幅缩小参与验证和记账节点的数量,可以达到秒级的共识验证。

缺点:选举固定数量的见证人作为记账候选人有可能不适合于完全去中心化的场景。另外在网络节点数少的场景,选举的见证人的代表性也不强。

 

分布式一致性算法

分布式一致性算法是基于传统的分布式一致性技术。其中分为解决拜占庭将军问题的拜占庭容错算法。另外解决非拜占庭问题的分布式一致性算法(Paxos、Raft)。该类算法目前是联盟链和私有链场景中常用的共识机制。

优点:实现秒级的快速共识机制,保证一致性。适合多方参与的多中心商业模式。

缺点:去中心化程度不如公有链上的共识机制。

 

3.解锁脚本

脚本是区块链上实现自动验证、自动执行合约的重要技术。每一笔交易的每一项输出严格意义上并不是指向一个地址,而是指向一个脚本。脚本类似一套规则,它约束着接收方怎样才能花掉这个输出上锁定的资产。

交易的合法性验证也依赖于脚本。目前它依赖于两类脚本:锁定脚本和解锁脚本。锁定脚本是在输出交易上加上的条件,通过一段脚本语言来实现,位于交易的输出。解锁脚本与锁定脚本相对应,只有满足锁定脚本要求的条件,才能花掉这个脚本上对应的资产,位于交易的输入。通过脚本语言可以表达很多灵活的条件。解释脚本是通过类似我们编程领域里的”虚拟机”,它分布式运行在区块链网络里的每一个节点。

 

4.交易规则

区块链的交易就是构成区块的基本单位,也是区块链负责记录的实际有效内容。一个区块链交易可以是一次转账,也可以是智能合约的部署等其他事物。

就比特币而言,交易即指一次支付转账。其交易规则如下:

(1)交易的输入和输出不能为空。

(2)对交易的每个输入,如果其对应的UTXO输出能在当前交易池中找到,则拒绝该交易。因为当前交易池是未被记录在区块链中的交易,而交易的每个输入,应该来自确认的UTXO。如果在当前交易池中找到,那就是双花交易。

(3)交易中的每个输入,其对应的输出必须是UTXO。

(4)每个输入的解锁脚本必须和相应输出的锁定脚本共同验证交易的合规性。

对于以太坊来说,交易还可能是智能合约的部署。交易规则就确定了符合一定语法规则的合约才能被部署在区块链上。

 

5.交易优先级

区块链交易的优先级有区块链协议规定决定。对于比特币而言,交易被区块包含的优先次序由交易广播到网络上的时间和交易额的大小决定。随着交易广播到网络上的时间的增长,交易的链龄增加,交易的优先级就被提高,最终会被区块包含。对于以太坊而言,交易的优先级还与交易的发布者愿意支付的交易费用有关,发布者愿意支付的交易费用越高,交易被包含进区块的优先级就越高。

 

6.Merkle证明

Merkle证明的原始应用是比特币系统,比特币区块链使用了Merkle证明,为的是将交易存储在每一个区块中,使得交易不能被篡改,同时也容易验证交易是否包含在一个特定区块中。比特币的Merkle证明树如图:

区块链技术指南笔记(三):区块链运作的核心技术

Merkle树的一个重要使用场景就是快速支付验证,也就是中本聪描述的”简化支付验证”(SPV)的概念:轻量级节点不用下载每一笔交易以及每一个区块,可以仅下载链的区块头,每个区块中仅包含下述5项内容,数据块大小为80字节。

(1)上一区块头的哈希值

(2)时间戳

(3)挖矿难度值

(4)工作量证明随机数(nonce)

(5)包含该区块交易的Merkle树的根哈希

如果一个轻客户端希望确定一笔交易的状态,它可以简单地要求一个Merkle证明,显示出一个在Merkle树特定的交易,其根是在主链上的区块头。

Merkle证明可以让区块链得到更广阔的应用,但比特币的轻客户有其局限性。虽然可以证明包含的交易,但无法证明任何当前的状态(例如:数字资产的持有,名称注册,金融合约的状态等)。一笔交易影响的确切性质可以取决于此前的几笔交易,而这些交易本身则依赖于更为前面的交易,所以最终需要验证整个链上的每一笔交易。为了解决这个问题,以太坊进行了更进一步的创新。

以太坊的每一个区块头中并非只包含一颗Merkle树,而是包含了3棵Merkle树,分为3种对象:交易(Transaction)、数据(Receipts)和状态(State)

区块链技术指南笔记(三):区块链运作的核心技术

这三颗树允许轻客户端轻松地进行并核实以下类型的查询答案:

1)这笔交易被包含在特定的区块中了吗?

2)这个地址在过去30天中,发出X类型事件的所有实例(例如,一个众筹合约完成了它的目标)。

3)目前账户余额是多少?

4)这个账户是否存在?

5)假装在这个合约中运行这笔交易,它的输出会是什么?

第1种是由交易树来处理的;第3、4种则是由状态树负责处理;第2种则由收据树处理。计算前4个查询任务是相当简单的。在服务器简单地找到对象,获取Merkle分支,并通过分支来回复轻客户端。第5种查询任务同样也是由状态树处理。

 

7.RLP

RLP(Recursive Length Prefix,递归长度前缀编码)是Ethereum中对象序列化的一个主要编码方式,其目的是对任意嵌套的二进制数据的序列进行编码。

以太坊中的所有数据都以”递归长度前缀编码”形式存储,这种编码格式将任意长度和维度的字符串构成的数组串连接成字符串。例如,[‘dog’,’cat’]被串接(以字节数组格式)为[200,131,100,111,103,131,99,97,116];其基本的思想是把数据类型和长度编码成一个单独的字节放在实际数据的前面(例如’dog’的字符数组编码为[100,111,103],于是串接后就成了[131,100,111,103])。’dog’是字符串,有24字节,RLP编码规则是当字符串长度为0~55字节时,0x80加上字符串长度,这里是3。因此是0x83,转成十进制是131.[‘dog’,’cat’]是个list,RLP规则是当长度小于55字节时,第1字节为0xc0加上list长度,这里是8,所以是0xc8,转成十进制应该是200。注意RLP编码正如其名字表示的一样,是递归的;当RLP编码一个数组时,实际上是在对每一个元素的RLP编码级联成的字符串编码。需要注意的是,以太坊中所有数据都是整数;所以,如果有任何的以一个或多个0字节开头的哈希或者地址,这些0字节应该在计算出现问题的时候去除。以太坊中没有串接数据结构包含任何以0开头的数值。整数以大端基础256格式存储。

 

区块链交易流程

以比特币的交易为例,区块链的交易并不是通常意义上的一手交钱一手交货的交易,而是转账。如果每一笔转账都需要构造一笔交易数据会比较笨拙,为了使得价值易于组合与分割,比特币的交易被设计为可以纳入多个输入和输出,即一笔交易可以转账给多个人。从生成到在网络中传播,再到通过工作量证明、整个网络节点验证,最终记录到区块链,就是区块链交易的整个生命周期。整个区块链交易流程如图:

区块链技术指南笔记(三):区块链运作的核心技术

(1)交易的生成。所有者A利用他的私钥对前一次交易和下一位所有者B签署一个数字签名,并对这个签名附加在这枚货币的末尾,制作成交易单。

(2)交易的传播。A将交易单广播至全网,每个节点都将收到的交易信息纳入一个区块中。

(3)工作量证明。每个节点通过相当于解一道数学题的工作量证明机制,从而获得创建新区块的权力,并争取得到数字货币的奖励。

(4)整个网络节点验证。当一个节点找到解时,它就向全网广播该区块记录的所有时间戳交易,并由全网其他节点核对。

(5)记录到区块链。全网其他节点核对该区块记账的正确性,没有错误后他们将在该合法区块之后竞争下一个区块,这样就形成了一个合法记账的区块链。