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


原创: 杨镇 一块链习社区

微信号yikuailianxishequ
程序员


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


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


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


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


2017 年末,我开始写一些区块链技术相关的博客文章,到如今为止也陆陆续续作了线上线下大大小小 20 屡次的区块链技术分享。性能优化


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


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


一、应该如何深刻地学习以太坊智能合约开发,有没有什么好的学习路径?数据结构


二、看了一些入门教程,能使用开发工具,写一些简单 DApp,可是想开发一个产品级的 DAPP,又感受能力不够,没有信心,如何进一步提升本身?app


三、怎么样从全局去思考“以太坊智能合约开发”?以为无从着手怎么办?


这些都是很是值得探讨的话题,区块链、智能合约开发是一个新领域,我本人也是从零开始一步步学习,不断升级打怪,一直走到如今。


坦白来说,对于智能合约开发从业者来讲,入门很简单,但深刻也很难。


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


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


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


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


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


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


做为一名智能合约开发者该如何进阶?


若是问我做为一名智能合约开发者该如何进阶,也许能够从如下几个方面来看。

一、Solidity语言基础


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


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


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


  • 好比 private 函数和 public 函数在调用时到底有什么不一样,仅仅是可见性么?

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

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


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


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


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


好比 2016 年的 DAO 事件,由于当时价值数千万美圆的以太币被盗取的问题,最终致使以太坊网络的硬分叉;又好比今年初的美链合约整数溢出漏洞,致使其币价归零等等。


    


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


除了熟悉以太坊工做原理,智能合约语言设计,你还须要知道常见的安全漏洞类型,理解这些漏洞产生的缘由以及规避的方法,这不管是对开发者自己仍是实际业务安全都极其关键。


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


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


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


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


三、gas 优化

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


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


对于咱们作合约开发的人来讲,有不少技术方法能够减小 gas 的消耗,这对项目的成功是相当重要的,也是开发者应该作到的事情。这就是所谓的性能优化问题。


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


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

  • 怎样经过汇编来减小 gas 的消耗?

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


四、汇编


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


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


因此,内联汇编就是咱们的终极武器。了解了内联汇编,你就知道了智能合约到底都能作什么、不能作什么。


由于无论咱们用什么高级语言来写合约,最终都是要反映为 EVM 字节码的,也就是 EVM 汇编指令,它们就是以太坊智能合约的所有能力。


同时,了解 EVM 指令也是进行终极 gas 优化的基础。这些相对的高级话题,也是合约开发者必须了解的。


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


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


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


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


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


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


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


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


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


在这样的背景下,我和一块链习将近20位教研团队,从0开始,但愿能够作一门面向于智能合约开发者符合咱们期待的智能合约开发进阶课程。不管是从市场需求仍是行业责任的角度,咱们都想要作好这门课,即使一开始就知道它很难。


到今天,历时多月以后,经历内测、第一期公测两轮优化、视频所有从新录制更新后,咱们终于能够说——


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



这门课将解决什么问题?


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


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


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


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


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


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


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


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


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


这四周的教学内容有很大的相关性,将帮助咱们系统性理解以太坊智能合约开发的绝大多数细节问题,课程的难度也是逐步递进的。以下附上本门课程大纲,可进一步参考。

                                             

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


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

          

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



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



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



@史远:北航软件工程硕士,有十年以上开发经验,带领20人以上团队作过服务几百万人的移动医疗App。

                                                                                          


在这里,咱们第二课正式开启报名模式了,也已经有多名同窗经过层层筛选进入第二期班级,在这里分享几位名单给你:


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


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


@KryptoHenry:秘猿科技工程师,但愿经过这门课程能够写出一个有人用并且受欢迎的 DApp。


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


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


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

想要报名的同窗,建议赶快扫描下方二维码前去抢座,动做请快!


                                                                扫码报名👇👇👇

      


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


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


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


2.课程导师:

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


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


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


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


6.学习形式:

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


7.课程价格:3599元,按时完成所有做业的同窗返还一半的学费!


想要报名的同窗,建议赶快扫描下方二维码前去抢座啦,杨老师和一批优秀的小伙伴等你来挑战。


                                                         扫码报名👇👇👇




【战略合做】




                                                一块链习更多好课等你来看哦

                                                                    ↓↓↓


                                                                  关注「一块链习」

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

相关文章
相关标签/搜索