玩玩区块链——概念

原文转载自 「开源实验室」 (https://www.kymjs.com/code/2019/11/21/01/)

预计阅读时间 0 分钟(共 0 个字, 0 张图片, 0 个链接)


对本文有任何问题,可加我的个人微信询问:kymjs123

讲个故事

这个故事是 2016 年 MDCC 大会结束一起聊天的时候,听冯森林冯老师讲的。背景是:前几天有个人问他,说冯老师我很迷茫,前端技术天天变,而真正重要的东西都在后端,我该不该去学后端。
在很早很早之前,程序员就是程序员,不分什么前端后端客户端,后来是我们人为的在中间画了一条线,规定线的左边叫后端,线的右边叫前端。在左边与右边的信息交互,我们用一种协议去完成。
而事实上,在当今世界跟用户打交道的都是前端,离开了用户,后端终究只是一堆冷冰冰的数字,而随着人工智能与物联网的发展,我们是有可能讲这些冷冰冰的数字计算,放在端上完成的。

具体的原话我已经忘了,但大概意思就是这些。虽然哪怕 5G 已经到来,我也不太相信人工智能跟物联网能解决这种问题,但我隐隐觉得区块链跟智能合约能做到类似的实现。

反正信不信由你,连潘木匠都开始跨界玩 Python 了,我玩会区块链不行吗? 😂😂😂

比特币

分布式数据库

用我们平时最常用的数据库 MySQL 举例,你在自己服务器上装一个 MySQL 就是一个中央存储器。他面临的问题就是扩展麻烦,一不小心哪里崩了,整个数据都不能用了。于是就有人做出了分布式数据库,就是多个服务器,每个服务器存储一部分。中央存储与分布式就类似数组与链表(或者树)的关系,但是面临的问题就是,链表的每个节点是有可能被篡改的,比如有人破解了你服务器,获取了 root 权限,那还不上去随便改你数据库。

区块链

区块链也是一个分布式数据库,他的每个区块,也就对应了上面讲的链表的一个节点,而多个区块组合起来,才是一个区块链。拿比特币举例子,他每个区块实际上存储了多笔交易的信息,每个正在挖矿的矿工(其实就是一个存储机器)手里都会有一份完整的全量数据。这时候如果有一个人的数据与其他人不一样,那肯定他的数据是有问题的。这也就是为什么我们总说区块链是不可篡改也不会丢失的了(随着技术迭代,现在有更多的链选择节点搭配的形式,不再所有人都记录全部数据了)。

区块内防篡改

前面讲了区块间防篡改其实就是少数服从多数的方式,接下来再看看区块内如何防篡改的,还是用比特币的放篡改来举例。比特币每个区块的结构如下:

开源实验室

核心结构是由一种称之为默克尔树的二叉树实现的。当前区块的全部交易信息位于叶子节点,然后每两个相邻的叶子节点聚合进行Hash运算,运算结果作为中间节点,中间节点再次两两聚合进行 Hash,最终生成唯一的根节点 Merkle Root。默克尔树的特性在于,任意叶子节点发生改变,改变都会影响到上层的 Hash 运算结果,最终经过层层传递,根节点的 Hash 值也将发生改变,基于此特性,比特币系统牢牢的将区块内的所有交易聚合成为一个整体,任何的篡改行为都会影响到整个区块。
而比特币每次有区块新增的时候,其实都会计算一下默克尔树,但这段计算其实是很快的而真正耗时的,其实是一段没有任何意义的计算。(这也就是有人说比特币浪费能源的原因)比特币会每隔一段时间,生成一个区块,但是为了保证生成区块的时间稳定,就强制要求所有挖矿的矿工(存储机器)不停的去运算一个很复杂的运算,而这个运算的复杂度是动态变化的,整个系统能保证每次运算出结果的时间都差不多10分钟。 第一个运算出结果的人,要把这个结果告诉所有正在计算的矿工(其他存储机器),这样,他就算是成功记录了新的区块,而别的矿工就会同步他记录的这个区块,作为最先运算出结果的矿工,也会获得奖励(也就是比特币)。
所以,看出来了吧,本来是用来存储的机器,结果最大的代价居然不是存储,而是不停的计算一个毫无意义的运算,这就是个笑话。
(扩展知识:双花问题、51%攻击,自行搜索)

各种空气币

比特币被称为区块链1.0,很多人希望把区块链的技术应用到数字货币之外的场景,然而,比特币本身的功能单一,对用户来讲,无非是挖矿、转账交易,于是就有了区块链2.0,以太坊。
前面已经说了,比特币计算一个区块是十分钟左右,而以太坊计算一个区块是十几秒,这就大大提高了数据同步的速度,也就是说交易确认将会更快(垃圾,再快能比微信支付宝快吗😂)。
然而,以太坊的成功并不是他的交易速度。比特币有一个很大的问题,就是其中协议的扩展性是一项不足,例如比特币网络里只有一种"token"——比特币,用户无法自定义另外的属性 token,这些 token 可以是代表公司的股票,或者是债务凭证等,这就损失了一些功能。另外,比特币协议里使用了一套基于堆栈的脚本语言,这语言虽然具有一定灵活性,使得像多重签名这样的功能得以实现,然而却不足以构建更高级的应用,例如去中心化交易所等。以太坊从设计上就是为了解决比特币扩展性不足的问题。

安全可信

如果仅仅是用来发币,国家可能早就把区块链给封了。以太坊真正解决的,是共识问题,这也是为什么国家重视区块链的原因。前面我们讲,比特币给每个矿工存储数据的回报是比特币,而以太坊也有自己对应的报酬叫以太币。以太坊英文叫 Ethereum,对应的币叫 ETH。但是以太坊统一了所有基于以太坊定制的各种定制链的 token,即(Token 标准协议)。 而这里说的各种定制链,其实就是合约,这是以太坊的核心。合约是一个活在以太坊系统里的自动代理人,他有一个自己对应的 eth 地址,当用户向合约的地址里发送一笔交易后(其实就是调用一个函数),该合约的对应回调函数就被调用,而交易是可以附带额外信息的,然后合约再根据交易中的额外信息处理自己的逻辑,最后返回一个响应,这个响应可能是从合约的地址发出另外一笔交易(触发另一个调用)。这样任何一个基于以太坊定制的 token,都是可以被互相兑换的。看到没有,交易所也出来了。

共识机制

POW

虽然以太坊相比比特币的内部实现已经好了很多了,但依然没有从根本改变比特币那个笑话——本来是用来存储的机器,结果最大的代价居然不是存储,而是不停的计算一个毫无意义的运算。
而这个笑话有一个专业的名词叫做 POW(Proof Of Work)。
这是机制的问题,因为如果一个存储数据的机器,想要证明自己记录的数据是准确的,还要让别人相信自己的数据是准确的,他不得不想办法证明自己是准确的(类似于证明自己是自己)。而证明自己的过程,就是他把自己的数据求一遍 hash,然后吧 hash 结果告诉别的同样在记录数据(挖矿)的机器,然后别的机器去用你的 hash 结果验证他们的数据,如果发现一致的话,那他就相信你的数据是对的(因为跟自己的结果是一致的),然后当系统里面相信这个数据是对的机器越来越多,这个结果自然而然就成了正确的结果。
这个验证的过程是一个很特殊的算法,求 hash 的时候是非常复杂耗时的操作,而验证 hash 正确性的时候,是一个非常简单的操作。举个例子:比如我给出一个 md5 值,让你去算哪一段文本的 md5 值跟他是一样的。你可能唯一的办法就是自己不停的穷举所有文本的 md5,去找出一段文本的 md5 是不是跟我给出的一样,而如果此时有人给出一段文本,说这段文本跟给定的 md5 是一样的,你很容易就能验证他说的对不对。
因为这种机制问题,POW 不得不花大量的资源用于计算 hash 上,而不是原本存储的目的,从而造成了很大的资源浪费(毕竟计算机算hash费电啊)。

POS

POW 的本质目的是为了保证数据是可靠的。优点是公平而且不容易出错,缺点自然就是浪费资源。所以有人提出了一种新的方案,也可以用来保证数据的可靠性,同时还节约资源,就是 POS(Proof of Stake)
POS 机制实际上是模拟了人类社会的信任过程。就好像中国古代动不动就找一个德高望重的老人家来主持公道一样,POS 就是找出一个德高望重的人,让他来负责记录数据,那我们就都相信他的数据是准确的。而德高望重,实际上就是一个根据你持有货币的量和时间来决定的。持有的时间越长,币越多,你你产出的新区块被认可的概率也就越大。
而怎么算你持有币呢,用上面讲的以太坊举例(注:以太坊对外宣称将来会改为POS机制,但截止目前,他依然是POW),你的每一个币其实都是放在一个数字钱包里面的,你说你持有币,其实你持有的只是数字而已,而数字钱包实际上就是一个记录数据的机器,这台机器是拥有记录数据能力的,机器拥有(钱包中)的币越多,新记录的数据越能得到认可。
但是,不知道你发现了没有,这又是一个套路。他已经从原本依赖机器去计算改为依赖币的量了,换句话说就是骗你去持有更多的币。你持有的币越多,你就越有可能让别人相信你的数据是正确的,而如果你让别人相信了一个新区块是正确的,系统会额外分你一些奖励(类似挖矿所得)。
于是就有人去吸引你把币放我这里,我去记录数据,因为币越多,放的时间越长,我发现新区块的概率也就越高,获得系统奖励的概率也越高,到时候再分你一部分奖励,这就是银行啊。

DPOS

POS 已经从很大程度上解决了资源浪费的问题,毕竟他基本上还原了分布式存储的本质,每台机器的主要作用是存储数据,而不是计算。
但 POS 实际上依然在每台机器上都还是有可能会有计算的,也就是那个根据持有币的时间和数量的概率算法。
而 DPOS(Delegated Proof of Stake) 是 POS 的进一步优化,他从全部的机器中选出几台机器来指定,只有这些机器可以轮流记录新区块,别的机器都只负责同步区块。这就真正还原了分布式数据库的作用——只用于记录数据。
但又引入了新的问题,这些有记录新数据权力的机器,如何指定。于是又引入了一个人类社会的信任方式——投票。
而这里的票,也就是你手里的币,你把你的币给别人,这就是给别人投票。但是没有人会傻到把币免费给别人,想要我的币,拿东西来换啊(类似于拉票)。
但是你发现没,号称去中心化的区块链,居然又变得中心化了,傻逼区块链。



more_vert