前言
第1章 區(qū)塊鏈的基本概念與應(yīng)用場(chǎng)景
1.1 基本概念
1
1.1.1 去中心化應(yīng)用(DApp) 1
1.1.2 DApp的內(nèi)部貨幣
2
1.1.3 比特幣 2
1.1.4 工作量證明(PoW) 3
1.1.5 股權(quán)證明(PoS) 4
1.1.6 51%攻擊 4
1.1.7 以太坊 4
1.1.8 超級(jí)賬本項(xiàng)目 5
1.2 區(qū)塊鏈的應(yīng)用場(chǎng)景 5
1.2.1 金融領(lǐng)域
6
1.2.2 征信管理
7
1.2.3 資源共享
7
1.2.4 物聯(lián)網(wǎng) 8
1.2.5 其他領(lǐng)域
8
1.3 小結(jié) 9
第2章 創(chuàng)建第一個(gè)區(qū)塊鏈
2.1 以太坊(Ethereum)開(kāi)發(fā)環(huán)境搭建 10
2.2 使用geth命令創(chuàng)建以太坊賬戶 13
2.3 刪除以太坊賬戶 15
2.4 geth
JavaScript控制臺(tái) 16
2.5 建立私有區(qū)塊鏈與挖礦 18
2.6 小結(jié) 21
第3章 智能合約基礎(chǔ)
3.1 基礎(chǔ)知識(shí)
22
3.1.1 Solidity語(yǔ)言概述
23
3.1.2 用Solidity語(yǔ)言開(kāi)發(fā)智能合約 23
3.1.3 使用Remix運(yùn)行智能合約 24
3.2 編寫(xiě)和測(cè)試智能合約 27
3.2.1 安裝本地Remix環(huán)境(Windows、Mac OS X和Linux) 27
3.2.2 安裝testrpc
28
3.2.3 使用testrpc測(cè)試智能合約 29
3.2.4 Intellij
IDEA Solidity插件 33
3.2.5 將Solidity編譯工具與Intellij IDEA集成 36
3.3 其他智能合約IDE 38
3.3.1 Visual
Studio擴(kuò)展 38
3.3.2 Visual
Studio Code擴(kuò)展 40
3.3.3 Sublime
Text插件 42
3.4 Solidity工具 42
3.4.1 Solidity
REPL 42
3.4.2 solgraph
43
3.5 小結(jié) 45
第4章 以太坊節(jié)點(diǎn)與挖礦
4.1 什么是Web3.js
46
4.2 安裝Web3.js
47
4.3 連接testrpc節(jié)點(diǎn) 48
4.4 連接geth節(jié)點(diǎn) 49
4.5
HttpProvider與IPCProvider 51
4.6 發(fā)布與調(diào)用智能合約 53
4.6.1 編譯智能合約 53
4.6.2 創(chuàng)建以太坊賬戶 54
4.6.3 用Web3.js
API發(fā)布智能合約 54
4.6.4 挖礦與掙錢(qián)
56
4.6.5 重新發(fā)布智能合約 57
4.7 自動(dòng)編譯智能合約 60
4.8 小結(jié) 64
第5章 以太坊中的Web技術(shù)
5.1 Node.js入門(mén) 65
5.1.1 使用Node.js
REPL 66
5.1.2 執(zhí)行JavaScript腳本文件 66
5.1.3 Node.js
IDE(WebStorm) 67
5.1.4 在WebStorm中編寫(xiě)Node.js程序 68
5.2 Express入門(mén) 70
5.2.1 安裝express模塊 70
5.2.2 使用express模塊 72
5.2.3 用WebStorm創(chuàng)建Express工程 74
5.2.4 為Express工程添加路由 76
5.2.5 使用Handlebars模板 78
5.3 通過(guò)Web方式調(diào)用智能合約 78
5.3.1 在Web頁(yè)面中調(diào)用智能合約 79
5.3.2 在服務(wù)端(Node.js)調(diào)用智能合約 84
5.3.3 通過(guò)AJAX方式異步調(diào)用智能合約 88
5.4 小結(jié) 90
第6章 Web3.js API詳解
6.1 基礎(chǔ)知識(shí)
91
6.1.1 Web3.js簡(jiǎn)介 91
6.1.2 Web3.js開(kāi)發(fā)環(huán)境搭建 92
6.2 Web3 API 93
6.2.1 設(shè)置和獲取Provider
93
6.2.2 重置狀態(tài)
94
6.2.3 獲取字符串的SHA3哈希碼 94
6.2.4 將值轉(zhuǎn)換為十六進(jìn)制字符串 95
6.2.5 十六進(jìn)制與ASCII互相轉(zhuǎn)換 97
6.2.6 十六進(jìn)制與十進(jìn)制互相轉(zhuǎn)換 98
6.2.7 將數(shù)值或十六進(jìn)制字符串轉(zhuǎn)換為BigNumber 98
6.2.8 使用BigNumber
99
6.2.9 單位轉(zhuǎn)換
101
6.2.10 核對(duì)賬戶地址是否有效 103
6.3 Web3.eth
API 104
6.3.1 獲取和設(shè)置默認(rèn)賬戶 104
6.3.2 獲取和設(shè)置默認(rèn)區(qū)塊 104
6.3.3 獲取區(qū)塊的同步狀態(tài) 105
6.3.4 捕捉區(qū)塊同步狀態(tài) 106
6.3.5 獲取礦工地址 107
6.3.6 檢測(cè)當(dāng)前節(jié)點(diǎn)是否在挖礦 108
6.3.7 獲取以太坊燃料(gas)的平均價(jià)格 109
6.3.8 獲取以太坊節(jié)點(diǎn)中的賬號(hào)地址 109
6.3.9 獲取區(qū)塊編號(hào) 110
6.3.10 獲取賬戶的余額 112
6.3.11 獲取地址某一個(gè)位置存儲(chǔ)的值 113
6.3.12 獲取指定地址中的代碼 113
6.3.13 獲取區(qū)塊信息 114
6.3.14 獲取區(qū)塊中包含的交易數(shù) 116
6.3.15 獲取交易數(shù)據(jù) 117
6.3.16 獲取交易憑證 118
6.3.17 獲取賬戶發(fā)送的交易數(shù) 120
6.3.18 向以太坊網(wǎng)絡(luò)發(fā)送交易 120
6.3.19 發(fā)送簽名交易 122
6.3.20 用賬戶對(duì)數(shù)據(jù)進(jìn)行簽名 123
6.3.21 執(zhí)行以太坊虛擬機(jī)中的代碼 124
6.3.22 預(yù)估交易消耗的gas數(shù) 124
6.3.23 如何設(shè)置gas、gasLimit和gasPrice 125
6.4 小結(jié)
128
第7章 Solidity語(yǔ)言詳解(一)
7.1 Solidity語(yǔ)言簡(jiǎn)介
129
7.2 Solidity語(yǔ)言基礎(chǔ)
130
7.2.1 編譯器版本指令(pragma) 130
7.2.2 導(dǎo)入其他Solidity源代碼
文件(import) 132
7.2.3 用Web3.js
API發(fā)布多個(gè)智能合約 136
7.2.4 用Web3.js
API編譯多個(gè)智能合約 140
7.2.5 注釋
142
7.3 值類型
142
7.3.1 布爾類型(bool) 143
7.3.2 整數(shù)類型(int/uint) 144
7.3.3 浮點(diǎn)數(shù)(fixed) 145
7.3.4 地址類型(address) 145
7.3.5 獲取余額(balance)與轉(zhuǎn)賬(transfer) 146
7.3.6 另一種轉(zhuǎn)賬的方式(send) 149
7.3.7 固定長(zhǎng)度的字節(jié)序列 150
7.4 引用類型
152
7.4.1 數(shù)據(jù)存儲(chǔ)位置 152
7.4.2 可變長(zhǎng)度的字節(jié)序列(bytes) 153
7.4.3 字符串(string)類型 154
7.4.4 使用bytes連接字符串 156
7.4.5 使用第三方庫(kù)連接字符串 158
7.4.6 枚舉類型(enum) 159
7.4.7 函數(shù)類型(function) 161
7.4.8 數(shù)組
164
7.4.9 結(jié)構(gòu)體(struct) 168
7.5 映射(mapping) 170
7.6 小結(jié)
172
第8章 Solidity語(yǔ)言詳解(二)
8.1 表達(dá)式與控制結(jié)構(gòu) 173
8.1.1 函數(shù)參數(shù)與函數(shù)返回值 173
8.1.2 控制結(jié)構(gòu)
176
8.1.3 調(diào)用其他合約中的函數(shù) 179
8.1.4 函數(shù)的命名參數(shù) 181
8.1.5 通過(guò)new關(guān)鍵字創(chuàng)建合約對(duì)象 182
8.1.6 函數(shù)多返回值解構(gòu)和元組賦值 184
8.1.7 變量聲明和作用域 185
8.1.8 錯(cuò)誤處理
186
8.2 計(jì)量單位與全局變量 187
8.2.1 以太計(jì)量單位 187
8.2.2 時(shí)間計(jì)量單位 189
8.2.3 block變量
190
8.2.4 msg變量
191
8.2.5 其他全局變量和函數(shù) 193
8.3 智能合約
194
8.3.1 函數(shù)和狀態(tài)變量訪問(wèn)權(quán)限 194
8.3.2 getter函數(shù)
195
8.3.3 自定義修飾符(modifier) 197
8.3.4 常量
201
8.3.5 view函數(shù)
202
8.3.6 pure函數(shù)
204
8.3.7 fallback函數(shù)
205
8.3.8 函數(shù)重載
206
8.3.9 事件
207
8.3.10 合約繼承
210
8.3.11 合約構(gòu)造函數(shù) 211
8.3.12 抽象合約
211
8.3.13 接口
213
8.4 小結(jié)
214
第9章 Truffle與Ganache實(shí)戰(zhàn)
9.1 Truffle基礎(chǔ)
215
9.1.1 安裝Truffle
215
9.1.2 創(chuàng)建Truffle工程 216
9.1.3 Truffle工程的結(jié)構(gòu)
216
9.1.4 在Truffle工程中創(chuàng)建自己的合約 217
9.1.5 編譯合約
218
9.1.6 部署合約
219
9.1.7 測(cè)試合約
219
9.2 以太坊客戶端 220
9.2.1 Truffle內(nèi)置以太坊客戶端 220
9.2.2 Ganache概述
221
9.2.3 安裝Ganache
221
9.2.4 用Truffle在Ganache上發(fā)布合約 222
9.3 Truffle高級(jí)應(yīng)用
224
9.3.1 用Solidity編寫(xiě)測(cè)試代碼 224
9.3.2 用JavaScript編寫(xiě)測(cè)試代碼 227
9.3.3 捕捉事件和異常 228
9.3.4 使用truffle-contract
API調(diào)用
合約函數(shù) 231
9.3.5 寫(xiě)Truffle擴(kuò)展腳本 232
9.4 小結(jié)
234
第10章 項(xiàng)目實(shí)戰(zhàn):在以太坊上發(fā)行數(shù)字資產(chǎn)
10.1 數(shù)字資產(chǎn)原理 236
10.2 代幣合約
239
10.2.1 ERC20
Token接口 239
10.2.2 編寫(xiě)代幣合約 242
10.2.3 測(cè)試代幣合約中的函數(shù) 245
10.2.4 測(cè)試代幣合約中的事件 247
10.3 在以太坊上發(fā)布和使用代幣 248
10.3.1 如何將代幣合約部署在以太坊上 249
10.3.2 安裝MetaMask擴(kuò)展 250
10.3.3 創(chuàng)建以太坊賬戶 251
10.3.4 免費(fèi)申請(qǐng)無(wú)限量的以太(ether) 254
10.3.5 在以太坊上部署代幣合約 257
10.3.6 代幣交易
260
10.4 用Web3.js
API完成Titans幣的轉(zhuǎn)賬 265
10.5 以太幣和以太坊代幣的區(qū)別 269
10.6 互聯(lián)網(wǎng)的未來(lái):DApp 270
10.7 小結(jié)
271
第11章 項(xiàng)目實(shí)戰(zhàn):支持以太坊的小程序版云筆記
11.1 項(xiàng)目功能概述 272
11.2 微信小程序基礎(chǔ) 273
11.2.1 搭建小程序開(kāi)發(fā)環(huán)境 273
11.2.2 創(chuàng)建小程序項(xiàng)目 275
11.3 云筆記智能合約 277
11.3.1 編寫(xiě)和測(cè)試云筆記智能合約 277
11.3.2 將CloudNoteService合約部署到以太坊網(wǎng)絡(luò)上 279
11.4 用Note.js和Express開(kāi)發(fā)小程序服務(wù)端程序 281
11.4.1 編寫(xiě)調(diào)用CloudNoteService合約函數(shù)的Database類 281
11.4.2 測(cè)試Database類 289
11.4.3 為服務(wù)添加集中式存儲(chǔ)功能 291
11.4.4 添加為小程序服務(wù)端路由 294
11.5 開(kāi)發(fā)云筆記客戶端 296
11.5.1 設(shè)計(jì)云筆記主頁(yè)面 296
11.5.2 實(shí)現(xiàn)云筆記主頁(yè)面的邏輯代碼 298
11.5.3 設(shè)計(jì)添加云筆記頁(yè)面 300
11.5.4 實(shí)現(xiàn)添加云筆記頁(yè)面的邏輯代碼 302
11.5.5 設(shè)計(jì)云筆記列表頁(yè)面 304
11.5.6 實(shí)現(xiàn)云筆記列表頁(yè)面的邏輯代碼 305
11.5.7 設(shè)計(jì)云筆記編輯頁(yè)面 307
11.5.8 實(shí)現(xiàn)云筆記編輯頁(yè)面的邏輯代碼 309
11.6 小結(jié)
310