出块奖励是指在区块链网络中,节点(如矿工或验证者)成功创建和添加一个新的区块到区块链上时所获得的奖励。这种奖励通常以加密货币的形式发放,目的是激励节点参与网络的维护和安全。
出块奖励的主要功能包括:
在不同的区块链网络中,出块奖励的数额和发放方式可能有所不同,有的会随着时间递减(如比特币),有的则可能是固定的(如某些私链)。
在以太坊私链中,使用PoA(Proof of Authority)机制的验证者扮演着关键角色:
这种机制适合特定的私链应用,如企业内部链或联盟链,强调效率与安全性的平衡。
在以太坊私链的PoA(Proof of Authority)机制中,常见的共识算法包括 Clique 和 EHash。这里以 Clique 为例,来看看验证者是否可以获得出块奖励。
// consensus/clique/clique.go
// Finalize implements consensus.Engine. There is no post-transaction
// consensus rules in clique, do nothing here.
func (c *Clique) Finalize(chain consensus.ChainHeaderReader, header *types.Header, state *state.StateDB, txs []*types.Transaction, uncles []*types.Header, withdrawals []*types.Withdrawal) {
// No block rewards in PoA, so the state remains as is
}
从上面的代码可以看出,在 Clique 共识算法中,验证者节点不产生出块奖励,因此,验证者节点在创建新块时,除了交易费用以外,并不会获得任何出块奖励。
所以,在 Clique 共识下,PoA私链的ETH总量是固定的,即网络启动时通过 alloc 参数预分配的ETH数量。这就需要我们在网络建立之初对整个网络中可能需要的ETH数量有个大致的估算,但随着网络的运行时间越来越长,ETH的需求量可能会发生变化,预设的ETH可能不再满足网络运行的需要。此时,我们就需要增加ETH的供应量。
要增加ETH总量,除了引入新的验证者节点外,还需要引入出块奖励。但引入新的验证者节点就需要在网络初始化时创建好足够多的验证者节点,否则就需要重启网络,这意味着之前的历史数据就要被丢弃,这肯定不是我们所希望看到的。因此,就需要引入出块奖励。
引入出块奖励,就需要对 Geth(Go Ethereum)源码进行修改,使其支持自定义的出块奖励机制。
修改 Clique 配置,增加 reward 字段,用于配置验证者的出块奖励。
// params/config.go
// CliqueConfig is the consensus engine configs for proof-of-authority based sealing.
type CliqueConfig struct {
Period uint64 `json:"period"` // Number of seconds between blocks to enforce
Epoch uint64 `json:"epoch"` // Epoch length to reset votes and checkpoint
Reward uint64 `json:"reward"` // Block rewards paid to validators
}
此外,还需要修改 Finalize,在创建新块时,给予验证者相应的出块奖励:
// consensus/clique/clique.go
// Finalize implements consensus.Engine. There is no post-transaction
// consensus rules in clique, do nothing here.
func (c *Clique) Finalize(chain consensus.ChainHeaderReader, header *types.Header, state *state.StateDB, txs []*types.Transaction, uncles []*types.Header, withdrawals []*types.Withdrawal) {
// No block rewards in PoA, so the state remains as is
if len(txs) != 0 {
miner, err := ecrecover(chain.CurrentHeader(), c.signatures)
if err != nil {
log.Error("Failed to recover miner address", "err", err)
return
}
// 奖励
state.AddBalance(miner, uint256.NewInt(chain.Config().Clique.Reward*1e18))
}
}
ecrecover 可以从以太坊区块头的签名中提取账户地址。
使用如下 genesis.json
启动修改后的 Geth,启动节点。
{
"config": {
".....":"....",
"clique": {
"period": 10,
"epoch": 30000,
"reward": 1
}
},
".....":"....",
}
如上配置,设置出块奖励为 1 ETH,启动节点,观察验证者节点的出块奖励。
#
$ geth attach
Welcome to the Geth JavaScript console!
instance: Geth/v1.13.15-stable-a10b60d7/linux-amd64/go1.21.13
coinbase: 0x618c92d30e4a7b21a0d00dc7f5038024752adfd5
at block: 665 (Wed Oct 16 2024 08:56:46 GMT+0000 (UTC))
datadir: /root/.ethereum
modules: admin:1.0 clique:1.0 debug:1.0 engine:1.0 eth:1.0 miner:1.0 net:1.0 rpc:1.0 txpool:1.0 web3:1.0
To exit, press ctrl-d or type exit
# 查看0x618c92d30e4a7b21a0d00dc7f5038024752adfd5余额
> eth.getBalance("0x618c92d30e4a7b21a0d00dc7f5038024752adfd5")
1.0000293000000057596308703e+25
# 从0x618c92d30e4a7b21a0d00dc7f5038024752adfd5 转账 1 ETH
> eth.sendTransaction({"to":"086afb25e849aabeb24e8340e7807d5cc944b501","from":"0x618c92d30e4a7b21a0d00dc7f5038024752adfd5", value: 1e18})
"0x292ee16330319f8ea182851d6cca5ef59ef606abb0459ffa57841d221e9b2464"
# 0x618c92d30e4a7b21a0d00dc7f5038024752adfd5余额
> eth.getBalance("0x618c92d30e4a7b21a0d00dc7f5038024752adfd5")
1.0000293000000057596308703e+25
在以太坊私链的PoA(Proof of Authority)机制中,常见的共识算法包括 Clique 和 EHash。它们各自有不同的设计思路和应用场景。下面是两者的详细对比:
Clique 是以太坊官方提供的 PoA 共识算法之一,在 Geth(Go Ethereum)客户端中支持。它的主要特点和机制如下:
Ethash 是以太坊原本使用的 PoW(Proof of Work)共识算法。然而,有时候 Ethash 的概念也被延伸用于 PoA 机制的上下文中,特别是在一些私链中。这里,EHash 作为 PoA 实现会有一些不同的特点:
特性 | Clique | EHash(在PoA上下文中) |
---|---|---|
出块方式 | 轮流出块,基于验证者身份 | 类似PoA机制的变种,可能基于PoW兼容性 |
治理机制 | 链上投票,动态调整验证者 | 自定义,实现上不统一 |
性能 | 快速(5-15秒),适合低延迟场景 | 可能会更慢,因需要部分计算 |
适用场景 | 测试网络、小型私链、企业链 | 特定实验性链,需兼容PoW特性 |
容错性 | 容忍一定比例的恶意或离线验证者 | 根据实现不同而异 |
复杂度 | 简单,容易配置 | 可能需要更多的定制和配置 |
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。