笔者记得当比特币开始受注目时,经常看到有评论和报导将比特币和区块链混为一谈。这一两年随着越来越多的区块链项目的实施,特别是各式各样区块链平台的出现,今天我们反而要掌握的一个课题是,怎样的架构才算是一个区块链换句话说,一个区块链应该有哪些元素

初接触区块链的朋友一般的学习方法都是先选择某一个区块链平台,深入研究那个平台的特性。笔者也是先由「比特币」开始,再扩展至其他平台例如「以太坊」(Ethereum) 和Hyperledger Fabric(尚未见到有适合的中文译名,以下会保留这个名称)。而本文却是笔者在接触过不同的区块链平台后作的分析和总结,希望为各位带来另一种学习方式:先从总体认识区块链架构,之后当各位在研习某一个区块链平台时,可以比对这篇文章的介绍,从而较为系统性的掌握区块链不同的部份。

以下我会介绍区块链的三个要素:网络、账本和智能合约。

区块链是由节点构成的网络

所谓网络,就是由多于一部机器连接而成,即我们所称的节点(node),各个节点通常运行同一组软件,这些软件已备有相互沟通的功能,即我们经常说的P2P (Peer -to-Peer) 通讯模式,而非今天主流的客户— 服务器(Client-Server) 模型。今天大部份区块链平台均以互联网互相连结,按需要节点之间的通讯可作加密处理。

在不同的区块链上,节点可能带有不同的功能。例如Hyperledger Fabric 上的Peer 节点负责管有账本和执行智能合约(稍后有更详细介绍),但Orderer 节点则只负责将交易(Transactions) 排序和构建新的区块(Block);「以太坊」的节点可以只是单单管有账本和执行智能合约,同时有些节点也可选择加入挖矿(Mining) 角色来构建新的区块等等。

按不同的实施模式,节点的数量有所不同。在公开使用的区块链平台如「比特币」和「以太坊」,任何人在任何地方任何时间都可加入或离开网络,不需要一个中央组织去批准。这种区块链网络我们称为Permissionless Blockchain。因此节点的数目就经常浮动。在本文写作时(2019年3月),比特币有超过一万个节点,而「以太坊」则有八千六百多个,分布在全球各大洲上。

取自网站https://bitnodes.earn.com/(2019年3月)

至于商用的区块链平台就不一样。商用区块链的节点通常只放在参与的机构和监管机构内,而非任何未被批准的机构或个人可以参与。因此,节点的数量会和参与机构数目有关。例如一个由七间银行组成的「区块链贸易融资平台」,即使每间银行有两个节点,总数不会超过二十个节点。

物理上这些节点构成一个可靠稳妥的架构。理论上节点数目越多,分布越广,网络越坚固,而受阻断服务攻击(DoS, Denial of Service) 的机会越少。这是因为每个节点拥有一份相同的数据结构,在区块链我们称之为「账本」Ledger(或称为账簿)。

各节点共同拥有一个相同的账本

这是区块链一个非常重要的元素。技术上「账本」是一个数据结构,之所以称为账本,主要是因为这个数据结构用作保存一笔又一笔的交易纪录,功能上就如一本账本。而事实上,我们所讨论的「区块链」更准确的说法是「分布式账本技术」(Distributed Ledger Technology),而「区块链」是「分布式账本技术」实现的一种方法。为免把事情复杂化,我们还是沿用「区块链」作讨论。

所谓的「共同拥有」,并非一个「共同使用的物理或逻辑结构」,就如我们说几台电脑共用一个储存装置(硬碟或档案系统)一样。「区块链」所说的「共同拥有」,是各节点各自管有这个数据架构。节点之间的数据架构互不从属,没有物理关系,但它们之间的内容保持相同。

何以各节点管有自己的数据架构而又内容可保持相同这就是区块链其中一个令人着迷的地方。这个「数据同步」(容许我这样说)的过程称为达致「共识」Consensus。不同区块链会基于不同原因使用不同的共识方法。如「比特币」和「以太坊」这些公共区块链需要使用Proof of Work这个方法生成新的区块,而当中亦涉及经济诱因(incentive),结果是成千上万的节点向数据达致「同步」这个方向发展。又例如Hyperledger Fabric 是按已定下的政策由指定的Peer 节点处理交易,交给Orderer 节点排序,最后由每个Peer 节点确认才记在账本上,这也是一种使数据达一致的手段。

目前区块链中「共识」这个题目还在发展中,不少人还在投入大量的研究,希望从各方面去改善达致共识的办法。我们悉目以待。

