完备的系统架构讲解,从公链到DAPP全流程讲解
深入讲解Solidity语言从编译到部署的机制和原理
深入剖析智能合约编程语言的语法细节及注意事项
以真实可落地的案例,全面展示智能合约所涉及的技术
本书以DAPP的原理和具体实现为主线索,通过对这些知识的讲解,使读者对DAPP系统开发有更全面的认识,同时把区块链公链的相关知识融合进来,使得读者不仅能够设计和实现DAPP系统,还能大体理解DAPP的相关知识。
本书分为7章。第1章简单介绍了区块链的基础知识,通过一个简单的智能合约的代码,让读者对区块链有更直观的认识;第2章讲解了各类集成开发环境的搭建,尤其是MetaMask插件,用户需要通过此插件连接以太坊主网后才能使用DAPP系统;第3章讲解了Solidity编译及部署到公链之后的数据表达和函数调用方式;第4章介绍了ABI接口的技术细节;第5章和第6章以案例的方式介绍了DAPP开发的细节;第7章讲解了DAPP潜在的风险。
希望本书能为广大系统开发者和投资者提供一些帮助。
4.1 接口调用的基本原理
本节主要讲解智能合约部署到以太坊之后,智能合约、DAPP和应用程序二进制接口之间的架构设计和逻辑关系,通过本节的讲解,希望读者可以理解ABI(应用程序二进制接口)调用的上下文环境,从而更好地理解其实现原理。
本节使用的智能合约代码如下。
01 pragma solidity ^0.4.24;
02 pragma experimental ABIEncoderV2;
03 contract Chapter5 {
04 //定义简单参数类型的函数
05 function simpleStatic (uint32 x, bool y) public pure returns (bool r) {
06 r = x > 32 || y;
07 }
08
09 //定义数组作为传入参数的函数,数组的大小是固定的
10 function staticArray(bytes3[2] memory b) public view {
11 require (msg. sender != address(this));
12 }
13
14 //定义长度不固定的数组作为参数的函数,并且该数组参数作为最后一个参数
15 function simpleDynamic (bytes memory b1, bool b2, uint[] memory u1) public pure {
16 }
17
18 //定义长度不固定的数组作为参数的函数,并且该数组参数作为中间某个参数
19 function dynamicTuple (uint u1, uint32[] u2, bytes10 b1, bytes b2) public payable {
20 require (msg. sender != address(this));
21 }
22 //定义多个长度不固定的数组作为参数的函数
23 function complexDynamic(uint[][] u1, string[] s1) public pure {
24 }
25 }
在上述代码中,定义了5个函数,每个函数的输入参数都各不相同,在后面的数据封装章节,我们会发现以上5种不同的函数组合代表了5种不同的数据封装逻辑。
注意:本代码示例的函数实现极其简单,甚至有的是空函数,这对本节的讲解并没有影响,本节聚焦的是这些函数如何封装,以及如何被外界调用,而不是函数本身的具体逻辑。
通过Remix和MetaMask把该智能合约代码部署到Ropsten网络,然后通过Remix的Compile标签页下的Details功能查看关于该合约部署的部分详细信息,如图4.1所示。
这些信息分为4部分:METADATA、BYTECODE、ABI和智能合约代码汇编指令。图中区域1的METADATA我们会在后面的章节详细讲解。图中区域2和区域4是智能合约在以太坊公链上的存储形式,智能合约编程语言Solidity经过编译之后,以虚拟机可以理解的字节码的形式保存在以太坊公链上,调用者通过其地址索引访问该字节码的信息。图中区域3的ABI就是本节需要重点讲解的内容,它以JSON的形式展示给使用者,Remix将ABI的JSON数据进行了解析,方便读者查看。
图4.1只列举了智能合约部署后的部分详细信息,有了以上数据之后,外界的系统就可以有足够的信息,通过RPC调用与以太坊公链的智能合约进行交互,这种交互包括但不限于函数调用、参数传递、函数执行进度查询和函数调用结果接收。外界系统或公链内的其他智能合约与本例部署的智能合约进行交互的架构图如图4.2所示。
图4.1 智能合约部署后的部分详细信息
图4.2 外界系统或公链内的其他智能合约与本例部署的智能合约进行交互的架构图
在图4.1所示的区域2和区域4中,我们展示了智能合约部署后的二进制信息,其中包括汇编语言字节码序列。这些信息被存储在以太坊公链上,当这个智能合约被ABI调用时,以太坊智能合约虚拟机会对这些字节码序列进行解析执行,在解析执行过程中,虚拟机可能会调用以太坊公链上的代码来实现状态迁移、GAS消耗、日志存储、签名及签名校验等公链功能,智能合约的执行结果也可以通过ABI接口返回给外部系统。
外部系统根据智能合约的地址及ABI信息,通过RPC调用来访问以太坊公链系统的相关功能,RPC调用达到ABI接口层之后,对于外界系统来说,其内部执行逻辑是不可见的,智能合约的执行对于外界系统来说就是黑盒子,这个黑盒子描绘了以太坊公链提供的区块链能力。因此在设计DAPP系统的时候,DAPP系统架构如图4.3所示。
图4.3 DAPP系统架构
当设计对外提供以太坊公链功能的DAPP系统的时候,需要在服务器上部署一个以太坊节点(以RPC方式启动geth节点),并且该节点可以与以太坊公链的其他节点流畅地进行数据沟通。然后将自己的业务服务器(以Tomcat为例)与以太坊节点部署在同一个业务系统中,它们之间可以进行安全的RPC通信。然后我们的业务服务器再以传统的HTTP方式对外提供业务能力。
注意:
① 本架构示例只是一个简单业务系统的参考,不同的业务需求可以配置多个Tomcat服务器,可以对应一个以太坊geth节点,也可以对应多个以太坊geth节点,这完全取决于其性能瓶颈,以及对此瓶颈的解决方案。
② 必须要保证geth节点与Tomcat的通信安全,不要对公网展示这个RPC接口,即使必须要对外展示,也一定要增加安全通信机制,尽量将业务节点与以太坊节点放置在同一个私网或局域网中,并对入流量进行安全审计。
第1章 智能合约概述 1
1.1 区块链基础知识 1
1.1.1 交易 1
1.1.2 区块 4
1.1.3 链 4
1.1.4 挖矿 5
1.1.5 共识算法 6
1.1.6 分叉 7
1.1.7 攻击 8
1.2 以太坊智能合约 9
1.2.1 以太坊 9
1.2.2 EVM 12
1.2.3 智能合约 13
1.2.4 DAPP 14
1.3 简单的智能合约 15
1.3.1 示例1 16
1.3.2 示例2 17
1.4 小结 18
第2章 开发环境搭建 20
2.1 Remix的使用 20
2.1.1 编程界面 20
2.1.2 运行环境 22
2.1.3 其他设置 24
2.2 Ethereum Wallet的安装与使用 26
2.2.1 安装 26
2.2.2 部署合约 28
2.2.3 调试 32
2.2.4 Ethereum Wallet小结 38
2.3 Ganache + Truffle的安装与使用 38
2.3.1 Ganache 38
2.3.2 Truffle 40
2.3.3 安装总结 45
2.4 MetaMask的配置与使用 45
2.5 小结 47
2.6 课后练习 47
第3章 Solidity编程语法 48
3.1 Solidity前导知识 48
3.2 智能合约的基本构成 50
3.2.1 状态变量 50
3.2.2 函数 50
3.2.3 函数修饰器 50
3.2.4 事件 51
3.2.5 结构体 51
3.2.6 枚举类型 52
3.3 Solidity数据类型 52
3.3.1 值类型 53
3.3.2 引用类型 58
3.3.3 左值操作类型 65
3.3.4 类型转换原则 66
3.4 全局变量和单位 68
3.4.1 单位 68
3.4.2 全局变量和函数 69
3.5 控制逻辑与表达式 71
3.5.1 控制语句 71
3.5.2 函数调用 71
3.5.3 通过new关键字创建合约 73
3.5.4 赋值 74
3.5.5 作用范围与声明 75
3.5.6 异常处理 76
3.6 智能合约 78
3.6.1 创建合约 78
3.6.2 可见范围和getter 80
3.6.3 函数修饰符 83
3.6.4 状态常量 85
3.6.5 函数 86
3.6.6 events 91
3.6.7 继承 93
3.6.8 抽象合约 97
3.6.9 接口 98
3.6.10 库 99
3.6.11 using for 102
3.7 Solidity汇编语言 103
3.7.1 内嵌式汇编 103
3.7.2 独立汇编 109
3.8 小结 110
3.9 课后练习 110
第4章 ABI(应用程序二进制接口) 111
4.1 接口调用的基本原理 111
4.2 函数调用与参数封装 115
4.2.1 数据封装的基础知识 115
4.2.2 函数选择 116
4.2.3 参数封装 117
4.2.4 封装示例 118
4.3 ABI接口JSON描述 129
4.4 小结 132
4.5 课后练习 133
第5章 ICO、token和DAO 134
5.1 ICO是第一个爆款DAPP 134
5.1.1 被扭曲了的ICO 135
5.1.2 传统众筹与以太坊众筹 135
5.1.3 众筹的变种ICO 143
5.2 token 144
5.2.1 token的基本元素 144
5.2.2 改进token 150
5.3 ICO 158
5.4 DAO 162
5.4.1 创建DAO合约 162
5.4.2 使用DAO的方式 170
5.4.3 模拟股票监管的DAO合约 174
5.5 ICO认知误区与防骗指南 175
5.6 小结 176
5.7 课后练习 177
第6章 DAPP完整实战 178
6.1 投票 178
6.1.1 Truffle默认案例讲解 178
6.1.2 修改为投票系统 187
6.1.3 实战小结 193
6.2 誓言上链 193
6.3 区块链彩票 199
6.3.1 业务架构 199
6.3.2 业务代码实现 201
6.4 小结 219
6.5 课后练习 219
第7章 智能合约安全与公链技术简介 220
7.1 合约溢出攻击实例 220
7.2 智能合约安全漏洞与建议 224
7.2.1 合约漏洞 224
7.2.2 安全建议 226
7.3 常见的公链安全问题 227
7.3.1 双花攻击 227
7.3.2 女巫攻击 228
7.3.3 日食攻击 229
7.3.4 DDoS攻击 230
7.4 小结 230
温馨提示:请使用泸西县图书馆的读者帐号和密码进行登录
本书从零开始介绍了以太坊DAPP开发的方方面面,覆盖了一站式学习路径上的所有知识点,对于初学者或者有经验的开发人员,都是不可多得的。
-------郑嘉文 Echoin首席科学家&CEO
在去繁化简的时代,智能合约将成为未来商业环境中顺利实现交易的重要方式,本书通过对智能合约的技术解析,让读者能以深入浅出的方式理解这一交易形式,以前瞻的眼光应对新的趋势。
-------刘劭君 中关村知识产权战略研究院研究员,中国人民大学商学院博士后
专业码农李万胜,长期从事智能合约的技术研究,他的书娓娓道来,在充分讲解技术原理的基础上,给我们展示了智能合约在未来社会中的应用。无论专业人员还是非专业人员,都可以从本书中获得对智能合约的新知。在这个浮躁的时代,能够静心研究区块链时代的基础技术,难能可贵。
------姚欢庆 中国人民大学民商事法律科学研究中心副主任
本书从技术专家的视角讲述了区块链世界里的智能合约,可以让阅读者减少一些认识误区,更好地理解区块链热点,促进区块链技术更加正向地发展。
--------刘东 亚洲投资者学会秘书长