20180526132525297.jpg20180526132553211.png20180526132539117.png
go-ethereum源碼解析
因為go ethereum是最被廣泛使用的以太坊用戶端, 所以後續的源碼分析都從github上面的這份代碼進行分析。
搭建go ethereum調試環境
windows 10 64bit
首先下載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/secp256k1exec: "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. 在編輯框右鍵選擇運行, 如果運行成功,代表環境搭建完成。
Ubuntu 16.04 64bit
go安裝包進行安裝
apt install golang-go git -y
golang環境配置:
編輯/etc/profile檔案,在該檔案中加入以下內容:export GOROOT=/usr/bin/go export GOPATH=/root/home/goprojectexport GOBIN=/root/home/goproject/binexport GOLIB=/root/home/goproject/export PATH=$PATH:$GOBIN:$GOPATH/bin:$GOROOT/bin
執行以下命令,使得環境變數生效:
# source /etc/profile
下載源碼:
#cd /root/home/goproject; mkdir src; cd src #進入go項目目錄,並建立src目錄, 並進入src目錄#git clone https://github.com/ethereum/go-ethereum
使用vim或其他IDE開啟即可;
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 移動端使用的一些warppernode 以太坊的多種類型的節點p2p 以太坊p2p網路通訊協定rlp 以太坊序列化處理rpc 遠程方法調用swarm swarm網路處理tests 測試trie 以太坊重要的資料結構Package trie implements Merkle Patricia Tries.whisper 提供了whisper節點的協議。
可以看到以太坊的代碼量還是挺大的,但是粗略看,代碼結構還是挺好的。我希望先從一些比較獨立的模組來進行分析。然後在深入分析內部的代碼。重點可能集中在黃皮書裡面沒有涉及到的p2p網路等模組。