以太坊连载(一):以太坊是什么

作者 杨镇


【连载序言】


以太坊(Ethereum)是世界上第一个也是迄今为止最大的基于区块链技术的智能合约平台。这份手册是其第一个生产版本Homestead的技术手册,主要目的是帮助初中级用户和开发者了解以太坊的方方面面和相关客户端、开发工具的使用。它是由以太坊社区在Github上共同维护的。Github地址:

https://github.com/ethereum/homestead-guide.git

我是杨镇,从今年4月中旬开始,用业余时间对这份手册进行了翻译,期间因为工作原因时有中断,到现在才基本完成。

我计划在最后一个月的校对和语言润色过程中,节选部分与技术细节、客户端或开发工具无关的,关于以太坊所涉及的一些相关概念的介绍章节,作为独立的文章在我个人的简书上进行连载。

节选的时候,我会在不影响阅读的前提下,去掉外部网站资源链接或这份在线文档内的引用。有兴趣的读者可以访问我个人的Github取得完整的翻译稿源代码自行编译为html文档。Github地址:

https://github.com/riversyang/homestead-guide-cn.git

此外,相信很多朋友都会对今年上半年国内的区块链(虚拟货币ICO)热潮以及9月初央行联合各金融管理机构联合发布的ICO非法的公告造成的影响有些许了解,但ICO和以以太坊为代表的智能合约平台并没有关系,ICO也不是区块链应用的唯一出路。(关于区块链的基本概念及其应用的话题,我也会择机另行撰文探讨。)

我个人依然很看好区块链技术在个人业务领域结合智能合约,以及在企业业务领域作为基础数据存储革新的市场前景,因为这代表着“未来”的去中心化自由经济趋势和更高的安全性、技术级别的可信性。

所以我决定开始这个连载,帮助可能的用户和开发者了解以太坊及智能合约的概念。而这也是我在开博随笔中提到的今年做的另一件真正有意义的事情。同时我也希望各层次的读者都能在这个连载中有所收获。

对文章内容或者相关概念有任何疑问、意见或者建议,都可以在简书中给我留言,我会酌情回复;当然,也可以通过Github与我联系。期待与大家的更多互动。



以太坊是什么?

以太坊(Ethereum)是一个开放的区块链平台,可以让任何人都能够创建和使用基于区块链技术的去中心化应用程序。与比特币一样,没有人控制或拥有以太坊,它是一个由全世界的许多人所共通创建的开源项目。

不同于比特币的是,以太坊被设计成灵活的、可根据需求修改的模式。在以太坊平台上创建应用是很容易的,在Homestead这个版本中,所有人使用这些应用程序都已经很安全了。

下一代的区块链

区块链技术是比特币的基础技术,在神秘的作者中本聪(Satoshi Nakamoto)于2008年发表的的白皮书"Bitcoin: A Peer-to-Peer Electronic Cash System"中被首次描述。

尽管在这篇最初的论文中已经提及了区块链技术的泛用性,但区块链作为通用术语出现,还是在几年之后的事。区块链是一个分布式的计算架构,每个网络节点都执行和记录同样的交易流水,这些流水数据被组织到所谓区块之中。

在同一时间,只有一个区块可以被添加到区块链中;每个区块都包含一个数学证明,来证实它是在它之前的所有区块之后产生的。用这种方法,使区块链的“分布式数据库”在整个网络中达到共识。用户与账本(交易流水)的交互通过强大的加密方式保证其安全性。负责维持和校验整个网络状态的节点,将获得基于编码到协议中的经济学奖励算法计算得出的奖励。

对于比特币而言,分布式数据库被设想成通过比特币代币在账户间的转移来使个人用户间的去信任金融变为可能的一种账户结算表、账本和交易流水的集合。

但随着比特币吸引了越来越多的开发者和技术专家,一些新奇的项目开始用比特币网络来做一些代币价值转移以外的工作。其中一些项目采用了"alt coins"的模式,通过改进原始的比特币协议形成自己的加密货币,从而将区块链分离以增加新的特性和功能。

在2013年底,以太坊(Ethereum)的发明人Vitalik Buterin正式提出了一个设想,这是一个具有再编程能力的、用来执行任意复杂计算的单一区块链,可以将很多其他的项目纳入其内。

