欢迎光临
免费的PDF电子书下载网站

以太坊智能合约开发实战 PDF下载

编辑推荐

资深:资深区块链一线开发工程师力作,业内7位大咖鼎力推荐

易学:按照“概念与原理→核心技术→典型实例→实战案例”的模式讲解,容易上手

实用:详解100多个以太坊智能合约开发示例和2个完整的项目实战案例

图解:绘制了近60幅原理图,帮助读者透彻理解以太坊区块链的底层机制

全面:涵盖区块链基础理论与原理、以太坊常用工具、Solidity语言等内容,非常系统

翔实:详解每个示例的实现步骤,给出详细的示例代码,并对代码做了详细注释

业内7位重量级大咖力荐:

肖永泉 ; 当乐创始人/DOGI和MeshBox发起人/巴比特早期投资人

王彬生 ; 区块链联合发展组织顾问/中国社科院研究生院金融专业特聘导师

康烁 ; 柏链道捷CTO/清华大学区块链中心高级工程师

何林 ; 当乐网技术总监

刘亚 ; AjoyLab区块链游戏发起人与制作人/魔砖游戏创始人 ;

钟伟 ; 汤沐科技高级研发工程师 ;

汪亮 ; 路行通高级研发工程师 ;

《以太坊智能合约开发实战》核心内容:

区块链基本原理

区块链技术实际应用

去中心化应用——DApp

比特币及其原理

以太坊基本概念与原理

智能合约开发常用工具

私链神器Ganache及RCP接口

以太坊客户端Geth及底层技术

以太坊常用钱包与浏览器

Solidity语言及智能合约开发

通过web3.js与以太坊交互

工程化项目开发利器Truffle

众筹实战案例

以太坊代币实战案例

超值赠送:

完整的实例源代码(需要下载)

 ;

内容简介

《以太坊智能合约开发实战》从区块链的概念、原理、核心技术和应用四个方面,系统地介绍了以太坊区块链开发的相关知识。其中,重点介绍了以太坊的相关概念和原理、以太坊客户端Geth、以太坊常用智能合约开发工具、Solidity语言和智能合约开发等内容,并介绍了众筹合约和代币合约两个项目实战案例,可以让读者对智能合约开发的整体流程有一个全面的了解。另外,书中结合示例对web3.js的相关知识也做了详细介绍,以帮助读者更好地理解和利用以太坊的相关数据。

《以太坊智能合约开发实战》共17章,分为4篇,涵盖的主要内容有区块链的概念、原理与底层技术;以太坊的相关概念与原理;以太坊相关协议;以太坊客户端Geth;以太坊智能合约的其他常用工具与客户端;Solidity语言的基本概念与数据类型;使用Solidity进行以太坊智能合约开发;通过web3.js与以太坊区块链数据进行交互;众筹智能合约与代币智能合约项目实战案例。

《以太坊智能合约开发实战》内容丰富,讲解通俗易懂,案例典型,实用性强,特别适合区块链技术爱好者和智能合约开发的相关从业人员阅读,也适合区块链底层研究人员阅读。另外,《以太坊智能合约开发实战》还适合区块链培训机构作为相关课程的培训教材。

作者简介

唐盛彬 ; 就职于国内领先的手机游戏平台当乐网(d.cn),主要负责当乐游戏中心App平台的SDK及区块链游戏众筹平台DOGI.IO的智能合约开发工作。熟悉以太坊,对以太坊底层原理和相关协议有较为深入的研究;熟悉以太坊智能合约开发的核心技术与常用工具,如Solidity语言、web3.js、Truffle和Geth等;对使用Solidity语言进行以太坊智能合约开发有丰富的实战经验,特别是在众筹和代币开发等相关领域。

以太坊智能合约开发实战 PDF下载

