刨根问底区块链——基础篇

这篇文章是我在公司做的一次技术分享的 PPT 和讲稿,整理修饰之后加了点东西,写成了文章。希望能让更多的人理解区块链的原理,因为它实在是精妙,让我忍不住做一次彻底的分享。本篇文章很长,但对于研发同学应该非常容易理解。对于非技术的同学,如果仔细研读+搜索应该也没问题。我尽力讲的通俗,但绝不用笼统和离谱的比喻让你『貌似懂了』。

ps: 文字需要结合 PPT 图片看,完整 PPT 在文末有下载链接。

感谢大家来听我的分享——『刨根问底区块链』,这个是基础篇,也就是主要讲区块链的技术原理。虽然网上这类的文章、视频学习资料很多,但是大多数讲的都太浅,属于给外行人讲的,还有一部分讲的思路不够清晰,所以我按照自己的思路做了这个讲给『程序员』听的分享。当然如果你不是程序员,也可以尝试听听不会很难。

这回我们不谈币价,只谈技术,或许还能谈谈为什么身为『程序员』的你我在早些年没有引起足够的关注。

区块链技术一定逃不开它的创世者中本聪,也逃不开比特币。中本聪在发明比特币之初就希望创造一个自组织的货币系统,它不需要政府的背书。

早些年提及比特币大家首先提出的一个质疑就是:数字的虚拟的货币,真的值钱吗?真的有价值吗?关于这个问题,我们就要从货币的价值基础讲起。不妨回想一下,一种货币,它为什么值钱?是因为生产这张纸的成本高吗?100美元和1美元的生产成本都是9美分。

如果你思考足够深入,就会发现一种货币值钱的原因是所有使用它的人都相信它值钱。我们认为人民币、美元值钱,是因为我们信任政府,相信政府能给我们提供美好生活的保障,让我们手里的这些纸片一直能够花的出去。而在一些战乱的国家,这些政府发行的纸币就很不值钱,因为你不知道哪天政府就会垮台,你手上的钱就变成一张张废纸了。再比如津巴布韦的 10^14 面值的钞票,也是因为政府毫无信用地滥发钞票。再想想为什么黄金没有政府背书,却可以成为全世界的『硬通货』?也是因为人类有一个共识,Au 这个金属元素单质稀有且不可人工合成,化学性质稳定,全世界的总量有限。

因此我们可以得出一些结论,货币需要赢得人们的信任基础。我们设想一下,如果要实现一个数字货币,对标国家机器发行的货币,应该如何获得信任基础呢?

第一,对于国家而言要一直承认它,不能朝令夕改,那么对于基于计算机的货币而言,就是要一直运行这个系统的代码,永不宕机。最好是人类活多久它就运行多久,对吧。

第二,国家要保证它价值稳定,我们知道轻微的通货膨胀是有利于货币流通的,但不能滥发。但是我们知道人性都是贪婪的,对现状估计乐观的,发行货币这件事情交给再理性的人来做,也可能会超出预算。因此数字货币的发行应该不由人类来直接控制发行。

第三,我的钱无论是存银行还是钞票放家里,只有我的授权才能花掉,任何人不能没有我的许可花我的钱。对标过去比较容易,转化成术语就是需要我的签名才能使用。

第四,我的钱不能平白无故失去,这个看起来跟上一条有点像,但还是不同的。这是在说国家保障你的钱不能被人抢走,如果有人抢(偷)你的钱,警察会帮你抢回来,并且让作恶者得到惩罚。对标到数字货币,就是我的余额不可篡改。

我们纵观右边的这几条,是不是感觉除了第三点,其他的都很难实现?中本聪在08年的一篇论文《比特币:一种点对点式的电子现金系统》里全部解决了这些难题,当然这都离不开前人在密码学、金融学方面已有的一些尝试努力。

在我们对区块链技术,比特币原理一探究竟之前,我觉得必须要为大家补习两个密码学基础。(虽然很多人可能已经很熟悉了,但是据我不完全统计还有非常多的程序员缺乏密码学基础知识)

首先是 Hash 算法,这个算法可以把一个无穷的集合映射到有限的集合中,通过函数 f(x)。具体怎么实现不展开讲,但是你需要牢牢记住它的几个特性:

1. f(x) 不可逆,只能正向运算
例如A→Hash,你无法再通过 Hash 还原得到 A 了,除非你一次次穷举找到 A 这个值。而且值得注意的是,你把无穷的集合映射到有限集合中,势必有多个值映射同一个结果,这也是你不能逆向运算的原因之一。

