Skip to content

Commit

Permalink
Add metrics for gas price / usage (#700)
Browse files Browse the repository at this point in the history
Co-authored-by: aaronbuchwald <aaron.buchwald56@gmail.com>
  • Loading branch information
nytzuga and aaronbuchwald authored Jun 30, 2023
1 parent 9a1c548 commit a221f63
Show file tree
Hide file tree
Showing 2 changed files with 52 additions and 16 deletions.
52 changes: 46 additions & 6 deletions core/blockchain.go
Original file line number Diff line number Diff line change
Expand Up @@ -78,12 +78,14 @@ var (
blockStateValidationTimer = metrics.NewRegisteredCounter("chain/block/validations/state", nil)
blockWriteTimer = metrics.NewRegisteredCounter("chain/block/writes", nil)

acceptorQueueGauge = metrics.NewRegisteredGauge("chain/acceptor/queue/size", nil)
acceptorWorkTimer = metrics.NewRegisteredCounter("chain/acceptor/work", nil)
acceptorWorkCount = metrics.NewRegisteredCounter("chain/acceptor/work/count", nil)
processedBlockGasUsedCounter = metrics.NewRegisteredCounter("chain/block/gas/used/processed", nil)
acceptedBlockGasUsedCounter = metrics.NewRegisteredCounter("chain/block/gas/used/accepted", nil)
badBlockCounter = metrics.NewRegisteredCounter("chain/block/bad/count", nil)
acceptorQueueGauge = metrics.NewRegisteredGauge("chain/acceptor/queue/size", nil)
acceptorWorkTimer = metrics.NewRegisteredCounter("chain/acceptor/work", nil)
acceptorWorkCount = metrics.NewRegisteredCounter("chain/acceptor/work/count", nil)
lastAcceptedBlockBaseFeeGauge = metrics.NewRegisteredGauge("chain/block/fee/basefee", nil)
blockTotalFeesGauge = metrics.NewRegisteredGauge("chain/block/fee/total", nil)
processedBlockGasUsedCounter = metrics.NewRegisteredCounter("chain/block/gas/used/processed", nil)
acceptedBlockGasUsedCounter = metrics.NewRegisteredCounter("chain/block/gas/used/accepted", nil)
badBlockCounter = metrics.NewRegisteredCounter("chain/block/bad/count", nil)

txUnindexTimer = metrics.NewRegisteredCounter("chain/txs/unindex", nil)
acceptedTxsCounter = metrics.NewRegisteredCounter("chain/txs/accepted", nil)
Expand Down Expand Up @@ -1053,9 +1055,47 @@ func (bc *BlockChain) Accept(block *types.Block) error {
bc.addAcceptorQueue(block)
acceptedBlockGasUsedCounter.Inc(int64(block.GasUsed()))
acceptedTxsCounter.Inc(int64(len(block.Transactions())))
if baseFee := block.BaseFee(); baseFee != nil {
lastAcceptedBlockBaseFeeGauge.Update(baseFee.Int64())
}
total, err := TotalFees(block, bc.GetReceiptsByHash(block.Hash()))
if err != nil {
log.Error(fmt.Sprintf("TotalFees error: %s", err))
} else {
blockTotalFeesGauge.Update(total.Int64())
}
return nil
}

// TotalFees computes total consumed fees in wei. Block transactions and receipts have to have the same order.
func TotalFees(block *types.Block, receipts []*types.Receipt) (*big.Int, error) {
baseFee := block.BaseFee()
feesWei := new(big.Int)
if len(block.Transactions()) != len(receipts) {
return nil, errors.New("mismatch between total number of transactions and receipts")
}
for i, tx := range block.Transactions() {
var minerFee *big.Int
if baseFee == nil {
// legacy block, no baseFee
minerFee = tx.GasPrice()
} else {
minerFee = new(big.Int).Add(baseFee, tx.EffectiveGasTipValue(baseFee))
}
feesWei.Add(feesWei, new(big.Int).Mul(new(big.Int).SetUint64(receipts[i].GasUsed), minerFee))
}
return feesWei, nil
}

// TotalFees computes total consumed fees in ether. Block transactions and receipts have to have the same order.
func TotalFeesFloat(block *types.Block, receipts []*types.Receipt) (*big.Float, error) {
total, err := TotalFees(block, receipts)
if err != nil {
return nil, err
}
return new(big.Float).Quo(new(big.Float).SetInt(total), new(big.Float).SetInt(big.NewInt(params.Ether))), nil
}

func (bc *BlockChain) Reject(block *types.Block) error {
bc.chainmu.Lock()
defer bc.chainmu.Unlock()
Expand Down
16 changes: 6 additions & 10 deletions miner/worker.go
Original file line number Diff line number Diff line change
Expand Up @@ -368,8 +368,13 @@ func (w *worker) handleResult(env *environment, block *types.Block, createdAt ti
logs = append(logs, receipt.Logs...)
}

totalFees, err := core.TotalFeesFloat(block, receipts)
if err != nil {
log.Error("TotalFeesFloat error: %s", err)
}

log.Info("Commit new mining work", "number", block.Number(), "hash", hash, "timestamp", block.Time(), "uncles", 0, "txs", env.tcount,
"gas", block.GasUsed(), "fees", totalFees(block, receipts), "elapsed", common.PrettyDuration(time.Since(env.start)))
"gas", block.GasUsed(), "fees", totalFees, "elapsed", common.PrettyDuration(time.Since(env.start)))

// Note: the miner no longer emits a NewMinedBlock event. Instead the caller
// is responsible for running any additional verification and then inserting
Expand All @@ -387,15 +392,6 @@ func copyReceipts(receipts []*types.Receipt) []*types.Receipt {
return result
}

// totalFees computes total consumed fees in ETH. Block transactions and receipts have to have the same order.
func totalFees(block *types.Block, receipts []*types.Receipt) *big.Float {
feesWei := new(big.Int)
for i, tx := range block.Transactions() {
feesWei.Add(feesWei, new(big.Int).Mul(new(big.Int).SetUint64(receipts[i].GasUsed), tx.GasPrice()))
}
return new(big.Float).Quo(new(big.Float).SetInt(feesWei), new(big.Float).SetInt(big.NewInt(params.Ether)))
}

// enforcePredicates takes a set of pending transactions (grouped by sender, and ordered by nonce)
// and returns the subset of those transactions (following the same grouping) that satisfy predicateContext.
// Any transaction that fails predicate verification will be removed from the tx pool and excluded
Expand Down

0 comments on commit a221f63

Please sign in to comment.