区块链是一个技术术语,解决(或者说颠覆)了现有的依赖第三方中心的交易体系:如果有一个水果市场,我们在市场上用100新台币购买了一个芒果,其实是新台币的发行方(央行)为这一张薄薄的纸作了信用背书--因为水果销售者信任这100新台币可以在他需要的时候,购买等值的其他用品。
第三方中心的存在,解决了交易双方的信任问题,但是带来了新的问题,如果第三方作恶(比如说央行滥发货币)怎么办?最终极的解决项目就是不需要第三方,这个就是区块链产生的根本动机。
在没有第三方的情形下,怎么实现交易?区块链实现了一个去中心化的帐本实现项目:
- 我们有一个公开的帐本,任何人都可以获取这个帐本,帐本上有每个人的余额;
- 当Alice向Bob购买商品的时候,Alice向Bob开具一张有一定数额的支票;
- Alice向所有人公示这个支票,大家确认确实是Alice的签名后,在账本上记录 Alice的余额减,Bob的余额加;
- 每隔一段时间,大家交换一下帐本的内容,让大家的帐本信息同步。
可以看出,区块链是一个完全自治的体系,但是现在有几个问题:
- 为什么会记帐,每个人都可以指望别人记帐,自己使用别人的帐本才是最节省成本行为;
- 当交易帐本内容的时候,如果两个人的帐本不一致,该以谁的为准;
- Alice如果账户里只有10块钱,在市场的这一侧花了8块购买后,飞速跑到另外一头购买另外一件8块的商品,这时候另外一侧的帐本还没有来得及记录前面的购买记录,同样的钱Alice是不是可以花了两次?
为了解决这些问题,区块链作了最基本的设计:
- 把所有的交易按时间段组织成区块;
- 区块内使用一个哈希防止修改;
- 每个区块内记录前一个区块的哈希,保证永久无法修改;
- 当同时有多个区块出现时,按某种指定的算法选择一个区块为准。
使用此项目后,每次交换帐本,只需要交换总帐本中的一个区块,大大减少的交换的数量;当多个区块同时出现时,使用某种约定的算法--这个算法在区块链中被称为共识,以符合算法条件的某个区块为准;而Alice同样的钱花两次的想法也会落空:商户只有在支票信息被纳入到共识后的区块里时,才会向Alice提交商品。至于大家为什么愿意记帐呢?注意图上区块中有个记帐人,每个被共识承认的区块的记帐人都会得到一定的奖励。
这时候,货币只是一个数字了(类似于银行内的存款数字),由于帐本是公开的,因此可以在帐本开始前,大家约定好总共的货币数字和记帐人的奖励项目,在任何一个时间点上,可以流通的数字都是可预测的,而且是不可更改的。
区块链的共识机制
当区块进行同步时,有可能会同时产生多个区块,需要一种预先定义的项目来确定使用哪一个区块,这个项目在区块链中称为共识机制。而在在一个去中心化的系统中,有什么是可信的?每个人信自己嘛,交易和出块的结果数据到达我这里的时刻,是无法作假的:数据可能会延时到达(由于网络延时),但绝对不会提前到达(除非时光倒流)。我们可以设计一种机制,让每个节点的记账结果必须达到某个条件,每个节点都认第一个达到这个条件的节点的记录。
PoW机制
Proof-Of-Work,工作量证明机制。
每个节点在记账的同时,按照某种规则找一个随机数,通过这个随机数可以算出某个符合条件的(哈希)值,谁第一个找到的,他就出块成功。这个找随机数的过程就是不断调整随机数-->计算的过程,只要这种算法能够足够离散(这一次和下一次的计算没有任何关联,随机数的变化导致计算结果变化足够离散),那么就能够实现出块节点的随机化。
举个简单的例子,如果算法得到的哈希值总是在0-10000之间,而算法要求得到的(哈希值)小于1,一台机器如果一秒钟能够计算一次,那么平均计算一万次,就有一次值可能小于1;或者反过来说,每次计算,有万分之一的机会小于1. 如果有一万台节点同时在计算,那么每秒都有可能有一台节点得到符合条件的结果,得到符合条件结果的节点就是出块成功。而每一秒,得到结果的机器都可能不一样。这样就获得了足够随机的结果。
POS
Proof-Of-Stake,权益证明机制。
PoW机制很好用,但是有个问题,军备竞赛后,太耗电了,都是做些无意义的计算,除了这个结果和到达时间之外,还有什么可信的数据作为随机值的呢?有想到一个新的点子,每个人存在账号里的币的数量是不一样的么,是不是可以用来作为一种随机数呢?
想想也可以啊,每一次出块的时候,出块节点(账号)里谁的币最多,就认谁的。但这样有个问题:币最多的岂不是一直在出块?