从本质来讲,区块链是一种可复制的确定性状态机 (replicated deterministic state machine)。状态机是一个数学模型,它是由一组状态和能够造成状态迁移的外部行为所组成的。我们的生活中充满了状态机,比如红绿灯是有红,黄,绿和停机四种状态,开关有开和关两种状态。往大了讲,我们的社会也可以算是一个状态机,只是每一个状态和造成迁移的行为都由太多的因素决定,所以无法预测和复现。状态机的确定性是指它在每一时刻都处于一个确定的状态,并且针对每一种外部行为来说,状态机会迁移为的状态也是确定的。而可复制状态机则是指可以在多个状态机之间保证状态一致。如果多个状态机从同样的初始状态出发并执行相同顺序的外部行为,那么最终的状态一定是一样的。
区块链就是利用了这种状态机的可复制性和确定性来维持去中心化后多台机器状态的一致性,造成状态变化的外部行为就是链上的各种交易。而因为所有的交易都有记录,因此所有人只要从某一个时刻的确定状态出发,都可以通过计算得到最新的区块链状态。
区块链因为是去中心化的,因此它最需要解决的一个问题就是如何能够在所有链上的机器之间达成共识。比如在有多台机器同时希望生成新的区块的时候到底应该接受谁的作为正确结果,这种问题被称为拜占庭将军问题。它的起源是为了解决拜占庭时期多只军队在外执行任务时如何达成统一意见的问题。将军们在地理上被分隔开,只能依靠传令兵来互相沟通。其中忠诚的将军希望达成一致意见攻克敌军,背叛的将军则希望通过传递混淆的信息来阻挠任务的达成。目前的研究结论表明只有背叛的将军数目少于三分之一时才有可能达成目的。
在区块链领域,由于去中心化只会有点对点的交互,并不会存在所有机器统一把消息汇总到一起的情况。并且也会有人希望通过错误的信息来获利。例如有一笔交易可以获得极大的利润,如果有人声明这笔交易的所有权希望获得这部分利润那系统该如何辨别它的真伪呢?拜占庭将军问题因此就可以被表述为在缺少可信任的中央节点和可信任的通道的情况下,分布在网络中的各个节点应如何达成共识。
为了解决上述的篡改信息的问题,区块链中每一个用户都有一对公钥和私钥,每次进行交易需要用私钥去签名,而其他人可以通过那个用户的公钥来进行验证。这就保证了交易的不可篡改性。而对于上述的在分布式系统中达成共识的问题,则将是本文接下来讨论的重点。
目前如比特币,以太坊之类的大部分区块链都是采用工作量证明的方式来达成共识。顾名思义,如果有人想要去生成下一个区块,那么他需要第一个完成某一数学问题。以比特币为例,它是要求用户去解哈希函数 。哈希函数是可以将任意大小的数据映射到相同大小的数据函数。它的主要特点是:
输入任意长度但输出长度不变
单向不可逆性。这意味着用户可以通过x获得 H(x),但并不可能通过 H(x) 反推回 x。这就保证了区块链计算的公平性,不存在有人逆推答案的情况。
免碰撞性。这一特性是避免输入不同但输出一样的情况。因为输出结果的位数是确定的,所以只有确定个数个可能的解。只要用户进行足够多次数的尝试,那么肯定会出现重复的解。这一条的意义是表示出现重复的可能性极为的小。
输出结果需要如同随机值一样没有规律,只有这样才能防止有人作弊。
以比特币来举例说明,它采用的是SHA256哈希运算方法,即输出结果为256位。它的数学问题从本质上来讲是猜随机数。矿工需要在给定的字符串开头后面添加一个随机数然后进行哈希运算,如果得到的答案小于目标值,那么就算成功。因为上面讲的哈希运算的特点,矿工唯一的选择就是从一开始不断尝试所有的随机数。
因为矿工需要得到小于目标值的答案,可行解就是在零到目标值减一的范围内。因此挖矿难度是由目标值的大小来决定的。如果目标值很小,那么可行解就很少,挖矿难度自然很大。相反如果目标值大,那么可行解的数目就很多,难度也就降了下来。比特币预期是每隔大概十分钟生成一个新的区块。为了维持出块速度的稳定,系统会每隔2016个区块自动调节一次难度值。如果在过去的2016个区块中全网算力很高,那么接下来就需要提高难度值以防止出块太快。而如果当时全网挖矿的人少,算力低的话,那么就要降低难度值,否则十分钟可能无人能计算出结果。
工作量证明这个方法通过要求用户做无用运算的方法来维护了生态的稳定性。比特币中允许同时出现多条分叉链,而其中最长的那条会被认为是正确的。如果不使用工作量证明,任何人都可以几乎很轻松地提交新区块,这样子坏人可以近乎零成本地大量提交错误区块来让自己的链被认为是正确的链。然而如果想要在工作量证明之下让自己的区块成为正确区块,那么他需要在提交比其他所有人都多的区块才行,这需要他有全网51%的算力才能够去保证。并且因为提交区块需要耗费大量的资源,所以人们在知道希望不大时就不容易选择去生成错误区块来牟利。因此只要生态中大部分算力是诚实的,那么这个生态就是安全的。
然而这种方案的确定也是十分明显的。首先大量的资源被浪费在了无用的计算上面。同时由于分叉链的存在,因此确认一个区块需要相对更长的时间,区块链的性能会收到制约。
因为工作量证明有上述的缺点,现在有不少的区块链采取了权益证明的方法来获取共识。不同于工作量证明通过消耗电力和运算力来生成区块,权益证明通过质押代币来获取生成新区块的权利。这个模式下用户生成新区块的收益与质押代币的数量还有质押时间成正比。因为这种区别,工作量证明下通过劳动开采节点的人叫做矿工,而权益证明时他们叫做验证者。
权益证明除了不消耗资源,不需要昂贵矿机这两个优点之外,它还具有很高的安全性。工作量证明时矿工和项目方的利益是不一致的,矿工不需要考虑生态的长期利益。但在权益证明下,因为生成区块之前需要质押,等于是入股了这个生态,所以更关心这个生态的稳定。如果有人能够凑齐51%的质押资本,那他已经是这个生态绝对的控制人了,更没有必要去攻击生态了。
但同样,权益证明也有着它自己的缺点。因为用户可以以极低的成本去生成新区块,也就导致了链上同时有大量的人在生成区块,所以如何辨别哪个区块是正确的就是一个很重要的问题。同时因为很多用户质押代币来生成区块获得奖励,这等同于存储代币获取利息。这个情况也就导致了生态中代币的数目越来越多,容易造成通胀的问题。
