什么是区块链?
区块链是一个技术术语,解决(或者说颠覆)了现有的依赖第三方中心的交易体系:如果有一个水果市场,我们在市场上用100新台币购买了一个芒果,其实是新台币的发行方(央行)为这一张薄薄的纸作了信用背书--因为水果销售者信任这100新台币可以在他需要的时候,购买等值的其他用品。
第三方中心的存在,解决了交易双方的信任问题,但是带来了新的问题,如果第三方作恶(比如说央行滥发货币)怎么办?最终极的解决项目就是不需要第三方,这个就是区块链产生的根本动机。
在没有第三方的情形下,怎么实现交易?区块链实现了一个去中心化的帐本实现项目:
1.我们有一个公开的帐本,任何人都可以获取这个帐本,帐本上有每个人的余额;
2.当Alice向Bob购买商品的时候,Alice向Bob开具一张有一定数额的支票;
3.Alice向所有人公示这个支票,大家确认确实是Alice的签名后,在帐本上记录
i. Alice的余额减,Bob的余额加;
4.每隔一段时间,大家交换一下帐本的内容,让大家的帐本信息同步。
可以看出,区块链是一个完全自治的体系,但是现在有几个问题:
1.为什么会记帐,每个人都可以指望别人记帐,自己使用别人的帐本才是最节省成本行为;
2.当交易帐本内容的时候,如果两个人的帐本不一致,该以谁的为准;
3.Alice如果账户里只有10块钱,在市场的这一侧花了8块购买后,飞速跑到另外一头购买另外一件8块的商品,这时候另外一侧的帐本还没有来得及记录前面的购买记录,同样的钱Alice是不是可以花了两次?
为了解决这些问题,区块链作了最基本的设计:
1.把所有的交易按时间段组织成区块;
2.区块内使用一个哈希防止修改;
3.每个区块内记录前一个区块的哈希,保证永久无法修改;
4.当同时有多个区块出现时,按某种指定的算法选择一个区块为准。
使用此项目后,每次交换帐本,只需要交换总帐本中的一个区块,大大减少的交换的数量;当多个区块同时出现时,使用某种约定的算法--这个算法在区块链中被称为共识,以符合算法条件的某个区块为准;而Alice同样的钱花两次的想法也会落空:商户只有在支票信息被纳入到共识后的区块里时,才会向Alice提交商品。至于大家为什么愿意记帐呢?注意图上区块中有个记帐人,每个被共识承认的区块的记帐人都会得到一定的奖励。
这时候,货币只是一个数字了(类似于银行内的存款数字),由于帐本是公开的,因此可以在帐本开始前,大家约定好总共的货币数字和记帐人的奖励项目,在任何一个时间点上,可以流通的数字都是可预测的,而且是不可更改的。
区块链的共识机制
当区块进行同步时,有可能会同时产生多个区块,需要一种预先定义的项目来确定使用哪一个区块,这个项目在区块链中称为共识机制。而在在一个去中心化的系统中,有什么是可信的?每个人信自己嘛,交易和出块的结果数据到达我这里的时刻,是无法作假的:数据可能会延时到达(由于网络延时),但绝对不会提前到达(除非时光倒流)。我们可以设计一种机制,让每个节点的记账结果必须达到某个条件,每个节点都认第一个达到这个条件的节点的记录。
PoW机制
Proof-Of-Work,工作量证明机制。
每个节点在记账的同时,按照某种规则找一个随机数,通过这个随机数可以算出某个符合条件的(哈希)值,谁第一个找到的,他就出块成功。这个找随机数的过程就是不断调整随机数-->计算的过程,只要这种算法能够足够离散(这一次和下一次的计算没有任何关联,随机数的变化导致计算结果变化足够离散),那么就能够实现出块节点的随机化。
举个简单的例子,如果算法得到的哈希值总是在0-10000之间,而算法要求得到的(哈希值)小于1,一台机器如果一秒钟能够计算一次,那么平均计算一万次,就有一次值可能小于1;或者反过来说,每次计算,有万分之一的机会小于1. 如果有一万台节点同时在计算,那么每秒都有可能有一台节点得到符合条件的结果,得到符合条件结果的节点就是出块成功。而每一秒,得到结果的机器都可能不一样。这样就获得了足够随机的结果。
POS
Proof-Of-Stake,权益证明机制。
PoW机制很好用,但是有个问题,军备竞赛后,太耗电了,都是做些无意义的计算,除了这个结果和到达时间之外,还有什么可信的数据作为随机值的呢?有想到一个新的点子,每个人存在账号里的币的数量是不一样的么,是不是可以用来作为一种随机数呢?
想想也可以啊,每一次出块的时候,出块节点(账号)里谁的币最多,就认谁的。但这样有个问题:币最多的岂不是一直在出块?
加个币龄,某个账号(节点)一旦出块成功,币龄就清零,如果没有出块成功,币龄就加上。
比如 账号A有7个币,B有8个币,C有3个币
初始币龄值 : A:7, B:8, C:3 第 一轮: B出块;
第一轮后币龄:A:14,B:0,C:6 第二轮 A出块;
第二轮后币龄:A:0,B:8,C:9 第三轮:C出块;
第三轮 后币龄:A:7 B:16,C:0。
通过上述结果,可以看到达到了随机出块的效果,而且没有额外耗电的计算,但是POS有两个问题:
1.如果币被集中在一些人手机,这些人的节点的出块概率非常高;
2.如果轮到某个节点出块,最后他没出怎么办?
DPoS
Delegated Proof of Stake:授权权益证明机制。
在PoS的基础上,有人就想了,哦,去中心化的意思就是不要在一个节点上出块啊,那我选出一些节点,让这些节点轮流出块不就可以了么。于是就有了DPoS(Delegated Proof-Of-Stake),我们选出一些节点,让这些节点为大家服务,他们来出块,OK,省事又省心。
慢着,这个好像有点不对味啊,去中心化的方法是让出块节点尽可能的分散,防止总是由某一个或是一些节点出块,因此如果总是他们出块,那他们完全就可以为所欲为啊,这个DPos岂不是与这个原则背道而驰?
这个结论部分正确,因为区块链不仅仅有公链,还有联盟链的存在。比如说各国海关设立一个联盟链,他们代表各自国家的利益,因此是处于互联监督的状态,再说,他们如果联合作恶,没有作恶的对象啊,因此没有联合作恶的意义和条件。
那DPos在公链上会有什么后果呢?DPos在公链上有主节点,备选节点,还有广大的币民,DPoS主节点联合作恶的前提条件就是他们作恶的收益大于成本(愿赌服输,输家最后可能会抛弃这个链。这个前提会不会存在呢?见仁见智吧!)
区块链的三角问题
区块链带来的好处无法用言语形容:不需要第三方的自治体系;所有的帐本通过共识进行,总共有多少货币,在帐本开始的时候就约定好了,一旦约定,就无法更改,不怕第三方滥发货币;当水果市场越来越大,加入的商贩和消费者越来越多的情况下,货币会变得越来越值钱。
到现在为止,一切看起来很完美,在没有第三方的情况下,这个系统可以在市场里运行的很好。但是随着时间的推移,市场越来越大,问题慢慢的出现了:
同一时间段内,进行交易的人越来越多,记帐员需要记录的、需要交换的交易越来越多,而为了达到一致性,需要留出时间让交易记录、出块内容扩散到整个市场都知道。
区块链里定义了一个术语:TPS(Transactions Per Second)--每秒交易的数量,这个数量表征了一个区块链系统的交易能力。而这个交易能力受到区块链的不可能三角的制约:
“不可能三角”是指无法同时达到可扩展性(Scalability)、去中心化(Decentralization)、安全(Security),三者只能得其二。
如果可扩展性要高,即TPS要高,那么对记帐员的要求就会变高,有很多人就无法成为记帐员,那么去中心化程度就会变低。
如果既要可扩展性,又要去中心化程度不降低,解决的项目就是市场中的记账员可以只记录一部分交易,或者只记录某一些人的交易,那么安全性就会降低(记帐员和客户共同做假的可能性升高)。
区块链的可扩展性
从技术上说,TPS值 = 每个区块内容纳的交易数/区块的间隔时间,要提高TPS值,要么提高区块内容纳的交易数,要么降低区块的间隔时间。
简单来看,区块内容纳的交易数越多,区块就越大,区块传输和同步所需的时间就越长,对网络带宽、出块的主机要求就越高。
而如果缩短出块时间,由于区块内的每个交易都需要验证,传输也需要时间,同样对网络带宽和出块的主机要求会变高。
但是反过来说,当出块的间隔和块的大孝交易的容纳能力预先定义后,不论网络带宽如何,主机性能如何,TPS都无法扩展。事实上,从2008年到现在,主机的能力、网络的带宽都有了成数量级的增长,但是比特币的TPS一直保留在7笔/秒。
比特币的7笔/秒的TPS,并不是因为POW共识算法导致的,而是设计时的区块大小和出块时间决定的。
因此,要解决区块链的可扩展性问题,必须在区块结构和出块时间设计上重构和优化,通过修改、提出新的共识机制是隔靴搔痒,无济于事的解决项目。
在设计新区块结构和出块时间的时候,如何解决或是优化“不可能三角”,这是开发者在设计过程中需要重点考虑的问题。
配图为朋友摄影作品《如何梭哈Filecoin》
本文已经取得我公司技术总监授权