号?
。,,巾的 目
录
译者序
前言
审校者简介
第1章区块链、以大坊和智能合约… 1
1.8. l 外部账户 …………… … … 16
1.8.2 合约账户 ………………… 0016
1.9 交易…………………… … …. 16
1.10 区块…………………………. 20
1.11 端到端的交易……….. . 21
1.1 什么是区块链· ……….. 2
1.12 什么是合约- ………· 22
1.2 为什么是区块链 ……….. 3
1.13 什么是智能合约..... . ..…· 22
1.3 加密技术…………······· · · · ··… ·4
1.14 如何部署合约 …… . . 27
1.3. l 散列 ………………………… 5
1.15 本章小结………… ·
27
1.3.2 数字签名 …………………… 7
1.4 以太币……………· · ···· · …….. 7
第2章安装以太坊和Solidity ……… 29
1.5 gas ……………………………… ·8
2.1 以太坊网络………………….. 29
1.6 区块链和以太坊架构………… 9
2.1.l 主网……………………… 30
1.6.l 区块如何互相连接 ……….. 10
2. 口 测试网络 ………………….. 30
1.6.2 交易和区块如何互相连接 …. 11
2.1.3 私有网络 ………………… 31
1.7 以太坊节点…… … ……………. 12
2.1.4 联盟网络 ………………… 31
1.7.l EVM ……………………… · 12
2.2 Geth ……·………………..….. 31
1.7.2 以太坊挖矿节点 …………… 13
2 .3 搭建一个私有网络…·· … ·35
1.7.3 如何挖矿………………… 14
2 4 ganache-cli …………………… 40
1.8 以太坊账户……………………. 15
2.5
Solidity 编译器…………… . 43
非卖品,仅供非商业用途或交流学习使用
警号
XII
2 .6 web3 JavaScript 库……………. 43
2.7 Mist 钱包… … … …. 45
2.8 MetaMask ………………………·47
2.9 本章小结………·· 51
第3章 Solidity介绍……… … … ….. 53
3.1 以太坊虚拟机 ….............. 53
3.2 Solidity 和 Solidity 文件 ……… 54
3.2. 1 预编译指令…… ………….. 55
3.2.2 注释 ………… …………… ·56
3.2.3 import 语句 ………………… 57
3.2.4 合约 ……………………… 58
3.3 合约的结构……........... . . . ..… 59
3.3.1 状态变量 ………………… 60
3 3.2 结构 ……………………… ·62
333 修改器 ………………… ….. 63
334 事件 ……… ……………… ·64
3.3.5 枚举… ……· · ………… 65
3.3.6 函数 ………· ……… ·66
3 .4 Solidity 中的数据类型 ……….. 68
3 4 I 值类型 …………………….. 68
3.4.2 引用类型………… ……….. 69
3.5 存储和内存数据位置…… .. 71
3 5 l 规则 l ………… ……… · 71
3 5 2 规则 2 …………………… ·71
3 5 3 规则 3 …………………… ·72
3.5.4 规则 4 …………………….. 72
3 5 5 规则 5 …………………… ·72
3 5.6 规则 6 …··………………… 74
3.5.7 规则 7
··……………… ·75
3.5.8 规则 8 ………………… 76
3.6 字面量 …··· · ··· · ·· ··…. ... ... …. 77
3 . 7 整型………………· … 78
3.8 布尔型………………… 79
3.9 字节数据类型…·· …. 80
3.10 数组………… … · · … 82
3.10.1 固定数组… …… ……….. 83
3.1 0.2 动态数组 ……… ………. 83
3.10.3 特殊数组 …………….. 84
3. 10.4 数组属性 ……………….. 86
3.11 数组的结构……·………· ·
86
3 . 12 枚举 ……········ … ………·· 88
3.13 地址 ……… …………………… 89
3.14 映射…………. 90
3.15 本章小结…………………··”
第4章全局变量和函数…….... 97
4.1 var 类型变量 ·· ……. 97
4.2 变量声明提前 … … · · 99
4.3 变量作用域 ……….. ..... 100
4.4 类型转换 ……… …… 101
4.4.1 隐式转换 ………………… 102
4.4.2 显式转换 …………… ……· 102
4.5 区块和交易全局变量 …… 104
4.5.1 交易和消息全局变蛊 ……. 105
4.5.2 tx.origin 和 msg.sender 的
区别 ……………………… 105
非卖品,仅供非商业用途或交流学习使用
号?
XIII
4.6 加密全局变量 …… …. 106
6.7 封装… ……………………… 132
4.7 地址全局变量 … …
.. 107
6.8 多态性........……… … … …… 132
4.8 合约全局变量 ……………….. 107
6.8.1 函数多态性 ………… 133
4 .9 本章小结…………... . ...… . .. 108
6.8.2 合约多态性………… ……. 133
第5章表达式和控制结构....... . . . ... 109
5 .1
Solidity 表达式……… ……. 109
5.2
if 决策控制 …… ………· .. 111
5.3 while 循环………….......... .
. .. 113
6.9 方法覆盖…………….... . ...…. 135
6.10 抽象合约…· · ….... 136
6.11 接 口……… … …… …… …….. 137
6.12 本章小结… ……...... 139
5.4
for 循环……... . ....…… ..... .. .
. 114
第7章函数、修改器和fallback
5.5 do ... while 循环………………. 115
函数………………· 叫
5.6 break 语句… ………… 116
7.1 函数输入和输出 …..... . ..…… 141
5. 7
5.8
continue 语句… ·· ………. 117
7.2 修改器 ………· . . .
. . 143
return 语句… . .. .... … . ......….. 118
7.3 view 函数、 constant 函数和
5.9 本章小结…………··……. . 119
pure 函数……… …….... 146
第6章编写智能合约…… . . . 121
6.1 智能合约…………………… 12 1
6.2 编写一个简单的合约…... 122
6.3 创建合约 ……· … 123
6.3.1 使用 new 关键字 ………… ·123
6.3.2 使用合约地址 ……………· 124
6.4 构造函数…… ……… ……… 125
6.5 合约组合- ....... ….. 126
6.6 继承- ……………………….. 127
7.4 地址相关函数·· …… 148
send 方法 .. .. ........ ... . .. ··· 149
7.4.1
7.4.2
transfer 方法 ……………… 151
7.4.3
call 方法 …………………. 1 日
7.4.4 callcode 方法 …………… ·
· 154
7.4.5
delegatecall 方法 …………·· 154
7.5
fallback 函数………………. . 154
7.6 本章小结………………… 157
第8章异常、事件与日志…… . ... 159
6.6 I 单继承…… … ……… … 127
8.1 错误处理…
6.6.2 多级继承· ………… 129
8.1.1
require 语句……………… 160
6.6.3 分层继承………… ………· 130
8.1.2
assert 语句 ………………·· 162
6.6.4 多重继承……… ………… 130
8.1.3
revert 语句……… ……….. 163
非卖品 ,仅供非商业用途或交流学 习 使用
XIV
号?
8.2 事件与 日 志………… … ……… 163
. . 167
8.3 本章小结… · ·
. ... . .....
第9章 Truffle基础与单元测试 ... 169
9.1 应用程序开发生命周期
9.5 本章小结 ……………… 178
第10章合约调试…………………… 179
10.1 调试……………. 179
JO.I.I Remix 编辑器 …… …… 180
管理…… … …… ……… .
. 169
10.1.2 使用事件… ……… ……. 183
9.2 Truffle ………………………. 170
10 . 2 使用 Block Explorer ……. .. 183
9.3 使用 Truffle 进行开发 - … 171
10.3 本章小结 …………… · 186
9.4 使用 Truffle 进行测试………. 176
非卖品,仅供非商业用途或交流学 习使用
防
.............
..........
......
.....
. . .
...
.... .
第 1 章 : Ov-114.门,
区块链 、 以太1万和智能合约
最 近 十多年来,科技和机器 计 算的生态系统发生了重大 的 变 化 。 技术
创 新在多个领域影 响 显著,从 物联网 ( IoT )到 人工智能 ( AI) ,再到区块链
( BlockChain ),它们中的每一个都具有颠覆产业的力 量。 当前区块链已经成为
最具有颠覆性的技术之一 ,它将潜在地改变各个行业,并将催生新的业务模式,
很多行业将发生巨变 。 然而,区块链并不是一个全新的技术,它在过去数年间,
一直在缓慢 而持续地成长 。 区块链 的 突然爆发,是由于我们 开始越来越多地思
考去 中心化和 分布式应用 的问 题, 它恰好是目前 的 系统架构转 向 不可篡改 的 分
布式数据库的一个方案 。
在第 l 章中,你将快速学习和理解一些简单的 、 基础性的区块链和以太坊
的知识 。 我们也会讨论使区块链和以太坊得以运行的重要概念。 同时,我们也
将简要地涉及智能合约,以及如何使用 Solidity 编写智能合约 。
需要注意 的 是,本章只会简单地介绍一些重要的区块链概念,并没有对其
非卖品,仅供非商业用途或交流学习使用
2 •!• Solidity编程·构建以太坊和区块链智能合约的初学者指南
盼
进行展开叙述,否则单单介绍概念,恐怕就需要一本书才能讲完 。 因为以太坊
是区块链技术的实现,所以,本书中这两个词会互换使用 。
1.1 什么是区块链
区块链实质上是一个去中心化、分布式的数据库或账本,具有下列典型
特征:
· 去中心化 :简单来说,在网络上一个或多个服务器瘫痪的情况下,应用
或服务仍然能够持续地运行,这就是去中心化 。 服务和应用部署在网 络
上后,尽管每个服务器都有一份数据和执行程序的副本,但是没有任何
一个服务器能够绝对控制数据和程序的执行过程 。
· 分布式: 网络上的每个服务器或节点都互相连接在一起,服务器之间是
多对多连接,而不是一对一或一对多连接 。
·数据库: 指的是存储持久化数据、用户能够及时从任何地点进行访问的
地方 。 数据库的基本功能是数据存储和检索,同时也提供了一些管理功
能,以方便高效地管理数据,如 : 数据导人和导出,数据备份和恢复 。
· 账本: 这是一个会计专业术语。 你也可以认为它是一个专 门存储和检索
数据的 地方 。 账本对银行业而言很有用处 。 例如, Tom 在他的银行账户
上存入了 1 00 美元, 对银行而言,需要在账本上计人一笔贷方金额 。 未
来的某一天, Tom 取回了 25 美元,银行不会直接把 100 美元修改成 75
美元,而是在同一个账本上,新增一笔借方金额 25 美元 。 从这个例子中
可以看出,账本是一种特殊的数据存储方式,它不允许修改历史数据,
要改变账户的余额只能通过新增和追加记录来实现 。 区块链是与账本存
在共同特征的数据库,新的数据只能通过追加的方式进行存储,没有任
何修改历史数据的可能 。 这里非常关键的一点就是理解只能通过新增记
非卖品,仅供非商业用途或交流学习使用
第 1 章区块链、以太坊和智能合约 •!• 3
号?
录去修改已有的数据 。 如果需要修改 100 美元的账户余额,只需要新增
一笔借方或贷方记录就可以了,而不需要改变以前的记录 。 如下图所示:
链
区块组成的链条
区块链是由区块组成的一个链条 。 这意味着它是由多个区块前后连接在一起
的,而交易记录则是保存在每个区块的内部,采用这种方式后,这些交易记录就
不可能再被更改 。 在后面的章节中,我们会谈到交易记录的存储方式以及区块链
的不可篡改特征是如何实现的 。
由于去中心化和分布式特性,区块链具有稳定性 、 健壮性、持久性和高可
用性的特点,不存在单点故障的问题 。 没有单个节点或服务器能控制 整个链上
的数据,因此人人都能够参与其中,成为区块链社区的参与者 。
因为不能修改历史记录,所以区块链具有较高的可信任性 、 透明性和公
正性 。
以太坊允许通过智能合约进一步扩展它的功能,本书中将对智能合约进行
详细介绍 。
1.2 为什么是区块链
以太坊的主要工作原理就是接受账户发出的交易,更新它们的状态,然后
维持该状态,直到另外的交易更新它们为止 。 在 以 太坊上,整个交易接受、执
非卖品,仅供非商业用途或交流学习使用