学会本文后,你将掌握 ETH 奖励 的发放规则、叔区块收益公式,并能通过源码验证每一笔入账是否正确。
从矿工说起:什么是区块链奖励?
区块链可以理解成一台无中心服务器的分布式账本。矿工(miner) 通过 挖矿(mining) 维护账本安全,并因此获得 ETH。
共识机制(Consensus)的作用就是回答两个问题:
- 谁有权打包区块?
- 被打包区块后,系统如何奖励?
下面我们用 PoW(Proof of Work) 视角来解释。
Bitcoin 的奖励逻辑:最长链机制
1. 工作量证明 PoW
- 每 10 分钟全网争夺一次记账权。
- 节点把待确认交易打包成 Merkle Tree,再通过
SHA256两次计算找到的Nonce来构造 区块哈希。 - 哈希值必须小于 Difficulty,谁先算成功、广播成功,谁就拿到 区块奖励 Bitcoin。
2. 最长链规则(Longest Chain Rule)
如果 A、B 两个矿工几乎同时出块,区块链会出现 分叉。
当后续再出现一个区块并追加到 A 链,A 链便成为 最长链,B 链的区块就会被视为 废弃(Stale Block),无收益。
👉 想自己动手比较 PoW 与 PoS 的收益差异?先看示例计算!
3. Bitcoin 区块奖励公式
初始奖励 50 BTC → 每 21 万个区块后减半。
- 第 1‒210000 个区块:50 BTC
- 第 210001‒420000 个区块:25 BTC
(以此类推)
奖励还包含 交易手续费,这也是矿工收入的一部分。
Ethereum 的升级:引入 GHOST 协议
Ethereum 出块仅 12–15 秒,分叉率极高。Bitcoin 中废弃区块毫无收益,会浪费算力、降低安全。
于是 Ethereum 采用 GHOST(Greedy Heaviest Observed Subtree)协议 改良:
- 将那些「伯父区块」即 Uncle Block 计入主链权重;
- 给 Uncle Block 矿工 发放奖励,避免算力内耗;
- 同时尽量抑制 算力中心化。
Uncle Block 设计精要
| 名称 | 规则 |
|---|---|
| 可接受层数 | 2 ≤ k ≤ 7(距子区块深度 <=7) |
| 上限 | 每区块 最多引用 2 个叔区块 |
| 重复引用 | 已作为叔区块使用的不允许再次打包 |
| 状态验证 | 仅需 有效 Header |
主链选择:不再比长度,比子树重量
- Bitcoin:最长链 == 主链
- Ethereum:子树(子链上的区块总数)权重最大者为主链,更难被攻击。
Ethereum 奖励公式:普通区块 vs 叔区块
1. 普通区块(Canonical Block)
- 基础奖励:3 ETH(前总统 5 ETH,经 拜占庭分叉 下调)
- 该区块收取 Gas 费
- 如果打包了
n个叔区块,额外奖励:n × 3 / 32 ETH
2. 叔区块(Uncle Block)
计算方式:
叔区块奖励 = (叔区块高度 + 8 – 引用高度的区块高度) × 3 / 8示例
- 当前区块高度:1007
- 叔区块高度:1006
奖励 = (1006 + 8 – 1007) × 3 / 8
= (7) × 3 / 8
= 2.625 ETH
间隔越大,奖励递减率如下:
- 间隔 1:7/8 · 3 = 2.625 ETH
- 间隔 2:6/8 · 3 = 2.25 ETH
- 间隔 3:5/8 · 3 = 1.875 ETH
- … 最低 0.75 ETH(间隔 6)
源码级赏析:Go-Ethereum reward 计算
对应函数:consensus/ethash/consensus.go#L580–L609
var (
big8 = big.NewInt(8)
big32 = big.NewInt(32)
)
func accumulateRewards(...){
blockReward := FrontierBlockReward // 5 ETH default
if config.IsByzantium(header.Number){
blockReward = ByzantiumBlockReward // 3 ETH post-Byzantium
}
reward := new(big.Int).Set(blockReward)
foreach uncle {
r := new(big.Int)
r.Add(uncle.Number, big8) // uncleHeight + 8
r.Sub(r, header.Number) // - currentHeight
r.Mul(r, blockReward) // * 3 ETH
r.Div(r, big8) // / 8
state.AddBalance(uncle.Coinbase, r) // 发送给叔区块矿工
reward.Add(reward, blockReward.Div(blockReward, big32)) // 1/32 额外
}
state.AddBalance(header.Coinbase, reward) // 发送给该区块矿工
}核心字段对照:
| 代码常量 | 含义 | ETH 规模 |
|---|---|---|
| FrontierBlockReward | 5e18 Wei | 5 ETH |
| ByzantiumBlockReward | 3e18 Wei | 3 ETH |
每一步都可在链上透明验证,完全开源。
FAQ:一分钟小课堂
Q1:为什么叔区块奖励最高只有 7/8?
A:防止早期出块节点的算力无谓浪费,同时激励节点继续维护网络安全。
Q2:网络延迟会把区块变成「孤儿(Orphan)」吗?
A:严格来说,Orphan Block 是“找不着父亲”;Stale Block 是“找得到父亲但被父亲丢弃”。
Q3:普通用户能拿到 Uncle 奖励吗?
A:不可以,奖励仅归属该叔区块的矿工地址。
Q4:有没有上线后的实时查看工具?
A:常见区块浏览器都标记了 uncle_count 与 miner_reward 字段,可点击验证。
Q5:共识升级(如龙猫版 EIP-1234)会影响奖励吗?
A:会。社区可通过 EIP 修订 emission schedule,例如「Diff Bomb 延后 + 奖励再减半」。
Q6:交易池(txpool)如何决定交易顺序?
A:按 Gas Price DESC,价格越高越优先被矿工打包。
阅读至此,你已经完整搞懂 Ethereum 奖励的 分配规则、源码实现与边界概念。下次到手链上收益时,不妨用本文公式算一算,核对与记录,为自己的区块链安全知识再添一层护栏。