今 年春节回家的时候,我像往常一样应付着各种问题,诸如做什么工作的?什么时候结婚?一个月挣多少钱?但是,今年,我的答案似乎不能让他们满意,原因是当我说起我在一家区块链技术公司工作的时候,随之而来的是一个80%的人会追问的问题,什么是区块链?
我试图引用百度上的概念去解释,也试图告诉他们我们用区块链技术做了哪些厉害的事情,但是他们仍然不明白区块链是什么——不能简单点说吗?
于是,我意识到,百度上的概念以及学术杂志的解释或许不能让他们满足,于是我开始沉迷于博客、知乎,想看看大家都是如何解释区块链这个晦涩又抽象的概念。在这中间,有两篇文章对我的影响很深,一篇是知乎上的一个热门话题“如何向弱智室友解释区块链”,另一篇是博客频道用户“张童鞋”的一篇名为“区块链上的共识机制”的文章,在下面的阐述中我也部分引用了他们的观点并尝试了他们讲故事的方式。
2016年,包括摩根大通、花旗集团、高盛集团、纳斯达克等在内的金融巨头,都表达了对区块链技术的热衷。这些巨头们热衷的区块链技术,又被称为分布式账本,那么分布式账本究竟是什么呢?我们先从另外一件事说起。
在纳斯达克成立之前,人们用自行车驮着装满债券的包,在华尔街骑来骑去,目的就是尽快完成清算。后来业务越来越多,自行车就忙不过来了。20世纪60年代,华尔街每周只交易4天,每天4个小时,就是为了能让清算速度跟上交易量。
图2–1华尔街上骑自行车的人
这样发展下来,大家觉得不行啊,自行车肯定跑不过计算机。1971年,有人就开会说,咱们想想办法吧,于是提出了DTC(美国存管信托公司)清算系统。这个系统的办法就是所有的交易都要在系统内进行,包括经纪人也要接入这个系统,现在纳斯达克还在用。
很明显,它的问题只是换了一辆可以踩油门的自行车。我们常常看到一些影视剧里,皇上、一家之主的去世导致整个国家和民族陷入混乱甚至崩溃,根本原因就在于中央集权这种系统是没办法长存的。当交易足够多、经纪人足够多的时候,我们发现,这个系统也有瘫痪甚至崩盘的危险。
图2–2 中心化的DTC清算系统
于是专家们想,自治式、分布式的系统会不会好一点呢?答案是肯定的。区块链就是一个分布式的账本,每个节点都可以显示总账,然后维护总账,而且不能篡改账本,除非你控制了超过51%的节点,但这是不可能的。
再简单一点,假如你们家里有个账本,让你来记账。在以前,就是爸爸妈妈把工资交给你,让你记到账本上——想想还是有点小激动的。中间万一你贪吃,想买点好吃的,可能账本上的记录会少十几块,然后你想买个手机,账本上就少记录几千块。这只是举一个例子,我相信小时候大家都想从爸爸妈妈的口袋里拿点钱来花。
图2–3 中心化的家庭账本
但有了分布式账本后,这些问题就不会有了,因为你在记账,你爸爸也在记账,你妈妈也在记账,他们都能看到总账,你不能改,爸爸妈妈也不能改,这样想买烟抽的爸爸和想贪吃的你都没办法啦。
区块链本质上是一个去中心化的分布式账本,其本身是一系列使用密码学而产生的互相关联的数据块,每一个数据块中包含了多条经比特币的网络交易有效确认的信息。
图2–4分布式家庭账本
前面我们说到了区块链的本质是一个去中心化的分布式账本,那么,所谓的中心化又是什么呢?我们首先思考这样一个问题,你要在网上买一本书,交易流程是什么?
第一步:你下单之后把钱打给了支付宝。
第二步:支付宝收款后通知卖家可以发货了。
第三步:卖家收到通知后给你发货。
第四步:你收到货之后很满意,于是确认收货。
第五步:支付宝收到了你的通知并打钱给卖家。
图2–5 中心化的交易流程
我们可以看出,在这个过程中,虽然你是在和卖家交易,但是整个交易都是围绕支付宝展开。因此,如果支付宝系统出了问题,比如天上降下来一块陨石,把支付宝的服务器全砸了,或者由于全球经济危机支付宝倒闭了,无奈的支付宝只好淡然地表示不存在这笔交易,那么这笔交易就会以失败告终,到时候买家卖家就会纠缠不清,双方无法自证。
图2–6 中心节点毁坏会导致交易失败
为了说明去中心化的区块链是如何运行的,我们先把整个去中心化的分布式结构简化为一个极端的情况来探究。我们假设有一个去中心化的小城市,在这个城市里有5个可爱活泼的小伙伴,他们互相借钱的时候,是这么干的:
假设B向A借了1块钱,这个时候,城市里的人怎么办呢?A在人群中大喊:“我是A,我借给了B1块钱!”B也在人群中大喊:“我是B,A借给了我1块钱!”
此时城市里的其他人C、D、E都听到了这些消息,他们拿出了手中的小账本并默默记下:“某年某月某日,A借给了B1块钱。”
图2–7 去中心化城市的记账
当我们把一个去中心化的模型极度简化之后,我们就会发现,在这个只有5个人的城市中,已经建立了一个去中心化的系统,这个系统不需要银行,也不需要支付宝。这个模型不需要信任关系,也不需要一个拥有公信力的组织。当分布式结构中的每个人都记账的时候,篡改账本是不可行的。比如B突然不认账了:“我不欠A的1块钱!”这个时候,人民群众C或D或E就会站出来说:“不对,我的账本上明明记录了你在某年某月某日向了A借了1块钱,并且没有查到你还款的记录。”
图2–8 去中心化账本无法篡改
说到这里,你有没有发现一个问题,在这个模型中,所谓的1块钱根本不重要,也没有人在意,“1块钱”已经变成了一个变量,它可以被替换成任何概念,只要大家承认这是一个有价值的东西即可。
比如A在这个城市中大喊一声:“我创造了一个巴拉拉能量!”城市中的其他人都听见了,于是大家纷纷在自己的小本子上记下“某人有一个巴拉拉能量”,大家甚至不用知道巴拉拉能量是什么,A竟然真的有了一个巴拉拉能量。之后呢?A还能干什么呢?A可以再大喊一声:“我给了B一个巴拉拉能量。”
图2–9 巴拉拉能量的流通
只要城市中的B、C、D、E,即城市里的所有人都承认了这个交易,那么这个交易就真的成立了,虽然现实生活中并没有巴拉拉能量。
当然,区块链的世界不会这么简单,它还有其他的规则来相互制约,我们先来解决下面这几个问题:
凭什么你对着天空大喊一声,别人就要帮你记账,别人的时间不要钱吗?别人的小本子不要钱吗?于是,为了让大家都帮我记账,我增加了一条新的规则,我决定给第一个听到我喊话并且将其记录在小本子上的人奖励。奖励机制也很简单,第一个听到我喊话并记录下来的人,可以得到一个巴拉拉能量的奖励。
这个巴拉拉能量不是白给的,是对你劳动的报酬,就像打工可以挣钱一样,你帮我记账,整个系统都会给你报酬。你要做的事情,有这样几点:首先,你要抢在所有人之前听到了我的喊话并记在了自己的小本子上;记录之后,你还要马上告诉整个城市里的人——这句话我记录完了,你们再记录也没有用了,别人就会放弃这笔赚钱的生意;与此同时,你还要做一件事,就是给自己的记录加一个独一无二的编号,然后把记录和编号一起喊出来,于是,下一个人再记录的时候,就会带着这个记录和独一无二的编号继续下去。
图2–10 记账获得奖励
在这条新的规则开始实行之后,一定会有这样一些人,他们为了得到巴拉拉能量,开始屏气监听周围发出的各种声音,只为了能在第一时间记下一条新的记录。
这个时候,对区块链有所了解的读者是不是想到了这样的名词——“比特币挖矿”。没错,这就是比特币挖矿的简单说明。
关于比特币挖矿的话题,知乎用户“玲珑邪僧”的一篇文章举过一个更生动的例子,大致是这样的:单身男士们要找女朋友,“国民岳母”说,我有好多肤白貌美、乖巧可爱的女儿,这样吧,我给你们出一个旷世难题,解出一个就给你们其中一个姑娘的微信号。
于是,单身男士们疯狂竞争,想破脑袋去解这道旷世难题。只要其中一位单身男士解出一道题,就立马得意扬扬地昭告天下,示威全部单身男士,这个姑娘的微信号是我的啦,先到先得,你们放弃吧。其他单身男士虽然已经算到一半了,但是没有办法,速度不够快啊,只好立马去解下一道题。
图2–11“国民岳母”的旷世难题
图2–12 解出难题获得奖励
同时,首个成功破解旷世难题的幸运的单身男士不仅不用付一二十万元的彩礼,被其才华征服的“国民岳母”还会给这位单身男士一笔巨额财产做嫁妆,也就是比特币挖矿中的比特币奖励。
在这一段的论述中,我们引用了知乎用户“汪乐–LaiW3n”的说法。在这个广阔的小城市里,一定还会存在这样的问题,B和C几乎同时记录完了,于是同时向天空大喊了一声,“这个编号89757的巴拉拉能量归我了”。但是,由于这个城市太广阔了,有的人会认为这个编号89757的巴拉拉能量归B,也有的人认为这个编号89757的巴拉拉能量归C,但是编号89757的巴拉拉能量只有一个啊,只有一个人能得到,怎么办呢?一人一半?当然是不可能的,这个时候我们会采用更原始简单的规则来解决,谁长听谁的。
在不加任何限制条件的情况下,这件事件会发展成这样:一部分人认为这句话是B说的,在听到这句话之后开始记账,之后他们所做的所有事情都是基于B有了编号89757的巴拉拉能量这个事实,并且随着这个信息一次次地传下去,这条信息链会越来越长;而另外一群认为C先说这句话的人,也会按照这样的趋势发展。
图2–13 分叉问题听谁的?
这下事情严重了,原本是一条唯一的、编号顺序严谨的总信息链,在B和C喊出“这个编号89757的巴拉拉能量归我了”这句话之后,硬生生地分叉了!这还得了,要是这种情况延续下去,每个人手里的账本都变得不一样了,而且根本没法确定哪个是真的!
为了解决这个问题,小城市又追加了新的区块链规则,记录的时候必须顶格写,而且要保证,中心在离田字格上边缘0.897 57毫米的位置上,于是,每个人写字的时候都要拿刻度尺量好之后再写,这非常困难,每个人的记录需要5分钟才能完成,因此,写这句话所用的时间变得不同了。于是,只要有人高喊“我写完了!那句话是某某某写的”,其他正在写这句话的人便会停笔,然后在小本子上重新开始写“那句话是某某某写的,上一句的编号是×××”。
图2–14每次记账的规则都很复杂
双花问题是指一笔数字现金在交易中被重复使用的现象。如果我同时向B和C都喊了一句,我给你一个巴拉拉能量,怎么办呢?巴拉拉能量只有一个,如何保证一个巴拉拉能量在实际的交易中只被支付了一次呢?
我们以比特币为例,中本聪在《比特币白皮书》第五小节中是这样说的,运行比特币网络的步骤如下:
1. 新的交易向全网进行广播;
2. 每一个节点都将收到的交易信息纳入一个区块中;
3. 每个节点都尝试在自己的区块中找到一个具有足够难度的工作量证明;
4. 当一个节点找到了一个工作量证明,它就向全网进行广播;
5. 当且仅当包含在该区块中的所有交易都是有效的且之前未存在过的,其他节点才认同该区块的有效性;
6. 其他节点表示他们接受该区块,而接受的方法则是跟随在该区块的末尾,制造新的区块以延长该链条,并将该区块的随机散列值视为新区块的随机散列值。
也就是说,交易发生的一刻起,比特币的交易数据就被盖上了时间戳;而当这笔交易数据被打包到一个区块中后,就算完成了一次确认;在连续进行6次确认之后,这笔交易就不可逆转了;在比特币中,每一次确认都需要“解决一个复杂的难题”,也就是说每一次确认都需要一定的时间。
图2–15 6次确认后不可逆转
在这种情况下,当我试图于把一笔资金进行两次支付交易的时候,因为确认时间较长,后一笔交易想要与前一笔交易同时得到确认几乎是不可能的,而这笔资金在第一次交易确认有效后,第二次交易时就无法得到确认。区块链的全网记账需要在整个网络中达成共识,双花问题是无法产生的。
图2–16 双花问题无法产生
在讲解区块链的工作原理之前,我们先将区块链中涉及的几个核心概念做一个简单的阐述。
区块作为区块链的基本结构单元,由包含元数据的区块头和包含交易数据的区块主体构成。
区块头包含三组元数据:
1. 用于连接前面的区块、索引自父区块哈希值的数据;
2. 挖矿难度、Nonce(随机数,用于工作量证明算法的计数器)、时间戳;
3. 能够总结并快速归纳校验区块中所有交易数据的Merkle(默克尔)树根数据。
图2–17 区块头的结构
区块链系统大约每10分钟会创建一个区块,其中包含了这段时间里全网范围内发生的所有交易。每个区块中也包含了前一个区块的ID(识别码),这使得每个区块都能找到其前一个节点,这样一直倒推就形成了一条完整的交易链条。从诞生之初到运行至今,全网随之形成了一条唯一的主区块链。
哈希算法是区块链中保证交易信息不被篡改的单向密码机制。哈希算法接收一段明文后,以一种不可逆的方式将其转化为一段长度较短、位数固定的散列数据。
它有两个特点:
1. 加密过程不可逆,意味着我们无法通过输出的散列数据倒推原本的明文是什么;
2. 输入的明文与输出的散列数据一一对应,任何一个输入信息的变化,都必将导致最终输出的散列数据的变化。
图2–18 哈希算法的两个特点
在区块链中,通常使用SHA–256(安全散列算法)进行区块加密,这种算法的输入长度为256位,输出的是一串长度为32字节的随机散列数据。 区块链通过哈希算法对一个交易区块中的交易信息进行加密,并把信息压缩成由一串数字和字母组成的散列字符串。区块链的哈希值能够唯一而准确地标识一个区块,区块链中任意节点通过简单的哈希计算都可以获得这个区块的哈希值,计算出的哈希值没有变化也就意味着区块中的信息没有被篡改。
图2–19 区块链中的哈希算法
在区块链的话题中,我们还经常听到这样的词汇——公钥和私钥。这就是俗称的不对称加密方式,是对以前的对称加密方式(使用用户名与密码)的提高。
我们用电子邮件加密的模型来简单介绍一下:公钥就是给大家用的,你可以通过电子邮件发布,可以通过网站让别人下载,公钥其实是用来加密/验章的。私钥就是自己的,必须非常小心保存,最好加上密码,私钥用来解密/签章,私钥由个人拥有。
在比特币的系统中,私钥本质上是32个字节组成的数组,公钥和地址的生成都依赖私钥,有了私钥就能生成公钥和地址,就能够花费对应地址上面的比特币。私钥花费比特币的方式就是对这个私钥所对应的未花费的交易进行签名。
图2–20 区块链中的公钥和私钥
在区块链中,使用公钥和私钥来标识身份,我们假设区块链中有两个人,分别为小白和小黑,小白想向小黑证明自己是真实的小白,那么小白只需要使用私钥对文件进行签名并发送给小黑,小黑使用小白的公钥对文件进行签名验证,如果验证成功,那么就证明这个文件一定是小白用私钥加密过的。由于小白的私钥只有小白才能持有,那么,就可以验证小白确实是小白。
在区块链系统中,公钥和私钥还可以保证分布式网络点对点信息传递的安全。在区块链信息传递中,信息传递双方的公钥和私钥的加密与解密往往是不成对出现的。
图2–21使用公钥和私钥完成一笔交易
信息发送者:用私钥对信息进行签名,使用信息接收方的公钥对信息加密。
信息接收方:用信息发送者的公钥验证信息发送者的身份,使用私钥对加密信息解密。
区块链中的时间戳从区块生成的一刻起就存在于区块之中,它对应的是每一次交易记录的认证,证明交易记录的真实性。
时间戳是直接写在区块链中的,而区块链中已经生成的区块不可篡改,因为一旦篡改,生成的哈希值就会变化,从而变成一个无效的数据。每一个时间戳会将前一个时间戳也纳入其随机哈希值中,这一过程不断重复,依次相连,最后会生成一个完整的链条。
图2–22 区块链中的时间戳
区块链利用Merkle树的数据结构存放所有叶子节点的值,并以此为基础生成一个统一的哈希值。Merkle树的叶子节点存储的是数据信息的哈希值,非叶子的节点存储的是对其下面所有叶子节点的组合进行哈希计算后得出的哈希值。
同样地,区块中任意一个数据的变更都会导致Merkle树结构发生变化,在交易信息验证比对的过程中,Merkle树结构能够大大减少数据的计算量,毕竟,我们只需验证Merkle树结构生成的统一哈希值就可以了。
图2–23 区块链中的Merkle树结构
前文我们说到了区块链中的几个核心概念和定义,那么,区块链究竟是如何运行的呢?要解决这个问题,我们就不得不先从比特币开始聊起。说起比特币,许多人的第一反应就是比特币病毒。下面我们就从比特币病毒这一事件引入,聊一聊比特币究竟是什么,有哪些特性。
还记得被比特币支配的恐惧吗?
那一天,早上醒来,你发现屏幕上弹出一个丑陋的红框框。
你异常激动,终于不用写论文了。
图2–24 比特币病毒入侵
2017年5月12日,网上发生了一件微小的事情,众多学校、医院的文档都陆续被一个叫“永恒之蓝”(WannaCry)的勒索蠕虫病毒锁住了:想看资料,可以;交钱,也不需要太多,300个比特币就行。有人一看瞬间觉得,只用300个,这么少。其实,一个比特币的价格在中国差不多等于一万元,这还是因为中国的比特币平台正处于监管期不能提现,国外的价格就更高了。当然,对于个人用户来说,是不需要给这么多钱的,毕竟并不是谁都有300多万元的。
图2–25需要比特币赎金才能解锁
黑客想让大家用比特币支付,不过这事本身和比特币还真没什么太大关系。比特币就是一种币,本来安静地在旁边躺着,早上醒来却发现自己上头条了。截至2017年5月16日,已经有150多个国家的30多万用户受到“迫害”了,而且,有消息显示,“永恒之蓝”病毒已经升级为2.0版本了,新版本病毒不受域名限制,传播性更高。
图2–26“永恒之蓝”
那么,这个比特币病毒究竟是什么东西呢?它可以被视为由两种东西混合开发出来的神奇病毒——加密算法勒索病毒和“永恒之蓝”黑客工具。“永恒之蓝”黑客工具负责开道,不需要点击直接入侵别人的电脑,然后加密算法勒索病毒垫后,对你的文件加密之后再进行勒索。
加密算法勒索病毒其实是个“老朋友”了,世界上第一个有记录的勒索软件Cryptolocker诞生于1989年,它其实就是一种用加密算法来勒索钱财的程序,后来,病毒制造者没几天就被抓获了。
图2–27Cryptolocker病毒制造者被抓获
其实,Cryptolocker最开始是很好破解的,因为它最开始使用的是对称加密算法,编个程序逆向破解一下就可以了,但是,现在流行的勒索病毒Wallet、Onion使用的却是非对称加密算法。非对称加密算法的加密和解密过程使用两个密钥,因此,单纯靠逆推是不可行的,我们在后面会具体讲解一下。
然而,这次的黑客不仅改进了勒索蠕虫病毒,还搭配了一个“好伙伴”——“永恒之蓝”黑客工具,不需要你点击任何链接,它就可以直接占领你的计算机。“永恒之蓝”病毒还有一个美丽的传说,据说它原本是美国国家安全局用来窃取其他国家信息的工具,是“美国武器库”中的一种。美国国家安全局旗下有一个黑客组织叫“方程式组织”,负责替美国政府做一些不可告人的事情,后来,因为闻名天下的伊朗核试验的“震网”事件以及后来的“棱镜门”事件逐渐为人所知。
图2–28非对称加密算法无法逆推
图2–29“美国武器库”的传说
后来,有个叫“影子经纪人”的黑客团队,把“美国武器库”破解了。然后,他们在网上拍卖,想把这些“武器”换成钱。然而,没人理他们,于是,他们发起众筹,企图利用这些“武器”赢利,依然没什么人理他们。最后,一气之下,在2017年4月14日,他们直接把这批“武器”公开了。于是“永恒之蓝”黑客工具和加密算法勒索病毒就成为一款“杀伤性武器”。
图2–30影子经纪人的传说
当然,这件事只是一个美丽的传说,美国国家安全局也没有承认,所以,“永恒之蓝”究竟从何而来众说纷纭,并没有实际考据。
首先,“永恒之蓝”黑客工具是利用Windows(微软公司的操作系统)漏洞来攻击的,也就是说,只要更新Windows补丁,并开启防火墙的主动防御,基本上,这个工具就没有了生存的土壤,然而,Windows漏洞总是不断更新,说不定什么时候黑客搭配一个攻克新款漏洞的工具,就又生出了各种变种病毒,比如“永恒之红橙黄绿青蓝紫”之类的。
图2–31 升级防火墙
我们知道,勒索病毒使用非对称加密算法进行加密,其最突出的特点就是不可篡改和不可逆,加密和解密过程使用的是两个不同的密钥。
图2–32非对称加密算法不好破解
现在的计算机无法完成倒推所需要的计算量,或者说,算出来的成本太高了。现在全球热议的最领先的区块链技术使用的就是非对称加密算法,也就是说,黑客是站在时代最前沿的科技的肩膀上设计密码,我们想要破解没那么容易。
图2–33站在巨人的肩膀上
我们可以回想一下那个家喻户晓的“熊猫烧香”病毒最后是怎么被破解的?写病毒的黑客被抓住之后,自己编了套程序破解了,而这次的情况也类似,最可能的解决方法就是,把黑客抓住之后,让黑客把他手里的密钥交出来,我们输入密钥之后就可以解封了。
图2–34 黑客交出密钥
黑客到底什么时候会被抓到,怎么抓?这就涉及我们探讨的第三个问题了,为什么黑客非要用比特币支付呢?因为比特币的匿名性,换句话说,你不容易抓住他。比特币是一种网络虚拟货币,可以在全世界流通,具有匿名性,这便于黑客隐藏身份。你不需要知道对方是谁,只需要一个比特币地址就可以点对点地给对方打款。同时,比特币的世界性和流动性也是黑客选择比特币的理由,比特币在数字货币中占有最大的份额,它在全世界中拥有很多“粉丝”,很多国家都承认了比特币的合法地位,一些大型企业也接受比特币支付。
图2–35比特币的全球性
但是,黑客想要逃脱法网也不是那么容易的,因为比特币的特点之一就是不可篡改,所有的记录都是无法篡改的,并且公开可查。一旦黑客公布的比特币地址收到了比特币,那么账本上就多了一笔记录,每个人手里的账本会同步更新。每个人都能查到这个记录,之后这个地址的各种转账、提现记录也都是可查的。只要黑客进行了比特币提现这类需要和现实交互的操作,就一定会露出蛛丝马迹。
图2–36比特币交易记录公开可查
实际上,在大多数情况下比特币本身并不是百分之百匿名的。发送和接收比特币,就像作者用笔名发表作品一样。如果一个作者的化名和他的身份联系在一起,他曾经写下的任何东西都会与其联系在一起。
对于个体来说,比特币的匿名性与你接收比特币的钱包有关。涉及该地址的每一项交易都将永久保存在该区块链中。如果你的地址和你的真实身份相关,那么每一项交易都会和你有关。
现在,许多国家都把比特币交易平台纳入监管范围,交易需要多重实名认证。因此,只要黑客露出与现实相关的蛛丝马迹,就有可能被抓到。
图2–37比特币并不是百分之百匿名
图2–38多重实名认证
第一招:搜索
现在,请打开你的任何一个浏览器,在输入框里输入“如何预防比特币病毒”,你就会发现铺天盖地的解决方法,随便找一个点开看就行了,毕竟都一样,无非是断网、设防火墙、阻止445端口、升级Windows补丁。在这里,建议大家都养成长期打开防火墙的习惯,虽然Windows的防火墙总是时不时弹出,但是,安全终归最重要。
图2–39第一招:搜索
第二招:以毒攻毒
预防了这次的病毒攻击,下次再遇到怎么办呢?你可以尝试这么操作:黑客不是要加密我们的重要文件吗,比如后缀为doc(文档)、xls(电子表格)、ppt(演示文稿)、psd(图片文件)之类的文件;而对于一些冷门格式的视频和种子文件,黑客总不会加密吧,所以,除了重要文件要多备份几遍之外,我们还可以把所有的重要文件做成压缩包,然后改成一个莫名其妙的格式(比如后缀为“modv”)。当然,这一招并不能完全断绝重要文件被破坏的可能性。
图2–40第二招:以毒攻毒
第三招:占坑抢位
这一招最绝的一点就在于,走黑客的路,让黑客无路可走,所以适用于程序员:自己编一套经非对称加密的“病毒程序”,把自家电脑的文件都加密,密钥保存在自己手里,每次查看前先输一遍密钥。这样就是麻烦点,但是它有用啊!“此坑是我的,想毒我,没门儿!”
图2–41 第三招:占坑抢位
最后需要说的一点是,目前中国的比特币平台是不能提现的,因此,若想要缴纳赎金也需要谨慎考虑。毕竟,我们并不知道缴纳赎金之后是否能百分之百地解锁并免受病毒的二次入侵。面对病毒,我们需要冷静,再冷静啊。
图2–42缴纳赎金后解锁失败
其实,作为和区块链、比特币相关的从业者,从病毒暴发的那一刻开始,我就收到七大姑八大姨的各种电话问候:听说你们公司研究的玩意儿都成病毒了,你们公司不会跑路吧……白天被各种围追堵截询问:您好,请发表一下对此事的看法,到底什么时候才能抓到?
比特币之所以被黑客当作勒索的工具,确实是因为它具有匿名性、去中心化等方便黑客隐藏身份的某些特性,但我始终认为,技术本身是无罪的,比特币抑或区块链都不应该背黑锅。
图2–43技术本无罪
如图2–44所示,在区块链中,所有的节点向上回溯,都会到达源头,即区块链中的第一个区块,也就是“创世区块”。
图2–44比特币工作流程
在“创世区块”诞生之后,比特币的用户通过不断地“做题”,即通过计算寻找满足特定SHA–256哈希值对应的数值解。这个过程就是比特币中的“挖矿”。
当任意一个用户优先计算出符合要求的数值解时,就会在全网范围内广播,而网络中的其他节点收到这条信息会进行验证,若通过验证,其他节点就会放弃计算,并将新创建的区块加到前一个区块的后面。
图2–45 计算特定哈希值的数值解
随着越来越多的人加入比特币的区块链系统,一个又一个哈希值的数值解被找到,在不断重复的过程中,新的区块不断地生成、验证,最终形成一个主链。同时,哈希算法的难度也会调整,以此控制用户们解出数据所用的时间。
而在比特币的实际交易过程中,假设比特币中的用户A和B之间要完成一个交易,包含这笔交易的区块向区块链中的所有用户发布广播,全网用户通过验证哈希值来确认这笔交易是否有效,一旦被认证为有效,这个区块就会被加盖时间戳,然后被添加到区块链主链上。
图2–46 加盖时间戳
区块链的本质是一个互相验证的公开记账系统。这个系统所做的事情,就是记录所有账户发生的所有交易。每个账号的每笔数额变化都会被记录在全网总账本中。而且每个人手上都有一份完整的账本,每个人都可以独立统计出有史以来比特币系统每个账号的所有账目,也能算出任意账号当前余额是多少。
由于所有数据公开透明,任何人都可以去查看它的源代码,人们便会信任这套去中心化的系统,而不担心里面是否隐藏着什么阴谋。
2009年比特币诞生,如今,其市值已达数百亿美元,众多人为之疯狂(注意,根据政策规定,比特币不是货币)。最近,有人预测,比特币到了不得不分叉的时候,甚至可能会暴跌。
图2–47 比特币会分叉吗
中本聪在设计比特币的时候,是2009年,那个时候数据能有多少?更何况也没有多少人使用比特币。于是他一拍脑袋决定了,比特币中一个区块的容量就是1M(兆字节)吧。而一笔交易是250字节甚至更多,现在一些交易基本达到了500字节。容量不够用啊!
我们来算笔账:
比特币一个区块的容量是1M,
1M=1 024KB(千字节)=1 048 576字节,
那么一个区块包含的交易总数为:1 048 576÷250≈4 194.3(笔)。
比特币中一个区块确认的时间是10分钟,
10分钟=600秒,
那么一个区块每秒能处理的交易数为:4 194.3÷600≈7(个)。
图2–48 1M的容量不够用
如果一个区块每秒只能处理7笔交易,要是交易数据再大点,可能连7笔都达不到。这样会造成一个结果,比特币上的交易拥堵而缓慢。一笔交易发生之后,前面还有好多交易在排队等待确认,到底要等到什么时候啊?总有一天堵塞到一定程度就会超过容量极限,然后就崩溃了!
图2–49 区块需要扩容
出了问题怎么办呢?改啊!
怎么改啊?中本聪消失了啊!
那找谁啊?中本聪把系统维护交给了5个极客!
哦,怎么改啊?
听我的,改成2M;不,听我的,改成20M!
很多人代表各方的利益群体提出了自己的扩容方案!
1. Bitcoin Classic(比特币经典版),此方案认为应该将这个字段的最大值调到2M,并且以后有计划取前2 016个区块大小的中位数再乘一个约定好的倍数来决定下一批区块的大小上限。
2. Bitcoin XT(比特币新版),此方案认为这个值应该修改为20M,并且每两年翻一番,直到上限值达到8.3G(千兆字节)。
3. Bitcoin Unlimited(比特币无限版),此方案认为这个值多大都行,甚至可以无限大,由矿池决定其大小。
图2–50 扩容方案意见不一
每个人都觉得自己是对的,谁也说服不了谁,怎么办啊?比特币不升级了?不行啊,还是要升级的!那么问题就来了,要是做出来一个升级版本,所有人都直接升级成了新版,就没有分叉问题了,全世界大升级大和谐啊。但是,有人的地方就有纷争,有的人升级,有的人不升级。这可好了,乱套了,用的系统都不一样,那要如何统一呢?
图2–51方案不同可能会导致分叉
不同的理念催生出了多种扩容方案,各个方案间无法统一,于是比特币分叉了。其实,随着时间的流逝,方案所提出的容量大小也随之增长,莫非,这不是价值观的原因而是世界观的原因?
分叉怎么还分软硬呢?简单来说就是兼容性的不同,软分叉是暂时的,硬分叉是永久的。
区块链发生永久性分歧,在新共识规则发布后,部分没有升级的节点无法验证已经升级的节点生产的区块,通常硬分叉就会发生。
图2–52 硬分叉结构图
硬分叉的定义是这样的:硬分叉是指比特币的区块格式或交易格式(这就是广泛流传的“共识”)发生改变时,未升级的节点拒绝验证已经升级的节点生产出的区块,不过已经升级的节点可以验证未升级节点生产出的区块,然后大家各自延续自己认为正确的链,所以分成两条链。
图2–53 硬分叉是什么
硬分叉的特点如下:
1. 没有向前兼容性,之前的版本将不可再用,需要强制升级;
2. 在区块链层面会有分叉的两条链,一条旧链,一条分叉新链;
3. 需要在某个时间点全部同意分叉升级,不同意的将会进入旧链。
图2–54硬分叉的特点
当新共识规则发布后,没有升级的节点由于不了解新共识规则,就会生产不合法的区块,从而产生临时性分叉。
软分叉的定义是这样的:
软分叉是指比特币交易的数据结构发生改变时,未升级的节点可以验证已经升级的节点生产出的区块,而且已经升级的节点也可以验证未升级的节点生产出的区块。
图 2–55 软分叉结构图
图2–56 软分叉是什么
软分叉的特点如下:
1. 有较好的兼容性,之前版本的部分功能可用,可不升级;
2. 在区块链层面没有分叉的链,只是组成链的区块有新区块和旧区块之分;
3. 相当长的时间里,可允许不进行升级,继续使用原版本生成旧区块,与新区块并存。
图2–57 软分叉的特点
我们模拟一种极端的情况,抽象出一个比特币王国来解释所谓的新系统的兼容性问题。在遥远的岛上,有一个比特币王国,大家相安无事地生活了很多年,由于王国设施陈旧,存在着这样那样的问题,于是大家开始讨论解决方案。
有人觉得应该推翻了重新修葺,并且上书了一本“如何建造一个华丽的王国”的奏书,里面有九九八十一种推翻重建的方案。有些人认为补补窟窿,刷刷墙还是勉强可以看,根本不用大动干戈。两派争论不休,无法达成一致,这就引起了分叉。
图2–58 比特币王国的例子
什么情况下会出现硬分叉呢?派系争论不休,于是开始各干各的。提议推翻重建的人雇了几十个民工,新的建筑焕然一新,王国里新旧建筑的风格相当不统一。这就相当于比特币世界里的硬分叉,表现在比特币世界里就是从新的节点开始,分成了两条链——旧链和新链,两条链互不兼容。
图2–59 打个比方说明硬分叉
软分叉会出现什么结果呢?派系争论不休,但要求重建的一派有了妥协的意愿,同意让装修装饰派试一试他们的方案。于是装修队开始对墙上的破洞进行修补,把陈旧的颜色换成鲜艳的颜色。这时,王国里正常的生活仍然在继续。新旧面貌共存。表现在比特币上就是未升级的节点按照以前的规则继续计算,但已经升级的节点仍然按照扩容后的规则计算。因此,Bitcoin Core(比特币核心钱包)主张的Segwit(隔离见证)升级后,比特币依旧是比特币,不会有新的币种诞生。
图2–60 打个比方说明软分叉
说到影响,我们看看近来比较成功的一次分叉。
2016年7月,以太坊开发团队通过修改以太坊软件的代码,在第192 000区块,强行把The DAO(分布式自治组织)及其子DAO的所有资金全部转到一个特定的退款合约地址从而“夺回”黑客所控制的DAO合约的以太币。
之后,便形成两条链,一条为ETC(原链),一条为新的ETH(分叉链),以太坊成功地硬分叉了!
图2–61以太坊的硬分叉
硬分叉对比特币矿工的影响:
硬分叉这事能闹起来,矿工绝对出了大力气。一旦分叉,矿工挖矿便简单了,可以挖到更多币了,多开心啊,但是,他挖出来的币值不值钱还得看有没有人买,毕竟市场决定价格。
图2–62 对矿工的影响
硬分叉对比特币产业链的影响:
从技术角度来看,硬分叉的主要问题是它需要所有用户转移到具有不同规则的新区块链。为了保持比特币的品牌价值和对比特币的信仰,比特币的支持者是反对硬分叉的。如果真的硬分叉,将会掀起一场彻底的网络战和舆论战。
硬分叉对币价的影响:
再说一句,分叉后比特币的币价是涨还是跌,前景究竟会如何发展,由市场的选择决定。按常理来看,估计分叉后比特币会先暴跌一场,然后分叉后的两个币种经过时间的洗礼后会渐渐回归理性,毕竟分叉后的“1+1”肯定不等于2。
图2–63 对产业链的影响
图2–64 硬分叉对币价的影响
比特币分叉仿佛是一个一旦开始就永不会落幕的会议,但这也正是去中心化的比特币的魅力之所在。
那么,区块链究竟是如何工作的呢,如图2–65所示,我们假设A和B之间要发起一笔交易,A先发起一个请求——我要创建一个新的区块,这个区块就会被广播给网络里的所有用户,所有用户验证同意后该区块就被添加到主链上。这条链上拥有永久和透明可查的交易记录。全球一本账,每个人都可以查找。
图2–65 区块链的工作原理
区块链技术实际上是一个分布式数据库,在这个数据库中记账不是由个人或者某个中心化的主体来控制的,而是由所有节点共同维护、共同记账的。所有的单一节点都无法篡改它。
如果你想篡改一个记录,你需要同时控制整个网络超过51%的节点或计算能力才可以,而区块链中的节点无限多且无时无刻都在增加新的节点,这基本上是不可能完成的事情,而且篡改的成本非常高,几乎任何人都承担不起。
图2–66 篡改账本无法实现
经过无数次的记账,区块链就成为一个可信赖、超容量的公共账本。它具有以下几个特征:
1. 去中心化:在一个去中心化的金融系统中,没有中介机构,所有节点的权利和义务都相等,任意节点停止工作都不会影响系统整体的运作。
图2–67 区块链特点之去中心化
2. 去信任:系统中所有节点之间无须信任也可以进行交易,因为数据库和整个系统的运作是公开透明的,在系统的规则和时间范围内,节点之间无法欺骗彼此。
图2–68 区块链特点之去信任
3. 集体维护:系统是由其中具有维护功能的所有节点共同维护的,系统中所有人共同参与维护工作。
图2–69 区块链特点之集体维护
4. 可靠的数据库:系统中每一个节点都拥有最新的完整数据库拷贝,修改单个节点的数据库是无效的,因为系统会自动比较,认为最多次出现的相同数据记录为真。
图2–70 区块链特点之可靠的数据库
有关区块链的模型结构问题,已经被谈论千遍万遍了,基本已经成为一种定义式的问题了,我们将使用诸多资料中相对较为全面,也较容易理解的一类解释来向大家阐述。
区块链基础架构分为6层,包括数据层、网络层、共识层、激励层、合约层、应用层。每层分别完成一项核心功能,各层之间互相配合,实现一个去中心化的信任机制。
数据层主要描述区块链技术的物理形式。区块链系统设计的技术人员们首先建立的一个起始节点是“创世区块”,之后在同样规则下创建的规格相同的区块通过一个链式的结构依次相连组成一条主链条。随着运行时间越来越长,新的区块通过验证后不断被添加到主链上,主链也会不断地延长。
图2–71区块链的模型架构
每个区块中也包含了许多技术,比如时间戳技术,它可以确保每一个区块按时间顺序相连接;再比如哈希函数,它能够确保交易信息不被篡改。
网络层的主要目的是实现区块链网络中节点之间的信息交流。区块链网络本质上是一个P2P(点对点)网络。每一个节点既接收信息,也产生信息。节点之间通过维护一个共同的区块链来保持通信。
区块链的网络中,每一个节点都可以创造新的区块,在新区块被创造后会以广播的形式通知其他节点,其他节点会对这个区块进行验证,当全区块链网络中超过51%的用户验证通过后,这个新区块就可以被添加到主链上了。
图2–72 区块链的网络层
共识层能让高度分散的节点在去中心化的系统中高效地针对区块数据的有效性达成共识。区块链中比较常用的共识机制主要有工作量证明、权益证明和股份授权证明三种,我们在下面的章节中会重点讲解。
激励层的主要功能是提供一定的激励措施,鼓励节点参与区块链的安全验证工作。我们以比特币为例,它的奖励机制有两种。在比特币总量达到2 100万枚之前,奖励机制有两种,新区块产生后系统奖励的比特币和每笔交易扣除的比特币(手续费)。而当比特币总量达到2 100万时,新产生的区块将不再生成比特币,这时奖励机制主要是每笔交易扣除的手续费。
图2–73 区块链的激励层
合约层主要是指各种脚本代码、算法机制以及智能合约等。我们以比特币为例,比特币是一种可编程的货币,合约层封装的脚本中规定了比特币的交易方式和过程中涉及的种种细节。
应用层封装了区块链的各种应用场景和案例,比如基于区块链的跨境支付平台OKLink,以及在“应用篇”中我们将讲到的五花八门的应用。
公有链是指全世界任何人都可读取、任何人都能发送交易且交易能获得有效确认,任何人都能参与共识过程的区块链——共识过程决定哪个区块可被添加到区块链中,同时明确当前状态。
图2–74区块链的公有链
公有链有如下几个特点:
1. 保护用户免受开发者的影响
在公有链中程序开发者无权干涉用户,区块链可以保护其用户。
2. 访问门槛低
任何人都可以访问,只要有一台能够联网的计算机就能够满足基本的访问条件。
3. 所有数据默认公开
公有链中的每个参与者可以看到整个分布式账本中的所有交易记录。
私有链是指其写入权限仅在一个组织手里的区块链,目的是对读取权限或者对外开放权限进行限制。
图2–75 区块链的私有链
私有链有如下几个特点:
1. 交易速度非常快
私有链中少量的节点具有很高的信任度,并不需要每个节点都来验证一个交易。因此,私有链的交易速度比公有链快很多。
2. 为隐私提供更好的保障
私有链的数据不会被公开,不能被拥有网络连接的所有人获得。
3. 交易成本大幅降低甚至为零
私有链上可以进行完全免费或者至少说是非常廉价的交易。如果一个实体机构控制和处理所有的交易,它就不再需要为工作收取费用。
4. 有助于保护其基本的产品不被破坏
银行和传统的金融机构使用私有链可以保证它们的既有利益,以至原有的生态体系不被破坏。
联盟链是指其共识过程受到预选节点控制的区块链。例如,对由15个金融机构组成的共同体而言,每个机构都运行着一个节点,为了使每个区块生效需要获得其中半数以上也就是8家机构的确认。区块链可能会允许每个人读取,也可能会受限于参与者走混合路线。
图2–76 区块链的联盟链
联盟链可以视为“部分去中心化”,区块链项目R3 CEV就可以认为是联盟链的一种形态。
我们再来说说区块链分类中的其他几种说法——许可链、混合链和复杂链。
许可链是指每个节点都需要许可才能加入的区块链系统,私有链和联盟链都属于许可链。随着区块链技术的日益发展,区块链的技术架构不再简单地划分为私有链和公有链,它们之间的界限越来越模糊,于是复杂链和混合链的概念就逐渐被人提出来了。
根据区块链科学研究所创始人梅兰妮·斯万(Melanie Swan)的观点,区块链技术发展分三个阶段或领域:区块链1.0、区块链2.0和区块链3.0。
区块链1.0:以比特币为代表的可编程货币。它更多是指数字货币领域的创新,如货币转移、兑付和支付系统等。
区块链2.0:基于区块链的可编程金融。它更多涉及一些合约方面的创新,特别是商业合同以及交易方面的创新,比如股票、证券、期货、贷款、清算结算、所谓的智能合约等。
区块链3.0:区块链在其他行业的应用。它更多地对应人类组织形态的变革,包括健康、科学、文化和基于区块链的司法、投票等。
图2–77 区块链的发展脉络
我们在了解共识机制之前,先来看两个古老的引入问题,类两军问题和拜占庭将军问题。
说到这个问题,网络上广为流传的解释如下:
有两个相距很远的军队要传递信息,蓝军派遣一个信使去跟红军说:“有本事把意大利炮拿出来!”红军收到信息后又派了一个信使去跟蓝军说:“收到指令!”然后蓝军又派一个信使去跟红军说:“知道你收到指令了!”然后红军又派一个信使去跟蓝军说:“知道你知道我收到指令了!”然后蓝军又派一个信使去和红军说:“知道你知道我知道你收到指令了!”然后就没完没了了。
图2–78 类两军问题
拜占庭将军问题是一个很古老的问题,具体阐述如下:
拜占庭罗马帝国在军事行动中,采取将军投票的策略来决定是进攻还是撤退,也就是说如果多数人决定进攻,就冲上去。但是军队中如果有奸细(比如将军已经反水故意乱投票,或者传令官叛变擅自修改军令),那怎么保证最后投票的结果真实反映了忠诚的将军的意愿呢?
我们详细说明一下这个问题。
在很久很久以前,有一个强大的帝国叫作拜占庭,它的军队非常强大,周围有10个小国家,饱受拜占庭帝国的欺压,但是,必须同一时间有6个以上的国家进攻才有可能打败拜占庭帝国,否则就一定会战败。
这个时候,问题就出现了,古时候军队之间的通信完全依赖于人,如果一个国家的军队里有奸细,无论是下令的将军还是传信的通信兵,都可能会使得另外9个国家收到假消息,从而造成作战失败。那么,如果你是其中一个小国的国王,你该如何判断一定会有另外5个以上的国家与你并肩作战呢?毕竟一个不小心,你就亡国了。
图2–79 拜占庭将军问题
正是由于以上这些问题,我们需要达成共识。区块链上的共识机制有多种,没有一种共识机制是完美无缺的,同时也意味着没有一种共识机制是适合所有应用场景的。这里我们引用了“张童鞋”的一篇文章,并获得了他的授权。我们选取了其中比较有特点的9种共识机制做一个简单介绍,常见的共识机制主要有工作量证明、权益证明和股份授权证明三种。
工作量证明(Proof of Work,简称PoW)通常只能从结果证明,因为监测工作过程通常是烦琐且低效的。
比特币在区块的生成过程中使用了PoW机制,一个符合要求的区块哈希值由N个前导零构成,零的个数取决于网络的难度值。要得到合理的区块哈希值需要经过大量的尝试计算,计算时间取决于机器的哈希运算速度。当某个节点提供出一个合理的区块哈希值,说明该节点确实经过了大量的尝试计算,当然,这并不能得出计算次数的绝对值,因为寻找合理的哈希值是一个概率事件。当节点拥有占全网n%的算力时,该节点即有n%的概率找到区块哈希值。
PoW依赖机器进行数学运算来获取记账权,资源消耗大、共识机制高、可监管性弱,同时每次达成共识需要全网共同参与运算,性能效率比较低,容错性方面允许全网50%节点出错。
PoW的优点:完全去中心化,节点自由进出。
PoW的缺点:目前比特币已经吸引全球大部分的算力,其他再使用PoW共识机制的区块链应用很难获得相同的算力来保障自身的安全;挖矿造成大量的资源浪费;共识达成的周期较长。
使用PoW的项目有:比特币、以太坊前三个阶段——Frontier(前沿)、Homestead(家园)、Metropolis(大都会)。以太坊的第4个阶段,即Serenity(宁静),将采用权益证明机制。
权益证明(Proof of Stake,简称PoS)由“Quantum Mechanic”2011年在比特币论坛讲座上首先提出,后经Peercoin(点点币)和NXT(未来币)以不同思路实现。
PoS的主要理念是节点记账权的获得难度与节点持有的权益成反比,相比PoW,其在一定程度上减少了数学运算带来的资源消耗,性能也得到了相应的提升,但依然是基于哈希运算,竞争获取记账权的方式,可监管性弱。该共识机制的容错性和PoW相同。它是PoW的一种升级,根据每个节点所占代币的比例和时间,等比例地降低挖矿难度,从而加快找到随机数的速度。
在PoW中,一个用户可能拿1 000美元来购买计算机,并加入网络来挖矿以此产生新区块,从而得到奖励。而在PoS中,用户可以拿1 000美元购买等价的代币,并把这些代币当作押金放入PoS机制中,这样用户就有机会产生新区块而得到奖励。
总体而言,这个系统中存在一个持币人的集合,他们把手中的代币放入PoS机制中,这样他们就变成验证者。比如对区块链最前面的一个区块而言,PoS算法在验证者中随机选取一个(选择验证者的权重依据他们投入的代币量,比如一个投入押金为10 000代币的验证者被选择的概率是一个投入1 000代币验证者的10倍),给他权利产生下一个区块。如果在一定时间内,这个验证者没有产生一个区块,则选出第二个验证者代替产生新区块。与PoW一样,PoS以最长的链为准。
图2–80 PoS算法随机选取
随着规模经济(指扩大生产规模引起经济效益增加的现象)的消失,中心化所带来的风险减小了。价值1 000万美元的代币带来的回报不多不少,是价值100万美元代币的10倍,不会有人因为负担得起大规模生产工具而得到不成比例的额外回报。
PoS的优点:在一定程度上缩短了共识达成的时间;不再需要大量消耗能源去挖矿。
PoS缺点:还是需要挖矿,本质上没有解决商业应用的痛点;所有的确认都只是一个概率上的表达,而不是一个确定性的事情,理论上有可能存在其他攻击影响,例如,以太坊的DAO攻击事件造成以太坊硬分叉,而ETC随之出现,事实上证明了此次硬分叉的失败。
BitShares(比特股)社区首先提出了股份授权证明(简称DPoS)机制,它与PoS的主要区别在于节点选举若干代理人,由代理人验证和记账,但其合规监管、性能、资源消耗和容错性与PoS相似。类似于董事会投票,持币者投出一定数量的节点,进行代理验证和记账。
DPoS的工作原理如下:每个股东按其持股比例拥有相应的影响力,51%股东投票的结果将是不可逆且有约束力的,其挑战是通过及时而高效的方法达到“51%批准”。为了达到这个目标,每个股东可以将其投票权授予一名代表。获票数最多的前100位代表按既定时间表轮流产生区块。每位代表分配到一个时间段来生产区块。
图2–81 DPoS工作原理
所有的代表将收到等同于一个平均水平的区块所含交易费的10%作为报酬。如果一个平均水平的区块用100股作为交易费,一位代表将获得一股作为报酬。
网络延迟有可能使某些代表没能及时广播他们的区块,而这将导致区块链分叉。然而,这不太可能发生,因为制造该区块的代表可以与制造该区块前后的区块的代表建立直接连接。建立这种与你之后的代表(也许也包括其后的那名代表)的直接连接是为了确保你能得到报酬。
DPoS的投票模式可以每30秒产生一个新区块,并且在正常的网络条件下,区块链分叉的可能性极其小,即使发生也可以在几分钟内得到解决。执行该模式的基本步骤如下:
1. 成为代表。成为一位代表,你必须在网络上注册你的公钥,并获得一个32位的特有标识符。该标识符会被每笔交易数据的“头部”引用。
2. 授权投票。每个钱包有一个参数设置窗口,在该窗口里用户可以选择一位或更多的代表,并将其分级。一经设定,用户所做的每笔交易将把选票从“输入代表”转移至“输出代表”。一般情况下,用户不会创建专门以投票为目的的交易,因为那将耗费他们一笔交易费。但在紧急情况下,某些用户可能觉得通过支付费用这一更积极的方式来改变他们的投票是值得的。
3. 保持代表诚实。每个钱包将显示一个状态指示器,让用户知道他们的代表表现如何。如果他们错过了太多的区块,那么系统将会推荐用户更换一位新的代表。如果任何代表被发现签发了一个无效的区块,那么所有标准钱包将在每个钱包进行更多交易前要求选出一位新代表。
4. 抵抗攻击。在抵抗攻击上,前100位代表所获得的权力是相同的,即每位代表都有一项平等的投票权,因此,无法通过获得超过1%的选票而将权力集中到单一代表上。由于只有100位代表,不难想象一个攻击者可以对每位轮到其生产区块的代表依次进行拒绝服务攻击。幸运的是,由于每位代表的标识是其公钥而非IP地址,这种特定攻击的威胁很容易被减轻。这将使确定DDoS(分布式拒绝服务)攻击目标更为困难。而代表之间的潜在连接将使妨碍他们生产区块变得更为困难。
图2–82 DPoS的投票模式
DPoS的优点:大幅缩小参与验证和记账节点的数量,可以达到秒级的共识验证。
DPoS的缺点:整个共识机制还是依赖于代币,而很多商业应用是不需要代币的。
投注共识是以太坊下一代的共识机制Casper(鬼马小精灵)引入的一个全新概念,属于PoS。Casper的共识是按区块达成的,而不是像PoS那样按链达成。
为了防止验证人在不同的世界中提供不同的投注,我们还有一个简单严格的条款:如果你两次的投注序号一样,或者说你提交了一个无法让Casper依照合约处理的投注,你将失去所有保证金。从这一点我们可以看出,Casper与传统的PoS不同的是,Casper有惩罚机制,这样非法节点通过恶意攻击网络不仅得不到交易费,而且还面临着保证金被没收的风险。
Casper协议下的验证人需要完成出块和投注两个活动。具体如下:
出块是一个独立于其他所有事件而发生的过程,验证人收集交易,当轮到他们的出块时间时,他们就制造一个区块,并签名,然后发送到网络上。投注的过程更为复杂一些,目前Casper默认的验证人策略被设计为模仿传统的拜占庭容错共识:观察其他的验证人如何投注,取33%处的值,向0或者1进一步移动。
而客户端确认当前状态的过程是这样的:一开始先下载所有的区块和投注,然后用上面的算法来形成自己的意见,但是不公布意见;它只要简单地按顺序在每个高度进行观察,如果一个区块的概率高于0.5就处理它,否则就跳过它。在处理所有的区块之后所得到的状态就可以显示为区块链的“当前状态”。客户端还可以给出对于“最终确定”的主观看法:如果高度k之前的每个区块形成的意见高于99.999%或者低于0.001%,那么客户端就可以认为前k个区块已经最终确定。
瑞波共识算法使一组节点能够基于特殊节点列表形成共识。初始特殊节点列表就像一个俱乐部,要接纳一个新成员,必须由该俱乐部51%的会员投票通过。共识遵循这些核心成员的“51%权力”,外部人员则没有影响力。由于该俱乐部由中心化开始,它将一直是中心化的,而如果它开始腐化,股东们什么也做不了。与比特币及Peercoin一样,瑞波系统将股东们与其投票权隔开,因此,它比其他系统更中心化。
图2–83 瑞波共识机制
基于传统的分布式一致性技术以及数据验证机制,Pool(联营)验证池是目前行业内大范围使用的共识机制。它的优缺点如下。
优点:不需要代币也可以工作,在成熟的分布式一致性算法(Pasox、Raft)的基础上,实现秒级共识验证。
缺点:去中心化程度不如比特币,更适合多方参与的多中心商业模式。
在分布式计算上,不同的计算机通过信息交换尝试达成共识,但有时候,系统中的协调计算机或成员计算机可能因系统错误交换错的信息,以致影响最终的系统一致性。对于拜占庭将军问题,若根据错误计算机的数量,寻找可能的解决办法,这其实无法找到一个绝对的答案,只可以用来验证一个机制的有效程度。
而拜占庭将军问题的可能解决方法为:在N≥3F + 1的情况下,一致性是可能实现的(N为计算机总数,F为有问题的计算机总数)。信息在计算机间互相交换后,各计算机列出所有得到的信息,以大多数的结果作为解决办法。
图2–84拜占庭容错
最早由卡斯特罗和利斯科夫在1999年提出的实用拜占庭容错(PBFT)是第一个得到广泛应用的拜占庭容错算法。只要系统中有2/3的节点是正常工作的,就可以保证一致性。
实用拜占庭容错算法的总体过程如下:客户端向主节点发送请求调用服务操作,如“<REQUEST,o,t,c>”,这里客户端c请求执行操作o,时间戳t用来保证客户端请求只会执行一次。每个由副本节点发给客户端的消息都包含了当前的视图编号,使得客户端能够追踪视图编号,从而进一步推算出当前主节点的编号。客户端通过点对点消息向它自己认为的主节点发送请求,然后主节点自动将该请求向所有备份节点进行广播。
视图编号是连续编号的整数。主节点由公式p = v mod |R|计算得到,这里v是视图编号,p是副本编号,|R|是副本集合的个数。
副本发给客户端的响应为“<REPLY,v,t,c,i,r>”,v是视图编号,t是时间戳,i是副本的编号,r是请求执行的结果。
主节点通过广播将请求发送给其他副本,然后就开始执行三个阶段的任务。
1. 预准备阶段。主节点分配一个序列号n给收到的请求,然后向所有备份节点群发预准备消息,预准备消息的格式为“<<PRE–PREPARE,v,n,d>,m>”,这里v是视图编号,m是客户端发送的请求消息,d是请求消息m的摘要。
2. 准备阶段。如果备份节点i接受了预准备消息,则进入准备阶段。在准备的同时,该节点向所有副本节点发送准备消息“<PREPARE,v,n,d,i>”,并且将预准备消息和准备消息写入自己的消息日志。
3. 确认阶段。当“(m,v,n,i)”条件为真的时候,副本i将“<COMMIT,v,n,D(m),i>”向其他副本节点广播,于是就进入了确认阶段。所有副本都执行请求并将结果发回客户端。客户端需要等待不同副本节点发回相同的结果,作为整个操作的最终结果。
如果客户端没有在有限时间内收到回复,请求将向所有副本节点进行广播;如果该请求已经在副本节点处理过了,副本就向客户端重发一遍执行结果;如果请求没有在副本节点处理过,该副本节点将把请求转发给主节点;如果主节点没有将该请求进行广播,那么就认为主节点失效;如果有足够多的副本节点认为主节点失效,则会触发一次视图变更。
图2–85展示了在没有发生主节点失效的情况下算法的正常执行流程,其中副本0是主节点,副本3是失效节点,而c是客户端。
实用拜占庭容错机制是一种采用“许可投票、少数服从多数”来选举领导者并进行记账的共识机制,该共识机制允许拜占庭容错,允许强监管节点参与,具备权限分级能力,性能更高,耗能更低,而且每轮记账都会由全网节点共同选举领导者,允许33%的节点作恶,容错性为33%。由于特别适合联盟链的应用场景,实用拜占庭容错机制及其改进算法为目前使用最多的联盟链共识算法,其改进算法在以下方面进行了调整:修改底层网络拓扑的要求,使用P2P网络;可以动态地调整节点数量;减少协议使用的消息数量。
图2–85未发生主节点失效的情况下的算法
2016年4月,小蚁公司发布共识算法白皮书,描述了一种通用的共识机制——授权拜占庭容错,提出了一种改进的拜占庭容错算法,使其能够适用于区块链系统。授权拜占庭容错算法在实用拜占庭容错算法的基础上进行了以下改进:
1. 将C/S(客户机/服务器)架构的请求响应模式改进为适合P2P网络的对等节点模式;
2. 将静态的共识参与节点改进为可动态进入、退出的共识参与节点;
3. 为共识参与节点的产生设计了一套基于持有权益比例的投票机制,通过投票决定共识参与节点(记账节点);
4. 在区块链中引入数字证书,解决了投票中对记账节点真实身份的认证问题。
授权拜占庭容错机制的优点:专业化的记账人;可以容忍任何类型的错误;记账由多人协同完成;每一个区块都有最终性,不会分叉;算法的可靠性有严格的数学证明。
授权拜占庭容错机制的缺点:当1/3及以上的记账人停止工作后,系统将无法提供服务;当1/3及以上的记账人联合作恶,且其他所有的记账人被恰好分割为两个网络孤岛时,恶意记账人可以使系统出现分叉,但是会留下密码学证据。
总而言之,授权拜占庭容错机制最核心的一点,就是最大限度地确保系统的最终性,使区块链能够适用于真正的金融应用场景。
这是一种传统的分布式一致性算法,是一种基于选举领导者的共识机制。领导者节点拥有绝对权限,并允许强监管节点参与,其性能高,资源消耗低。所有节点一般有线下准入机制,但选举过程中不允许有作恶节点,不具备容错性。