目录


 
第1篇  ;基础理论与原理
第1章  ;与区块链的第一次亲密接触 2
1.1  ;什么是区块链 2
1.1.1  ;区块链简介 2
1.1.2  ;区块链的链式结构 3
1.1.3  ;区块链上的区块常见数据 4
1.2  ;工作量证明机制(PoW) 6
1.2.1  ;区块链遭遇的问题 6
1.2.2  ;PoW模型 8
1.2.3  ;PoW为什么能防止篡改 9
1.3  ;权益证明机制(PoS) 11
1.3.1  ;什么是PoS 12
1.3.2  ;PoS的优势与劣势 12
1.4  ;委托权益证明(DPoS) 12
1.5  ;权威证明(PoA) 13
1.6  ;区块链的应用 13
1.7  ;本章小结 13
第2章  ;去中心化应用——DApp 15
2.1  ;DApp简介 15
2.1.1  ;什么是DApp 15
2.1.2  ;DApp网络组建过程 16
2.1.3  ;DApp的优点 16
2.1.4  ;DApp存在的问题 16
2.2  ;中心化与去中心化 17
2.2.1  ;身份验证 17
2.2.2  ;通信 17
2.2.3  ;数据交互 17
2.2.4  ;系统维护 18
2.3  ;DApp网络与通信 18
2.3.1  ;P2P网络与WWW 19
2.3.2  ;P2P网络拓扑结构类型 20
2.3.3  ;小结 21
2.4  ;DApp货币与中心化数据交互 22
2.4.1  ;DApp货币 22
2.4.2  ;中心化应用获取去中心化数据 22
2.4.3  ;去中心化应用获取中心化数据 22
2.5  ;常见的DApp 23
2.5.1  ;比特币 23
2.5.2  ;以太坊 23
2.5.3  ;IPFS存储系统 23
第3章  ;比特币那些事 25
3.1  ;比特币简介 25
3.1.1  ;比特币公钥与私钥 25
3.1.2  ;数字签名 26
3.2  ;椭圆曲线算法 26
3.2.1  ;群 26
3.2.2  ;椭圆曲线算法定义 28
3.2.3  ;椭圆曲线几何运算 29
3.2.4  ;椭圆曲线算法的代码实现 30
3.2.5  ;椭圆曲线加密与签名原理 37
3.3  ;比特币私钥、公钥与地址 39
3.3.1  ;从私钥到地址 39
3.3.2  ;公钥压缩 40
3.3.3  ;私钥格式 41
3.3.4  ;私钥与安全 41
3.4  ;比特币交易 44
3.4.1  ;交易简介 44
3.4.2  ;交易输出 44
3.4.3  ;交易输入 44
3.4.4  ;交易费 45
3.4.5  ;付款至公钥哈希(P2PKH) 45
3.4.6  ;多重签名与P2SH 46
3.5  ;比特币钱包 46
3.5.1  ;钱包简介 46
3.5.2  ;生成助记词 47
3.5.3  ;从助记词生成种子 48
3.5.4  ;从种子生成HD钱包 48
3.5.5  ;HD钱包密钥路径 50
3.6  ;比特币相关资源 51
第4章  ;以太坊 52
4.1  ;以太坊简介 52
4.1.1  ;什么是以太坊 52
4.1.2  ;以太坊虚拟机(EVM) 53
4.1.3  ;以太坊智能合约与高级语言 53
4.1.4  ;以太币单位 54
4.1.5  ;以太坊发行版本与提案 54
4.2  ;以太坊账户 55
4.2.1  ;外部账户 55
4.2.2  ;合约账户 56
4.2.3  ;外部账户与合约账户的异同 56
4.3  ;以太坊交易 57
4.3.1  ;gas、gasPrice与gasLimit 57
4.3.2  ;gasUsed与交易花费 58
4.3.3  ;什么是以太坊交易与消息 58
4.4  ;以太坊网络 59
4.4.1  ;以太坊网络简介 59
4.4.2  ;以太坊与Kademlia 59
4.4.3  ;以太坊客户端 61
4.5  挖矿 62
4.5.1  什么是挖矿 62
4.5.2  挖矿奖励 62
4.5.3  以太坊区块 63
4.6  GHOST协议 64
4.6.1  区块时间 64
4.6.2  区块分叉 65
4.6.3  普通分叉带来的问题 66
4.6.4  GHOST协议的具体内容 67
4.7  Ethash算法之DAG 68
4.7.1  什么是DAG 68
4.7.2  DAG生成过程 69
4.7.3  为什么要使用DAG 69
4.8  Ethash算法 70
4.8.1  Ethash算法简介 70
4.8.2  Ethash算法流程 70
4.9  本章小结 71
第2篇  开发工具
第5章  智能合约开发常用工具 74
5.1  Git简介 74
5.1.1  Git安装 74
5.1.2  Git常用命令 75
5.1.3  Git资源推荐 76
5.2  Node.js简介 76
5.2.1  什么是Node.js 76
5.2.2  Node.js安装 77
5.3  NPM简介 78
5.3.1  npm config命令 78
5.3.2  NPM与语义化版本 80
5.3.3  npm install命令 82
5.3.4  NPM镜像 83
5.3.5  NPM的其他常用命令 84
5.4  webpack简介 85
5.4.1  认识webpack 85
5.4.2  webpack首秀 85
5.4.3  webpack 与webpack-dev-server 87
5.4.4  webpack常用功能与配置 90
5.4.5  webpack总结 92
5.5  Postman简介 92
5.5.1  认识Postman 93
5.5.2  Postman的简单用法 94
5.5.3  Postman脚本 95
5.6  LevelDB简介 96
5.6.1  认识LevelDB 96
5.6.2  LevelDB文件 97
5.6.3  SST结构与数据查找 99
第6章  以太坊私链神器——Ganache 102
6.1  Ganache简介 102
6.1.1  什么是Ganache 102
6.1.2  ganache-cli命令安装 103
6.1.3  Ganache图形界面 104
6.2  Ganache常见命令参数 106
6.2.1  挖矿时间 106
6.2.2  主机端口与网络 106
6.2.3  gas相关参数 106
6.2.4  其他参数 106
6.3  Ganache账户 107
6.3.1  能多给我点钱吗 107
6.3.2  能多给我几个账户吗 108
6.3.3  助记词相关参数 108
6.3.4  指定账户 108
6.3.5  锁定账户与解锁 109
6.4  Ganache与JavaScript 109
6.4.1  在工程中引用Ganache的Provider 109
6.4.2  在工程中启动Ganache的Server 110
6.4.3  配置工程中依赖的Ganache 111
6.5  Ganache交易相关RPC方法 112
6.5.1  eth_sendTransaction方法 113
6.5.2  eth_getTransactionCount方法 115
6.5.3  eth_getTransactionReceipt方法 116
6.5.4  eth_getTransactionByHash方法 116
6.5.5  交易相关的其他方法 117
6.6  Ganache账户相关RPC方法 117
6.6.1  eth_accounts方法 118
6.6.2  eth_getBalance方法 118
6.6.3  eth_coinbase方法 119
6.7  Ganache区块相关RPC方法 119
6.7.1  eth_getBlockByHash方法 119
6.7.2  eth_getBlockByNumber方法 122
6.7.3  其他相关方法 122
6.8  Ganache日志相关RPC方法 123
6.8.1  eth_newFilter方法 123
6.8.2  eth_getFilterLogs方法 124
6.8.3  eth_getLogs方法 125
6.8.4  其他关联方法 126
6.9  Ganache的其他RPC方法 127
6.9.1  web3_clientVersion方法 127
6.9.2  net_version方法 127
6.9.3  eth_getCode方法 128
6.9.4  eth_sign方法 129
第7章  以太坊官方客户端——Geth 130
7.1  Geth简介 130
7.1.1  Geth是什么 130
7.1.2  Geth安装 130
7.1.3  Geth相关目录 132
7.1.4  Geth相关工具 134
7.2  Geth子命令 134
7.2.1  Geth子命令概述 135
7.2.2  Geth子命令之account 136
7.2.3  Geth子命令之console与attach 137
7.2.4  Geth子命令之copydb与removedb 137
7.3  Geth启动参数 138
7.3.1  Geth数据同步模式 138
7.3.2  Geth网络相关参数 138
7.3.3  Geth以太坊相关参数 139
7.3.4  Geth RPC相关参数 140
7.3.5  Geth挖矿相关参数 141
7.3.6  Geth ethash算法参数 142
7.3.7  Geth交易池配置 142
7.3.8  Geth日志参数 145
7.3.9  Geth的其他参数 146
7.4  Geth启动实例 146
7.4.1  Geth启动单个节点 146
7.4.2  Geth启动多节点组网 148
7.5  Geth控制台与管理接口 149
7.5.1  admin模块 149
7.5.2  debug模块 150
7.5.3  miner模块 151
7.5.4  personal模块 152
7.5.5  txpool模块 153
7.6  keystore文件 153
7.6.1  keystore文件简介 153
7.6.2  从密钥到密钥文件 154
7.6.3  从密钥到密钥文件流程验证 155
 
第8章  以太坊钱包与浏览器158
8.1  MetaMask插件 158
8.1.1  MetaMask简介 158
8.1.2  MetaMask安装 159
8.1.3  第一次使用MetaMask 160
8.1.4  MetaMask的连接配置 161
8.1.5  MetaMask的其他配置 162
8.1.6  MetaMask账户管理 163
8.1.7  MetaMask交易 164
8.1.8  小结 165
8.2  Ethereum Wallet钱包 166
8.2.1  Ethereum Wallet简介 166
8.2.2  安装Ethereum Wallet与Mist 166
8.2.3  使用Ethereum Wallet 169
8.3  Mist与Ethereum Wallet 170
8.3.1  Ethereum Wallet与Mist的区别 171
8.3.2  Mist的配置与使用 171
8.3.3  小结 172
8.4  MyEtherWallet网页钱包 172
8.4.1  MyEtherWallet简介 173
8.4.2  MyEtherWallet合约交互 174
8.4.3  MyEtherWallet离线交易 175
8.4.4  MyEtherWallet的其他功能 177
第3篇  Solidity与智能合约开发
第9章  Solidity初遇 180
9.1  Solidity简介 180
9.1.1  什么是Solidity 180
9.1.2  智能合约示例 181
9.1.3  Solidity编译版本 182
9.2  Solidity编辑器 182
9.2.1  Sublime编辑器 182
9.2.2  Atom编辑器 185
9.2.3  IDEA编辑器 187
9.3  Remix编辑器 188
9.3.1  Remix简介 188
9.3.2  Remix文件管理 189
9.3.3  Remix编辑面板与控制台 190
9.3.4  Remix编译与运行面板 191
9.3.5  Remix基本配置面板 193
9.3.6  Remix分析配置面板 194
9.4  Solidity常见概念 196
9.4.1  状态变量 196
9.4.2  局部变量 196
9.4.3  Solidity函数 197
9.4.4  返回多值 197
9.4.5  构造函数 198
9.4.6  异常 200
9.4.7  Solidity注释与文档 201
9.5  Solidity运算符 203
9.5.1  Solidity运算符简介 203
9.5.2  Solidity运算符注意事项 204
9.6  Solidity控制结构 205
9.6.1  控制结构简介 205
9.6.2  判断语句 205
9.6.3  for循环 206
9.6.4  while与do…while循环 206
9.6.5  continue与break 207
9.6.6  三目运算符 208
9.7  可见性修饰符 209
9.7.1  public修饰符 209
9.7.2  internal修饰符 210
9.7.3  private修饰符 213
9.7.4  external修饰符 214
9.8  函数其他修饰符 216
9.8.1  constant修饰符 216
9.8.2  view修饰符 217
9.8.3  pure修饰符 217
第10章  Solidity数据类型 219
10.1  数据类型简介 219
10.1.1  值类型 219
10.1.2  引用类型 220
10.1.3  小结 221
10.2  Booleans类型 221
10.2.1  Booleans类型简介 221
10.2.2  Booleans类型支持的运算符 221
10.3  Integers类型 223
10.3.1  Integers类型简介 223
10.3.2  Integers类型支持的运算符 224
10.3.3  Integers整除问题 225
10.4  定点数类型 226
10.4.1  定点数类型简介 226
10.4.2  定点数类型支持的运算符 227
10.5  字面量 227
10.5.1  字符串字面量 227
10.5.2  十六进制字面量 229
10.5.3  有理数字面量 230
10.6  Enum类型 231
10.6.1  枚举类型简介 231
10.6.2  枚举类型实例 231
10.7  mapping类型 232
10.7.1  mapping类型简介 232
10.7.2  mapping类型实例 232
10.8  struct类型 233
第11章  Solidity数据类型进阶 235
11.1  Solidity固定大小字节数组 235
11.1.1  固定大小字节数组类型 235
11.1.2  固定大小字节数组支持的运算符 236
11.1.3  固定大小字节数组的成员 236
11.1.4  固定大小字节数组与字符串 237
11.1.5  固定大小字节数组之间的转换 240
11.1.6  小结 241
11.2  Solidity动态大小字节数组 242
11.2.1  动态大小字节数组简介 242
11.2.2  创建动态大小字节数组 242
11.2.3  动态大小字节数组成员 243
11.2.4  字节数组间的转换 245
11.2.5  小结 247
11.3  Solidity数组 247
11.3.1  固定长度数组 248
11.3.2  动态长度数组 249
11.3.3  二维数组 250
11.3.4  小结 251
11.4  以太坊地址类型 251
11.4.1  地址简介 252
11.4.2  transfer、send与balance 254
11.4.3  call、callcode与delegatecall 255
11.5  函数类型 257
11.5.1  函数类型简介 258
11.5.2  函数签名 258
11.5.3  函数类型实例 260
11.6  数据类型转换 262
11.6.1  隐式转换 262
11.6.2  显式转换 263
11.6.3  var关键字 264
11.7  delete运算符 265
11.7.1  delete与常见类型 265
11.7.2  delete与数组 266
11.7.3  delete与mapping 267
11.7.4  delete与struct 267
11.8  本章小结 268
第12章  Solidity开发智能合约 270
12.1  智能合约简介 270
12.1.1  智能合约的概念 270
12.1.2  EVM结构与数据 271
12.1.3  智能合约执行 271
12.2  事件与日志简介 272
12.2.1  事件简介 272
12.2.2  事件主题 272
12.2.3  事件与日志 274
12.3  Solidity中的单位后缀 276
12.3.1  以太币单位 276
12.3.2  时间单位 277
12.4  区块与交易属性 279
12.4.1  区块的相关属性 279
12.4.2  消息的相关属性 281
12.4.3  交易的相关属性 282
12.5  错误处理函数 283
12.5.1  assert函数 283
12.5.2  require函数 283
12.5.3  revert函数 284
12.6  数学与Hash函数 285
12.6.1  数学运算函数 285
12.6.2  Hash函数 285
12.6.3  ecrecover函数 286
12.7  ABI编码与编码函数 287
12.7.1  ABI编码简介 287
12.7.2  ABI编码数据类型 289
12.7.3  常见数据类型ABI编码规则 290
12.7.4  复杂类型ABI编码规则 292
12.7.5  ABI编码实例 295
12.8  特殊类型函数 296
12.8.1  回退函数 296
12.8.2  析构函数 297
12.8.3  函数重载 298
12.8.4  使用new创建合约函数调用 299
第13章  Solidity开发智能合约进阶 303
13.1  Solidity数据位置 303
13.1.1  什么是数据位置 303
13.1.2  memory简介 304
13.1.3  storage简介 304
13.1.4  calldata简介 307
13.1.5  小结 308
13.2  数据位置与赋值 308
13.2.1  状态变量赋值给局部storage变量 308
13.2.2  状态变量赋值给memory局部变量 310
13.2.3  局部memory变量赋值给状态变量 310
13.2.4  状态变量赋值状态变量 311
13.2.5  局部memory变量赋值给局部memory变量 312
13.2.6  局部storage变量赋值给局部storage变量 313
13.2.7  局部storage变量赋值给局部memory变量 314
13.2.8  局部storage变量赋值给状态变量 315
13.2.9  小结 316
13.3  函数修改器 317
13.3.1  函数修改器简单实例 317
13.3.2  函数修改器复杂实例 319
13.3.3  小结 321
13.4  合约继承 324
13.4.1  继承简介 324
13.4.2  super关键词 327
13.4.3  抽象合约 328
13.4.4  接口合约 328
13.5  Solidity库 329
13.5.1  Solidity库简介 329
13.5.2  Solidity库应用实例 329
13.5.3  Solidity导入源文件 330
13.5.4  using for语句 331
13.6  Solidity编译 333
13.6.1  solc简介 333
13.6.2  solc编译合约 336
13.6.3  solc导入与库 338
13.6.4  solc.js简介 340
13.6.5  使用solc.js在项目中编译单个合约 340
13.6.6  使用solc.js在项目中编译多个合约 342
13.7  Solidity编码风格 344
13.7.1  命名风格 344
13.7.2  控制结构 344
13.7.3  函数相关风格 345
13.7.4  其他部分 346
第14章  通过web3.js与以太坊客户端进行交互 347
14.1  web3.js简介 347
14.1.1  web3.js概念 347
14.1.2  web3.js原理 348
14.1.3  web3.js模块 348
14.2  web3.js与以太坊节点 348
14.2.1  HTTP方式 348
14.2.2  IPC方式 349
14.2.3  WebSocket方式 350
14.3  web3.js工具的相关方法 350
14.3.1  以太币单位转换方法 351
14.3.2  十六进制、数字与字符串转换 351
14.3.3  填充字符与getStorageAt 352
14.4  web3.js账户的相关方法 354
14.4.1  获取账户与账户余额 354
14.4.2  创建账户 355
14.4.3  解锁账户 356
14.4.4  账户的其他相关方法 356
14.5  web3.js的ABI编码方法 357
14.5.1  函数签名与事件签名 357
14.5.2  函数单参数编码与解码 359
14.5.3  函数多参数编码与解码 360
14.5.4  编码函数调用 360
14.5.5  解码日志 361
14.6  web3.js合约的相关方法 362
14.6.1  创建与克隆合约 362
14.6.2  合约部署deploy 363
14.6.3  send函数与call函数 369
14.6.4  estimateGas函数与encodeABI函数 370
14.6.5  合约方法的调用 370
14.6.6  合约事件的处理 375
14.7  web3.js交易的相关方法 380
14.7.1  签名简介 380
14.7.2  签名与交易 381
14.7.3  发送交易 384
14.7.4  签名交易与发送签名交易 386
14.7.5  获取交易的相关数据 387
14.8  web3.js和IBAN的相关接口 388
14.8.1  IBAN简介 389
14.8.2  BBAN、IBAN与地址 390
14.8.3  IBAN的其他方法 390
14.9  web3.js的其他方法 391
14.9.1  订阅事件 391
14.9.2  网络及ENS的相关方法 392
14.9.3  与Swarm和Whisper交互的方法 392
14.10  与Ethereum相关的JavaScript库 393
14.10.1  BigNumber.js库 393
14.10.2  ethjs-abi库 395
14.10.3  其他Ethereum库 399
第4篇  项目案例实战
第15章  工程化项目开发利器——Truffle 402
15.1  Truffle简介 402
15.1.1  Truffle的主要功能 402
15.1.2  Truffle的安装及其相关命令 403
15.2  Truffle创建项目 404
15.2.1  init命令 405
15.2.2  unbox命令 406
15.3  通过Truffle编译项目 408
15.3.1  前置条件与编译 408
15.3.2  Truffle编译输出 409
15.3.3  Truffle编译依赖 410
15.4  Truffle配置文件 411
15.4.1  网络配置 411
15.4.2  输出目录配置 412
15.4.3  测试配置 413
15.4.4  编译配置 413
15.4.5  包管理相关配置 414
15.5  Truffle单元测试与部署 415
15.5.1  使用JavaScript测试 415
15.5.2  JavaScript测试交易 417
15.5.3  使用Solidity测试 419
15.5.4  合约部署 419
15.6  Truffle的其他命令 420
15.6.1  create命令 420
15.6.2  包管理相关命令 421
15.6.3  其他命令 421
第16章  项目流程与众筹实战案例 423
16.1  合约部分 423
16.1.1  项目简介 423
16.1.2  初始化与合约目录 424
16.1.3  部署与测试脚本目录 424
16.2  众筹合约 425
16.2.1  Owned合约 425
16.2.2  SafeMath合约 426
16.2.3  Crowd合约 427
16.3  合约的部署与使用 429
16.3.1  本地部署与测试环境搭建 429
16.3.2  本地部署与测试网络配置 429
16.3.3  本地部署 430
16.3.4  本地测试 430
16.3.5  Ropsten网络测试部署 431
16.4  项目的Web部分 432
16.4.1  初始化Web项目 432
16.4.2  webpack配置 432
16.4.3  package.json配置 433
16.4.4  运行Web项目 434
第17章  以太坊代币标准与ERC20代币案例 437
17.1  代币简介 437
17.1.1  ERC20简介 437
17.1.2  ERC223简介 438
17.1.3  ERC721简介 438
17.2  ERC20标准接口简介 438
17.2.1  基本信息 439
17.2.2  总额与余额 439
17.2.3  转账与授权 439
17.2.4  事件 440
17.3  ERC20代币实例 440
17.3.1  查看以太坊上已有的Token 440
17.3.2  创建Token 441
17.3.3  查看和转移Token 443
17.4  扩展ERC20标准代币 448
17.4.1  销毁代币 448
17.4.2  添加Token 449
17.4.3  冻结与解冻账户 449
17.4.4  买卖Token 450
17.4.5  小结 451
17.5  ERC20代币扩展实例 451
17.5.1  初始化项目 451
17.5.2  添加三方库合约 452
17.5.3  代币合约的逻辑实现 460
17.5.4  代币合约的部署 465
……
第1章  与区块链的第一次亲密接触 2

媒体评论

财产所有权和在此基础上的契约精神奠定了现代市场经济。而以太坊智能合约的价值在于,它以技术的方式确保了财产所有权及在此基础之上的契约订立和执行。区块链的发展正处于“随风潜入夜,润物细无声”的阶段。人们对区块链有过殷切的期望,也有过悲观的预期,但我始终坚信区块链必将“山穷水复疑无路,柳暗花明又一村”。

——当乐创始人/DOGI和MeshBox发起人/巴比特早期投资人  肖永泉

区块链是非常有应用前景的技术,目前已经有了一些落地应用场景,涉及多个行业。《以太坊智能合约开发实战》是一本不可多得的以太坊区块链开发图书,能够让读者系统地掌握智能合约开发的全貌。《以太坊智能合约开发实战》风格朴实,通俗易懂,相信读者通过阅读本书,可以在较短的时间内掌握以太坊智能合约开发。

——柏链道捷CTO/清华大学区块链中心高级工程师  康烁

科技的发展使信息的传递成本趋向于零,而区块链技术更是让价值的传递成为可能。如果说比特币是区块链世界的灯塔,那么以太坊的出现则直接把区块链提升到了智能合约应用的层面,它是区块链世界的推土机,它的出现为现实世界的区块链化打开了一扇门。

——区块链联合发展组织顾问/中国社科院研究生院金融专业特聘导师  王彬生

区块链技术在信息安全、交易认证等各个领域将会有非常广泛的应用。作者是在对区块链技术有比较深入的研究和丰富的实践后写作了《以太坊智能合约开发实战》,这使得本书很接地气,非常实用。相信《以太坊智能合约开发实战》可以成为区块链开发入门读者的良师益友,也会对区块链从业人员参与实际项目有相当的启发。

——当乐网技术总监  何林

区块链的开放、去中心化和公开透明理念,将其带入了更加迷人的境地,它充分打开了人们的想象空间。《以太坊智能合约开发实战》作者系资深智能合约开发者,他对全书内容做了合理安排。这使得《以太坊智能合约开发实战》的知识点覆盖很全面,讲解细致而透彻,书中大量的示例和两个真实项目实战案例,更是对读者有很强的指导性,值得每一个区块链从业者细读。

——AjoyLab区块链游戏发起人与制作人/魔砖游戏创始人  刘亚

当前,区块链在共享经济、支付、物联网等领域已经有了不少应用,相信未来还会在更多的领域有越来越多的落地应用。《以太坊智能合约开发实战》作者对以太坊有深入研究,所写的这本书内容非常全面、系统,推荐所有的区块链技术爱好者阅读。

——汤沐科技高级研发工程师  钟伟

区块链因数字货币而被大众知晓,但其价值远不止于此。《以太坊智能合约开发实战》由浅入深,从基本概念讲起,理论结合实战案例,让读者很容易上手,是相关人员学习区块链技术的不二之选。

——路行通高级研发工程师  汪亮

前沿

区块链技术是当下炙手可热的应用技术。甚至与区块链相关的一些名词,比如数字货币、去中心化应用、比特币和以太坊等也是开发人员经常提及的热门话题,即便不是计算机相关行业的人也可能有所耳闻。而智能合约的出现让人们意识到,区块链技术除了数字货币之外还有更广阔的应用空间。就现阶段而言,要实现智能合约的落地应用,最普及的方式就是通过以太坊智能合约而实现,它有不断完善的生态,也有一些具体的落地项目。可以预见,以太坊智能合约开发技术在未来会有更多的落地应用开花结果。

当前,以太坊区块链的开发还处在一个起步阶段,很多生态还不是很完善,相关工具、库,甚至开发语言本身都还处在不断地迭代之中,而且相关学习资料也比较少。这种情形和当年Android开发在国内刚起步时一样。笔者作为一个区块链技术的探索者正行走在这条道路上,觉得有必要把自己的一些经验和心得体会进行总结并集结成册,以帮助那些对区块链技术感兴趣的人,让他们少走一些弯路。这便是笔者写作《以太坊智能合约开发实战》的初衷。

《以太坊智能合约开发实战》主要介绍了利用Solidity语言开发以太坊智能合约的相关知识。书中涵盖了区块链与以太坊智能合约的基本原理;智能合约开发环境的搭建;各种开发、集成与测试工具的介绍,以及Solidity语言的详细介绍等。相信通过阅读《以太坊智能合约开发实战》,读者能较为系统地掌握以太坊智能合约开发的核心技术与要点。

《以太坊智能合约开发实战》特色

1.内容全面、系统

《以太坊智能合约开发实战》从区块链的概念、原理、核心技术和应用四个方面展开讲解,涵盖以太坊智能合约开发的方方面面知识,如以太坊客户端、智能合约开发工具、Solidity语言等,读者通过一本书即可较为系统地掌握以太坊智能合约开发。

2.讲解由浅入深,循序渐进

《以太坊智能合约开发实战》讲解时从概念和原理入手,然后剖析核心技术,再辅以典型实例,尽量让前文的讲解作为后文的铺垫,一步步带领读者循序渐进地学习。这样的章节安排符合读者的学习和认知规律,学习梯度比较平滑,学习效果更好。

3.原理与实践相结合

笔者深信,只有通过动手实践,才能加深对知识的理解,所以书中不仅介绍了区块链和以太坊智能合约的相关概念和原理,而且还给出了实现方法和步骤,这样可以让读者真正学以致用,适应职场的要求。

4.一图胜千言,配合大量图示讲解

《以太坊智能合约开发实战》涉及的概念和基本原理比较多,这些概念和原理比较抽象。为了便于读者直观地理解这些知识,笔者绘制了大量的流程图和原理图帮助读者学习。真可谓一图胜千言,用文字不容易讲解清楚的内容,一幅图就可以直观地展现出来。

5.案例典型,步骤详细,代码翔实

《以太坊智能合约开发实战》注重内容的实用性,重要的知识点都配合实例进行讲解,而且在最后两章介绍了众筹和代币智能合约开发两个项目案例。书中在讲解这些实例和案例时都给出了详细的操作步骤和实现代码,并对关键代码做了详细的注释,便于读者理解。

《以太坊智能合约开发实战》内容

《以太坊智能合约开发实战》共17章,分为4篇。

第1篇  基础理论与原理篇(第1~4章)

第1章与区块链的第一次亲密接触,主要介绍了区块链的概念和原理,并介绍了区块链中的工作量证明机制、权益证明机制和委托权益证明等内容。

第2章去中心化应用——DApp,主要介绍了DApp的概念及其优缺点,还介绍了DApp如何和中心化应用进行通信。

第3章比特币那些事,主要介绍了比特币的公钥格式、私钥格式、私钥的生成和从私钥获取公钥的方法,并介绍了如何从公钥获取地址,以及测试比特币账户碰撞等。

第4章以太坊,主要介绍了以太坊涉及的基本概念和原理,如以太坊账户、以太坊交易、挖矿、GHOST协议、DAG算法和Ethash算法等。

第2篇  开发工具(第5~8章)

第5章智能合约开发常用工具,主要介绍了在以太坊智能合约开发过程中会用到的一些工具,如Git版本管理工具、Node.js和NPM等。

第6章以太坊私链神器——Ganache,主要介绍了在以太坊智能合约开发中需要使用的Ganache工具。其中,重点介绍了Ganache的图形界面、命令行工具、常用命令和参数,以及如何在项目中使用Ganache。

第7章以太坊官方客户端——Geth,主要介绍了Geth的启动命令和参数,借此认识以太坊的各个协议内容。

第8章以太坊钱包与浏览器,主要介绍了MetaMask浏览器插件的用法。MetaMask也可以看做是一个轻钱包,可以在开发者构建Web应用和以太坊区块链交互时提供帮助。

第3篇  Solidity与智能合约开发(第9~14章)

第9章Solidity初遇,主要介绍了Solidity语言常用开发工具的安装与配置,并对Solidity语言的基本概念,如状态变量和局部变量做了详细介绍,另外还对Solidity中的运算符、控制结构和函数的常见修饰符(如payable、view、pure等)做了必要讲解。

第10章Solidity数据类型,主要介绍了Solidity的数据类型及其应用,如整型中包含的具体类型、各种字面量类型、枚举类型、结构体类型及mapping类型等。

第11章Solidity数据类型进阶,主要介绍了Solidity的一些更加复杂的数据类型,如固定大小字节数组、动态大小字节数组、地址类型、函数类型等,另外还介绍了不同数据类型之间隐式转换与显式转换的方法,以及delete操作应用于各个数据类型等。

第12章Solidity开发智能合约,主要介绍了使用Solidity开发以太坊智能合约的相关内容,涵盖EVM结构和数据、事件与日志、全局以太币和时间单位后缀、区块与交易的全局属性、错误处理函数、数学与Hash函数、ABI编码和特殊类型函数等。

第13章Solidity开发智能合约进阶,介绍了Solidity和智能合约开发的进阶知识,涵盖Solidity数据位置与赋值、函数修改器、合约继承,以及Solidity的库、编译与编码风格等。

第14章通过web3.js与以太坊进行交互,主要介绍了如何使用web3.js与以太坊智能合约进行交互,给出了web3.js和账户、合约、ABI及IBAN交互的多个实例。

第4篇  项目案例实战(第15~17章)

第15章工程化项目开发利器——Truffle,主要介绍了如何使用Truffle初始化项目、配置Truffle、编译合约,以及执行部署和测试等。

第16章项目流程与众筹实战案例,主要介绍了一个众筹项目案例的实现过程,涉及项目的初始化、目录结构、本地测试及部署环境搭建等相关内容。

第17章以太坊代币标准与ERC20代币案例,主要介绍了以太坊代币的相关内容,涉及ERC20的标准接口和扩展接口,并给出了一个ERC20代币实例,还对ERC20标准代币的扩展做了介绍。

配书资源及获取方式

《以太坊智能合约开发实战》涉及的源代码等配书资源需要读者自行下载。请登录华章公司的网站,搜索到本书,然后单击“资料下载”按钮,单击页面上的“配书资源”下载链接即可下载。

《以太坊智能合约开发实战》读者对象

?    区块链技术爱好者;

?    区块链底层开发人员;

?    以太坊智能合约开发初学者;

?    想要系统了解智能合约开发的人员;

?    区块链DApp应用开发人员;

?    各类转行做区块链开发的程序员;

?    其他对区块链感兴趣的人员;

?    计算机和金融专业的学生;

?    区块链开发的培训班学员。

售后服务

因受笔者水平所限,加之成书时间较短,本书可能还有疏漏和不当之处,敬请读者指正。

……

