在以太坊 geth 项目中共识类代码均组织在github.com/ethereum/go-ethereum/consensus
包中。
这篇小文,给你介绍下代码结构,为后续讲解共识算法实现做准备。
下面是整个包内子包组织和文件定义。
consensus -> 共识算法包
├── clique -> PoA 算法
│ ├── api.go
│ ├── clique.go -> 共识算法实现
│ ├── snapshot.go
│ └── snapshot_test.go
├── consensus.go -> 算法接口
├── errors.go -> 全局错误信息定义
├── ethash -> PoW 算法
│ ├── algorithm.go -> ethash算法核心
│ ├── algorithm_test.go
│ ├── api.go
│ ├── consensus.go -> 共识算法实现
│ ├── consensus_test.go
│ ├── ethash.go -> ethash 算法入口
│ ├── ethash_test.go
│ ├── sealer.go -> 挖矿入口
│ └── sealer_test.go
└── misc -> 公共算法
├── dao.go -> The dao 攻击,硬分叉处理
└── forks.go
consensus 包下有两个共识算法包 ethash 和 clique,分别实现了定义在 consensus.go 文件中共识算法接口 Engin。
接口方法分为两类:
根据接口定义,在共识算法包内部进行实现,当前以太坊中有两个算法:PoW版的Ethash和PoA版的clique。PoA相对简单些,而PoW则主要涉及难度调整,抗ASIC等。
区块校验和挖矿算法相对应,了解挖矿细节,则自然可以了解是如何进行区块校验的。 所以本章重点介绍共识算法细节,将忽略区块校验。