一起磨课程 干货|以太坊全景介绍及入门学习路径 (分享实录)

yanyan · 发布于 2018年05月02日 · 最后由 jimi 回复于 2018年06月05日 · 220 次阅读
600b82
本帖已被设为精华帖!

本次分享主要是针对以太坊的基本概念的介绍,属于入门级别,主要目的是帮助大家快速认识和了解以太坊。

自我介绍

image

大纲

image

1

交易所那些事儿

image

要谈到加密货币就没办法避开交易所,在我看来交易所其实是现在加密货币市场的一个最大的毒瘤。举两个实例来看。3月加密货币市场有两个大新闻:3月7日,某交易所自称被黑客攻击,很多账户遭受资金损失;3月底,另一个大的交易所号称某些账户做了一笔达到46万个比特币的恶意交易,导致市值大幅波动。

这两件事的具体情况我们不做过多探究和推论,只看它们公开的信息。这两家交易所的公开公告里对事件的处理方式是一样的,都是用回滚。大家如果懂数据库或计算机技术的都知道,我们现在的中心化数据库通常在企业应用里都会有备份机制,所谓回滚其实就是把数据库的数据完整地恢复到之前的某一个时间点。数据备份机制的频率可能是小时,也可能是天,像交易所这种应用的备份频率大多会是分钟级别,也就是说每分钟都会有备份,就是为了防止这钟异常情况的发生。

如果交易所要把交易回滚到3月30日14:59,14:59是有一个数据库数据快照的,它可以基于这个快照(相当于一个增量的变动),把数据恢复到14:59的状态,那么在这之后的交易就全部作废。

懂区块链技术的人应该知道,在区块链的世界里并不存在回滚,技术上不允许这样做,而这两家交易所既然能做回滚,就证明它不是去中心化的交易所,它用的存储技术还是传统的中心化数据库。

交易所的毒瘤体现在哪?我们可以简单过一下交易所的交易流程。首先要把虚拟货币充值到交易所,比如我想把比特币转成以太币,我需要先通过充值把比特币转到交易所,然后在交易所里把比特币换成以太币,之后再提现,把交易所里的以太币转到自己的钱包。

整个流程需要三个操作:充值、交易所交易、提现。充值发生在比特币网络上,提现发生在以太坊网络上,这两个交易是可以在比特币和以太坊的网络上查到的,但是在交易所内,不管你经过了多少次交易,都不能在公链上查到,也就是说交易所内的交易都是存储在它中心化的数据库里。既然这样,交易所作假就太容易了,在后台调整一个参数就可以做到,也没有监管。

即使不考虑交易所作假的情况,假设都是正常操作,有经验的操盘手也可以很简单地用10万美元在24小时之内制造出500万美元的市值波动。所以我们在交易所里看到的所谓价值,包括虚拟货币的波动,都跟这些金融因素有关。

2

扒光区块链

下面来看看什么是区块链。区块链作为比特币的底层技术,也作为以太坊的底层技术,值得我们去深入理解和学习。

简单来说,区块链就是一个数据库。如果大家懂技术或者会编程的话,应该知道数据库是什么,就是一个存储数据的软件。当然区块链和传统的数据库肯定是有区别的。

从最简单的概念来讲,区块链就是一个分布式流水账数据库。分布式、流水账,这两个修饰词就把区块链本身最关键的特性概括出来了。

分布式,简单来说就是数据库分散在各个地方。我们都知道每个企业,包括BAT、京东等都有自己的数据中心,同时还会在另一些地方有备份或冗余的数据库,但是这些数据库都是由本公司全部控制的,节点也不是很多。区块链的分布式是节点分散在世界各地,它是一个完全分散化存储的结构,一个地方的数据库出现问题,不会影响整个数据库的使用,因为在其他地方还有成千上万个存储节点。

流水账,举个例子,我们都去银行取过钱,银行的取款单上都有一个流水号,也就是说这笔交易在银行的系统里会有一个编号记录下来,相当于每个账户的每笔资金交易在银行有一个对应的唯一的编号和标识,流水的意思是这个编号是随着时间的推移而不断累加的,不会重复也不会返回。区块链本身的数据就是这样一个流水的数据,同样也有一个编号,只不过在区块链里是把若干交易打包到一个区块里用一个区块号来做标识,流水账本的一个关键特点就是不会重复也不可逆转。

那么区块链的流水账和银行的流水号有什么区别呢?这个区别主要体现在技术上。

银行的流水号是通过程序生成,存储数据的数据库是中心化的,允许修改数据,所以可以理解为银行是通过人为控制保证流水号不变,实际从技术上来说是可以改变的。

