终于知道该如何解释什么是区块链了

本文中,笔者将化繁为简,试着把区块链技术中的每个元素都使用生活化的例子比拟,让区块链爱好者与初学者不需用到密码学/经济学/资讯科学,也能领会区块链技术的精髓之处。

前言

我们熟知的世界正在慢慢地被区块链技术瓦解与重建。不论背景,有愈来愈多人想对区块链技术一探究竟,或许更进一步成为从业者、贡献者或布道者。

不幸的是,初学者若想学习区块链技术,第一个问题可能会是高学习门槛,这是因为目前在各种主流平台上所流传的区块链知识或资源,都不免会大量使用艰涩的术语,长久以来便塑造出区块链高大上的距离感,好似区块链是只专属于一小群骇客或者专业人士才能理解的技术。然而这是不准确的,事实上,区块链技术中许多概念都能用一般常识理解,顶多只需要国小数学。

本文中,笔者将化繁为简,试着把区块链技术中的每个元素
本文将提及的概念如下:

  • 什么是帐本?
  • 什么是交易?
  • 为什么需要区块?
  • 有哪些共识机制?
  • 区块链安全吗?
  • 智能合约如何运作?

区块链:一个公平的记录系统

简单来说,区块链技术旨在打造一个去中心化的(Decentralized)状态纪录系统,更准确一点:区块链技术旨在打造是一个追求真正「公平」的系统。

区块链实现公平的关键在于:

它完全仰赖自然法则运作,只透过一系列精细的规则就能保证系统的正确,这打破了人类社会一直以来的仰赖的中心化系统,使促成不平等的最大因素不复存在。

区块链技术可以打造出具世界规模的去中心化运算平台,由数千甚至数万个参与者共同维护状态并提供计算资源。如果这个运算平台是应用在货币与资产的场景中,那么这个平台可被称为分散式帐本。

在接下来的段落,笔者将用一个例子展示一个极度精简、只用纸跟笔的就可以运作的分散式帐本。在这个例子中,一群学生可以使用区块链技术发行属于他们自己的虚拟币:「考卷币」(Exam Paper Coin, EPC)。

考卷币:使用区块链技术发行的虚拟币

考卷币(EPC)是一种使用区块链技术发行的虚拟币,并存在于分散式帐本中。它的用途是为考卷加分,这将会吸引想考高分或者担心被当的人学生持有。为什么EPC 只能被称作虚拟币,而不被称作密码货币?

这是因为EPC 的发行不会使用任何有关密码学的技术,因此EPC 严格来说不是密码货币。

在分散式帐本被创建之初,没有任何人拥有EPC ,那么EPC 是怎么「铸造」与分配的?

至少可以肯定的是,EPC 不能凭空产生,否则所有参与者就能不断制造EPC,使分散式帐本崩溃。事实上,EPC 的价值奠基于参与者的「付出」。

分散式帐本中最重要的角色非记帐者莫属。每当记帐者成功完成工作,它便可以获得固定数量的EPC 作为报酬。于是,分散式帐本中的EPC 便如此逐步地被铸造出来。将EPC 赋予具有贡献的记帐者除了能够公平分配EPC,同时也是一种激励机制(Incentivizing Mechanism),提供参与者维护帐本的动机。

那么每个人所具有的EPC 是怎么记录在帐本中的?

帐本: EPC 都要记录下来

帐本即为依时间顺序与特定格式记录价值的系统。在分散式帐本中,每一批纪录都会由某一个特定的「记帐者」维护,而记帐者会以特定的规则从所有的参与者中选出,因此分散式帐本是具有多个「记帐者」的系统。

为了确保能公平选出EPC 的所有记帐者,分散式帐本不会使用任何记帐者的个人资讯,例如姓名、电话,做为帐本上的识别。记帐者可以自由地使用假名(Pseudonym)作为帐本上唯一的识别(Identifier),或者称为地址(Address)。所以王小庭同学可以使用Alice 这个假名,而且如果王小庭同学喜欢的话,他也可以同时使用Bob 这个假名。

EPC 使用如下的格式记录每个地址币的数量:

  • Alice 100 EPC
  • Bob 0 EPC
  • Charlie 0 EPC
  • David 0 EPC
  • Eva 0 EPC

多数区块链称其识别为地址(Address),其为非对称密码学中公钥(Public Key)的杂凑值(Hash)。地址具有统一的格式,例如以太坊的地址为长度160位元的16进位数字。

