区块链系列:重塑经济与世界+数字货币到信用社会+解码区块链全球应用与投资案例
上QQ阅读APP看书,第一时间看更新

二、区块链的工作原理

(一)拜占庭将军问题

拜占庭将军问题是容错计算中的一个老问题,由莱斯利·兰伯特(Leslie Lamport)等人在1982年提出。拜占庭帝国是5~15世纪的东罗马帝国,即现在的土耳其。拜占庭城邦拥有巨大的财富,使它的十个邻邦垂涎已久。但是拜占庭高墙耸立,固若金汤,没有一个单独的邻邦能够成功入侵。任何单个城邦的入侵行动都会失败,而入侵者的军队也会被歼灭,使其自身反而容易遭到其他九个城邦的入侵。这十个邻邦之间也互相觊觎对方的财富并经常爆发战争。拜占庭的防御能力如此之强,十个邻邦中的至少一半同时进攻,才能攻破。也就是说,如果六个或者更多的邻邦一起进攻,就会成功并获得拜占庭的财富。然而,如果其中有一个或者更多邻邦发生背叛,答应一起入侵但在其他人进攻的时候又不干了,会导致只有五支或者更少的军队在同时进攻,那么所有的进攻军队都会被歼灭,并随后被其他邻邦所劫掠。因此,这是一个由不互相信任的各个邻邦构成的分布式网络,每一方都小心行事,因为稍有不慎,就会给自己带来灾难。为了获取拜占庭的巨额财富,这些邻邦分散在拜占庭的周围,依靠士兵相互通信来协商进攻目标及进攻时间。这些邻邦将军想要攻克拜占庭,都面临着一个困扰,也就是拜占庭将军问题。

邻邦将军不确定他们中是否有叛徒,叛徒可能擅自变更进攻意向或者进攻时间。在这种状态下,将军们能否找到一种分布式协议进行远程协商,进而赢取拜占庭城堡攻克战役的胜利呢?这就是拜占庭将军问题。

针对拜占庭将军问题的解决方法包括:口头协议算法、书面协议算法等范捷,易乐天,舒继武.拜占庭系统技术研究综述[J].软件学报, 2013(6):12.。口头协议算法的核心思想如下:要求每个被发送的消息都能被正确投递,信息接收者知道消息的发送者身份,知道缺少的消息信息。采用口头协议算法,若叛徒数少于1/3,则拜占庭将军问题可解。也就是说,若叛徒数为m,当将军总数n至少为3m+1时,问题可解。然而,口头协议算法存在明显的缺点,那就是消息不能追根溯源。为解决该问题,提出了书面协议算法。该算法要求签名不可伪造,一旦被篡改即可发现,同时任何人都可以验证签名的可靠性。书面协议算法也不能完全解决拜占庭将军问题。因为该算法没有考虑信息传输时延、其签名体系难以实现且签名消息记录的保存难以摆脱中心化机构。

与已有方法相比,区块链技术将是更完美的解决方案。区块链是怎样来解决这个问题的呢?它为发送信息加入了成本,降低了信息传递的速率,并加入了一个随机数以保证在一段时间内只有一个矿工可以进行传播。它加入的成本就是“工作量”,区块链矿工必须完成一个随机哈希算法的计算工作量才能向各城邦传播消息。

当用户向网络输入一笔交易的时候,他们使用内嵌在客户端的标准公钥加密工具为这笔交易签名,这好比拜占庭将军问题中他们用来签名和验证消息时使用的“印章”。因此,哈希计算速率的限制,加上公钥加密,使一个不可信网络变成了一个可信的网络,使所有参与者可以在某些事情上达成一致。拜占庭将军问题的区块链解决方案可以推广到任何在分布式网络上缺乏信任的领域,比如说域名、投票选举或其他需要分布式协议的地方巴比特.比特币与拜占庭将军问题,http://www.8btc.com/baizhantingjiangjun.

(二)区块链工作流程

区块链的工作流程主要包括如下步骤(图2-6)。

①发送节点将新的数据记录向全网进行广播。

②接收节点对收到的数据记录信息进行检验,比如记录信息是否合法,通过检验后,数据记录将被纳入一个区块中。

