erigon-pulse/cmd/state/fee_market.go
2019-11-05 22:51:11 +01:00

88 lines
2.4 KiB
Go

package main
import (
"bufio"
"fmt"
"math/big"
"os"
"os/signal"
"syscall"
"time"
"github.com/ledgerwatch/turbo-geth/consensus/ethash"
"github.com/ledgerwatch/turbo-geth/core"
"github.com/ledgerwatch/turbo-geth/core/vm"
"github.com/ledgerwatch/turbo-geth/ethdb"
"github.com/ledgerwatch/turbo-geth/params"
)
func feemarket() {
startTime := time.Now()
sigs := make(chan os.Signal, 1)
interruptCh := make(chan bool, 1)
signal.Notify(sigs, syscall.SIGINT, syscall.SIGTERM)
go func() {
<-sigs
interruptCh <- true
}()
ethDb, err := ethdb.NewBoltDatabase("/Volumes/tb4/turbo-geth-10/geth/chaindata")
//ethDb, err := ethdb.NewBoltDatabase("/Users/alexeyakhunov/Library/Ethereum/geth/chaindata")
//ethDb, err := ethdb.NewBoltDatabase("/home/akhounov/.ethereum/geth/chaindata1")
check(err)
defer ethDb.Close()
chainConfig := params.MainnetChainConfig
fmFile, err := os.OpenFile("fee_market.csv", os.O_APPEND|os.O_WRONLY|os.O_CREATE, 0600)
check(err)
defer fmFile.Close()
w := bufio.NewWriter(fmFile)
defer w.Flush()
vmConfig := vm.Config{}
engine := ethash.NewFullFaker()
bcb, err := core.NewBlockChain(ethDb, nil, chainConfig, engine, vmConfig, nil)
check(err)
blockNum := uint64(*block)
interrupt := false
txCount := 0
MinFeeMaxChangeDenominator := big.NewInt(8)
parentMinFee := big.NewInt(1000000000)
minimum := big.NewInt(1000)
for !interrupt {
block := bcb.GetBlockByNumber(blockNum)
if block == nil {
break
}
header := block.Header()
targetGasUsed := big.NewInt(int64(header.GasLimit))
targetGasUsed.Div(targetGasUsed, big.NewInt(2))
delta := big.NewInt(int64(header.GasUsed))
delta.Sub(delta, targetGasUsed)
minFee := big.NewInt(0).Mul(parentMinFee, delta)
minFee.Div(minFee, targetGasUsed)
minFee.Div(minFee, MinFeeMaxChangeDenominator)
minFee.Add(minFee, parentMinFee)
if minFee.Cmp(minimum) < 0 {
minFee.Set(minimum)
}
for range block.Transactions() {
txCount++
}
fmt.Fprintf(w, "%d,%d\n", blockNum, minFee)
blockNum++
parentMinFee = minFee
if blockNum%1000 == 0 {
//tds.PruneTries(true)
fmt.Printf("Processed %d blocks\n", blockNum)
}
// Check for interrupts
select {
case interrupt = <-interruptCh:
fmt.Println("interrupted, please wait for cleanup...")
default:
}
}
fmt.Printf("Processed %d blocks\n", blockNum)
fmt.Printf("Next time specify -block %d\n", blockNum)
fmt.Printf("Fee market analysis took %s\n", time.Since(startTime))
}