从总体上来说,区块链系统是一个有点特别的分布式数据库系统。
“有点特别”指的是所有的交易数据是链接在一起的这个特点。
传统的数据库存储的时候,一般一条“记录”是独立存在的,原则上与其它记录没有什么关系。比如下面的订单支付数据:
但是,在区块链数据库中是不一样的。具体来说:区块是指一批交易的组合,并且包含链中上一个区块的哈希。 这将区块连接在一起(成为一个链),因为哈希是从区块数据中加密得出的。 这可以防止欺诈,因为以前的任何区块中的任何改变都会使后续所有区块无效,而且所有哈希都会改变,所有运行区块链的人都会注意到。这样,提供一种检测数据篡改的方式。
区块将与链条安全地链接在一起,且您无法编辑它们。每增加一个区块,都会强化前一个区块的验证,因而也会强化整个区块链的验证。这就像是堆砌木块建塔一样。您只能在前一层木块之上堆叠木块,如果您从塔的中间取出一个木块,则整座塔将垮塌。
接下来,我们来说说“分布式数据库”这个部分。
我们来看区块链的第一个成功商业应用:比特币系统。其总体架构如下:
各个Miner节点都保存着全量的数据库副本,并且可以独立的验证数据。那么,一个很自然的问题就是:如何让这些节点的数据库保持一致?
再看具有智能合约功能的公开区块链平台:以太坊。其总体架构如下:
与比特币系统类似,各个Mining节点都保存着全量的数据库副本,并且可以独立的验证数据。那么,一个很自然的问题就是:如何让这些节点的数据库保持一致?
再看企业级区块链系统平台Hyperledger Fabric的总体架构:
与比特币系统类似,各个Peer节点都保存着全量的数据库副本,并且可以独立的验证数据。那么,一个很自然的问题就是:如何让这些节点的数据库保持一致?
传统的分布式数据库设计都有一个假设,即分布式数据库的每个节点都是“友好”的,因此要保证数据一致,主要需要克服一些常规的技术问题就OK了,比如网络延迟了怎么办,网络临时中断怎么办,不同节点上的用户试图修改相同的数据怎么办...
在区块链这种分布式数据库系统中,以上这些问题同样全部存在,除此之外,还需要考虑另一个重要问题,即不能默认各个节点都是“友好”的,可能有些节点就是有意“制造麻烦”。那么在这种情况下,如何保证数据库一致性?
答案就是“共识”。
其实说白了,共识的本质,就是一种让区块链各个节点上的数据保持一致的方法。在传统的分布式数据系统中,我们只是称之为数据一致性;在区块链的世界里,由于其去中心化、独立验证的特性,可能存在更多的风险和不确定性,为了确保这种一致性尤其重要且难度更大,催生出了“共识”的概念。
各种不同的共识算法,就是为了达到各节点数据一致的目的,而采取的不同技术实现。
达成共识注定是一个“费劲”的过程,但这就是为了实现分布式、去中心化、独立验证、数据难以篡改等特性所必须付出的代价。
无论未来人类发明出多么高性能的共识算法,网络和计算性能有多大程度的提高,可以肯定的是,区块链系统的性能必然始终低于集中式系统。
具体来说,共识算法需要建立一套规则和方法,决定哪个节点取得一个区块的记账权,也就是写数据的权力,并获得该区块的奖励,同时界定可能的作恶者,并让它受到怎样的惩罚。
下面看看常见的共识算法。
1,工作量证明(PoW,Proof of Work)
解释
某个节点,计算得出一个结果,其它节点验证该结果,超过50%的节点认同这个答案,产生结果的节点获得奖励。这样,把交易信息(数据库信息)与期待的答案关联,只要节点产生出了正确的答案,就能获得奖励。
从算法的角度,产生这个结果很困难,需要耗费大量的资源;而验证一个结果则简单很多。
优点
自2009年以来得到了广泛测试,目前依然得到广泛的使用。
不足
速度慢。耗能巨大,对环境不好。易受“规模经济”(economies of scale)的影响。 激励大家在矿池中挖矿,反过来导致区块链的算力越来越向大型矿池集中,有违去中心化的原则。
使用者
Bitcoin、Ethereum、LiteCoin、Dogecoin等。
类型
有竞争共识(Competive consensus)。
2,权益证明(PoS,Proof of Stake)
解释
与PoW不同,权益证明共识算法使用的是一种选举机制。网络中某一个节点被随机选取,这个节点负责写入下一个区块。被选中的节点称为Validator验证者。
为了成为验证者,一个节点必须先抵押一定的token作为押金(stake)。押金的多少,决定了你下一次选举时被选为“验证者”的几率大小。
PoS不需要所有人参与竞争记账权,也就消耗更少的资源。
验证者
要想作为验证者参与,用户必须向存款合约存入 32 个以太币并运行三种独立的软件:执行客户端、共识客户端和验证者。 存入以太币时,用户会进入一个激活队列,限制新验证者加入网络的速度。 激活后,验证者将从以太坊网络上的对等节点接收新区块。 区块中交付的交易会被重新执行,并且对区块签名进行检查以确保区块是有效的。 然后验证者在整个网络上发送支持该区块的投票(称为认证)。
在工作量证明中,生成区块的时间是由挖矿难度决定的,而在权益证明中,节奏是固定的。 权益证明以太坊中的时间分为时隙(12 秒)和时段(32 个时隙)。 在每个时隙中随机选择一位验证者作为区块提议者。 该验证者负责创建新区块并发送给网络上的其他节点。 另外在每个时隙中,都会随机选择一个验证者委员会,通过他们的投票确定所提议区块的有效性。
安全性
运行验证者是一种承诺。 验证者应当保持足够的硬件和连接,来参与区块的验证和提出。 作为回报,验证者将获得以太币(他们的质押余额增加)。 另一方面,作为验证者参与,也为用户为了个人利益或破坏而攻击网络开辟了新的渠道。 为了防止这种情况,如果验证者在被调用时未能参与,他们就会错过以太币奖励;如果他们有不诚实行为,他们现有的质押可能会被销毁。 主要有两种行为被视为不诚实:在一个时隙中提出多个区块(模棱两可)和提交相互矛盾的认证。 被罚没以太币的金额取决于大致同一时间受到罚没的验证者数量。 这称为“相关惩罚”,相关惩罚可以是轻微的(单个验证者被罚没质押以太币的 1%),也可以导致验证者质押的以太币全部被销毁(大额罚没事件)。 这种惩罚在强制退出期执行,首先是第 1 天的立即处罚(最多 0.5 个以太币),接着是第 18 天的相关惩罚,最后是第 36 天的逐出网络。 如果验证者在网络上但不提交投票,他们每天都会受到轻微的认证惩罚。 对于攻击者来说,这些措施都意味着协同攻击的代价将极其高昂。
优点
- 节能。
- 攻击者代价更大。
- 不易受 “规模经济” 的影响。
不足
与工作量证明相比,权益证明仍处于起步阶段,并且经过的实践检验较少。
使用者
Ethereum、Peercoin、Nxt。
类型
有竞争共识。