区块链里,技术上就不允许修改这个流水号,交易数据只能被添加,不能被修改或删除。

image

明白了区块链的实质以后,我们再来看上面这两个图,图中外围的都是最终用户。这两个图包含了三层意思:

  • 第一层意思:从最终用户应用的角度,实际数据是存在中心化的支付宝里,还是存在去中心化的分布式流水账数据库里。这对用户而言并没有什么区别,假如某一天阿里将数据全部存储到区块链网络,只要前端界面不变、应用操作不变,对最终用户而言是没有什么变化的。

  • 第二层意思:中间的分布式数据和业务功能,其存储和操作方式肯定是不一样的,区块链上的数据又是不可修改或删除的,所以在上面做业务的话也必然会有一些技术上的区别,这里就不展开介绍了。

  • 第三层意思:其实就是组织形式上的一些变动。右边这个图从人性的角度来讲更代表了一种自由平等,一种公众意识的体现。

3

以太坊

了解了区块链再来看以太坊就很容易了。我可以很简单地告诉大家,以太坊就是区块链加上以太坊虚拟机。以太坊虚拟机相当于一个虚拟的计算机,一个虚拟的代码执行机制,或者说一个虚拟的环境,它有自己的定制机器码,可以在基于区块链的存储之上运行一些可编程的业务逻辑。以太坊通常也被称为智能合约平台,或世界计算机

image

上图中的这个人是以太坊的创始人,V神,他被认为是扎克伯格之后的又一个天才。V神1994年出生于俄罗斯,6岁的时候和父母移民到加拿大,所以他拥有双重国籍,他父亲是计算机工程师,V神8岁开始学编程,10岁自己写了第一个单版游戏,类似于红白机上看到的小蜜蜂射击游戏,13岁开始沉迷于魔兽世界,在他16岁(2010年)的时候暴雪发布一个补丁,移除了术士的招牌技能——生命虹吸,他极力反对并在社区多次投诉无果后怒删游戏,转而去学其他的东西,从这个角度来说我们应该感谢暴雪,这次补丁事件间接成就了今天的V神。通过这件事,他也认识到一些像暴雪这样的大公司的中心化特点所带来的弊端,这个决策并不是通过玩家投票作出的。

此后的第二年,V神从父亲那知道并爱上比特币,然后开始自己的比特币写作,大概三年时间成为非常著名的比特币作家。后来V神进入滑铁卢大学学习,2013年他参加了一个比特币会议,他发现现在正是比特币发展的绝佳机会,于是毅然从滑铁卢大学辍学,用半年的时间游历欧洲,结实了很多共同兴趣的人,完成了以太坊的设想并在2013年底写出了以太坊白皮书。这份白皮书刚开始时只在小范围的朋友中传播,大家一起做后续的研究,直到2014年1月,V神在北美的一个比特币大会上正式公布了以太坊白皮书,确立以太坊正式成立。

这里就涉及到本次分享的第一个彩蛋了,这个彩蛋是关于V神和他的早期合作者Gavin Wood。Gavin Wood是以太坊黄皮书的作者,以太坊黄皮书就是一个技术手册,一份以太坊虚拟机的详细的技术说明,包括具体算法、实现方式、数据结构等等。据说以太坊黄皮书刚问世的时候全世界只有不到100人能看懂。想学习以太坊技术的话可以去看看这份文档。

以太坊早期的所有关键技术决策都是Gavin Wood来做的,所以在以太坊中V神和Gavin Wood就相当于苹果初创时期的乔布斯和沃兹尼亚克,一个专注于产品规划,一个专注于技术研究、产品实现。Gavin Wood本人非常低调,知名度当然没法跟V神比,但他是以太坊早期不可或缺的人物。

2016年Gavin Wood离开了以太坊社区,Gavin离开后做了一款世人皆知的以太坊客户端:Parity。Parity用Rust语言编写,是目前最稳定功能最强的客户端,这个客户端还是目前唯一一个支持企业级应用和功能的以太坊客户端。

2017年中的时候他又创立了一个新的项目Polkadot,这个项目被认为是区块链的未来,我认为这样的项目才称得上是区块链3.0。这个项目本身的宣传也是web3。他要解决的就是跨链的问题,他提供了底层的集成服务,本身有多链和链间通信两个关键特性,还提供了一种所谓的桥接(bridge)特性去连接已有的区块链网络。现在以太坊、比特币网络都是独立的,中间没办法做通信,要通信只能通过其他第三方的协议。而Polkadot的目标就是用新的底层架构,从软件协议层面重塑互联网。

