這是一部能指導(dǎo)讀者從入門到進(jìn)階的以太坊智能合約開發(fā)指南。HiBlock區(qū)塊鏈技術(shù)社區(qū)官方出品,4位區(qū)塊鏈技術(shù)專家聯(lián)合撰寫。
從開發(fā)工具與生態(tài)、編程語言(Solidity)、編寫方法、實(shí)踐、以太坊虛擬機(jī)、合約安全、軟件工程等維度全景呈現(xiàn)以太坊智能合約開發(fā)的各個(gè)方面。更重要的是,以實(shí)戰(zhàn)為導(dǎo)向,包含若干個(gè)翔實(shí)、完整的DApp案例講解。
全書共12章,分為4個(gè)部分:
準(zhǔn)備篇(第1~2章) 介紹了以太坊的必備常識(shí)、基礎(chǔ)交互和開發(fā)工具套件。
基礎(chǔ)篇(第3~6章) 詳細(xì)講解了智能合約開發(fā)語言 Solidity 的所有語法和編寫合約的基本方法,同時(shí)也介紹了編譯器和 Solidity 集成開發(fā)工具的使用。
進(jìn)階篇(第7~10章) 首先詳細(xì)講解了以太坊協(xié)議的細(xì)節(jié)和以太坊虛擬機(jī)的實(shí)現(xiàn)原理和架構(gòu)設(shè)計(jì);然后講解了用于以太坊虛擬機(jī)函數(shù)調(diào)用的應(yīng)用二進(jìn)制編碼的細(xì)節(jié),以及公共基礎(chǔ)合約庫 openzeppelin-solidity 的源碼實(shí)現(xiàn);*后為智能合約的安全開發(fā)提供了經(jīng)驗(yàn)性的指導(dǎo),有極高的參考價(jià)值。
實(shí)戰(zhàn)篇(第11~12章) 結(jié)合若干 DApp 實(shí)例講解了如何基于智能合約來構(gòu)造可用的去中性化應(yīng)用程序。這部分內(nèi)容可以幫助開發(fā)者快速上手構(gòu)建基于以太坊的新一代互聯(lián)網(wǎng)應(yīng)用程序。
本書的附錄中還包含了對(duì)以太坊協(xié)議中涉及的部分基礎(chǔ)算法、以太坊虛擬機(jī)的費(fèi)用設(shè)計(jì)和指令設(shè)計(jì)、 Solidity 內(nèi)聯(lián)匯編等的簡單介紹。
推薦序
贊譽(yù)
前言
第一部分 準(zhǔn)備篇
第1章 快速了解以太坊2
1.1 以太坊是什么2
1.2 以太坊的歷史和發(fā)展路線圖5
1.3 以太坊的基本概念8
1.3.1 賬戶(accounts)8
1.3.2 合約(contracts)9
1.3.3 交易(transaction)和消息(message)9
1.3.4 氣(gas)10
1.4 以太幣(ether)12
1.4.1 以太幣的發(fā)行12
1.4.2 以太幣的單位13
1.4.3 以太坊挖礦13
1.5 以太坊測試網(wǎng)絡(luò)13
1.6 以太坊客戶端14
1.7 以太坊生態(tài)系統(tǒng)全景掃描15
1.7.1 Swarm15
1.7.2 ENS15
1.7.3 Whisper16
1.7.4 其他相關(guān)項(xiàng)目16
1.8 本章小結(jié)17
第2章 以太坊基礎(chǔ)交互及基礎(chǔ)開發(fā)工具詳解18
2.1 以太坊客戶端的下載、安裝及簡介18
2.1.1 Geth下載18
2.1.2 Geth安裝19
2.1.3 Geth啟動(dòng)與數(shù)據(jù)目錄結(jié)構(gòu)20
2.1.4 網(wǎng)絡(luò)環(huán)境分類20
2.2 核心命令和參數(shù)解析21
2.2.1 如何獲得命令及參數(shù)21
2.2.2 常見基礎(chǔ)操作命令22
2.2.3 常見web3j交互命令23
2.3 Remix詳解26
2.3.1 Remix簡介26
2.3.2 Remix實(shí)戰(zhàn)27
2.4 本章小結(jié)32
第二部分 基礎(chǔ)篇
第3章 智能合約開發(fā)語言Solidity基礎(chǔ)34
3.1 智能合約與Solidity簡介34
3.2 Solidity基礎(chǔ)語法35
3.2.1 版本雜注35
3.2.2 import的用法35
3.2.3 代碼注釋36
3.2.4 數(shù)據(jù)類型36
3.2.5 全局變量52
3.2.6 表達(dá)式和控制結(jié)構(gòu)55
3.3 Solidity語言速查表63
3.4 Solidity源代碼書寫風(fēng)格68
3.5 本章小結(jié)82
第4章 Solidity編譯器83
4.1 安裝Solidity編譯器83
4.1.1 直接獲取可執(zhí)行程序包83
4.1.2 從源代碼編譯構(gòu)建84
4.1.3 Solidity編譯器版本號(hào)詳解86
4.2 使用Solidity編譯器87
4.2.1 命令行編譯器87
4.2.2 編譯器輸入、輸出的JSON描述88
4.3 合約元數(shù)據(jù)93
4.4 本章小結(jié)96
第5章 Solidity智能合約編寫97
5.1 創(chuàng)建智能合約97
5.2 可見性控制99
5.3 getter函數(shù)100
5.4 函數(shù)修飾器102
5.5 狀態(tài)常量104
5.6 函數(shù)104
5.6.1 view函數(shù)105
5.6.2 pure函數(shù)105
5.6.3 fallback函數(shù)106
5.6.4 函數(shù)重載107
5.7 事件108
5.8 繼承110
5.8.1 基類構(gòu)造函數(shù)110
5.8.2 多重繼承111
5.8.3 線性化114
5.9 抽象智能合約114
5.10 接口115
5.11 庫116
5.12 using for的用法119
5.13 本章小結(jié)121
第6章 Solidity集成開發(fā)工具簡介122
6.1 Truffle122
6.1.1 Truffle簡介122
6.1.2 快速體驗(yàn)123
6.1.3 用Truffle的開發(fā)過程124
6.1.4 Truffle高級(jí)用法134
6.2 Embark136
6.2.1 Embark安裝137
6.2.2 Embark快速開始138
6.2.3 Embark常規(guī)用法139
6.2.4 智能合約的配置與調(diào)用143
6.2.5 Embark去中心化存儲(chǔ)145
6.2.6 Embark去中心化通信148
6.3 其他工具(Remix)149
6.3.1 Solidity編輯與編譯149
6.3.2 Solidity合約部署150
6.4 本章小結(jié)151
第三部分 進(jìn)階篇
第7章 深入理解以太坊虛擬機(jī)154
7.1 區(qū)塊鏈范式154
7.2 狀態(tài)、交易、收據(jù)和區(qū)塊155
7.2.1 狀態(tài)155
7.2.2 交易156
7.2.3 收據(jù)157
7.2.4 區(qū)塊158
7.2.5 以太坊基礎(chǔ)數(shù)據(jù)結(jié)構(gòu)匯總160
7.2.6 理解gas161
7.3 交易執(zhí)行162
7.4 執(zhí)行模型—以太坊虛擬機(jī)163
7.4.1 EVM概述164
7.4.2 EVM基礎(chǔ)操作碼164
7.4.3 EVM代碼的執(zhí)行166
7.5 合約創(chuàng)建167
7.6 消息調(diào)用168
7.7 區(qū)塊定稿170
7.8 本章小結(jié)172
第8章 應(yīng)用二進(jìn)制接口174
8.1 函數(shù)選擇器174
8.2 參數(shù)編碼175
8.2.1 類型的規(guī)范表達(dá)175
8.2.2 編碼的形式化說明176
8.2.3 編碼實(shí)例178
8.3 動(dòng)態(tài)類型的使用180
8.4 事件184
8.5 合約接口的JSON描述185
8.6 處理元組類型186
8.7 非標(biāo)準(zhǔn)打包模式188
8.8 本章小結(jié)189
第9章 OpenZeppelin源代碼詳解190
9.1 通用基礎(chǔ)合約191
9.1.1 地址工具(AddressUtils.sol)191
9.1.2 橢圓曲線簽名操作(ECRecovery.sol)192
9.1.3 限制子合約的余額(LimitBalance.sol)194
9.1.4 Merkle證明(Merkle-Proof.sol)195
9.1.5 拒絕重入(Reentrancy-Guard.sol)196
9.2 算術(shù)運(yùn)算197
9.2.1 基本算術(shù)(Math.sol)197
9.2.2 安全算術(shù)(SafeMath.sol)198
9.3 自。╥ntrospection)200
9.3.1 ERC165(ERC165.sol)200
9.3.2 接口查找基礎(chǔ)合約(Supports-InterfaceWithLookup.sol)201
9.4 歸屬權(quán)(用戶權(quán)限)202
9.4.1 歸屬權(quán)(Ownable.sol)202
9.4.2 用戶角色(Roles.sol)204
9.4.3 基于角色的訪問控制(RBAC.sol)205
9.4.4 超級(jí)用戶(Superuser.sol)208
9.4.5 聯(lián)系方式(Contactable.sol)210
9.4.6 歸屬權(quán)轉(zhuǎn)移請(qǐng)求(Claimable.sol)210
9.4.7 有時(shí)限的歸屬權(quán)轉(zhuǎn)移請(qǐng)求(DelayedClaimable.sol)211
9.4.8 歸屬權(quán)繼承(Heritable.sol)212
9.4.9 合約不歸屬于合約(HasNoContracts.sol)215
9.4.10 合約不持有以太幣(HasNoEther.sol)216
9.4.11 合約可找回token(Can-ClaimToken.sol)218
9.4.12 合約不持有token(HasNo-Tokens.sol)218
9.4.13 合約什么都不持有(NoOwner.sol)219
9.5 訪問控制220
9.5.1 簽名保鏢(Signature-Bouncer.sol)220
9.5.2 白名單(Whitelist.sol)224
9.6 生命周期226
9.6.1 可自毀(Destructible.sol)226
9.6.2 可暫停運(yùn)作(Pausable.sol)227
9.6.3 token可自毀(Token-Destructible.sol)228
9.7 支付和懸賞230
9.7.1 托管(Escrow.sol)230
9.7.2 條件托管(Conditional-Escrow.sol)231
9.7.3 退還托管(Refund-Escrow.sol)232
9.7.4 費(fèi)用支付(PullPayment.sol)233
9.7.5 分割付款(SplitPayment.sol)235
9.7.6 懸賞(Bounty.sol)237
9.8 ERC20239
9.8.1 ERC20Basic(ERC20Basic.sol)240
9.8.2 BasicToken(BasicToken.sol)240
9.8.3 ERC20(ERC20.sol)241
9.8.4 SafeERC20(SafeERC20.sol)243
9.8.5 ERC20詳情(Detailed-ERC20.sol)244
9.8.6 標(biāo)準(zhǔn)token(Standard-Token.sol)244
9.8.7 可銷毀的token(BurnableToken.sol)247
9.8.8 可銷毀的標(biāo)準(zhǔn)token(StandardBurnableToken.sol)248
9.8.9 可暫停的標(biāo)準(zhǔn)token(PauseableToken.sol)249
9.8.10 可增發(fā)的標(biāo)準(zhǔn)token(MintableToken.sol)250
9.8.11 有增發(fā)上限的標(biāo)準(zhǔn)token(CappedToken.sol)252
9.8.12 可授權(quán)增發(fā)的標(biāo)準(zhǔn)token(RBACMintableToken.sol)252
9.8.13 鎖定token的提。═okenTimelock.sol)254
9.8.14 定期發(fā)放token(Token-Vesting.sol)255
9.9 Crowdsale258
9.9.1 Crowdsale(Crowdsale.sol)258
9.9.2 有上限的Crowdsale(CappedCrowdsale.sol)263
9.9.3 有獨(dú)立上限的Crowdsale(IndividuallyCapped-Crowdsale.sol)264
9.9.4 有時(shí)限的Crowdsale(TimedCrowdsale.sol)266
9.9.5 有白名單的Crowdsale(WhitedlistedCrowdsale.sol)268
9.9.6 自動(dòng)漲價(jià)的Crowdsale(IncreasingPriceCrowdsale.sol)269
9.9.7 可增發(fā)的Crowdsale(MintedCrowdsale.sol)270
9.9.8 有額度的Crowdsale(AllowanceCrowdsale.sol)271
9.9.9 有完結(jié)處理的Crowdsale(FinalizableCrowdsale.sol)272
9.9.10 后發(fā)送token的Crowdsale(PostDeliveryCrowdsale.sol)273
9.9.11 退款庫(RefundVault.sol)274
9.9.12 可退款的Crowdsale(RefundableCrowdsale.sol)276
9.10 ERC721278
9.10.1 ERC721Basic(ERC721Basic.sol)278
9.10.2 ERC721(ERC721.sol)281
9.10.3 ERC721Receiver(ERC721Receiver.sol)282
9.10.4 ERC721Holder(ERC721Holder.sol)283
9.10.5 ERC721BasicToken(ERC721BasicToken.sol)284
9.10.6 ERC721Token(ERC721Token.sol)292
9.11 本章小結(jié)298
第10章 智能合約安全編碼指南299
10.1 已知的攻擊299
10.1.1 重入299
10.1.2 算術(shù)溢出303
10.1.3 意外之財(cái)305
10.1.4 delegatecall308
10.1.5 默認(rèn)的可見性313
10.1.6 隨機(jī)錯(cuò)覺313
10.1.7 外部智能合約引用315
10.1.8 短地址/參數(shù)攻擊316
10.1.9 未檢查的返回值317
10.1.10 競爭條件/預(yù)先交易317
10.1.11 拒絕服務(wù)318
10.1.12 時(shí)間戳操縱320
10.1.13 未初始化的存儲(chǔ)指針320
10.1.14 浮點(diǎn)和數(shù)據(jù)精度321
10.1.15 tx.origin判定322
10.2 智能合約開發(fā)最佳實(shí)踐323
10.2.1 智能合約安全開發(fā)的基本理念323
10.2.2 智能合約設(shè)計(jì)開發(fā)中的基本權(quán)衡324
10.2.3 使用Solidity進(jìn)行智能合約開發(fā)的部分最佳實(shí)踐325
10.2.4 軟件工程上的考量329
10.3 智能合約安全開發(fā)輔助工具331
10.4 安全信息/安全通知渠道332
10.5 本章小結(jié)332
第四部分 實(shí)戰(zhàn)篇
第11章 Java版本DApp完整示例336
11.1 DApp智能合約的編寫及發(fā)布336
11.1.1 DApp智能合約336
11.1.2 智能合約發(fā)布337
11.2 環(huán)境配置337
11.2.1 逆向生成代碼338
11.2.2 創(chuàng)建Java項(xiàng)目與功能驗(yàn)證339
11.3 本章小結(jié)341
第12章 DApp示例—寵物店342
12.1 環(huán)境準(zhǔn)備343
12.2 創(chuàng)建項(xiàng)目343
12.3 編寫智能合約343
12.3.1 創(chuàng)建智能合約文件344
12.3.2 定義變量344
12.3.3 領(lǐng)養(yǎng)方法344
12.3.4 查詢領(lǐng)養(yǎng)者的方法344
12.4 編譯部署合約345
12.4.1 編譯合約345
12.4.2 部署合約345
12.5 智能合約測試347
12.5.1 測試adopt()方法347
12.5.2 測試獲取單個(gè)寵物的領(lǐng)養(yǎng)者348
12.5.3 測試獲取所有寵物的領(lǐng)養(yǎng)者348
12.5.4 運(yùn)行測試348
12.6 前端代碼編號(hào)349
12.6.1 初始化Web3349
12.6.2 初始化合約349
12.6.3 獲取領(lǐng)養(yǎng)的寵物并更新界面350
12.6.4 處理adopt()方法350
12.7 瀏覽器中與DApp交互350
12.7.1 安裝配置MetaMask351
12.7.2 DApp交互352
12.8 本章小結(jié)354
附錄A Merkle Patricia Tree355
A.1 MPT中的節(jié)點(diǎn)類型355
A.2 十六進(jìn)制前綴編碼356
A.3 樹的示例356
附錄B 遞歸長度前綴編碼359
附錄C EVM中的費(fèi)用設(shè)計(jì)和操作碼設(shè)計(jì)361
附錄D Solidity匯編語言367
D.1 內(nèi)聯(lián)匯編庫合約實(shí)例368
D.2 內(nèi)聯(lián)匯編語言特性370
D.3 獨(dú)立匯編378
D.4 匯編語法380