首页>参考读物>计算机科学与技术>软件与程序设计

深入以太坊智能合约开发
作者 : 杨镇 姜信宝 朱智胜 盖方宇 著
丛书名 : 区块链技术丛书
出版日期 : 2019-04-03
ISBN : 978-7-111-62372-4
定价 : 99.00元
扩展资源下载
扩展信息
语种 : 简体中文
页数 : 397
开本 : 16
原书名 :
原出版社:
属性分类: 店面
包含CD : 无CD
绝版 : 未绝版
图书简介

这是一部能指导读者从入门到进阶的以太坊智能合约开发指南。HiBlock区块链技术社区官方出品,4位资深区块链技术专家联合撰写。
从开发工具与生态、编程语言(Solidity)、编写方法、优秀实践、以太坊虚拟机、合约安全、软件工程等维度全景呈现以太坊智能合约开发的各个方面。更重要的是,以实战为导向,包含若干个翔实、完整的DApp案例讲解。
全书共12章,分为4个部分:
准备篇(第1~2章) 介绍了以太坊的必备常识、基础交互和开发工具套件。
基础篇(第3~6章) 详细讲解了智能合约开发语言 Solidity 的所有语法和编写合约的基本方法,同时也介绍了编译器和 Solidity 集成开发工具的使用。
进阶篇(第7~10章) 首先详细讲解了以太坊协议的细节和以太坊虚拟机的实现原理和架构设计;然后讲解了用于以太坊虚拟机函数调用的应用二进制编码的细节,以及公共基础合约库 openzeppelin-solidity 的源码实现;最后为智能合约的安全开发提供了经验性的指导,有极高的参考价值。
实战篇(第11~12章) 结合若干 DApp 实例讲解了如何基于智能合约来构造可用的去中性化应用程序。这部分内容可以帮助开发者快速上手构建基于以太坊的新一代互联网应用程序。
本书的附录中还包含了对以太坊协议中涉及的部分基础算法、以太坊虚拟机的费用设计和指令设计、 Solidity 内联汇编等的简单介绍。

图书特色

HiBlock社区官方出品,4位区块链技术专家联合撰写
从开发工具与生态、编程语言(Solidity)、编写方法、优秀实践、以太坊虚拟机、合约安全、软件工程、DApp开发等维度全景呈现以太坊智能合约开发

图书前言

