以太坊源码解读(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)调用的相关方法。
启动命令: geth --identity "TestNode1" --datadir "data0" --rpc --rpcapi "db,eth,net,web3" --port "30303" -- ...