Stellar区块链:原理与实践
上QQ阅读APP看书,第一时间看更新

1.3 关键组成

前面提过,区块链技术的基础协议主要由四个核心部分组成:P2P网络、共识机制、密码学和智能合约。区块链基础协议的实例化形成区块链网络,基于区块链网络搭建各类应用。这些核心技术组成部分共同维护着整个区块链网络的安全可靠。

注意

智能合约并不是区块链基础协议的必备核心功能模块,当前并不是所有区块链基础协议都包含智能合约模块。

1.3.1 P2P网络

P2P(Peer to Peer)网络又称对等网络,是由一个无须中心化的机构来做协调,用户(Peer)间平等通信的网络。网络中的资源和服务分散在所有网络节点上,无须中间网络节点介入,因此随着网络节点数量的逐步增多,在网络扩展性和健壮性方面会表现得更加优越。

在这样的网络中,每个用户(Peer)都可以直接对接其他用户(Peer),在特定的场景下,用户(Peer)间直接对接可以节省时间,提高效率,如图1-1所示。

图1-1 P2P网络对比中心化网络

P2P网络主要有以下4个特性。

1.可扩展性

在P2P网络中,随着网络节点的加入,系统整体的服务能力也在同步扩充,理论上其可扩展性几乎是无限的。

2.健壮性

P2P网络通常都是允许节点自由加入和离开的,其服务和数据分布在各个节点中,部分节点遭到破坏时也不会对其他部分造成很大影响,因此P2P网络天生具有耐攻击、高可用的优点。

3.高性价比

P2P网络可以有效地利用互联网中散布的大量普通节点,将计算和存储分布到所有节点上,充分利用大量计算机的闲置计算和存储能力,为许多应用节省大量硬件成本。

4.负载均衡

P2P网络的每个节点都是对等模式,既是服务提供者,又是服务使用者,计算和存储资源分布在多个节点,可以更好地实现整个网络的负载均衡,尤其可以大大提升只读方面的性能(Query Per Second, QPS)。

1.3.2 共识机制

在“平等的世界”中,所有的参与者都要遵守游戏规则,各方按照这个规则来有秩序执行,这种游戏规则就是共识机制。通常的共识机制包括了投票表决机制和检查清单两部分外,由于不同区块链技术基础协议的检查清单差别较大,故这里不列举,本书中重点描述投票表决机制。

注意

区别于传统Raft、PAXOS等分布式一致性协议,共识机制中参与节点没有主次之分(没有Master节点),只有节点(全节点、验证节点和同步节点,下文有详细描述)种类的不同,用户可以根据自身的业务需求和硬件设备情况,自由灵活搭建不同类型节点来参与到区块链网络中。

共识机制可信地解决了分布式数据一致性问题,它有两个关键特性:安全性、活性。安全性是指系统就某个值达成了一致,就不能与另一个值再次达成一致;活性是指一致性总是能够达成,即系统总会达成一个值,不能无休止地等待。

区块链共识机制通常包含以下两大类。

1. PoX共识机制

此类共识机制的特点是简单粗暴、高效可靠。

PoW,工作量证明(Proof of Work),可以理解为多劳多得。工作量证明通常依赖机器的算力来获取记账权。BitCoin基础协议就是典型的PoW共识。

区块链网络内用户公平地参与破解密码难题的比赛,算得最快的且经过验证结果正确的用户会获得记账权,继而获得BitCoin奖励,算力越高算出正确值的概率越大,获得BitCoin奖励的概率也越大。通过竞争记账权以获得BitCoin的行为让人联想起淘金而被形象地称为“挖矿”,参与竞争记账权的人称为“矿工”;每个参与者的计算机俗称“矿机”;现在,很多矿机联合在一起贡献算力,俗称“矿池”。此种共识机制随着网络中算力的逐步增多,计算难度越来越大,需要花费大量的电力资源,同时,效率低下,无法满足企业级场景应用需要。

注意

激励机制与共识机制是两个不同的概念,共识机制是保证整个区块链网络的数据不可篡改,激励机制是维护区块链网络社区生态的有效经济手段。在各类区块链网络中,特别是在联盟链网络中,通常可以不设计激励机制,但是,公有链网络中通常包括激励机制。

Juan Garay和Aggelos Kiayias等在2017年构建了BitCoin的PoW协议的抽象理论模型,证明了该抽象理论模型的安全性《The Bitcoin backbone protocol: Analysis and applications》。

注意

PoW共识机制,是对计算能力的可靠量化。算法特点是:正向计算结果需要大量的算力,反向验证计算结果需要极少的算力。如果能找到某一个场景下有实际意义(比如基因、信号处理等)的类似算法来替代当前的BitCoin算法,将具有重大意义。