为什么要写这本书
笔者其实并不是开源软件的早期拥趸,而是一名在企业IT服务领域工作了16年的老程序员。大概在2016年下半年,因为工作需要,笔者开始研究区块链,开始考虑在企业业务中使用这种所谓的“新技术”。不过因为当时的企业级区块链方面还没有可用的技术平台(Fabric还不成熟),所以最终没有在具体业务中使用区块链。但也是由于这次对区块链技术的学习,笔者发现了区块链技术的潜力,尤其是发现了以太坊这个项目的潜力,这使笔者受到了很大的触动,笔者感觉自己有可能基于对技术的理解和钻研精神,在这个新领域中获得超出过往十余年所取得的成绩。
笔者在2017年用业余时间翻译了以太坊官网的Homestead文档,没有用任何翻译软件,完全是自己读原文来将其译为中文的;而后参与了HiBlock社区组织的Solidity官方文档的中译项目,并很快成为项目的管理员,对中译版做了很多的校订工作,这也是以太坊社区官方的中文版本(以太坊官网上的Solidity文档中有对应的链接)。之后就是《以太坊黄皮书》(Ethereum Yellow Paper)。《以太坊黄皮书》就是以太坊协议的技术说明文档,里边记载了以太坊协议的几乎全部细节,包括以太坊虚拟机的具体设计。这是一份难得的、经过实践检验的高质量技术文档,对学习以太坊,乃至其他区块链技术都有很高的参考价值。同时《以太坊黄皮书》也是所有以太坊客户端的理论和实现基础。目前业内几乎所有智能合约平台都或多或少地“借鉴”了《以太坊黄皮书》中的设计。
笔者从2018年4月下旬开始对《以太坊黄皮书》的中文版(最初由猿哥和高天露译)的全文进行独立的校订和增补更新(结合英文拜占庭版本的更新,也没有用翻译软件),到 5 月初最终完成。至此,结合Solidity文档中的相关细节,可以说笔者已经掌握了与以太坊协议以及Solidity智能合约开发相关的方方面面的知识。在开始写作本书的时候,笔者已经对以太坊协议和智能合约技术有了很深的理解。
本书主要内容
本书分为四大部分。
第一部分为准备篇,简单地介绍了以太坊及其相关基本概念,并讲解了以太坊的基本交互和基础工具的使用。
第二部分为基础篇,详细讲解了智能合约开发语言Solidity的所有语法和编写合约的基本方法,同时也介绍了对编译器的使用以及Solidity集成开发工具的使用。
第三部分为进阶篇,详细讲解了以太坊协议的细节和以太坊协议的核心—以太坊虚拟机的实现原理和相关设计;讲解了用于以太坊虚拟机函数调用的应用二进制编码的细节;对目前最有价值的公共基础合约库OpenZeppelin-Solidity的所有源码进行了详细解读;为智能合约安全开发提供了经验性的详细指南。
第四部分为实战篇,结合若干DApp实例,讲解了如何基于智能合约来构造可用的去中心化应用程序。
附录中则包含了对以太坊协议中涉及的部分基础算法、以太坊虚拟机的费用设计和指令设计的介绍,以及对Solidity内联汇编的简单介绍,可以作为我们进行智能合约开发的参考资料。
如果你是一名了解以太坊基础知识和相关工具使用方法的开发者,那么可以直接从第二或第三部分开始学习。但如果你是一名初学者,或者对以太坊的基本概念和工具还没有了解,请按照本书编排的顺序从第1章开始学习。
本书尝试实现的目标
本书将尝试引导智能合约开发者深入理解下面的一些问题。
(1)认识到Solidity并不简单
Solidity是一种结合了C++、Python和JavaScript语言创造出来的为智能合约开发而定制的语言,它在事实上简化了智能合约的开发,是一种上手很容易、对初学者“很友好的”开发语言。只要用户稍有编程经验,就可以很快写出一些简单的智能合约。
不过,这种看起来“很简单的”语言,其实并不简单,因为有太多不那么直观的因素会影响Solidity程序的运行;而大部分开发者也许并不那么理解智能合约的运行环境—以太坊虚拟机(EVM)—其中存在各种各样的技术细节和各种各样的“大坑小坑”。比如,private函数和public函数在调用时到底有什么不同?仅仅是可见性吗?比如,数据在内存和存储中的结构有什么区别?为什么可以对存储中的动态数组使用push和pop,而对内存中的就不行?比如,fallback函数是如何运作的?它真的不能接收参数,也不能有返回值吗?比如,transfer、send和带value的call有什么区别?又比如,EVM中复杂的费用设计(尤其是存储的使用费)和gas返还机制是如何影响合约的gas消耗(也就是运行费用)的?
显然,这些问题并不是我们学习传统的编程语言就可以了解到的,所以对于大多数初学者来讲,这些细节很可能会妨碍他们真正掌握合约开发或者影响他们处理一些相对复杂的逻辑的能力。所以让智能合约开发者真正搞懂Solidity与其他开发语言的区别是首要工作。
(2)不要重复造轮子
与我们在其他所谓传统软件开发中看到的工程特性一样,在智能合约开发中同样存在“重复造轮子”的问题。同样的基础功能或者非常接近的基础功能,被程序员反复编写,犯各种各样的小错误,这种情况在智能合约开发的初学者中同样普遍存在。那么有没有已经被证明是很好用的、很安全的“轮子”呢?这也是笔者希望给智能合约开发者讲解和普及的一个重要内容。因为笔者从刚刚入行时就非常重视可复用的代码和设计模式,所以学会使用那些经过反复审计的、反复优化的可复用代码,在笔者看来也是非常重要的。
(3)智能合约并非绝对安全
这个问题的答案已经众所周知。其实自以太坊诞生以来,各种各样的合约漏洞、安全问题已经多次出现在技术社区,乃至公众视野中。所以合约安全问题早已不是小众的话题。笔者认真搜集并整理了目前智能合约开发中已知的几乎所有合约级别的漏洞或者可能遭受的攻击,希望广大的合约开发者能真正理解这些问题产生的原因并知道相应规避方法。这无论是对开发者本身还是对实际业务安全都极其关键。
(4)智能合约开发离不开软件工程
任何软件项目都脱离不了软件工程上的一些基础理论和最佳实践,智能合约开发也不例外。当然,因为智能合约运行环境的特殊性,智能合约开发项目从工程特点上讲与传统软件工程有很大区别。最主要的就是智能合约代码一旦部署就无法更改了,这使我们已经习以为常的冷热修补式的工程实践再无应用可能。我们必须要结合智能合约本身的特性来安排工程活动。笔者也将结合自己15年以上的工程经验和对智能合约开发的深入理解为智能合约开发者讲解智能合约开发项目中需要注意的方方面面。
(5)本书中还有什么
在以太坊协议中,智能合约的本质就是EVM字节码加上合约状态数据所组成的所谓“自主对象(autonomous object)”。所以,内联汇编是我们的终极武器。了解了内联汇编,就知道了智能合约到底都能做什么,不能做什么;因为不管我们用什么高级语言来写智能合约,最终都是要反映为EVM字节码的,也就是EVM汇编指令,它们就是以太坊智能合约的全部能力。同时,了解EVM指令也是进行终极gas优化的基础。这些相对高级的话题,也是笔者希望能让更多智能合约开发者了解的。不过这些话题都被编排在附录中,供学有余力的开发者参考。
(6)写在最后
与学习其他技术一样,学习智能合约开发是一个艰苦的、需要积累的过程,没有人能一夜之间成为专家。笔者只是希望能将自己学习以太坊和智能合约的大部分收获更快、更有效地传授给后来者,让更多同行真正理解和掌握智能合约开发的要点,但这也同样需要学习者投入一定的时间和精力。
这是一本给那些和笔者一样关注细节、希望扎扎实实打好基础、讨厌低质量的快餐式学习的同行们打造的,能真正帮助他们提高对智能合约的理解,帮助他们尽快从入门到精通的智能合约开发方面的书。
在开始有写书念头的时候,笔者就很幸运地获得了3位朋友(姜信宝、朱智胜和盖方宇)的支持,并收到了机械工业出版社华章分社的邀请,于是我们4人开始了本书的编写工作。编写工作当然很艰苦,大家都是利用业余时间进行的,所以前后大概经历了5个月的时间。
我们希望本书为以太坊开发者或希望学习以太坊智能合约开发的开发者提供一套系统的、完整的学习和参考资料,帮助他们快速认识、理解和掌握基于以太坊和 Solidity 语言来进行智能合约开发,乃至DApp开发的实践。本书的附录也可以作为以太坊技术细节的参考手册。
本书的特色
本书囊括了开发者基于以太坊平台进行智能合约开发所需要的所有知识细节,由浅入深地讲解了以太坊智能合约开发的方方面面。
本书的基础篇介绍了以太坊智能合约开发语言Solidity的几乎所有语法和语言特性细节,既可以按编排顺序逐步学习,也可以作为工具手册随时查阅。而进阶篇详细介绍了以太坊协议和以太坊虚拟机的原理和相关细节,并对大量经过社区设计、优化的合约源代码进行了详细解读,可以帮助开发者在知其然的基础上知其所以然;同时,进阶篇中也包含了对目前已知的所有针对智能合约的攻击方式的详细介绍和基于智能合约进行工程实践的经验总结,这些都是不可多得的优秀技术资料,有极高的参考价值。
此外,本书的实战篇中还为开发者提供了完整的DApp开发实例,可以帮助开发者快速上手构建基于以太坊智能合约的新一代去中心化应用程序。
本书的附录中则包含了对以太坊虚拟机的费用设计、指令设计以及Solidity内联汇编的介绍,可以作为开发者更深入学习、研究智能合约开发的参考资料。
到本书截稿时,国内还没有一本同类书籍能够像本书一样覆盖以太坊智能合约开发的几乎全部细节,并具有同等的讲解深度和广度。
读者对象
本书内容的安排由浅入深,即使没有智能合约开发经验的开发者也可以学习参考。不过,由于本书中并未包括对区块链技术基础(比如分布式网络、密码学等)的详细介绍,需要读者对相关基础知识有一定的了解。
本书适用于以下几类读者:
有高级语言(如C++、Java、Python 等)开发经验的开发者;
有计算机软件及相关专业本科及以上学历,且正在从事软件开发工作的开发者;
有计算机软件及相关专业本科及以上学历的在校生或应届毕业生;
其他有计算机专业基础知识(如数据结构和算法、分布式网络、密码学等),且希望从事智能合约开发的开发者。
勘误和支持
由于作者们的水平有限,加之编写时间仓促,书中难免会出现一些错误或者不准确的地方,恳请读者批评指正。为此,笔者特意创建一个在线支持与应急方案的二级站点http://book.blendercn.org。你可以将书中的错误发布在Bug勘误表页面中,同时如果你遇到任何问题,也可以访问Q&A页面,笔者将尽量在线上为你提供最满意的解答。书中的全部源文件可以从上述二级站点下载,笔者也会将相应的功能更新及时发布出来。如果你有更多的宝贵意见,欢迎发送邮件至邮箱rivers.yang@icloud.com,期待能够得到你的反馈。
致谢
首先要感谢伟大的Vitalik Buterin和Gavin Wood博士创造了以太坊平台;感谢来自全世界的开源贡献者们将以太坊生态发展丰富到目前的状态;感谢以太坊社区为全球开发者提供的高质量文档和相关资料。本书是站在巨人的肩膀上完成的。
其次要感谢3位合作者对本书的付出:其中,盖方宇编写了第1章、第3章和第5章,朱智胜编写了第2章和第11章,姜信宝编写了第6章和第12章。没有你们的努力,本书是不可能在这么短的时间内完成的。
感谢机械工业出版社华章分社的编辑杨福川和孙海亮,在这近半年的时间中始终支持笔者和3位合作者的编写工作,你们的鼓励和帮助使我们能顺利完成全部书稿。
最后要感谢笔者的父母和笔者的夫人提供的支持。
谨以本书献给笔者最亲爱的家人,以及所有热爱开源、热爱以太坊的朋友们!