交易:把我的EPC 转移给别人

EPC 是可以转移的,现在Alice 可以将它持有的100 EPC 中的60 EPC 转移给Bob,以帮助Bob 在下一次考试中免于被当。这样的转币纪录称为交易(Transaction, Tx),可以如下表示:

  Tx1 
  60 EPC, from [Alice] to [Bob]

而这笔交易会由Alice 以上述格式记在纸条上,以Tx1 表示。

签章:让参与者的所有动作都不可抵赖

EPC 的每个参与者的每个行为,例如交易,都必须附带签章(Signature),证明「这个动作确实是由我本人发起的」,签署者不可抵赖,任何没有附带签名的动作都是不被承认的。一个附带签名的交易纸条会像这样:

  Tx1 
  60 EPC, from [Alice] to [Bob], ALICE

签章分为签署(Sign)及验证(Verify)两个动作。验证即是确认签章是否确实是由行为发起者所签署。在这个例子中,仅用一个简单的验证:若签章与识别相符,则验证成功。例如Tx1 中,签名ALICE 确实与交易发起者Alice 相符,因此验证成功。

签章就是区块链的数位签章(Digital Signature),其使用私钥(Private Key)签署,公钥(Public Key)验证,非常难以伪造。

讯息的散布:怎么让所有参与者都收到讯息?

由于Tx1 是由Alice 发起的,因此Alice 将于它自己的帐本记下这笔交易,接着Alice 必须把这笔交易的内容也转达所有的参与者,让所有参与者皆具有所有的交易内容。

EPC 的参与者们不以口语,而是以传纸条的方式互相交换讯息。纸条要如何有效率地传播讯息给所有在教室中的参与者呢?可以使用「一传十、十传百」的策略。

也就是:一次传10 张纸条给自己周围的参与者,参与者收到后再抄写10 次后传给周围尚未收到该纪录的其他参与者,逐步将讯息扩散致所有参与者。

这样的传播策略正如同流言被散布的方式,因此也被称为流言散布协定(Gossip Protocol)。纸条传播的网路就是对等网路(Peer-to-peer Network),纸条就是对等网路的封包(Packet)。

区块:记录一段时间内的交易顺序

经过一段时间之后,每个EPC参与者手上都会有许多来自别的参与者的纸条,每张纸条都记载着不同的交易。在理想状况下,如果所有参与者收到纸条的顺序都相同,且每个参与者都收到了所有纸条,则所有参与者的帐本上的状态,也就是余额,都会相同。然而,若采用上述的讯息散布策略,会发生两种情况:每个参与者收到纸条的顺序会不同,或者某些纸条可能会被遗漏。这些情况都会让每个参与者的帐本产生差异,使帐本不可靠。而一个不可靠的帐本,不能作为货币发行的工具。

有没有办法能使所有EPC 参与者用相同的交易顺序记帐呢?这便是区块链技术的奥秘之处。

为此,我们需要使用一个精心设计的结构:区块(Block)。每个参与者皆会将一段时间内收到的交易纸条的编号,依照自己的顺序写在另一张纸条上,这张纸条就是区块纸条,简称区块,产出区块的参与者则称为区块生产者。收到区块纸条的其他参与者便会知道区块生产者在这段时间内的交易顺序。

为了要让所有帐本都具有一致的状态,EPC 的所有参与者必须要选出其中一个区块作为所有参与者的共识(Consensus)。所有参与者都必须要遵照共识区块的交易顺序来更新自己的帐本,而这个区块生产者就是记帐者。由于记帐者可以获得报酬,因此在利益的驱使下,所有参与者都会努力生产区块以争取记帐权。

值得注意的是,每个区块当中都会记录前一个已达成共识的区块的编号。例如接下来的范例,Bk15 的前一个已达成共识的区块为Bk3:

  Bk15

  Last Block: Bk3

  Height: 15

  Transactions:
  – Tx1 
  – Tx5 
  – Tx4 
  – Tx10 
  – Tx7 
  – Tx13

  Nonce: 1

  Signature: CHARLIE

由于每个新的共识区块都会指向前一个共识区块,如此便会形成一条长链般的结构,已形成共识的区块接成一条链,这就是区块链(Blockchain)名称的由来。而当EPC 参与者在收取共识的区块后,将按照共识依序为每个交易内容进行帐本余额的转换。如此,所有的帐本都将具有一致的状态。

