以太坊源码解读(2)geth目录结构

Geth是以太坊官方唯一推荐的客户端,相当于是对以太坊区块链的官方实现。源码的地址是:https://github.com/ethereum/go-ethereum

下面我们来从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)调用的相关方法。

下一章:以太坊源码解读(3)以太坊启动流程

启动命令: geth --identity "TestNode1" --datadir "data0" --rpc --rpcapi "db,eth,net,web3" --port "30303" -- ...