在以太坊 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等。
区块校验和挖矿算法相对应,了解挖矿细节,则自然可以了解是如何进行区块校验的。 所以本章重点介绍共识算法细节,将忽略区块校验。