之前说了很多环境搭建,钱包使用、dapp开发都更侧重于使用、以及上层的开发,结下来我们来聊聊以太坊的底层代码。
由于本人对go语言不是特别的精通,这里通过java版本介绍,逻辑原理都是一样的这不耽误你对以太坊底层的认识,好了
废话不多说开始咱们的代码之旅;(以太坊源码系列都是自己的理解,如有错误希望大家指正)
本章目的:
初识以太坊的代码结构;
准备工作:
1. 源码下载
git clone https://github.com/ethereum/ethereumj.git
2. 导入到开发工具中(intelliJ -idea)
3. 结构简介
本项目主要使用spring来管理对象,使用netty完成通信,使用leveldb负责存储;
每个包的作用大致为:
- cli : 负责启动参数的处理
- config: 负责配置文件注入以及一些bean的注入
- 公共部分:包含系统配置变量(SystemProperties)、配置初始化(Initializer 完成配置的初始化)、仓库、数据源、验证器等的注入
- blockchain:包含的是一些以太坊发布时各个版本的不同的特性,这些特性包括不限于难度值计算以及其他一些EIP所描述的bug或者features
- net:包含的是以太坊支持的不同的网络配置,包含主网或者测试网络不同的配置信息,所谓的配置信息就是blockchain配置所描述的一些不同的EIP或者其他的features
- core: 核心部分,它包含账户、区块、创世块、区块链、transaction、bloom的定义以及区块如何验证、如何加入链以及transaction如何使用vm执行也就是智能合约的执行都在这里完成
- crypto: 加密工具包含不限于hash算法、ECC算法等
- datasource: 提供了两种数据源实现内存以及leveldb,并使用者两种数据源扩展了不同实现,这包含缓存数据源、链数据源,依据于此又封装出读写缓存、异步读写缓存以及链存储相关的数据源实现。
- db: 定义了如何使用datasource存储block、transaction,换句话说就是block、transaction的存储数据结构
- facade: 包含了ethereum的实现,就是将块存储、验证、同步、合约执行等做的封装
- mine是挖矿相关的
- net 涉及的都是网络相关的,以太坊节点发现块同步都是建立在rlpx协议之上,这包含p2p、shh、eth等,另外server包就是节点发现服务启动入口
- samples是一些测试例子
- solidity是合约编译部分的实现
- sync 是负责负责块的同步下载等
- trie 是以太坊链存储的数据结构,该包主要是实现该数据结构也就是MPT
- utils 工具类,包含rlp编码等
- validator 这是一些验证器,在验证block的时候会用到
- vm 以太坊vm实现
- start是程序入口