以太坊智能合约开发 | 一个资深技术专家的心路历程

原创: 杨镇

一块链习社区 微信号yikuailianxishequ

本文作者杨镇, 以太坊黄皮书中译者,资深以太坊专家。曾独立中译了以太坊 Homestead 官方文档,Solidity 官方文档中译项目的贡献者、校订人以及项目管理员。现专注于区块链技术推广、中文技术社区贡献以及智能合约开发和安全审计方向。

我是杨镇,在软件行业从业17年了,大概在 2016 年下半年由于工作需要,我开始研究区块链,开始考虑在企业业务中使用这种所谓的“新技术”。

也是由于那次对区块链技术的学习,我发现了区块链技术的潜力,尤其是以太坊这个项目使我本人受到了很大的触动。

于是我在 2017 年用业余时间翻译了以太坊官网的 Homestead 文档,也对黄皮书的中文版正文全文进行了独立的校订和增补更新,至此,结合 Solidity 文档中的相关细节,可以说我已经掌握了以太坊协议以及Solidity 智能合约开发相关的方方面面的知识,对相关技术细节有了很深的理解。

2017 年底,我开始写一些区块链技术相关的博客文章,到现在为止也陆陆续续做了线上线下大大小小 20 多次的区块链技术分享。

  掘金 · 北京线下分享会现场

在这段期间有很多同学通过公众号、文章、微信等给我留言,经常咨询我关于在区块链行业怎样找工作、转行等相关事情,常见的会有这样几种问题:

1、应该如何深入地学习以太坊智能合约开发,有没有什么好的学习路径?

2、看了一些入门教程,能使用开发工具,写一些简单 DApp,但是想开发一个产品级的 DAPP,又感觉能力不够,没有信心,如何进一步提高自己?

3、怎么样从全局去思考“以太坊智能合约开发”?觉得无从着手怎么办?
这些都是非常值得探讨的话题,区块链、智能合约开发是一个新领域,我本人也是从零开始一步步学习,不断升级打怪,一直走到现在。
坦白来讲,对于智能合约开发从业者来说,入门很简单,但深入也很难。

简单的点在于:他们进入了一个全新的高速发展行业,这个行业之下不断涌现出各种新潮的看似能赚快钱的方式(例如 ICO、Fomo3D 游戏),引发了一波波的红利,以助于有时候你只是能自己看一些 tutorial,下载工具一步步操作,就可以很快写一个 HelloWorld,甚至简单的 demo。

而难的点又在于:在这个高速发展行业的巨轮之下的众多智能合约开发从业者,其实大多未曾经历过系统的学习和训练,他们脑海中大量的工作方法都是零散和片段式的,长期来看成长龟速,甚至有的开发者入门后就放弃了。

我也曾经无数次在交流时听到有人跟我说:“我想学习/做智能合约开发。”

但如果你要问起大家,到底他们理解的“智能合约开发”是什么,得到的答案往往五花八门,或者说,那些答案都只是“智能合约开发”的冰山一角,并非全貌。

作为一名合格的智能合约开发者,必须更深地了解Solidity语言、以太坊平台。

这就涉及到一些所谓的“高级话题”。在传统开发语言里,“高级”往往是“奢侈品”,仅用基本语言特性也能写出可用的代码。但是智能合约开发涉及到安全、性能等很多因素,这些“高级话题”属于必须掌握的知识,是“必需品”,不夸张地说,是业余开发者和专业开发者的分水岭。
作为一名智能合约开发者该如何进阶?

如果问我作为一名智能合约开发者该如何进阶,也许可以从以下几个方面来看。

1、Solidity语言基础

初学以太坊只能合约开发的人,会觉得 Solidity 很简单。

但是 Solidity 真的简单吗?Solidity是一种结合了 C++、Python 和 Javascript 语言创造出来的为智能合约开发而定制的语言,它在事实上简化了智能合约的开发,是一种上手很容易、对初学者“很友好的”开发语言。只要你稍有编程经验,就可以很快写出一些简单的智能合约。

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

比如 private 函数和 public 函数在调用时到底有什么不同,仅仅是可见性么?