依据特定输入及转换函数(Transition Function)执行状态更新的系统,称为状态机复制(State Machine Replication)

摘要:浓缩纸条上的讯息

在介绍达成共识的方法前,笔者要先来介绍一个朴实无华但重要的概念:摘要(Digest),其顾名思义就是一段内容经过消化的产物。假设有一种摘要产生器,这个机器可以放入一张纸条,然后透过3 个步骤计算出纸条的摘要。

  1. 摘要产生器将记载讯息的纸条切成一条一条固定宽度的细长条状纸带,如下图:
  2. 将这些纸带依照顺序接成一个长条纸带。纸带上有字迹的黑色部分与没字迹的白色部分会出现不规则相间,测量每个黑色区块之间相邻的距离,如下图:
  3. 每段距离的数字相乘后的数字就是这个纸条的摘要(Digest)。

每个EPC 参与者都会有一台摘要产生器,而它需要上紧发条才能开始工作,且每计算完一张纸条便须重新上一次发条。

摘要的计算虽然简单,却具有一些很有用的特性:

首先,摘要会随着纸条内容的变动而更动。只要更动了任何一点纸条内容,例如区块的交易顺序,或者流水号(Nonce),都会使摘要改变。因此一个附上摘要的纸条,可以让收到纸条的人在收到后再自行计算一次摘要并比对两者,以验证纸条的内容是否被修改过。因此,摘要是可验证的(Verifiable)。

若想在不更动摘要的情况下同时变动纸条内容,只能不断尝试用不同内容产生摘要,直到发生碰撞(Collision) — 意即两个不同内容的纸条出现相同摘要。

其次,摘要也是单向的:一个纸条很容易产出摘要,但摘要很难还原出原本的纸条内容。这也代表摘要是随机且难以预测的,因此摘要可以作为一种乱数(Random Number)来源。

正式的区块链使用更难预测且更不易碰撞的的密码杂凑函数(Cryptograpgic Hash Function)产生讯息摘要。

理解关于区块链技术的基本要件后,接下来就来看看区块链技术的精妙之处:共识机制。

共识机制:如何达成共识?

在区块链技术中,大致上有两种方式可以产生共识:抽彩(Lottery)或表决(Vote),它们各自有不同特性,每一种分散式帐本都会使用其中之一作为共识机制。

抽彩

在抽彩机制中,唯有摘要小于门槛值的「合法」区块才会被所有参与者收受。然而,区块生产者无法预测摘要,且可验证的摘要使区块生产者难以作弊。因此若想生产数字小于门槛值的摘要,区块生产者必须不断改动区块内容,例如流水号或者交易顺序,直到找到摘要小于门槛值的区块,就像抽彩一样。只有合法的区块才会被区块生产者散布给其他EPC 参与者。

在这样的规则下,可能会同时出现多个合法区块。还记得区块链中「链」的部分吗?当收受多个低于门槛的区块时,该选哪个区块作为上一个区块呢?这里我们可以用一些简单的规则来做抉择:选择合法区块中高度(Height)最高的区块,若高度一样则选择摘要数字较低的区块。

区块纸条的摘要就是正式区块链中的区块杂凑值。在正式的区块链中,门槛值愈低,困难度(Difficulty)也愈高。区块的选择规则也称为分岔选择规则(Fork Choice Rule),使用可验证的乱数作为共识的做法又称为中本共识(Nakamoto Consensus)。

表决

有别于复杂的抽彩,表决机制相当直观:所有参与者针对某个预先选出的领袖(Leader)的提案(Proposal),也就是区块,进行投票。领袖是怎么选出的?一个直觉的做法是按照假名的顺序,按照Alice / Bob / Charlie 的顺序,所有参与者轮流担任领袖。

所有参与者在收到提案后,可以选择同意或反对这个区块的内容,若同意的话,则将自己对提案的同意票记在纸条上,并将这个投票纸条散布给所有其他参与者。若多数的参与者同意了提案,则所有参与者皆须认定该提案为共识。

然而,表决机制虽然直观,却不如抽彩具有可验证性,参与者若想作弊则相对容易:例如,参与者可以重复投票,或者串通其他参与者一起不投票,以破坏帐本;另一方面,表决比抽彩来得有效率,因其不需要所有参与者都费功去制造可能将不被收受的区块。