4

以太坊的基本概念

image

账户(Account)

首先是账户,这是以太坊和比特币的区别,比特币里并不存在账户的概念,它只有一个地址,余额是通过扫描历史区块中和这个地址有关的所有交易的价值转移量来确定的;而以太坊里则用账户来保存这些数据。

以太坊的账户有两种类型:

  • 一是外部拥有账户,这种账户是由某一个特定的私钥来控制的。

  • 二是合约账户。以太坊的核心功能是提供可执行的智能合约,合约账户就是用来保存合约代码和所有合约数据的。

交易和消息(Transaction和Message)

以太坊里所有账户之间的交互都是通过交易或消息来实现的。这个交易和消息从技术上看其实是一样的,它们唯一的区别是:消息是由合约账户产生的,而交易一般是由外部账户产生。

气(gas)

以太坊里还有另一个非常重要的概念是气,气的英文gas是指汽油,从这个翻译来看是说汽车想要开走的话需要动力-汽油,也就是能源。对于虚拟计算机来讲,气就相当于我执行某些操作要消耗的电,而电需要用钱买,以太坊消耗的电要用以太币去购买。电也会有价格,对应到以太坊里气的价格就是gas price,每个交易每(消息)要消耗多少气是可以根据其具体数据或代码计算出来的,且会按照当时的气价换算成以太币作为执行交易的费用。

理解这些基本概念对我们理解其他高级内容非常重要。以太币网络与比特币那样一个价值网络对比,其设计初衷还是有区别的,以太币除了作为价值的等价物的属性以外,还有一个属性是为在以太坊虚拟机上运行智能合约执行操作提供成本机制。

从网络或合作方式的设计上看,设计以太币有三个目的:一是用这个来提供成本消耗;二是做一些等价物替换;三是做激励机制,激励给矿工。

说到矿工,很多人都听说过挖矿,以太坊也不例外。以太坊里获得以太币的唯一方式就是所谓的“挖矿”。挖矿的人就是矿工,很多矿工集合到一起挖矿就变成矿池,矿工用来挖矿的机器叫矿机,这都是一些最基本的概念,不再展开。

5

从用例看智能合约

在讲具体实例之前我们先送出第二个彩蛋。第二个彩蛋是关于智能合约的,什么是智能合约,智能合约对于我们这些做技术或编码的人而言有什么潜在的价值。

先来看什么是合约。举个例子,假如我要租房,需要跟房东签一个租房协议,这个协议通常会包括:预订一年或多久的时间,租金是每月付或每季度付,押金多少等等,这个租房合约其他人肯定用不了,如果要用必须重新签订。那这就是合约的第一个属性:唯一性,它是给某些特定的人,也就是合约的关系方所定制的。合约还有一个特性:它有时间限制。比如我和房东签订的合约时间是一年,那么一年之后就会自动失效。

智能合约和现实中的合约非常像,它也有这些特性。首先智能合约是给某一些参与者定制的,一般来讲是两方以上;其次智能合约通常也应该具备时间属性。智能合约相当于是一种自动的合约执行的机制。

那么智能合约对于程序员来讲有什么价值呢?了解了智能合约唯一性和时间性的特性之后,相信大家都能想到,假如要跟公司或者客户签订协议,不可能用同一份协议去给一千个客户服务。所以如果你掌握了智能合约开发能力就相当于掌握了在未来的智能合约时代或者说区块链3.0时代的一个律师资格。

因为每个合约都要人起草、审核,这都是律师的工作,而作为程序员的你会智能合约编码,就相当于拥有了智能合约平台的律师资格证,可以在智能合约平台里帮助用户或企业起草合约。这就不会像现在这样,服务或系统做完成交之后程序员可能就没用了,智能合约领域不存在这样的情况,因为合约是一次性的,执行完成之后还要重新起草、重新签订。

从用例看智能合约

image

上图列的这4类合约从应用角度来讲是有明显区别的。

第一类是对赌(Betting)合约和作物保险(Crop Insurance)。这都是双方参与的合约。对赌是什么意思呢?就是两个人来赌一件事,比如赌明天的气温高于多少或低于多少,或者直接就赌扔两个骰子的结果是大于7还是小于7。这种合约在以太坊上非常容易实现,只要20多行代码;它要通过使用一些数据服务,比如生成随机数、查询天气等链外数据等。作物保险其实也是一样,作物保险相当于是一个农民和保险公司之间签的智能合约,比如农民花10美元向保险公司投保,保险的内容是今年如果有冰雹,农作物受到损失的话,保险公司需要赔付给农民100美元。关于今年有没有冰雹,其实也可以通过第三方的气象台的链外数据服务来得到,从而可以自动进行理赔。