2. 极少碰撞,极难找到hash值相同的
虽然这个映射后的有限的集合是有限的,但这个集合非常之大,拿 SHA256来举例子,它的值能表示多少种状态呢?想象地球上所有沙子,假如每粒沙子都是一个地球,而这些地球里的每粒沙子加起来总共也小于它的值。一个优秀的 hash 算法,碰撞应该是极少的,你很难找到两个值映射后的 hash 值相同。

3. 正向运算很快,即使原文很大

有了以上这些特性我们基本上可以用一个 hash 值去代表它的原文了,因此 Hash 算法广泛应用于信息摘要、压缩、验证、随机,如果你不理解随机,可以看最下面这张图的例子,原文『dog』后面即便多一个『.』hash 值也会大相径庭,可以说得到的 hash 值非常随机了。如果你想得到某个指定的 hash 值,你只能一次次的枚举原文,尝试得到指定的 hash 值。

第二个是非对称加密算法。我们一般都已经习以为常的是加密解密用同一套密钥,但是你有没有用想过你和别人商定密钥的这个信道也会被偷听。这时非对称加密就诞生了,很简单的一个特征:用公钥加密只能用私有解密,用私钥加密的只能用公钥解密。

你要给别人发消息的时候,对方可以放心大胆地把公钥发给你,你用公钥加密好密文后再发给对方,对方再用自己的私钥解开。这一切在不安全信道传输一点问题都没有。这就类比于,A给B一把锁,只有 A 有钥匙,B 拿到锁之后,把箱子锁起来再交给 A,这样搬运箱子的快递员怎么也打不开箱子,只有 A 能拿钥匙打开。

当然私钥一般不是用来加密,一般用于签名,这样任何人都可以拿公开的公钥进行验证了。

再来回顾一下我们之前列举的数字货币要解决的几个要点,猜测一下08年的中本聪是怎么制定技术方案的。

1. 一直运行代码,永不宕机。这个看似荒唐,其实不难,我们知道为了防止单点故障,常常会用到分布式系统、异地多活。但是难点在于这个分布式系统中的节点要足够多,足够分散,而且要保持一直运行,这就需要有人愿意一直运维。

2. 不由人类控制发行。是不可能的,但我们能做到的是避免人类直接控制发行,这个就好像三权分立、SRE 运维机器一样,总结一句话:人管代码,代码管机器,人不管机器。而且在后来事实上表明:社区管人。

3. 有我的签名才能使用。这个很简单,不多说。

4. 我的余额不可篡改。额这个有点难,为什么难大家可以思考几分钟,接下来会细讲。

如果是中心化存储余额,像各大银行那样,维护每个人的余额信息是很容易的。但是分布式存储余额,相当于每个人手里都有一本帐,当发生交易的时候,我们可以把交易的消息广播(消息的网络广播原理 p2p 技术已经发展很多年了,不再展开解释)给其他所有人,让其他人都改变自己手里的账本。这就有点像三体人的账本,假如每个人都不会欺骗撒谎,自觉做余额的加加减减,那么每个人的账本都将准确地记录了每个人的余额。

但是每个人都记录余额的这种方式用脚趾头想想都觉得不可行,因为任何人都可以篡改这个余额。(给自己多记一点,别人少记一点。)所以我们应该记录的是转账记录(交易记录),只记录余额一定会扯皮!只有交易记录是不可篡改的,因为每笔交易,都必须经过付款方的签名才有效。而余额需要交易记录的『对账』才能保证正确。

因此我们得到一个结论,我们的『分布式公共账本』记录的应该是交易记录,而不是余额,因为『余额』是『交易』的冗余信息。

不存储余额,区块链是这样定义一笔交易定义的数据结构的(如图)。用比特币举例子的话就是,一笔交易要想成立,要有input 和 output。 input 是过往别人给你转钱的输入,output 就是你要给别人转钱的输出。

例如,你要转6.5个 btc 给老王,那首先你要先拿出历史的交易记录,证明你至少有6.5个 btc。于是你随便拿出了三个历史交易,分别是老张、老马、老李曾经转给你的,加起来是7个 btc。当然你也可以拿其他更多的转账的历史记录出来,前提是无论你拿出的 input 有多少条记录,加起来的 btc 数要等于 output 的总 btc 数。这个例子中,你只想转给老王6.5个 btc,还有0.5个btc可以选择转给自己,就相当于找零了。这里的 output 的交易数没有限制,可以转给多个人。