比如数据在内存和存储(storage)中的结构有什么区别,为什么我可以对存储中的动态数组使用 push 和 pop,而对内存中的就不行?

比如 fallback 函数是如何运作的,它真的不能接收参数也不能有返回值么?比如 transfer、send 和带 value 的 call 有什么区别?

显然,这些问题并不是我们学习传统的编程语言可以了解到的,所以对于大多数初学者来讲,这些细节很可能会妨碍他们真正掌握合约开发或者影响他们处理一些相对复杂逻辑的能力。所以让智能合约开发者都真正搞懂 Solidity 与其他开发语言的区别就是首先要进行的重要工作。

2、智能合约安全与最佳实践

智能合约安全吗?我想这个问题的答案已经众所周知。其实自以太坊诞生以来,各种各样的合约漏洞、安全问题已经多次出现在技术社区乃至公众视野中。所以合约安全问题早已不是小众的话题。

比如 2016 年的 DAO 事件,因为当时价值数千万美元的以太币被盗取的问题,最终导致以太坊网络的硬分叉;又比如今年初的美链合约整数溢出漏洞,导致其币价归零等等。
在这里插入图片描述

要真的做好有效防范,还真不是一件简单的事情。

除了熟悉以太坊工作原理,智能合约语言设计,你还需要知道常见的安全漏洞类型,理解这些漏洞产生的原因以及规避的方法,这无论是对开发者本身还是实际业务安全都极其关键。

以太坊智能合约中常见的安全漏洞类型包括:重入、函数可见性、算术溢出、随机数错觉、外部合约引用、拒绝服务等等。

在熟悉安全漏洞以及背后的原理的基础上,最佳实践可以帮助你开发出更加可靠的代码。

你需要知道智能合约安全开发的一般原则,比如牢记区块链特性、使合约尽量简单等等;你还需要知道 Solidity 智能合约开发中的一些最佳实践,比如一定要谨慎处理外部合约调用、处理错误和意外、仔细处理 fallback 函数、注意 Solidity 的一些独特的语言特性等等。

最后就是学习一些软件工程上的经验,从工程实践上进一步保证合约的正常运转、响应意外情况,尽可能确保项目/用户的资金安全。

3、gas 优化

以太坊是一个很“昂贵”的计算平台,本质上是因为每次 transaction 带来的合约运算,都要在所有的全节点上运行。

但是昂贵并不意味着开发者无能为力。

对于我们做合约开发的人来说,有很多技术方法可以减少 gas 的消耗,这对项目的成功是至关重要的,也是开发者应该做到的事情。这就是所谓的性能优化问题。

要充分掌握性能优化的方法,大概需要知道一些基础知识,包括 gas 机制和汇编等等。

比如, EVM 中复杂的费用设计(尤其是存储的使用费)和 gas 返还机制是如何影响合约的 gas 消耗(也就是运行费用)的?

怎样通过汇编来减少 gas 的消耗?

在优化和代码可读性、可维护性上如何取舍?

4、汇编

上面在性能优化里已经提到了汇编。汇编的作用远不止这些。

在以太坊协议中,智能合约的本质就是 EVM(以太坊虚拟机)字节码加上合约状态数据所组成的所谓“自主对象(Autonomous Object)”。

所以,内联汇编就是我们的终极武器。了解了内联汇编,你就知道了智能合约到底都能做什么、不能做什么。

因为不管我们用什么高级语言来写合约,最终都是要反映为 EVM 字节码的,也就是 EVM 汇编指令,它们就是以太坊智能合约的全部能力。
同时,了解 EVM 指令也是进行终极 gas 优化的基础。这些相对的高级话题,也是合约开发者必须了解的。

上面我列举的是属于所谓高级话题其中一部分,除此之外,你还需要知道以太坊的基础数据结构。以太坊基础数据结构和智能合约开发不直接相关,但对几乎所有“高级话题”的理解,都建立在你对以太坊基础数据结构的理解之上。

在掌握了这些“高级话题”之后,你还需要多阅读源代码。

比如 OpenZeppling 是非常值得阅读和学习的代码库,其中包含了大量优秀的代码示例,都是社区反复审计优化的成果。此外,solidity-stringutils 也是个很值得学习的工具合约库。在我们掌握了基础知识之后,阅读代码可以开拓我们的眼界和思路,也给我们做自己的项目提供了可靠的参考和借鉴。

