序言
因?yàn)間o ethereum是最被廣泛使用的以太坊客戶端戈抄, 所以后續(xù)的源碼分析都從github上面的這份代碼進(jìn)行分析漾岳。
搭建go ethereum調(diào)試環(huán)境
windows 10 64bit
首先下載go安裝包進(jìn)行安裝庄敛,因?yàn)镚O的網(wǎng)站被墻仅偎,所以從下面地址下載屯仗。
https://studygolang.com/dl/golang/go1.9.1.windows-amd64.msi
安裝好之后踩娘,設(shè)置環(huán)境變量表谊,把C:\Go\bin目錄添加到你的PATH環(huán)境變量钞护, 然后增加一個(gè)GOPATH的環(huán)境變量,GOPATH的值設(shè)置為你的GO語言下載的代碼路徑(我設(shè)置的是C:\GOPATH)
安裝git工具爆办,請(qǐng)參考網(wǎng)絡(luò)上的教程安裝git工具难咕, go語言從github自動(dòng)下載代碼需要git工具的支持
打開命令行工具下載 go-ethereum的代碼
go get github.com/ethereum/go-ethereum
命令執(zhí)行成功之后,代碼就會(huì)下載到下面這個(gè)目錄距辆,%GOPATH%\src\github.com\ethereum\go-ethereum 如果執(zhí)行過程中出現(xiàn)
# 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. 在編輯框右鍵選擇運(yùn)行, 如果運(yùn)行成功漂彤,代表環(huán)境搭建完成雾消。
Ubuntu 16.04 64bit
go安裝包進(jìn)行安裝
apt install golang-go git -y
golang環(huán)境配置:
編輯/etc/profile文件,在該文件中加入以下內(nèi)容:
export GOROOT=/usr/bin/go
export GOPATH=/root/home/goproject
export GOBIN=/root/home/goproject/bin
export GOLIB=/root/home/goproject/
export PATH=$PATH:$GOBIN:$GOPATH/bin:$GOROOT/bin
執(zhí)行以下命令挫望,使得環(huán)境變量生效:
# source /etc/profile
下載源碼:
#cd /root/home/goproject; mkdir src立润; cd src #進(jìn)入go項(xiàng)目目錄,并創(chuàng)建src目錄, 并進(jìn)入src目錄
#git clone https://github.com/ethereum/go-ethereum
使用vim或其他IDE打開即可媳板;
go ethereum 目錄大概介紹
go-ethereum項(xiàng)目的組織結(jié)構(gòu)基本上是按照功能模塊劃分的目錄桑腮,下面簡(jiǎn)單介紹一下各個(gè)目錄的結(jié)構(gòu),每個(gè)目錄在GO語言里面又被成為一個(gè)Package,我理解跟Java里面的Package應(yīng)該是差不多的意思蛉幸。
accounts 實(shí)現(xiàn)了一個(gè)高等級(jí)的以太坊賬戶管理
bmt 二進(jìn)制的默克爾樹的實(shí)現(xiàn)
build 主要是編譯和構(gòu)建的一些腳本和配置
cmd 命令行工具破讨,又分了很多的命令行工具,下面一個(gè)一個(gè)介紹
/abigen Source code generator to convert Ethereum contract definitions into easy to use, compile-time type-safe Go packages
/bootnode 啟動(dòng)一個(gè)僅僅實(shí)現(xiàn)網(wǎng)絡(luò)發(fā)現(xiàn)的節(jié)點(diǎn)
/evm 以太坊虛擬機(jī)的開發(fā)工具奕纫, 用來提供一個(gè)可配置的提陶,受隔離的代碼調(diào)試環(huán)境
/faucet
/geth 以太坊命令行客戶端,最重要的一個(gè)工具
/p2psim 提供了一個(gè)工具來模擬http的API
/puppeth 創(chuàng)建一個(gè)新的以太坊網(wǎng)絡(luò)的向?qū)? /rlpdump 提供了一個(gè)RLP數(shù)據(jù)的格式化輸出
/swarm swarm網(wǎng)絡(luò)的接入點(diǎn)
/util 提供了一些公共的工具
/wnode 這是一個(gè)簡(jiǎn)單的Whisper節(jié)點(diǎn)匹层。 它可以用作獨(dú)立的引導(dǎo)節(jié)點(diǎn)隙笆。此外,可以用于不同的測(cè)試和診斷目的。
common 提供了一些公共的工具類
compression Package rle implements the run-length encoding used for Ethereum data.
consensus 提供了以太坊的一些共識(shí)算法撑柔,比如ethhash, clique(proof-of-authority)
console console類
contracts
core 以太坊的核心數(shù)據(jù)結(jié)構(gòu)和算法(虛擬機(jī)瘸爽,狀態(tài),區(qū)塊鏈铅忿,布隆過濾器)
crypto 加密和hash算法剪决,
eth 實(shí)現(xiàn)了以太坊的協(xié)議
ethclient 提供了以太坊的RPC客戶端
ethdb eth的數(shù)據(jù)庫(包括實(shí)際使用的leveldb和供測(cè)試使用的內(nèi)存數(shù)據(jù)庫)
ethstats 提供網(wǎng)絡(luò)狀態(tài)的報(bào)告
event 處理實(shí)時(shí)的事件
les 實(shí)現(xiàn)了以太坊的輕量級(jí)協(xié)議子集
light 實(shí)現(xiàn)為以太坊輕量級(jí)客戶端提供按需檢索的功能
log 提供對(duì)人機(jī)都友好的日志信息
metrics 提供磁盤計(jì)數(shù)器
miner 提供以太坊的區(qū)塊創(chuàng)建和挖礦
mobile 移動(dòng)端使用的一些warpper
node 以太坊的多種類型的節(jié)點(diǎn)
p2p 以太坊p2p網(wǎng)絡(luò)協(xié)議
rlp 以太坊序列化處理
rpc 遠(yuǎn)程方法調(diào)用
swarm swarm網(wǎng)絡(luò)處理
tests 測(cè)試
trie 以太坊重要的數(shù)據(jù)結(jié)構(gòu)Package trie implements Merkle Patricia Tries.
whisper 提供了whisper節(jié)點(diǎn)的協(xié)議。
可以看到以太坊的代碼量還是挺大的辆沦,但是粗略看昼捍,代碼結(jié)構(gòu)還是挺好的。我希望先從一些比較獨(dú)立的模塊來進(jìn)行分析肢扯。然后在深入分析內(nèi)部的代碼妒茬。重點(diǎn)可能集中在黃皮書里面沒有涉及到的p2p網(wǎng)絡(luò)等模塊。