PoS,权益证明(Proof of Stake),简单说就是谁拥有的份额越多,谁越容易获得记账权,也就越容易获得记账奖励。这个份额计算方式包括拥有份额的数量和时间长度,提供证明的份额作为保证金,份额越多,获取记账权的概率就越大,获得记账奖励的概率也就越大。PoS机制最大的贡献是解决了PoW机制中资源被浪费的问题,因为每一个参与者都要提供份额保证金,避免了资源的浪费以及恶意参与。

Aggelos Kiayias等在2017年提出Ouroboros《Ouroboros: A Provably Secure Proof-of-Stake Blockchain Protocol》。,这是一种安全的PoS共识机制。

DPoS,代理权益证明(Delegated Proof-of-Stake)与PoS共识机制的原理相似,区别在于DPoS选取了部分节点作为代表进行投票。DPoS机制是先通过权益来选出记账人,作为“代表”。然后记账人之间再轮流记账,代表行使权力。DPoS算法大大提高了交易的速度。通过信任少量的诚信节点,也就是“代表”,可以去除区块签名过程中不必要的步骤,提高效率。

2.拜占庭共识机制

拜占庭共识机制源于拜占庭将军问题,该问题是1982年由Lesile Lamport提出的,被称为The Byzantine Generals Problem或者Byzantine Failure,主要是用于分析在分布式节点传输信息时如何保持数据的一致性。

拜占庭共识主要用于解决拜占庭错误问题,即错误节点可以做任意事情,比如不响应、发送错误信息、对不同节点发送不同决定、不同错误节点联合起来干坏事等,在分布式网络中,这是一种最坏和最悲观的情况。

如果某个一致性算法能够保证在系统出现f个拜占庭错误时仍保持一致,那么这个算法也就能够保证在出现f个任意其他错误的时候也保持系统一致。

Leslie Lamport的论文《Reaching agreement in the presence of Faults》。中给出了完备证明,即有n ≥ 3f+1的一致性方案,同时证明了n=3f的时候是无解的,其中n表示节点数量,f表示错误节点数量。

解决拜占庭错误问题的一类共识机制称为拜占庭共识机制,主要包括实用拜占庭容错(Practical Byzantine Fault Tolerance, PBFT)、联邦拜占庭共识(Federated Byzantine Agreement, FBA)等。

1.3.3 密码学

密码学是区块链安全的基石技术手段,能够有效保护区块链网络信息安全。区块链中常用的密码学算法包括Hash算法、签名算法、Merkle算法和编码算法等。当前区块链基础协议一般情况下不支持数据加密解密,所以加密解密算法不是区块链基础协议的必备算法。

1. Hash算法

Hash函数是一种散列杂凑算法。通常是将数据通过Hash函数映射成固定长度字符串,通过Hash值比对可以有效判断数据是否被篡改过。Hash值是数据的数字指纹,相同数据的Hash值是完全一样的,任何微小的输入变动都会导致Hash值的完全不同。

Hash函数必须具备两个基本特征:单向性、碰撞约束。单向性是指Hash只能单向计算,不能反向计算,即只能从输入推导出输出,而不能从输出计算出输入。碰撞约束是指不能找到一个输入使其输出结果等于一个已知的输出结果或者不能同时找到两个不同的输入使其输出结果完全相同。一个Hash函数设计的好坏除了防碰撞性,还要考量性能效率问题。

目前常用的Hash函数主要有MD和SHA两个系列。MD系列主要包括MD2、MD4和MD5等,中国的王小云教授在有限时间内成功破解了MD2和MD5算法,并证实MD系列Hash函数的不安全性。SHA系列包含SHA1和SHA2(SHA224、SAH256、SHA384和SHA512,其中224、256、384和512都是指其输出的位长度)系列。其中,SHA1是160位长,当前安全性亦受到挑战,不建议使用。

在当前主流的区块链基础协议中,通常采用的Hash函数有SHA256、RIPEMD160和国密SM3等。SM3算法是中国国家密码管理局2010年公布的中国商用密码杂凑算法标准。SM3算法适用于商用密码应用中的数字签名和验证,是在SHA 256基础上进行改进实现的一种算法。

2.签名算法

数字签名通常解决两个问题:一是确定传送信息的信息来源;二是核实信息在传送过程中是否发生变化。区块链中的签名算法通常选用非对称签名算法,大部分都是椭圆曲线Secp256k1上的ECDSA,还有Tendermint使用了Ed25519, Zilliqa使用了Schnorr签名。也有少部分采用了Hash签名算法,如Hcash使用了Winternitz签名算法。