杨镇

专家评论

本书深入浅出地介绍了区块链2.0时代的代表作品——以太坊。全书分为准备篇、基础篇、进阶篇、实战篇,从以太坊的发展历程、基本概念开篇,逐渐深入到Solidity智能合约开发语言、以太坊虚拟机等核心内容,既适合初次涉及区块链领域的读者进行概念了解,也适合相关领域的开发者进行以太坊核心技术的学习。本书还对多个通用智能合约进行了源码级分析,着重解读了智能合约安全编码,为想要基于以太坊进行DApp开发的读者提供了丰富的开发示例,同时强调了开发过程中必须要注意的安全事项,避免开发者由于缺乏开发安全合约的思维而产生安全隐患。所以说,本书是一本不可不读的书籍。
—戎佳磊go-ethereum开发者
我们(EthFans.org)以前在做技术内容的时候,常有面临一些困扰:一方面,以太坊的技术说明文档,尤其是比较前沿的技术说明和开发工具说明,都是用英文写的;另一方面,虽然有不少从事技术翻译的人,但是其中少有一线开发人员,故难免在技术关键点上出现“失之毫厘谬以千里”的情况。
会出现这样的情况,说到底还是因为缺乏一本足够专业和深入的本土入门书籍。这本书一要能讲清楚以太坊底层的运行原理;二要能深入解读 EVM 中的各种方法;三要介绍适合上手的开发工具;四要对合约开发中常见的问题做出说明并提供解决方案。
从我有限的翻译经历和技术理解来看,本书已明确提供了这些内容,并且跟上了最新的技术发展趋势,所以足可称为以太坊中文社区的一座里程碑。
—阿剑EthFans
相较于比特币,以太坊提供了一套内部图灵完备的脚本语言和虚拟机以供用户来构建任何可以精确定义的智能合约和业务交易。以太坊的出现是区块链领域一次伟大的技术革新,无论从科研、技术落地还是应用的角度看,都给予广大爱好者启发与帮助。截至2018年年末,以太坊拥有区块链领域最为庞大的开发者社区,同时也获得了最多的关注度,其与IPFS星际文件系统的技术搭配,也被应用于诸多去中心化应用之中。本书便是对以太坊及其智能合约进行了全面且深度的讲解,从入门到进阶再到实战逐层展开。通过阅读本书,读者在短时间内快速掌握核心知识,上手项目。喜爱以太坊技术的读者万不可错过。
—戴嘉乐《IPFS原理与实践》作者

上架指导

计算机\程序设计

封底文字

以太坊开创了智能合约的概念,并且将其首次实现,区块链从简单记账载体成为通用应用平台。至此,在去往大规模去中心化世界的路上,我们又有了新思想和武器。本书由浅入深,完整阐述了以太坊的底层技术原理、经济系统及开发者应用生态,是难得的系统性了解以太坊开发的中文书籍。
——岳利鹏 Polkadot社区组织者
以太坊技术是公链技术的标杆,是区块链公有链技术的事实标准。本书作者在区块链基础理论方面功底扎实,项目实战经验丰富。在本书中,作者通过理论联系实践的方式,用深入浅出的笔法,通过通俗易懂的语言介绍了以太坊的核心概念和基本技术特性。
更加难得的是,本书作者将自己在项目实践中的体会提炼成大量案例并放于本书中,通过这些案例,读者在理解以太坊基本概念的基础上,能够更好地理解以太坊的应用场景和大量实战技巧。因此本书是学习以太坊技术的精品。
——冯翔 区块链兄弟技术社区创始人/旺链首席架构师
以太坊的诞生,标志着一个全新的、开放的科技金融时代的到来。人们可以通过以太坊的智能合约来进行复杂的资产操作,比如股票、债券、期货、权证、预测、清算等。自2015年诞生以来,以太坊迅速成为区块链行业内的主流平台,运行着数十万的智能合约与分布式应用。本书从技术的角度出发,介绍了以太坊底层运行原理、智能合约开发,尤其是安全开发的全景图,让读者可以切实理解以太坊、智能合约、DApp的运作机制。相信本书一定会成为相关领域广大极客以及爱好者们学习和研究的好助手。
——鲍帅 好码安全科技联合创始人

作者简介

杨镇 姜信宝 朱智胜 盖方宇 著:杨镇
国内区块链与智能合约领域的知名技术专家,有15年的一线软件研发和工程项目经验。对以太坊相关技术有非常深入的研究,活跃于各个中文区块链技术社区,致力于区块链、智能合约技术的推广以及企业级区块链应用落地的探索。
资深软件工程师、架构师,区块链和智能合约技术布道师、独立讲师。
2018 年初对以太坊黄皮书的中译版做了独立校订和增补更新,并作为管理员和主要校订人参与了 Solidity 文档的中译项目。2018 年 8 月独立开发了国内为数不多的以太坊智能合约高级开发课程(在线视频课程)。2018 年底作为译者参加了《精通以太坊》(Mastering Ethereum)中文版(即将出版)的制作工作。截止到 2018 年底,已进行了数十次线上、线下的区块链或智能合约技术分享交流,是区块链和智能合约领域颇受欢迎的技术布道师。

姜信宝
HiBlock区块链社区(HiBlock.One)创始人,专注于区块链技术的研究、培训和推广。HiBlock区块链社区成立于2018年,曾组织Solidity(0.4.22)中文版翻译项目,线下区块链技术沙龙活动60余次,黑客马拉松3次。
Scrum联盟认证讲师(Certified Scrum Trainer),敏捷变革中心合伙人,从事敏捷Scrum推广与宣传等工作十余年,曾担任京东敏捷顾问。


朱智胜
资深软件工程师、架构师,有近10年的一线软件开发与架构经验,长期从事第三方支付及金融相关领域的研发工作。
曾参与火币钱包及交易所开发,后参与多家交易所和DAPP项目的开发,对以太坊技术有深入的研究。
热衷于技术分享,是CSDN知名博客专家和讲师。独立完成两套Drools规则引擎视频教程和规则引擎官方技术文档的翻译。

盖方宇
区块链技术专家,一直积极钻研区块链底层技术,对比特币、以太坊等主流公链以及底层的共识算法具有比较深刻的理解。同时热衷于DApp开发,精通Solidity语言,是Solidity官方文档中译项目的主要贡献者之一。目前主要关注区块链二层扩容技术,对状态通道(State Channel)、侧链(Sidechain)颇有研究,是“深入理解Plasma”系列的原创作者。
研究方向包括分布式系统、计算机网络、信息安全以及区块链系统,多次在国际学术会议和期刊上发表论文。

推荐序