当然一笔交易除了 input=output 这个规则之外,肯定还需要你提供的 input 的交易记录不能被使用过。老张、老马、老李转给你的交易记录,只能被使用一次——你这次的交易使用它们作为 input 了,下次就不能再用了。同理,你转给老王的6.5btc的 output 记录可以被老王作为他的input 在他想交易的时候使用。同理,你转给自己的0.5个btc也一样,每条 output 都只能被使用一次。

再多啰嗦一句,每一笔交易的 input 在使用之前是需要验证签名的,A→B 要被使用,只需要验证使用人的签名是否是 B 即可。

我们把没有使用过的交易记录,称为:未花费交易输出(UTXO)。比特币系统中的账本记录了历史上每一条交易记录,非常庞大。但是不用过分担心性能,虽然账本记了所有的记录,但每个节点可以自己维护一个 UTXO 的集合,每笔交易在验证的时候,只需要看看 input 是否都在 UTXO 集合中即可。

有了签名+交易记录,每笔交易都有签名都真实可信,看似解决了大部分问题,但实际上问题还很多。

第一个问题是:如何保证交易的时序?
当我向整个网络广播交易的时候,可能存在网络失联问题,造成我的交易没有被所有节点收到。也可能有网络延迟,别人给我的转账的消息 m 还没被A节点收到,我给别人转账 input 里用到了 m,这个转账消息 n 先被节点 A收到了,A 就会认为这个转账消息无效。甚至有些节点故意忽视我的转账消息。可以说交易必须要有严格的时序,同样的几条交易顺序不同,得到的结果也不同。但分布式网络节点之间互相不信任,不可能有统一的时间戳,也不可能信任一个中心化的 ntp 服务。如何实现这个网络的时钟呢?

第二个问题是:以谁记录的账本为准?
去中心化的网络,大家都能记账,那肯定就会有恶意节点故意漏记,也会有无辜节点因为网络问题漏记。你总不能以让全网所有节点都收到消息为准吧,也不能以大多数节点记的帐为准,因为攻击者可以恶意制造大量节点凑数。如何才能写一个大家公认的,不能被篡改的账本呢?

废话不多说,直接看中本聪同学的参考答案。

首先要解决的是时序和防篡改的问题。定义这样一个数据结构,叫做『区块』,它存放的是单位时间内的交易明细。(程序员可以类比于你写数据库的时候的一次事务)这个区块内的每条交易记录都是合法的,都验证过签名、input=output、input 是否未花费。

区块的头部存着一些必要的信息,时间戳、区块大小、hash 值、上一区块的 hash 值等等,区块的 body 记录了单位时间(比特币是10分钟)内的交易记录。

注意,重点来了。一个区块的HASH值 = hash(上一区块的HASH + 本区块的内容),『本区块的内容』包含了body 里的交易记录还有 header 里的那些杂七杂八的值。这样每个区块的 HASH 值都取决于当前区块的信息,加上一区块的 HASH,加在一起算了个HASH。每个区块引用到上一个区块的 hash 值,这样就连成了一个链条,区块链的名字就诞生了。

大家可以思考一下这么做有什么好处。结合之前讲的 hash 算法的特性。

  1. 如果你篡改了历史上某个区块的交易记录,那么从那个区块往后的区块的 hash 值都得重新修改一遍,相当于整个路径都篡改一遍
  2. 如果你想调换某两个区块的顺序,对不起,这两个区块到现在的所有链条上的区块hash,你都得篡改一遍。

但是核心问题还没解决,因为这两种方式篡改账本的成本都很低。作为攻击者,我大不了就把链条上的区块 hash 都重新算一遍,自己生成一条新的链也就是新的账本出来。如果不提高记账的门槛,不选出来一个公认的账本,这个问题永远得不到解决。

举一个现实中的例子帮助大家思考这个问题。就比如我们从小到大考过的证,它们是怎么保证时序和不被篡改的呢?你想考英语六级,必须先拿到四级证书,考英语四级的前提是你必须高中毕业。

你有没有发现,保证时序其实是靠两点,一是拿证书的前置条件,二是学习需要花时间。从高中毕业开始,达到英语四级的水平至少要学1年英语,达到六级水平至少要2年。我们对标到区块链系统,考证的前置条件类比于hash 链,同时你考这个证书(生成区块)不能毫无门槛。试想如果生产每个区块至少要花费10分钟,那么篡改一条链的 hash 就非常费劲了。

