node/hack: add example RPC account traversal script

Change-Id: If61ac6185f9173c489c8ddee5d4c60edf734ff20
This commit is contained in:
Leo 2021-10-04 23:12:23 +02:00
parent b577b70b2e
commit 707c5caa9b
2 changed files with 111 additions and 1 deletions

View File

@ -36,11 +36,13 @@ require (
github.com/spf13/viper v1.7.1
github.com/status-im/keycard-go v0.0.0-20200402102358-957c09536969
github.com/stretchr/testify v1.7.0
github.com/tendermint/tendermint v0.33.7
github.com/terra-project/terra.go v1.0.1-0.20210129055710-7a586e5e027a
github.com/tidwall/gjson v1.8.1
go.uber.org/zap v1.16.0
golang.org/x/crypto v0.0.0-20210513164829-c07d793c2f9a
golang.org/x/sys v0.0.0-20210601080250-7ecdf8ef093b
golang.org/x/time v0.0.0-20201208040808-7e3f01d25324
google.golang.org/api v0.47.0
google.golang.org/genproto v0.0.0-20210617175327-b9e0b3197ced
google.golang.org/grpc v1.38.0
@ -215,7 +217,6 @@ require (
github.com/tendermint/btcd v0.1.1 // indirect
github.com/tendermint/crypto v0.0.0-20191022145703-50d29ede1e15 // indirect
github.com/tendermint/go-amino v0.15.1 // indirect
github.com/tendermint/tendermint v0.33.7 // indirect
github.com/tendermint/tm-db v0.5.1 // indirect
github.com/teris-io/shortid v0.0.0-20201117134242-e59966efd125 // indirect
github.com/tidwall/match v1.0.3 // indirect

View File

@ -0,0 +1,109 @@
package main
import (
"context"
"github.com/gagliardetto/solana-go"
"github.com/gagliardetto/solana-go/rpc"
"golang.org/x/time/rate"
"log"
"strings"
"time"
)
/*
1/0def15a24423e1edd1a5ab16f557b9060303ddbab8c803d2ee48f4b78a1cfd6b/118
-> wPkMzrFNdXFtATPFYDMh9EMJNZyAd4un7TCezG7AgY2
1/ec7372995d5cc8732397fb0ad35c0121e0eaa90d26f828a534cab54391b3a4f5/66
-> Gv1KWf8DT1jKv5pKBmGaTmVszqa56Xn8YGx2Pg7i7qAk
*/
const (
mainnetApi = "https://explorer-api.mainnet-beta.solana.com"
)
var (
emitter = solana.MustPublicKeyFromBase58("Gv1KWf8DT1jKv5pKBmGaTmVszqa56Xn8YGx2Pg7i7qAk")
want = []string{
"66",
"79",
"442",
"508",
"692",
"782",
"908",
"920",
"942",
"1069",
"1075",
"1083",
"1153",
"1184",
}
)
func main() {
ctx := context.Background()
c := rpc.New(mainnetApi)
limiter := rate.NewLimiter(rate.Every(1*time.Second), 10)
var limit uint64 = 100
var before solana.Signature
sigs := make([]solana.Signature, 0, limit*2)
for {
err := limiter.Wait(ctx)
if err != nil {
log.Fatal(err)
}
log.Printf("requesting before: %s", before)
out, err := c.GetConfirmedSignaturesForAddress2(ctx, emitter, &rpc.GetConfirmedSignaturesForAddress2Opts{
Limit: &limit,
Before: before,
})
if err != nil {
log.Fatalf("GetConfirmedSignaturesForAddress2 %s: %v", emitter, err)
}
if len(out) == 0 {
log.Println("fetched all txes")
break
}
last := out[len(out)-1].Signature
log.Printf("fetched %d transactions, from %s to %s",
len(out), out[0].Signature, last)
for _, sig := range out {
sigs = append(sigs, sig.Signature)
}
before = last
}
log.Printf("found a total of %d transactions", len(sigs))
for _, sig := range sigs {
out, err := c.GetConfirmedTransaction(ctx, sig)
if err != nil {
log.Fatalf("GetConfirmedTransaction %s: %v", sig, err)
}
for _, msg := range out.Meta.LogMessages {
if strings.HasPrefix(msg, "Program log: Sequence:") {
seq := msg[23:]
//log.Printf("%s %s", sig, seq)
for _, w := range want {
if w == seq {
log.Printf("FOUND https://explorer.solana.com/tx/%s seq %s", sig, seq)
}
}
}
}
}
}