在2014年,以太坊(Ethereum)的创始人Vitalik Buterin, Gavin Wood和Jeffrey Wilcke就开始致力于构建下一代的区块链技术的工作,以实现一个通用的、完全去信任的智能合约平台(smart contract platform)。

以太坊虚拟机

以太坊是一个可编程的区块链。以太坊允许用户根据自己的设想创建任意复杂的操作,而不是只给用户一些预设好的操作(例如比特币的交易操作)。用这种方法,它成为了一个支撑许多不同类型的去中心化区块链应用的平台,包含但不仅限于加密货币。

狭义上说,以太坊是定义了去中心化应用平台的一套协议。其核心就是可以运行任意的复杂计算代码的以太坊虚拟机(Ethereum Virtual Machine,即EVM,后续连载中会有更详尽的介绍,译者注)。

用计算机科学术语来讲,以太坊是“图灵完备”的。开发者可以使用友好的编程语言在EVM上创建应用程序,比如使用JavaScript或Python。

与其他任何区块链一样,以太坊也包含一个P2P(peer-to-peer)网络协议。以太坊区块链数据库,由众多的连接到此网络的节点维护和更新。每个节点都会运行EVM并执行相同的操作序列。因此,以太坊有时也被形象的描述为“全球计算机”(“world computer”)。

这种跨越整个以太坊网络的超大规模并行计算,并不会使计算更加高效。事实上,这样的过程,使在以太坊上进行的普通的计算远比使用传统的“计算机”来的更慢、更昂贵。

但是,由于每个以太坊节点都会运行EVM来在区块链上达成共识,这种去中心化的共识,也给了以太坊极致的容错性(fault tolerance)、零宕机时间(zero downtime)、使存储在区块链上的数据永远无法更改(forever unchangeable)和抗审查(censorship-resistant,即不怕审查,因为数据一直是真实的,无法篡改的,译者注)。

以太坊平台本身是无特性(featureless)或价值未知(value-agnostic)的。与编程语言一样,是企业家和开发者决定它应该用来做什么。然而根据以太坊本身的能力,某些特定的应用显然要比其他类型更能受益。具体来讲,以太坊 适合于那些旨在解决点到点之间直接交互,或者跨网络的团体协作问题的应用程序

例如特定的点到点(peer-to-peer)交易市场应用,或者自动化的复杂金融合约应用等等。 比特币,允许个人在不引入任何中介,像金融机构、银行或政府的情况下进行货币交易。而以太坊的影响会更加深远。

从理论上讲,任意复杂度的金融交互或交易(financial interactions or exchanges)都可以使用以太坊上的代码来自动化的、可靠的实现。而除金融应用以外,任何注重信任、安全、持久性的场合,比如资产注册、投票、管辖和物联网,都可以大范围的嵌入以太坊平台。

以太坊是如何运作的?

以太坊中包含了很多比特币用户很熟悉的特性和技术,同时它也引入了很多的修改和创新。

与比特币区块链中单纯的交易流水不同,以太坊区块链中的基础单元是账户(account,在后续连载中会有更详尽的介绍,译者注)。以太坊区块链跟踪每个账户的状态;以太坊区块链上的所有状态转换,都是账户间的价值或者信息的转移。

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

由私钥控制的外部账户(Externally Owned Account,即EOA)

由自身的合约代码控制的合约账户,这种账户只能由EOA“激活”(Activate)

对大多数用户来讲,它们最基础的区别就是人控制EOA,因为人能通过私钥控制EOA上的行为;而合约账户则由它们内部的代码来管理。对于合约账户,我们也可以说他们是有人“控制”的,因为他们 被编制为由一个有特定地址的EOA所控制,而这个EOA则由掌握其私钥的“人”所控制。

当一个交易发送到合约账户上时,合约账户中的特定代码会被触发并执行,这些代码即是通常意义上的“智能合约”。用户可以在区块链上发布代码来创建新的合约。

仅当合约账户接到一个EOA的指示的时候,它才会去执行一个操作。所以合约账户不可能去做一些自发的操作,比如生成随机数或调用API,除非被EOA指定去做。这是因为以太坊中的节点需要一个严格确定的执行确认,来认证外来的计算要求。

