区块链技术概观(三):多数决的运作结构

时间:2019-07-27       来源:

在上篇中我们看到比特币如何实做区块的结构,但是资料结构是死的,系统的运作协议才是最麻烦的,我们这次来看这个系统是如何运作,以及运作中的各种细节。

多人参与多人共识

从上节看到区块的封存就是要靠大量电脑做 Proof-of-Works 来保证资料不可被修改,如果参与的电脑只有一台那就没什幺安全性可言,因此多人参与是第一个设计上的困难点。多人参与的系统最怕就是大家无法同步,因此比特币设计时採取一个极端保守的做法,每 10 分钟产生一个区块,每次全网讯息传播则要求 15 秒内完成,在这个情况下全域不同步的机率非常低,也就是理论上每台控矿主机自己产生的区块内容应该一模一样,至于其他数位货币则大多採取较先进的方法来处理这个问题,往后再来看。

那幺一个比特币系统中有什幺角色?可分类成以下数种:

一般使用者:仅打开电子钱包上传或接收和自己有关的交易资讯。

网路传播者:负责架构一个够快速的 P2P 网路,让使用者传送的讯息可以 15 秒内送达全网路参与区块处理者手上,也要负责将区块的资讯传播到全网路。Peer-to-Peer 网路通常都会先在用户下载的程式中写死一堆种子点,用户上线时会先和这个种子点注册要资料,如果有讯息也同时上传给大部分种子点,这些种子点也会向用户推荐其他新加入的种子点以加快网路速度。

区块处理者:也就是俗称的挖矿主机,是计算主力,负责产出这个时间内的区块,公告,并且计算出杂凑值。他们负责的动作很多,交易的合法性、时间等都由这群人经共识决产生,而历史本文也都留存在些挖矿主机上,因此除非攻击破坏大部分主机,否则先进区块链的资料不可能消失。多人合作的矿池主机则会把工作分给旗下矿工各自努力。

单纯矿工:单一用户自计算力很小,能找到杂凑值的机率几乎为 0,因此在比特币产生后没几年就有了矿池概念,矿池的主机就是区块处理者,但是矿池主机会将工作切分成许多小工作包丢给旗下各矿工去计算,其实也就是将种子数的範围和区块内容告诉矿工,让他们在这个範围找,若是没找到,就再换一个範围大家分着算。

交易如何开始的?

产生交易很简单,每个用户都有一个电子钱包,就是一个代表用户的地址,您只要由您的电子钱包把钱转给另一个用户地址就算一笔交易了。比特币的讯息传播及储存就是密码学大全,因此产生交易的同时,每个交易都会由电子钱包产生电子数位签章,每个比特币的用户都能使用您的公开金钥来验证这个交易是不是您本人发出的。接下来电子钱包软体会将这个交易资料上传到 P2P 网路让大家看到,挖矿机会将这交易收入当时的区块,等到上一个区块的杂凑值找到,就开始进行当时区块的公告以及找杂凑值。一旦找到杂凑值,就进入历史文本,无法修改或否认了。

公开金钥系统

比特币的讯息传播动用了许多密码学的技巧,因此公开金钥系统就变成必然会用到的技术。当您在申请比特币地址时,系统会产出 3 个资料:第一个是您的私密金钥,第二个是由私密金钥经过 ECC 产生的公开金钥,第三个则是由公开金钥经过 Hash 产生的钱包地址。

公开金钥系统的设计精神很简单:使用这个系统的用户可以用私密金钥加密或产生电子签章,其他用户可使用您的公开金钥来检验电子签章是否正确,保证文件内容没有修改过。

因此一切的加密源头就来自随机乱数产生、长达 512bit 的种子数,数学上来说就是一组椭圆曲线上的座标,经过椭圆曲线密码学的步骤可算出另一组座标,它可以公开给其他人看,称之为公开金钥。平时就是利用私密金钥把我们发布的交易讯息做数位签章,任何一个人只要拿到您的公开金钥就可以验证您的讯息有没有符合数位签章内容。

在一个不强调去中心化的系统,公开金钥是可以放在某个公开网站供大家查询核对,但在去中心化的系统,比如私人 email,就只能夹在讯息中,或用其他路径或讯息来分开传送了。比特币的用户公开金钥就是放在交易讯息栏位的一个程式化区块内。那幺就产生一个问题:我怎幺知道这个栏位的公开金钥真是属于比特币地址 XXX 的所有者呢?答案也不难,因为比特币的地址就是故意设计由公开金钥经过 Hash 手法产生的,我们只要拿对方的公开金钥进行一次 hash ,马上就可知道这个公开金钥对不对了!

以上讲了许多公开金钥系统的方法,其实可以使用一个简单的图来画出整个密码验证的步骤:

如前所述,交易栏位的公开金钥放置在一个可程式化的栏位,提供一种类似 Fourth 的语言,可进行一些简单的动作,用来确认交易是否合法,最简单的当然就是花钱的人自愿提供公开金钥让全体挖矿机承认这是一笔合法交易;不过也有複杂一些的可让好多位用户一起转帐并必需集满 N 个用户的公开金钥来解锁这笔交易。大多数比特币电子钱包中,我们都只要输入私密金钥就可以启动任何交易,因为公开金钥及钱包地址可由私密金钥算出来。因此妥善保管您的私密金钥就变成非常重要的事,包括使用加密压缩、印出来锁进保险箱、埋到祖坟里(比较可怕点)都是很好的保管方式。把明码的电子文件档存在硬碟里、拍照放在手机里、把明码文件放到 Dropbox 等都是错误的方法,有一天一定会出事。

共识型的协定

比特币的发展一直有一个崇高的政治正确指南:去中心化,不让大权落入少数权贵者之手。因此所有行为模式都是去中心化,採取共识决。但是共识型的协定其实非常难写,而且在实做上由于网路必然有时间落差,因此有可能产生一些不同步的情况,我们先来看看比特币和共识有关的有那些:

区块的产生:每个挖矿在收集到各个交易讯息后会在上个区块被装进历史文本后立即自行产生新的区块内容。区块内容并没有统一公告的人来告诉大家这个区块应该长什幺样子,但由于挖矿程式的规格一致(事实上大多数挖矿程式这部分全都是抄原作来的,没人敢自己乱写),所以只要出现交易讯息都一样,大家产生的区块内容也一定会一样。那幺要是真的有人不一样时怎幺办呢?我们之后再来聊聊究竟要怎幺办。

总之区块的产生包括了交易内容、产生多少比特币等重要内容是一样的,只有少数可以微调,包括交易时间以及是由谁发现这个区块的解。值得一提的是由谁发现区块解这个栏位(也就是产生新比特币的栏位),基本上是在区块产生时挖矿机就先填好自己的钱包地址了,所以它也是区块内容的一部分,千万不要以为有人可以等着接收别人的答案然后再公告成自己的钱包地址,如果真这样做,hash 验算就不会通过了。

区块的封装:每一个挖矿机都会依照自己的意志来决定要不要承认某个区块。通常这同样是抄原作,因此大家的原则全部都一样,不会有差异。同样的问题来了:如果真有人就是乱改程式来乱会怎样?基本上,现今的系统中,如果你自己封装错误的区块进入自己的历史文本,那幺在此之后您所有的区块再也不会被大家接受,因为从那个有问题的区块开始您的历史文本就和大家断鍊了!而且您公告那个开始错误的区块本身就不会被接受。

马可夫链的竞争:这也就是链的长度竞争(所以无论专家学者怎幺说,长度还是很重要的!),事实上就算我们撇除骇客捣蛋的可能性,区块链还是可能出现不同步的情况!也就是这笔交易很可能在部分挖矿机上已被加入本次区块了,但在其他挖矿机上因为网路阻塞等问题,被安排在下一个区块!这时就看运气了,若是没有这笔交易的区块比较早算出来,那幺大家会先承认这个区块,但在下个区块产生之前,如果有这笔交易的区块先出来了,那幺仍然有修正的可能!这个也就是马可夫链的作用,比特币使用马可夫链进行二元排列,同时也可以确定这两个最新的区块谁包括的内容较多,通常包括正确内容较多的那个链就会取代较短的链,这个部分也写死在程式中。相同的,如果您的程式是自己乱改的,不承认其他人的共识,那幺您的区块就因为和他人不一样而永远被大家视为断链,再也挖不到矿了!除非您的算力超过全网 50%,永远比人早算到 hash 解,这样才有可能主导整个链的发展。

这也就是先进区块链技术中许多人不断强调的邪恶 50% 或正义 50%。我们在看比特币交易时,包括一般区块勘察网站,都会在区块后方标注一个 Confirms 栏位,这个栏位其实就是指本区块自产生后,在它后面又产生了多少区块,大家还记得在第一篇中笔者就表明了,愈早的区块愈安全!因此 Confirm 为 1 或 2 的区块事实上常常会被改变(即便没有骇客来乱也是一样,因为马可夫链的长度竞争),如果金额比较大的交易要确认被封装在历史文本中无法再被修改,通常收钱的那方都会要求等到 6 个 confirms 才会和您确认交易成功,也就是 1 个小时之后。

总结

我们在共识型协定中,可以看到必须大家的行为都一样才能得到整体正确的运作结果。如果有少数人不一样,那幺大多数人都会拒绝承认这些结果,包括不按照协定承认较长的区块、随便安插交易内容(比如明明只有 1 元却在交易中写转出 100 元给某人)、窜改交易内容或挖到矿的节点钱包位置等等。

▲ 比特币的交易步骤总结图。

(首图来源:shutterstock)

延伸阅读:区块链技术概观(一):让我们从历史文本说起区块链技术概观(二):资料分割与密码学