38

玩玩区块链——概念

 4 years ago
source link: https://www.kymjs.com/code/2019/11/21/01/
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

继我成功预言了 Kotlin 、Flutter 技术会火起来之后,我相信,下一个会火起来的技术是区块链。

1. 别抬杠,我 14 年开始玩 Kotlin,16 年开始玩 Flutter (虽然看了看实现原理觉得没啥屁用就放弃了)的时候,可能你还不知道这俩名词呢。

2. 别抬杠,我说的火起来的区块链技术是私链+合约(我不想提那俩字,我觉得智障更合适)。

3. 抬杠吧,反正我从来没玩过数字货币,我也不怕被割韭菜。

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

讲个故事

这个故事是 2016 年 MDCC 大会结束一起聊天的时候,听 冯森林 冯老师讲的。背景是:前几天有个人问他,说冯老师我很迷茫,前端技术天天变,而真正重要的东西都在后端,我该不该去学后端。

在很早很早之前,程序员就是程序员,不分什么前端后端客户端,后来是我们人为的在中间画了一条线,规定线的左边叫后端,线的右边叫前端。在左边与右边的信息交互,我们用一种协议去完成。

而事实上,在当今世界跟用户打交道的都是前端,离开了用户,后端终究只是一堆冷冰冰的数字,而随着人工智能与物联网的发展,我们是有可能讲这些冷冰冰的数字计算,放在端上完成的。

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

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

比特币

分布式数据库

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

区块链

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

区块内防篡改

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

6fIBN32.png!web

核心结构是由一种称之为默克尔树的二叉树实现的。当前区块的全部交易信息位于叶子节点,然后每两个相邻的叶子节点聚合进行Hash运算,运算结果作为中间节点,中间节点再次两两聚合进行 Hash,最终生成唯一的根节点 Merkle Root。默克尔树的特性在于,任意叶子节点发生改变,改变都会影响到上层的 Hash 运算结果,最终经过层层传递,根节点的 Hash 值也将发生改变,基于此特性,比特币系统牢牢的将区块内的所有交易聚合成为一个整体,任何的篡改行为都会影响到整个区块。

而比特币每次有区块新增的时候,其实都会计算一下默克尔树,但这段计算其实是很快的而真正耗时的,其实是一段没有任何意义的计算。(这也就是有人说比特币浪费能源的原因)比特币会每隔一段时间,生成一个区块,但是为了保证生成区块的时间稳定,就强制要求所有挖矿的矿工(存储机器)不停的去运算一个很复杂的运算,而这个运算的复杂度是动态变化的,整个系统能保证每次运算出结果的时间都差不多10分钟。 第一个运算出结果的人,要把这个结果告诉所有正在计算的矿工(其他存储机器),这样,他就算是成功记录了新的区块,而别的矿工就会同步他记录的这个区块,作为最先运算出结果的矿工,也会获得奖励(也就是比特币)。

所以,看出来了吧,本来是用来存储的机器,结果最大的代价居然不是存储,而是不停的计算一个毫无意义的运算,这就是个笑话。

(扩展知识:双花问题、51%攻击,自行搜索)

各种空气币

比特币被称为区块链1.0,很多人希望把区块链的技术应用到数字货币之外的场景,然而,比特币本身的功能单一,对用户来讲,无非是挖矿、转账交易,于是就有了区块链2.0,以太坊。

前面已经说了,比特币计算一个区块是十分钟左右,而以太坊计算一个区块是十几秒,这就大大提高了数据同步的速度,也就是说交易确认将会更快(垃圾,再快能比微信支付宝快吗:joy:)。

然而,以太坊的成功并不是他的交易速度。比特币有一个很大的问题,就是其中协议的扩展性是一项不足,例如比特币网络里只有一种"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 的进一步优化,他从全部的机器中选出几台机器来指定,只有这些机器可以轮流记录新区块,别的机器都只负责同步区块。这就真正还原了分布式数据库的作用——只用于记录数据。

但又引入了新的问题,这些有记录新数据权力的机器,如何指定。于是又引入了一个人类社会的信任方式——投票。

而这里的票,也就是你手里的币,你把你的币给别人,这就是给别人投票。但是没有人会傻到把币免费给别人,想要我的币,拿东西来换啊(类似于拉票)。

但是你发现没,号称去中心化的区块链,居然又变得中心化了,傻逼区块链。

了解更多有深度技术的文章,与移动端、大前端未来方向的认知, 前往订阅 开源实验室小专栏。


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK