王启河
(华北电力大学控制与计算机工程学院,河北 保定 071003)
0 引 言区块链技术在2008年中本聪发表比特币白皮书《比特币:一种点对点电子现金系统》后引起社各界广泛关注。文中提到构建比特币系统的基础技术是区块链技术,区块链中记录着所有元数据和加密交易信息,从而建立了一个通过点对点技术实现的电子现金系统,使得在线支付的双方不用通过第三方金融机构直接进行交易。区块链技术避免了传统中心化系统中高度依赖中央权威机构,信任成本高,可靠性和安全性较低等问题。区块链技术有去中心化、不可篡改、安全性高、可溯源等特点,这些特点使得互联网向价值互联网的转变成为可能。
2014年Vitalik Buterin发表以太坊白皮书《下一代智能合约和去中心化应用平台》,文中指出了比特币在智能合约上的不足,并提出了在以太坊上虚拟机上运行的一种图灵完备的智能合约。智能合约的不断完善使得区块链的使用不再仅仅局限于虚拟货币的交易,在医疗、供应链、司法、农业、能源等社会各行各业都起到了关键作用。
1 区块链概述1.1 区块链发展历程从2008年首次进入大众视野以来,区块链技术的各个方面都得到了较为迅速的发展。以区块链的应用范围和发展演化来看,区块链经历了区块链1.0、区块链2.0和区块链3.0三个阶段。
区块链1.0阶段实现了无需第三方机构或组织进行监督或验证的交易方式,使得跨国交易或跨行交易更容易进行,同时使得交易的隐私性更高。在这个阶段主要有比特币和莱特币两种数字货币,莱特币是比特币的一种代币。与比特币相比莱特币技术原理上与比特币基本相同,但莱特币更轻量,使得普通人无专业设备挖矿也成为可能。此阶段下,大多数人关注区块链主要是为了对数字货币进行投资,并没有注意到区块链技术的价值。
区块链2.0阶段实现了可编程金融系统。受比特币交易的启发,人们开始尝试将区块链应用到包括股票、清算、私募股权等其他的金融领域。区块链2.0的与区块链1.0最大的区别就是智能合约的实现程度不同。在太坊智能合约技术支持下,区块链技术在金融系统方面的应用越来越广。由Linux基金会在2015年12月主导发起的项目超级账本Hyperledger Febric也是区块链2.0时代的区块链代表之一。
区块链3.0阶段实现了可编程社会。随着区块链技术的发展,人们对区块链技术的应用不再局限于金融领域,而是向社会各个方面扩展。区块链3.0几乎会影响到我们生活的方方面面,所以有人说区块链是自从蒸汽机以来人类最伟大的技术。这可能是较为夸张的说法,但不可否认的是,区块链技术将不可避免地对未来的互联网以及社会各方面产生巨大影响。
1.2 区块链分类区块链的共识机制需要在不同场景下完成共识,不同场景下区块链中的节点数不同,各节点的权限也可能不同。基于节点权限分类,区块链则可以分为公有链,私有链和联盟链。
公有链又称非许可链,是高度去中心化的系统。公有链的特点是无需许可任何个人或组织都能自由地进出系统,并且对区块链的读写权限都一样,没有中心化管理组织;私有链通常是单位或组织内部使用的区块链,写入权限仅限于组织内部,读取权限有限制地对外开放;联盟连也叫许可链,去中心化程度介于公有链和私有链之间,采用的是“部分去中心化”结构,一般是有多个机构或组织共同创建的。因为完全的去中心化或完全的中心化系统对于商业系统来说都是不太可行的,联盟链部分去中心化的特点更加符合商业系统所需的提高合作效率的需求。所以联盟链未来在商业领域将会得到更快的发展。
2 区块链架构区块链经历了十几年的发展,虽然目前没有一种标准化的开发形式,但我们任然可以根据现有区块链平台的工作模式的相同点将区块链分为数据层、网络层、共识层、合约层和应用层五层架构,如图1所示。
图1 区块链架构图
2.1 数据层数据层是区块链平台的最底层,这一层主要是使用默克尔树以及MPT等数据结构对区块链中数据进行组织管理,以及使用哈希函数和非对称加密等技术来保证区块链数据的完整性和安全性。
哈希函数也叫散列函数,此函数的功能是将任意长的字符文件转化成一个固定长的二进制值。一个哈希函数需要满足快速性、单向性、无碰撞三个特性。哈希函数在区块链中应用十分广泛,在区块链链接指针、数据组织、共识机制中都有所应用。
默克尔树是一种使用哈希指针构建的组织数据的数据结构。在比特币中,交易数据在区块体中被构建成一棵二叉默克尔树,叶子为交易数据的哈希值,非叶子节点的值为两个子节点哈希值之和的哈希值。如图2所示。
图2 比特币区块结构示意图
以默克尔树组织交易的目的是可以很快地验证出所有的交易是否被篡改过,若任意一个交易被篡改,则最后得到的默克尔根都会不同,这是由哈希函数的无碰撞特性保证的。同时,默克尔树的组织方式可以给出任意一个交易是经过共识验证的证明路径,即由树根到对应交易叶子节点的路径。默克尔树在区块链上的使用使得各节点能快速地归纳和校验区块中交易数据的完整性和存在性。
2.2 网络层区块链采取了点对点(P2P)方式进行组网,消息直接在节点之间传播。每个节点都具有相同的功能以及地位,不存在中心化设备。每个节点都要承担路由,区块数据验证,区块数据传播,交易信息打包,发现新节点等功能。P2P的组网方式下,任何一个节点宕机系统仍能正常运行。
区块链网络的工作原理如图3所示,在比特币中网络的传播机制有如下6步:
图3 区块链网络工作原理示意图
(1)节点产生交易,将交易数据向全网广播;
(2)矿工节点把在一段时间内收集到的所有交易打包,产生一个新区块;
(3)矿工节点对产生的新区块进行工作量证明;
(4)当矿工节点完成工作量证明,立即向全网广播此新区块;
(5)所有节点对新区块进行验证,如果验证通过就接收此新区块;
(6)所有区块以此新区块的哈希值作为父区块哈希值进行新一轮的区块生成。
2.3 共识层在一区块链分布式的系统中,使互相不信任的节点如何在规定时间内对某一数据或提案达成一致的机制就叫做共识机制。区块链对共识机制提出“不可能三角”的评价标准,即去中心化,可扩展性和安全性三个特性不可能同时满足。不同类型的区块链由于去中心化程度和参与共识节点数量不同,所以使用的共识机制也不相同。公有链中参与共识的节点数量巨大,并且去中心化程度较高,一般使用PoW、PoS和DPoS等共识机制;私有链中节点数量少,且去中心化程度低,一般使用Paxos和Raft等共识机制;联盟链中节点数量少,有“部分去中心化”的特点,一般使用的是PBFT共识机制。本文在第3节对各种共识机制有详细的说明。
2.4 合约层区块链中的智能合约是在区块链中一段当触发一定条件后可自动执行的代码。智能合约在比特币上的支持程度并不高,原因是比特币在设计时并没有考虑到智能合约的其他用途,编写智能合约使用的语言是脚本语言,只能做一些简单的验证和交易控制。在以太坊出现后,在区块链中增加了一种图灵完备的语言对智能合约进行编写,扩展了智能合约的应用范围,使区块链进入了区块链2.0阶段。智能合约在保留了区块链去中心化,不可篡改等特性的基础上又增加了可编程的特点,增强了区块链的可扩展性。本文在第4节对智能合约有更详细的说明。
2.5 应用层目前,区块链逐步进入区块链3.0阶段,各种基于区块链技术的应用正在逐步发展。区块链最初产生的数字货币应用在现在仍广受人们关注,一些人对数字货币投资的热情依旧很高。区块链在医疗共享、供应链溯源、物流溯源、司法存证等方面都有较多的应用。除了使用区块链技术开发独立应用的方向以外,对区块链底层技术进行集成,构建供底层技术服务的平台也是区块链技术的应用。比如以太坊和Hyperledger Febric等平台。
3 共识机制区块链中的核心问题就是共识问题,要保证所有节点能在规定时间内达成共识。区块链中的共识机制需要考虑去中心化程度、安全性、扩展性、资源消耗、交易确认时间、吞吐量和一致性等性能。
3.1 PoWPoW的使用最早是在1993年,由Cynthia等首先提出PoW并应用于解决垃圾邮件的问题上。而在区块链中,PoW被应用于决定哪个节点能够获取记账权,以达到对区块的共识目的。所有节点在打包好一个区块后,需要根据难度值产生一个随机数,使得整个区块头的哈希值在难度值所规定的范围内。率先完成随机数寻找的区块立即向全网广播此区块,其余节点验证通过后以此区块作为父区块开始寻找下一个区块的随机数即表示接收了此区块。
PoW共识机制的去中心化程度很高,没有任何中心化组织或机构,所有节点获取记账权的机会都是按照算力分配,即“一CPU一票”。但在区块链实际运行过程中,出现了许多节点合作挖矿的现象,产生了大量矿场或矿池这样的集中挖矿机构。各矿场矿池之间的算力竞争使得区块链中算力大幅上涨,导致出块速度变快。为了避免出块速度过快或过慢比特币中设置了一个难度值,难度值的大小是区块头的哈希值的十六进制前面连续为0的个数。难度值越大,满足条件的哈希值就越少,搜寻难度越高。比特币中规定在产生2016个区块后就需要对难度值调整,使出块速度维持在10分钟左右。调整公式为:
其中target为调整后的目标难度值;target为当前难度值;time为当前难度值下产生2016个区块所用的时间;time为期望产生2016个区块所用的时间,即20 160分钟。
PoW共识机制在能量消耗上非常大。有研究表明,仅中国在比特币挖矿上的消耗将在2024年达到达到296.59 Twh的峰值,并相应地产生1.305亿吨的碳排放量。这相当于捷克共和国和卡塔尔的年化温室气体排放总量。
3.2 PoSPoS在2012年由点点币(PPcoin)首次采用了PoS机制作为全网对区块的共识机制。PoS机制中提出了币零的概念:假设一个用户拥有10个货币,且在90天内该用户一直未使用这10个货币,那么该用户的币龄为90×10,即900。一旦用户使用了这10个货币,那么该用户的币龄就变为0了。币龄的作用是在矿工挖矿时可以使用自己的币龄来降低挖矿难度,使用的币龄越多,挖矿难度越低。在成功出块后,所使用币的币龄将会被清空并且这部分币将会被锁定一段时间不能进行挖矿,以此确保系统的相对公平。
在PoS机制下,节点之间竞争记账权不再仅仅只依靠算力,对节点拥有代币的数量也有了比拼。一定程度上降低了在算力上的能源消耗,但因其本质上还是在通过哈希计算寻找随机数进行共识,对能源仍有较大需求。对于PoS机制的安全性,主要是累积权益攻击危害较大,但币龄清龄机制使得累积权益攻击的代价也会很大,作恶者将以大量代币的代价进行一次攻击,收益可能小于投入消耗。所以PoS机制是对攻击者进行利益绑定来保障系统的安全性。
3.3 DPoSDPoS共识机制的原理是通过投票推选出若干个代理人节点,这些代理人节点进行区块的验证和上链。类似于“董事会决策”的方式进行,即每个股东以其所持有的股票进行选举投票自己的代理人节点,由得票数多的若干节点作为组成董事会进行决策,且在规定时间后重新进行投票。因为选举的过程并没有大量的计算,所以DPoS的能源消耗远低于PoW机制和PoS机制。
DPoS机制在共识速度上相对于PoW机制和PoS机制也有较大的提升,同时在安全性上也有较为安全的保障。即便恶意节点发动合谋攻击,共同选举一个恶意节点作为代理人节点,由于大部分节点选取的是诚实代理人,这个恶意代理人也无法左右共识结果。DPoS机制中还存在部分节点投票积极性不高,甚至从未参与投票;没有快速剔除恶意节点等问题。目前,有许多研究人员针对这些问题对DPoS通过增加奖惩机制、熔断机制、信誉机制等方式进行了改进。
3.4 PaxosPaxos共识机制是分布式共识机制的起源,许多共识机制都是由其发展而来。Paxos机制在区块链中一般只作为部分私有链的共识机制。Paxos共识机制能源计算消耗小,去中心化程度较高,但其应用范围小,仅适用于具有较高容错性的系统之中。
Paxos将系统中的角色分为提议者(Proposer),决策者(Acceptor),和最终决策学习者(Learner)三类。Proposer负责提出提案同时也参与决策;Acceptor负责参与决策;Learner不参与决策,只对最终的决策结果进行接收。Paxos共识算法流程如图4所示,共识流程主要分为了三个阶段:
图4 Paxos共识流程示意图
(1)Prepare阶段:Proposer对收到的Prepare请求进行编码为n,并向所有Acceptor转发Prepare;Acceptor收到Prepare后检查是否响应过编码大于等于n的提案,若没有则向Proposer回复一个Promise,保证不再接受提案编码小于等于n的提案;
(2)Accept阶段:Proposer收到超过半数的Promise后,向所有Acceptor发送Propose请求;Acceptor收到Propose后如果接受请求则向Proposer响应Accept;
(3)Learn阶段:Proposer收到超过半数的Accept后,表示对编号为n的提案已经达成共识,Proposer向所有Learner发送形成的提案决议。
3.5 PBFTPBFT共识算法由Miguel Castro等人在BFT基础上改进提出,PBFT将BFT算法复杂度由指数级降到多项式级别,使得拜占庭容错问题得到实践上的解决。PBFT共识效率高,能耗低,但由于消耗和共识速度都与参与节点数量相关,所以一般使用PBFT机制的系统中不能容纳过多的节点。
PBFT机制将节点分为客户端节点,主节点和备份节点三类,其中主节点和备份节点统称为副本节点。PBFT共识流程如图5所示。
图5 PBFT共识流程示意图
共识流程主要有以下5个阶段:
(1)Request阶段:客户端节点向主节点发送请求;
(2)Pre-Prepare阶段:主节点向所有备份节点转播请求;
(3)Prepare阶段:所有副本节点对收到的请求进行验证,验证成功后向所有备份节点发送准备信息;
(4)Commit阶段:当副本节点收到2+1个验证通过的准备信息后(为允许容纳的最大拜占庭节点数量)向其余副本节点发送一条确认信息;
(5)Reply阶段:当副本节点收到验证通过的2+1条确认信息后,向客户端节点发送一条响应信息,客户端节点收到+1条响应信息则表示成功对提案达成共识。
基于PBFT算法,目前出现了许多相关的改进算法。文献[22]提出一种K-PBFT聚类算法,通过聚类分组减少参与共识节点,从而减少通信量;文献[23]提出一种IPBFT算法,引入节点的自证机制,使得在长期共识过程中的共识效率提高,是一种优化共识过程的算法。
4 智能合约智能合约最初的定义是一套以数字形式定义的承诺,包括合约参与方可以在上面执行这些承诺的协议。在比特币系统中,实现智能合约的方法是使用一种栈式编程环境,即比特币脚本语言进行编程。主要目的是完成一些交易的控制以及转账的验证等操作。比特币脚本语言并不是图灵完备的语言,仅仅只有不到200种命令,很难完成一些较为复杂的操作。以太坊中使用的智能合约语言则为Solidity语言和Serpent语言,都是图灵完备的语言。Solidity语言还是一种面向对象的语言,能够对智能合约进行复杂的逻辑处理,并且具有很强的合约表达能力。这使得以太坊平台有很好的可扩展性,近年来基于以太坊平台的应用也越来越多。
智能合约的生命周期分为为协商、开发、部署、运行、销毁5个阶段。其中协商和开发两个阶段完成的是智能合约的产生,部署阶段完成的是智能合约的发布,运行和销毁则是完成智能合约的执行。为了能够安全执行,智能合约不能直接运行在节点的外部环境,而是运行在一种与外界隔离的沙箱环境中,如容器和虚拟机。目前,Hyperledger Febric使用的是一种轻量级的Docker容器作为智能合约的沙箱,而以太坊使用的沙箱是EVM虚拟机技术。
5 区块链安全随着区块链的不断发展,区块链的应用领域越来越广泛,区块链所承担的价值不断增加,同时安全风险也不断增加,也受到了较为广泛的关注。
5.1 分叉区块链分叉是指在同一区块链上从某个节点开始出现了不止一条并行的链。区块链中由于网络延迟,可能会出现两个或多个矿工同时挖出区块,此时这几个新区块都为合法最长链的区块。但这种情况不能一直维持下去,当下一个区块被发现追加到某一个区块后面,其他区块就成为非法区块被抛弃。
区块链系统协议的更新也会造成分叉。当旧系统协议认可新系统协议时:由于新系统区块不认可旧系统区块,会导致短暂的分叉,但新协议链最后一定会成为最长链,这种分叉叫做软分叉;当旧系统协议不认可新系统协议时:新旧系统区块互相不认可,会成分叉成两条并行的链,这种分叉叫做硬分叉。2016年以太坊中的The DAO项目筹集了超过1 150万个以太币,但由于其智能合约中的漏洞遭到黑客攻击,黑客盗取了约360万个以太币。以太坊对此投票决定是否回撤区块,最终85%的人支持回撤,进行了硬分叉。但旧链并没有因此消亡,至今仍在运行,被称为经典以太坊。
5.2 双花攻击双花攻击又叫双重支付,指攻击者将同一货币进行两次不同的交易,是数字货币必须要解决的问题。在区块链中,避免双花攻击的方式是通过交易验证货币的来源是否合法,回溯该货币的所有交易,直到回溯到最初产生该货币的区块为止。虽然随着区块链的增长,回溯一笔交易的花费也随之增加,甚至可能需要回溯到创始区块,但对于保障区块链安全来说,这些消耗也是值得的。
5.3 51%攻击51%攻击是指区块链系统中某个节点拥有全网超过51%的算力,可以通过在主链上分叉对区块链中已经确认的交易回撤,以达到双重支付的目的。原理是区块链中认定最长链为合法链,攻击者以某个已经确认的区块为起点发起分叉,因为拥有超过51%的算力,所以最后一定能成为最长链,而原本主链上起点区块之后的所有区块都成为非法区块,里面的交易也被回撤了。在实际系统中,某个节点想要达到51%算力几乎是不可能的,但一些矿场和矿池进行算力集中化,使得区块链的安全性也受到了一定威胁。
6 区块链未来与展望区块链的未来需要考虑到区块链平台的可扩展性和多平台的可交互性,多链技术、侧链技术、跨连技术这三种技术有望完成区块链这一目标。
多链技术是使在同一个区块链平台上存在多条并行的链,且这些链之间的交易互不影响的技术。实现多链的方法有分片,即对区块链进行区域分片。不同区域在不同的链上进行交易,以达到并发执行,提高交易吞吐量的目的。多链技术还需要解决在各个并行链之间通信,跨区域交易等问题。
侧链技术是指在主链之外还存在一条独立的链,这条链上拥有自己的共识机制、智能合约、交易类型、账本等,通过双向定锚的方式使得数字资产能在主链和侧链之间相互转移。侧链技术的实现有单一托管模式、联盟模式、SPV模式、驱动模式和混合模式五种模式。
跨链技术能将各个独立区块链平台连接起来,起到区块链平台之间桥梁的作用。跨链技术有公证人机制、侧链/中继、哈希锁定和分布式私钥控制四种技术。跨链技术如果运用成功对区块链技术有巨大价值,完成多平台之间交互是实现价值互联网的关键一步。
7 结 论本文对区块链数据层、网络层、共识层、合约层和应用层五层架构进行了逐一介绍,并重点阐述了共识机制和智能合约,最后对区块链的安全和未来发展方向进行了介绍。随着区块链的发展,将会有更多基于区块链的应用会进入我们生活的各方面,是未来实现价值互联网的重要手段,值得对其进行深入研究。区块链技术对共识机制、安全性和可扩展性的要求将会越来越高,所以目前应该对共识机制的改进、区块链安全和区块链平台交互等方面进行着重研究。