Transactions

乙太坊交易費用和區塊獎勵究竟是如何發送給礦工的?

  • April 16, 2021

我知道,當礦工開採乙太坊區塊時,他們會從該區塊中包含的所有交易中獲得區塊獎勵和交易費用,但是所有這些交易費用究竟是如何發送給開採該區塊的礦工的呢?

但是所有這些交易費用究竟是如何發送給探勘該區塊的礦工的呢?

他們並沒有真正被送到任何地方——他們不需要。

當給定礦工開採一個區塊時,共識協議確保網路的其餘部分(最終)變得一致,這意味著所有其他礦工都接受批准的區塊,並繼續開採下一個區塊。

在此過程中,所有其他礦工——以及網路中的所有其他客戶端節點——可以簡單地更新他們的世界狀態副本,以將相關獎勵記入獲勝礦工的賬戶。

consensus.go我們看到以下函式:

func accumulateRewards(config *params.ChainConfig, state *state.StateDB, header *types.Header, uncles []*types.Header) {
   // Select the correct block reward based on chain progression
   blockReward := FrontierBlockReward
   if config.IsByzantium(header.Number) {
       blockReward = ByzantiumBlockReward
   }
   if config.IsConstantinople(header.Number) {
       blockReward = ConstantinopleBlockReward
   }
   // Accumulate the rewards for the miner and any included uncles
   reward := new(big.Int).Set(blockReward)
   r := new(big.Int)
   for _, uncle := range uncles {
       r.Add(uncle.Number, big8)
       r.Sub(r, header.Number)
       r.Mul(r, blockReward)
       r.Div(r, big8)
       state.AddBalance(uncle.Coinbase, r)

       r.Div(blockReward, big32)
       reward.Add(reward, r)
   }
   state.AddBalance(header.Coinbase, reward)
}

這裡的相關行是呼叫state.AddBalance().

這些將獎勵添加到與礦工地址相關的狀態變數中,由 表示.Coinbase

(對於 中的交易費用也是如此state_transition.go。)

引用自:https://ethereum.stackexchange.com/questions/97345