既然区块链是一个去中心化的分布式系统,那么自然只能通过投票来决定一致性了:少数服从多数。当然,多少算多数呢?不同的共识算法下,结果并不相同。比如paxos算法(参见笔者的《paxos算法如何容错的–讲述五虎将的实践》)就是超过一半,而PBFT则需要三分之二以上。
这里有一个拜占庭将军问题需要注意,如何理解该问题可以参见这份翻译过的The_Part-Time_Parliament(Paxos算法中文翻译)文档。简言之,就是投票的拜占庭将军(服务器)们有2种不可靠的形式。第一是迟钝(数据包延迟)、失忆(数据包丢失以及数据包重发)、失踪(服务器宕机)等不含背叛的行为,第二则是有将军是间谍(服务器被攻破)。如paxos这样的算法属于第一种,Fault-tolerance,它不能容忍服务器上有恶意代码;而如PBFT(Practical Byzantine Fault Tolerance)这样的算法是第二类,Byzantine-Fault-tolerance,它能够容忍一定数量的拜占庭将军节点存在,如PBFT、SBFT、RBFT算法等。
第二类Byzantine-Fault-tolerance共识算法虽然看上去很美,但并不成熟,特别是性能低下,比如PBFT是一个多项式复杂度的算法O(N^2),节点过多时(大于100)性能急骤下降。第一类通常是O(N)复杂度,在某些场景下使用效果还不错,比如fabric v1.1的kafka共识机制就是这样的算法,下文我们会详述。
像比特币、以太坊等采用的共识算法又有所不同,例如比特币的POW工作量证明算法,它定义一小时内(通过调整运算难度实现,比如调整近似程度)有一个lucky node节点,该节点是通过证明自身的努力(hash值逆解)而幸运选出,选出后它就可以为这段时间的交易做决定(似乎挺像总统选举^_^)。详情参见我这篇文章:《区块链技术学习笔记》
区块链通过非对称加密技术实现身份验证与数据加密。其实就是我们日常在用的SSL技术。
为了方便理解,我们需要先介绍PKI(Public Key Infrastructure),它是一种遵循标准的利用公钥加密技术为电子商务的开展提供一套安全基础平台的技术和规范。有一个CA(Certificate Authority)权威机构负责向用户(包括服务提供者与使用者)提供数字证书,包括公钥与私钥,同时CA机构还需要提供一个CRL(Certificate Revocation List)证书吊销列表,如下面的图6所示。
图6-CA机构颁发数字证书以及提供CAL
这样,区块链可以通过PKI体系实现安全认证。PKI有三个关键点,我们下面详述。
比如Mary Morris符合X.509规范的数字证书里,其Subject属性里就含有她的信息,包括国家C=US、所属的州或者省份ST=Michigan、所在城市L=Detroit、所属单位O=Mitchesll Cars、其他信息OU=Manufacturing、公用信息CN=Mary Morris/UID=123456等,也含有其他信息,如下面的图7所示。
图7-PKI数字证书
CA颁发了两个证书:公钥与私钥,其中,私钥仅服务提供者保存,而公钥则可被所有人(服务使用者)保存。
所谓非对称加密,就是公钥加密的消息仅私钥可以解密;同理,私钥加密的消息,仅公钥可以解密。对应于前者,可以实现客户端访问服务器时加密消息,例如访问安全级别高的页面时提交的表单信息都需要用公钥加密,确保只有服务器才能解密网络报文。对应于后者,则可实现签名功能,如下面的图8所示。
图8-PKI中私钥签名后用公钥验签名
图8中Mary Morris用私钥对一段信息的内容(若内容过大则可先HASH后获得小点的字符串)加密后,生成签名附加在消息中。接收者可从CA机构获取到公钥,用公钥解密签名后,再与内容比对,以确定消息是否来自MaryMorris及内容是否被篡改。对于文件来说也是一样,小文件直接加密,大文件先生成hash再对hash加密,如下面的图9所示。
?
图9-对文件的签名
CA证书分为两类:RCA(Root CA)根证书以及ICA(Intermediate CA)中间证书。这些证书由RCA开始构成一个证书信任链,如下面的图10所示。