关键词:以太坊挖矿、共识算法、Ethash、Clique、PoW、PoA、nonce、Difficulty、区块组装、hashimoto
一、挖矿的起点:待挖掘区块的组装
在任何共识算法开工之前,首先必须把“要挖的区块”堆好积木。在 Geth 的 miner 包中,这一环节由 Miner → Worker → CpuAgent 三级结构完成。
Miner.New():
初始化自身后立即创建工作线程:New Worker → 注册 CpuAgent → 独立协程跑 Miner.Update()。Miner.Update():
监听下载器事件。如果节点正在同步区块,挖矿立即叫停;下载结束(无论成功或失败)后再恢复挖矿,保证本地不会出现同源冲突。Worker.updater():- 关注
ChainHeadEvent:链头更新即开始下一轮新区块准备。 - 关注
ChainSideEvent:侧链块被记入possibleUncles[],未来可进叔区块。 - 关注
TxPreEvent:若当前空闲,同步执行交易并打包入Work.txs。
- 关注
Worker.CommitNewWork():
真正的区块模板诞生地。工作流程包括:- 构造新区块头
Header,先填Number、ParentHash、Time等乐观字段。 - 从
TxPool选交易,执行后收集 Receipt。 - 从
possibleUncles[]选 <=2 个叔区块。 - 调用
Engine.Prepare预填Header.Extra,根据 DAO 硬分叉范围动态调整。 Engine.Finalize:计算StateRoot、TxHash、ReceiptHash、UncleHash,至此区块结构已近完整。- 生成
Work对象,经 channel 推送给已注册的每一个Agent,进入“封印”阶段。
- 构造新区块头
整个第一阶段只是“拼图”,几乎不耗算力,真正的算力狂飙在下一幕。
二、共识算法接管:Engine 接口下的 Ethash 与 Clique
共识算法族全部实现 Engine 接口,其中最重要的两把钥匙是 Seal() 与 VerifySeal():
Seal负责消耗算力/签名为区块盖公章。VerifySeal让全网节点秒验真伪。
2.1 Ethash — PoW 算法落地
Ethash 依赖“大内存 + 哈希碰撞”保证安全性。核心公式可简化为:
RAND(h, n) ≤ M / dh: 区块头不含 nonce 的哈希n: 可变 nonced: Header.DifficultyM: 2^256-1
Difficulty 越大则右侧上限越小,找到正确 nonce 的概率越低,符合直觉。
miner → Seal 的多线程流程
CpuAgent收到 Work 后触发mine(),进而调用Ethash.Seal()。Ethash.Seal()起Ethash.threads个 goroutine,各自跑mine()。每个
mine()函数无限循环:- 用
hashimotoFull(dataset, hash, nonce)求结果result result ≤ target即成功,复制 Header 并填充Nonce, MixDigest,回传区块。
- 用
👉 矿工巨坑!深挖 Ethash 大 DAG 文件生成幕后原理
深入 hashimotoFull
dataset:通过cache→dataset.generate()循环算出、文件映射到内存,单个 epoch 30000 个区块共用一份。cache.generate():cacheSize(epoch)根据 epoch 计算质数大小,确保数据量与随机性。seedHash:对前一 epoch 结尾反复Keccak256积累得出,确保每一路 cache 独一无二。cache → dataset转换使用generateDataset(),层层哈希再将值浸润整个 buffer,最终生成 GB 级 dataset。
攻击面与安全
可如今 ASIC 仍有可乘之机,为了降低中心化风险,Ethash 选择了 大内存依赖 与 DAG 定期增大。这意味着想靠单一算力倾销取胜,既需电力又需高昂显存;潜在攻击者若走强算力路线,也要吃掉同样内存墙。这种设计极大地提高了中心化成本阈值。
2.2 Clique — 基于签名的 PoA 联盟链
数字签名封印
Seal 步骤由公式 n = F(pr, h) 表达,F 为 ECDSA,pr 是已认证 signer 的私钥。
- 共识不要求算力,只要 signer 签名即可。
- VerifySeal 再次 ECDSA 验签即可。
动态投票授权机制
Snapshot:链上统计地址授权状态的快照,内容包括
- Signers 集合
- Recents 限制特定 signer 出块频率
- Votes / Tally 记录投票统计
投票规则
- 需已认证地址才可投一张票
- 一旦某个地址的累积投票 ≥ ceil(len(Signers)/2),则立刻切换其授权状态
- Recents 缓存防止短时间内连续做 signer,保证去中心化
流程示例
- Prepare 阶段:从不记名投票池中随机挑一个待投票地址作为当前区块
Coinbase,同时携带投票内容到Nonce字段。 - 区块广播后,全网在 apply() 中落盘投票,抵达阈值即更新 Signers 列表。
- Prepare 阶段:从不记名投票池中随机挑一个待投票地址作为当前区块
👉 读懂 Clique:联盟链场景也能真正去中心投票
三、深度 FAQ:快速扫除盲区
Q1:Ethash 的 DAG 文件会继续变大直到多大?
A:官方设计每 epoch 增长 ≈8 MB。四五年后可能 >20 GB,届时低内存显卡将率先退役。
Q2:Clique 出块阈值 ½ 会不会被几个大户控制?
A:是的,但节点可随时弃用该联盟链分叉,PoA 本就做测试或内网环境,安全性通过链治理解决,而非算力博弈。
Q3:为什么说叔区块能降低中心化?
A:出块失败仍获奖励,鼓励小算力继续挖矿,防止大矿池垄断算力链条。
Q4:sync 和 mining 真的不能同时进行吗?
A:协议层规定两者互斥,避免同一区块来源之争;在执行层面,eth.sync 管理器与 miner 的 channel 间隔编码确保了这一点。
Q5:Ethash 验证为何更快?
A:验证阶段只用 cache + hashimotoLight,占用仅上百 MB,少量内存即可完成校验。
Q6:未来以太坊 2.0 还用 Ethash 吗?
A:已经全面转向 PoS,但老链经典版本仍沿用 Ethash;理解 PoW 实现依旧对 Layer 2 安全侧链有启示意义。
四、小结
“挖矿”在以太坊代码中并非神秘,不过是 区块组装 → 共识算法封印 的两幕剧:
- 组装阶段逻辑复杂,贵在工程调度;
- 封印阶段或算力爆表或签名验证,定义了网络的安全边界。
无论是 Ethash 茫茫算力海还是 Clique 精准签名校验,都为区块链世界提供了可落地的 去中心化激励模型 样本。读懂源码,你也能用 1000 行代码复刻一个最小共识引擎。