Teahour 以太坊专访-文字版

Teahour 以太坊专访-文字版原文地址:http://ethfans.org/shaoping/articles/talk-with-jan-about-ehtereum本文是播客Teahour以太坊专访文字版,收听地址 http://teahour.fm/2016/01/19/talk-with-jan-about-ehtereum.html ,也可以在喜马拉雅、iTunes搜索Teahour收听。(前边的开

大家好,又见面了,我是你们的朋友全栈君。

原文地址:http://ethfans.org/shaoping/articles/talk-with-jan-about-ehtereum

本文是播客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 paperyellow 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 , swarmstorj,他们都是想做一个把闲散空间利用起来的存储层,利用空闲硬盘上传区块链上的大文件,让大文件分散加密的存在硬盘里,然后这些贡献空闲硬盘的人可以获得经济奖励。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

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/145829.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • 接口定义

    接口定义1、什么是接口接口一般来讲分为两种程序内部的接口:方法与方法、模块与模块之间的交互,程序内部抛出的接口,如登录发帖,发帖就必须要登录,如果不登录不能发帖,发帖和登录这两个模块之间就要有交互,就会抛

  • Java数组去重函数方法算法「建议收藏」

    Java数组去重函数方法算法「建议收藏」关于数组去重的Java函数,网上找了许多感觉都不好,所以自己想了一个,供大家参考packagestep2;importjava.util.Arrays;//数组去重函数,TMD,我自己编写,找了半天没有一个好的程序publicclassDesign{ publicstaticvoidmain(String[]args){ int[]test={3,5,4…

  • resultset类所有方法_resultset获取列名,和对应值

    resultset类所有方法_resultset获取列名,和对应值 chenjieuniqueResult()返回唯一结果(这种一般只会返一条实体类对象信息)Result()返回结果(展示所有结果)   publicTQuaAcceptancegetTQuaAcceptance(StringqaId){       //sql语句      Stringhql="fromTQuaAcceptance…

  • mysql数据库去重[通俗易懂]

    mysql数据库去重[通俗易懂]2019独角兽企业重金招聘Python工程师标准>>>…

  • WinExec 函数「建议收藏」

    WinExec 函数「建议收藏」从程序里面,调用另一个程序。或者系统自带程序,例子如下:CStringstrcmd=”Explorer/e,”+strDeCodePath; WinExec(strcmd,SW_SHOW);

  • Python爬虫从入门到精通——爬虫基础(一):爬虫基本原理[通俗易懂]

    分类目录:《Python爬虫从入门到精通》总目录我们可以把互联网比作一张大网,而爬虫便是在网上爬行的蜘蛛。把网的节点比作一个个网页,爬虫爬到这就相当于访问了该页面,获取了其信息。可以把节点间的连线比作网页与网页之间的链接关系,这样蜘蛛通过一个节点后,可以顺着节点连线继续爬行到达下一个节点,即通过一个网页继续获取后续的网页,这样整个网的节点便可以被蜘蛛全部爬行到,网站的数据就可以被抓取下来了。简单…

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号