本書詳細(xì)而深入地介紹了區(qū)塊鏈技術(shù)和智能合約技術(shù),包括算法、數(shù)據(jù)結(jié)構(gòu)及相關(guān)學(xué)科的相關(guān)理論。本書介紹了基于以太坊的智能合約編程語言Solidity,結(jié)合以太坊虛擬機(jī)(EVM)的實(shí)現(xiàn),討論了Solidity語句的匯編實(shí)現(xiàn),介紹了如何應(yīng)用Solidity來開發(fā)去中心化應(yīng)用(DApp)、如何使用區(qū)塊鏈的去中心化存儲(chǔ)(IPFS)。同時(shí),出于全面性和前瞻性的考慮,本書詳細(xì)介紹了智能合約的重要分支:基于超級(jí)賬本的鏈碼編程和智能合約編程的明日之星Web Assembly(WASM)編程技術(shù)。 本書可以作為高等學(xué)校區(qū)塊鏈工程與技術(shù)、計(jì)算機(jī)科學(xué)與技術(shù)、金融科技、商務(wù)智能等相關(guān)專業(yè)的教學(xué)參考書,也可作為區(qū)塊鏈從業(yè)人員和相關(guān)企事業(yè)單位技術(shù)人員的參考書。
黃立群,男,博士,副教授。主持研究項(xiàng)目5項(xiàng),參加自然科學(xué)基金、863項(xiàng)目和九五攻關(guān)項(xiàng)目各一項(xiàng),參加其他科研項(xiàng)目12項(xiàng)。在《通信學(xué)報(bào)》《電子學(xué)報(bào)》《電子科學(xué)學(xué)刊》《華中理工大學(xué)學(xué)報(bào)》《計(jì)算機(jī)工程與應(yīng)用》等刊物及國際會(huì)議上發(fā)表十篇論文。主要研究方向?yàn)橛?jì)算機(jī)網(wǎng)絡(luò)技術(shù)與應(yīng)用、移動(dòng)計(jì)算、決策支持系統(tǒng)、嵌入式系統(tǒng)的研究。
目 錄
第1章 區(qū)塊鏈概述 1
1.1 什么是區(qū)塊鏈 1
1.2 區(qū)塊鏈歷史 2
1.3 區(qū)塊鏈的分類 5
1.4 區(qū)塊鏈解決的問題 6
1.5 區(qū)塊鏈技術(shù)概述 9
1.6 區(qū)塊鏈面臨的挑戰(zhàn) 10
1.6.1 安全性挑戰(zhàn) 10
1.6.2 效率挑戰(zhàn) 14
1.6.3 落地應(yīng)用的有效性 15
1.6.4 區(qū)塊鏈發(fā)展的政策法規(guī)監(jiān)管 15
習(xí)題1 15
第2章 區(qū)塊鏈技術(shù) 17
2.1 區(qū)塊鏈的架構(gòu) 17
2.2 哈希函數(shù) 18
2.3 密碼學(xué)算法 19
2.3.1 對(duì)稱加密算法 19
2.3.2 不對(duì)稱加密算法 21
2.3.3 國密 22
2.3.4 RSA 23
2.3.5 橢圓曲線算法家族 24
2.4 共識(shí)算法 26
2.4.1 拜占庭將軍問題 27
2.4.2 共識(shí)算法的兩個(gè)定理 27
2.4.2 共識(shí)算法的目的 28
2.4.3 工作量證明 29
2.4.4 權(quán)益證明 30
2.4.5 委托權(quán)益證明 31
2.5 博弈論 31
2.5.1 博弈論原理 32
2.5.2 博弈論在區(qū)塊鏈的應(yīng)用 33
2.6 P2P算法 34
2.6.1 Gossip 35
2.6.2 Kademlia 37
2.7 數(shù)據(jù)結(jié)構(gòu)及其算法 42
2.7.1 默克爾樹 42
2.7.2 布隆過濾器 44
習(xí)題2 46
第3章 以太坊與智能合約 47
3.1 以太坊介紹 47
3.1.1 燃料 48
3.1.2 以太坊虛擬機(jī) 50
3.1.3 賬戶 50
3.2 以太坊關(guān)鍵數(shù)據(jù)結(jié)構(gòu)及其算法 51
3.2.1 遞歸長度前綴編碼 51
3.2.2 梅克爾–帕特里夏樹 52
3.3 智能合約介紹 57
3.3.1 智能合約的實(shí)現(xiàn)機(jī)制:虛擬機(jī) 57
3.3.2 智能合約的實(shí)現(xiàn)機(jī)制:容器 58
3.4 現(xiàn)有智能合約框架介紹 58
習(xí)題3 59
第4章 Solidity編程 61
4.1 SOL文件結(jié)構(gòu) 61
4.2 合約結(jié)構(gòu) 64
4.3 變量類型 64
4.3.1 值類型 64
4.3.2 引用類型 66
4.3.3 字典 67
4.3.4 特殊情況 67
4.4 操作符 68
4.5 語句 69
4.5.1 條件語句 69
4.5.2 循環(huán)語句 70
4.5.3 其他 70
4.6 修飾符 70
4.6.1 修飾符說明 71
4.6.2 修飾符的區(qū)別 72
4.6.3 自定義修飾符 74
4.7 數(shù)據(jù)位置 75
4.8 事件 77
4.9 繼承 80
4.10 其他 81
4.10.1 類型轉(zhuǎn)換及推斷 81
4.10.2 異常 82
4.10.3 匯編 82
4.10.4 This關(guān)鍵字 84
習(xí)題4 84
第5章 智能合約開發(fā) 86
5.1 智能合約開發(fā)的特點(diǎn) 86
5.2 智能合約的生命周期和開發(fā)周期 88
5.2.1 智能合約的生命周期 88
5.2.2 智能合約的開發(fā)周期 88
5.3 設(shè)計(jì)模式 89
5.3.1 工廠合約模式 90
5.3.2 映射迭代 90
5.3.3 名字登錄 91
5.3.4 回退模式 92
5.3.5 合約自毀 92
5.3.6 訪問限制 93
5.3.7 斷路器 94
5.3.8 狀態(tài)機(jī) 95
5.4 基礎(chǔ)算法 97
5.5 智能合約的安全 99
5.5.1 編程語言相關(guān)的攻擊 99
5.5.2 平臺(tái)相關(guān)的攻擊 107
5.5.3 重入攻擊 115
5.5.4 阻塞攻擊 116
5.6 智能合約最佳安全開發(fā)指南 118
5.7 代碼審計(jì) 126
小結(jié) 126
習(xí)題5 126
第6章 Solidity智能合約應(yīng)用 127
6.1 可升級(jí) 127
6.1.1 升級(jí)智能合約要考慮的問題 127
6.1.2 智能合約升級(jí)方法 128
6.1.3 通用的代理模式 131
6.1.4 存儲(chǔ)升級(jí) 133
6.2 節(jié)省燃料 140
6.3 匯編代碼 147
6.3.1 棧 147
6.3.2 調(diào)用數(shù)據(jù) 148
6.3.3 內(nèi)存 149
6.3.4 存儲(chǔ) 149
6.4 合約間調(diào)用 151
6.4.1 函數(shù)調(diào)用 151
6.4.2 依賴注入 152
6.4.3 消息調(diào)用 153
6.4.4 獲取合約間調(diào)用的返回值 156
6.5 ABI編程 158
6.5.1 內(nèi)存結(jié)構(gòu) 159
6.5.2 函數(shù)選擇子 159
6.5.3 類型定義 159
6.5.4 數(shù)據(jù)表示 160
6.5.5 編碼 165
6.6 運(yùn)行原理 173
習(xí)題6 178
第7章 去中心化應(yīng)用 180
7.1 DApp概述 180
7.2 DApp架構(gòu) 183
7.2.1 客戶端 183
7.2.2 服務(wù)器端 184
7.2.3 流程詳解 186
7.3 去中心化數(shù)據(jù)存儲(chǔ) 188
7.3.1 Swarm 189
7.3.2 IPFS/FileCoin 191
7.4 消息通信 193
7.5 名字解析 194
習(xí)題7 194
第8章 超級(jí)賬本 195
8.1 Fabric概述 195
8.1.1 Fabric結(jié)構(gòu) 196
8.1.2 Fabric組件 197
8.1.3 Fabric技術(shù)架構(gòu) 202
8.1.4 Fabric網(wǎng)絡(luò)架構(gòu) 204
8.2 鏈碼 204
8.2.1 鏈碼的分類 204
8.2.2 鏈碼的生命周期 205
8.3 鏈碼交互 206
習(xí)題8 207
第9章 Web Assembly 209
9.1 為什么需要WASM 209
9.1.1 EVM的缺陷 209
9.1.2 WASM的優(yōu)越性 213
9.2 WASM特色 213
9.2.1 WASM特點(diǎn) 214
9.2.2 WASM動(dòng)態(tài)運(yùn)行庫 215
9.3 eWASM前后端交互 216
9.4 從Solidity遷移到WASM 218
習(xí)題9 218
第10章 開發(fā)環(huán)境和工具安裝 220
10.1 實(shí)驗(yàn)1:區(qū)塊鏈開發(fā)基本語言工具包安裝配置 220
10.1.1 編程語言包的安裝 220
10.1.2 Node.js環(huán)境的安裝 221
10.1.3 Git包的安裝 222
10.2 實(shí)驗(yàn)2:以太坊開發(fā)環(huán)境安裝 222
10.2.1 web3安裝 222
10.2.2 Ganache安裝 222
10.2.3 Truffle安裝 223
10.2.4 區(qū)塊鏈瀏覽器 225
10.2.5 測試環(huán)境 225
10.3 實(shí)驗(yàn)3:以太坊開發(fā)工具 227
10.3.1 Remix的使用 227
10.3.2 Infura的使用 230
10.3.3 MetaMask的使用 231
10.3.4 Mist的使用 233
10.3.5 以太坊源碼編譯 234
10.3.6 其他 235
動(dòng)手實(shí)驗(yàn) 235
第11章 Solidity智能合約開發(fā) 236
11.1 實(shí)驗(yàn)4:以太坊Solidity智能合約ERC20開發(fā) 236
11.1.1 方法 237
11.1.2 事件 238
11.1.3 OpenZeppline框架 238
11.2 實(shí)驗(yàn)5:以太坊Solidity智能合約ERC721開發(fā) 239
11.2.1 ERC721接口定義 239
11.2.2 元數(shù)據(jù)擴(kuò)展 250
11.2.3 可枚舉擴(kuò)展 251
11.2.4 ERC165標(biāo)準(zhǔn) 255
11.3 實(shí)驗(yàn)6:用編程語言與智能合約交互 256
11.3.1 用Go語言程序與智能合約交互 256
11.3.2 基于ABI的編程 264
11.2.3 標(biāo)準(zhǔn)開發(fā)流程 264
11.4 實(shí)驗(yàn)7:Solidity智能合約調(diào)試 268
11.4.1 編程語言 268
11.4.2 Testrpc/Ganache測試環(huán)境 276
11.4.3 Truffle Debugger 277
11.4.4 Remix調(diào)試 285
第12章 智能合約應(yīng)用案例 289
12.1 實(shí)驗(yàn)8:以太坊DApp開發(fā)和調(diào)試 289
12.1.1 環(huán)境準(zhǔn)備 290
12.1.2 項(xiàng)目 290
12.1.3 智能合約Solidity編程 291
12.2 實(shí)驗(yàn)9:以太坊IPFS DApp開發(fā)和調(diào)試 296
12.2.1 DApp環(huán)境準(zhǔn)備 296
12.2.2 DApp項(xiàng)目 297
12.2.3 編譯運(yùn)行 301
第13章 超級(jí)賬本Fabric開發(fā) 302
13.1 實(shí)驗(yàn)10:超級(jí)賬本Fabric開發(fā)環(huán)境 302
13.1.1 Fabric安裝 302
13.1.2 First-network例子 314
13.1.3 Test-network示例 319
13.1.2 鏈碼交互 326
13.1.3 鏈碼調(diào)試 330
13.1.4 鏈碼簡例 331
13.2 實(shí)驗(yàn)11:WASM簡單合約開發(fā) 340
13.2.1 Go + WASM的基本用法 340
13.2.2 WASM的例子 341
第14章 智能合約實(shí)驗(yàn)練習(xí) 344
14.1 實(shí)驗(yàn)練習(xí)1:商業(yè)名片系統(tǒng) 344
14.2 實(shí)驗(yàn)練習(xí)2:基于ERC721/NFT的學(xué)位證書認(rèn)證系統(tǒng) 344
附錄A Solidity常用函數(shù) 346
附錄B 區(qū)塊鏈大事記 349
附錄C 區(qū)塊鏈術(shù)語 358
附錄D 以太坊內(nèi)置合約 363
參考文獻(xiàn) 366