以太坊开启了一个新的时代,诞生了基于公链的各种智能合约,为互联网信息的Token化提供了有效的基础设施。我相信在不久的将来,我们可以通过区块链技术和其他密码学技术来Token化和我相关的全部信息,包括“我是谁(我的各种身份标示)”“我有什么(各种价值和权益)”和“我做过什么(我和不同系统、其他人之间的发生过的逻辑)”。有转让价值的信息可以作为区块链Token存在,并自动进入一个高效开放的市场。全部的Token都可以作为系统集成点,来集成不同的服务,为现有的互联网增加集成能力。
期待着Tokenise Everything的那一天,我可以带着Token化的社交关系使用NoFacbook应用来点赞使用NoWeChat应用的朋友的朋友圈,然后语音呼叫几个使用NoTwitter的朋友,大家一起约个饭。
期待着Tokenise Everything的那一天,我可以对着手机吼一声“重新优化我的投资组合”,手机就会根据我的Token了解我的消费习惯、收入情况、家庭情况、社交关系、工作状况等等各种Token化的信息,结合我现有的各种Token化的投资和高效开放的市场内的各种产品,一个原子化交易同时调用100多份智能合约,帮我完成一个只适合我的投资组合。
期待着Tokenise Everything的那一天,每个人的手机都是一个完全按照个人定制的集成平台,再也没有复制、粘贴、登录、跳转等步骤。简单提一个要求,手机自动调用多个服务,通过Token将这些服务系统集成在一起,一个动作直接完成用户需求。
上述这些的实现,很多都要依赖于智能合约,本书很好地介绍了公链智能合约的基本概念和进阶开发技巧,对于区块链有兴趣的开发人员来说,是一本很好的入门书籍,值得推荐。
—张中南AlphaWallet联合创始人&CEO

图书目录

