本文是播客 Teahour 以太坊专访文字版,收听地址 http://teahour.fm/2016/01/19/talk-with-jan-about-ehtereum.html ,也可以在喜马拉雅、iTunes 搜索 Teahour 收听。
(前边的开场白与区块链和以太坊无关,略去)
Terry:OK!接下来我们要说说第三则新闻,就是万向区块链实验室在上海举行了一个全球性的区块链 Hackathon(黑客马拉松),我们也去参加了这个 Hackathon。然后……我们有没有得奖?哈哈哈!!
Jan:有幸有幸。 Terry:嗯,有幸获得了一万美元的奖金。我以前也参加过几次 Hackathon,你以前也参加过吗?
Jan :也参加过,我参加的比较少,参加过一次。 Terry:那你对这次 Hackathon 有什么想法?
Jan :我觉得要感谢一下万向还有德勤,Hackathon 组织的非常好,感觉也非常好。因为当时比赛的地点是在外滩中心。然后… Terry:很高大上?
Jan :对,奖金又高。在那么高大上的地方从事着这么有意义的事情,感觉非常好。 Terry:我参加过很多 Hackathon 不管是线下线上的,这也是我参加所有 Hackathon 里面办得最高达上的,吃的也是最好的!虽然吃的东西很简单,但是也算是吃的好的了。吃的喝的随便供应,环境也非常不错。每个 Team 还有一个办公室!其他地方能给一个大长桌就不错了。环境真是……这些搞区块链的金融公司有钱是吧。然后奖金也挺高,我们不是第一名,第一名是三万美元,我们得的算是第三名的奖金。第三名和其他的奖项奖金都是一万美元,一万美元也算是很高了,里面一共是有二十多个队参加,能够有幸得到这个奖。 我们做的这个项目叫……要不要说一下?名字叫 NEVER MORE!好,现在你们猜一猜 NEVER MORE 是什么意思?
Jan:这是本期的提问吗? Terry:(笑)没有没有。
Jan:观众来信有奖吗? Terry:OK,我觉得玩 dota 的人应该都知道,NEVER MORE 就是影魔,这个也可以说是我们的小文化吧。这个就是我和 Jan 一起做的东西,因为我们两个都喜欢玩 dota,然后我们做的项目都会以一个英雄来命名,对不对?
Jan:对。 Terry:然后这次我们为了拿到奖金,不惜拿出了我们最酷的一种 NEVER MORE。幸好拿了奖,不然就完了。OK,这三则新闻我们就说到这,关于 Hackathon 我们鼓励黑客去参加一下,我觉得这个在国外特别流行而且很多大神参加。你会发现很多一线的 Rails commiter 都会去参加 Hackathon,当然他们当中有人可能甚至还没得奖,我不知道是不是面子思想的原因,在中国稍微有点背景,有点资历的程序员就不愿意去参加这个 Hackathon,怕得不到奖多丢脸。其实有什么啊,对吧?Hackathon 又不是比技术,很多都是比你的 idea,甚至是 presentation。所以去 hack 本来就是一件很愉快的事情,不要太在意奖金,能不能拿奖,这个过程本来就是一件很好玩的事情。但也不要参加太多,这个对身体可能……会有影响。(笑)
Jan:需要补肾吗? Terry:(笑)OK,我们新闻就说到这些了,接下来我们要聊一聊我们今天的正题了。首先我们简单回顾一下,我们上一期说到的最后的部分。 上一期我们谈到了 Bitcoin script(比特币脚本),我们谈到了在 Bitcoin 上面它除了有数据库的性质之外,它还有计算的性质。但由于 Bitcoin 它不算是一个有图灵完备的语言,于是我们就引入了一个项目叫 Ethereum。它是要来解决这个问题,把这个语言变成一个图灵完备的语言,那么我们就先深入了解一下这个项目。 首先,这个项目叫做 Ethereum,这个名字好难念。Ethereum 对吗?
Jan:对。 Terry:先从名字开始吧,Ethereum 是什么意思?
Jan:他应该是一个合成词吧。 Terry:Ether 应该是以太的意思。
Jan:Ether 是物理学里面的那个以太,绝对静止的存在于空间的那种物质,最后被证明为是不存在的。中文翻译成以太坊。 Terry:感觉挫了很多……
Jan:我也不知道这个坊从何而来,当时不知道是谁翻译的,总之后来大家就这么叫了,叫它以太坊。坊是红磨坊的那个坊。 Terry:那么我们先就来说说这个项目,首先大体介绍一下这是个什么项目?它为什么会诞生,它要解决什么问题?
Jan:首先第一个理由就是我们上一期说到的,比特币 script 有很多限制,上面有很多东西都做不了,所以很自然的想能不能把它扩充,把它变得更完备。但实际上,它也不算是完全的图灵完备的。以太坊它的目的是图灵完备的,但实际上它并是完全的图灵完备。它上面有一个叫 gas 的限制,这个我们可以在接下来详细聊。但是现在大家就是说它是准图灵完备的。 Terry:但是它是朝着目标去的。
Jan:但是它是朝着目标去的,而且比比特币的 script 已经强了非常非常多,能够做很多事情了。 Terry:那你上次说 Bitcoin script 没有循环?那么现在的以太,此时此刻的以太一定已经有循环了?
Jan:对,此时已经有循环了。然后第二个原因是,在以太坊出现以前当时已经有很多 Altcoin,中文翻译成山寨币或者叫二代币什么的,就是有很多其他的密码学货币项目。但是这些项目的模式都是 fork 一个代码库,然后去改底层代码。 Terry: fork Bitcoin.
Jan:嗯,然后去实现一个功能。当时 Vitalik 就说为什么要这样做?为什么不能把功能层或者应用层给抽象出来?这样的话我们大家就不需要去 fork 了,就直接在这个平台上写程序就好了。因为 fork 是一件很麻烦的事情,你可能是一个 ruby 程序员,你不会写 C 或者 C++,那如果有这样一个平台的话,任何一个人都可以参与进来实现区块链上的功能,不是很好么。 Terry:所以这个项目听起来像是说它想建立一个平台,然后你可以在上面做一个基于区块链的应用?
Jan:对,没错。 Terry:那这么一抽想来看的话,是不是比特币也是 Blockchain 上的一个应用了?
Jan:对,实际上比特币就是实现了一个转账嘛。我发布一个请求,然后这个账簿里面 A 减掉 50 块 B 加上 50 块,这个事情在以太坊上面两句话就写完了。 Terry:OK,那就是我要在以太坊上面建立类似一个比特币的应用是一个很简单的事情。
Jan:对,很简单的事情。而且他们现在在以太坊上正在提出一个标准,如果你想在以太坊上面写出一个 coin 出来,你的程序需要有什么样的接口。然后,它又定了另外一个标准就是一个注册表,这个注册表又有一些什么样的接口。这样一来的话,每个人都会发行自己的 coin,而且你发行的 coin 是可以在注册表上注册的。而且因为接口是相同的,你这个程序无论是想用 Terrycoin 还是想用 Jancoin 都很方便,因为接口都是一样的。而且由于它有一个统一的接口、统一的注册表,它的钱包软件就会自带这个功能,把这个注册表上所有的 coin 展示给你。你就可以很方便的查找或者转账,就是这个钱包不仅可以转以太,而且可以转任何个人发行的自定义的 coin。 Terry:那我做一个不恰当的比喻,可不可以是这样,Bitcoin 有点像一个人造了一个计算器。而 Ethereum 有点像一个 iPhone,上面可以跑一个计算器的应用程序?
Jan:对!而且它现在还在尝试做一个开放的 APP store,这个 APP Store 不是掌握在以太坊手里的,而是一个标准一个接口一个 interface。只要你遵循这个 interface 你的 APP 就能在 APP Store 上被看到。 Terry:那我想问一下,你一说到这种 APP Store 人们就会想到苹果、Google,主要是想到苹果。这后面有一个很大的利益集团,我和你三七分或者怎么样,那 Ethereum 它是一个公司啊还是一个开源的项目或者怎么样,它是把握在一个公司手里的吗?
Jan:其实并没有,以太坊是有一个基金会,应该就是叫以太坊基金会吧,它是一个非营利性的组织,它没有商业的收入只能靠捐助活下去。以太坊本身实际上也是一个众筹的项目,当时 Vitalik 发起这个项目的时候也是满世界的飞去游说,让大家相信他的想法,相信他能把这个东西做出来,最后众筹了三万多个币。 Terry:Bitcoin.
Jan:对,Bitcoin. Terry:相当于那个时候的多少钱?
Jan:市值的话,相当于那个时候的一千八百多万美元。他们筹到了这笔钱才把这个项目做出来。 Terry:而且它是开源的吧。
Jan:而且它是开源的,完全开源的。 Terry:所以以太坊听起来是要建立一个为区块链编程的一个平台。
Jan:对,而且是一个公开的,开源的平台。 Terry:如果你看好区块链,你可以在上面去做基于区块链的一些事情。
Jan:没错。
Terry:我们两期节目无数次的提到了 Vitalik,你也说是你很偶像的一个人,那能不能简单介绍一下?他是这个项目的作者是吧。
Jan:Vitalik 是俄裔的加拿大人,非常天才。他在做以太坊之前就在研究比特币了,做了一些比特币上的项目。比如说 Python 的库,实现了比特币里面的一些算法。还有一些小工具吧。他还创建了一个叫 Bitcoin Magazine 的新闻网站,这个网站在当时非常有影响力。而这个影响力在当时很大程度上是来自 Vitalik 这个人,因为他会频繁的写一些有深度有内容的文章发布在这个网站上,而这些文章很受瞩目。 Terry:所以他不只办了一个网站,自己还大量的写文章。而且他还写程序?
Jan:对,而且他还写程序。首先,他这个网站当时办的很成功,也因为他做了这么多的研究也看到了当时的一些问题有了一些想法,他当时大概只有 18 岁。 Terry:wow! 几年前?
Jan:两年前 18 岁,现在大概也就 20 岁左右。 Terry:那真的是天才!
Jan:对。因为 Vitalik 访问上海的时候,有个朋友说他当场去用智商测试去测他的智商,测出来有 180。 Terry:Vitalik 我也见过他本人两三次了,第一次是在韩国的 Bitcoin 会议,他看起来有点呆呆的。但是你看过了他写得文章,你会发现他不只是编程的天才,他写了很多话很有意思的东西,包括后来提到的有一种语言也是他自己写的。而且他对经济、共识机制也有很深的了解,不知道他读没读大学,我听说他看很多的论文,这点真的是挺厉害的。
Jan:对,他肯定是看过经济学和博弈论方面的资料。成就我就不敢说了,因为我也不是专家。而且他和其他大神有很多不同的地方,很有意思的。 Terry:是什么?
Jan:他是非常积极的参与社区的那种人,就是说比积极还积极。无论多小的一个讨论,无论多小的一个微信,他都能看到然后跑过来回答你的问题。像他那么忙的一个人他还有这种精力,觉得他很了不起。 Terry:对。据我所知这个人博客的更新非常的频繁,而且都是很有深度的文章,读下来都需要花费很长的时间更不要说他写了。然后,还自己写代码,每周还看两本书,每周还要回答各个社区的问题,还要参加各种活动。
Jan:而且更让人震惊的是他在做了这么多事情的同时,就这一两年还抽空把中文学会了。 Terry:哦,他还把中文学会了!
Jan:对,他还可以讲中文。可以在论坛上用中文回答别人的问题。 Terry:wow,那真的是天才!年轻就是不一样!(笑)我们这帮人感觉已经老得不行了。OK,你也说了,这个项目是他发起的吗?他也有参与写代码?
Jan:这个项目是他发起的他也有参与写代码,他更多的项目是用 Python 去做一些概念原型,把他的思路用 Python 实现出来,其他团队就可以参照他的想法去做。 Terry:所以这个人是 Python 爱好者了?
Jan:对。 Terry:那么这样一个大神,听说他搭建 Arch 的时候都搭建不起来,是真的吗?
Jan:这个事我当时问过他,是真的。 Terry:那只能是 Arch 的问题了!
Jan:唉,我只能说是 Arch 的问题了。 Terry:他本身是用 Linux 是吧?
Jan:他本身是用 Ubuntu?? Terry:OK,然后是用 Python,editor 用什么你有问吗?
Jan:editor 好像是用 Vim? Terry:你都没有忽悠他用 ruby 吗?
Jan:我和他提过,他说可以,他会去看一看。 Terry:OK,我发现在这个社区,Python 好像特别火的样子。
Jan:我觉得 Python 确实很好用,我最近正在用。 Terry:我们这里就要说一下了,虽然 teahour 没有什么对语言的主见的,但是由于各主播的一个背景,还是写 ruby 居多,还是做 web 多。我现在知道我的好朋友包括我自己在看 Python,因为要做一些这方面的工作。所以我想问 Jan 这样的一个语言问题,就是 ruby 在其他方面的积累没有其他语言那么足,但唯独 web 这个领域,ruby 做的很不错。但是假如你选择做 web 这个领域你还是会用 ruby。其它地方你也不排斥换一种语言?
Jan:我觉得肯定不排斥换语言,因为没有一个语言是适合所有场景的,就像我们刚才说选框架是一个道理,而且我记得以前 Terry 在做一个 ruby 的演讲的时候引用过一句话,是参差多态才是幸福的本源。当时他引用是想说明,ruby 这个语言里有很多种不同的语法,Python 里却只有一种方式,太无聊了,肯定是 ruby 好。但是退一步,高一个层次看,不同的时候用不同的语言也是一种参差多态。 Terry:我一点反对你的意见都没有!我当时在选 ruby 和 Python 的时候,看了 the zen of the python,它里面提到说你做一件事情最好只用一种方法。我当时是认同的,因为在工程上好像所有人都用一种代码的话,就不需要额外解释,降低了成本。但我又觉得很 boring,不过你今天这么说我又觉得是有道理的。我是不排斥,我不是一个 ruby 的死忠粉,你知道死忠粉遇到这种情况会怎么样么?他们会说,Ruby 在 Blockchain 这个领域不流行,那我就让它去流行。那我就去写它的一个库啊或怎么样,我觉得 ruby motion 就是一个典型的例子。肯定是一个 ruby 粉做出来的,因为可能 ruby 在做 mobile 的方面不占优势,但是就有人去那么做。我是觉得 Jan 说了参差多态才是幸福的本源,这种人肯定是要有的,像那种用不同的语言的人也是要有的,都挺好的。
Jan:而且我记得去年还是什么时候流行过一个说法叫 poly-glot programmer,就是用各种技术做程序的程序员。 Terry:对,我也很赞同这个。最近我也在看 Python 看 Go 啊,但是我不会拿他们来写 web。
Jan:web 我肯定是用 ruby,rails 非常方便。 Terry:我是不太理解 Go 作为一个 system language 不错,但是很多人却非要用它来写 Web!当时觉得,这个好像就是为了去证明什么一样。我是觉得没必要,我们更多的是要去放眼你要做的事情,而不是去证明一个语言能做什么。我相信他一定可以证明出来它可以做,但是是否足够好足够实用不太好说。 OK,那我们聊回来这个项目吧。我们知道 Bitcoin 本身是用 C 还是 C++ 写的?
Jan:C++ 写的吧。 Terry:那么 Ethereum 是用什么写的?
Jan:Ethereum 现在有好几种实现,有 GO 语言的实现,有 C++ 的实现,还有 Python 的实现。 Terry:这个我就要问了,通常我们要做一个东西的时候都希望用一个东西把它赶快实现出来,但它为什么要用三个不同的语言去实现它呢?
Jan:因为有钱。资金充足是一个原因,当时他们招了很多人支持这三个项目,但是另外一方面我觉得分布式的系统并没有很好的测试方法,所以有一种叫实验的方法,就同时实现三个一样的东西,用不同的方法去做。如果这三个 team 实现出来的版本能很好的互相协调互相工作的话,那我从经验上来判断可以说它是没有什么大问题的。所以是抱着这样一种想法,我记得是某个造飞机的公司上的控制系统也是有冗余的,我让两个一样的团队去实现两个功能完全相同却独立实现的系统。然后,飞机上所有系统的控制是由这两套系统来完成的,也就是说必需两套系统最后产生的结果一致,才去做这个操作。如果不一致就出现问题了,就要人工干预了。是通过冗余来保证分布式系统的正确性。 Terry:所以他们是可以这么做的?
Jan:可以。 Terry:那这么做了以后,它的副作用可能是现在你做出来了,想法也证明了,那么我继续去维护这三套代码会不会显得成本很高或者不知道发力在哪里?
Jan:对,成本非常高。就像以太坊基金会他们吃不消,所以前一个月他们公布了开支要缩减的计划。C++ 的团队大部分都独立出去了,变成了独立的公司,通过为别人提供咨询来赚钱,而不需要基金会去赚钱养 C++ 的团队。Python 团队不怎么花钱,现在主力是 Go 的团队,而且 Go 实现的客户端也是 Ethereum 目前唯一的官方客户端。 Terry:所以现在的唯一的官方客户端是用 Go 写的?
Jan:官方的正式版的…. Terry:官方要继续维护下去的
Jan:官方要大力维护的,然后 C++ 还没有正式版,它还处于一个β阶段。 Terry:所以大家就知道最近为什么要研究 Go 了(笑)。这个都是些很接近底层的东西,用 Go 比用 C++ 来的更让人舒服一点。
Jan:其实区块链项目有相当多是用 Go 来写的,例如 factom。因为 Go 非常适合区块链这个场景,因为它是一个分布式系统又是一个网络系统,Go 简直是量身定做的。 Terry:而且它比 C++ 写代码效率高,性能上也不会有太大的损失。所以这有可能是 Go 一个很不错的应用。如果大家每天做 Web 的话不要总想着用 Go,想点别的事,遇到别的事情再用 Go。
Jan:喂你够了。 Terry:嗯,我们继续往下说的话,现在很多人听说想要了解 Ethereum,他们也很想要了解我们用 white paper,yellow paper,这个在各种币当中也经常提到。我也希望 Jan 来科普一下,到底什么是 white paper,yellow paper,它和传统的 white paper,yellow paper 是不是一个概念?
Jan:传统的我不知道是什么意思,但是区块链这方面 white paper 一般是说把你的想法说明白。 Terry:就是用文字描述这个东西到底是什么。
Jan:对,到底是干什么的,有什么远景什么的。 Terry:传统的 yellow paper 你知道是什么吗?就是那种电话簿。所以 Ethereum 里的 yellow paper 是什么意思?
Jan:yellow paper 是以太坊这个程序的详细描述,它是一个形式化的描述,你去看的时候会发现里面有很多符号、公式、推导,它是一个非常严格的一个形式化的描述。你可以按照这个形式化的描述写出一个程序来,这两个东西逻辑是一样的。 Terry:所以,听起来,这个团队是想对这个做形式化证明这样一个东西吗?
Jan:这都被你发现了!像现在以太坊下一代的共识算法叫 Casper,Casper 就是 Vlad 和一个前微软的科学家在一起做,而且他们的做法是先用一种形式化证明的语言先写出一个形式化的定义,通过这个形式化的定义自动生成代码。它的代码是根据它的形式化定义生成的,所以在数学上是没有问题的,再根据这个生成的代码去实现真正可用的客户端。 Terry:所以未来 Ethereum 在理论上是不会有 bug,它的 bug 应该出现在生成代码那个上面是吗?
Jan:呃,对代码生成器可能会有 bug,然后把生成的那个转换成 Go 代码应用的那个客户端的时候可能会有 bug。 Terry:用代码去做这个形式化的证明是一个成本很高很复杂的事情,现在这个 Ethereum 已经在做了吗?还是一开始就在做?
Jan:是现在在做的。可以看出以太坊在很多方面都是非常先进的。 Terry:是非常专业我觉得,就好像一个普通的开源的项目不会这么去做。你觉得为什么会用这么专业的去做?是因为很敏感吗?
Jan:因为有钱?哈哈 -_- 最主要对于一个因素才能支撑你招到足够好的人才来做这件事情。 Terry:哦,你说的是他们有钱是么?不是因为上面要跑与钱相关的东西是吧。
Jan:对,是他们有钱。那也是另外一个理由,但是你有这个理由并不能支持你去做这件事情。他们有能力去做这件事情是因为他们有钱,他们筹到了很多钱。然后 yellow paper 是一个很好的证明,我还没有看到其他的币对自己的平台逻辑有这么严格的描述。所以以太坊有 yellow paper。 Terry:所以说一个新的开发人员如果想进来描写一个 Ethereum,他可能看 white paper 就够了是吧。
Jan:对,看 white paper 就够了,可能刚接触看 yellow paper 就有点太早了。 Terry:那我们也畅想一下未来,未来 Ethereum 的维护者就是去书写形式化证明或者是规则,它的 client 可能是完全生成出来的。
Jan:有这种可能但是非常远,那要形式化证明或者代码生成技术成熟才有可能。 Terry:那我们接下来要聊一聊 EVM 和 gas。刚才也多次提到了 gas,说白了我们以太坊就是在 Bitcoin 加上一个循环,那它为什么要加上一个 gas,gas 是一个什么概念?
Jan:gas 直译是汽油,为什么要加上 gas?大家可以想象一下,如果只有循环,会发生什么问题。就是中本聪当时为什么不在 Bitcoin 加入一个循环,也就是说任何人写入一个程序它就是死循环,那矿工如何决定要不要放弃。因为要证明一个程序能不能终止是不可能的,停机定理,图灵或者有人证明过的。所以无法判断,那在这种情况下怎么办?此时就是科学家和工程师的不同。工程师就引入一个 gas,你每做一步就要花钱。 Terry:就是科学家告诉你不可能,工程师要想个办法解决这个问题。
Jan:如果花钱的话相当于引入经济激励,你可以写个死循环,但是这个死循环唯一的作用就是把你的钱耗光。所以,在以太网上执行一个程序是要付费的。 Terry:所以就是说如果我要让以太坊执行我的这个程序我要给他付钱,那这个就有点像云计算的感觉。就像我要在亚马逊上租一个服务器我是要给钱的。
Jan:对,只不过它的粒度已经细到了最底层。实际上,它是对一个比如加法操作需要多少 gas,一个减法需要多少 gas。 Terry:那我有一个问题,可能 Ethereum 上面是有一个币的吧?
Jan:叫以太币。 Terry:然后又引入了 gas,gas 和以太币不是一个东西是吧?
Jan:是两个东西。 Terry:那为什么不用一个东西呢?
Jan:这是个很好的问题。如果只有以太币,会有问题。如果以太币是需要大家买卖的,以太币的价格我肯定是用人民币去买或者美元去买,市场就会有价格波动。可能会出现比特币这样的状况,一天跌 50% 涨 50%。这个对计算的成本是不能接受的,例如今天做一个加法需要十块钱,明天做一个加法需要一百块钱。所以这里引入 gas 来解耦。把市场的波动和计算的开销来解耦,也就是说以太币和 gas 之间是有汇率的,以太币涨没关系,gas 价格下降就可以了。它要保证我做同样的计算,消耗的法币是一致的。 Terry:啊,是这个意思。你刚才做的例子会把大家吓到,做一个加法十块钱。实际上,我在用以太坊做计算的时候,成本是?
Jan:现在的成本非常低,不到一分钱吧,看你做什么事情了。可能做复杂一点的几分钱。 Terry:其实这个价格是可以接受的。那这个钱最终给了谁?
Jan:这个和比特币里的手续费是一样的,最后被矿工拿走了。因为矿工提供了计算。 Terry:其实说白了,是他帮你做这个运算。所以你付给他一点费用,让整个事情继续流转下去。听起来很合理,有点意思。那 evm 是什么东西?
Jan:evm 是以太坊的 virtual machine,Ethereum virtual machine(以太坊虚拟机)。类似 Java jvm 是一个基于栈的 vm。上面有一些 opcodes,类似于汇编语言。 Terry:所以你编程就是在 evm 上编程?
Jan:对,实际上你编出的程序就是运行在 evm 之上的。 Terry:我们可以把它看成一个普通的虚拟机吗?有没有很大的区别?
Jan:没有很大的区别,比如它和 jvm 最大的区别就是它简单很多,opcode 简单很多,引入了 gas。 Terry:就是它在 virtual machine 这个级别是 gas。这也是它和其他的虚拟不一样的地方
Jan:所以在看 yellow paper 的时候可以在附录里看到一张表,每一个 opcode 对应的要消耗多少 gas。 Terry:那我基于 jvm 的开放我有很多选择,如 Java 包括 ruby,那在以太坊的 evm 上面有什么语言选择吗?
Jan:以太坊上的高级语言主要有 solidity 和 serpent。Solidity 是类 JavaScript 语言,它的开发者也是个大神。 Terry: JavaScript is awesome.
Jan:有点像 JavaScript,但还是有点不同,而且这个语言写的很好。作者也是一个大神叫 Chris。另一个语言叫 serpent,Python 的一个变种。 Terry:看起来像 Python,这个作者是谁?
Jan:主要参与人员是 Vitalik,它是一个开源项目,所有的都是开源项目。 Terry:所以 serpent 是类 Python 上的一个语言,是 Vitalik 亲自参与的项目。
Jan:对,而且他自己写智能合约都是用 serpent,但现在用得最广的是 solidity。因为 JS 开发人员太多了。 Terry:还有几个,像是 LLL 是什么
Jan:LLL 大概是 lisp like language,是稍微底层一点。 Terry:稍微底层一点如何理解?
Jan:lisp 是不需要词法分析的,直接写语法树了。 Terry:那你的意思是说 lisp 稍微低层一点了?(笑)大家去攻击他。
Jan:这没什么很正常。 Terry:这没什么,写抽象语法树。我也觉得好像要底层。那还有呢?
Jan:Mutan,是一个语法很像 C 的类 C 的语言。但是 Mutan 这个项目已经很久不活跃了,好像也没有人用。 Terry:我听说还有一个像 haskell 的吧?
Jan:好像有,我不太记得了。 Terry:evm 真正诞生也不算很久,为什么有这么多基于它的高级语言,是官方做的还是那些爱好者贡献的?
Jan:我刚刚说到的四个都有官方贡献的背景,具体的不太清楚,但是 solidity 和 serpent 肯定是有官方如基金会资助的,LLL 也没什么人用看起来像写 yellow paper 的人弄的,然后 Mutan 几乎没看到人用过。但是现在官方语言就是 solidity。现在官方正式的工具只有 Go 客户端和 Solidity。 Terry:有钱啊,一来就弄了好几个。
Jan:有钱也是一方面,另一个也是为了方便社区。 Terry:希望不同开发背景的人都能够使用。实际上,我们 hackathon(Jan 和 Terry 参加了万向区块链黑客马拉松)也用到了这些东西,如 solidity。那 Jan 你能否稍微描述一下你在 evm 上用一个看起来像 JavaScript 的 solidity 编程是什么样的体验。
Jan:最大的感受是它只是看起来像 JavaScript,但是使用起来完全不同。因为开发环境是一个受限的环境,evm 的能力很有限,你能够做到的事情也很有限,这种感觉就像是 80 年代的电脑上写代码的感觉。 Terry:就是有一种穿越的感觉。你刚才谈到 evm 的受限,那这个限制是会一直伴随它的还是只是一个现状?
Jan:很难说。有些是会伴随很长时间的,如 gas 和返回值。有些东西很快会改掉,如一个变常数组的这种限制。这个可能会很快 fix。 Terry:所以需要关心到这个级别看起来它和 JavaScript 真的关心不是很大。我说一下我直观的感受是酸爽!酸爽其实是一个好事情,说明你参与的早。因为等到这些都不酸爽了,给你一个 rails on Ethereum,就可能没有那么多机会了。
Jan:另外一个好处是你可以体会到 80 年代的大神是怎么工作的。 Terry:对,确实。我们是错过了那代的程序员,我们基本上第一门语言就是高级语言,C 都算低了。一般是 C,汇编语言可能有些人在大学里学过,学了就忘了,没有真正去用过。那现在是一个不错的时机让你去体验一下,现在能够体验这些东西也算进入的早了。进入晚了,这些东西可能就慢慢被大家把这个做成成熟的工具链,也体会不到了。现在是个很好的时机,如果做个比喻,把它映射到 rails 的话,现在是不是还属于一个零点几的版本?
Jan:没错。 Terry:所以如果开发者愿意去贡献一些东西的话,现在是很好的时机。也许未来你就是千古留名了!大家可以想象你现在去在 rails 去贡献和你在它零点几的版本去做贡献的难度肯定是不一样的。所以,这是一个不错的时机。上面我们谈了一下这些语言包括它们的开发体验,现在我们来聊一聊我们组的 hackathon 项目大概的架构。首先,假设我们要做一个论坛,按传统的思想来讲还是走 web。发一个 post 到 server,然后 handle 这个请求存到数据库。现在要做的是一个基于区块链的论坛,而我们希望帖子永远是不可修改的,而且是放在区块链上的。那我们的做法是前端仍然可以发一个请求,server 端 handle 这个请求,然后怎么做?
Jan:serve 端就可以和区块链打交道了,可以把区块链想象成一个数据库,把 MySQL 去掉,用区块链取代。 Terry:就这么简单就搞定了?
Jan:就这么简单。 Terry:但是我怎么不这么觉得!所以从流程上来讲就是这么简单,但是酸爽是说怎么放进去拿回来这个过程比较周折。
Jan:架构上很清晰,但实际像区块链写数据要写成功,比如说我发一个请求 a=1。这个是等矿工快把它挖出来以后加到链的最后广播出来才算 a=1 写入成功。所以写这个本身是更加异步的感觉,甚至是可能延迟很久。所以前面从浏览器到 server 端的部分,需要引入异步的东西。就像现在我发一个写的请求但是拿不到返回结果,就等区块链抛回给一个事件回来,然后再去处理,相当于 callback。 Terry:听起来是非常异步的一个过程,写出来以后不知道是什么,必须等到矿工运算出来后才知道是什么。我们写的时候只负责写,另外一个负责读的过程,这也是酸爽在这个地方。在写的时候有一些返回值等的限制让这个过程很酸爽,但本质上它是一个 straight forwrd 的过程。
Jan:当你想通了它就是一个数据库后,再进一步可以拿掉中间的服务器层。用 client 直接写区块链,这个架构就很牛了。每一个人都跑了自己的一个节点,只要开浏览器就能执行一个应用。这个应用的代码完全存在于浏览器里,别人也能够看到。数据是通过区块链同步的,想象一下这是个什么样的东西? Terry:就是完全可以知道它做了什么,可以这么理解么?
Jan:完全…听起来不够牛。 Terry:那你说一个。
Jan:这是一个去中心化的网站。设想我现在写一个论坛,不要中心化的服务器,论坛用 JS 写的,由区块链存储数据。那只要通过某种方法把 JS 代码发给你,你通过浏览器跑起来就可以用。每个人都有自己的浏览器,每个人都跑了自己论坛的进程,但所有的论坛是联通的,但进程背后读写数据的后端是联通、一致、唯一的。 Terry:实际上是借用了 Ethereum 本身分布式的特性,造成我们可以建立一个分布式的论坛,落实到我们的案例上来讲。
Jan:是去中心化的论坛。 Terry:没有一个人真正掌握这个 server,数据都是放在链上,而我们只需要一个 JavaScript client。而实际上这次的 hackathon 也是没有 server 端的,我们是在纯 JS client 上的一个 APP 和链进行沟通。那我又想问了,用 sql 和传统的数据库进行沟通,那和区块链用什么进行沟通?
Jan:区块链的节点不只是以太坊,一般会提供一些接口,而且是 JSON RPC 的接口,大部分都是通过 JSON RPC 和节点进行交互。通过 JSON RPC 调功能、传数据。 Terry:实际上去 call 了它的一些方式。通过暴露出一些 JSON RPC 的协议,然后去 call 一些接口,所以本质上是这样来完成数据的读取和存取。
Jan:没错,JSON RPC 只是一个传输通道,以太坊还有 IPC 的接口。把以太坊的节点跑起来之后会建立一个进程间通信的管道,通过管道来做事情。 Terry:会不会耦合?
Jan:不会,只是把 http 的管道换成了 Unix 的管道。 Terry:你刚才也比喻了,说可以把区块链就数据库一样,调用接口进行读写数据,那怎么体现它的计算 programming?
Jan:应用的计算实际上分为了两种,1.在 evm 上运行的计算,也是以太坊的核心目标。这些高级语言使用刚才所说的如 solidity 来写,写出来就是一个合约或说是程序。一个合约等价于一个 class 的概念,里面可有很多 function 等价于 class 里面很多的 method。合约写完后可以调用 JSON RPC 的接口,把它编译成 evm 上的 opcodes,然后部署到以太坊的网络上,这样以太坊就可以进行这个合约,跑起来这个程序。2.用 JS 或者传统方法写的东西,因一个程序里不是所有的都需要放在区块链上,可能只有你最关心的业务逻辑如转账需放在区块链上来保证它的公开透明可执行。其他的如显示账户里的金额,可以通过 JSON RPC 另外的接口给节点发请求,告诉我这个地址上账户里余额多少。这样收到的 response 就会包含这个信息,就会显示在界面上。 Terry:如果自己写了些逻辑在区块链上,类比成数据库的话有点像 procedure,trigger,实际上去 call 这个存储过程,它做了些运算,然后把结果放在数据库上面,有点这种感觉?
Jan:没错。 Terry:你也提到了有两类计算,并不是所有的计算都交给区块链的。所以假设我有一个普通的网站,后面有 server,背后既有数据库又有 blockchain。有些东西存在数据库,有些存在 blockchain,也没有问题,因为满足不同的需求。所以只需要证明在 blockchain 上不能更改的一些重要的东西,一些和内部业务相关的,一些不那么重要但经常读取的就可以放在数据库里。所以对于开发人员来讲是多了一个武器。据我所知,比特币十分钟会出一个块,也就是说我给你一笔钱最慢要 10 分钟才能得到确认,10 分钟对打钱来讲有点慢,不只对打钱,如果做运算,以太坊也 10 分钟出一个块的话,很多场景就不适用了?
Jan:对,比特币出块是 10 分钟,最终确认的话话可能要等两三个块,六个块,这样就变成六十分钟了。太慢了,所以以太坊要做运行环境的话,要缩短出块时间。以太坊的团队为了缩短出块时间也做了很多努力,讲一下这为什么比较难。首先是一个网络,一个块发布的时候从一个节点传播到另外一个节点需要时间,且这个时间和网络状况带宽都有关系,对共识影响很大。因为需先拿到区块的数据后来判断要不要这个块,是否在这个块的基础上去继续下面的工作,所以它对共识来讲很重要。而由于网络延时的存在,很难把它压缩到极其短。还有就是,当出块时间变短后会出现很多分叉。比如现在大家都在挖块,你挖出来了然后广播了。但是在你广播的路上,我也挖出了也广播了。而且还可能有第三个人在你们两个人广播的路上还在继续挖,他不知道你们已经挖出来了,此时他挖出来了也广播了。最后会出现都是当前高度的三个块,也就是分叉了。如果出块时间太短就会出现分叉,怎么解决这个问题?这种分叉在区块链上叫 uncle。它不是这个块的 parent,是块的 parent 的 brother。所以现在以太坊上 POW 的算法是考虑到各种因素各种问题后,做到了 15 秒出一个块。 Terry:已经是大幅度的提升了!
Jan:是非常快。在 POW 的算法里以太坊是非常快的。 Terry:那到了付钱的场景,基本 15 秒就能确认是否成功付款。
Jan:对,而且这还是一个保守的取值。他们的原型试过是 5 秒左右,但由于现在还是测试阶段所以取了一个保守的值。 Terry:15 秒在比特币上的分步计算是很快的,但和单机没法比。但这也是在这个环境下没有办法解决、必需面临的问题?
Jan:也不是,应该算是 POW 的问题。我觉得 POW 很难做到比 5 秒更快。 Terry:但是 Ethereum 想做这样一个平台,这是它的限制和挑战,那接下里怎么办?
Jan:以太坊在项目成立的开始就说要用 POS 的共识机制,但当时在 POS 的研究道路上遇到了很多问题,所以就没有坚持把它研究完再做这个项目,而是先用 POW 临时替代一下。很快比如一年左右,就从 POW 切换到 POS。这个决定造成了一个有意思的现象。因为比特币算力现在都集中在矿池里了,而以太坊不会出现这种问题。 Terry:因为造出来的矿机有可能没用了,是吧?
Jan:对,一切换这些成本就完全浪费了。现在没有人也没有人有动力去做矿机。 Terry:那这有没有可能是一个阴谋论?
Jan:不是阴谋论。因为以太坊下一代用的 POS 的算法叫 Casper,概念证明已经写出来了,理论上的研究也差不多了。当时遇到的问题已经差不多解决了,而 Casper 有可能做到秒级别的共识。一秒钟之后出块。 Terry:所以 Casper 是什么东西?
Jan:Casper 是一个共识协议,是 POS 的。 Terry:可以替换现在的供时协议?
Jan:对,解释一下就是 Casper 里有很多验证人(挖矿出块的人),要存放一些保证金在网络上才能成为验证人。交完押金之后可以用公钥私钥签名一个块,你认为它是有效的就可以投票说它是有效的,最后综合所有验证人的投票形成大多数人的意见,大多数人说它是有效的,它就是有效的。如果作恶的话,保证金就会被没收。 Terry:到了你说的 Casper 阶段,运算效率和在支付宝上的转账基本很接近。
Jan:如果有秒级共识的话,平常就感觉不到了。因为发个请求到支付宝等返回的话也是秒级的。 Terry:这个过程,我有点兴趣。大家都是程序员,当要做一个有认识的应用,例如如 WEB APP,都有可能遇到坑。现在要做一个有很多未知的东西,有的程序员做之前要想明白才做,但很有可能的结果是不做了。但是 Ethereum 这样的 team,在很多问题如 POS 上当时没有解决,没有说把它解决了再做,而是先把平台搭建起来再去做研究。这样的做法很有意思。
Jan:是一种工程能力的体现。它的目标是实现这个东西,不管中间路途多艰难,目标是实现。很典型的工程思维,就像有一个 deadline 一样,一定要在期限之前把项目做完怎么办? Terry:那想清楚再来做是什么思维?科学家吗?
Jan:有一点科学家的思维。 Terry:因为很有可能想到后面就放弃了。以太坊现在还有很多类似的问题需要他们去突破解决的,所以真的是一个很有挑战的项目。
Jan:对,因为 Casper 解决了出块时间,另外的问题就是 scalability。因 POW 的算法是每个人都去执行这个程序,执行完把执行结果写到块里面,再去挖矿。把 nonce 广播到网络上,你会发现这个过程中每一个人在做同样的事情。每一个矿工都在执行同样的程序,所以说整个网站的计算能力是单台电脑的计算能力。单台电脑的计算能力是不够的,所以 Vitalik 今年在 DEVCON 上介绍了他的想法,是要做 sharding 分片,让处于不同 shard 的矿工去执行不同部分的代码。比如你的转账合约放在这个 shard 执行,他的对冲交易的合约放在那个 shard 执行。实现并行的执行,这样就是提高整个网络的吞吐量。前面出块时间解决的是 laterncy。 Terry:当我以前知道你的程序是要被每一个矿工所执行时,我认为这个是为了达到一个信任的计算而必须付出的代价。但现在看起来还有优化的空间。
Jan:对,因为其他的矿工是需要验证你的计算,但没必要所有人都要再算一次。 Terry:OK,也就是说未来就是一台机器算?
Jan:不会。也就是一个 shard 平均下来有 100 个矿工。 Terry:按这个方向做 sharding,会不会是一台电脑增加到十台电脑?
Jan:应该是极大增加,Vitalik 提出的 sharding 是 binary sharding。是一种动态的分片,不是写死的。作为一个程序的提出者或者发送一笔 transation 的时候,是由用户自行选择要在哪一个 shard 执行的,这样的 shard 一共会有 2 的 16 次方个。据 Vitalik 自己说吞吐量的扩展是没有上限的。但是目前来看 binary sharding 是有上限的,是 2 的 16 次方 65536。如果现在的计算能力上升这么多倍的话,能满足很多应用的要求。 Terry:这个很有意思。我把低效当成一个为了共识的代价。
Jan:这里有很多取舍要做的。 Terry:我们谈了这么久 Ethereum blockchain,对它做一个总结,可以说 blockchain 就是大家认同的存储和运算的平台?或者叫共识?
Jan:可信任的计算。 Terry:我听到说如果区块链建立起来了,本质上就像一台电脑,只不过这台电脑是所有人一起使用的电脑。这台电脑叫 trust machine,trust machine 有一次是上了经济学人吗?
Jan:对,trust machine 上次是不是说过?经济学人上次发发了一个封面文章,标题就是 blockchain trust machine。里面还有大片的文章介绍 blockchain 是什么,也有人把区块链叫做 world computer。整个世界有这样一台计算机可以做很多事情,你可以看到上面的程序逻辑计算过程,且知道这个程序是被机器执行而不是人。所以会对它有信任,因为里面没有人的因素,是机器来保证执行。blockchain 是基础的发明,我觉得它的意义和当年互联网的意义是一样的。94 年的互联网就是现在的 blockchain。很难过的一点是国内经常只关注比特币和币价,而不是其中真正的东西。有时还有这样说法:blockchain 没什么了不起的说法,只不过是用以前就有 P2P 的技术拿来下载账本而已。这种说法听起来没错,但是去故意忽略它背后的意义。我也可以说同样的话,淘宝只不过是用 http 卖东西而已,手机也早就有了,iPhone 也不过是拿手机来运行应用而已。但其实有很多区别,比如 blockchain 天然就有共识机制,以前的 P2P 是没有共识的,P2P 的网络,要下载一个文件,需要事先知道文件的名字。要下载一个 bt,要有 bt 的种子,用电驴要有电驴的链接。那么种子或者链接地址本身怎么去达成共识呢,也就是说如何用去中心化的方法维护种子或者电驴的链接,去知道这部电影的链接是哪个?这里不是推荐大家去看盗版,只是个例子。所以 P2P 和区块链是有本质区别的,P2P 是区块链的下面一层,区块链是在 P2P 的基础上多了一层,达到了更高一层的共识。 Terry:那你所谓的 trust machine 放到最理想的情况下,在未来它对最终用户来讲就是一台电脑,它后面有多少共识机制有多少矿工我不关心,我只关心给它一个东西它会如实执行给到一个结果。
Jan:没错。对普通用户来讲就是一个普通软件而已,和其他软件没有区别。 Terry:就像用一台电脑使用它,如果能达到这种体验,就说明这个东西非常成功了?
Jan:如果说只有这么一台电脑的话已经是非常成功。 Terry:如果我们所有人都把所有的数据放在这一台电脑里的话,隐私问题怎么解决?
Jan:现在区块链上的数据都是公开的,以现在的技术来说只能做到公开的完全透明的区块链,如果想要存一些私人的的东西,不太好做,可以加私钥传到区块链上,但区块链对这个加密过后的东西没有办法无法做任何计算。它没有你的私钥无法解密,这就是目前区块链遇到的问题。解决的一种方法就是用同态加密,同态加密可以在不解密的状况下做运算。比如先把一个 1 加密之后发给你,你看到一堆随机字符串,然后把 2 加密发给你,让你把他们加起来,然后你用这两个加密过后的随机字符串做一个加法得到另外一个加密的字符串。你还是不知道这个加密的字符串解密结果是什么,但是我拿回来之后做解密得到的结果刚好就是 3,这种方法叫同态加密。如果要关注隐私的话还有另外一种更为现实的想法,就是做一个私有链,private chain。 Terry:bitcoin 和 Ethereum 其实都是 Public chain,什么是 Public chain?
Jan:Publiic chain 与 private chain 的区别是能参与供时过程的人是否需要经过批准,是否有准入机制的。 Terry:就是可以任意进入的 chain 叫 Public chain
Jan:对,Public chain 我可以进入网络开始挖矿,私有链是比如我自己一个公司架两三台服务器就可以跑起一个区块链。只有经过允许了,你才能加入这个区块链,很好做限制例如在局域网里面有密码,或者说软件经过定制没有这个软件就跑不了。私有链分两种,1.联盟链,一个行业里面几个公司连接起来,每一个公司一个节点,这些公司组合成区块链网络。2. private chain,单个公司,所有的节点都是我自己的,所有的点结合起来组成区块链。现在的 private chain 概念很流行。 Terry:甚至是你刚才提到已经离开的 bitcoin 开发者的 Mike,也是去做私有链了。
Jan:他加入的 R3 公司做的是联盟链,R3 有很多大银行的加入,他们要做的事情是,每一家银行在里面的能力是平等的。通过这样的联盟链来实现可信的第三方角色,没有一家机构可以取得世界上所有银行的信任,如果有一个所有银行都愿意相信的程序,没有人可以更改,而且自己也参与维护。 Terry:这就是联盟链!感觉就是几个老大为了达成共识,我也不用相信你是否背叛,我相信程序就好。银行是个很好的例子,因为上面没有上级,都是平等的。它到底是解决什么样的信任不信任的问题?
Jan:解决一般的信任,对账是一方面。因现在银行业的现状是自己维护自己的,账本记录我欠谁多收钱谁欠我多少钱,这样的做法在跨行转账的时候很麻烦就要对账。比如从工行转 100 到农行,工行这已经扣了 100 了,农行那边要加上 100 的时候刚好出错,没加上去。这就是个问题,一个既昂贵又缓慢的过程,银行可以解决,但是成本高时间慢。 Terry:这一想就不合理,每个银行存自己的数据库,最后和你的数据库对,发现不对了再用一套大家觉得都 OK 的规则来解决这个不对怎么办。但 blockchain 出来之前好像也没有更好的办法。
Jan:对,blockchain 出来之前也没有更好的办法。所以银行业和金融业有很多这样的问题,刚才说的是银行,审计方面公司做假账怎么办,做假账还得去查也不知道。金融业的各类公司之所以早就在研究区块链,就是因为区块链能天然的解决他们的痛点。 Terry:减少他们的成本。所以,你刚才提到的联盟链也是 private chain 的一种。说到底,公有链和私有链有什么区别?我可不可以把 bitcoin 和 Ethereum 往几个朋友上的服务器上一架就变成私有链了?
Jan:理论上可以,但实际上有一些问题。大家可以仔细思考一下 POW 出现的原因,是为了解决公有网络上大量攻击者攻击你的节点的问题,这个叫做女巫攻击 sybil attack。现在到了私有网络上,为什么还要用 POW? Terry:所以 POW 在私链上用是低效的。
Jan:在私链上不会用 POW,也不会用比特币或其他软件来直接用。你解决了一个根本没有的问题,我不需要。 Terry:这种拜占庭将军的三分之二以上的节点诚实就足够了。
Jan:所以现在很多私有链的项目是把以太坊拿过来,把其中共识算法替换成 raft 或者其他拜占庭容错的共识算法,效率高,很多其他的好处,最终确定可以马上达成。不像区块链需要等六个块,这种算法是直接一个块就可以确定。 Terry:所以由于去掉了这种共识机制效率大大提升。那我们既然把共识机制都换掉了,和传统分布式数据库的解决方案有什么本质的区别?
Jan:经常听到这种说法:什么私链不就是数据库么!但仔细一想是不同的,关键是传统分布式数据库怎么做并行的写。比如可以对 riak 里每个节点去写数据,但它终究会遇到写冲突的问题。数据库无法解决写冲突,而是抛出异常让程序员决定去怎么解决,是需要人去处理。区块链上写数据的时候是先发起一个交易,相当于在网络里提交一个修改数据的请求,传统的数据库就直接去执行了,但区块链的私有链是共识节点,收到请求后,由它来决定是否来执行请求修改数据。所以在共识节点上有一个选择交易、并对交易进行排序的权力。排序也很重要,如在做银行转账时把钱先转 a 再到 b 和先转 b 再到 a 是不同的。所以选择交易且对交易进行排序的权利很重要,且在共识节点手里。你只能提出请求,共识节点来选择执行什么。在共识节点进行排序的时候可以摒弃造成冲突的交易,这样形成的交易记录是无冲突的。 Terry:所以和传统分布式数据库比,在写入的客户端和数据库中加入了一个共识节点,也就是最终的客户端并不是在随意的操作数据,所以不会出现冲突。原因是它都交给了共识节点,共识节点会处理以后再交给数据库。
Jan:对,这个很像三权分立的模型。你发起的交易有你的签名,别人无法伪造。但你只能发起交易,不能确定此交易是否执行。反过来,共识节点它无法发起交易,它能决定选择执行哪些交易。相当于把写分散在了两个地方,很多个地方,因共识节点不只一个。通过此方式来保证达到一个共同的记录。 Terry:所以共识这一层就保证了不会有冲突。blockchain 是一个可信任的运算平台可信任的数据库,怎么落地到现实生活中?除了之前提到的银行对账上面,在现实生活中我们还有那些地方需要区块链来改变的。
Jan:如现在做的项目保全网(www.baoquan.com),要把电子数据变成证据,而证据必须是没有改变过的原始数据,如何证明数据是未修改过的,只要放在区块链上就能解决。所以电子数据保全是非常能做近期落地的应用。 Terry:这个主要是运用到了区块链的存储性质。
Jan:考虑执行的话,金融方向是最好的。 Terry:blockchain 上实现完全透明可信的交易所了。
Jan:对,上次说的挂单所有的买单、卖单、成交记录都是可信的。买单是可看到的,成交是可执行的。 Terry:你说的三权分立很贴切啊。像说成立一个交易所,挂一个买单卖单,但不是我运行的这个程序,是我交的一个共识节点来运行,作恶的成本变高了。
Jan:以前没有办法做的,现在可以了。金融很适合,金融行业处理的都是数字,数据量很小,很配合区块链的现状。它的计算能力存储能力不强,所以在一些应用上还有很长的路要走,但是刚好能做计算数字方面的事情。数字货币里能否通过去中心化方式造出一种稳定的货币,而非比特币这样剧烈波动的货币。有项目想通过差价合约的方式来实现,解释下差价合约:因为以太币波动太厉害,两个人各有 1000 个以太币,一个人 A 追求稳定,希望卖的时候还能获得现在的价格,而不是跌到一分钱都不值。那他可以把 1000 个以太币放在差价合约里,有一个对手 B 也放 1000 个在差价合约里,合约规则是,假如现在一个以太币=6RMB,那 B 等于放了 6000RMB 到合约,一定时间后可以 A 拿回价值 6000RMB 的以太币。剩下的以太币就全是 B 的。如此,无论以太币是涨还是跌,A 拿到的都是 6000RMB,B 去承担风险,但他的好处是如果涨了呢。如现在以太币涨到 10 块钱一个,A 只需要拿回 600 个,而 B 则拿回了 1400 个。B 承受了风险但是因此可能获益,A 虽然无风险但是也没有额外收益,获得稳定收益。 Terry:根据诉求的不同。
Jan:所以合约规则很简单,智能合约可以马上实现。但是问题是怎样知道当前的以太币价格? Terry:区块链对外界信息不了解。
Jan:对,因为区块链本身是一个世界,币价是在区块链外部的信息,外面的信息如何输入到区块链里,而且是以一个去中心化方式。最简单的是指定一个人每天往区块链里输入数据,但这样就变成了一个中心化的方案。 Terry:而且他有可能作恶。
Jan:他有可能作恶报假的信息,一个去中心化的方法如 Vitalik 写了一个博客来介绍,可以做一个 Schelling coin. Thomas Schelling 是 2005 年诺贝尔经济学家的获得者,他在经济学和博弈论有很多研究。他提出在博弈里 common knowledge 是很重要的,比如一个小游戏里同时给两个人看 10 个数字 12、37、56、102、200、301、990、587、432,让两个人各自选一个数字,如果你们恰好能选择同一个数字就赢走 100 元。你会选哪个数字? Terry:what?-_-
Jan:Schelling 解释,看起来两个人赢钱的概率是很低的,实际上他们都会选 200,因为它是整数。因为我是随便报的,不小心报了个 200,实际上更好的例子是 100,因为 100 是一个很整的整数,在人的心里有特殊感觉。 Terry:心理学?
Jan:有。再一个例子,如用电话告诉两个人,到了纽约不同地方的两个人,让他们自己想办法碰头。二者之间不能互相联系不能广播见面地点,会怎么做才能使两个人见面? Terry:我会去市中心。
Jan:对,你一下就想到了。为什么回去市中心?这就是 common knowledge。你可能会觉得既然不知道他会选择什么,所以他可能会选择一个我会选的,最通用的地方。意思是 common knowledge 是很重要的,因为你相信另外一个人也会这么想,而且你相信另外一个人也会相信你会这么想,无穷递归下去。由于这样的无穷递归就会导致你们选的是 common knowledge,POW 其实也是如此。这也是 POW 博弈的原理,我的选择是基于你会找长的链挖矿,你也认为我会基于最长的链挖,最后的结果是大家都会基于最长的链挖。回过来说,如何用 Schellingcoin common knowledge 去实现去中心化的链外的信息输入。规则很简单,我现在有 1000 人,每个人都把你们认为的当前的认为以太币的价格写到链上,把所有人报价排序。如果你的报价落在 25%——75% 区间内,就给奖励,否则要接受惩罚。比如加入这个游戏是先交保证金,输了就会没收保证金。那所有人都会尽力的去接近真实的价格,你不知道别人怎么玩但是你会想别人肯定也会像我这么想。唯一的 common knowledge 就是真实的价格,所以这个机制形成的就是所有人都往真实价格上靠。所以最后在所有人里选中位数,这个中位数一定符合真实价格。通过这样的机制就可以实现差价合约,以此来得到稳定的货币。 Terry:听起来要让它稳定的建立起来需要一个完美的经济系统。
Jan:对,其实是一个博弈的系统。 Terry:每个人都为自己所想但会让它跑得很好。
Jan:这就是去中心化的规则美妙的地方,必须要把规则制定好。实际上很多时候你是在写规则,而不是算法。 Terry:我觉得 blockchain 社区里的人都认为中心化是不美的,我不要用。中心化是有坏处的,唯一的好处是高效。
Jan:所以私有链不需要这么做,引入一个 data feed 就好了,效率高。 Terry:就是在特定的状况下选择特殊的东西,我们刚才说的都是金融相关的领域。有没有什么金融之外的领域觉得可落地的?
Jan:物联网,这个方向可能很有发展潜力。因为 IBM 和三星曾经用以太坊的协议做了一个物联网的原型系统,这个项目的 demo 拿出来给大家看过。现在 IBM 的方案已经从以太坊转移开,但可以看到他们对把区块链结合在什么地方有兴趣。因为区块链上可以有价值和所有权的转移,物品互相打交道是涉及金钱的,而物品本身也涉及所有权。用区块链来登记物品的所有权使其之间有些经济行为,如出租。以太坊上一个很有意思的项目是 slock,尝试把物联网和共享经济与区块链结合起来。具体是 slock 把物联网浓缩到现实世界一把锁这样非常小的概念,如汽车启动的锁,门上的锁。这个锁的所有权是可在区块链上转移,可以把锁临时转移到另外一个人手里,这个临时可以是智能合约。这个智能合约设定在这个时间以前这个人可以打开锁,在这个时间以后所有权就回归了。这个智能合约由区块链执行,可完全信任。现在有一些智能门锁的项目是中心化的实现,使用权的转移是由中心化的服务商来提供。问题是并不能保证不作恶,如果是锁的公司内部人员或者黑客,那就可以开锁拿走你的东西。若放在完全可信的区块链上,那么这个锁只有你能开,而且还可以放心的分享出去,分享之后能够放心的收回来。 Terry:我有一个问题,像你说的例子中的方案,引入去中心化的方案会不会给这个锁带来体验上的差异,我是不是要懂程序?如中心化的智能锁我使用一个公司开发好的 APP,去中心化的锁我是不是要会写合约才能转过去?
Jan:不会的,slock 是基础协议,你可以根据它做一个 APP 去使用。 Terry:那我需要信任这个手机 APP 吗?
Jan:手机 APP 可以开源。 Terry:我只关心最后写到区块链的数据是对的就 OK 了?
Jan:对。 Terry:不用去关心手机是怎么跑的?
Jan:那还是要关心的,万一有一个后门什么的。你还要关心锁里的软件是怎么写的。还是需要有专家能替你看到。 Terry:那这样的锁对作恶越敏感的地方越有用,如家门和车钥匙。反而是一些快递扔到外面没有那么敏感。
Jan:没错,项目听起来很好,但是需求需要仔细挖掘。很多人对中心化的方案并不介意。 Terry:这也是区块链遇到的一个问题,首先不能降低我的使用体验,吸引到普通用户。所以这是我们研究这个技术去考虑的一个因素。不是说这个东西好了大家就一定会用。
Jan:这只是物联网应用的一个子场景,其他人想做物流供应链方向的管理,可能会比 slock 更有意义。比如葡萄酒供应链,从种到制成葡萄酒到过海关到进入国内分销,中间有很多环节,每一个环节都会有问题。 Terry:这个是不是可以代替条形码或者电话来确认真假的服务?直接可以在区块链上查到它从哪出来如何一路到我的家。也有人在做这方面的研究。刚才提到存证,也是除了金融之外的一个应用。
Jan:还有版权管理。能否用区块链阻止盗版?这个是不可能的。盗版不是区块链能阻止的,但是区块链能解决谁是正版,这是两个问题。 Terry:这个的本质和上一个是一样的,确定这个是不是真货。
Jan:对,只不过一个是在消费品上,一个是在真正的产权上。但真正的像物联网和版权这样的我觉得要真正落地还比较难,目前落地最快的就是存证和金融。除了这些严肃方向,还有人在以太坊上做了一个百万格子的项目, Terry:当年放那个广告项目?
Jan:对,80 后都知道。当年有一个人做了一个单一的页面,上面做了一百万个格子,每个格子上一美元可以放广告,有人把这个移植到以太坊上。在以太坊上也是同样的道理,有人做了一个 (Etherboard)[http://etherboard.io/] 但是你买下的格子可以被另一个人又买走,如果他又买走了,他的钱付给上一个买这个格子的人。 Terry:做的人只能卖第一次?
Jan:对 Terry:所以他的这个是真正的卖给了下一个人。
Jan:因为区块链上很容易实现价值的转移,所以任意两个人很容易做这样的交易。 Terry:很好玩啊,还有什么?
Jan:有人在以太坊上做了一个庞氏骗局。网页的名字就叫庞氏骗局,旁边写了一个规则:如果你给我打币,每一个给我转钱的人都可以得到后面的人的转账。真的有人去玩,就可以理解国内为什么有这么多传销,大家知道他是传销,只不过觉得没关系而已。 Terry:所以传销的人可以利用它把规则写的很公平。
Jan:这还是一个规则特别透明的传销。 Terry:不是鼓励大家传销!所以像快播老总说的技术本身是没有罪的,但是这个东西本身的出现会被搞传销的人利用。我们只是探讨技术的!
Jan:对于程序员来说,也有一些很有意思的纯技术方向,比如随机数。这次黑客马拉松一个得奖项目就是做随机数,我们的朋友 youcai 也在做随机数叫 RANDAO。解释一下为什么区块链上的随机数很重要,因为区块链是一个程序,上面的东西是确定的,很难产生随机数。比如 POW 里去挖矿要找一个随机数,nonce 就是一个随机数。就拿上一块的 nonce 做随机数不就好了?其实是有问题的,设想如果负责出块的矿工参与了某个赌博,如果赢了可以获得 1 万个币的奖励,他可以决定随机数是什么。我找的一个 nonce,但是这个 nonce 会导致我输掉这个赌局,就放弃这个块,找下一个 nonce 直到找到可以赢的为止。最坏的情况也不过是别人找到这个块,让我输掉这个赌局,那我肯定是继续找。这个想法是不行的,如果大家有兴趣的话可以去看看 RANDAO 或者黑客马拉松得奖的那个项目他们是怎么设计算法的,怎样在区块链上产生一个可信任的随机数。 Terry:如果有了的话,抢红包的 APP 就可以做了。
Jan:对,随机数是很多程序的根本,特别是赌博网站。所有的这些程序都依赖一个真正的随机数, Terry:所以这里产生的是一个可信任的随机数,真正的随机数在计算机世界里很难产生。OK,有趣的项目介绍完了吗?
Jan:另外一个项目做的是定时任务。区块链实际上是一个 replicated state machine,是一个状态机,你要给一个 event,它来做反应和处理。如果是一个定时任务的话没有人发 event,需要自发执行。而区块链上没有这样的机制,所以这个定时任务需要一个合约、一个 DAO 机制去实现。这里可能会涉及到经济激励,要怎么保证它不会拖一个小时触发。以太坊上有一个叫 Alarm clock 的项目,它有一套完整的规则和智能合约。在以太坊上就能实现这个。大家有兴趣可以去研究一下这个,也很有意思。 Terry:所以作为一个普通开发者,感觉以前做一个程序是想算法,现在除了算法之外还有规则,有可能还有经济激励,成了更复杂的过程。
Jan:对,所以为什么大家能感觉到在区块链上写程序有很多限制,这两个就是很好的限制。随机数和定时控制这两个很重要的部分都要想办法去实现。 Terry:又一种回到了大神云集的 90 年代的感觉,还有很多基础的工作要做。我们介绍了一些行业落地和一些有趣的项目,当然我们在这说了这么多个行业也只是我们俩的短见,也有很多我们都看不到的。所以这是我们这个节目这么多程序员有不同的背景就可以看到不同的东西,我们说的只是一部分,可能你比我们看的更清楚。你研究之后愿意分享可以分享给我们,愿意自己做也可以自己做,这里有很多市场。
Jan:对,这也是我来介绍区块链的目的。希望有不同背景不同行业的人知道有区块链这个东西后,怎样和自己行业结合来解决自己行业里的一些问题。 Terry:我们听众有些是做 web,有些是前端或者 mobile 的,我没有可以落地的那怎样参与到当中来/?可以做什么事情?
Jan:我觉得如果你是开发者的话,可以去学习以太坊上智能合约怎么写,编程。去看看 solidity 语言的语法怎么写,然后自己动手去写一个小的 DAPP 之类的。 Terry:先去理解,万一用到有用的场景说不定就用到了。所以可以去学习一下这些东西。 我们聊了这么多区块链的技术,包括我自己也是有体验过有写过,除了酸爽之外,在整个开发平台上除了体验外,还有什么短板吗?
Jan:几个方面,一个是隐私。因为公有链是无法保存隐私数据,同态加密是一个方向,但目前不实用。另外一个,可伸缩性 scalability。如最近比特币闹得比较大的扩容问题,Mike 也是因为在扩容问题上发了一篇文章。怎样解决比特币和其他区块链可伸缩性的问题。现在的一些提法是 lightning network 和 State Channels,以及以太坊 2.0 这种 sharding、Casper,有很多人在研究这个方向的问题。还有存储层上的问题,因为存储容量的限制想存个电影也不太现实,也有很多团队在做 IPFS , swarm,storj,他们都是想做一个把闲散空间利用起来的存储层,利用空闲硬盘上传区块链上的大文件,让大文件分散加密的存在硬盘里,然后这些贡献空闲硬盘的人可以获得经济奖励。IPFS 是不带经济层的,无经济激励,跑一个节点是自愿的,但无法维持下去。Swarm 是尝试在以太坊上写一个智能合约,给 IPFS 加入这个经济激励。所以 swarm 是基于 IPFS 的项目,两个合起来可以为以太坊提供一个存储层的解决方案。Storj 是另外的独立项目,提供一个带经济激励的存储层的解决方案。 Terry:这些都还在开发当中?
Jan:对,开发当中。但 IPFS 已经独立出来,我觉得可以用了。最后还有一个点,区块链上很多项目太依赖经济激励了,一旦出现什么问题就想能否用经济激励来解决问题,而非从算法解决。有点这个苗头,走向另外一个极端。 Terry:所以是我们很难去改变它的。
Jan:对,想问题的时候先想一些不要经济激励就能解决的方法,这些是最数学最纯粹的方法。 Terry:首先我们是程序员,其次去考虑经济激励。我们今天聊的内容差不多了,大家有兴趣的可以去社区看看。我想问一下 Jan 我们有没有可能把 Vitalik 请到节目聊天?
Jan:好啊! Terry:到时候我们俩来做采访!
Jan:可以啊! Terry:今天节目进行到这里。接下来到 picks 环节,Jan 有什么要 picks 的吗?
Jan:我给大家介绍一个网站吧,就是我们 ethfans.org,它是一个介绍以太坊最新资讯和技术的新闻站和论坛。 Terry:大家猜一下这个网站是用什么软件改的?(笑)
Jan:(笑) Terry:当时 Jan 做出来之后很开心的说你猜使用什么写的,然后点开一个页面,发现是用 RubyChina。
Jan:谢谢华顺做了这么棒一个项目。 Terry:我的 pick 是给大家推荐一个 Mac 软件,是一个叫 cloudmagic 的软件,是一个 email 客户端。发现 cloudmagic 感觉不错,走的是极简风用起来很顺手。推荐大家可以使用一下,那我们今天的节目就到这里了,最后在祝愿 teahour 三岁生日快乐!happy birthday!
Jan:wow! Terry:这是我们年前最后一期节目,给大家拜个早年,我祝大家猴年都没有 bug。
Jan:那我就祝大家如果有 bug 的话,都能把 bug 说成 feature 吧! Terry:Bye
Jan :Bye
http://ethfans.org/posts/talk-with-jan-about-ehtereum
http://ethfans.org/posts/ethereum-whitepaper
http://ethfans.org/posts/yi-tai-fang-de-shang-ye-qian-neng