椭圆曲线密码学(Elliptic Curve Cryptography, ECC)是基于椭圆曲线数学的一种公钥密码的方法。椭圆曲线密码学是在1985年由Neal Koblitz和Victor Miller分别独立提出的。与经典的RSA、DSA等公钥密码体制相比,椭圆密码体制有以下优点。

❏ 安全性高。有研究表明,160位的椭圆密钥与1024位的RSA密钥安全性相同。

❏ 处理速度快。在私钥的加密解密速度上,ECC算法比RSA、DSA速度更快。

❏ 带宽和存储要求低。相同的安全性强度,采用短的密钥长度,意味着小的带宽和存储要求。

非对称签名算法的逻辑如图1-2所示。

图1-2 非对称签名算法序列图

3.Merkle算法

Merkle树算法,有时也称为Hash树,Merkle树的叶子是某个数据块的Hash(或者数据块),非叶节点是其对应子节点的组合Hash,如图1-3所示。

图1-3 Merkle树结构

在最底层,把数据分成各个数据块,计算Hash值与其对应形成Merkle树的叶子节点,自底向上,每两个节点组合Hash,构成上一层的节点。如果最底层的节点数量是单数,这种情况就直接对它进行Hash运算,往上推进,最终形成一个树形的结构。树根称为Merkle Root。

Merkle树的特点https://blog.csdn.net/wo541075754/article/details/54632929。

❏ 一种树形数据结构,大多数是二叉树,也可以是多叉树;

❏ 叶子节点的值是数据块或者数据块的Hash;

❏ 非叶子节点的值是根据最底层叶子节点的值按照Hash算法一层层计算得到的。

Merkle树在区块链中的作用:

❏ 高效的数字签名框架。每个账页的账页头都包括了账页体中各个事务集合的Merkle Root;

❏ 下载区块链账本数据后,可以快速有效判断数据是否被篡改过。

用Merkle算法进行数据比对将非常高效,如图1-4所示。

图1-4 使用Merkle算法进行数据比对

当两个Merkle树进行异同比对时,假设Node3的值发生变化,则会按照图1-4所示方向Root→Node1234→Node34→Node3的路径进行比对,最终定位到不同的数据。

4.编码算法

从严格意义来说编码算法称不上加密算法,其通常是为了应对用户可读性、文本记录或者网络传输需求而进行的编码要求。

例如,BASE58编码算法,为了避免视觉混淆,少了0、I、O、l等字符,一共是10+26×2-4=58个,通常用于数字资产地址生成,提高用户的可读性。

1.3.4 智能合约

法律学者尼克·萨博(Nick Szabo)在1995年提出智能合约的概念,智能全约是一套以数字形式定义的承诺,包括合约参与方可以在上面执行这些承诺的协议。

区块链中的智能合约的关键特征包括如下几点。

❏ 合约确权性。合约一经签署,生效后,无法修改,签署数据确权。

❏ 合约自动执行。合约采用程序语言方式编写,机器可读,合约的执行,无须人为执行,达到条件自动执行。

❏ 基于确定事件执行。简单说就是达到某种确定条件后,触发程序来自动执行约定的事务。这个确定条件一定是基于某个确定事件的,例如时间事件、开关量事件等。

注意

使用智能合约时,外部的确定事件如果产生于区块链内部,则其可信性比较高,但是,大量的外部事件是产生于区块链外的,故需要明确可信的事件源。

智能合约的这几个特征,可以将现实合同协议映射成区块链上的智能合约,部分解决合同协议执行的可信性问题。

区块链智能合约分为图灵完备智能合约和图灵不完备智能合约。图灵完备智能合约通常支持顺序执行、条件执行和循环执行三种语句,能够完成更加复杂的业务逻辑。Ethereum的EVM(Ethereum Virtual Machine)是典型的图灵完备智能合约,当前已经成为区块链智能合约的标杆。相反,图灵不完备智能合约不完全支持三种语句,适应的业务场景有限,通常采用时间事件、操作权限阈值和多签名等技术组合实现。

注意

图灵完备智能合约功能固然强大,但同时存在漏洞的可能性也比较大。由于区块链智能合约的确权性,合约一旦确权便无法修改,若合约存在漏洞,通常带来系统性风险(例如Ethereum的DAO事件),因此不是所有场景都适合使用图灵完备智能合约。图灵不完备智能合约可以更加简单、高效,出现漏洞的可能性将大幅度降低。不同的应用场景要根据自身的需求灵活选择。同时,图灵不完备智能合约的形式化验证比图灵完备智能合约的形式化验证更加简单高效。