总的来说,我认为智能合约开发学习分两个阶段,一是入门,二是进阶。

这就好像造一个房子,如果只是造一个茅草屋,你大概只需要知道什么是砖头、瓦片,什么是门窗,通过简单的建造就可以弄出一个可以居住的小屋。但是如果造一个十几层的楼房,你就需要回答地基打多深,是10米还是15米,钢筋设计多粗,是不是要抗风,等等。

入门更多地是广泛粗浅地认识,进阶则需要了解一些所谓的关键细节,对关键细节的理解,会使得你开发DApp的时候能够作出最优的选择/取舍,follow最佳实践。

以我们所见,如果能有一门课程能帮这部分智能合约开发的从业者,建立系统认知且通过训练的方式帮他们提升诸如Solidity语言基础、智能合约安全审计、性能优化等关键性的基础能力,就能解决这个问题。

但,遗憾的是,在我们探索的过程当中,并未发现市面上有完美符合我们期待的以太坊智能合约开发课程。目前行业内现有的课程,要么是过于强调认知而不够实操落地,要么只是案例分享而概念缺乏体系化方法论的支撑。

甚至在整个区块链行业内一直以来这都是每一个项目CTO 都致力于搞明白,却从来没有人系统梳理和成功讲解过,也从来没有一套成型的方法,长久困扰着许多开发者的问题。以至于,整个区块链行业内,能够通过智能合约来做好优质合约的开发者,其实特别特别稀缺。

在这样的背景下,我和一块链习将近20位教研团队,从0开始,希望可以做一门面向于智能合约开发者符合我们期待的智能合约开发进阶课程。无论是从市场需求还是行业责任的角度,我们都想要做好这门课,即便一开始就知道它很难。

到今天,历时多月之后,经历内测、第一期公测两轮优化、视频全部重新录制更新后,我们终于可以说——

一块链习的一门重量级课程:《以太坊智能合约开发(进阶)实战训练营》系列课程第二期即将于12月2日开班,等待你的检验。

<img src="https://pic1.zhimg.com/v2-7534b94497fcf7482977970f3912894c_b.jpg" data-caption="" data-size="normal" data-rawwidth="1080" data-rawheight="329" class="origin_image zh-lightbox-thumb" width="1080" data-original="https://pic1.zhimg.com/v2-7534b94497fcf7482977970f3912894c_r.jpg">

这门课将解决什么问题?

本课程重点围绕着“以太坊开发+案例”帮大家解决如下问题——

1.从Solidty语言基础开始带你走进智能合约的世界

这门课程将首先将介绍 Solidity 语言基础(Solidity 作为智能合约开发语言的一些特殊之处) 并结合数个合约实例,带你走进智能合约的世界。本课程的第一周就将为你讲解其中的核心内容,帮助你快速抓住Solidity语言重点,走进智能合约的世界。

2.帮你掌握一套方法,通过实际案例了解并理解重要的可复用合约代码库

详细解读OpenZeppelin项目中的重要基础合约和 Token 合约样例,对于初学者而言,理解某些模版合约的精巧设计或者使用上的注意点乃至局限就成了同样非常重要的事情。所以在课程第二章节中,教研团队精心设计了两个编写合约的作业,带领大家尝试使用这些可复用的合约模版。

3.帮助你掌握智能合约安全编码的原则、最佳实践和实操要点

第三周我们将通过详细介绍目前已知的绝大部分可能的攻击或者协议、语言上的限制和漏洞,这里也会涉及一些以太坊和 Solidity 语言设计上的艰深细节而深入到智能合约开发的场景中,并且会从编码原则和最佳实践的角度讲解智能合约安全开发的要点。

4.带你了解 EVM 的指令设计和 gas 优化的要点,带你认识那些 Solidity 开发中最困难的实战内容

最后一周,我们将详细讲解以太坊的费用设计和指令设计,据此分析 gas 优化的原则和要点,最后以三个合约实例作为讲解 Solidity 高级开发的实战总结。

