1.目錄結構node
本項目主要使用spring來管理對象,使用netty完成通訊,使用leveldb負責存儲,總體的包的結構以下所示:算法
accounts 實現了一個高等級的以太坊帳戶管理spring
bmt 二進制的默克爾樹的實現數據庫
build 主要是編譯和構建的一些腳本和配置api
cmd 命令行工具,又分了不少的命令行工具,下面一個一個介紹安全
/abigen 源代碼生成器,將Etalum合同定義轉換爲易於使用的、編譯時類型安全的Go包。網絡
/bootnode 啓動一個僅僅實現網絡發現的節點數據結構
/evm 以太坊虛擬機的開發工具, 用來提供一個可配置的,受隔離的代碼調試環境數據結構和算法
/faucetide
/geth 以太坊命令行客戶端,最重要的一個工具
/p2psim 提供了一個工具來模擬http的API
/puppeth 建立一個新的以太坊網絡的嚮導
/rlpdump 提供了一個RLP數據的格式化輸出
/swarm swarm網絡的接入點
/util 提供了一些公共的工具
/wnode 這是一個簡單的Whisper節點。 它能夠用做獨立的引導節點。此外,能夠用於不一樣的測試和診斷目的。
common 提供了一些公共的工具類
compression PackageRle 實現了用於Etalum數據的遊程編碼。
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節點的協議。
能夠看到以太坊的代碼量仍是挺大的,可是粗略看,代碼結構仍是挺好的。此外根目錄下還包含了一些構建工程用的makefile、README等文件。
2.命名、接口定義規範
(1)命名
如上圖所示,文件名命名清晰簡潔,主要爲英文及英文縮寫,符合代碼命名的通常規範。且符合整個應用或包的主入口文件應當是 main.go 或與應用名稱簡寫相同的命名規範。
如上圖所示,變量命名基本上遵循相應的英文表達或簡寫,且符合駝峯命名法這一GoLang語言命名規範。
函數命名符合駝峯式命名,且函數名是動詞或動詞短語,如postPayment、deletePage、save。而類名是名詞或名詞短語,這些都屬於GoLang語言的命名規範
(2)接口定義
3.單元測試組織形式
單元測試文件名命名爲 example_test.go,符合命名規範,測試用例的函數名稱以 Test 開頭,如TestEventString,符合命名規範。目錄中單元測試文件緊跟在對應單元以後,結合命名規範,對應關係一目瞭然,簡潔清晰。
4.GO語言代碼規範和風格的通常要求
(1)代碼組織結構
a.一個目錄只包含一個包,模塊複雜拆分子模塊/子目錄
b.內部項目GOPATH若是指向多個工做目錄。公開項目爲第一個工做區間(即go get默認下載到第一個目錄)
c.非測試文件(*_test.go)禁止使用,簡化包
d.禁止相對路徑導入包
e.建議goimports或者IDE管理import
f.項目rep須要包含全部的代碼,依賴庫放在vendor下
g.建議使用Golide,Godep管理第三方包
h.總而言之:組織結構須要簡化,一目瞭然,容許多個工做區間,可是環境變量的第一個工做區間必須是公開的項目,最好使用一個工做區間,不要創建相對路徑的包,最好用godep等依賴庫控制工具來管理依賴庫,每一個項目全部的依賴庫最好放在本目錄vendor下。
(2)代碼命名規範
a.包名命名規則:包名應該爲小寫單詞,不要使用下劃線或者混合大小寫。
b.文件命名:儘可能採起有意義的文件名,簡短,有意義,應該爲小寫單詞,使用下劃線分隔各個單詞。
c.結構體命名:採用駝峯命名法,首字母根據訪問控制大寫或者小寫struct 申明和初始化格式採用多行聲明。
d.接口命名:單個函數的接口名以「er」做爲後綴,接口的實現則去掉「er」;兩個函數的接口名綜合兩個函數名,以「er」做爲後綴,接口的實現則去掉「er」;三個以上函數的接口,抽象這個接口的功能,相似於結構體命名。
e.變量命名:和結構體相似,變量名稱通常遵循駝峯法,首字母根據訪問控制原則大寫或者小寫,但遇到特有名詞時,須要遵循如下規則:若是變量爲私有,且特有名詞爲首個單詞,則使用小寫,如 apiClient,其它狀況都應當使用該名詞原有的寫法,如 APIClient、repoID、UserID。若變量類型爲 bool 類型,則名稱應以 Has, Is, Can 或 Allow 開頭。避免全局變量多使用,for循環可用單字母。
f.常量命名:常量均需使用所有大寫字母組成,並使用下劃線分詞,若是是枚舉類型的常量,須要先建立相應類型。
g.總而言之,文件名和目錄名,包名都必須小寫。數據類型變量和參數等定義最好使用駝峯大小寫法,不要使用下劃線或者中劃線
(3)代碼風格
a.縮進和折行:縮進直接使用 gofmt 工具格式化便可(gofmt 是使用 tab 縮進的);折行方面,一行最長不超過120個字符,超過的請使用換行展現,儘可能保持格式優雅。
b.語句的結尾:Go語言中是不須要相似於Java須要冒號結尾,默認一行就是一條數據;若是你打算將多個語句寫在同一行,它們則必須使用 ;分割。
c.括號和空格:括號和空格方面,也能夠直接使用 gofmt 工具格式化(go 會強制左大括號不換行,換行會報語法錯誤),全部的運算符和操做數之間要留空格。
d.測試:單元測試文件名命名規範爲 example_test.go。測試用例的函數名稱必須以 Test 開頭,例如:TestExample。每一個重要的函數都要首先編寫測試用例,測試用例和正規代碼一塊兒提交方便進行迴歸測試
(4)工具
a.gofmt:大部分的格式問題能夠經過gofmt解決, gofmt 自動格式化代碼,保證全部的 go 代碼與官方推薦的格式保持一致,因而全部格式有關問題,都以 gofmt 的結果爲準。
b.go vet:vet工具能夠幫咱們靜態分析咱們的源碼存在的各類問題,例如多餘的代碼,提早return的邏輯,struct的tag是否符合標準等。