Go-ethereum代碼規範

 

1.目錄結構node

本項目主要使用spring來管理對象,使用netty完成通訊,使用leveldb負責存儲,總體的包的結構以下所示:算法

accounts             實現了一個高等級的以太坊帳戶管理spring

bmt           二進制的默克爾樹的實現數據庫

build            主要是編譯和構建的一些腳本和配置api

cmd           命令行工具,又分了不少的命令行工具,下面一個一個介紹安全

  /abigen           源代碼生成器,將Etalum合同定義轉換爲易於使用的、編譯時類型安全的Go包。網絡

  /bootnode         啓動一個僅僅實現網絡發現的節點數據結構

  /evm          以太坊虛擬機的開發工具, 用來提供一個可配置的,受隔離的代碼調試環境數據結構和算法

  /faucetide

  /geth          以太坊命令行客戶端,最重要的一個工具

  /p2psim        提供了一個工具來模擬httpAPI

  /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節點的協議。

 

能夠看到以太坊的代碼量仍是挺大的,可是粗略看,代碼結構仍是挺好的。此外根目錄下還包含了一些構建工程用的makefileREADME等文件

 

 

2.命名、接口定義規範

(1)命名

 

如上圖所示,文件名命名清晰簡潔,主要爲英文及英文縮寫,符合代碼命名的通常規範。且符合整個應用或包的主入口文件應當是 main.go 或與應用名稱簡寫相同的命名規範。

 

如上圖所示,變量命名基本上遵循相應的英文表達或簡寫且符合駝峯命名法這一GoLang語言命名規範。

函數命名符合駝峯式命名,且函數名是動詞或動詞短語,如postPaymentdeletePagesave。而類名是名詞或名詞短語,這些都屬於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,其它狀況都應當使用該名詞原有的寫法,如 APIClientrepoIDUserID若變量類型爲 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的邏輯,structtag是否符合標準等。

相關文章
相關標籤/搜索
本站公眾號
   歡迎關注本站公眾號,獲取更多信息