以太坊原始碼分析(1)go-ethereum的設計思路及模組組織形式
阿新 • • 發佈:2018-12-22
# go-ethereum原始碼解析因為go ethereum是最被廣泛使用的以太坊客戶端, 所以後續的原始碼分析都從github上面的這份程式碼進行分析。 然後我使用的是windows 10 64位的環境。
### 搭建go ethereum除錯環境首先下載go安裝包進行安裝,因為GO的網站被牆,所以從下面地址下載。
https://studygolang.com/dl/golang/go1.9.1.windows-amd64.msi
安裝好之後,設定環境變數,把C:\Go\bin目錄新增到你的PATH環境變數, 然後增加一個GOPATH的環境變數,GOPATH的值設定為你的GO語言下載的程式碼路徑(我設定的是C:\GOPATH)
安裝git工具,請參考網路上的教程安裝git工具, go語言從github自動下載程式碼需要git工具的支援
開啟命令列工具下載 go-ethereum的程式碼 go get github.com/ethereum/go-ethereum
命令執行成功之後,程式碼就會下載到下面這個目錄,%GOPATH%\src\github.com\ethereum\go-ethereum如果執行過程中出現
# github.com/ethereum/go-ethereum/crypto/secp256k1 exec: "gcc": executable file not found in %PATH%
則需要安裝gcc工具,我們從下面地址下載並安裝
http://tdm-gcc.tdragon.net/download
接下來安裝IDE工具。 我是用的IDE是JetBrains的Gogland。 可以在下面地址下載
https://download.jetbrains.com/go/gogland-173.2696.28.exe
安裝完成後開啟IDE. 選擇File -> Open -> 選擇GOPATH\src\github.com\ethereum\go-ethereum目錄開啟。
然後開啟go-ethereum/rlp/decode_test.go. 在編輯框右鍵選擇執行, 如果執行成功,代表環境搭建完成。
### go ethereum 目錄大概介紹 go-ethereum專案的組織結構基本上是按照功能模組劃分的目錄,下面簡單介紹一下各個目錄的結構,每個目錄在GO語言裡面又被成為一個Package,我理解跟Java裡面的Package應該是差不多的意思。
accounts 實現了一個高等級的以太坊賬戶管理 bmt 二進位制的默克爾樹的實現 build 主要是編譯和構建的一些指令碼和配置 cmd 命令列工具,又分了很多的命令列工具,下面一個一個介紹 /abigen Source code generator to convert Ethereum contract definitions into easy to use, compile-time type-safe Go packages /bootnode 啟動一個僅僅實現網路發現的節點 /evm 以太坊虛擬機器的開發工具, 用來提供一個可配置的,受隔離的程式碼除錯環境 /faucet /geth 以太坊命令列客戶端,最重要的一個工具 /p2psim 提供了一個工具來模擬http的API /puppeth 建立一個新的以太坊網路的嚮導 /rlpdump 提供了一個RLP資料的格式化輸出 /swarm swarm網路的接入點 /util 提供了一些公共的工具 /wnode 這是一個簡單的Whisper節點。 它可以用作獨立的引導節點。此外,可以用於不同的測試和診斷目的。 common 提供了一些公共的工具類 compression Package rle implements the run-length encoding used for Ethereum data. consensus 提供了以太坊的一些共識演算法,比如ethhash, clique(proof-of-authority) console console類 contracts core 以太坊的核心資料結構和演算法(虛擬機器,狀態,區塊鏈,布隆過濾器) crypto 加密和hash演算法, eth 實現了以太坊的協議 ethclient 提供了以太坊的RPC客戶端 ethdb eth的資料庫(包括實際使用的leveldb和供測試使用的記憶體資料庫) ethstats 提供網路狀態的報告 event 處理實時的事件 les 實現了以太坊的輕量級協議子集 light 實現為以太坊輕量級客戶端提供按需檢索的功能 log 提供對人機都友好的日誌資訊 metrics 提供磁碟計數器 miner 提供以太坊的區塊建立和挖礦 mobile 移動端使用的一些warpper node 以太坊的多種型別的節點 p2p 以太坊p2p網路協議 rlp 以太坊序列化處理 rpc 遠端方法呼叫 swarm swarm網路處理 tests 測試 trie 以太坊重要的資料結構Package trie implements Merkle Patricia Tries. whisper 提供了whisper節點的協議。
可以看到以太坊的程式碼量還是挺大的,但是粗略看,程式碼結構還是挺好的。我希望先從一些比較獨立的模組來進行分析。然後在深入分析內部的程式碼。重點可能集中在黃皮書裡面沒有涉及到的p2p網路等模組。
### 搭建go ethereum除錯環境首先下載go安裝包進行安裝,因為GO的網站被牆,所以從下面地址下載。
https://studygolang.com/dl/golang/go1.9.1.windows-amd64.msi
安裝好之後,設定環境變數,把C:\Go\bin目錄新增到你的PATH環境變數, 然後增加一個GOPATH的環境變數,GOPATH的值設定為你的GO語言下載的程式碼路徑(我設定的是C:\GOPATH)
安裝git工具,請參考網路上的教程安裝git工具, go語言從github自動下載程式碼需要git工具的支援
開啟命令列工具下載 go-ethereum的程式碼 go get github.com/ethereum/go-ethereum
命令執行成功之後,程式碼就會下載到下面這個目錄,%GOPATH%\src\github.com\ethereum\go-ethereum如果執行過程中出現
# github.com/ethereum/go-ethereum/crypto/secp256k1 exec: "gcc": executable file not found in %PATH%
則需要安裝gcc工具,我們從下面地址下載並安裝
http://tdm-gcc.tdragon.net/download
接下來安裝IDE工具。 我是用的IDE是JetBrains的Gogland。 可以在下面地址下載
https://download.jetbrains.com/go/gogland-173.2696.28.exe
安裝完成後開啟IDE. 選擇File -> Open -> 選擇GOPATH\src\github.com\ethereum\go-ethereum目錄開啟。
然後開啟go-ethereum/rlp/decode_test.go. 在編輯框右鍵選擇執行, 如果執行成功,代表環境搭建完成。
### go ethereum 目錄大概介紹
accounts 實現了一個高等級的以太坊賬戶管理 bmt 二進位制的默克爾樹的實現 build 主要是編譯和構建的一些指令碼和配置 cmd 命令列工具,又分了很多的命令列工具,下面一個一個介紹 /abigen Source code generator to convert Ethereum contract definitions into easy to use, compile-time type-safe Go packages /bootnode 啟動一個僅僅實現網路發現的節點 /evm 以太坊虛擬機器的開發工具, 用來提供一個可配置的,受隔離的程式碼除錯環境 /faucet /geth 以太坊命令列客戶端,最重要的一個工具 /p2psim 提供了一個工具來模擬http的API /puppeth 建立一個新的以太坊網路的嚮導 /rlpdump 提供了一個RLP資料的格式化輸出 /swarm swarm網路的接入點 /util 提供了一些公共的工具 /wnode 這是一個簡單的Whisper節點。 它可以用作獨立的引導節點。此外,可以用於不同的測試和診斷目的。 common 提供了一些公共的工具類 compression Package rle implements the run-length encoding used for Ethereum data. consensus 提供了以太坊的一些共識演算法,比如ethhash, clique(proof-of-authority) console console類 contracts core 以太坊的核心資料結構和演算法(虛擬機器,狀態,區塊鏈,布隆過濾器) crypto 加密和hash演算法, eth 實現了以太坊的協議 ethclient 提供了以太坊的RPC客戶端 ethdb eth的資料庫(包括實際使用的leveldb和供測試使用的記憶體資料庫) ethstats 提供網路狀態的報告 event 處理實時的事件 les 實現了以太坊的輕量級協議子集 light 實現為以太坊輕量級客戶端提供按需檢索的功能 log 提供對人機都友好的日誌資訊 metrics 提供磁碟計數器 miner 提供以太坊的區塊建立和挖礦 mobile 移動端使用的一些warpper node 以太坊的多種型別的節點 p2p 以太坊p2p網路協議 rlp 以太坊序列化處理 rpc 遠端方法呼叫 swarm swarm網路處理 tests 測試 trie 以太坊重要的資料結構Package trie implements Merkle Patricia Tries. whisper 提供了whisper節點的協議。
可以看到以太坊的程式碼量還是挺大的,但是粗略看,程式碼結構還是挺好的。我希望先從一些比較獨立的模組來進行分析。然後在深入分析內部的程式碼。重點可能集中在黃皮書裡面沒有涉及到的p2p網路等模組。