③全网所有接收节点对区块执行共识算法(工作量证明、权益证明等。

④区块通过共识算法过程后被正式纳入区块链中存储,全网节点均表示接受该区块,而表示接受的方法,就是将该区块的随机散列值视为最新的区块散列值,新区块的制造将以该区块链为基础进行延长。

图2-6 区块链的工作流程

节点始终都将最长的区块链视为正确的链,并持续以此为基础验证和延长它。如果有两个节点同时广播不同版本的新区块,那么其他节点在接收到该区块的时间上将存在先后差别,它们将在先收到的区块基础上进行工作,但也会保留另外一个链条,以防后者变成长的链条。该僵局的打破需要共识算法的进一步运行,当其中的一条链条被证实为是较长的一条,那么在另一条分支链条上工作的节点将转换阵营,开始在较长的链条上工作。以上就是防止区块链分叉的整个过程。

所谓“新的数据记录广播”,实际上不需要抵达全部的节点。只要数据记录信息能够抵达足够多的节点,那么将很快地被整合进一个区块中。而区块的广播对被丢弃的信息是具有容错能力的。如果一个节点没有收到某特定区块,那么该节点将会发现自己缺失了某个区块,也就可以提出自己下载该区块的请求。

现在我们都知道了区块链网络里的记账者是节点,节点负责把数据记录记到数据区块里,为了鼓励节点记账,系统会按照规则随机地对记账的节点进行奖励。那么如何保证不会有人制造假数据记录或者说如何保证造假数据记录不被通过验证?这就涉及时间戳。这也正是区块链与众不同的地方。区块链不仅关注数据区块里的内容,也关注数据区块本身,把数据区块的内容与数据区块本身通过时间戳联系起来。时间戳为什么会出现?这是由区块链的性质规定的。节点把数据记入了区块,因此一个区块就相当于一页账簿,每笔数据在账簿中的记录可以自动按时间先后排列,那么账簿的页与页怎么衔接起来?也就是说,这一个区块与下一个区块的继承关系如何断定就成为问题。于是时间戳就出现了。

时间戳的重要意义在于其使数据区块形成了新的结构。这个新的结构使各个区块通过时间线有序连接起来,形成了一个区块的链条,因此才称为区块链。区块按时间的先后顺序排列使账簿的页与页的记录也具有了连续性。通过给数据记录印上时间标签,使每一条数据记录都具有唯一性,从而使数据记录本身在区块和区块上的哪个位置上发生可以被精确定位且可回溯,也给其他的校验机制协同发挥作用提供了极大的便利和确定性,使整个区块链网络能够确定性地验证某条数据记录是否真实。由于区块链网络是公开的,意味着系统知道过去发生的所有数据记录,而任何新的数据记录都继承于过去的数据记录,因为过去的数据记录是真实的,而且链条的各个区块记录由时间戳连接起来使之环环相扣,所以如果想要制造一个假的数据记录,就必须在区块链上修改过去的所有数据记录。尽管在挖矿的过程中,形成了多个链条,但因为最长的那个被诚实的节点所控制,所以想要修改过去的数据记录,首先就要从头构造出一个长度比之前最长的那个还要长的链条,在这个新的链条超过原来的那个链条后,才能制造双重支付的虚假数据。然而随着时间推移,制造新链条的难度和成本都是呈指数级上升的,而且随着链条越来越长,其难度也变得越来越大,成本也就越来越高。同时,因为去中心化的设置,区块链的各个核心客户端同时又是服务器,保存了区块链网络的完整数据,因此使对区块链网络的攻击很难像对传统的中央处理节点那样有效,一般情况下很难对区块链网络构成重大冲击。最终,区块链网络成为一个难以攻破的、公开的、不可篡改数据记录和制造虚假数据的诚实可信系统。

区块链保证数据安全、不可篡改以及透明性的关键技术包括两个方面:一是数据加密签名机制;二是共识算法。在数据加密签名机制中,首先,要有一个私钥,私钥是证明个人所有权的关键,比如证明某人有权从一个特定的钱包消费数字货币,是通过数字签名来实现的。其次,要使用哈希(Hash)算法。哈希散列是密码学里的经典技术,把任意长度的输入通过哈希算法计算,变换成固定长度的由字母和数字组成的输出,具有不可逆性。共识算法是区块链中节点保持区块数据一致、准确的基础,现有的主流共识算法包括工作量证明(PoW)、权益证明(PoS)、瑞波共识协议(RCP)等。以PoW为例,是指通过消耗节点算力形成新的区块,是节点利用自身的计算机硬件为网络做数学计算进行交易确认和提高安全性的过程。交易支持者(矿工)在电脑上运行比特币软件不断计算软件提供的复杂的密码学问题来保证交易的进行。作为对他们服务的奖励,矿工可以得到他们所确认的交易中包含的手续费,以及新产生的比特币。