Add dumb tx counter script

This commit is contained in:
Leopold Schabel 2022-01-22 17:24:55 +01:00
parent 34fd302eb3
commit 6a4f337f9a
1 changed files with 101 additions and 0 deletions

101
cmd/txcount/txcount.go Normal file
View File

@ -0,0 +1,101 @@
package main
import (
"context"
"errors"
"flag"
"fmt"
"github.com/gagliardetto/solana-go"
"github.com/gagliardetto/solana-go/rpc"
"github.com/gagliardetto/solana-go/rpc/jsonrpc"
"k8s.io/klog/v2"
"time"
)
const localRPC = "http://localhost:8899"
var (
flagAddr = flag.String("addr", localRPC, "RPC address")
flagCount = flag.Bool("count", true, "Print the number of transactions")
flagAfter = flag.Uint64("after", 0, "Only print transactions after this slot")
voteAcc = flag.String("voteAcc", "Certusm1sa411sMpV9FPqU5dXAYhmmhygvxJ23S6hJ24", "Vote account address")
)
func main() {
flag.Parse()
r := rpc.New(*flagAddr)
our, err := solana.PublicKeyFromBase58(*voteAcc)
if err != nil {
klog.Fatalf("Failed to parse vote account: %v", err)
}
klog.Infof("Our vote account: %v", our)
epr, err := r.GetEpochInfo(context.Background(), rpc.CommitmentConfirmed)
if err != nil {
klog.Exitf("GetEpochSchedule: %v", err)
}
if epr == nil {
klog.Exitf("GetEpochInfo: empty response")
}
epoch := *epr
offset := epoch.AbsoluteSlot - epoch.SlotIndex
klog.Infof("Epoch: %v, SlotIndex: %v, AbsoluteSlot: %v, Offset: %v", epoch.Epoch, epoch.SlotIndex, epoch.AbsoluteSlot, offset)
resp, err := r.GetLeaderScheduleWithOpts(context.Background(), &rpc.GetLeaderScheduleOpts{
Epoch: &epoch.AbsoluteSlot,
Identity: &our,
})
if err != nil {
klog.Exitf("GetLeaderSchedule: %v", err)
}
if resp == nil {
klog.Exitf("GetLeaderSchedule: empty response")
}
current, err := r.GetSlot(context.Background(), rpc.CommitmentConfirmed)
if err != nil {
klog.Exitf("GetSlot: %v", err)
}
klog.Infof("Current slot: %d", current)
sched := *resp
slots := sched[our]
klog.Infof("%d slots for %s", len(slots), our)
for _, slot := range slots {
slot := slot + offset
if *flagAfter > 0 && slot < *flagAfter {
continue
}
if slot > current {
break
}
if *flagCount {
block, err := r.GetBlock(context.Background(), slot)
if err != nil {
var rpcErr *jsonrpc.RPCError
if errors.As(err, &rpcErr) && (rpcErr.Code == -32007 /* SLOT_SKIPPED */ || rpcErr.Code == -32004 /* BLOCK_NOT_AVAILABLE */) {
fmt.Printf("slot=%d skipped=true\n", slot)
continue
}
klog.Warningf("GetBlock: %v", err)
continue
}
bt := time.Unix(*block.BlockTime, 0)
fmt.Printf("ts=%s slot=%d numTx=%d\n", bt, slot, len(block.Transactions))
} else {
fmt.Printf("https://explorer.solana.com/block/%d\n", slot)
}
}
}