本書從零開始介紹Solidity程序開發(fā),從Solidity語言中基礎(chǔ)的關(guān)鍵字和語句開始介紹,逐步深入到高級應(yīng)用,包括設(shè)計模式、合約可升級的設(shè)計、合約的安全性問題及對策等,并結(jié)合EVM的實現(xiàn),討論Solidity語句的匯編實現(xiàn);對一些原理的講解,提供了相對應(yīng)的實例,以期更易于理解原理的實現(xiàn)機(jī)理;同時,對Solidity應(yīng)用于DApp開發(fā),及使用區(qū)塊鏈上的去中心化存儲(IPFS)也有詳細(xì)的介紹。
本書可作為對區(qū)塊鏈感興趣的程序開發(fā)人員、高校師生等的參考書,也可作為相關(guān)課程的培訓(xùn)教材。
目錄
前言
第1章以太坊簡介1
11以太坊1
111不對稱加密體系2
112密碼學(xué)哈希函數(shù)4
113對稱點(diǎn)對點(diǎn)網(wǎng)絡(luò)4
114區(qū)塊鏈4
115以太坊虛擬機(jī)5
116節(jié)點(diǎn)5
117礦工5
118工作量證明6
119去中心化應(yīng)用6
1110Solidity6
12智能合約6
13燃料7
131為什么需要燃料?8
132燃料組成8
14ether9
15賬戶9
16交易10
第2章預(yù)備知識11
21簡單的例子11
22工具準(zhǔn)備12
221編程環(huán)境準(zhǔn)備12
222編程工具準(zhǔn)備16
223區(qū)塊鏈瀏覽器26
23測試環(huán)境26
231MetaMask訪問測試環(huán)境27
232測試環(huán)境領(lǐng)取測試用幣27
233開發(fā)時連接測試環(huán)境28
24以太坊源碼編譯29
第3章Solidity編程基礎(chǔ)31
31sol文件結(jié)構(gòu)31
311編譯開關(guān)31
312引用其他源文件31
313注釋31
314合約32
315庫32
316接口33
32合約文件結(jié)構(gòu)33
33變量類型33
331值類型34
332引用類型35
333字典/映射37
334特殊情況37
34操作符38
35語句39
351條件語句39
352循環(huán)語句40
353其他40
36修飾符40
361標(biāo)準(zhǔn)修飾符40
362自定義修飾符44
37數(shù)據(jù)位置46
38事件47
381智能合約返回值給用戶接口48
382異步的帶數(shù)據(jù)的觸發(fā)器49
383一種比較便宜的存儲49
384事件里的Indexed參數(shù)50
39繼承51
391單繼承51
392多重繼承51
310其他52
3101內(nèi)置52
3102特殊單位54
3103類型轉(zhuǎn)換及推斷55
3104異常56
3105匯編56
第4章Solidity編程的高級話題59
41This關(guān)鍵字59
42ERC20標(biāo)準(zhǔn)接口59
421方法61
422事件62
423OpenZepplin框架62
43ERC721標(biāo)準(zhǔn)接口63
431ERC721接口定義63
432元數(shù)據(jù)擴(kuò)展75
433可枚舉擴(kuò)展77
434ERC165標(biāo)準(zhǔn)81
44合約間調(diào)用82
441函數(shù)調(diào)用82
442依賴注入84
443消息調(diào)用84
444獲取合約間調(diào)用的返回值88
45基礎(chǔ)算法90
46用Go與合約交互93
461創(chuàng)建項目93
462創(chuàng)建一個簡單的以太坊合約93
463用Go訪問以太坊合約94
464本地測試94
465連接到一個以太坊節(jié)點(diǎn)98
466為賬戶創(chuàng)建加密的JSON鑰匙98
467最后驗證98
第5章ABI接口102
51內(nèi)存結(jié)構(gòu)102
52函數(shù)選擇子102
53類型的定義102
54EVM里的數(shù)據(jù)表示103
541固定長度數(shù)據(jù)類型的表示104
542動態(tài)長度數(shù)據(jù)類型的表示105
55編碼108
551簡單的例子108
552外部調(diào)用例子109
553外部方法調(diào)用的ABI編碼112
56基于ABI的編程116
第6章智能合約運(yùn)行原理118
61設(shè)計模式118
611合約自毀118
612工廠合約模式119
613名字登錄120
614映射迭代121
615撤出模式122
62省燃料122
621注意數(shù)據(jù)類型123
622以字節(jié)編碼的形式存儲值123
623利用SOLC編譯器壓縮變量123
624使用匯編代碼壓縮變量124
625合并函數(shù)參數(shù)125
626使用默克爾樹證明減少存儲成本125
627無狀態(tài)的合約127
628在IPFS上存儲數(shù)據(jù)127
629位壓縮127
6210批處理128
6211Storage結(jié)構(gòu)類型讀寫分離129
6212uint256和直接內(nèi)存存儲130
6213匯編代碼優(yōu)化130
63匯編代碼130
631棧131
632調(diào)用數(shù)據(jù)131
633內(nèi)存132
634存儲133
64解構(gòu)智能合約134
641合約創(chuàng)建138
642合約本體通用部分141
643合約本體特定代碼145
第7章可升級的合約147
71方法147
711代理合約147
712分離邏輯和數(shù)據(jù)147
713通過鍵值對來分離數(shù)據(jù)和邏輯147
714部分升級148
715比較148
716簡單的代理合約例子148
72通用的代理模式150
73Storage154
731繼承存儲154
732永久存儲154
733非結(jié)構(gòu)化存儲155
74Augur156
741合約部署156
742存儲部署157
75Colony158
751存儲部署158
752合約部署159
76總結(jié)159
第8章編寫安全的合約161
81以太坊已知常見漏洞 161
811上溢和下溢161
812Solidity可見性修飾符的差別165
813重入問題166
814出乎意料的ether操作170
815代理調(diào)用174
816默認(rèn)可見性修飾符178
817熵隨機(jī)源180
818外部合約引用180
819短地址/參數(shù)攻擊184
8110未驗證的CALL返回值185
8111競爭條件186
8112阻塞攻擊188
8113操縱塊時間戳190
8114謹(jǐn)慎使用構(gòu)造函數(shù)191
8115未初始化的存儲指針192
8116浮點(diǎn)數(shù)精度193
8117交易授權(quán)194
82以太坊一些奇怪的特性195
821沒有Key的ether195
822一次性地址197
823一個交易的空投197
83以太坊智能合約——最佳安全開發(fā)指南198
831盡早且明確的暴露問題198
832在支付時使用(pull)模式而不是(push)模式199
833函數(shù)代碼的順序:條件,行為,交互200
834留意平臺局限性201
835測試用例203
836容錯及自動bug獎勵203
837限制可存入的資金205
838簡單和模塊化的代碼206
839不要從0開始寫所有的代碼206
84代碼審計206
85總結(jié)207
第9章DApp開發(fā)208
91DApp的特點(diǎn)208
92DApp架構(gòu)211
921客戶端211
922服務(wù)器端212
923流程詳解214
93以太坊DApp217
931環(huán)境準(zhǔn)備218
932項目218
933智能合約Solidity編程219
934項目部署224
94IPFS DApp225
941環(huán)境準(zhǔn)備225
942項目225
943編譯運(yùn)行230
第10章調(diào)試231
101編程語言231
1011事件231
1012Assert/Require語句236
1013測試案例237
102Testrpc/Ganache測試環(huán)境239
103Truffle Debugger241
1031調(diào)試界面241
1032增加和刪除斷點(diǎn)242
1033如何調(diào)試交易243
1034調(diào)試一個食物購物車的合約243
104Remix調(diào)試251
105其他工具254
1051JEB254
1052Prosity254
1053Binary Ninja255
參考文獻(xiàn)257