推荐序
赞誉
前言
第一部分 准备篇
第1章 快速了解以太坊2
1.1 以太坊是什么2
1.2 以太坊的历史和发展路线图5
1.3 以太坊的基本概念8
1.3.1 账户(accounts)8
1.3.2 合约(contracts)9
1.3.3 交易(transaction)和消息(message)9
1.3.4 气(gas)10
1.4 以太币(ether)12
1.4.1 以太币的发行12
1.4.2 以太币的单位13
1.4.3 以太坊挖矿13
1.5 以太坊测试网络13
1.6 以太坊客户端14
1.7 以太坊生态系统全景扫描15
1.7.1 Swarm15
1.7.2 ENS15
1.7.3 Whisper16
1.7.4 其他相关项目16
1.8 本章小结17
第2章 以太坊基础交互及基础开发工具详解18
2.1 以太坊客户端的下载、安装及简介18
2.1.1 Geth下载18
2.1.2 Geth安装19
2.1.3 Geth启动与数据目录结构20
2.1.4 网络环境分类20
2.2 核心命令和参数解析21
2.2.1 如何获得命令及参数21
2.2.2 常见基础操作命令22
2.2.3 常见web3j交互命令23
2.3 Remix详解26
2.3.1 Remix简介26
2.3.2 Remix实战27
2.4 本章小结32
第二部分 基础篇
第3章 智能合约开发语言Solidity基础34
3.1 智能合约与Solidity简介34
3.2 Solidity基础语法35
3.2.1 版本杂注35
3.2.2 import的用法35
3.2.3 代码注释36
3.2.4 数据类型36
3.2.5 全局变量52
3.2.6 表达式和控制结构55
3.3 Solidity语言速查表63
3.4 Solidity源代码书写风格68
3.5 本章小结82
第4章 Solidity编译器83
4.1 安装Solidity编译器83
4.1.1 直接获取可执行程序包83
4.1.2 从源代码编译构建84
4.1.3 Solidity编译器版本号详解86
4.2 使用Solidity编译器87
4.2.1 命令行编译器87
4.2.2 编译器输入、输出的JSON描述88
4.3 合约元数据93
4.4 本章小结96
第5章 Solidity智能合约编写97
5.1 创建智能合约97
5.2 可见性控制99
5.3 getter函数100
5.4 函数修饰器102
5.5 状态常量104
5.6 函数104
5.6.1 view函数105
5.6.2 pure函数105
5.6.3 fallback函数106
5.6.4 函数重载107
5.7 事件108
5.8 继承110
5.8.1 基类构造函数110
5.8.2 多重继承111
5.8.3 线性化114
5.9 抽象智能合约114
5.10 接口115
5.11 库116
5.12 using for的用法119
5.13 本章小结121
第6章 Solidity集成开发工具简介122
6.1 Truffle122
6.1.1 Truffle简介122
6.1.2 快速体验123
6.1.3 用Truffle的开发过程124
6.1.4 Truffle高级用法134
6.2 Embark136
6.2.1 Embark安装137
6.2.2 Embark快速开始138
6.2.3 Embark常规用法139
6.2.4 智能合约的配置与调用143
6.2.5 Embark去中心化存储145
6.2.6 Embark去中心化通信148
6.3 其他工具(Remix)149
6.3.1 Solidity编辑与编译149
6.3.2 Solidity合约部署150
6.4 本章小结151
第三部分 进阶篇
第7章 深入理解以太坊虚拟机154
7.1 区块链范式154
7.2 状态、交易、收据和区块155
7.2.1 状态155
7.2.2 交易156
7.2.3 收据157
7.2.4 区块158
7.2.5 以太坊基础数据结构汇总160
7.2.6 理解gas161
7.3 交易执行162
7.4 执行模型—以太坊虚拟机163
7.4.1 EVM概述164
7.4.2 EVM基础操作码164
7.4.3 EVM代码的执行166
7.5 合约创建167
7.6 消息调用168
7.7 区块定稿170
7.8 本章小结172
第8章 应用二进制接口174
8.1 函数选择器174
8.2 参数编码175
8.2.1 类型的规范表达175
8.2.2 编码的形式化说明176
8.2.3 编码实例178
8.3 动态类型的使用180
8.4 事件184
8.5 合约接口的JSON描述185
8.6 处理元组类型186
8.7 非标准打包模式188
8.8 本章小结189
第9章 OpenZeppelin源代码详解190
9.1 通用基础合约191
9.1.1 地址工具(AddressUtils.sol)191
9.1.2 椭圆曲线签名操作(ECRecovery.sol)192
9.1.3 限制子合约的余额(LimitBalance.sol)194
9.1.4 Merkle证明(Merkle-Proof.sol)195
9.1.5 拒绝重入(Reentrancy-Guard.sol)196
9.2 算术运算197
9.2.1 基本算术(Math.sol)197
9.2.2 安全算术(SafeMath.sol)198
9.3 自省(introspection)200
9.3.1 ERC165(ERC165.sol)200
9.3.2 接口查找基础合约(Supports-InterfaceWithLookup.sol)201
9.4 归属权(用户权限)202
9.4.1 归属权(Ownable.sol)202
9.4.2 用户角色(Roles.sol)204
9.4.3 基于角色的访问控制(RBAC.sol)205
9.4.4 超级用户(Superuser.sol)208
9.4.5 联系方式(Contactable.sol)210
9.4.6 归属权转移请求(Claimable.sol)210
9.4.7 有时限的归属权转移请求(DelayedClaimable.sol)211
9.4.8 归属权继承(Heritable.sol)212
9.4.9 合约不归属于合约(HasNoContracts.sol)215
9.4.10 合约不持有以太币(HasNoEther.sol)216
9.4.11 合约可找回token(Can-ClaimToken.sol)218
9.4.12 合约不持有token(HasNo-Tokens.sol)218
9.4.13 合约什么都不持有(NoOwner.sol)219
9.5 访问控制220
9.5.1 签名保镖(Signature-Bouncer.sol)220
9.5.2 白名单(Whitelist.sol)224
9.6 生命周期226
9.6.1 可自毁(Destructible.sol)226
9.6.2 可暂停运作(Pausable.sol)227
9.6.3 token可自毁(Token-Destructible.sol)228
9.7 支付和悬赏230
9.7.1 托管(Escrow.sol)230
9.7.2 条件托管(Conditional-Escrow.sol)231
9.7.3 退还托管(Refund-Escrow.sol)232
9.7.4 费用支付(PullPayment.sol)233
9.7.5 分割付款(SplitPayment.sol)235
9.7.6 悬赏(Bounty.sol)237
9.8 ERC20239
9.8.1 ERC20Basic(ERC20Basic.sol)240
9.8.2 BasicToken(BasicToken.sol)240
9.8.3 ERC20(ERC20.sol)241
9.8.4 SafeERC20(SafeERC20.sol)243
9.8.5 ERC20详情(Detailed-ERC20.sol)244
9.8.6 标准token(Standard-Token.sol)244
9.8.7 可销毁的token(BurnableToken.sol)247
9.8.8 可销毁的标准token(StandardBurnableToken.sol)248
9.8.9 可暂停的标准token(PauseableToken.sol)249
9.8.10 可增发的标准token(MintableToken.sol)250
9.8.11 有增发上限的标准token(CappedToken.sol)252
9.8.12 可授权增发的标准token(RBACMintableToken.sol)252
9.8.13 锁定token的提取(TokenTimelock.sol)254
9.8.14 定期发放token(Token-Vesting.sol)255
9.9 Crowdsale258
9.9.1 Crowdsale(Crowdsale.sol)258
9.9.2 有上限的Crowdsale(CappedCrowdsale.sol)263
9.9.3 有独立上限的Crowdsale(IndividuallyCapped-Crowdsale.sol)264
9.9.4 有时限的Crowdsale(TimedCrowdsale.sol)266
9.9.5 有白名单的Crowdsale(WhitedlistedCrowdsale.sol)268
9.9.6 自动涨价的Crowdsale(IncreasingPriceCrowdsale.sol)269
9.9.7 可增发的Crowdsale(MintedCrowdsale.sol)270
9.9.8 有额度的Crowdsale(AllowanceCrowdsale.sol)271
9.9.9 有完结处理的Crowdsale(FinalizableCrowdsale.sol)272
9.9.10 后发送token的Crowdsale(PostDeliveryCrowdsale.sol)273
9.9.11 退款库(RefundVault.sol)274
9.9.12 可退款的Crowdsale(RefundableCrowdsale.sol)276
9.10 ERC721278
9.10.1 ERC721Basic(ERC721Basic.sol)278
9.10.2 ERC721(ERC721.sol)281
9.10.3 ERC721Receiver(ERC721Receiver.sol)282
9.10.4 ERC721Holder(ERC721Holder.sol)283
9.10.5 ERC721BasicToken(ERC721BasicToken.sol)284
9.10.6 ERC721Token(ERC721Token.sol)292
9.11 本章小结298
第10章 智能合约安全编码指南299
10.1 已知的攻击299
10.1.1 重入299
10.1.2 算术溢出303
10.1.3 意外之财305
10.1.4 delegatecall308
10.1.5 默认的可见性313
10.1.6 随机错觉313
10.1.7 外部智能合约引用315
10.1.8 短地址/参数攻击316
10.1.9 未检查的返回值317
10.1.10 竞争条件/预先交易317
10.1.11 拒绝服务318
10.1.12 时间戳操纵320
10.1.13 未初始化的存储指针320
10.1.14 浮点和数据精度321
10.1.15 tx.origin判定322
10.2 智能合约开发最佳实践323
10.2.1 智能合约安全开发的基本理念323
10.2.2 智能合约设计开发中的基本权衡324
10.2.3 使用Solidity进行智能合约开发的部分最佳实践325
10.2.4 软件工程上的考量329
10.3 智能合约安全开发辅助工具331
10.4 安全信息/安全通知渠道332
10.5 本章小结332
第四部分 实战篇
第11章 Java版本DApp完整示例336
11.1 DApp智能合约的编写及发布336
11.1.1 DApp智能合约336
11.1.2 智能合约发布337
11.2 环境配置337
11.2.1 逆向生成代码338
11.2.2 创建Java项目与功能验证339
11.3 本章小结341
第12章 DApp示例—宠物店342
12.1 环境准备343
12.2 创建项目343
12.3 编写智能合约343
12.3.1 创建智能合约文件344
12.3.2 定义变量344
12.3.3 领养方法344
12.3.4 查询领养者的方法344
12.4 编译部署合约345
12.4.1 编译合约345
12.4.2 部署合约345
12.5 智能合约测试347
12.5.1 测试adopt()方法347
12.5.2 测试获取单个宠物的领养者348
12.5.3 测试获取所有宠物的领养者348
12.5.4 运行测试348
12.6 前端代码编号349
12.6.1 初始化Web3349
12.6.2 初始化合约349
12.6.3 获取领养的宠物并更新界面350
12.6.4 处理adopt()方法350
12.7 浏览器中与DApp交互350
12.7.1 安装配置MetaMask351
12.7.2 DApp交互352
12.8 本章小结354
附录A Merkle Patricia Tree355
A.1 MPT中的节点类型355
A.2 十六进制前缀编码356
A.3 树的示例356
附录B 递归长度前缀编码359
附录C EVM中的费用设计和操作码设计361
附录D Solidity汇编语言367
D.1 内联汇编库合约实例368
D.2 内联汇编语言特性370
D.3 独立汇编378
D.4 汇编语法380

教学资源推荐
作者: 刘艺
作者: (美)Al Kelley Ira Pohl
作者: [美]布兰德利·N. 米勒(Bradley N. Miller) 大卫·L. 拉农(David L. Ranum) 朱莉·安德森(Julie Anderson) 著
作者: 汪同庆 关焕梅 汤洁
参考读物推荐
作者: 刘文志 著
作者: Ivor Horton
作者: Marina Fisher;Ray Lai;Sonu Sharma;Laurence Moroney
作者: Bill Dudney, Stephen Asbury, Joseph K.Krozak, Kevin Wittkopf