本書從零開始介紹Solidity程式開發,從Solidity語言中基礎的關鍵字和語句開始介紹,逐步深入到高級應用,包括設計模式、合約可升級的設計、合約的安全性問題及對策等,並結合EVM的實現,討論Solidity語句的彙編實現;對一些原理的講解,提供了相對應的實例,以期更易於理解原理的實現機理;同時,對Solidity應用於DApp開發,及使用區塊鏈上的去中心化存儲(IPFS)也有詳細的介紹。
本書可作為對區塊鏈感興趣的程式開發人員、高校師生等的參考書,也可作為相關課程的培訓教材。
目錄
前言
第1章乙太坊簡介1
1 .1乙太坊1
1 .1 .1不對稱加密體系2
1 .1 .2密碼學雜湊函數4
1 .1 .3對稱點對點網路4
1 .1 .4區塊鏈4
1 .1 .5乙太坊虛擬機器5
1 .1 .6節點5
1 .1 .7礦工5
1 .1 .8工作量證明6
1 .1 .9去中心化應用6
1 .1 .10Solidity6
1 .2智能合約6
1 .3燃料7
1 .3 .1為什麼需要燃料?8
1 .3 .2燃料組成8
1 .4ether9
1 .5帳戶9
1 .6交易10
第2章預備知識11
2 .1簡單的例子11
2 .2工具準備12
2 .2 .1程式設計環境準備12
2 .2 .2程式設計工具準備16
2 .2 .3區塊鏈流覽器26
2 .3測試環境26
2 .3 .1MetaMask訪問測試環境27
2 .3 .2測試環境領取測試用幣27
2 .3 .3開發時連接測試環境28
2 .4乙太坊源碼編譯29
第3章Solidity程式設計基礎31
3 .1sol檔結構31
3 .1 .1編譯開關31
3 .1 .2引用其他原始檔案31
3 .1 .3注釋31
3 .1 .4合約32
3 .1 .5庫32
3 .1 .6介面33
3 .2合約檔結構33
3 .3變數類型33
3 .3 .1數值型別34
3 .3 .2參考類型35
3 .3 .3字典/映射37
3 .3 .4特殊情況37
3 .4操作符38
3 .5語句39
3 .5 .1條件陳述式39
3 .5 .2迴圈語句40
3 .5 .3其他40
3 .6修飾符40
3 .6 .1標準修飾符40
3 .6 .2自訂修飾符44
3 .7資料位置46
3 .8事件47
3 .8 .1智慧合約返回值給使用者介面48
3 .8 .2非同步的帶資料的觸發器49
3 .8 .3一種比較便宜的存儲49
3 .8 .4事件裡的Indexed參數50
3 .9繼承51
3 .9 .1單繼承51
3 .9 .2多重繼承51
3 .10其他52
3 .10 .1內置52
3 .10 .2特殊單位54
3 .10 .3類型轉換及推斷55
3 .10 .4異常56
3 .10 .5彙編56
第4章Solidity程式設計的高級話題59
4 .1This關鍵字59
4 .2ERC20標準介面59
4 .2 .1方法61
4 .2 .2事件62
4 .2 .3OpenZepplin框架62
4 .3ERC721標準介面63
4 .3 .1ERC721介面定義63
4 .3 .2中繼資料擴展75
4 .3 .3可枚舉擴展77
4 .3 .4ERC165標準81
4 .4合約間調用82
4 .4 .1函式呼叫82
4 .4 .2依賴注入84
4 .4 .3消息調用84
4 .4 .4獲取合約間調用的返回值88
4 .5基礎演算法90
4 .6用Go與合約交互93
4 .6 .1創建項目93
4 .6 .2創建一個簡單的乙太坊合約93
4 .6 .3用Go訪問乙太坊合約94
4 .6 .4本地測試94
4 .6 .5連接到一個乙太坊節點98
4 .6 .6為帳戶創建加密的JSON鑰匙98
4 .6 .7最後驗證98
第5章ABI介面102
5 .1記憶體結構102
5 .2函數選擇子102
5 .3類型的定義102
5 .4EVM裡的資料表示103
5 .4 .1固定長度資料類型的表示104
5 .4 .2動態長度資料類型的表示105
5 .5編碼108
5 .5 .1簡單的例子108
5 .5 .2外部調用例子109
5 .5 .3外部方法調用的ABI編碼112
5 .6基於ABI的程式設計116
第6章智慧合約運行原理118
6 .1設計模式118
6 .1 .1合約自毀118
6 .1 .2工廠合約模式119
6 .1 .3名字登錄120
6 .1 .4映射反覆運算121
6 .1 .5撤出模式122
6 .2省燃料122
6 .2 .1注意資料類型123
6 .2 .2以位元組編碼的形式存儲值123
6 .2 .3利用SOLC編譯器壓縮變數123
6 .2 .4使用彙編代碼壓縮變數124
6 .2 .5合併函數參數125
6 .2 .6使用默克爾樹證明減少存儲成本125
6 .2 .7無狀態的合約127
6 .2 .8在IPFS上存儲資料127
6 .2 .9位壓縮127
6 .2 .10批次處理128
6 .2 .11Storage結構類型讀寫分離129
6 .2 .12uint256和直接記憶體存儲130
6 .2 .13彙編代碼優化130
6 .3彙編代碼130
6 .3 .1棧131
6 .3 .2調用數據131
6 .3 .3記憶體132
6 .3 .4存儲133
6 .4解構智能合約134
6 .4 .1合約創建138
6 .4 .2合約本體通用部分141
6 .4 .3合約本體特定代碼145
第7章可升級的合約147
7 .1方法147
7 .1 .1代理合約147
7 .1 .2分離邏輯和資料147
7 .1 .3通過鍵值對來分離資料和邏輯147
7 .1 .4部分升級148
7 .1 .5比較148
7 .1 .6簡單的代理合約例子148
7 .2通用的代理模式150
7 .3Storage154
7 .3 .1繼承存儲154
7 .3 .2永久存儲154
7 .3 .3非結構化存儲155
7 .4Augur156
7 .4 .1合約部署156
7 .4 .2存儲部署157
7 .5Colony158
7 .5 .1存儲部署158
7 .5 .2合約部署159
7 .6總結159
第8章編寫安全的合約161
8 .1乙太坊已知常見漏洞 161
8 .1 .1上溢和下溢161
8 .1 .2Solidity可見性修飾符的差別165
8 .1 .3重入問題166
8 .1 .4出乎意料的ether操作170
8 .1 .5代理調用174
8 .1 .6默認可見性修飾符178
8 .1 .7熵隨機源180
8 .1 .8外部合約引用180
8 .1 .9短地址/參數攻擊184
8 .1 .10未驗證的CALL返回值185
8 .1 .11競爭條件186
8 .1 .12阻塞攻擊188
8 .1 .13操縱塊時間戳記190
8 .1 .14謹慎使用構造函數191
8 .1 .15未初始化的存儲指標192
8 .1 .16浮點數精度193
8 .1 .17交易授權194
8 .2乙太坊一些奇怪的特性195
8 .2 .1沒有Key的ether195
8 .2 .2一次性地址197
8 .2 .3一個交易的空投197
8 .3乙太坊智慧合約——最佳安全開發指南198
8 .3 .1儘早且明確的暴露問題198
8 .3 .2在支付時使用(pull)模式而不是(push)模式199
8 .3 .3函數代碼的順序:條件,行為,交互200
8 .3 .4留意平臺局限性201
8 .3 .5測試用例203
8 .3 .6容錯及自動
第1章乙太坊簡介1
1 .1乙太坊1
1 .1 .1不對稱加密體系2
1 .1 .2密碼學雜湊函數4
1 .1 .3對稱點對點網路4
1 .1 .4區塊鏈4
1 .1 .5乙太坊虛擬機器5
1 .1 .6節點5
1 .1 .7礦工5
1 .1 .8工作量證明6
1 .1 .9去中心化應用6
1 .1 .10Solidity6
1 .2智能合約6
1 .3燃料7
1 .3 .1為什麼需要燃料?8
1 .3 .2燃料組成8
1 .4ether9
1 .5帳戶9
1 .6交易10
第2章預備知識11
2 .1簡單的例子11
2 .2工具準備12
2 .2 .1程式設計環境準備12
2 .2 .2程式設計工具準備16
2 .2 .3區塊鏈流覽器26
2 .3測試環境26
2 .3 .1MetaMask訪問測試環境27
2 .3 .2測試環境領取測試用幣27
2 .3 .3開發時連接測試環境28
2 .4乙太坊源碼編譯29
第3章Solidity程式設計基礎31
3 .1sol檔結構31
3 .1 .1編譯開關31
3 .1 .2引用其他原始檔案31
3 .1 .3注釋31
3 .1 .4合約32
3 .1 .5庫32
3 .1 .6介面33
3 .2合約檔結構33
3 .3變數類型33
3 .3 .1數值型別34
3 .3 .2參考類型35
3 .3 .3字典/映射37
3 .3 .4特殊情況37
3 .4操作符38
3 .5語句39
3 .5 .1條件陳述式39
3 .5 .2迴圈語句40
3 .5 .3其他40
3 .6修飾符40
3 .6 .1標準修飾符40
3 .6 .2自訂修飾符44
3 .7資料位置46
3 .8事件47
3 .8 .1智慧合約返回值給使用者介面48
3 .8 .2非同步的帶資料的觸發器49
3 .8 .3一種比較便宜的存儲49
3 .8 .4事件裡的Indexed參數50
3 .9繼承51
3 .9 .1單繼承51
3 .9 .2多重繼承51
3 .10其他52
3 .10 .1內置52
3 .10 .2特殊單位54
3 .10 .3類型轉換及推斷55
3 .10 .4異常56
3 .10 .5彙編56
第4章Solidity程式設計的高級話題59
4 .1This關鍵字59
4 .2ERC20標準介面59
4 .2 .1方法61
4 .2 .2事件62
4 .2 .3OpenZepplin框架62
4 .3ERC721標準介面63
4 .3 .1ERC721介面定義63
4 .3 .2中繼資料擴展75
4 .3 .3可枚舉擴展77
4 .3 .4ERC165標準81
4 .4合約間調用82
4 .4 .1函式呼叫82
4 .4 .2依賴注入84
4 .4 .3消息調用84
4 .4 .4獲取合約間調用的返回值88
4 .5基礎演算法90
4 .6用Go與合約交互93
4 .6 .1創建項目93
4 .6 .2創建一個簡單的乙太坊合約93
4 .6 .3用Go訪問乙太坊合約94
4 .6 .4本地測試94
4 .6 .5連接到一個乙太坊節點98
4 .6 .6為帳戶創建加密的JSON鑰匙98
4 .6 .7最後驗證98
第5章ABI介面102
5 .1記憶體結構102
5 .2函數選擇子102
5 .3類型的定義102
5 .4EVM裡的資料表示103
5 .4 .1固定長度資料類型的表示104
5 .4 .2動態長度資料類型的表示105
5 .5編碼108
5 .5 .1簡單的例子108
5 .5 .2外部調用例子109
5 .5 .3外部方法調用的ABI編碼112
5 .6基於ABI的程式設計116
第6章智慧合約運行原理118
6 .1設計模式118
6 .1 .1合約自毀118
6 .1 .2工廠合約模式119
6 .1 .3名字登錄120
6 .1 .4映射反覆運算121
6 .1 .5撤出模式122
6 .2省燃料122
6 .2 .1注意資料類型123
6 .2 .2以位元組編碼的形式存儲值123
6 .2 .3利用SOLC編譯器壓縮變數123
6 .2 .4使用彙編代碼壓縮變數124
6 .2 .5合併函數參數125
6 .2 .6使用默克爾樹證明減少存儲成本125
6 .2 .7無狀態的合約127
6 .2 .8在IPFS上存儲資料127
6 .2 .9位壓縮127
6 .2 .10批次處理128
6 .2 .11Storage結構類型讀寫分離129
6 .2 .12uint256和直接記憶體存儲130
6 .2 .13彙編代碼優化130
6 .3彙編代碼130
6 .3 .1棧131
6 .3 .2調用數據131
6 .3 .3記憶體132
6 .3 .4存儲133
6 .4解構智能合約134
6 .4 .1合約創建138
6 .4 .2合約本體通用部分141
6 .4 .3合約本體特定代碼145
第7章可升級的合約147
7 .1方法147
7 .1 .1代理合約147
7 .1 .2分離邏輯和資料147
7 .1 .3通過鍵值對來分離資料和邏輯147
7 .1 .4部分升級148
7 .1 .5比較148
7 .1 .6簡單的代理合約例子148
7 .2通用的代理模式150
7 .3Storage154
7 .3 .1繼承存儲154
7 .3 .2永久存儲154
7 .3 .3非結構化存儲155
7 .4Augur156
7 .4 .1合約部署156
7 .4 .2存儲部署157
7 .5Colony158
7 .5 .1存儲部署158
7 .5 .2合約部署159
7 .6總結159
第8章編寫安全的合約161
8 .1乙太坊已知常見漏洞 161
8 .1 .1上溢和下溢161
8 .1 .2Solidity可見性修飾符的差別165
8 .1 .3重入問題166
8 .1 .4出乎意料的ether操作170
8 .1 .5代理調用174
8 .1 .6默認可見性修飾符178
8 .1 .7熵隨機源180
8 .1 .8外部合約引用180
8 .1 .9短地址/參數攻擊184
8 .1 .10未驗證的CALL返回值185
8 .1 .11競爭條件186
8 .1 .12阻塞攻擊188
8 .1 .13操縱塊時間戳記190
8 .1 .14謹慎使用構造函數191
8 .1 .15未初始化的存儲指標192
8 .1 .16浮點數精度193
8 .1 .17交易授權194
8 .2乙太坊一些奇怪的特性195
8 .2 .1沒有Key的ether195
8 .2 .2一次性地址197
8 .2 .3一個交易的空投197
8 .3乙太坊智慧合約——最佳安全開發指南198
8 .3 .1儘早且明確的暴露問題198
8 .3 .2在支付時使用(pull)模式而不是(push)模式199
8 .3 .3函數代碼的順序:條件,行為,交互200
8 .3 .4留意平臺局限性201
8 .3 .5測試用例203
8 .3 .6容錯及自動
網路書店
類別
折扣
價格
-
新書87折$308