此外,这个「数据架构」是否就是我们沿用很久的「数据库」(Database)虽然两者都是储存数据的手段,但区块链的数据架构和一般的数据库有着明显的分别。区块链的数据架构通常包含两个部分:交易记录和整体状态(World State)。前者比较易明,就是记录每一笔的交易纪录,而后者则是交易处理过后的状态。

举一个简单例子,如果现在的状态是「我有一百元,而你有二百元」,当一笔交易「我给你五十元」处理后,状态就变为「我有五十元,而你有二百五十元」。但常用的「数据库」就有较广泛的用途而不单只是记录交易和状态。此外,区块链的交易记录只能叠加在现有的记录之上,不能(或不易)删除或更新一些已存在的交易记录。「数据库」则弹性更大,一般可以增加、阅读、更新和删除(CRUD)。

这里我们终于触及到「区块链」这个名词了。上述的交易记录是以「区块链」的模式存在。简单地说,这些交易会放在一个区块内,而区块与区块之间利用密码学(Cryptography) 的技术连结起来成为一个链状结构。新来的交易会加入在新的区块,而新的区块就接在现存的链上,如此这条「区块链」就随时间增长。

区块链的一个重要特性,就是数据写上后不易被修改或删除,而且修改的记录很容易被其他节点发现而拒绝接受。这是因为区块链的构造透过密码学和其链状架构,以及达致共识的机制得出的果效。以刚才的例子,不论是要删去「我给你五十元」这笔交易记录,又或者将整体状态中的「我有五十元」改为「我有五千元」,几乎成为不可能的事。

至于谁来建立区块和维持这条区块链不同的平台有不同的做法。「比特币」和「以太坊」的区块链是由「采矿节点」(Mining Node or Miner) 透过竞争生成区块,而管有区块链的节点就按既定协议来维护节点上的区块链。Hyperledger Fabric是由Orderer 节点生成区块,而每个Peer 节点收到区块后,再确认当中交易才放入Peer 节点上的区块链。

最后,虽然称为「账本」,所有记录并不限于和金钱或货品交易。理论上任何资料也可以记在这个数据架构,而记在区块链的资料都有着刚才所讲的特性。如果有留意新闻,去年就有人将两韩的「板门店宣言」写在以太坊上。理论上只要以太坊一天还存在,这笔记录都会永远留存。

可编程的智能合约

智能合约(Smart Contract) 并不是区块链发明,然而,在区块链架构中智能合约扮演一个重要的角色。

智能合约是一些编码(code) 或程式(program),透过编码反映出各参与方的计划和意愿。它之所称为「合约」,是因为在区块链的应用场景中,「智能合约」可视为交易双方或多方共同接受的事项,有如商业上的「合约」;它之所以是「智能」 ,是因为这个编码落实在区块链时,节点会照编码所定的步骤和逻辑(logic) 自动执行,最重要的还是执行结果同步于整个区块链网络(即每一节点)。

沿用上述的例子,「我给你五十元」可以是一个单一而明确的交易,但也可反映现实一个有条件性的合约,例如:「如果你明天把这份文件送到我的公司,我给你五十元」。这个「我给你五十元」交易会否出现,要视乎这个条件有没有发生。当然,现实商业世界的合约条款要更复杂,但只要可以以编码模式写成智能合约,还是可以在区块链的平台执行的。

智能合约的例子(取材自Hyperledger Composer)

技术上来说,智能合约可以更新账本。这个更新涉及产生新的交易记录,和修改整体状态。因为这涉及更新区块链中最重要的数据架构,智能合约必须要反映真实参与各方的意愿(大家都接受这些合约内容和相关编码),按照指定的检定机制(例如合约的执行要由哪些机构确认)等,甚至引入第三方的监察或审计等。

智能合约作为编码,必然在某个地方执行。在区块链的平台上,节点负责执行智能合约,而且是由多个节点各自进行。例如以太坊是每个节点都会执行智能合约,由于是同一份合约编码,如果大家都有着相同的账本,执行后的结果理论上应该是相同,从而更新账本。而Hyperledger Fabric 则按大家协定和需要指定一些节点Peer 负责执行,得出的结果经过Orderer 排序后以区块模式发送给所有Peer 更新他们的账本。(当然,因为各节点各自独立执行合约编码,现实是有可能出现不一致的情况。各平台在设计时已包括机制处理这些情况。)

智能合约的编写会用上编码语言。不同平台有不同的语言,例如以太坊用的是Solidity,一种新的合约语言,而Hyperledger Fabric 使用多种,由最初的Go,发展到后来的Node 和Java。

结语

这篇文章主要以区块链的一些共同特性而加以讨论。日后当大家深入研究某一区块链平台时可以找出这三个重要元素:网络、账本和智能合约的功能。