与比特币一样,用户为了完成一个交易,需要向网络支付小额的交易费。这个机制是用来保护以太坊网络不被一些无价值或恶意的计算任务所影响,比如DDoS攻击或者无限循环。交易的发送者必须为他们所激活的每一步“程序”支付相应的费用,包括计算和存储。这些费用是用一定量的以太坊原生代币——以太币来体现的。

这些交易费用,是由验证整个网络的节点们所收取的。这些以太坊网络中接受、传播、验证和执行交易的节点,即是所谓的“矿工”。包含了以太坊区块链中账户“状态”变动的所有交易信息,由矿工们归集到“区块”中,然后开始互相竞争,以使 他们自己产生的区块成为区块链中的下一个区块。

矿工每成功挖到一个矿(即把自己生成的区块添加到区块链上,译者注),都将获得奖励。这就是对那些为以太坊网络贡献硬件和算力的人的经济上的激励。

与比特币网络一样,矿工们想要成功“挖到”一个区块也需要解决一个复杂的数学问题。这就是被熟知的“工作量证明”("Proof of Work")。任何一个通过算法解决问题所消耗的资源大于验证结果所消耗的资源的计算问题,都是工作量证明的良好选择。

为了弱化比特币网络中使用特定硬件(比如 ASICs,一种专门用于计算的集成电路硬件,译者注)所带来的中心化趋势,以太坊选择了一个强内存需求(memory-hard)的计算问题。

如果解决一个问题就像需求CPU一样需求内存,那可以支撑的硬件会更趋近于通常的计算机。这使以太坊的工作量证明“抗ASIC”;并且与比特币的可能受制于特定硬件的挖矿过程相比,这种工作量证明更加有利于去中心化分布的安全性(即在一定程度上避免由于过多的区块都由一小部分计算能力非常强的节点所产生而导致的中心化趋势,译者注)。

待续。


结尾,或许可以加一个不太硬的广告。


                「以太坊智能合约开发(进阶)课」

经过内测以及第一期公测,一块链习和杨镇老师一直在收集课程反馈建议以及调整课程内容。之所以这样费劲心思,是因为我们想要的就是必须保证精心打磨课程内容,努力做到「唯一精品」。

因此,我们在第二期,重新更新录制了8节全部的课程内容!?

并且根据内测、公测的反馈,我们在课程大纲上做了以下的调整:


开设这门课程的动因

很多人或许不知道,虽然杨镇老师很早就知道了比特币,但他个人是 2016 年底才开始学习和研究区块链技术的。经过了一个月左右的对 fabric 的从入门到放弃后,他把精力集中到了以太坊上。

从 2017 年 3 月到 10 月的大概 7 个月左右的时间里,他用业余时间翻译了以太坊官网的 Homestead 文档,没有用任何机器翻译软件,完全是自己读原文来译为中文,虽然当时已经有其他人做了中文版,但他知道做这个事的目的还是学习、是积累,这也就是他的风格。

到 2017 年底的时候,杨镇老师基本上已经知道了以太坊是什么,它能干什么以及它正在干什么。而后就发现了目前国内文章质量最高的中文以太坊社区 Ethfans,当时的想法还是去结合自己对软件技术的理解和积累去做一些高质量的翻译、提供一些高质量的内容。

在今年 3 月份的时候,杨镇老师很幸运参与了 HiBlock 社区组织的 Solidity 官方文档中译项目,后来也成为了管理员,对中译版做了很多的校订工作;

同时,他开始学习以太坊黄皮书,2017 年下半年曾经看过黄皮书,但当时看不懂,半年之后再来看,感觉就简单了很多。

同时也更深地理解了黄皮书的价值和它开创性的贡献,尤其是在借鉴了其他很多所谓“智能合约平台”的设计之后。

从今年4月下旬开始他就对黄皮书的中文版(最初由猿哥和高天露中译)的正文全文进行了独立的校订和增补更新(结合英文版拜占庭版本的更新),到 5 月初最终完成。

至此,结合 Solidity 文档中的相关细节,他终于觉得自己真正搞懂了以太坊、搞懂了智能合约。不过,直到今年夏天依然没有看到市面上有其他人出这样一门课程,无论线上还是线下。

他认为非常奇怪:为什么智能合约开发的必修基础课没有人在讲呢?为什么这么有价值的、水平这么高的技术文档没有人在讲呢?那些自己看看社区文档就能搞定的东西反而那么多人在讲呢?