这四周的教学内容有很大的相关性,将帮助我们系统性理解以太坊智能合约开发的绝大多数细节问题,课程的难度也是逐步递进的。如下附上本门课程大纲,可进一步参考。
<img src="https://pic3.zhimg.com/v2-48bdeb8fe6aea7e69a27d9624a0b79e6_b.jpg" data-caption="" data-size="normal" data-rawwidth="1080" data-rawheight="4020" class="origin_image zh-lightbox-thumb" width="1080" data-original="https://pic3.zhimg.com/v2-48bdeb8fe6aea7e69a27d9624a0b79e6_r.jpg">

这门课程已经为区块链行业培养出50位合格且优秀的以太坊智能合约开发者,他们是这样评价这门课程的:

@王大锤:资深区块链游戏开发者,有丰富的智能合约代码审计和大型项目经验。现为区块链大型沙盘类游戏evolutionland的负责人。

在这里插入图片描述

@刘虹男:DOS Network核心开发者,京东金融区块链工程师,北京邮电大学研究生,参与过企业级区块链应用开发以及以太坊DApp的项目开发,是区块链技术的深度参与者。

<img src="https://pic4.zhimg.com/v2-2f3e5ebe1f93ba59c6f847cd91114bb7_b.jpg" data-caption="" data-size="normal" data-rawwidth="1080" data-rawheight="695" class="origin_image zh-lightbox-thumb" width="1080" data-original="https://pic4.zhimg.com/v2-2f3e5ebe1f93ba59c6f847cd91114bb7_r.jpg">

@郭斌:AbleCloud汽车金融工程师,北航区块链研究生,以太坊技术爱好者,曾参与多项以太坊Dapp开发,对监管沙盒、分布式交易所有一定的研究。

<img src="https://pic4.zhimg.com/v2-8fb5890c58c45da981000f8f38f4a87b_b.jpg" data-caption="" data-size="normal" data-rawwidth="1080" data-rawheight="522" class="origin_image zh-lightbox-thumb" width="1080" data-original="https://pic4.zhimg.com/v2-8fb5890c58c45da981000f8f38f4a87b_r.jpg">

@John:前Lots Foundation区块链Tech Lead,ARPA合伙人,东京大学地球物理博士。

<img src="https://pic1.zhimg.com/v2-af631397901d4467114d1d90e77fa048_b.jpg" data-caption="" data-size="normal" data-rawwidth="1080" data-rawheight="391" class="origin_image zh-lightbox-thumb" width="1080" data-original="https://pic1.zhimg.com/v2-af631397901d4467114d1d90e77fa048_r.jpg">

@史远:北航软件工程硕士,有十年以上开发经验,带领20人以上团队做过服务几百万人的移动医疗App。
在这里插入图片描述

在这里插入图片描述式开启报名模式了,也已经有多名同学通过层层筛选进入第二期班级,在这里分享几位名单给你:

@海贼王:慢雾科技安全研究员,智能合约开发老手,希望通过这次课程进修一些细节或者安全方向的问题。

@张启煊:上海科技大学CS专业在读学生,GeekPie PR-VIC实验室的LipIME课题组成员,从接触区块链到参加BitRun Hackathon并取得第二名1个月都不到。

@KryptoHenry:秘猿科技工程师,希望通过这门课程可以写出一个有人用而且受欢迎的 DApp。

@平健:上海交通大学电子信息与电气工程专业博士在读,希望能够通过这门课程学习以太坊智能合约安全、高效的编码原则,丰富智能合约实战经验。

@孟祥剑:okex 区块链开发高级工程师,目前负责基于以太坊的公链开发中的智能合约部分,熟悉以太坊黄皮书以及合约执行的底层以太坊代码。

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

想要报名的同学,建议赶快添加一块链习Jessie小姐姐微信:yikuailianxi前去抢座,动作请快!

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

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

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

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

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

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

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

7.课程价格:3599元,按时完成全部作业的同学返还一半的学费!想要报名的同学,建议赶快添加一块链习Jessie小姐姐微信:yikuailianxi前去抢座啦,杨老师和一批优秀的小伙伴等你来挑战。

关注「一块链习」

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

猜你喜欢

转载自blog.csdn.net/Yikuailianxi/article/details/84574200