本書從零開始介紹Solidity程序開發(fā),從Solidity語言中基礎的關鍵字和語句開始介紹,逐步深入到高級應用,包括設計模式、合約可升級的設計、合約的安全性問題及對策等,并結合EVM的實現(xiàn),討論Solidity語句的匯編實現(xiàn);對一些原理的講解,提供了相對應的實例,以期更易于理解原理的實現(xiàn)機理;同時,對Solidity應用于DApp開發(fā),及使用區(qū)塊鏈上的去中心化存儲(IPFS)也有詳細的介紹。
本書可作為對區(qū)塊鏈感興趣的程序開發(fā)人員、高校師生等的參考書,也可作為相關課程的培訓教材。
目錄
前言
第1章以太坊簡介1
11以太坊1
111不對稱加密體系2
112密碼學哈希函數(shù)4
113對稱點對點網(wǎng)絡4
114區(qū)塊鏈4
115以太坊虛擬機5
116節(jié)點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編程環(huán)境準備12
222編程工具準備16
223區(qū)塊鏈瀏覽器26
23測試環(huán)境26
231MetaMask訪問測試環(huán)境27
232測試環(huán)境領取測試用幣27
233開發(fā)時連接測試環(huán)境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循環(huán)語句40
353其他40
36修飾符40
361標準修飾符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內置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元數(shù)據(jù)擴展75
433可枚舉擴展77
434ERC165標準81
44合約間調用82
441函數(shù)調用82
442依賴注入84
443消息調用84
444獲取合約間調用的返回值88
45基礎算法90
46用Go與合約交互93
461創(chuàng)建項目93
462創(chuàng)建一個簡單的以太坊合約93
463用Go訪問以太坊合約94
464本地測試94
465連接到一個以太坊節(jié)點98
466為賬戶創(chuàng)建加密的JSON鑰匙98
467最后驗證98
第5章ABI接口102
51內存結構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外部調用例子109
553外部方法調用的ABI編碼112
56基于ABI的編程116
第6章智能合約運行原理118
61設計模式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結構類型讀寫分離129
6212uint256和直接內存存儲130
6213匯編代碼優(yōu)化130
63匯編代碼130
631棧131
632調用數(shù)據(jù)131
633內存132
634存儲133
64解構智能合約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非結構化存儲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短地址/參數(shù)攻擊184
8110未驗證的CALL返回值185
8111競爭條件186
8112阻塞攻擊188
8113操縱塊時間戳190
8114謹慎使用構造函數(shù)191
8115未初始化的存儲指針192
8116浮點數(shù)精度193
8117交易授權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總結207
第9章DApp開發(fā)208
91DApp的特點208
92DApp架構211
921客戶端211
922服務器端212
923流程詳解214
93以太坊DApp217
931環(huán)境準備218
932項目218
933智能合約Solidity編程219
934項目部署224
94IPFS DApp225
941環(huán)境準備225
942項目225
943編譯運行230
第10章調試231
101編程語言231
1011事件231
1012Assert/Require語句236
1013測試案例237
102Testrpc/Ganache測試環(huán)境239
103Truffle Debugger241
1031調試界面241
1032增加和刪除斷點242
1033如何調試交易243
1034調試一個食物購物車的合約243
104Remix調試251
105其他工具254
1051JEB254
1052Prosity254
1053Binary Ninja255
參考文獻257