拜占庭错误(Byzantine Fault)特指这些不在预期内的行为,表决机制事实上也就是拜占庭容错(Byzantine-fault-tolerant, BFT)演算法。PBFT 家族的协定是目前拜占庭容错演算法的主流,然而其至多只能容忍不超过参与者总数一半的拜占庭错误。

女巫:如何避免帐本被单一个体掌控?

上文提到:为了保证公平的记帐权,帐本上的识别都是假名,如上文提及,Alice跟Bob实际上都是由同一个参与者王小庭所控制,其他参与者不仅难以得知,而且王小庭喜欢的话,他爱用几个假名就用几个假名— 掌控多个假名的王小庭就成为了「女巫」(Sybil)。

不论是采取何种共识机制,女巫的存在都会破坏分散式帐本的安全性:

  • 在抽彩机制中,如果多数的参与者皆由女巫控制,则女巫有很大的机会可以无视规则,不需抽彩便窜改帐本。
  • 在表决机制中,如果由女巫控制的参与者可以集体进行不在预期内的行为,例如重复投票或者不投票。

因此,抵抗女巫对于分散式帐本的安全至关重要。对此,一个直觉的思路是:让每个假名的行为都必须付出有限的资源,例如钱跟力。因此有两种方式可以抵抗女巫:要嘛出钱,要嘛出力。

  • 出力:在抽彩机制中,每个合法区块的生产都必须附有低于门槛的摘要,而摘要的计算需要参与者出力不断地重上发条。
  • 出钱:在表决机制中,抵押一定数量EPC 的参与者才能获选为领袖被生产提案,且若违反规则,参与者的押金将会被没收。

出力即是工作证明(Proof of Work, PoW);出钱即是权益证明(Proof of Stake, PoS),抵抗女巫的机制称为抗女巫机制(Sybil-control Mechanism)。

合约:进行条件式的交易

回顾一下本文开头所提:区块链技术可以用来打造去中心化的运算平台,它可以用以记录任何资讯,不止余额,例如一段合约(Contract)。合约就是指一段会依据不同条件而达成不同执行结果的语句。例如:

  CheckAndPay 
给定A、B两个假名,若A的余额大于/等于30 EPC,则A支付20 EPC给B ,否则A不支付任何EPC。

这个合约就可以被记录在帐本中:

  Alice 100 EPC 
  Bob 0 EPC 
  Charlie 0 EPC 
  David 0 EPC 
  Eva 0 EPC

  CheckAndPay “给定A、B两个假名,若A的余额大于/等于30 EPC,则A支付20 EPC给B ,否则A不支付任何EPC。”

之后Alice 就可以发起像这样的交易:

  Tx 99 
  CheckAndPay, {[Alice], [Bob]}, ALICE

如此,若Alice 的EPC 余额不足30 EPC 则不会支付Bob。

触发合约的Tx 99 ,它的执行过程比较烦琐:执行Tx 99 的参与者首先会从帐本中寻找CheckAndPay 的合约内容,并从Tx 99 中取出合约需要的输入:A 与B,接着参与者再解读合约的语句,依照条件进行帐本的状态转换。其中,为了使参与者能解读合约,合约需用所有参与者皆能看懂的语言书写。

合约又称智能合约(Smart Contract)。正式的区块链使用虚拟机(Virtual Machine)来解读与执行合约。事实上,智能合约能做的事情非常多,这使具有智能合约功能的分散式帐本得以成为去中心化的运算平台,例如以太坊(Ethereum)。

总结: 分散式帐本究竟是一个怎样的系统?

如果以上环节皆运作顺利,那么便能成功只用纸笔便发行了专由学生使用的货币。最后再次强调一次:这是一个为了便于使初学者掌握核心观念而极度简化的例子。正式运行的区块链,例如以太坊,其实际运作远远复杂得多。

还有一些比较进阶的概念,虽然碍于篇幅未在此文章提及,但部分主题笔者曾撰文介绍:

  • 可扩展性(Scalability):第二层方案(Layer 2)与分片(Sharding)
  • 隐私(Privacy)与匿名(Anonymity)
  • 共识机制的安全性(Safety)与活跃性(Liveness)

最后,如果日后朋友/家人问起什么是区块链时,我想你会知道如何解释了:)


本文链接地址:https://www.wwsww.cn/qkl/2556.html
郑重声明:本文版权归原作者所有,转载文章仅为传播更多信息之目的,如作者信息标记有误,请第一时间联系我们修改或删除,多谢。