本書系統(tǒng)地介紹區(qū)塊鏈設計原理和開發(fā)技術(shù),包含公鏈的整體架構(gòu)和開發(fā)細節(jié),主要內(nèi)容包括:第1章介紹公鏈設計架構(gòu);第2~4章介紹比原鏈的交互工具、核心進程bytomd,以及API Server實現(xiàn)原理和接口設計。第5章和第6章詳細介紹區(qū)塊鏈核心部分,包括區(qū)塊、區(qū)塊鏈、交易的核心數(shù)據(jù)結(jié)構(gòu),以及UTXO模型、隔離見證、交易腳本、驗證等技術(shù)概念的實現(xiàn)。第7章和第8章講解比原鏈智能合約以及智能合約在BVM虛擬機上運行的過程。第9章和第10章介紹區(qū)塊鏈錢包的設計與交易流程,包括密鑰、賬戶、資產(chǎn)管理、交易管理等,還詳解了區(qū)塊鏈P2P分布式網(wǎng)絡實現(xiàn)原理。第11~13章介紹數(shù)據(jù)存儲、共識算法,以及挖礦相關(guān)的概念和流程。第14章展望了區(qū)塊鏈技術(shù)未來的發(fā)展趨勢。
本書全面詳盡地剖析了公鏈整個技術(shù)棧,涵蓋公鏈設計原理、系統(tǒng)架構(gòu)、底層模型、數(shù)據(jù)結(jié)構(gòu)與算法、編程環(huán)境、上層應用開發(fā)等主題,內(nèi)容深入淺出。在揭示這些技術(shù)原理的過程中,作者不滿足于淺嘗輒止,而是深入到參數(shù)解析,使本書除了作為知識學習之外,更成為一本實操的參考書籍。
2008年由中本聰?shù)谝淮翁岢隽藚^(qū)塊鏈的概念,在隨后的幾年中,區(qū)塊鏈成為了電子貨幣比特幣的核心組成部分:作為所有交易的公共賬簿。2017年筆者的很多朋友已經(jīng)在關(guān)注區(qū)塊鏈技術(shù)領(lǐng)域,筆者也在各種技術(shù)峰會上分享過多次區(qū)塊鏈技術(shù)實現(xiàn)細節(jié),在線上也組織了幾個區(qū)塊鏈技術(shù)群。筆者發(fā)現(xiàn)有相當多的朋友詢問如何深入學習區(qū)塊鏈實現(xiàn)技術(shù),但目前市面上很多的資料都僅介紹區(qū)塊鏈上的某部分技術(shù),比如加密貨幣交易、智能合約開發(fā)等,并沒有完整介紹公鏈的技術(shù)實現(xiàn)。在一次技術(shù)峰會演講后與北京郵電大學區(qū)塊鏈實驗室的老師交流,受到陳萍老師的鼓勵,想到編寫一本系統(tǒng)性介紹公鏈開發(fā)的書籍,對學習區(qū)塊鏈的初學者會有幫助,于是便開始組織本書的寫作。
本書的目標是引導讀者全面了解區(qū)塊鏈技術(shù)實現(xiàn)原理,筆者也一直堅信,了解某一系統(tǒng)最直接的方式就是研讀它的源碼,所以本書并不是只介紹區(qū)塊鏈技術(shù),而是深入分析其背后的實現(xiàn)原理。通過閱讀本書,讀者可以全面地了解一條公鏈的技術(shù)實現(xiàn)。本書基于比原鏈的源代碼進行分析,比原鏈是一個開源的有智能合約功能的公共區(qū)塊鏈平臺,是國內(nèi)優(yōu)秀的公鏈,目前比原鏈的代碼量不多,而且源碼結(jié)構(gòu)清晰,特別適合初學者學習。
本書主要內(nèi)容包括:
第1章介紹公鏈設計架構(gòu),使讀者能夠宏觀地了解區(qū)塊鏈技術(shù)架構(gòu)。
第2章介紹比原鏈相關(guān)的交互工具,包括交互工具的操作及代碼實現(xiàn)。
第3章介紹比原鏈的核心進程bytomd,包括啟動過程中的初始化等操作。
第4章介紹API Server實現(xiàn)及原理。詳解HTTP請求的完整生命周期,并介紹區(qū)塊鏈相關(guān)的API接口設計。
第5章和第6章詳細介紹區(qū)塊鏈核心部分,包括區(qū)塊、區(qū)塊鏈、交易的核心數(shù)據(jù)結(jié)構(gòu),以及UTXO模型、隔離見證、交易腳本、驗證等概念的實現(xiàn)。
第7章和第8章詳細講解比原鏈智能合約以及智能合約在BVM虛擬機上運行的過程。
第9章介紹區(qū)塊鏈錢包的基本概念,包括密鑰、賬戶、資產(chǎn)管理、交易管理等,以及錢包的備份和恢復方式。
第10章詳解區(qū)塊鏈P2P分布式網(wǎng)絡實現(xiàn)原理,以及Kademlia結(jié)構(gòu)化網(wǎng)絡算法的實現(xiàn)。
第11章介紹數(shù)據(jù)持久化存儲,以及區(qū)塊與交易的緩存和存儲過程。
第12章和第13章詳解PoW與PoS共識機制以及挖礦相關(guān)的概念和流程。
第14章介紹區(qū)塊鏈技術(shù)未來的發(fā)展趨勢,我們相信區(qū)塊鏈能夠為人類做出重大貢獻。
本書適合區(qū)塊鏈開發(fā)者、Go語言開發(fā)者閱讀。由于時間與水平比較有限,我們在編寫本書時也難免會出現(xiàn)一些紕漏和錯誤。讀者可以隨時通過郵箱weilandeshanhuhai@126.com與我們聯(lián)系,希望和大家一起學習與討論區(qū)塊鏈技術(shù)。
本書在寫作過程中得到很多人的幫助,特別是郜策宇、陸志亞、王慶華、朱益祺、陽勝、林浩宇,在此深表感謝。尤其感謝比原鏈技術(shù)團隊設計了這樣一個優(yōu)秀的公鏈,給區(qū)塊鏈社區(qū)做出了貢獻。
鄭東旭
2019年3月14日
推薦序一
推薦序二
前言
第1章 公鏈設計架構(gòu)1
1.1 概述1
1.2 公鏈總體架構(gòu)2
1.3 比原鏈各模塊功能2
1.3.1 用戶交互層2
1.3.2 接口層4
1.3.3 內(nèi)核層4
1.3.4 錢包層6
1.3.5 共識層6
1.3.6 數(shù)據(jù)存儲層7
1.3.7 P2P分布式網(wǎng)絡8
1.4 編譯部署及應用9
1.5 本章小結(jié)12
第2章 交互工具13
2.1 概述13
2.2 bytomcli交互工具13
2.2.1 bytomcli命令flag參數(shù)13
2.2.2 使用bytomcli查看節(jié)點狀態(tài)信息15
2.2.3 bytomcli運行案例16
2.3 dashboard交互工具21
2.3.1 使用dashboard發(fā)送一筆交易22
2.3.2 使用dashboard開啟挖礦模式22
2.4 本章小結(jié)24
第3章 守護進程的初始化與運行25
3.1 概述25
3.2 bytomd守護進程初始化流程及命令參數(shù)25
3.3 bytomd守護進程的初始化實現(xiàn)27
3.3.1 Node對象28
3.3.2 配置初始化29
3.3.3 創(chuàng)建文件鎖32
3.3.4 初始化網(wǎng)絡類型33
3.3.5 初始化數(shù)據(jù)庫(持久化存儲)35
3.3.6 初始化交易池35
3.5.7 創(chuàng)建一條本地區(qū)塊鏈36
3.3.8 初始化本地錢包37
3.3.9 初始化網(wǎng)絡同步管理37
3.3.10 初始化Pprof性能分析工具38
3.3.11 初始化CPU挖礦功能38
3.4 bytomd守護進程的啟動方式和停止方式39
3.5 本章小結(jié)40
第4章 接口層41
4.1 概述41
4.2 實現(xiàn)一個簡易HTTP Server41
4.3 API Server創(chuàng)建HTTP服務42
4.3.1 創(chuàng)建API對象42
4.3.2 創(chuàng)建路由項43
4.3.3 實例化http.Server44
4.3.4 啟動API Server45
4.3.5 接收并響應請求45
4.4 HTTP請求的完整生命周期47
4.5 比原鏈API接口描述48
4.6 API接口調(diào)用工具50
4.6.1 使用curl命令行調(diào)用API接口50
4.6.2 使用Postman調(diào)用API接口50
4.7 比原鏈HTTP錯誤碼一覽51
4.8 本章小結(jié)52
第5章 內(nèi)核層:區(qū)塊與區(qū)塊鏈53
5.1 概述53
5.2 區(qū)塊53
5.2.1 區(qū)塊的數(shù)據(jù)結(jié)構(gòu)53
5.2.2 區(qū)塊頭的數(shù)據(jù)結(jié)構(gòu)54
5.2.3 區(qū)塊標識符55
5.2.4 創(chuàng)世區(qū)塊56
5.2.5 生成創(chuàng)世區(qū)塊57
5.2.6 區(qū)塊驗證58
5.2.7 計算下一個區(qū)塊的難度目標60
5.2.8 孤塊管理60
5.3 區(qū)塊鏈63
5.3.1 區(qū)塊鏈的數(shù)據(jù)結(jié)構(gòu)63
5.3.2 區(qū)塊上鏈64
5.3.3 區(qū)塊連接65
5.3.4 鏈重組66
5.3.5 主鏈的狀態(tài)69
5.4 本章小結(jié)70
第6章 內(nèi)核層:交易71
6.1 概述71
6.2 交易的概念71
6.2.1 現(xiàn)實生活中的交易71
6.2.2 虛擬世界中的交易72
6.3 核心數(shù)據(jù)結(jié)構(gòu)72
6.3.1 普通交易核心數(shù)據(jù)結(jié)構(gòu)73
6.3.2 Coinbase交易核心數(shù)據(jù)結(jié)構(gòu)78
6.3.3 交易Action數(shù)據(jù)結(jié)構(gòu)81
6.3.4 MUX交易類型85
6.4 BUTXO模型86
6.4.1 BUTXO模型原理87
6.4.2 MUX結(jié)構(gòu)88
6.5 交易的流程89
6.5.1 構(gòu)建交易89
6.5.2 簽名交易93
6.5.3 提交交易95
6.6 隔離見證97
6.7 交易腳本97
6.7.1 支付到公鑰98
6.7.2 支付到腳本99
6.7.3 資產(chǎn)上鏈100
6.7.4 資產(chǎn)銷毀102
6.7.5 見證腳本102
6.7.6 棧語言103
6.8 交易驗證105
6.8.1 標準交易105
6.8.2 交易驗證流程106
6.9 交易費108
6.9.1 估算交易手續(xù)費108
6.9.2 計算交易手續(xù)費110
6.10 交易池111
6.11 默克爾樹112
6.12 本章小結(jié)115
第7章 內(nèi)核層:智能合約116
7.1 概述116
7.2 基礎知識116
7.2.1 智能合約116
7.2.2 圖靈完備的智能合約117
7.2.3 UTXO模型和Account模型117
7.3 合約層設計118
7.4 智能合約語言119
7.4.1 Equity語言119
7.4.2 Equity合約組成119
7.5 基于UTXO模型合約開發(fā)實戰(zhàn)122
7.5.1 編寫合約123
7.5.2 編譯合約123
7.5.3 部署合約125
7.5.4 解鎖合約129
7.6 本章小結(jié)132
第8章 內(nèi)核層:虛擬機133
8.1 概述133
8.2 BVM介紹134
8.2.1 虛擬機的棧134
8.2.2 具有圖靈完備性的BVM135
8.2.3 equity & vm代碼結(jié)構(gòu)135
8.3 virtualMachine對象136
8.4 棧實現(xiàn)137
8.5 BVM操作指令集139
8.6 智能合約在BVM上的運行過程141
8.6.1 智能合約數(shù)據(jù)結(jié)構(gòu)141
8.6.2 合約編譯流程與原理142
8.6.3 合約程序字節(jié)碼示例156
8.6.4 合約程序字節(jié)碼的執(zhí)行157
8.6.5 合約程序字節(jié)碼的執(zhí)行示例159
8.7 BVM指令集160
8.8 本章小結(jié)165
第9章 錢包層166
9.1 概述166
9.2 錢包對象167
9.3 密鑰管理167
9.3.1 密鑰對生成169
9.3.2 密鑰對生成算法170
9.3.3 密鑰加密存儲172
9.4 賬戶管理174
9.4.1 賬戶創(chuàng)建175
9.4.2 賬戶地址176
9.4.3 賬戶余額178
9.5 資產(chǎn)管理179
9.5.1 初始默認資產(chǎn)179
9.5.2 發(fā)行資產(chǎn)180
9.6 交易管理182
9.6.1 篩選交易182
9.6.2 篩選UTXO183
9.6.3 UTXO花費選擇算法184
9.7 錢包管理186
9.7.1 數(shù)據(jù)更新186
9.7.2 備份187
9.7.3 恢復188
9.8 本章小結(jié)188
第10章 P2P分布式網(wǎng)絡189
10.1 概述189
10.2 P2P的四種網(wǎng)絡模型189
10.3 網(wǎng)絡節(jié)點初始化191
10.3.1 SyncManager初始化191
10.3.2 P2P Switch初始化194
10.4 節(jié)點發(fā)現(xiàn)機制196
10.4.1 種子節(jié)點196
10.4.2 Kademlia算法197
10.4.3 UPnP協(xié)議203
10.4.4 RLPX網(wǎng)絡協(xié)議205
10.5 節(jié)點發(fā)現(xiàn)代碼實現(xiàn)206
10.5.1 節(jié)點發(fā)現(xiàn)初始化206
10.5.2 路由表實現(xiàn)207
10.5.3 Kademlia通信協(xié)議212
10.5.4 鄰居節(jié)點發(fā)現(xiàn)實現(xiàn)212
10.6 節(jié)點狀態(tài)機219
10.7 區(qū)塊同步223
10.7.1 區(qū)塊同步流程223
10.7.2 快速同步算法225
10.7.3 普通同步算法230
10.7.4 區(qū)塊數(shù)據(jù)請求與發(fā)送231
10.8 交易同步233
10.9 快速廣播235
10.9.1 新交易快速廣播236
10.9.2 新區(qū)塊快速廣播238
10.10 節(jié)點管理239
10.10.1 TCP連接數(shù)管理240
10.10.2 Outbound連接數(shù)管理240
10.10.3 動態(tài)節(jié)點評分機制DynamicBanScore241
10.11 本章小結(jié)245
第11章 數(shù)據(jù)存儲246
11.1 概述246
11.2 為什么使用鍵值數(shù)據(jù)庫246
11.3 LevelDB常用操作247
11.3.1 增刪改查操作247
11.3.2 迭代查詢248
11.3.3 按前綴查詢249
11.3.4 批量操作249
11.4 存儲層緩存250
11.4.1 緩存淘汰算法250
11.4.2 比原鏈緩存實現(xiàn)252
11.5 存儲層持久化254
11.5.1 比原鏈數(shù)據(jù)庫254
11.5.2 持久化存儲接口255
11.5.3 持久化key數(shù)據(jù)前綴255
11.5.4 持久化存儲區(qū)塊過程256
11.6 Varint變長編碼257
11.7 本章小結(jié)258
第12章 共識算法259
12.1 概述259
12.2 PoW和PoS259
12.3 實現(xiàn)一個簡易PoW共識算法261
12.4 比原鏈PoW共識算法266
12.4.1 PoW hash值266
12.4.2 難度動態(tài)調(diào)整267
12.4.3 Tensority算法268
12.5 本章小結(jié)278
第13章 礦池及挖礦流程279
13.1 概述279
13.2 與礦池相關(guān)的基本概念279
13.3 礦池總架構(gòu)280
13.4 挖礦流程解析(礦池視角)282
13.5 挖礦流程解析(礦機視角)283
13.6 拒絕數(shù)與拒絕率286
13.7 礦池的收益分配模式286
13.8 交易打包至區(qū)塊287
13.8.1 Coinbase交易獎勵288
13.8.2 交易手續(xù)費Gas289
13.9 礦池優(yōu)化建議290
13.10 本章小結(jié)291
第14章 展望292
14.1 概述292
14.2 跨鏈293
14.2.1 打通鏈與鏈的連接293
14.2.2 BTC、ETH與BTM的跨鏈資產(chǎn)交換293
14.3 閃電網(wǎng)絡294
14.4 子鏈295
14.5 本章小結(jié)296