免费在线读

第1章  与区块链的第一次亲密接触
近几年,区块链、比特币受到越来越多的关注。如果你没有听说过区块链,那说明你真的OUT了,因为就连跳广场舞的大妈都能说两句有关比特币的话题。本章,让我们先了解一下区块链。
本章主要涉及的知识点有:
? 区块链概念;
? 区块链怎样保证数据不可修改,知道节点怎样形成共识;
? PoW,工作量证明机制;
? PoS,权益证明机制。
?注意:本章内容只是区块链的概念,其中的模型都是简化模型。
1.1  什么是区块链
首先我们了解一下什么是区块链、区块链的链式结构、区块链中区块的数据,以及为什么要有这些数据等。
然后介绍一个区块链的模拟工具blockchain,读者朋友可以自己动手画一下区块链,再使用blockchain工具模拟挖矿的过程,相信这个过程能够加深对后面将要学习的工作量机制的理解。
1.1.1  区块链简介
很多朋友第一次听到区块链这个概念很可能是在2017年比特币的价格涨势最好、价格最高的那段时间。区块链技术因比特币而火热,但是它绝不仅仅止步于比特币,也不仅仅止步于加密数字货币,那么区块链究竟是什么呢?
首先,区块链是一个数据集,这个数据集的组织方式比较特殊,它把数据打包成一个一个的区块,每一个区块是一个区块链数据集的子集。区块和区块之间的数据相互关联形成逻辑上的链式结构,所以区块链因此得名,1.1.2节中我们会具体介绍这种链式结构。
区块链技术源于比特币,最开始就是为了解决去中心化的问题,所以区块链是分布式的,可以把区块链看作一个分布式的账本。区块链上的数据是每一个参与者的机器上都拥有的,而不是只放在某一台中心机器上。
使用区块链来做什么呢?其实有太多场景。例如,使用区块链完成类似于银行的转账职能,具体会在后面介绍。现在我们关心的是区块链转账的数据如何传递给其他参与者,如果让每一个参与者都拥有区块链数据,就需要每一个参与者之间能相互通信,因此需考虑怎样组建网络。
假设已经组建好了网络,每一个参与者之间都能相互通信了,那么另一个问题来了,每一个参与者都有全部的区块链数据,怎样保证大家的数据都是一致的,或者说区块链的数据怎样不被篡改呢?
简单地来说,区块链解决的主要问题就是:分布式网络中每一个参与者的数据交换和防止数据不被参与者篡改,获得每一个参与者的认同。
1.1.2  区块链的链式结构
在上节中提到了区块链在一种逻辑上是一种链式结构,本节我们就来了解一下区块链的链式结构。
如图1.1所示为区块链的链式结构示意图。顾名思义,链式结构就是由很多区块(Block)串联起来形成链状的数据结构。
(无法传图)
图1.1  区块链结构示意图
每一个区块(Block)中包含一个区块头(Block Header),区块头中包含一些块的元数据信息,例如区块编号、区块Hash值、区块创建时间、父区块的Hash值和Nonce等数据。其中,Nonce是用来做工作量证明的,它对于使用工作量证明机制的区块链来说很重要,所以后面会反复介绍。
每一个区块中还包含一个区块体(Block Body),区块体中包含数据交易信息和账户信息等,不同的区块链有不同的实现。
每一个Block会计算一个Hash值,这个Hash值会被下一个Block包含,这样前一个Block就被固定了,所以只需要简单地计算前一个Block的Hash值和自己包含的前一个Block的Hash值是否一致,这样就能判断前一个Block是否已被修改,每一个Block都确定了前一个Block就形成了一个链式的结构。
如上所述,区块链就能保证数据不被修改了吗?答案显然是否定的。因为可以从区块链的第一个区块开始修改,这样就能避开上面的链式验证方法。那么怎样解决这个问题呢?我们把这问题放在后面来讲解。
?注意:上面介绍的区块链只是一个简化的结构,是为了方面我们更容易理解区块链。
1.1.3  区块链上的区块常见数据
1.1.2节介绍区块链结构时提到区块链除了交易数据,还包含一些其他的数据,可以称这些数据为Block的元数据(Meta Data)。这些元数据如下所述。
? Index:第几区块(创世区块的索引为0)。
? Hash:当前区块的Hash值。
? Previous Hash:上一个区块的Hash值。
? Timestamp:当前区块创建时的时间戳。
? Data:存储在当前区块上的交易信息。
? Nonce:参与Hash运算的数值,使区块的Hash值满足指定条件。
?注意:我们所说的区块就是指前面提到的Block,后文如果没有特别说明也是指相同意思。
下面我们来看一下blockchain模拟工具生成的一个Block的样子。关于blockchain的安装需要使用到NPM工具,如果读者对NPM不了解,可以参考第5章NPM部分的内容。
执行全局安装命令:
 
cnpm install blockchain-cli –g
 
或者:
 
npm install blockchain-cli –g
 