以谁记录的为准,在去中心化的系统里就是:在区块有生产门槛的前提下,看谁先生产出来符合条件的区块。(大家一起考个试,看谁最先把题目全部做对)

当然前提是,这种有门槛的生产区块的方式,要足够公平,而且通过这种方式生产出的区块,要得到大家的公认且容易验证的。

那么,什么才是,有门槛、公平的、不能作弊、产出大家公认且易于验证的方式呢?

按照这个思路,工作量证明就呼之欲出了——

我们指定一个规则,每个区块的 Hash 值,必须小于数字 n。举个例子,比如这个块的哈希值我算出来是0x123456,而我们规定的 hash 值必须小于1000,那么你就得调整区块内容,区块头部有个可以随意变更的数字 noce,你不停的尝试不同的 noce,使得区块的 hash 值是0x000开头,比如0x000987,小于1000了满足条件。 因为算出的 hash 值是毫无规律可寻的,你无法通过目标 hash 值逆推原文中的 noce,这使得你要尝试很多次 noce。比特币网络用的hash 算法 SHA256,它是64位16进制数,规定的 n 越小,尝试的次数就越多,花费的时间也越长。比特币通过 n 值来调节难度,差不多是10分钟才能尝试出来一个符合要求的 hash。

noce 位数有限,还可以改变coinbase和交易条数。试出满足条件的hash需要算力,且纯碰运气。要注意的是,这个10分钟是指的全网的算力加在一起,需要约10分钟才能算出一个符合条件的区块。因为谁最先碰出来符合的 hash 是纯随机,算力强只能提高碰出来的概率。你可以类比买一期彩票,或者想象这样一个游戏,所有人同时扔骰子,谁最先连续扔出10个1点,就获得记账权。显然这是纯看运气的一件事,但是从概率上说,参与的人越多,越容易出现连续10个1,同样你抛的比别人快,同等时间内你的胜出的概率也越高。

这个过程称为『出块』,也叫『挖矿』,负责挖矿记账的人(节点)被称为『矿工』。

所以,当网络里参与的人越多,算力越高,比特币出块时间就会变短,原先10分钟出一个块,现在1秒钟出一个,这是我们不希望看到的。所以整个系统还需要动态调节这个 n 的值,使得挖矿的难度控制在平均10分钟出一个块。比特币系统的共识是,每2016个区块(大约是两周时间) 大家按照约定的规则,复查一遍过去的出块时间。如果平均时间短于10分钟,则适当提高难度,按照一定的算法缩小 n 这个目标值。反之则降低难度,调大 n。

纸上得来终觉浅,如果你想了解更多关于区块数据的知识,可以找一些在线的区块浏览器,一般都是矿池发起做或者官方社区的,比如:比特币区块浏览器(btc.com)、以太坊区块浏览器(etherscan.io) 。你可以在里面看到现实中区块内详细的数据。

但是也有一定的概率,10分钟内有两个人几乎同时算出了下一个区块。这里说的『同时』可能是前后1、2分钟,因为区块广播到全网需要一定的时间,各个节点接受到的消息也有先后,不好说谁的区块是先算出来的。这时区块链网络就会分叉,有的矿工基于 A 区块算下一个区块,有的基于 B 区块,但是没关系,我们有一个原则就是:最长链原则,就是大家都只认可最长的那条链。因为较长的链中包含了更大的工作量,这是所有节点的共识。

那有没有人为了赌气让自己的区块得到承认,就是硬要基于 A 这个较短的链来挖矿呢?答案是没有,这是一个博弈问题,有点像囚徒困境,因为你不知道别人会不会基于较短的链来挖,而且别人也都这么想,因此最理性做法就是随大流都挖最长的链,你硬要来一场豪赌最后只会白白浪费时间和算力。

那会不会有人为了反悔一次交易,而故意竞争较短的链呢?有的,下面将会讲到。

其实前面说了这么多,工作量证明的一个很重要的目的就是解决双花问题。什么是双花?很简单:

假设一个交易场景,A 给 B 转 2 个比特币,B 给 A 货物。A 可以先向全网广播一条,『A 给 B 转了2个币』的消息,这个消息被矿工收到,然后打包成区块,确认了这笔交易。假设这时 B 看到包含这条交易的区块被生产出来了,就把货给A了。但其实 A 同时在广播另一条交易,让这2个比特币的接收人是 A 自己,即 A→A,然后 A 联合多个矿工一起拼命的基于后者的区块算下一区块,只要算得足够快,让这条链的长度大于给 B 转币的那条链,A 就能反悔交易,相当于 A 篡改了历史交易!

这个操作听起来可行,我们来实际算一下:

  1. 假设和 A 共谋的矿工算力非常强,占全网总算力的50%以上,那么 A 的胜算是100%。因为这群矿工算出下一区块的概率永远比其他人加在一起要大一些,追上 A→B 这条链只是时间问题,总有一天能追上并反超。

    这就是我们常说的51%攻击,如果有人真的能掌握全球参与挖矿的算力51%以上,那他就有100%的胜算发动攻击,只是时间问题。当然,随着系统中参与的算力越来越多,再牛逼的人恐怕也很难控制全球那么多算力。

  2. 假设 A (攻击者)这边的算力只有 q (q<50%),那么攻击者最终消弥 z 个落后区块的概率为(如图),即攻击成功的概率。为了使攻击者攻击成功的概率小于0.001(小概率事件),则至少要 A→B 这个交易所在区块诞生后再等 z 个区块诞生之后才够安全。我们可以列出一个表格来,当 q=10% 的算力时,只需要等待5个区块即可……当 q=45% 时需要等待340个区块确认。

比特币的白皮书中有详细的论证,感兴趣的同学可以亲自去阅读→比特币白皮书←。现在人们一般认为一笔交易被确认后有6个区块被确认,这笔交易就可以被确认是安全的了。

在前面讲到交易的 input 和 output 的时候,你一定想问:一直追溯到源头的 input,这些币是哪来的呢?答案就是『矿工奖励』。每个区块里交易的第一行,允许矿工给自己转 50 个 BTC,这条交易记录没有 input,只有 output,即矿工填写的自己的地址,作为挖矿的奖励。这个奖励每四年减一半,如今已经是12.5个比特币了。

仔细想想,矿工不仅充当了记账者的角色,还在挖矿的过程中不断发行比特币,维护了系统安全。充当了系统的维护者和货币发行者的角色。

大概在100多年后,奖励将少于比特币最小计量单位:1聪,2100万的总量全部开采完。到那个时候矿工还有动力挖矿吗?有的。每笔交易都可以选择性附带手续费,当2100万比特币全部挖出后,手续费将成为矿工的收入来源,事实上,目前为止手续费也是矿工的收入来源之一(未来会成为重要收入来源)。矿工甚至会按照手续费高低的优先级来打包区块。因为区块的承载能力有限(目前1-2M大小,约2000条交易),当交易数量变,交易变得拥堵,手续费低的交易会被推迟打包进入区块,从而促使人们提高手续费。

比特币、区块链的基础原理就讲完了。以上说的出块时间10分钟,区块大小1M,2100万总量等等的参数只是比特币的特性,事实上现在涌现出很多分叉币、山寨币、各种公链,这些参数、算法各异,有的在尝试改进和优化方面确实做出不少的进步。

有问题可以在下面评论,这里准备了几个常见问题,自问自答一下。

挖矿会消耗巨大的电力资源,这是不是一种浪费呢?是,但这是不可避免的。维护一个金融系统的安全稳定总是要付出巨额的成本,无论是现实世界的挖金矿的矿场,还是建银行仓库、安保防护、培训专业人员、开发银行系统、请最顶级专家……这些花费全球加起来并不比区块链挖矿所消耗的资源少。1200美元/盎司的黄金生产成本是1000美元,而且在生产的过程中需要花费巨大的人力开采、提炼,提炼的过程要用到汞之类的有毒物质,无论是对工人的健康危害还是对环境的破坏都很大。

我们通过上面对工作量证明原理的了解知道,矿工挖矿所付出的巨大算力,在维护系统的正常运转的同事,也在提高攻击门槛。

但是,比特币的全网算力已经达到30 EH/s + ,(即每秒做 30E 次哈希运算,M、G、T、P、E,每个单位之间相差1024倍)非常可怕,本着可持续发展的理念,有没有办法可以减少挖矿的花销呢?