第二类是投票(Voting)合约和拍卖(Auction)合约。这都是多人参与的公共行为。投票和选举是类似的,可以在一个智能合约里规定,现在有几个方案或候选人,大家可以通过合约来进行投票或选举,因为以太坊里所有人都是用地址标识的,所以能判断这个人是否已经投过票。拍卖的话,先把要拍卖的东西在创建合约的时候把它转给合约,大家都可以看到要拍卖的是什么,然后出价。出价可以是两种方式:一种是明确表示我出多少钱,这个钱数直接写到交易里面,因为区块链上所有交易都是透明的,大家都可以看到。另一种是暗拍的方式,比如我把拍卖的金额通过一种算法进行变换(比如进行哈希)传给合约,这样从交易数据上不能直接看出各人的出价。当拍卖时限到达的时候自动完成拍卖。

第三类是付款(Purchase)合约和微支付通道(Micro Payment Channel)。简单来说就是支付和金融,比如转账、金融方面的一些付款合约,和淘宝中的发货、收获确认的流程非常像,买家卖家之间建立一个合约,买家先把钱打到合约里,卖家在线上通过第三方发起一个资产转移,或线下发起一个邮寄的动作,把货发出来,买家收到货后调用合约上的某个函数去更改状态,相当于确认收货,卖家就可以从合约里把钱拿走,这个过程和淘宝其实没有什么区别。

微支付通道从技术上来讲属于多重签名合约。比如我经常去跟同一个煎饼摊的老板买煎饼,我们两个人达成一致:我每天从他这里拿走一个煎饼,周期性(限定时间)地结账,这就是签订一个微支付通道。这个解决的就是交易费的问题,大家都知道比特币或以太坊每笔交易都会产生交易费,如果交易金额很小,那这种交易成本就会相对变得非常高,而像这样定期结算的话就只需要支付一笔交易费。

ERC20和ERC721

最后再看两个非常有名的代币的标准,ERC20和ERC721。ERC,简单来讲就是以太坊社区的参与者可以给以太坊提出改进意见,以太坊核心开发团队会针对这个意见来做一些注释,最后实现到协议上或客户端里(进入EIP)。

ERC20注明的就是代币标准,其意义在于它是一个通用接口,定义了一组函数和事件,只要符合这个接口的实现都可以作为标准代币,由交易所或第三方服务来处理。

ERC721是针对ERC20作了一些改造,ERC721是指一种不可替代物(non-fungible)token,是一种可以追踪的、不可再分的代币。ERC721代币的特性就像现实生活里的收藏品、汽车或房子等,是一种不可替代的资产,这种资产的转移是带有价值变动的。

6

以太坊生态系统和DApp

下面介绍一些以太坊的具体技术和工具。学习一项新技术,最困难的是一开始根本不知道要看什么、从哪里学起。

image

上图左边展示的就是以太坊的生态系统。最中间的是以太坊网络,包括客户端协议、区块本身的东西,离它最近的是左边Geth和web3,Geth就是以太坊的客户端,web3是学习以太坊必须要掌握的一个东西,因为它是和以太坊客户端节点交互的一个技术接口(JSON-RPC)。

上面的truffle和embark是以太坊的开发框架,目前人气最高、社区活跃度最高的,它们都提供了一些有利于合约测试的机制,比如本地测试环境、测试网络、测试代码模版等。

下面的swarm和IPFS是去中心化存储方案,我们要开发应用的话光有数据库和虚拟机还不行,还需要有前端处理,那自然就会有前端代码,前端代码就可以存储在swarm或IPFS上。IPFS是一个单独的区块链项目,它也是公链,有自己的生态。

右上角的oraclize就是预言机,其功能是提供链外数据服务。比如前文提到的,要生成一个随机数,或要获取天气信息,就需要用到这个服务。ENS可以理解为现在互联网上的DNS域名服务,可以在ENS上注册一个域名,在做去中心化应用的时候可以用ENS域名来访问相应的资源或者程序。

Mist是以太坊的钱包客户端。Metamask是一个基于浏览器的插件,可以帮你管理私钥。

右边的图是DAPP的基本组成要素。通常来讲,一个DAPP由三部分组成:

第一部分是链上的服务,包括智能合约、whisper和orbit。whisper是一个点对点消息服务,就是说以太坊的两个地址之间,可以通过whisper协议直接发消息过去。orbit就是一种类似于消息订阅的链上服务。