所以,他觉得应该做一门真正有质量的课,给那些和他一样关注细节、希望扎扎实实打好基础、讨厌低质量的快餐式学习的同行打造一个能真正帮助他们提高对智能合约的理解、帮助他们尽快从入门到精通的智能合约开发进阶课程。


这门课程解决什么问题?

Solidity 语言基础

这门课程将首先将介绍 Solidity 语言基础(Solidity 作为智能合约开发语言的一些特殊之处) 并结合数个合约实例带你走进智能合约的世界。

Solidity 是一种结合了 C++、Python 和 Javascript 语言创造出来的为智能合约开发而定制的语言,虽然它在设计时没有考虑形式化验证(智能合约的运行结果是依赖于其本身的合约“状态”数据和区块链环境数据的,所以最初没有考虑形式化验证大概也是可以理解的),它的数据类型的表现力有限(比如不支持真正的元组类型、不支持多维动态数据的序列化等等)。

但它也确实在事实上简化了智能合约的开发,是一种上手很容易、对初学者“很友好的”开发语言,它的技术价值是不可否认的。

不过,这种看起来“很简单的”语言,其实并不简单,因为有太多不那么直观的因素会影响 Solidity 程序的运行;而大部分开发者也许并不那么理解智能合约的运行环境——以太坊虚拟机(EVM)的各种各样的技术细节,各种各样的大坑小坑。

比如 private 函数和 public 函数在调用时到底有什么不同,仅仅是可见性么?比如数据在内存和存储(storage)中的结构有什么区别,为什么我可以对存储中的动态数组使用 push 和 pop,而对内存中的就不行?

比如 fallback 函数是如何运作的,它真的不能接收参数也不能有返回值么?比如 transfer、send 和带 value 的 call 有什么区别?又比如 EVM 中复杂的费用设计(尤其是存储的使用费)和 gas 返还机制是如何影响合约的 gas 消耗(也就是运行费用)的?

Openzeppelin 源代码分析

相信已经有越来越多的开发者知道了 openzeppelin-solidity 这个项目,在以太坊生态中,这绝对是个伟大的项目。因为它提供了众多经过社区反复审计、优化的,可复用的基础合约模版。

这也是非常非常重要的所谓“最佳实践”,因为杨镇老师从刚刚入行时就非常重视可复用的代码和设计模式。“不要重复造轮子”!尤其是那些已经被证明很好用的、很安全的“轮子”。

在这个课程的第二部分,就将为大家逐一解释这个项目中的所有合约模版的源代码。学习这些优秀的、经过反复审计的代码,对开发者而言就是一个很大的提高,读懂这里边涉及的诸多经典的设计模式,对开发者提高编码水平、培养良好的编码习惯也大有裨益。

虽然在老师看来这个项目里的大部分合约都不需要特别解释,但还是仔细的为大家整理了一个相对比较优化的学习顺序,帮助大家快速了解这几十个基础合约。

而其中关于权限控制、生命周期、支付、悬赏以及ERC20、Crowdsale、ERC721 等合约模版都是非常有实用价值的可复用代码。

智能合约安全开发指南

课程的第四部分将继续深入介绍智能合约开发的高级话题。在第七课里,我们会讲解以太坊虚拟机的费用设计、指令设计,简单地介绍 Solidity 内联汇编,并讲解合约 gas 优化的基本原则。

不管用什么高级语言编写的智能合约程序,最终都是会被编译为 EVM 指令的,最终都会表示为 EVM 字节码;所以从本质上讲,理解 EVM 指令才是智能合约开发的终极目标,这也需要我们能真正理解 EVM 的栈(stack)、内存(memory)、存储(storage)、calldata 和 returndata 的结构。

在这个课程的最后一课中,我们将讲解三个程序实例:一个对基础排序算法的 gas 优化实例、一个针对合约存储和 gas 返还机制的代码优化实例以及一个以合约实现的简化的以太坊协议模拟器。以此来讲解一些 Solidity 智能合约开发中可能会遇到的比较复杂的场景以及相应的处理实例。

课程设计和推进计划

除了以上这些基本课程内容以外,我们还精心设计了几个需要大家真正动手的编程作业;对于初级合约开发者而言是有一定挑战的,需要花一些时间和精力才能完成,非常有益于开发经验的积累、提高对合约编程的理解,同时这些作业本身也有很高的实用价值。