有。目前区块链行业出现的百花齐放的现象,每个链(币)都号称致力于解决某项技术难题。在减少挖矿资源花销方面,我总结了一下,主要分为两种方式:

  1. 改变证明算法,例如:素数币。它的工作量证明不是计算无意义的哈希,而是寻求迄今为止人类发现的最大的素数,因为我们知道素数在数轴上的分布是不均匀的,不可预测,求更大的素数和 hash 遍历有着异曲同工之妙。什么?你问求大素数有什么用?数学是人类生产活动的根基,数学进步一般都是领先理论物理,理论物理领先工业应用。现在看不到用处的数学理论不代表未来没有用处。

    但是求素数并不能降低资源开销,只是让它显得不那么浪费而已。莱特币和以太坊的 hash 算法,都做了特别的修改,使得计算 hash 值的过程中比较占用内存资源。看起来是更耗资源了,其实是为了防 ASIC 矿机,ASIC 针对 SHA256 做了处理优化,这种矿机没有内存,挖矿效率极高(比显卡效率高了数万倍)但是莱特币和以太坊的 Scrypt 和 Ethash 算法需要消耗内存,因此不能用 ASIC去挖矿了,只能用显卡挖矿。但是显卡全球的生产效率并不高,受制于显卡的算力和生产速率,因此后者的全网总算力不会像比特币增长的那么夸张。那假如比特大陆研发了专门挖莱特币、以太坊的矿机怎么办?那算力岂不是又会增长很快吗?以太坊社区曾表示过这种担忧,但是他们宣称,如果有这种矿机问世,他们就再次改变算法来抵御矿机。

    最后有个道听途说的链,据说把 hash算法替换为可以帮助生物研究,穷举蛋白质折叠的运算,不知真假,但愿未来能够实现吧。但是说了这么多,大家可能还是觉得这是饮鸠止渴,还是不能解决挖矿消耗资源大的问题。是的,因此出现了第二类解决方案:

  2. 改变共识机制。既然工作量证明(POW)不可避免地要消耗巨大算力,何不换一种共识机制,不要工作量证明。于是出现了权益证明(POS)、委任权益证明(DPOS)等等,简单来说,POS把靠链外资产的保证(买矿机挖矿),转移到链内来(矿机和挖矿的钱转化成链上的『币持有天数』),有点像有钱人(权益相关人)说了算。但是无论是 POS 还是 DPOS,都是有很多问题需要解决的,需要更巧妙的设计,防止合谋作弊之类的。*最重要的还是要经得住时间的检验(比特币的 POW 使比特币稳定运行了快10年了)。由于是『基础知识篇』这些共识机制就不一一展开讲了,网上能搜到的资料非常多,可以慢慢研读。

    当然,有时候区块链不一定需要『公有』。例如银行、证券交易所、互联网公司,三方想建立一个网络系统,实现某些商业合作往来,互相之间要建立共识,并不需要其他节点也参与进来。这就可以组成一个三方的联盟链,区块链技术可以让这三方的节点平等地记账、交换数据。这时的三方并不需要任何工作量证明、权益证明来保证互相信任,所以省去了一大麻烦,一般用拜占庭容错就可以了。

    进一步退化,可以有私有链,私有链也是有意义的,因为区块链作为一项分布式数据存储的技术,在 CAP 原理中,弱化了一致性(C),在 A、P 方面非常强,也不失为一项优秀的数据库技术。

现在区块链这么火,炒币功不可没,那它除了炒币,到底有哪些应用场景呢? 其实我也在探索当中,只能是把我目前能看到的,和自己的理解阐述给大家,不一定对,仅做参考。

首先可以肯定的是区块链对金融行业的变革。各类数字货币作为『货币』的支付场景,这个就不用说了。如果延伸货币的概念,在链上流通的还可以是积分、代币、股票、信用这些东西。我们现在很少会很在意某个企业发的积分,因为你在支付宝上的蚂蚁积分只能用来在支付宝上换些XX会员,而天猫积分也不能去买京东上的东西,京东的京豆也不能兑换铂金信用卡的机场贵宾休息室。积分的使用场景单一且有限,使得我们不那么看重它的价值。而我们公认有价值的东西,能流通起来的例如股票,背后又需要有强大的金融机构,强有力的监管作为支撑。造成这种差异来自两个方面,一是系统之间因为信任或利益纠葛或技术难度难以互相打通,另一方面是需要权威机构监管和背书的成本高。试想一下我们在支付宝的蚂蚁积分和信用卡积分、京东积分、甚至游戏积分都可以互相转换和使用,或是统一起来成为信用+代币体系,是多美好的景象。

