Transactions
乙太坊交易費用和區塊獎勵究竟是如何發送給礦工的?
我知道,當礦工開採乙太坊區塊時,他們會從該區塊中包含的所有交易中獲得區塊獎勵和交易費用,但是所有這些交易費用究竟是如何發送給開採該區塊的礦工的呢?
但是所有這些交易費用究竟是如何發送給探勘該區塊的礦工的呢?
他們並沒有真正被送到任何地方——他們不需要。
當給定礦工開採一個區塊時,共識協議確保網路的其餘部分(最終)變得一致,這意味著所有其他礦工都接受批准的區塊,並繼續開採下一個區塊。
在此過程中,所有其他礦工——以及網路中的所有其他客戶端節點——可以簡單地更新他們的世界狀態副本,以將相關獎勵記入獲勝礦工的賬戶。
在
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
。)