第二部分是链外的服务,包括oraclize、ENS、swarm、IPFS。链外是指智能合约所在链的链外,预言机是用来获取第三方服务或其他链上的数据,ENS提供域名,swarm、IPFS则是存储。

第三部分是前端,比如chrome+metamask、mist browser。它们都可以做前端程序的运行环境,执行DApp的前端程序。

7

以太坊入门学习指北

学习一个新的技术,首先要去官网看它的官方文档介绍。如上图,建议从左往右、从下往上的顺序来学习。

image

首先是以太坊官网,Ethereum Homestead Documentation也是我学习的入口,文档里讲了一些非常重要的概念,除了前文中提到的以外,还介绍了客户端的使用、比如geth的安装、web3的使用等。学习以太坊开发之前必须理解这些基本概念,否则会遇到很多麻烦。

接下来就是以太坊的高级开发语言Solidity,它有单独的编译器,可以把源代码编译成EVM机器码。这个机器码就可以发布到实际的链上来执行具体的功能。Solidity语法大概是结合了C++、JavaScript和Python语法的一种语言,跟语言关系最近的就是开发环境,比如truffle和embark,接下来就是其他相关工具,这些东西结合solidity的使用来学习就好。

如果这些都会了的话,可以再往上提高一步,比如EVM和ABI。ABI就是应用二进制接口,也就是智能合约的调用接口。每一个用solidity编写的智能合约,其编译结果会包含EVM机器码、ABI编码和web3部署代码。ABI编码之所以重要,是因为它不只是在合约之间调用时会使用,任何外部服务要与合约交互都要用到它;它不仅和编译有关,还和执行效率有关。

Openzeppelin是一个非常伟大的开源项目,它提供了一些合约安全编码的模板和标准的且相对安全的代码写法。这个项目的意义在于它提供了可复用的库(代码),这对于一个技术生态来讲是非常重要的。

Contract Auditing就是合约审计。智能合约间的相互调用和返回的机制、运行的细节等,都存在很多可以被利用的漏洞,合约审计是Solidity开发进阶的一个重要内容。

接下来就是一些具体的protocol topic(协议级的话题)了,这里就不展开来讲了,仅给大家提供一个参考。

8

总  结

image

最后一个彩蛋:“超级账本”和DLT。

image

之前社区的胡华杰老师分享过关于超级账本的话题。现在fabric比较火热,因为它是目前企业级区块链应用的一个标志项目,是一个可定制的区块链。这对企业来说很重要,因为每个企业都有自己的业务,哪怕都是电商或物流,具体业务细节每个企业都会不一样,所以它们迫切需要区块链是可定制的,fabric就提供了这样一种解决方案。

Hyperledger项目下面有五个顶级项目,其中一个是fabric;还有一个Burrow,是正在孵化中,通过类似以太坊这样的底层协议支持来做智能合约;第三个是Sawtooth,是针对供应链、溯源等场景的定制化区块链;第四个是Iroha,是一个最初由三菱、NTT Data和日立共同研发的,提供了很多开发的框架和开发工具的区块链项目;最后一个就是Indy,是用于身份识别的、垂直业务领域上的定制化区块链。

Hyperledger其实属于DLT的一种,也就是分布式账本技术,区块链就是分布式账本中的其中一种。目前新兴的DLT技术,其区别主要在于存储结构上。比如现在新出现一种DLT的存储结构DAG(有向无环图),用图数据结构来存交易数据,针对每一笔交易都有唯一的标识。另外还有针对DAG的改进算法HashGraph,也一样是利用图数据结构来进行存储级别的优化,以提高网络吞吐量和整体性能。

值得注意的是,DLT里没有代币的概念,比特币等网络中的代币一是作为价值载体,二是作为激励机制,而DLT和Hyperledger作为企业级应用,并不需要代币这样的载体,仅仅是使用了区块链(或者去中心化账本技术)的存储和数据共享(透明)这些属性。

内容来源:HiBlock区块链课堂007期 杨镇老师的线上分享《扒光区块链,以太坊全景介绍及入门学习指北

本文编辑:Cynthia

以下是我们的社区介绍,欢迎各种合作、交流、学习:)

image

共收到 1 条回复
600b82 yanyan 将本帖设为了精华贴 05月02日 23:45
993f99

多谢分享,安利一个适合区块链新手的以太坊DApp开发的入门实战:以太坊教程

需要 登录 后方可回复, 如果你还没有账号请点击这里 注册