目前,跨境转账也是区块链的一个有力应用场景。我买美股的时候尝试过一次跨境转账,速度慢且扣了不少手续费,我对金融业实在不了解,不太明白为什么需要这么长时间才能完成转账,而且手续费总是算不对,据说难点在于冗长的对账环节,还有陈旧的银行系统。瑞波币在这方面取得了很大的进步,它使得跨境转账速度快、手续费低,深受大众欢迎。

同理,把货币延展到任何资产,借助智能合约在链上做资产的自动清算,追溯每一笔资产的流动。说到智能合约,就不得不提以太坊,将智能合约带上了区块链。

关于『智能合约』的原理,限于篇幅,只做简单描述:比特币每笔交易传递的是『币』,同时执行的是一个『固定的函数』——验证是否交易者这笔花费是否合法。把『币』替换成『消息』,把『固定的函数』替换成自定义代码。我们可以大致了解到智能合约使得区块链就像一个分布式计算机,执行自定义的代码。事实上以太坊也实现了一个图灵完备的语言,可以运行在它特定的虚拟机上。这个想象空间是不是又大了很多?但是就目前的话……运行在以太坊之上的『Dapp』都比较鸡肋,应用最广泛的就是基于以太坊的各类代币了。

接下来是对于未来的一些猜测。前段时间我也做了个基于以太坊的 Dapp,感受最深刻的有以下两点:

  1. 没有写一行后端代码,只有前端+合约。前端静态文件随便找个CDN 就能放,后端完全由以太坊链来担任。而原本后端的存储、计算成本,通过每个『请求』由用户来承担。(当然,后端完全依赖『链』来实现是不够合理的,目前的链承载不了太大的数据量,性能和容量都还由很大问题,而且每个『请求』消耗的手续费较高)

  2. 不需要实现用户系统(账户、注册、登录),不需要实现转账模块。这俩模块都被链自身实现了,开发者只需要简单调接口即可。(当然,用户系统基于公钥、私有,这让用户的使用门槛提高了不少,用户可能很需要一个优秀的钱包。如果丢了私有,账户不可找回)

于是我大胆猜想,或许在区块链技术在性能、容量方面有些突破的时候,区块链可以作为一种云计算服务提供出来。现在有一种叫法,把 PaaS(Platform as a Service) 的平台改成 BaaS(Blockchain as a Service),区块链即服务。

另外,因为区块链有上链后数据『不可篡改』的特性,还可以结合物联网做一些防伪溯源的东西。区块链虽然不能做到从源头上辨别数据的真实性,但可以保证链上的是公开的、不可篡改的,这在一定程度上也是能解决问题的,因此防伪、溯源、存证我认为也是一个有前景的方向。

最后最好能够实现我上面说到的,让有价值的『资产』在互联网上传递流动起来。

还有一点就是 ICO,这个观点来自于马占凯老师,我也引用了他的一页 PPT。对比传统的 IPO 流程,ICO 的方式有点像众筹,但又不全是,非常便捷,自给自足。虽然现在中国禁止了 ICO,但我们不妨多思考几步,如何能让 ICO 市场变得有秩序,如何防止圈钱行为?干实事的公司是不是可以把 ICO 的期限拉的长一些,比如分10年解锁全部代币,再利用智能合约,在一些里程碑时间点如果做不出成绩就有惩罚措施等等。或许有一天 ICO 还会换一个名字再回来。

区块链是一个泡沫吗?一个事物被热炒起来,肯定是会有很多的泡沫产生,但不会全是泡沫。泡沫能吸引人才,能让更多的钱和资源流入。就好像当年的互联网泡沫一样,当泡沫破碎了之后,发展到今天,你肯定不会再说互联网是个泡沫了。只能说待市场冷静下来,让有价值的部分发挥作用,让子弹飞一会儿。

最后推荐一波我写的 Dapp —— 共享画布
链接地址:http://dapp.zhusun.in
玩法参考:http://cyhhao.zhusun.in/article/专题/blockchain/dapp/
源码:https://github.com/cyhhao/eth-canvas

有兴趣可以关注我的 Github知乎微博、知识星球。

感谢大家的聆听,这篇是区块链基础原理篇,以后如果有空可能会再写『进阶篇』吧。

最后附上文章原始的 keynote/ppt 下载链接:
Keynote:https://static.zhusun.in/blockchain-share1.key
PowerPoint:https://static.zhusun.in/blockchain-share1.pptx