笔者记得当比特币开始受注目时,经常看到有评论和报导将比特币和区块链混为一谈。这一两年随着越来越多的区块链项目的实施,特别是各式各样区块链平台的出现,今天我们反而要掌握的一个课题是,怎样的架构才算是一个区块链?换句话说,一个区块链应该有哪些元素?
初接触区块链的朋友一般的学习方法都是先选择某一个区块链平台,深入研究那个平台的特性。笔者也是先由「比特币」开始,再扩展至其他平台例如「以太坊」(Ethereum) 和Hyperledger Fabric(尚未见到有适合的中文译名,以下会保留这个名称)。而本文却是笔者在接触过不同的区块链平台后作的分析和总结,希望为各位带来另一种学习方式:先从总体认识区块链架构,之后当各位在研习某一个区块链平台时,可以比对这篇文章的介绍,从而较为系统性的掌握区块链不同的部份。
以下我会介绍区块链的三个要素:网络、账本和智能合约。
区块链是由节点构成的网络
所谓网络,就是由多于一部机器连接而成,即我们所称的节点(node),各个节点通常运行同一组软件,这些软件已备有相互沟通的功能,即我们经常说的P2P (Peer -to-Peer) 通讯模式,而非今天主流的客户— 服务器(Client-Server) 模型。今天大部份区块链平台均以互联网互相连结,按需要节点之间的通讯可作加密处理。
在不同的区块链上,节点可能带有不同的功能。例如Hyperledger Fabric 上的Peer 节点负责管有账本和执行智能合约(稍后有更详细介绍),但Orderer 节点则只负责将交易(Transactions) 排序和构建新的区块(Block);「以太坊」的节点可以只是单单管有账本和执行智能合约,同时有些节点也可选择加入挖矿(Mining) 角色来构建新的区块等等。
按不同的实施模式,节点的数量有所不同。在公开使用的区块链平台如「比特币」和「以太坊」,任何人在任何地方任何时间都可加入或离开网络,不需要一个中央组织去批准。这种区块链网络我们称为Permissionless Blockchain。因此节点的数目就经常浮动。在本文写作时(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 Fabric 则按大家协定和需要指定一些节点Peer 负责执行,得出的结果经过Orderer 排序后以区块模式发送给所有Peer 更新他们的账本。(当然,因为各节点各自独立执行合约编码,现实是有可能出现不一致的情况。各平台在设计时已包括机制处理这些情况。)
智能合约的编写会用上编码语言。不同平台有不同的语言,例如以太坊用的是Solidity,一种新的合约语言,而Hyperledger Fabric 使用多种,由最初的Go,发展到后来的Node 和Java。
结语
这篇文章主要以区块链的一些共同特性而加以讨论。日后当大家深入研究某一区块链平台时可以找出这三个重要元素:网络、账本和智能合约的功能。
本文链接地址:https://www.wwsww.cn/qkl/6546.html
郑重声明:本文版权归原作者所有,转载文章仅为传播更多信息之目的,如作者信息标记有误,请第一时间联系我们修改或删除,多谢。