This commit is contained in:
Patrick O'Grady
2022-03-14 09:18:40 -07:00
parent 132457d414
commit 5f152e89e4
2 changed files with 27 additions and 19 deletions
+15 -12
View File
@@ -15,43 +15,46 @@ import (
"github.com/ethereum/go-ethereum/params"
)
const (
checkInterval = 2 * time.Second
)
// MonitorTPS periodically prints metrics related to transaction activity on
// a given network.
func MonitorTPS(ctx context.Context, client ethclient.Client) error {
blockNumber, err := client.BlockNumber(ctx)
lastBlockNumber, err := client.BlockNumber(ctx)
if err != nil {
return fmt.Errorf("failed to get block number: %w", err)
}
block, err := client.BlockByNumber(ctx, new(big.Int).SetUint64(blockNumber))
block, err := client.BlockByNumber(ctx, new(big.Int).SetUint64(lastBlockNumber))
if err != nil {
return fmt.Errorf("failed to get block at number %d: %w", blockNumber, err)
return fmt.Errorf("failed to get block at number %d: %w", lastBlockNumber, err)
}
startTime := block.Time()
currentTime := startTime
totalTxs := 0
timeTxs := map[uint64]int{}
timeTxs := make(map[uint64]int)
for ctx.Err() == nil {
newBlockNumber, err := client.BlockNumber(ctx)
if err != nil {
log.Printf("failed to get block number: %s", err)
time.Sleep(2 * time.Second)
time.Sleep(checkInterval)
continue
}
if blockNumber > newBlockNumber {
time.Sleep(2 * time.Second)
if newBlockNumber <= lastBlockNumber {
time.Sleep(checkInterval)
continue
}
var block *types.Block
for i := blockNumber; i <= newBlockNumber; i++ {
for i := lastBlockNumber + 1; i <= newBlockNumber; i++ {
for ctx.Err() == nil {
block, err = client.BlockByNumber(ctx, new(big.Int).SetUint64(i))
if err != nil {
log.Printf("failed to get block at number %d: %s", blockNumber, err)
time.Sleep(2 * time.Second)
log.Printf("failed to get block at number %d: %s", i, err)
time.Sleep(checkInterval)
continue
}
log.Printf("[block created] index: %d base fee: %d block gas cost: %d block txs: %d\n", i, block.BaseFee().Div(block.BaseFee(), big.NewInt(params.GWei)), block.BlockGasCost(), len(block.Body().Transactions))
@@ -63,7 +66,7 @@ func MonitorTPS(ctx context.Context, client ethclient.Client) error {
break
}
}
blockNumber = newBlockNumber + 1
lastBlockNumber = newBlockNumber
currentTime = block.Time()
// log TPS
+12 -7
View File
@@ -57,8 +57,8 @@ func setupVars(cID *big.Int, bFee uint64, pFee uint64) {
func createWorkers(ctx context.Context, keys []*key.Key, endpoints []string, desiredWorkers int) (*worker, []*worker, error) {
var master *worker
var workers []*worker
for _, k := range keys {
worker, err := newWorker(k, endpoints[rand.Intn(len(endpoints))])
for i, k := range keys {
worker, err := newWorker(k, endpoints[i%len(endpoints)])
if err != nil {
return nil, nil, err
}
@@ -73,7 +73,9 @@ func createWorkers(ctx context.Context, keys []*key.Key, endpoints []string, des
switch {
case master == nil:
master = worker
case new(big.Int).Sub(master.balance, worker.balance).Sign() < 0:
case master.balance.Cmp(worker.balance) < 0:
// We swap the worker with the master if it has a larger balance to
// ensure the master is the key with the largest balance
workers = append(workers, master)
master = worker
default:
@@ -85,13 +87,16 @@ func createWorkers(ctx context.Context, keys []*key.Key, endpoints []string, des
if master == nil {
master, err = newWorker(nil, endpoints[rand.Intn(len(endpoints))])
if err != nil {
// This should never happen
return nil, nil, fmt.Errorf("unable to create master: %w", err)
}
}
for len(workers) < desiredWorkers {
worker, err := newWorker(nil, endpoints[rand.Intn(len(endpoints))])
i := len(workers)
worker, err := newWorker(nil, endpoints[i%len(endpoints)])
if err != nil {
// This should never happen
return nil, nil, fmt.Errorf("unable to create worker: %w", err)
}
@@ -168,7 +173,7 @@ func (w *worker) waitForBalance(ctx context.Context, stdout bool, minBalance *bi
return fmt.Errorf("could not get balance: %w", err)
}
if new(big.Int).Sub(w.balance, minBalance).Sign() >= 0 {
if w.balance.Cmp(minBalance) >= 0 {
if stdout {
log.Printf("found balance of %s\n", w.balance.String())
}
@@ -222,7 +227,7 @@ func (w *worker) sendTx(ctx context.Context, recipient common.Address, value *bi
func (w *worker) work(ctx context.Context, availableWorkers []*worker, fundRequest chan common.Address) error {
for ctx.Err() == nil {
if new(big.Int).Sub(w.balance, maxTransferCost).Sign() < 0 {
if w.balance.Cmp(maxTransferCost) < 0 {
log.Printf("%s requesting funds from master\n", w.k.Address.Hex())
fundRequest <- w.k.Address
if err := w.waitForBalance(ctx, false, maxTransferCost); err != nil {
@@ -245,7 +250,7 @@ func (w *worker) fund(ctx context.Context, fundRequest chan common.Address) erro
for {
select {
case recipient := <-fundRequest:
if new(big.Int).Sub(w.balance, minFunderBalance).Sign() < 0 {
if w.balance.Cmp(minFunderBalance) < 0 {
if err := w.waitForBalance(ctx, true, minFunderBalance); err != nil {
return fmt.Errorf("could not get minimum balance: %w", err)
}