更惊喜的是杨镇老师也会单独为大家批改每次的作业,给予相应的单独指导。

另外,在时间安排上,以上这些内容会被分摊到四周的时间里,相对给学习者一个更充足的理解消化时间。

即使如此,考虑到内容本身的难度,这个课程对于学习者来讲依然是有非常大的挑战的。

这是一个精心设计、打磨的包含了非常多技术细节的课程,需要你耐心地学习、理解和积累,是可以反复咀嚼消化的,它绝不是那种只需要看一次的实操课或者简单地对社区文档的搬运和重复。

从现在开始,报名11月25日开班的以太坊智能合约开发进阶课程第二期,不仅价格更优惠,而且还有福利相送!具体如下——

1)这门课程将实行“阶梯早鸟价格制”,越早报名,优惠越多,课程原价3599元,现在报名只需2899元,优惠价格还有前10个名额,名额满后,会涨到原价=3599元。

2)这门课程中一个非常大的福利就是——按时完成所有作业,你将获得一半的学费返还!!!

3)那为了让各位同学能对智能合约开发感受的更深,在第二期的课程里,我们特意为大家准备了一重福利——黑客马拉松比赛(可能是线下喔!),让你能直接面对面上手实操课程里所教的全部玩法。

因此,想要报名的同学,建议点击下方链接前去抢座,动作请快!晚了,不仅价格更高,也会面临没有名额的风险。

点击链接,填表报名???

以太坊智能合约开发(进阶)课报名表

yikuailianxi.mikecrm.com/KxQT6AO

目前第二期的报名通道已经全部开启,点击链接即可前去报名。友情提示:优惠名额有限,晚了可能要涨价了,占座请快。

所有填写完报名表的同学,请记得添加微信号:yikuailianxi,获取录取信息。

也许部分同学还想继续了解下这门以太坊智能合约进阶开发课程,那我再简单介绍下吧——


1.课程名称:《以太坊智能合约进阶开发实战训练营》

2.课程导师:

杨镇老师,资深软件工程师、区块链技术布道者。拥有17年+的软件行业从业经验,2016年开始学习以太坊,独立中译了以太坊Homestead官方文档、对以太坊黄皮书中文版进行了独立校订和增补更新、独立中译了以太坊分片技术说明。

3.课程时间:11月25日正式开班,预计正常学时1个月,每周更新2节视频内容。

4.人数:第二期限额50人

5.课程适合对象:已经有 Solidity 初级开发经验但又做得没那么好的开发者;当前以及在从事区块链开发相关工作,希望进一步深造和系统学习以太坊开发相关的程序员;考虑到部分内容对程序设计、数据结构和算法有一定的基础要求,建议有计算机软件或相关专业学历的开发者学习。

6.学习形式:

在线录播课程+全程强化训练+1对1导师批改作业点评辅助学习+7名助教带小组学习+微信班级群交流。

另外,为了让大家真正确认课程是否适合自己,我们的课程支持1天无条件退款!

7.课程价格:3599元,但实行“阶梯早鸟价格制”,每个班期都会从2899元起售,每满10人即涨300元,到原价3599元封顶。现在报名,仅需2899元,手慢无!

这里可以多说两句。

按我们内部讨论的预估,这个课程的含金量和价值非常高,一定程度上,它可能会比市面上所有的区块链开发课程价值还高还值钱——你去看看各大招聘网站上那些动辄就30K月薪起步的区块链技术开发者职位就知道了。

而且重点是,这个课程目前业内确实是唯一的,别无他选。

所以,公平来看,我们其实觉得这个课程的价格不应该太低。但另一方面,考虑到很多人都对这个课程翘首以盼了很久,一块链习也希望价格可以尽可能亲民一些。

所以,我们最后的决定是——按时完成全部作业的同学返还一半的学费!!

想要报名的同学,建议赶快点击链接前去填表报名抢座啦???

yikuailianxi.mikecrm.com/KxQT6AO!

「一块链习」技术社区链接全世界最极客的区块链开发者,共同学习区块链技术知识与开发实战,为每一位开发者提供有深度的、持续的价值与帮助。

                                                          关注「一块链习」

                                                    与全球区块链开发者一块学习


转载于:https://juejin.im/post/5bee5a94e51d4507a717878a

你可能感兴趣的:(以太坊连载(一):以太坊是什么)