本文为《区块链到底在干嘛〈上〉用生活化的例子轻鬆学会区块链技术的重要概念》,为动区专栏作者“邱骏”所著。文中,笔者将化繁为简,试著把区块链技术中的每个元素都使用生活化的例子比拟,让区块链爱好者与初学者不需用到密码学/经济学/资讯科学,也能领会区块链技术的精髓之处,本文同步刊载于邱骏 Medium。
(传送门:《新手知识|区块链到底在干嘛〈下〉区块链安全吗?共识机制?智能合约如何运作?》)
我们熟知的世界正在慢慢地被区块链技术瓦解与重建。不论背景,有愈来愈多人想对区块链技术一探究竟,或许更进一步成为从业者、贡献者或佈道者。
不幸的是,初学者若想学习区块链技术,第一个问题可能会是高学习门槛,这是因为目前在各种主流平台上所流传的区块链知识或资源,都不免会大量使用艰涩的术语,长久以来便塑造出区块链高大上的距离感,好似区块链是只专属于一小群骇客或者专业人士才能理解的技术。然而这是不准确的,事实上,区块链技术中许多概念都能用一般常识理解,顶多只需要国小数学。
本文将提及的概念如下:
- 什麽是帐本?
- 什麽是交易?
- 为什麽需要区块?
- 有哪些共识机制?
- 区块链安全吗?
- 智能合约如何运作?
以下正文开始:
区块链:一个公平的记录系统
简单来说,区块链技术旨在打造一个去中心化的(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 个步骤计算出纸条的摘要。
- 摘要产生器将记载讯息的纸条切成一条一条固定宽度的细长条状纸带,如下图:
2. 将这些纸带依照顺序接成一个长条纸带。纸带上有字迹的黑色部分与没字迹的白色部分会出现不规则相间,测量每个黑色区块之间相邻的距离,如下图:
3. 每段距离的数字相乘后的数字就是这个纸条的摘要(Digest)。
每个 EPC 参与者都会有一台摘要产生器,而它需要上紧发条才能开始工作,且每计算完一张纸条便须重新上一次发条。
摘要的计算虽然简单,却具有一些很有用的特性:
首先,摘要会随著纸条内容的变动而更动。只要更动了任何一点纸条内容,例如区块的交易顺序,或者流水号(Nonce),都会使摘要改变。因此一个附上摘要的纸条,可以让收到纸条的人在收到后再自行计算一次摘要并比对两者,以验证纸条的内容是否被修改过。因此,摘要是可验证的(Verifiable)。
若想在不更动摘要的情况下同时变动纸条内容,只能不断尝试用不同内容产生摘要,直到发生碰撞(Collision) — 意即两个不同内容的纸条出现相同摘要。
其次,摘要也是单向的:一个纸条很容易产出摘要,但摘要很难还原出原本的纸条内容。这也代表摘要是随机且难以预测的,因此摘要可以作为一种乱数(Random Number)来源。
正式的区块链使用更难预测且更不易碰撞的的密码杂凑函数(Cryptograpgic Hash Function)产生讯息摘要。
(理解关于区块链技术的基本要件后,下半集将会带读者们来看看区块链技术的精妙之处:共识机制)