目录
前言
第1章以太坊简介1
11以太坊1
111不对称加密体系2
112密码学哈希函数4
113对称点对点网络4
114区块链4
115以太坊虚拟机5
116节点5
117矿工5
118工作量证明6
119去中心化应用6
1110Solidity6
12智能合约6
13燃料7
131为什么需要燃料?8
132燃料组成8
14ether9
15账户9
16交易10
第2章预备知识11
21简单的例子11
22工具准备12
221编程环境准备12
222编程工具准备16
223区块链浏览器26
23测试环境26
231MetaMask访问测试环境27
232测试环境领取测试用币27
233开发时连接测试环境28
24以太坊源码编译29
第3章Solidity编程基础31
31sol文件结构31
311编译开关31
312引用其他源文件31
313注释31
314合约32
315库32
316接口33
32合约文件结构33
33变量类型33
331值类型34
332引用类型35
333字典/映射37
334特殊情况37
34操作符38
35语句39
351条件语句39
352循环语句40
353其他40
36修饰符40
361标准修饰符40
362自定义修饰符44
37数据位置46
38事件47
381智能合约返回值给用户接口48
382异步的带数据的触发器49
383一种比较便宜的存储49
384事件里的Indexed参数50
39继承51
391单继承51
392多重继承51
310其他52
3101内置52
3102特殊单位54
3103类型转换及推断55
3104异常56
3105汇编56
第4章Solidity编程的高级话题59
41This关键字59
42ERC20标准接口59
421方法61
422事件62
423OpenZepplin框架62
43ERC721标准接口63
431ERC721接口定义63
432元数据扩展75
433可枚举扩展77
434ERC165标准81
44合约间调用82
441函数调用82
442依赖注入84
443消息调用84
444获取合约间调用的返回值88
45基础算法90
46用Go与合约交互93
461创建项目93
462创建一个简单的以太坊合约93
463用Go访问以太坊合约94
464本地测试94
465连接到一个以太坊节点98
466为账户创建加密的JSON钥匙98
467最后验证98
第5章ABI接口102
51内存结构102
52函数选择子102
53类型的定义102
54EVM里的数据表示103
541固定长度数据类型的表示104
542动态长度数据类型的表示105
55编码108
551简单的例子108
552外部调用例子109
553外部方法调用的ABI编码112
56基于ABI的编程116
第6章智能合约运行原理118
61设计模式118
611合约自毁118
612工厂合约模式119
613名字登录120
614映射迭代121
615撤出模式122
62省燃料122
621注意数据类型123
622以字节编码的形式存储值123
623利用SOLC编译器压缩变量123
624使用汇编代码压缩变量124
625合并函数参数125
626使用默克尔树证明减少存储成本125
627无状态的合约127
628在IPFS上存储数据127
629位压缩127
6210批处理128
6211Storage结构类型读写分离129
6212uint256和直接内存存储130
6213汇编代码优化130
63汇编代码130
631栈131
632调用数据131
633内存132
634存储133
64解构智能合约134
641合约创建138
642合约本体通用部分141
643合约本体特定代码145
第7章可升级的合约147
71方法147
711代理合约147
712分离逻辑和数据147
713通过键值对来分离数据和逻辑147
714部分升级148
715比较148
716简单的代理合约例子148
72通用的代理模式150
73Storage154
731继承存储154
732永久存储154
733非结构化存储155
74Augur156
741合约部署156
742存储部署157
75Colony158
751存储部署158
752合约部署159
76总结159
第8章编写安全的合约161
81以太坊已知常见漏洞 161
811上溢和下溢161
812Solidity可见性修饰符的差别165
813重入问题166
814出乎意料的ether操作170
815代理调用174
816默认可见性修饰符178
817熵随机源180
818外部合约引用180
819短地址/参数攻击184
8110未验证的CALL返回值185
8111竞争条件186
8112阻塞攻击188
8113操纵块时间戳190
8114谨慎使用构造函数191
8115未初始化的存储指针192
8116浮点数精度193
8117交易授权194
82以太坊一些奇怪的特性195
821没有Key的ether195
822一次性地址197
823一个交易的空投197
83以太坊智能合约——最佳安全开发指南198
831尽早且明确的暴露问题198
832在支付时使用(pull)模式而不是(push)模式199
833函数代码的顺序:条件,行为,交互200
834留意平台局限性201
835测试用例203
836容错及自动b