1. 程式人生 > >以太坊原始碼解讀(2)以太坊客戶端geth原始碼目錄解析

以太坊原始碼解讀(2)以太坊客戶端geth原始碼目錄解析

下面我們來從Geth原始碼的目錄來看看以太坊都有哪些模組。

一、目錄分析

go-etherreum-master
  |- accounts     /* 實現了高層級Ethereum賬號管理 */
  |    |- abi        // 該包實現了Ethereum的ABI(應用程式二進位制介面) 
  |         bind.go  // 該包生成Ethereum合約的Go繫結 
  |    |- keystore   // 實現了Secp256k1私鑰的加密儲存 
  |    |- usbwallet  // 該包實現了支援USB硬體錢包
  |    accounts.go   // 定義了賬號的結構
  |- build
  |- cmd         /* 命令列工具 */
  |    |- abigen    // 一個原始碼生成器,它將Ethereum智慧合約定義(程式碼) 轉換為易於使用的、編譯時型別安全的Go package。
  |    |- bootnode  // 該節點為Ethereum發現協議執行一個引導節點。
  |    |- clef      // Clef可以用來簽署交易和資料,並且可以代替geth的賬戶管理。這使DApps不依賴於geth的賬戶管理。
  |    |- ethkey    // 該包描述了與以太坊keyfiles的互動命令列
  |    |- evm       // 執行EVM程式碼片段的命令列
  |    |- faucet    // 以太坊支援的輕量級客戶
  |    |- geth      // 啟動客戶端命令列
  |    |- internal  // 提供與使用者瀏覽器互動的工具
  |    |- p2psim    // 客戶端命令列模擬 HTTP API
  |    |- puppeth   // 組裝和維護個人網路的命令列
  |    |- rlpdump   // 打印出兼顧使用者友好和機器友好的RLP格式資料 
  |    |- swarm     // bzzhash命令,用來更好的計算出swarm雜湊樹
  |    |- utils     // 為go-ethereum命令提供說明
  |    |- wnode     // 一個簡單的Whisper節點
  |- common      /* 一些工具函式 */
  |    |- bitutil   // 快速位操作
  |    |- compiler  // 該包包裝了可執行的solidity編譯器
  |    |- hexutil   // 以0x為字首的十六進位制編碼
  |    |- math      // 數學工具
  |    big.go       // 大整數
  |    bytes.go     // bytes-hex工具
  |    format.go    // 格式化time.Duration值
  |    types.go     // 資料型別及轉換
  |- consensus   /* 以太坊的共識引擎 */
  |    |- clique    // 實現了POA共識引擎
  |    |- ethash    // 實現了POW共識引擎
  |    |- misc      // 與DAO硬分叉相關的確認與共識
  |    consensus.go // 定義了ChainReader和Engine介面 
  |- console     /* 是一個Javascript解釋的執行環境 */
  |- contracts   /* 實現了支票簿合約和ENS  */
  |    |- chequebook // “支票簿”可以建立並簽署從單一合同到多個受益人的支票。它是對等微支付的傳出支付處理程式。
  |    |- ens        // ENS(ethereum name service)
  |- core        /* 以太坊的核心資料結構和演算法(虛擬機器,狀態,區塊鏈,布隆過濾器) */
  |    |- asm        // 彙編和反彙編介面
  |    |- bloombits  // 過濾資料 
  |    |- rawdb      // 
  |    |- state      // 世界狀態的實現
  |    |    database.go
  |    |    iterator.go
  |    |    journal.go
  |    |    managed_state.go
  |    |    state_object.go
  |    |    statedb.go
  |    |    sync.go
  |    |- types      // 區塊鏈中的資料型別
  |    |    block.go
  |    |    bloom9.go
  |    |    derive_sha.go
  |    |    gen_header_json.go
  |    |    gen_log_json.go
  |    |    gen_receipt_json.go
  |    |    gen_tx_json.go
  |    |    log.go
  |    |    receipt.go
  |    |    transaction.go
  |    |    transaction_signing.go
  |    |- vm        // 實現evm
  |    |
  |    block_validator.go    
  |    blockchain.go
  |    block.go
  |    chain_indexer.go
  |    chain_makers.go
  |    error.go
  |    events.go
  |    evm.go
  |    gaspool.go
  |    gen_genesis.go
  |    genesis.go
  |    genesis_alloc.go
  |    headerchain.go
  |    state_processor.go
  |    state_transition.go
  |    tx_cacher.go
  |    tx_journal.go
  |    tx_list.go
  |    tx_pool.go
  |    types.go
  |- crypto      /* 加密和hash演算法 */
  |- dashboard   /* 儀表板是整合到geth的資料視覺化工具,用於收集和視覺化Ethereum節點的有用資訊。 */
  |- eth         /* 實現所有以太坊協議 */ 
  |    |- downloader    // 手動全鏈同步
  |    |- fetcher       // 基於塊通知的同步
  |    |- filter        // 用於區塊、交易和日誌事件的過濾
  |    |- gasprice      // 返回區塊的建議gasprice
  |    |- tracers       // 收集JavaScript交易追蹤
  |    backend.go
  |    bloombits.go
  |    handler.go
  |    metrics.go
  |    peer.go
  |    protocol.go
  |    sync.go
  |- ethclient   /* 提供以太坊的RPC客戶端 */
  |- ethdb       /* eth的資料庫(包括實際使用的leveldb和供測試使用的記憶體資料庫) */
  |- ethstats    /* 提供網路狀態報告 */
  |- event       /* 處理實時事件 */
  |- internal    /*  */ 
  |- les         /* 輕量級Ethereum子協議 */
  |- light       /* 實現按需檢索能力的狀態和鏈物件 */
  |- log         /* 提供對人機均友好的日誌資訊 */
  |- metrics     /* go-Metrics,為系統某服務做監控、統計 */
  |- miner       /* 提供以太坊的區塊建立和挖礦 */
  |- node        /* 以太坊的多種型別的節點 */
  |- p2p         /* 實現p2p網路協議 */
  |- params      /* 以太坊系統中所用到的一些常量和變數 */
  |- rlp         /* 以太坊序列化處理 */
  |- rpc         /* 遠端方法呼叫 */
  |- signer
  |- swarm       /* swarm 是一個分散式儲存平臺和內容分發服務 */
  |- trie        /* 定義了以太坊重要的資料結構:Package trie implements Merkle Patricia Tries*/
  |- wisper      /* 實現一種點對點的隱祕訊息傳輸網路 */
  |
  interface.go   /* 定義了以太坊必要的介面,包括區塊鏈讀取、交易讀取、鏈狀態讀取、同步、訊息呼叫、過濾日誌、設定gasPrice等 */

原始碼api

經過檢視,原始碼的api位置有很多,包括:

node/api.go
eth/api.go
eth/downloader/api.go
eth/filters/api.go
consensus/clique/api.go
contracts/chequebook/api.go
internal/debug/api.go
whisper/whisperv2/api.go
whisper/whisperv5/api.go
whisper/whisperv6/api.go
swarm/api/api.go
internal/ethapi/api.go
...

通過這些api檔案,我們可以找到所有的web3.js(開放了一部分給geth管理API)呼叫的相關方法。