使用NPM安装完成blockchain后,我们就可以使用blockchain工具来模拟挖矿操作了,我们先来看一下帮助文档。如表1.1所示为blockchain的参数及其说明。
表1.1中所说的节点是运行区块链客户端的机器,或者说是使用相同协议簇的进程。
现在可以直接在命令行输入blockchain或者简写的bc,如图1.2所示,我们输入bc命令查看当前区块链的状态。因为我们没有执行任何挖矿操作,所以默认只有一个创世区块。
表1.1  blockchain的参数及解释
命 令 参 数 命 令 解 释
help[command...] 查看命令帮助
exit 退出blockchain
blockchain 查看区块链状态
mine 模拟挖矿
open 打开端口,接受其他节点连接
connect 连接其他节点
peers 查看已经连接的节点列表
discover 从连接节点发现新节点
(无法传图)
图1.2  blockchain创世区块
我们可以看到图1.2中包含的区块数据,和前面本节介绍的Block的元数据基本一致,只是少了一个Index。创世区块的Previous Hash值为0,因为只有创世区块比较特殊,而其他区块的Previous Hash值都是前一个区块的Hash值。
? Timestamp是创建这个区块的时间。
? Data相当于1.1.2节介绍的Block Body的数据,例如,在比特币中就是一些交易数据,在以太坊中可能是一些交易、账户和合约等数据。
? Hash是这个区块数据的Hash值,就像可以为一个文件计算一个Hash值一样,也可以为一个区块计算一个Hash值。
? Nonce是一个让区块Hash值计算满足指定条件的值,一般是一个64位的整数。如果现在不能理解也没有关系,1.2节介绍工作量证明机制的时候再详细介绍。
为了更好地理解这个过程,我们再次使用blockchain来挖一个区块看一下,如图1.3所示,使用mine命令模拟挖一个新的区块,可以看到blockchain会计算一段时间。
计算的过程就是不断调整Nonce的值,然后计算整个区块数据包括Nonce的Hash值,直到找到一个让Hash值满足指定条件的Nonce值。
(无法传图)
图1.3  blockchain mine命令
从图1.3中可以看到,区块(Block#1)中Previous Hash的值和创世区块(Genesis Block)中的Hash值是一致的。
?注意:Nonce的值不是固定的,一般是从0开始递增,直到找到一个让整个区块的Hash值满足指定条件的Nonce值为止。
希望读者使用mine命令多挖几个新的区块试一下,然后使用bc命令看一下区块链的状态,加深对挖矿过程的理解。
读者朋友还可以通过下面的网站来执行多个节点挖矿的模拟:https://blockchaindemo.io/。
1.2  工作量证明机制(PoW)
目前很多区块链技术的应用,如比特币、以太坊都是使用工作量证明机制,所以理解了工作量证明机制,对理解区块链的很多问题都非常有帮助。
1.2.1  区块链遭遇的问题
在介绍工作量证明机制之前来模拟一个场景,先来找一下区块链存在的问题。
张三、李四、王五3个人斗地主,3个人明确不赌钱,所以3个人商量决定计分,谁输了就请客吃饭,并找来了钱袋子作为记分员,每一局做一个记录,如图1.4所示。
很快,张三、李四、王五就发现了问题,钱袋子这个人吃得特别多,无论张三、李四、王五谁输了,钱袋子都是吃得最多的,他还不用请客,而且钱袋子经常找各种理由暂停服务,所以张三、李四、王五决定自己记账,具体如图1.5所示。
(无法传图)
图1.4  钱袋子记账本
(无法传图)
图1.5  张三、李四、王五分布式记账本
如图1.5本所示,3人都记了账,每一局记一个,这个就有点像区块链的记账过程了,大家都记账,账本分布在不同的地方,每一笔交易都记录。但是很快大家又发现了新的问题,各自的账本对不上,但是大家都说自己的账本是对的,对于大家各自记的账无法达成共识。
人是有私心的,可能会乱记一些对自己有利的记录,所以得想一个办法控制这种乱记的行为。对于网络中的分布式账本区块链来说,也同样存在这个问题,对于各个区块链网络中各个节点的账本不能达成共识,都说自己的账本是对的。
这个问题最初就是采用工作量证明机制来解决的,下一节我们就来详细介绍工作量证明机制。
1.2.2  PoW模型
本节将介绍工作量证明机制是怎样让大家达成共识的。首先,PoW认为参与记账的大部分人是可信的,那么对于不可信的人怎么防范呢?答案是校验和增加账本的篡改难度。
校验比较简单。假设有一个恶意A的节点一直广播B向A转了一笔钱,那么就要求A提供一个证据,就是账户B的私钥签名。关于公钥、私钥签名将在第3章介绍,这里只需要知道一个人没有办法花另一个人账户中的钱就可以了。
一个用户不能花其他用户账户里的钱就没有问题了吗?显然不是,我自己的账户我肯定有私钥,但是我的账户上不一定有钱,比如我账户上没有钱,但是我说我要花100,私钥签名肯定也能通过校验,对于这种情况怎么办?
所以还得校验我的账户上有没有钱,怎么校验呢?查账本,但是账本可以伪造,所以又回到了记录账本的共识问题上了。
这时我们要增加账本篡改难度,那么PoW是怎样增加账本篡改难度的呢?
答案是增加区块创建的难度,增加区块的创建难度也就意味着篡改区块的难度增加了。那么怎样增加区块的创建难度呢?回忆一下1.1节中介绍的区块链结构和区块中的数据,然后看一下下面的公式:
 
SHA256(index previousHash timestamp data nonce)
 
参数是Block的元数据,就是计算一个Hash值,是不是很简单?肯定不会这么简单,所以需增加点难度,计算出来的这个Hash值要满足一定条件。比如,这个Hash值的前4位必须是0,到底是几个0,这个是变化的,通过一个difficulty参数进行设置,就是我们说的难度,difficulty=4的意思是计算出来的Hash值前面至少有4个0。
到这里肯定有读者有疑惑,Hash值不是固定的吗?怎么能让它前面有多少个0?这里就要介绍一下Nonce的作用了。对于简化模型来说,Nonce是获取一个Hash值之前碰撞的次数,就是Index、PreviousHash、Timestamp和Data这些数据不变,Nonce从0开始递增计算Hash值结果,直到计算出满足指定条件的Hash结果。
下面看一下这个过程的伪代码:
 
function isValidHash(hash, difficulty) {
  for (var i = 0, b = hash.length; i < b; i ) {
      if (hash[i] !== ) {
          break;
      }
  }
  return i >= difficulty;
}
let nonce = 0;
let hash;
let input;
let difficulty=4;
while(!isValidHash(hash,difficulty)) {     
  nonce = nonce 1;
  input = index previousHash timestamp data nonce;
  hash = SHA256(input)
}
?注意:上面代码中的difficult是系统动态给出的,是根据统计前面的一些区块的打包速度计算出来的。另外,工作量证明机制不仅仅是为了竞争记账,也是为了安全。
以上代码所述的过程就是工作量证明机制(PoW)。读者可能存在一些疑惑,下面再补充一些细节上的知识点,希望能够帮助读者解惑。
比特币每一笔交易都会通过广播的方式,把交易内容发送到所有的节点,我们知道计算Hash值的时候是包含Data数据的,总不能一笔交易就是一个Block,所以比特币还有一些其他的规定。例如,每一个区块至少包含500笔交易,每笔交易至少以250字节,每一个区块的大小上限是2MB等。
所以挖矿的过程就是启动挖矿软件,成为一个节点,能够接收到系统中交易的广播消息,为了得到记账权,当收到500笔交易的时候就开始执行上面工作量证明过程的计算。当计算出满足条件的Hash值时就广播告诉其他节点,如果是第一个完成的就会获得记账权,也会获得奖励。
当然,其他节点也会做一下验证,因为Block中有Nonce值,所以只需要做一次Hash计算就可以了,这让验证变得非常容易。
本节将工作量证明机制相关的问题都讲解清楚了。还有一个问题待解决,为什么工作量证明机制能够防止账本被篡改呢?这个问题我们在下一节详细介绍。
1.2.3  PoW为什么能防止篡改
上一节我们介绍了工作量证明机制的共识,还有一个问题必须要解决,那就是记录必须能够防止篡改。前面章节实现的区块链技术真的能防止篡改吗?
虽然不能100%的保证账本不被篡改,但是可以让篡改成本增加,使被篡改的可能性降低到0。下面我们来整理这个过程:把收到的交易记录打包成为一个一个的区块,每一个区块都包含一个Hash值,这个Hash值是通过区块的元数据和交易记录数据计算出来的。每一个区块都包含了前一个区块的Hash值,这样保证形成了链式的结构。如果要修改一个区块的内容就要重新计算后面所有区块的Hash值。
如图1.6所示,每一个区块的Hash计算都会应用到前一个区块的Hash值,通过简单的等价转换很容易就看出,当我们修改了一个区块的数据之后,它后面所有的区块的Hash值都通不过校验,这就意味着,从修改区块开始,后面所有区块的Hash值都必须重新计算。
(无法传图)
图1.6  区块链区块Hash计算
图1.6描述的只是一个区块链Hash计算的简化版本,没有加入工作量证明机制,假如工作量证明机制之后Hash计算的难度增加,那么区块被篡改的难度会更大。
我们每一个人都有一个账本用来记账,假设有一些恶意的账本,这些账本的链的长度是不一致的,那么我们以哪一个账本(区块链)的记录为准呢?答案是总难度值最高的链,而不是最长的链。最长的链,不一定是难度最高的,这就意味着伪造成本很低,账本很容易被篡改。
修改一个区块的交易数据部分,就要修改区块的Hash值,不然就通不过验证,修改了区块的Hash值,那么后一个区块的Hash值也必须要修改,因为后一个区块Hash值的计算因素包含了前一个区块的Hash值。以此类推,后面的每一个Hash值都得重新计算。当然也可以修改后一个Data部分来碰撞出一个Hash值,这个Hash值恰好就是后一个区块当前的Hash值,不过这个难度更高。
如果没有工作量证明机制,那么Hash值的计算过程就会非常简单,这会存在什么问题呢?
对于这个问题,举一个比较相近的例子,一次考试,如果试题非常难,大家可能2小时都做不完,如果试题简单,一般同学可能要1小时,学霸只需要半个小时就做完了。
对于区块链来说,这意味着伪造账本的成本变得非常低。我们知道比特币一个区块至少要有500笔交易,这是需要一定时间的,不管计算能力有多强,都得停在最新的区块上等待,如果Hash计算过程非常简单,那么在生成新的区块的这个等待区间,计算能力强的节点就能够伪造所有前面区块的数据。因为计算能力强,很容易获得新区块的记账权,所以计算能力强的节点很容易就把自己的账本(区块链)伪造成为系统中的有效链。
加入工作量证明机制就是让计算Hash值变得困难,导致的结果就是,修改记录时,每当计算一个区块的Hash值时,链式已经加了一个区块,这就保证了想要篡改账本的节点永远不可能成为总难度最高的链。
但是还存在一个问题,我们知道difficulty是动态变化的,所以不能100%的保证重新计算一个区块的Hash值的时间肯定大于生成一个新的区块的时间。另外,一个节点计算一个Hash值的时间可能大于生成一个新的区块的时间,如果是多个节点呢?当一个节点或者多个节点组成的计算能力超过了参与新区块Hash计算的计算能力时,那么就可能存在着修改账本的可能。这就是著名的51%攻击。
举个形象的例子,A在B前面一千米,两人同时向前直线跑,B的速度比A快,不管B的速度比A快多少,哪怕每小时只比A多跑一纳米,那么B始终是有机会追上A的。
?注意:前面我们提到的账本就是指区块链记录,计算能力就是算力。
对于前面的多个节点区块Hash计算的操作,可以从下面的网站来实际模拟一下,更加形象地感受计算和篡改区块链的难度,https://anders.com/blockchain/distributed.html。
如图1.7所示,每个标注框代表一个节点,节点上有一个区块链,链式是很多区块,填写了Data数据之后,就可以开始执行mine挖矿操作了。
(无法传图)
图1.7  区块Hash计算模拟
1.3  权益证明机制(PoS)
本节我们来介绍权益证明机制。虽然比特币、以太坊都是使用工作量证明机制,但还是需要了解一些权益证明机制的知识,因为很快将有更多的区块链技术应用会使用权益证明机制,例如以太坊就计划在Serenity版本中使用权益证明机制。
为什么要使用权益证明机制替换工作量证明机制呢?前面我们也看到了工作量证明机制需要做很多运算,而这种运算只是为了保证区块链的安全,所以也可以寻找其他机制来保证区块链的安全,从而减少这种计算带来的能源浪费。
1.3.1  什么是PoS
权益证明机制(Proof of Stake,PoS)也称股权证明机制,PoS通过评估账户持有代币的数量和时长来决定账户获得记账权的几率。
采用PoS的数字资产,系统会根据币龄分配相应的权益,币龄是持币数量和时间的乘积。例如,一个账户持有10个币,总共持有了1天,那么,此时的币龄就为10。
1.3.2  PoS的优势与劣势
通过前文的介绍我们知道,工作量证明机制存在两个问题,一是为了保证区块链不被修改必须做很多计算,这些计算需要消耗大量的电能,特别是当有更多的算力加入,让系统的难度增加,也就意味着消耗更多的电力,这就相当于以能源换安全;二是工作量证明机制存在51%攻击的可能。
权益证明机制就不会造成过多的电力浪费,因为权益证明机制的记账权不是通过计算指定难度的Hash来完成的,而是通过币龄来决定的。
仔细想一想,权益证明机制的本质还是让持有比特币多的账号拥有更大概率的记账权利,难道不怕拥有比特币多的人篡改账本?这个需要从动机理解,篡改账本是为了自己获益,但是篡改账本会使币的价值变低,甚至变得一文不值,受到损害最多的是持币最多的人。所以,如果按照正常思维,持币最多的人是不会有篡改账本的动机的。
权益证明机制就有点像银行的方式了,银行钱最多,自行记账,但是银行不会乱记录,否则就没有人来银行存钱了。
1.4  委托权益证明(DPoS)
委托权益证明(Delegated Proof-of-Stake,DPoS)是对权益证明机制的改进,委托权益证明先通过投票选出要选取多少个候选人,再投票选出N个候选人,然后在创建下一个区块的时候就从N个候选人中随机选出一个作为区块的创建者。
与PoS相比,DPoS能够让持有代币少的账户通过选举代理人的方式保证自己的权益。PoS根据账户余额或者币龄所占的比例来计算记账权看上去很公平,但是存在一个问题,账户余额越多说明有更大概率获取记账权,有更多的收益,会进一步扩大获取记账权的概率。所以很容易造成初始化分布问题(Initial Distribution Problem),也称冷启动问题。就是早期获得代币的账户很可能不会使用这些代币,代币的流通性显然成为了一个问题。
DPoS使用选举的方式解决了这个问题,有点像PoW中的矿池,单个节点算力不行,基本没有办法获取收益,如果加入矿池就可以和其他节点竞争了,虽然收益可能少了一些,但是总比不能获取任何收益要好。
1.5  权威证明(PoA)
权威证明(Proof-of-authority)和工作量证明机制这种需要网络中每一个节点都验证的方式不同,它是通过选定一些验证者,所有的数据只需要通过验证者验证就认为是合法的。而其他的节点只需要对验证者进行监督,保证验证者可信任就可以了。
PoA似乎已经不像是去中心化应用的协议了,保证安全已经变成了对验证者的信任,或者对多数验证者的信任。
PoA网络就是使用PoA机制,PoA网络是以太坊的一个分叉,所以以太坊上可以实现的功能在PoA上都可以实现。
1.6  区块链的应用
区块链有很多应用场景,例如比特币的账本就使用了区块链技术,也正是因为比特币的暴涨带火了区块链技术,让区块链技术迅速发展,使更多的区块链应用落地。
有很多区块链的应用也的确为我们的生活带来了极大的方便,例如跨境转账。跨境转账因为涉及不同的国家、政策、汇率、手续费较高等因素,应用区块链技术能有效地解决这些问题。还有就是慈善捐款,由于某些原因,很多人对于捐款抱有迟疑态度,怀有善意的人很多,但是实现善意的途径却有些不可信,应用区块链技术就能解决这个问题,并且在这方面取得了不俗的成绩。


近几年,区块链、比特币受到越来越多的关注。如果你没有听说过区块链,那说明你真的OUT了,因为就连跳广场舞的大妈都能说两句有关比特币的话题。本章,让我们先了解一下区块链。

以太坊智能合约开发实战 pdf下载声明

本pdf资料下载仅供个人学习和研究使用,不能用于商业用途,请在下载后24小时内删除。如果喜欢,请购买正版

pdf下载地址

版权归出版社和作者所有,下载链接已删除。如果喜欢,请购买正版!

链接地址:以太坊智能合约开发实战