diff --git a/cmd/root.go b/cmd/root.go
index 953132b..a8628c2 100644
--- a/cmd/root.go
+++ b/cmd/root.go
@@ -320,7 +320,7 @@ func getConfig(nodeInfo node.Info) (interfaces.Config, error) {
case dump.STDOUT:
indexerConfig = dump.Config{Dump: os.Stderr}
case dump.DISCARD:
- indexerConfig = dump.Config{Dump: dump.NewDiscardWriterCloser()}
+ indexerConfig = dump.Config{Dump: dump.Discard}
default:
return nil, fmt.Errorf("unrecognized dump destination: %s", dumpDst)
}
diff --git a/cmd/serve.go b/cmd/serve.go
index f5959be..159a2a3 100644
--- a/cmd/serve.go
+++ b/cmd/serve.go
@@ -50,14 +50,11 @@ func init() {
func serve() {
logWithCommand.Info("Running eth-statediff-service serve command")
- statediffService, err := createStateDiffService()
- if err != nil {
- logWithCommand.Fatal(err)
- }
+ service := createStateDiffService()
// short circuit if we only want to perform prerun
if viper.GetBool("prerun.only") {
- if err := statediffService.Run(nil); err != nil {
+ if err := service.Run(nil); err != nil {
logWithCommand.Fatal("unable to perform prerun: %v", err)
}
return
@@ -65,12 +62,12 @@ func serve() {
// start service and servers
logWithCommand.Info("Starting statediff service")
- wg := new(sync.WaitGroup)
- if err := statediffService.Loop(wg); err != nil {
+ var wg sync.WaitGroup
+ if err := service.Loop(&wg); err != nil {
logWithCommand.Fatalf("unable to start statediff service: %v", err)
}
logWithCommand.Info("Starting RPC servers")
- if err := startServers(statediffService); err != nil {
+ if err := startServers(service); err != nil {
logWithCommand.Fatal(err)
}
logWithCommand.Info("RPC servers successfully spun up; awaiting requests")
@@ -80,11 +77,11 @@ func serve() {
signal.Notify(shutdown, os.Interrupt)
<-shutdown
logWithCommand.Info("Received interrupt signal, shutting down")
- statediffService.Stop()
+ service.Stop()
wg.Wait()
}
-func startServers(serv sd.StateDiffService) error {
+func startServers(serv *sd.Service) error {
ipcPath := viper.GetString("server.ipcPath")
httpPath := viper.GetString("server.httpPath")
if ipcPath == "" && httpPath == "" {
diff --git a/cmd/util.go b/cmd/util.go
index 9884a02..c28c5cb 100644
--- a/cmd/util.go
+++ b/cmd/util.go
@@ -2,10 +2,13 @@ package cmd
import (
"context"
+ "encoding/json"
+ "fmt"
+ "os"
- "github.com/cerc-io/plugeth-statediff"
gethsd "github.com/cerc-io/plugeth-statediff"
ind "github.com/cerc-io/plugeth-statediff/indexer"
+ "github.com/cerc-io/plugeth-statediff/utils/log"
"github.com/ethereum/go-ethereum/common"
"github.com/ethereum/go-ethereum/params"
"github.com/ethereum/go-ethereum/trie"
@@ -16,7 +19,7 @@ import (
type blockRange [2]uint64
-func createStateDiffService() (sd.StateDiffService, error) {
+func createStateDiffService() *sd.Service {
// load some necessary params
logWithCommand.Info("Loading statediff service parameters")
mode := viper.GetString("leveldb.mode")
@@ -41,13 +44,7 @@ func createStateDiffService() (sd.StateDiffService, error) {
var chainConf *params.ChainConfig
var err error
chainConfigPath := viper.GetString("ethereum.chainConfig")
-
- if chainConfigPath != "" {
- chainConf, err = statediff.LoadConfig(chainConfigPath)
- } else {
- chainConf, err = statediff.ChainConfig(nodeInfo.ChainID)
- }
-
+ chainConf, err = LoadConfig(chainConfigPath)
if err != nil {
logWithCommand.Fatal(err)
}
@@ -84,7 +81,7 @@ func createStateDiffService() (sd.StateDiffService, error) {
logWithCommand.Fatal(err)
}
logWithCommand.Info("Creating statediff service")
- sdConf := sd.Config{
+ sdConf := sd.ServiceConfig{
ServiceWorkers: viper.GetUint("statediff.serviceWorkers"),
TrieWorkers: viper.GetUint("statediff.trieWorkers"),
WorkerQueueSize: viper.GetUint("statediff.workerQueueSize"),
@@ -98,12 +95,10 @@ func setupPreRunRanges() []sd.RangeRequest {
return nil
}
preRunParams := gethsd.Params{
- IntermediateStateNodes: viper.GetBool("prerun.params.intermediateStateNodes"),
- IntermediateStorageNodes: viper.GetBool("prerun.params.intermediateStorageNodes"),
- IncludeBlock: viper.GetBool("prerun.params.includeBlock"),
- IncludeReceipts: viper.GetBool("prerun.params.includeReceipts"),
- IncludeTD: viper.GetBool("prerun.params.includeTD"),
- IncludeCode: viper.GetBool("prerun.params.includeCode"),
+ IncludeBlock: viper.GetBool("prerun.params.includeBlock"),
+ IncludeReceipts: viper.GetBool("prerun.params.includeReceipts"),
+ IncludeTD: viper.GetBool("prerun.params.includeTD"),
+ IncludeCode: viper.GetBool("prerun.params.includeCode"),
}
var addrStrs []string
viper.UnmarshalKey("prerun.params.watchedAddresses", &addrStrs)
@@ -134,3 +129,25 @@ func setupPreRunRanges() []sd.RangeRequest {
return blockRanges
}
+
+// LoadConfig loads chain config from json file
+func LoadConfig(chainConfigPath string) (*params.ChainConfig, error) {
+ file, err := os.Open(chainConfigPath)
+ if err != nil {
+ log.Error(fmt.Sprintf("Failed to read chain config file: %v", err))
+
+ return nil, err
+ }
+ defer file.Close()
+
+ chainConfig := new(params.ChainConfig)
+ if err := json.NewDecoder(file).Decode(chainConfig); err != nil {
+ log.Error(fmt.Sprintf("invalid chain config file: %v", err))
+
+ return nil, err
+ }
+
+ log.Info(fmt.Sprintf("Using chain config from %s file. Content %+v", chainConfigPath, chainConfig))
+
+ return chainConfig, nil
+}
diff --git a/go.mod b/go.mod
index d550c44..9167b49 100644
--- a/go.mod
+++ b/go.mod
@@ -3,17 +3,144 @@ module github.com/vulcanize/eth-statediff-service
go 1.19
require (
+ github.com/cerc-io/plugeth-statediff v0.0.0-00010101000000-000000000000
+ github.com/ethereum/go-ethereum v1.12.0
github.com/jmoiron/sqlx v1.2.0
- github.com/prometheus/client_golang v1.4.0
- github.com/sirupsen/logrus v1.7.0
+ github.com/prometheus/client_golang v1.16.0
+ github.com/sirupsen/logrus v1.9.0
github.com/spf13/cobra v1.3.0
github.com/spf13/viper v1.10.1
- github.com/vulcanize/go-eth-state-node-iterator v1.0.3
github.com/vulcanize/leveldb-ethdb-rpc v0.1.2
)
-replace (
- github.com/cerc-io/plugeth-statediff => git.vdb.to/cerc-io/plugeth-statediff 840d4a4e5d42110e694941afa734dac8fea126fe
- github.com/ethereum/go-ethereum => git.vdb.to/cerc-io/plugeth v0.0.0-20230808125822-691dc334fab1
- // github.com/openrelayxyz/plugeth-utils => git.vdb.to/cerc-io/plugeth-utils v0.0.0-20230706160122-cd41de354c46
+require (
+ github.com/DataDog/zstd v1.5.5 // indirect
+ github.com/VictoriaMetrics/fastcache v1.12.1 // indirect
+ github.com/beorn7/perks v1.0.1 // indirect
+ github.com/btcsuite/btcd/btcec/v2 v2.3.2 // indirect
+ github.com/cerc-io/eth-iterator-utils v1.2.0 // indirect
+ github.com/cespare/xxhash/v2 v2.2.0 // indirect
+ github.com/cockroachdb/errors v1.10.0 // indirect
+ github.com/cockroachdb/logtags v0.0.0-20230118201751-21c54148d20b // indirect
+ github.com/cockroachdb/pebble v0.0.0-20230720154706-692f3b61a3c4 // indirect
+ github.com/cockroachdb/redact v1.1.5 // indirect
+ github.com/cockroachdb/tokenbucket v0.0.0-20230613231145-182959a1fad6 // indirect
+ github.com/cpuguy83/go-md2man/v2 v2.0.2 // indirect
+ github.com/davecgh/go-spew v1.1.1 // indirect
+ github.com/deckarep/golang-set/v2 v2.3.0 // indirect
+ github.com/decred/dcrd/dcrec/secp256k1/v4 v4.2.0 // indirect
+ github.com/deepmap/oapi-codegen v1.8.2 // indirect
+ github.com/edsrzf/mmap-go v1.0.0 // indirect
+ github.com/fjl/memsize v0.0.1 // indirect
+ github.com/fsnotify/fsnotify v1.6.0 // indirect
+ github.com/gballet/go-libpcsclite v0.0.0-20190607065134-2772fd86a8ff // indirect
+ github.com/georgysavva/scany v0.2.9 // indirect
+ github.com/getsentry/sentry-go v0.22.0 // indirect
+ github.com/go-ole/go-ole v1.2.6 // indirect
+ github.com/go-stack/stack v1.8.1 // indirect
+ github.com/gofrs/flock v0.8.1 // indirect
+ github.com/gogo/protobuf v1.3.2 // indirect
+ github.com/golang-jwt/jwt/v4 v4.5.0 // indirect
+ github.com/golang/protobuf v1.5.3 // indirect
+ github.com/golang/snappy v0.0.5-0.20220116011046-fa5810519dcb // indirect
+ github.com/google/uuid v1.3.0 // indirect
+ github.com/gorilla/websocket v1.5.0 // indirect
+ github.com/graph-gophers/graphql-go v1.3.0 // indirect
+ github.com/hashicorp/go-bexpr v0.1.12 // indirect
+ github.com/hashicorp/hcl v1.0.0 // indirect
+ github.com/holiman/bloomfilter/v2 v2.0.3 // indirect
+ github.com/holiman/uint256 v1.2.3 // indirect
+ github.com/huin/goupnp v1.2.0 // indirect
+ github.com/inconshreveable/log15 v2.16.0+incompatible // indirect
+ github.com/inconshreveable/mousetrap v1.0.0 // indirect
+ github.com/influxdata/influxdb-client-go/v2 v2.4.0 // indirect
+ github.com/influxdata/influxdb1-client v0.0.0-20220302092344-a9ab5670611c // indirect
+ github.com/influxdata/line-protocol v0.0.0-20210311194329-9aa0e372d097 // indirect
+ github.com/ipfs/go-cid v0.4.1 // indirect
+ github.com/jackc/chunkreader/v2 v2.0.1 // indirect
+ github.com/jackc/pgconn v1.10.0 // indirect
+ github.com/jackc/pgio v1.0.0 // indirect
+ github.com/jackc/pgpassfile v1.0.0 // indirect
+ github.com/jackc/pgproto3/v2 v2.1.1 // indirect
+ github.com/jackc/pgservicefile v0.0.0-20200714003250-2b9c44734f2b // indirect
+ github.com/jackc/pgtype v1.8.1 // indirect
+ github.com/jackc/pgx/v4 v4.13.0 // indirect
+ github.com/jackc/puddle v1.1.3 // indirect
+ github.com/jackpal/go-nat-pmp v1.0.2 // indirect
+ github.com/klauspost/compress v1.16.7 // indirect
+ github.com/klauspost/cpuid/v2 v2.2.5 // indirect
+ github.com/kr/pretty v0.3.1 // indirect
+ github.com/kr/text v0.2.0 // indirect
+ github.com/lib/pq v1.10.9 // indirect
+ github.com/magiconair/properties v1.8.5 // indirect
+ github.com/mattn/go-colorable v0.1.13 // indirect
+ github.com/mattn/go-isatty v0.0.19 // indirect
+ github.com/mattn/go-runewidth v0.0.14 // indirect
+ github.com/matttproud/golang_protobuf_extensions v1.0.4 // indirect
+ github.com/minio/sha256-simd v1.0.1 // indirect
+ github.com/mitchellh/mapstructure v1.5.0 // indirect
+ github.com/mitchellh/pointerstructure v1.2.1 // indirect
+ github.com/mr-tron/base58 v1.2.0 // indirect
+ github.com/multiformats/go-base32 v0.1.0 // indirect
+ github.com/multiformats/go-base36 v0.2.0 // indirect
+ github.com/multiformats/go-multibase v0.2.0 // indirect
+ github.com/multiformats/go-multihash v0.2.3 // indirect
+ github.com/multiformats/go-varint v0.0.7 // indirect
+ github.com/olekukonko/tablewriter v0.0.5 // indirect
+ github.com/openrelayxyz/plugeth-utils v1.2.0 // indirect
+ github.com/opentracing/opentracing-go v1.2.0 // indirect
+ github.com/pelletier/go-toml v1.9.4 // indirect
+ github.com/peterh/liner v1.1.1-0.20190123174540-a2c9a5303de7 // indirect
+ github.com/pganalyze/pg_query_go/v4 v4.2.1 // indirect
+ github.com/pkg/errors v0.9.1 // indirect
+ github.com/pmezard/go-difflib v1.0.0 // indirect
+ github.com/prometheus/client_model v0.4.0 // indirect
+ github.com/prometheus/common v0.44.0 // indirect
+ github.com/prometheus/procfs v0.11.0 // indirect
+ github.com/rivo/uniseg v0.4.4 // indirect
+ github.com/rogpeppe/go-internal v1.11.0 // indirect
+ github.com/rs/cors v1.9.0 // indirect
+ github.com/russross/blackfriday/v2 v2.1.0 // indirect
+ github.com/shirou/gopsutil v3.21.11+incompatible // indirect
+ github.com/shopspring/decimal v1.2.0 // indirect
+ github.com/spaolacci/murmur3 v1.1.0 // indirect
+ github.com/spf13/afero v1.6.0 // indirect
+ github.com/spf13/cast v1.4.1 // indirect
+ github.com/spf13/jwalterweatherman v1.1.0 // indirect
+ github.com/spf13/pflag v1.0.5 // indirect
+ github.com/status-im/keycard-go v0.2.0 // indirect
+ github.com/stretchr/objx v0.5.0 // indirect
+ github.com/stretchr/testify v1.8.2 // indirect
+ github.com/subosito/gotenv v1.2.0 // indirect
+ github.com/syndtr/goleveldb v1.0.1-0.20210819022825-2ae1ddf74ef7 // indirect
+ github.com/thoas/go-funk v0.9.3 // indirect
+ github.com/tklauser/go-sysconf v0.3.11 // indirect
+ github.com/tklauser/numcpus v0.6.1 // indirect
+ github.com/tyler-smith/go-bip39 v1.1.0 // indirect
+ github.com/urfave/cli/v2 v2.25.7 // indirect
+ github.com/xrash/smetrics v0.0.0-20201216005158-039620a65673 // indirect
+ github.com/yusufpapurcu/wmi v1.2.3 // indirect
+ golang.org/x/crypto v0.11.0 // indirect
+ golang.org/x/exp v0.0.0-20230713183714-613f0c0eb8a1 // indirect
+ golang.org/x/net v0.10.0 // indirect
+ golang.org/x/sync v0.3.0 // indirect
+ golang.org/x/sys v0.10.0 // indirect
+ golang.org/x/term v0.10.0 // indirect
+ golang.org/x/text v0.11.0 // indirect
+ golang.org/x/time v0.3.0 // indirect
+ google.golang.org/protobuf v1.31.0 // indirect
+ gopkg.in/ini.v1 v1.67.0 // indirect
+ gopkg.in/natefinch/lumberjack.v2 v2.2.1 // indirect
+ gopkg.in/natefinch/npipe.v2 v2.0.0-20160621034901-c1b8fa8bdcce // indirect
+ gopkg.in/yaml.v2 v2.4.0 // indirect
+ gopkg.in/yaml.v3 v3.0.1 // indirect
+ lukechampine.com/blake3 v1.2.1 // indirect
+)
+
+replace (
+ github.com/cerc-io/eth-iterator-utils => git.vdb.to/cerc-io/eth-iterator-utils v0.0.0-20230803115933-6bb6d4e27fd2
+ // github.com/cerc-io/plugeth-statediff => git.vdb.to/cerc-io/plugeth-statediff v0.1.0
+ github.com/cerc-io/plugeth-statediff => ../plugeth-statediff
+ github.com/ethereum/go-ethereum => git.vdb.to/cerc-io/plugeth v0.0.0-20230808125822-691dc334fab1
+ github.com/openrelayxyz/plugeth-utils => git.vdb.to/cerc-io/plugeth-utils v0.0.0-20230706160122-cd41de354c46
)
diff --git a/go.sum b/go.sum
index 4330133..a941d8e 100644
--- a/go.sum
+++ b/go.sum
@@ -1,13 +1,11 @@
cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw=
cloud.google.com/go v0.34.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw=
cloud.google.com/go v0.38.0/go.mod h1:990N+gfupTy94rShfmMCWGDn0LpTmnzTp2qbd1dvSRU=
-cloud.google.com/go v0.43.0/go.mod h1:BOSR3VbTLkk6FDC/TcffxP4NF/FFBGA5ku+jvKOP7pg=
cloud.google.com/go v0.44.1/go.mod h1:iSa0KzasP4Uvy3f1mN/7PiObzGgflwredwwASm/v6AU=
cloud.google.com/go v0.44.2/go.mod h1:60680Gw3Yr4ikxnPRS/oxxkBccT6SA1yMk63TGekxKY=
cloud.google.com/go v0.45.1/go.mod h1:RpBamKRgapWJb87xiFSdk4g1CME7QZg3uwTez+TSTjc=
cloud.google.com/go v0.46.3/go.mod h1:a6bKKbmY7er1mI7TEI4lsAkts/mkhTSZK8w33B4RAg0=
cloud.google.com/go v0.50.0/go.mod h1:r9sluTvynVuxRIOHXQEHMFffphuXHOMZMycpNR5e6To=
-cloud.google.com/go v0.51.0/go.mod h1:hWtGJ6gnXH+KgDv+V0zFGDvpi07n3z8ZNj3T1RW0Gcw=
cloud.google.com/go v0.52.0/go.mod h1:pXajvRH/6o3+F9jDHZWQ5PbGhn+o8w9qiu/CffaVdO4=
cloud.google.com/go v0.53.0/go.mod h1:fp/UouUEsRkN6ryDKNW/Upv/JBKnv6WDthjR6+vze6M=
cloud.google.com/go v0.54.0/go.mod h1:1rq2OEkV3YMf6n/9ZvGWI3GWw0VoqH/1x2nd8Is/bPc=
@@ -35,7 +33,6 @@ cloud.google.com/go/bigquery v1.4.0/go.mod h1:S8dzgnTigyfTmLBfrtrhyYhwRxG72rYxvf
cloud.google.com/go/bigquery v1.5.0/go.mod h1:snEHRnqQbz117VIFhE8bmtwIDY80NLUZUMb4Nv6dBIg=
cloud.google.com/go/bigquery v1.7.0/go.mod h1://okPTzCYNXSlb24MZs83e2Do+h+VXtc4gLoIoXIAPc=
cloud.google.com/go/bigquery v1.8.0/go.mod h1:J5hqkt3O0uAFnINi6JXValWIb1v0goeZM77hZzJN/fQ=
-cloud.google.com/go/bigtable v1.2.0/go.mod h1:JcVAOl45lrTmQfLj7T6TxyMzIN/3FGGcFm+2xVAli2o=
cloud.google.com/go/datastore v1.0.0/go.mod h1:LXYbyblFSglQ5pkeyhO+Qmw7ukd3C+pD7TKLgZqpHYE=
cloud.google.com/go/datastore v1.1.0/go.mod h1:umbIZjpQpHh4hmRpGhH4tLFup+FVzqBi1b3c64qFpCk=
cloud.google.com/go/firestore v1.6.1/go.mod h1:asNXNOzBdyVQmEU+ggO8UPodTkEVFW5Qx+rwHnAz+EY=
@@ -48,72 +45,56 @@ cloud.google.com/go/storage v1.5.0/go.mod h1:tpKbwo567HUNpVclU5sGELwQWBDZ8gh0Zeo
cloud.google.com/go/storage v1.6.0/go.mod h1:N7U0C8pVQ/+NIKOBQyamJIeKQKkZ+mxpohlUTyfDhBk=
cloud.google.com/go/storage v1.8.0/go.mod h1:Wv1Oy7z6Yz3DshWRJFhqM/UCfaWIRTdp0RXyy7KQOVs=
cloud.google.com/go/storage v1.10.0/go.mod h1:FLPqc6j+Ki4BU591ie1oL6qBQGu2Bl/tZ9ullr3+Kg0=
-collectd.org v0.3.0/go.mod h1:A/8DzQBkF6abtvrT2j/AU/4tiBgJWYyh0y/oB/4MlWE=
dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU=
-github.com/Azure/azure-sdk-for-go/sdk/azcore v0.21.1/go.mod h1:fBF9PQNqB8scdgpZ3ufzaLntG0AG7C1WjPMsiFOmfHM=
-github.com/Azure/azure-sdk-for-go/sdk/internal v0.8.3/go.mod h1:KLF4gFr6DcKFZwSuH8w8yEK6DpFl3LP5rhdvAb7Yz5I=
-github.com/Azure/azure-sdk-for-go/sdk/storage/azblob v0.3.0/go.mod h1:tPaiy8S5bQ+S5sOiDlINkp7+Ef339+Nz5L5XO+cnOHo=
+git.vdb.to/cerc-io/eth-iterator-utils v0.0.0-20230803115933-6bb6d4e27fd2 h1:UImCl/qXSk9WD5hG1PLS4wfjkHIdgr+5BvzsNqeWEv4=
+git.vdb.to/cerc-io/eth-iterator-utils v0.0.0-20230803115933-6bb6d4e27fd2/go.mod h1:VtTq+MbVe5aKTtb/CoSySjz5vXPFOs9HPBTALmEUfj4=
+git.vdb.to/cerc-io/plugeth v0.0.0-20230808125822-691dc334fab1 h1:KLjxHwp9Zp7xhECccmJS00RiL+VwTuUGLU7qeIctg8g=
+git.vdb.to/cerc-io/plugeth v0.0.0-20230808125822-691dc334fab1/go.mod h1:cYXZu70+6xmDgIgrTD81GPasv16piiAFJnKyAbwVPMU=
+git.vdb.to/cerc-io/plugeth-utils v0.0.0-20230706160122-cd41de354c46 h1:KYcbbne/RXd7AuxbUd/3hgk1jPN+33k2CKiNsUsMCC0=
+git.vdb.to/cerc-io/plugeth-utils v0.0.0-20230706160122-cd41de354c46/go.mod h1:VpDN61dxy64zGff05F0adujR5enD/JEdXBkTQ+PaIsQ=
github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU=
github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo=
-github.com/DATA-DOG/go-sqlmock v1.3.3/go.mod h1:f/Ixk793poVmq4qj/V1dPUg2JEAKC73Q5eFN3EC/SaM=
github.com/DataDog/datadog-go v3.2.0+incompatible/go.mod h1:LButxg5PwREeZtORoXG3tL4fMGNddJ+vMq1mwgfaqoQ=
+github.com/DataDog/zstd v1.5.5 h1:oWf5W7GtOLgp6bciQYDmhHHjdhYkALu6S/5Ni9ZgSvQ=
+github.com/DataDog/zstd v1.5.5/go.mod h1:g4AWEaM3yOg3HYfnJ3YIawPnVdXJh9QME85blwSAmyw=
github.com/Masterminds/semver/v3 v3.1.1/go.mod h1:VPu/7SZ7ePZ3QOrcuXROw5FAcLl4a0cBrbBpGY/8hQs=
github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU=
-github.com/StackExchange/wmi v0.0.0-20180116203802-5d049714c4a6 h1:fLjPD/aNc3UIOA6tDi6QXUemppXK3P9BI7mr2hd6gx8=
-github.com/StackExchange/wmi v0.0.0-20180116203802-5d049714c4a6/go.mod h1:3eOhrUMpNV+6aFIbp5/iudMxNCF27Vw2OZgy4xEx0Fg=
-github.com/VictoriaMetrics/fastcache v1.6.0 h1:C/3Oi3EiBCqufydp1neRZkqcwmEiuRT9c3fqvvgKm5o=
-github.com/VictoriaMetrics/fastcache v1.6.0/go.mod h1:0qHz5QP0GMX4pfmMA/zt5RgfNuXJrTP0zS7DqpHGGTw=
-github.com/ajstarks/svgo v0.0.0-20180226025133-644b8db467af/go.mod h1:K08gAheRH3/J6wwsYMMT4xOr94bZjxIelGM0+d/wbFw=
+github.com/VictoriaMetrics/fastcache v1.12.1 h1:i0mICQuojGDL3KblA7wUNlY5lOK6a4bwt3uRKnkZU40=
+github.com/VictoriaMetrics/fastcache v1.12.1/go.mod h1:tX04vaqcNoQeGLD+ra5pU5sWkuxnzWhEzLwhP9w653o=
github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc=
github.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc=
github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0=
github.com/alecthomas/units v0.0.0-20190717042225-c3de453c63f4/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0=
github.com/allegro/bigcache v1.2.1-0.20190218064605-e24eb225f156 h1:eMwmnE/GDgah4HI848JfFxHt+iPb26b4zyfspmqY0/8=
github.com/allegro/bigcache v1.2.1-0.20190218064605-e24eb225f156/go.mod h1:Cb/ax3seSYIx7SuZdm2G2xzfwmv3TPSk2ucNfQESPXM=
-github.com/andreyvit/diff v0.0.0-20170406064948-c7f18ee00883/go.mod h1:rCTlJbsFo29Kk6CurOXKm700vrz8f0KW0JNfpkRJY/8=
github.com/antihax/optional v1.0.0/go.mod h1:uupD/76wgC+ih3iEmQUL+0Ugr19nfwCT1kdvxnR2qWY=
-github.com/apache/arrow/go/arrow v0.0.0-20191024131854-af6fa24be0db/go.mod h1:VTxUBvSJ3s3eHAg65PNgrsn5BtqCRPdmyXh6rAfdxN0=
github.com/armon/circbuf v0.0.0-20150827004946-bbbad097214e/go.mod h1:3U/XgcO3hCbHZ8TKRvWD2dDTCfh9M9ya+I9JpbB7O8o=
github.com/armon/go-metrics v0.0.0-20180917152333-f0300d1749da/go.mod h1:Q73ZrmVTwzkszR9V5SSuryQ31EELlFMUz1kKyl939pY=
github.com/armon/go-metrics v0.3.10/go.mod h1:4O98XIr/9W0sxpJ8UaYkvjk10Iff7SnFrb4QAOwNTFc=
github.com/armon/go-radix v0.0.0-20180808171621-7fddfc383310/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8=
github.com/armon/go-radix v1.0.0/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8=
-github.com/aws/aws-sdk-go-v2 v1.2.0/go.mod h1:zEQs02YRBw1DjK0PoJv3ygDYOFTre1ejlJWl8FwAuQo=
-github.com/aws/aws-sdk-go-v2/config v1.1.1/go.mod h1:0XsVy9lBI/BCXm+2Tuvt39YmdHwS5unDQmxZOYe8F5Y=
-github.com/aws/aws-sdk-go-v2/credentials v1.1.1/go.mod h1:mM2iIjwl7LULWtS6JCACyInboHirisUUdkBPoTHMOUo=
-github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.0.2/go.mod h1:3hGg3PpiEjHnrkrlasTfxFqUsZ2GCk/fMUn4CbKgSkM=
-github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.0.2/go.mod h1:45MfaXZ0cNbeuT0KQ1XJylq8A6+OpVV2E5kvY/Kq+u8=
-github.com/aws/aws-sdk-go-v2/service/route53 v1.1.1/go.mod h1:rLiOUrPLW/Er5kRcQ7NkwbjlijluLsrIbu/iyl35RO4=
-github.com/aws/aws-sdk-go-v2/service/sso v1.1.1/go.mod h1:SuZJxklHxLAXgLTc1iFXbEWkXs7QRTQpCLGaKIprQW0=
-github.com/aws/aws-sdk-go-v2/service/sts v1.1.1/go.mod h1:Wi0EBZwiz/K44YliU0EKxqTCJGUfYTWXrrBwkq736bM=
-github.com/aws/smithy-go v1.1.0/go.mod h1:EzMw8dbp/YJL4A5/sbhGddag+NPT7q084agLbB9LgIw=
github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q=
github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8=
github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM=
github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw=
github.com/bgentry/speakeasy v0.1.0/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kBD4zp0CCIs=
-github.com/bmizerany/pat v0.0.0-20170815010413-6226ea591a40/go.mod h1:8rLXio+WjiTceGBHIoTvn60HIbs7Hm7bcHjyrSqYB9c=
-github.com/boltdb/bolt v1.3.1/go.mod h1:clJnj/oiGkjum5o1McbSZDSLxVThjynRyGBgiAx27Ps=
-github.com/btcsuite/btcd/btcec/v2 v2.2.0 h1:fzn1qaOt32TuLjFlkzYSsBC35Q3KUjT1SwPxiMSCF5k=
-github.com/btcsuite/btcd/btcec/v2 v2.2.0/go.mod h1:U7MHm051Al6XmscBQ0BoNydpOTsFAn707034b5nY8zU=
+github.com/btcsuite/btcd/btcec/v2 v2.3.2 h1:5n0X6hX0Zk+6omWcihdYvdAlGf2DfasC0GMf7DClJ3U=
+github.com/btcsuite/btcd/btcec/v2 v2.3.2/go.mod h1:zYzJ8etWJQIv1Ogk7OzpWjowwOdXY1W/17j2MW85J04=
github.com/btcsuite/btcd/chaincfg/chainhash v1.0.1 h1:q0rUy8C/TYNBQS1+CGKw68tLOFYSNEs0TFnxxnS9+4U=
-github.com/btcsuite/btcd/chaincfg/chainhash v1.0.1/go.mod h1:7SFka0XMvUgj3hfZtydOrQY2mwhPclbT2snogU7SQQc=
-github.com/c-bata/go-prompt v0.2.2/go.mod h1:VzqtzE2ksDBcdln8G7mk2RX9QyGjH+OVqOCSiVIqS34=
github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU=
github.com/census-instrumentation/opencensus-proto v0.3.0/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU=
github.com/cespare/cp v0.1.0 h1:SE+dxFebS7Iik5LK0tsi1k9ZCxEaFX4AjQmoyA+1dJk=
-github.com/cespare/cp v0.1.0/go.mod h1:SOGHArjBr4JWaSDEVpWpo/hNg6RoKrls6Oh40hiwW+s=
github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc=
github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=
-github.com/cespare/xxhash/v2 v2.1.2 h1:YRXhKfTDauu4ajMg1TPgFO5jnlC2HCbmLXMcTG5cbYE=
github.com/cespare/xxhash/v2 v2.1.2/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=
+github.com/cespare/xxhash/v2 v2.2.0 h1:DC2CZ1Ep5Y4k3ZQ899DldepgrayRUGE6BBZ/cd9Cj44=
+github.com/cespare/xxhash/v2 v2.2.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=
github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI=
github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI=
github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU=
github.com/circonus-labs/circonus-gometrics v2.3.1+incompatible/go.mod h1:nmEj6Dob7S7YxXgwXpfOuvO54S+tGdZdw9fuRZt25Ag=
github.com/circonus-labs/circonusllhist v0.1.3/go.mod h1:kMXHVDlOchFAehlya5ePtbp5jckzBHf4XRpQvBOLI+I=
github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw=
-github.com/cloudflare/cloudflare-go v0.14.0/go.mod h1:EnwdgGMaFOruiPZRFSgn+TsQ3hQ7C/YWzIGLeu5c304=
github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc=
github.com/cncf/udpa/go v0.0.0-20200629203442-efcf912fb354/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk=
github.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk=
@@ -128,42 +109,41 @@ github.com/cockroachdb/apd v1.1.0 h1:3LFP3629v+1aKXU5Q37mxmRxX/pIu1nijXydLShEq5I
github.com/cockroachdb/apd v1.1.0/go.mod h1:8Sl8LxpKi29FqWXR16WEFZRNSz3SoPzUzeMeY4+DwBQ=
github.com/cockroachdb/cockroach-go/v2 v2.0.3 h1:ZA346ACHIZctef6trOTwBAEvPVm1k0uLm/bb2Atc+S8=
github.com/cockroachdb/cockroach-go/v2 v2.0.3/go.mod h1:hAuDgiVgDVkfirP9JnhXEfcXEPRKBpYdGz+l7mvYSzw=
-github.com/consensys/bavard v0.1.8-0.20210406032232-f3452dc9b572/go.mod h1:Bpd0/3mZuaj6Sj+PqrmIquiOKy397AKGThQPaGzNXAQ=
-github.com/consensys/gnark-crypto v0.4.1-0.20210426202927-39ac3d4b3f1f/go.mod h1:815PAHg3wvysy0SyIqanF8gZ0Y1wjk/hrDHD/iT88+Q=
+github.com/cockroachdb/datadriven v1.0.3-0.20230413201302-be42291fc80f h1:otljaYPt5hWxV3MUfO5dFPFiOXg9CyG5/kCfayTqsJ4=
+github.com/cockroachdb/errors v1.10.0 h1:lfxS8zZz1+OjtV4MtNWgboi/W5tyLEB6VQZBXN+0VUU=
+github.com/cockroachdb/errors v1.10.0/go.mod h1:lknhIsEVQ9Ss/qKDBQS/UqFSvPQjOwNq2qyKAxtHRqE=
+github.com/cockroachdb/logtags v0.0.0-20230118201751-21c54148d20b h1:r6VH0faHjZeQy818SGhaone5OnYfxFR/+AzdY3sf5aE=
+github.com/cockroachdb/logtags v0.0.0-20230118201751-21c54148d20b/go.mod h1:Vz9DsVWQQhf3vs21MhPMZpMGSht7O/2vFW2xusFUVOs=
+github.com/cockroachdb/pebble v0.0.0-20230720154706-692f3b61a3c4 h1:hAtIkNbQFeZbK6KEjiqyuWbegSeuLOTD8+hK7wn6+pI=
+github.com/cockroachdb/pebble v0.0.0-20230720154706-692f3b61a3c4/go.mod h1:FN5O47SBEz5+kO9fG8UTR64g2WS1u5ZFCgTvxGjoSks=
+github.com/cockroachdb/redact v1.1.5 h1:u1PMllDkdFfPWaNGMyLD1+so+aq3uUItthCFqzwPJ30=
+github.com/cockroachdb/redact v1.1.5/go.mod h1:BVNblN9mBWFyMyqK1k3AAiSxhvhfK2oOZZ2lK+dpvRg=
+github.com/cockroachdb/tokenbucket v0.0.0-20230613231145-182959a1fad6 h1:DJK8W/iB+s/qkTtmXSrHA49lp5O3OsR7E6z4byOLy34=
+github.com/cockroachdb/tokenbucket v0.0.0-20230613231145-182959a1fad6/go.mod h1:7nc4anLGjupUW/PeY5qiNYsdNXj7zopG+eqsS7To5IQ=
github.com/coreos/go-semver v0.3.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk=
github.com/coreos/go-systemd v0.0.0-20190321100706-95778dfbb74e/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4=
github.com/coreos/go-systemd v0.0.0-20190719114852-fd7a80b32e1f/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4=
github.com/coreos/go-systemd/v22 v22.3.2/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc=
-github.com/cpuguy83/go-md2man/v2 v2.0.0-20190314233015-f79a8a8ca69d/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU=
github.com/cpuguy83/go-md2man/v2 v2.0.1/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o=
+github.com/cpuguy83/go-md2man/v2 v2.0.2 h1:p1EgwI/C7NhT0JmVkwCD2ZBK8j4aeHQX2pMHHBfMQ6w=
+github.com/cpuguy83/go-md2man/v2 v2.0.2/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o=
github.com/creack/pty v1.1.7/go.mod h1:lj5s0c3V2DBrqTV7llrYr5NG6My20zk30Fl46Y7DoTY=
github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E=
github.com/cyberdelia/templates v0.0.0-20141128023046-ca7fffd4298c/go.mod h1:GyV+0YP4qX0UQ7r2MoYZ+AvYDp12OF5yg4q8rGnyNh4=
-github.com/dave/jennifer v1.2.0/go.mod h1:fIb+770HOpJ2fmN9EPPKOqm1vMGhB+TwXKMZhrIygKg=
github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
-github.com/deckarep/golang-set v1.8.0 h1:sk9/l/KqpunDwP7pSjUg0keiOOLEnOBHzykLrsPppp4=
-github.com/deckarep/golang-set v1.8.0/go.mod h1:5nI87KwE7wgsBU1F4GKAw2Qod7p5kyS383rP6+o6qqo=
-github.com/decred/dcrd/crypto/blake256 v1.0.0 h1:/8DMNYp9SGi5f0w7uCm6d6M4OU2rGFK09Y2A4Xv7EE0=
-github.com/decred/dcrd/crypto/blake256 v1.0.0/go.mod h1:sQl2p6Y26YV+ZOcSTP6thNdn47hh8kt6rqSlvmrXFAc=
-github.com/decred/dcrd/dcrec/secp256k1/v4 v4.0.1 h1:YLtO71vCjJRCBcrPMtQ9nqBsqpA1m5sE92cU+pd5Mcc=
-github.com/decred/dcrd/dcrec/secp256k1/v4 v4.0.1/go.mod h1:hyedUtir6IdtD/7lIxGeCxkaw7y45JueMRL4DIyJDKs=
+github.com/deckarep/golang-set/v2 v2.3.0 h1:qs18EKUfHm2X9fA50Mr/M5hccg2tNnVqsiBImnyDs0g=
+github.com/deckarep/golang-set/v2 v2.3.0/go.mod h1:VAky9rY/yGXJOLEDv3OMci+7wtDpOF4IN+y82NBOac4=
+github.com/decred/dcrd/crypto/blake256 v1.0.1 h1:7PltbUIQB7u/FfZ39+DGa/ShuMyJ5ilcvdfma9wOH6Y=
+github.com/decred/dcrd/dcrec/secp256k1/v4 v4.2.0 h1:8UrgZ3GkP4i/CLijOJx79Yu+etlyjdBU4sfcs2WYQMs=
+github.com/decred/dcrd/dcrec/secp256k1/v4 v4.2.0/go.mod h1:v57UDF4pDQJcEfFUCRop3lJL149eHGSe9Jvczhzjo/0=
github.com/deepmap/oapi-codegen v1.6.0/go.mod h1:ryDa9AgbELGeB+YEXE1dR53yAjHwFvE9iAUlWl9Al3M=
github.com/deepmap/oapi-codegen v1.8.2 h1:SegyeYGcdi0jLLrpbCMoJxnUUn8GBXHsvr4rbzjuhfU=
github.com/deepmap/oapi-codegen v1.8.2/go.mod h1:YLgSKSDv/bZQB7N4ws6luhozi3cEdRktEqrX88CvjIw=
github.com/denisenkom/go-mssqldb v0.0.0-20191124224453-732737034ffd/go.mod h1:xbL0rPBG9cCiLr28tMa8zpbdarY27NDyej4t/EjAShU=
github.com/dgrijalva/jwt-go v3.2.0+incompatible/go.mod h1:E3ru+11k8xSBh+hMPgOLZmtrrCbhqsmaPHjLKYnJCaQ=
-github.com/dgryski/go-bitstream v0.0.0-20180413035011-3522498ce2c8/go.mod h1:VMaSuZ+SZcx/wljOQKvp5srsbCiKDEb6K2wC4+PiBmQ=
-github.com/dgryski/go-sip13 v0.0.0-20181026042036-e10d5fee7954/go.mod h1:vAd38F8PWV+bWy6jNmig1y/TA+kYO4g3RSRF0IAv0no=
-github.com/dlclark/regexp2 v1.4.1-0.20201116162257-a2a8dda75c91/go.mod h1:2pZnwuY/m+8K6iRw6wQdMtk+rH5tNGR1i55kozfMjCc=
-github.com/dnaeon/go-vcr v1.1.0/go.mod h1:M7tiix8f0r6mKKJ3Yq/kqU1OYf3MnfmBWVbPx/yU9ko=
-github.com/dnaeon/go-vcr v1.2.0/go.mod h1:R4UdLID7HZT3taECzJs4YgbbH6PIGXB6W/sc5OLb6RQ=
github.com/docker/docker v1.6.2 h1:HlFGsy+9/xrgMmhmN+NGhCc5SHGJ7I+kHosRR1xc/aI=
-github.com/docker/docker v1.6.2/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk=
-github.com/dop251/goja v0.0.0-20220405120441-9037c2b61cbf/go.mod h1:R9ET47fwRVRPZnOGvHxxhuZcbrMCuiqOz3Rlrh4KSnk=
-github.com/dop251/goja_nodejs v0.0.0-20210225215109-d91c329300e7/go.mod h1:hn7BA7c8pLvoGndExHudxTDKZ84Pyvv+90pbBjbTz0Y=
-github.com/eclipse/paho.mqtt.golang v1.2.0/go.mod h1:H9keYFcgq3Qr5OUJm/JZI/i6U7joQ8SYLhZwfeOo6Ts=
github.com/edsrzf/mmap-go v1.0.0 h1:CEBF7HpRnUCSJgGUb5h1Gm7e3VkmVDrR8lvWVLtrOFw=
github.com/edsrzf/mmap-go v1.0.0/go.mod h1:YO35OhQPt3KJa3ryjFM5Bs14WD66h8eGKpfaBNrHW5M=
github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4=
@@ -181,61 +161,55 @@ github.com/erikstmartin/go-testdb v0.0.0-20160219214506-8d10e4a1bae5/go.mod h1:a
github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4=
github.com/fatih/color v1.9.0/go.mod h1:eQcE1qtQxscV5RaZvpXrrb8Drkc3/DdQ+uUYCNjL+zU=
github.com/fatih/color v1.13.0/go.mod h1:kLAiJbzzSOZDVNGyDpeOxJ47H46qBXwg5ILebYFFOfk=
-github.com/fjl/gencodec v0.0.0-20220412091415-8bb9e558978c/go.mod h1:AzA8Lj6YtixmJWL+wkKoBGsLWy9gFrAzi4g+5bCKwpY=
-github.com/fjl/memsize v0.0.0-20190710130421-bcb5799ab5e5 h1:FtmdgXiUlNeRsoNMFlKLDt+S+6hbjVMEW6RGQ7aUf7c=
-github.com/fjl/memsize v0.0.0-20190710130421-bcb5799ab5e5/go.mod h1:VvhXpOYNQvB+uIk2RvXzuaQtkQJzzIx6lSBe1xv7hi0=
-github.com/fogleman/gg v1.2.1-0.20190220221249-0403632d5b90/go.mod h1:R/bRT+9gY/C5z7JzPU0zXsXHKM4/ayA+zqcVNZzPa1k=
+github.com/fjl/memsize v0.0.1 h1:+zhkb+dhUgx0/e+M8sF0QqiouvMQUiKR+QYvdxIOKcQ=
+github.com/fjl/memsize v0.0.1/go.mod h1:VvhXpOYNQvB+uIk2RvXzuaQtkQJzzIx6lSBe1xv7hi0=
github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo=
github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ=
-github.com/fsnotify/fsnotify v1.5.1 h1:mZcQUHVQUQWoPXXtuf9yuEXKudkV2sx1E06UadKWpgI=
github.com/fsnotify/fsnotify v1.5.1/go.mod h1:T3375wBYaZdLLcVNkcVbzGHY7f1l/uK5T5Ai1i3InKU=
-github.com/garslo/gogen v0.0.0-20170306192744-1d203ffc1f61/go.mod h1:Q0X6pkwTILDlzrGEckF6HKjXe48EgsY/l7K7vhY4MW8=
+github.com/fsnotify/fsnotify v1.6.0 h1:n+5WquG0fcWoWp6xPWfHdbskMCQaFnG6PfBrh1Ky4HY=
+github.com/fsnotify/fsnotify v1.6.0/go.mod h1:sl3t1tCWJFWoRz9R8WJCbQihKKwmorjAbSClcnxKAGw=
github.com/gballet/go-libpcsclite v0.0.0-20190607065134-2772fd86a8ff h1:tY80oXqGNY4FhTFhk+o9oFHGINQ/+vhlm8HFzi6znCI=
github.com/gballet/go-libpcsclite v0.0.0-20190607065134-2772fd86a8ff/go.mod h1:x7DCsMOv1taUwEWCzT4cmDeAkigA5/QCwUodaVOe8Ww=
github.com/georgysavva/scany v0.2.9 h1:Xt6rjYpHnMClTm/g+oZTnoSxUwiln5GqMNU+QeLNHQU=
github.com/georgysavva/scany v0.2.9/go.mod h1:yeOeC1BdIdl6hOwy8uefL2WNSlseFzbhlG/frrh65SA=
github.com/getkin/kin-openapi v0.53.0/go.mod h1:7Yn5whZr5kJi6t+kShccXS8ae1APpYTW6yheSwk8Yi4=
github.com/getkin/kin-openapi v0.61.0/go.mod h1:7Yn5whZr5kJi6t+kShccXS8ae1APpYTW6yheSwk8Yi4=
+github.com/getsentry/sentry-go v0.22.0 h1:XNX9zKbv7baSEI65l+H1GEJgSeIC1c7EN5kluWaP6dM=
+github.com/getsentry/sentry-go v0.22.0/go.mod h1:lc76E2QywIyW8WuBnwl8Lc4bkmQH4+w1gwTf25trprY=
github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04=
-github.com/glycerine/go-unsnap-stream v0.0.0-20180323001048-9f0cb55181dd/go.mod h1:/20jfyN9Y5QPEAprSgKAUr+glWDY39ZiUEAYOEv5dsE=
-github.com/glycerine/goconvey v0.0.0-20190410193231-58a59202ab31/go.mod h1:Ogl1Tioa0aV7gstGFO7KhffUsb9M4ydbEbbxpcEDc24=
github.com/go-chi/chi/v5 v5.0.0/go.mod h1:BBug9lr0cqtdAhsu6R4AAdvufI0/XBzAQSsUqJpoZOs=
+github.com/go-errors/errors v1.4.2 h1:J6MZopCL4uSllY1OfXM374weqZFFItUbrImctkmUxIA=
github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU=
github.com/go-gl/glfw/v3.3/glfw v0.0.0-20191125211704-12ad95a8df72/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8=
github.com/go-gl/glfw/v3.3/glfw v0.0.0-20200222043503-6f7a984d4dc4/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8=
github.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as=
github.com/go-kit/kit v0.9.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as=
-github.com/go-kit/kit v0.10.0 h1:dXFJfIHVvUcpSgDOV+Ne6t7jXri8Tfv2uOLHUZ2XNuo=
github.com/go-kit/log v0.1.0/go.mod h1:zbhenjAZHb184qTLMA9ZjW7ThYL0H2mk7Q6pNt4vbaY=
github.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE=
github.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk=
-github.com/go-logfmt/logfmt v0.5.0 h1:TrB8swr/68K7m9CcGut2g3UOihhbcbiMAYiuTXdEih4=
github.com/go-logfmt/logfmt v0.5.0/go.mod h1:wCYkCAKZfumFQihp8CzCvQ3paCTfi41vtzG1KdI/P7A=
-github.com/go-ole/go-ole v1.2.1 h1:2lOsA72HgjxAuMlKpFiCbHTvu44PIVkZ5hqm3RSdI/E=
-github.com/go-ole/go-ole v1.2.1/go.mod h1:7FAglXiTm7HKlQRDeOQ6ZNUHidzCWXuZWq/1dTyBNF8=
+github.com/go-ole/go-ole v1.2.6 h1:/Fpf6oFPoeFik9ty7siob0G6Ke8QvQEuVcuChpwXzpY=
+github.com/go-ole/go-ole v1.2.6/go.mod h1:pprOEPIfldk/42T2oK7lQ4v4JSDwmV0As9GaiUsvbm0=
github.com/go-openapi/jsonpointer v0.19.5/go.mod h1:Pl9vOtqEWErmShwVjC8pYs9cog34VGT37dQOVbmoatg=
github.com/go-openapi/swag v0.19.5/go.mod h1:POnQmlKehdgb5mhVOsnJFsivZCEZ/vjK9gh66Z9tfKk=
-github.com/go-sourcemap/sourcemap v2.1.3+incompatible/go.mod h1:F8jJfvm2KbVjc5NqelyYJmf/v5J0dwNLS2mL4sNA1Jg=
github.com/go-sql-driver/mysql v1.4.0/go.mod h1:zAC/RDZ24gD3HViQzih4MyKcchzm+sOG5ZlKdlhCg5w=
github.com/go-sql-driver/mysql v1.4.1 h1:g24URVg0OFbNUTx9qqY1IRZ9D9z3iPyi5zKhQZpNwpA=
github.com/go-sql-driver/mysql v1.4.1/go.mod h1:zAC/RDZ24gD3HViQzih4MyKcchzm+sOG5ZlKdlhCg5w=
-github.com/go-stack/stack v1.8.0 h1:5SgMzNM5HxrEjV0ww2lTmX6E2Izsfxas4+YHWRs3Lsk=
github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY=
+github.com/go-stack/stack v1.8.1 h1:ntEHSVwIt7PNXNpgPmVfMrNhLtgjlmnZha2kOpuRiDw=
+github.com/go-stack/stack v1.8.1/go.mod h1:dcoOX6HbPZSZptuspn9bctJ+N/CnF5gGygcUP3XYfe4=
github.com/godbus/dbus/v5 v5.0.4/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA=
+github.com/gofrs/flock v0.8.1 h1:+gYjHKf32LDeiEEFhQaotPbLuUXjY5ZqxKgXy7n59aw=
+github.com/gofrs/flock v0.8.1/go.mod h1:F1TvTiK9OcQqauNUHlbJvyl9Qa1QvF/gOUDKA14jxHU=
github.com/gofrs/uuid v3.2.0+incompatible/go.mod h1:b2aQJv3Z4Fp6yNu3cdSllBxTCLRxnplIgP/c0N/04lM=
-github.com/gofrs/uuid v3.3.0+incompatible/go.mod h1:b2aQJv3Z4Fp6yNu3cdSllBxTCLRxnplIgP/c0N/04lM=
github.com/gofrs/uuid v4.0.0+incompatible h1:1SD/1F5pU8p29ybwgQSwpQk+mwdRrXCYuPhW6m+TnJw=
github.com/gofrs/uuid v4.0.0+incompatible/go.mod h1:b2aQJv3Z4Fp6yNu3cdSllBxTCLRxnplIgP/c0N/04lM=
github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ=
-github.com/gogo/protobuf v1.2.1/go.mod h1:hp+jE20tsWTFYpLwKvXlhS1hjn+gTNwPg2I6zVXpSg4=
-github.com/gogo/protobuf v1.3.1/go.mod h1:SlYgWuQ5SjCEi6WLHjHCa1yvBfUnHcTbrrZtXPKa29o=
github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q=
github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q=
-github.com/golang-jwt/jwt/v4 v4.3.0 h1:kHL1vqdqWNfATmA0FNMdmZNMyZI1U6O31X4rlIPoBog=
-github.com/golang-jwt/jwt/v4 v4.3.0/go.mod h1:/xlHOz8bRuivTWchD4jCa+NbatV+wEUSzwAxVc6locg=
+github.com/golang-jwt/jwt/v4 v4.5.0 h1:7cYmW1XlMY7h7ii7UhUyChSgS5wUJEnm9uZVTGqOWzg=
+github.com/golang-jwt/jwt/v4 v4.5.0/go.mod h1:m21LjoU+eqJr34lmDMbreY2eSTRJ1cv77w39/MY0Ch0=
github.com/golang-sql/civil v0.0.0-20190719163853-cb61b32ac6fe/go.mod h1:8vg3r2VgvsThLBIFL93Qb5yWzgyZWhEmBwUJWevAkK0=
-github.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0/go.mod h1:E/TSTwGwJL78qG/PmXZO1EjYhfJinVAhrmmHX6Z8B9k=
-github.com/golang/geo v0.0.0-20190916061304-5b978397cfec/go.mod h1:QZ0nwyI2jOfgRAoBvP+ab5aRr7c9x7lhGEJrKvBwjWI=
github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q=
github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=
github.com/golang/groupcache v0.0.0-20191227052852-215e87163ea7/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=
@@ -249,6 +223,7 @@ github.com/golang/mock v1.4.1/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt
github.com/golang/mock v1.4.3/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw=
github.com/golang/mock v1.4.4/go.mod h1:l3mdAwkq5BuhzHwde/uurv3sEJeZMXNpwsxVWU71h+4=
github.com/golang/mock v1.5.0/go.mod h1:CWnOUgYIOo4TcNZ0wHX3YZCqsaM1I1Jvs6v3mP3KVu8=
+github.com/golang/mock v1.6.0 h1:ErTB+efbowRARo13NNdxyJji2egdxLGQhRaY+DUumQc=
github.com/golang/mock v1.6.0/go.mod h1:p6yTPP+5HYm5mzsMV8JkE6ZKdX+/wYM6Hr+LicevLPs=
github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
@@ -266,16 +241,16 @@ github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw
github.com/golang/protobuf v1.4.3/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI=
github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk=
github.com/golang/protobuf v1.5.1/go.mod h1:DopwsBzvsk0Fs44TXzsVbJyPhcCPeIwnvohx4u74HPM=
-github.com/golang/protobuf v1.5.2 h1:ROPKBNFfQgOUMifHyP+KYbvpjbdoFNs+aK7DXlji0Tw=
github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY=
-github.com/golang/snappy v0.0.0-20180518054509-2e65f85255db/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q=
+github.com/golang/protobuf v1.5.3 h1:KhyjKVUg7Usr/dYsdSqoFveMYd5ko72D+zANwlG1mmg=
+github.com/golang/protobuf v1.5.3/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY=
github.com/golang/snappy v0.0.3/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q=
-github.com/golang/snappy v0.0.4 h1:yAGX7huGHXlcLOEtBnF4w7FQwA26wojNCwOYAEhLjQM=
github.com/golang/snappy v0.0.4/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q=
+github.com/golang/snappy v0.0.5-0.20220116011046-fa5810519dcb h1:PBC98N2aIaM3XXiurYmW7fx4GZkL8feAMVq7nEjURHk=
+github.com/golang/snappy v0.0.5-0.20220116011046-fa5810519dcb/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q=
github.com/golangci/lint-1 v0.0.0-20181222135242-d2cdd8c08219/go.mod h1:/X8TswGSh1pIozq4ZwCfxS0WA5JGXguxk94ar/4c87Y=
github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ=
github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ=
-github.com/google/flatbuffers v1.11.0/go.mod h1:1AeVuKshWv4vARoZatz6mlQ0JxURH0Kv5+zNeJKJCa8=
github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M=
github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=
github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=
@@ -287,10 +262,9 @@ github.com/google/go-cmp v0.5.2/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/
github.com/google/go-cmp v0.5.3/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
github.com/google/go-cmp v0.5.4/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
-github.com/google/go-cmp v0.5.6 h1:BKbKCqvP6I+rmFHt06ZmyQtvB8xAkWdhFyr0ZUNZcxQ=
github.com/google/go-cmp v0.5.6/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
+github.com/google/go-cmp v0.5.9 h1:O2Tfq5qg4qc4AmwVlvv0oLiVAGB7enBSJ2x2DqQFi38=
github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg=
-github.com/google/gofuzz v1.1.1-0.20200604201612-c04b05f3adfa/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg=
github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs=
github.com/google/martian/v3 v3.0.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0=
github.com/google/martian/v3 v3.1.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0=
@@ -310,29 +284,24 @@ github.com/google/pprof v0.0.0-20210601050228-01bbb1931b22/go.mod h1:kpwsk12EmLe
github.com/google/pprof v0.0.0-20210609004039-a478d1d731e9/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE=
github.com/google/pprof v0.0.0-20210720184732-4bb14d4b1be1/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE=
github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI=
-github.com/google/uuid v1.1.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
-github.com/google/uuid v1.2.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
github.com/google/uuid v1.3.0 h1:t6JiXgmwXMjEs8VusXIJk2BXHsn+wx8BZdTaoZ5fu7I=
github.com/google/uuid v1.3.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg=
github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk=
github.com/googleapis/gax-go/v2 v2.1.0/go.mod h1:Q3nei7sK6ybPYH7twZdmQpAd1MKb7pfu6SK+H1/DsU0=
github.com/googleapis/gax-go/v2 v2.1.1/go.mod h1:hddJymUZASv3XPyGkUpKj8pPO47Rmb0eJc8R6ouapiM=
-github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY=
github.com/gorilla/mux v1.8.0/go.mod h1:DVbg23sWSpFRCP0SfiEN6jmj59UnW/n46BH5rLB71So=
-github.com/gorilla/websocket v1.4.2 h1:+/TMaTYc4QFitKJxsQ7Yye35DkWvkdLcvGKqM+x0Ufc=
-github.com/gorilla/websocket v1.4.2/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE=
+github.com/gorilla/websocket v1.5.0 h1:PPwGk2jz7EePpoHN/+ClbZu8SPxiqlu12wZP/3sWmnc=
+github.com/gorilla/websocket v1.5.0/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE=
github.com/graph-gophers/graphql-go v1.3.0 h1:Eb9x/q6MFpCLz7jBCiP/WTxjSDrYLR1QY41SORZyNJ0=
github.com/graph-gophers/graphql-go v1.3.0/go.mod h1:9CQHMSxwO4MprSdzoIEobiHpoLtHm77vfxsvsIN5Vuc=
github.com/grpc-ecosystem/grpc-gateway v1.16.0/go.mod h1:BDjrQk3hbvj6Nolgz8mAMFbcEtjT1g+wF4CSlocrBnw=
-github.com/gxed/hashland/keccakpg v0.0.1/go.mod h1:kRzw3HkwxFU1mpmPP8v1WyQzwdGfmKFJ6tItnhQ67kU=
-github.com/gxed/hashland/murmur3 v0.0.1/go.mod h1:KjXop02n4/ckmZSnY2+HKcLud/tcmvhST0bie/0lS48=
github.com/hashicorp/consul/api v1.11.0/go.mod h1:XjsvQN+RJGWI2TWy1/kqaE16HrR2J/FWgkYjdZQsX9M=
github.com/hashicorp/consul/sdk v0.8.0/go.mod h1:GBvyrGALthsZObzUGsfgHZQDXjg4lOjagTIwIR1vPms=
github.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4=
-github.com/hashicorp/go-bexpr v0.1.10 h1:9kuI5PFotCboP3dkDYFr/wi0gg0QVbSNz5oFRpxn4uE=
-github.com/hashicorp/go-bexpr v0.1.10/go.mod h1:oxlubA2vC/gFVfX1A6JGp7ls7uCDlfJn732ehYYg+g0=
+github.com/hashicorp/go-bexpr v0.1.12 h1:XrdVhmwu+9iYxIUWxsGVG7NQwrhzJZ0vR6nbN5bLgrA=
+github.com/hashicorp/go-bexpr v0.1.12/go.mod h1:ACktpcSySkFNpcxWSClFrut7wicd9WzisnvHuw+g9K8=
github.com/hashicorp/go-cleanhttp v0.5.0/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80=
github.com/hashicorp/go-cleanhttp v0.5.1/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80=
github.com/hashicorp/go-cleanhttp v0.5.2/go.mod h1:kO/YDlP8L1346E6Sodw+PrpBSV4/SoxCXGY6BqNFT48=
@@ -352,8 +321,6 @@ github.com/hashicorp/go-uuid v1.0.1/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/b
github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8=
github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8=
github.com/hashicorp/golang-lru v0.5.4/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4=
-github.com/hashicorp/golang-lru v0.5.5-0.20210104140557-80c98217689d h1:dg1dEPuWpEqDnvIw251EVy4zlP8gWbsGj4BsUKCRpYs=
-github.com/hashicorp/golang-lru v0.5.5-0.20210104140557-80c98217689d/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4=
github.com/hashicorp/hcl v1.0.0 h1:0Anlzjpi4vEasTeNFn2mLJgTSwt0+6sfsiTG8qcWGx4=
github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ=
github.com/hashicorp/logutils v1.0.0/go.mod h1:QIAnNjmIWmVIIkWDTG1z5v++HQmx9WQRO+LraFDTW64=
@@ -365,56 +332,27 @@ github.com/hashicorp/serf v0.9.5/go.mod h1:UWDWwZeL5cuWDJdl0C6wrvrUwEqtQ4ZKBKKEN
github.com/hashicorp/serf v0.9.6/go.mod h1:TXZNMjZQijwlDvp+r0b63xZ45H7JmCmgg4gpTwn9UV4=
github.com/holiman/bloomfilter/v2 v2.0.3 h1:73e0e/V0tCydx14a0SCYS/EWCxgwLZ18CZcZKVu0fao=
github.com/holiman/bloomfilter/v2 v2.0.3/go.mod h1:zpoh+gs7qcpqrHr3dB55AMiJwo0iURXE7ZOP9L9hSkA=
-github.com/holiman/uint256 v1.2.0 h1:gpSYcPLWGv4sG43I2mVLiDZCNDh/EpGjSk8tmtxitHM=
-github.com/holiman/uint256 v1.2.0/go.mod h1:y4ga/t+u+Xwd7CpDgZESaRcWy0I7XMlTMA25ApIH5Jw=
+github.com/holiman/uint256 v1.2.3 h1:K8UWO1HUJpRMXBxbmaY1Y8IAMZC/RsKB+ArEnnK4l5o=
+github.com/holiman/uint256 v1.2.3/go.mod h1:SC8Ryt4n+UBbPbIBKaG9zbbDlp4jOru9xFZmPzLUTxw=
github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU=
-github.com/huin/goupnp v1.0.3 h1:N8No57ls+MnjlB+JPiCVSOyy/ot7MJTqlo7rn+NYSqQ=
-github.com/huin/goupnp v1.0.3/go.mod h1:ZxNlw5WqJj6wSsRK5+YfflQGXYfccj5VgQsMNixHM7Y=
-github.com/huin/goutil v0.0.0-20170803182201-1ca381bf3150/go.mod h1:PpLOETDnJ0o3iZrZfqZzyLl6l7F3c6L1oWn7OICBi6o=
+github.com/huin/goupnp v1.2.0 h1:uOKW26NG1hsSSbXIZ1IR7XP9Gjd1U8pnLaCMgntmkmY=
+github.com/huin/goupnp v1.2.0/go.mod h1:gnGPsThkYa7bFi/KWmEysQRf48l2dvR5bxr2OFckNX8=
github.com/iancoleman/strcase v0.2.0/go.mod h1:iwCmte+B7n89clKwxIoIXy/HfoL7AsD47ZCWhYzw7ho=
github.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc=
github.com/ianlancetaylor/demangle v0.0.0-20200824232613-28f6c0f3b639/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc=
+github.com/inconshreveable/log15 v2.16.0+incompatible h1:6nvMKxtGcpgm7q0KiGs+Vc+xDvUXaBqsPKHWKsinccw=
+github.com/inconshreveable/log15 v2.16.0+incompatible/go.mod h1:cOaXtrgN4ScfRrD9Bre7U1thNq5RtJ8ZoP4iXVGRj6o=
github.com/inconshreveable/mousetrap v1.0.0 h1:Z8tu5sraLXCXIcARxBp/8cbvlwVa7Z1NHg9XEKhtSvM=
github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8=
-github.com/influxdata/flux v0.65.1/go.mod h1:J754/zds0vvpfwuq7Gc2wRdVwEodfpCFM7mYlOw2LqY=
-github.com/influxdata/influxdb v1.8.3 h1:WEypI1BQFTT4teLM+1qkEcvUi0dAvopAI/ir0vAiBg8=
-github.com/influxdata/influxdb v1.8.3/go.mod h1:JugdFhsvvI8gadxOI6noqNeeBHvWNTbfYGtiAn+2jhI=
github.com/influxdata/influxdb-client-go/v2 v2.4.0 h1:HGBfZYStlx3Kqvsv1h2pJixbCl/jhnFtxpKFAv9Tu5k=
github.com/influxdata/influxdb-client-go/v2 v2.4.0/go.mod h1:vLNHdxTJkIf2mSLvGrpj8TCcISApPoXkaxP8g9uRlW8=
-github.com/influxdata/influxql v1.1.1-0.20200828144457-65d3ef77d385/go.mod h1:gHp9y86a/pxhjJ+zMjNXiQAA197Xk9wLxaz+fGG+kWk=
-github.com/influxdata/line-protocol v0.0.0-20180522152040-32c6aa80de5e/go.mod h1:4kt73NQhadE3daL3WhR5EJ/J2ocX0PZzwxQ0gXJ7oFE=
+github.com/influxdata/influxdb1-client v0.0.0-20220302092344-a9ab5670611c h1:qSHzRbhzK8RdXOsAdfDgO49TtqC1oZ+acxPrkfTxcCs=
+github.com/influxdata/influxdb1-client v0.0.0-20220302092344-a9ab5670611c/go.mod h1:qj24IKcXYK6Iy9ceXlo3Tc+vtHo9lIhSX5JddghvEPo=
github.com/influxdata/line-protocol v0.0.0-20200327222509-2487e7298839/go.mod h1:xaLFMmpvUxqXtVkUJfg9QmT88cDaCJ3ZKgdZ78oO8Qo=
github.com/influxdata/line-protocol v0.0.0-20210311194329-9aa0e372d097 h1:vilfsDSy7TDxedi9gyBkMvAirat/oRcL0lFdJBf6tdM=
github.com/influxdata/line-protocol v0.0.0-20210311194329-9aa0e372d097/go.mod h1:xaLFMmpvUxqXtVkUJfg9QmT88cDaCJ3ZKgdZ78oO8Qo=
-github.com/influxdata/promql/v2 v2.12.0/go.mod h1:fxOPu+DY0bqCTCECchSRtWfc+0X19ybifQhZoQNF5D8=
-github.com/influxdata/roaring v0.4.13-0.20180809181101-fc520f41fab6/go.mod h1:bSgUQ7q5ZLSO+bKBGqJiCBGAl+9DxyW63zLTujjUlOE=
-github.com/influxdata/tdigest v0.0.0-20181121200506-bf2b5ad3c0a9/go.mod h1:Js0mqiSBE6Ffsg94weZZ2c+v/ciT8QRHFOap7EKDrR0=
-github.com/influxdata/usage-client v0.0.0-20160829180054-6d3895376368/go.mod h1:Wbbw6tYNvwa5dlB6304Sd+82Z3f7PmVZHVKU637d4po=
-github.com/ipfs/bbloom v0.0.4 h1:Gi+8EGJ2y5qiD5FbsbpX/TMNcJw8gSqr7eyjHa4Fhvs=
-github.com/ipfs/bbloom v0.0.4/go.mod h1:cS9YprKXpoZ9lT0n/Mw/a6/aFV6DTjTLYHeA+gyqMG0=
-github.com/ipfs/go-block-format v0.0.2 h1:qPDvcP19izTjU8rgo6p7gTXZlkMkF5bz5G3fqIsSCPE=
-github.com/ipfs/go-block-format v0.0.2/go.mod h1:AWR46JfpcObNfg3ok2JHDUfdiHRgWhJgCQF+KIgOPJY=
-github.com/ipfs/go-cid v0.0.1/go.mod h1:GHWU/WuQdMPmIosc4Yn1bcCT7dSeX4lBafM7iqUPQvM=
-github.com/ipfs/go-cid v0.0.2/go.mod h1:GHWU/WuQdMPmIosc4Yn1bcCT7dSeX4lBafM7iqUPQvM=
-github.com/ipfs/go-cid v0.0.5/go.mod h1:plgt+Y5MnOey4vO4UlUazGqdbEXuFYitED67FexhXog=
-github.com/ipfs/go-cid v0.0.7 h1:ysQJVJA3fNDF1qigJbsSQOdjhVLsOEoPdh0+R97k3jY=
-github.com/ipfs/go-cid v0.0.7/go.mod h1:6Ux9z5e+HpkQdckYoX1PG/6xqKspzlEIR5SDmgqgC/I=
-github.com/ipfs/go-datastore v0.4.1/go.mod h1:SX/xMIKoCszPqp+z9JhPYCmoOoXTvaa13XEbGtsFUhA=
-github.com/ipfs/go-datastore v0.4.2 h1:h8/n7WPzhp239kkLws+epN3Ic7YtcBPgcaXfEfdVDWM=
-github.com/ipfs/go-datastore v0.4.2/go.mod h1:SX/xMIKoCszPqp+z9JhPYCmoOoXTvaa13XEbGtsFUhA=
-github.com/ipfs/go-ipfs-blockstore v1.0.1 h1:fnuVj4XdZp4yExhd0CnUwAiMNJHiPnfInhiuwz4lW1w=
-github.com/ipfs/go-ipfs-blockstore v1.0.1/go.mod h1:MGNZlHNEnR4KGgPHM3/k8lBySIOK2Ve+0KjZubKlaOE=
-github.com/ipfs/go-ipfs-delay v0.0.0-20181109222059-70721b86a9a8/go.mod h1:8SP1YXK1M1kXuc4KJZINY3TQQ03J2rwBG9QfXmbRPrw=
-github.com/ipfs/go-ipfs-ds-help v1.0.0 h1:bEQ8hMGs80h0sR8O4tfDgV6B01aaF9qeTrujrTLYV3g=
-github.com/ipfs/go-ipfs-ds-help v1.0.0/go.mod h1:ujAbkeIgkKAWtxxNkoZHWLCyk5JpPoKnGyCcsoF6ueE=
-github.com/ipfs/go-ipfs-util v0.0.1 h1:Wz9bL2wB2YBJqggkA4dD7oSmqB4cAnpNbGrlHJulv50=
-github.com/ipfs/go-ipfs-util v0.0.1/go.mod h1:spsl5z8KUnrve+73pOhSVZND1SIxPW5RyBCNzQxlJBc=
-github.com/ipfs/go-ipld-format v0.2.0 h1:xGlJKkArkmBvowr+GMCX0FEZtkro71K1AwiKnL37mwA=
-github.com/ipfs/go-ipld-format v0.2.0/go.mod h1:3l3C1uKoadTPbeNfrDi+xMInYKlx2Cvg1BuydPSdzQs=
-github.com/ipfs/go-log v0.0.1 h1:9XTUN/rW64BCG1YhPK9Hoy3q8nr4gOmHHBpgFdfw6Lc=
-github.com/ipfs/go-log v0.0.1/go.mod h1:kL1d2/hzSpI0thNYjiKfjanbVNU+IIGA/WnNESY9leM=
-github.com/ipfs/go-metrics-interface v0.0.1 h1:j+cpbjYvu4R8zbleSs36gvB7jR+wsL2fGD6n0jO4kdg=
-github.com/ipfs/go-metrics-interface v0.0.1/go.mod h1:6s6euYU4zowdslK0GKHmqaIZ3j/b/tL7HTWtJ4VPgWY=
+github.com/ipfs/go-cid v0.4.1 h1:A/T3qGvxi4kpKWWcPC/PgbvDA2bjVLO7n4UeVwnbs/s=
+github.com/ipfs/go-cid v0.4.1/go.mod h1:uQHwDeX4c6CtyrFwdqyhpNcxVewur1M7l7fNU7LKwZk=
github.com/jackc/chunkreader v1.0.0/go.mod h1:RT6O25fNZIuasFJRyZ4R/Y2BbhasbmZXF9QQ7T3kePo=
github.com/jackc/chunkreader/v2 v2.0.0/go.mod h1:odVSm741yZoC3dpHEUXIqA9tQRhFrgOHwnPIn9lDKlk=
github.com/jackc/chunkreader/v2 v2.0.1 h1:i+RDz65UE+mmpjTfyz0MoVTnzeYxroil2G82ki7MGG8=
@@ -486,14 +424,9 @@ github.com/jackc/puddle v1.1.3 h1:JnPg/5Q9xVJGfjsO5CPUOjnJps1JaRUm8I9FXVCFK94=
github.com/jackc/puddle v1.1.3/go.mod h1:m4B5Dj62Y0fbyuIc15OsIqK0+JU8nkqQjsgx7dvjSWk=
github.com/jackpal/go-nat-pmp v1.0.2 h1:KzKSgb7qkJvOUTqYl9/Hg/me3pWgBmERKrTGD7BdWus=
github.com/jackpal/go-nat-pmp v1.0.2/go.mod h1:QPH045xvCAeXUZOxsnwmrtiCoxIr9eob+4orBN1SBKc=
-github.com/jbenet/goprocess v0.0.0-20160826012719-b497e2f366b8 h1:bspPhN+oKYFk5fcGNuQzp6IGzYQSenLEgH3s6jkXrWw=
-github.com/jbenet/goprocess v0.0.0-20160826012719-b497e2f366b8/go.mod h1:Ly/wlsjFq/qrU3Rar62tu1gASgGw6chQbSh/XgIIXCY=
-github.com/jedisct1/go-minisign v0.0.0-20190909160543-45766022959e/go.mod h1:G1CVv03EnqU1wYL2dFwXxW2An0az9JTl/ZsqXQeBlkU=
github.com/jinzhu/gorm v1.9.12/go.mod h1:vhTjlKSJUTWNtcbQtrMBFCxy7eXTzeCAzfL5fBZT/Qs=
github.com/jinzhu/inflection v1.0.0/go.mod h1:h+uFLlag+Qp1Va5pdKtLDYj+kHp5pxUVkryuEj+Srlc=
github.com/jinzhu/now v1.0.1/go.mod h1:d3SSVoowX0Lcu0IBviAWJpolVfI5UJVZZ7cO71lE/z8=
-github.com/jmespath/go-jmespath v0.4.0/go.mod h1:T8mJZnbsbmF+m6zOOFylbeCJqk5+pHWvzYPziyZiYoo=
-github.com/jmespath/go-jmespath/internal/testify v1.5.1/go.mod h1:L3OGu8Wl2/fWfCI6z80xFu9LTZmf1ZRjMHUOPmWr69U=
github.com/jmoiron/sqlx v1.2.0 h1:41Ip0zITnmWNR/vHV+S4m+VoUivnWY5E4OJfLZjCJMA=
github.com/jmoiron/sqlx v1.2.0/go.mod h1:1FEQNm3xlJgrMD+FBdI9+xvCksHtbpVBBw5dYhBSsks=
github.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU=
@@ -502,48 +435,39 @@ github.com/json-iterator/go v1.1.11/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/
github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo=
github.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1:6v2b51hI/fHJwM22ozAgKL4VKDeJcHhJFhtBdhmNjmU=
github.com/jstemmer/go-junit-report v0.9.1/go.mod h1:Brl9GWCQeLvo8nXZwPNNblvFj/XSXhF0NWZEnDohbsk=
-github.com/jsternberg/zap-logfmt v1.0.0/go.mod h1:uvPs/4X51zdkcm5jXl5SYoN+4RK21K8mysFmDaM/h+o=
-github.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU=
github.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w=
github.com/julienschmidt/httprouter v1.3.0 h1:U0609e9tgbseu3rBINet9P48AI/D3oJs4dN7jwJOQ1U=
-github.com/jung-kurt/gofpdf v1.0.3-0.20190309125859-24315acbbda5/go.mod h1:7Id9E/uU8ce6rXgefFLlgrJj/GYY22cpxn+r32jIOes=
-github.com/jwilder/encoding v0.0.0-20170811194829-b4e1701a28ef/go.mod h1:Ct9fl0F6iIOGgxJ5npU/IUOhOhqlVrGjyIZc8/MagT0=
-github.com/karalabe/usb v0.0.2/go.mod h1:Od972xHfMJowv7NGVDiWVxk2zxnWgjLlJzE+F4F7AGU=
-github.com/kisielk/errcheck v1.1.0/go.mod h1:EZBBE59ingxPouuu3KfxchcWSUPOHkagtvWXihfKN4Q=
-github.com/kisielk/errcheck v1.2.0/go.mod h1:/BMXB+zMLi60iA8Vv6Ksmxu/1UDYcXs4uQLJ+jE2L00=
github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8=
github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck=
-github.com/klauspost/compress v1.4.0/go.mod h1:RyIbtBH6LamlWaDj8nUwkbUhJ87Yi3uG0guNDohfE1A=
-github.com/klauspost/cpuid v0.0.0-20170728055534-ae7887de9fa5/go.mod h1:Pj4uuM528wm8OyEC2QMXAi2YiTZ96dNQPGgoMS4s3ek=
-github.com/klauspost/crc32 v0.0.0-20161016154125-cb6bfca970f6/go.mod h1:+ZoRqAPRLkC4NPOvfYeR5KNOrY6TD+/sAC3HXPZgDYg=
-github.com/klauspost/pgzip v1.0.2-0.20170402124221-0bf5dcad4ada/go.mod h1:Ch1tH69qFZu15pkjo5kYi6mth2Zzwzt50oCQKQE9RUs=
+github.com/klauspost/compress v1.16.7 h1:2mk3MPGNzKyxErAw8YaohYh69+pa4sIQSC0fPGCFR9I=
+github.com/klauspost/compress v1.16.7/go.mod h1:ntbaceVETuRiXiv4DpjP66DpAtAGkEQskQzEyD//IeE=
+github.com/klauspost/cpuid/v2 v2.2.5 h1:0E5MSMDEoAulmXNFquVs//DdoomxaoTY1kUhbc/qbZg=
+github.com/klauspost/cpuid/v2 v2.2.5/go.mod h1:Lcz8mBdAVJIBVzewtcLocK12l3Y+JytZYpaMropDUws=
github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ=
github.com/konsorten/go-windows-terminal-sequences v1.0.2/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ=
github.com/kr/fs v0.1.0/go.mod h1:FFnZGqtBN9Gxj7eW1uZ42v5BccTP0vu6NEaFoC2HwRg=
github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc=
github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo=
github.com/kr/pretty v0.2.0/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI=
-github.com/kr/pretty v0.2.1 h1:Fmg33tUaq4/8ym9TJN1x7sLJnHVwhP33CNkpYV/7rwI=
-github.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI=
+github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE=
+github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk=
github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ=
github.com/kr/pty v1.1.8/go.mod h1:O1sed60cT9XZ5uDucP5qwvh+TE3NnUj51EiZO/lmSfw=
github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI=
github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY=
github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE=
-github.com/kylelemons/godebug v0.0.0-20170224010052-a616ab194758/go.mod h1:B69LEHPfb2qLo0BaaOLcbitczOKLWTsrBG9LczfCD4k=
-github.com/kylelemons/godebug v1.1.0/go.mod h1:9/0rRGxNHcop5bhtWyNeEfOS8JIWk580+fNqagV/RAw=
+github.com/kylelemons/godebug v1.1.0 h1:RPNrshWIDI6G2gRW9EHilWtl7Z6Sb1BR0xunSBf0SNc=
github.com/labstack/echo/v4 v4.2.1/go.mod h1:AA49e0DZ8kk5jTOOCKNuPR6oTnBS0dYiM4FW1e6jwpg=
github.com/labstack/gommon v0.3.0/go.mod h1:MULnywXg0yavhxWKc+lOruYdAhDwPK9wf0OL7NoOu+k=
-github.com/leanovate/gopter v0.2.9/go.mod h1:U2L/78B+KVFIx2VmW6onHJQzXtFb+p5y3y2Sh+Jxxv8=
github.com/lib/pq v1.0.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo=
github.com/lib/pq v1.1.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo=
github.com/lib/pq v1.1.1/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo=
github.com/lib/pq v1.2.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo=
github.com/lib/pq v1.3.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo=
github.com/lib/pq v1.4.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo=
-github.com/lib/pq v1.10.2 h1:AqzbZs4ZoCBp+GtejcpCpcxM3zlSMx29dXbUSeVtJb8=
github.com/lib/pq v1.10.2/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o=
-github.com/libp2p/go-buffer-pool v0.0.2/go.mod h1:MvaB6xw5vOrDl8rYZGLFdKAuk/hRoRZd1Vi32+RXyFM=
+github.com/lib/pq v1.10.9 h1:YXG7RB+JIjhP29X+OtkiDnYaXQwpS4JEWq7dtCCRUEw=
+github.com/lib/pq v1.10.9/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o=
github.com/lyft/protoc-gen-star v0.5.3/go.mod h1:V0xaHgaf5oCCqmcxYcWiDfTiKsZsRc87/1qhoTACD8w=
github.com/magiconair/properties v1.8.5 h1:b6kJs+EmPFMYGkow9GiUyCyOvIwYetYJ3fSaWak/Gls=
github.com/magiconair/properties v1.8.5/go.mod h1:y3VJvCyxH9uVvJTWEGAELF3aiYNyPKd5NZ3oSwXrF60=
@@ -558,10 +482,10 @@ github.com/mattn/go-colorable v0.1.6/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope
github.com/mattn/go-colorable v0.1.7/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc=
github.com/mattn/go-colorable v0.1.8/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc=
github.com/mattn/go-colorable v0.1.9/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc=
-github.com/mattn/go-colorable v0.1.12 h1:jF+Du6AlPIjs2BiUiQlKOX0rt3SujHxPnksPKZbaA40=
github.com/mattn/go-colorable v0.1.12/go.mod h1:u5H1YNBxpqRaxsYJYSkiCWKzEfiAb1Gb520KVy5xxl4=
+github.com/mattn/go-colorable v0.1.13 h1:fFA4WZxdEF4tXPZVKMLwD8oUnCTTo08duU7wxecdEvA=
+github.com/mattn/go-colorable v0.1.13/go.mod h1:7S9/ev0klgBDR4GtXTXX8a3vIGJpMovkB8vQcUbaXHg=
github.com/mattn/go-isatty v0.0.3/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4=
-github.com/mattn/go-isatty v0.0.4/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4=
github.com/mattn/go-isatty v0.0.5/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s=
github.com/mattn/go-isatty v0.0.7/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s=
github.com/mattn/go-isatty v0.0.8/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s=
@@ -569,226 +493,203 @@ github.com/mattn/go-isatty v0.0.9/go.mod h1:YNRxwqDuOph6SZLI9vUUz6OYw3QyUt7WiY2y
github.com/mattn/go-isatty v0.0.10/go.mod h1:qgIWMr58cqv1PHHyhnkY9lrL7etaEgOFcMEpPG5Rm84=
github.com/mattn/go-isatty v0.0.11/go.mod h1:PhnuNfih5lzO57/f3n+odYbM4JtupLOxQOAqxQCu2WE=
github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU=
-github.com/mattn/go-isatty v0.0.14 h1:yVuAays6BHfxijgZPzw+3Zlu5yQgKGP2/hcQbHb7S9Y=
github.com/mattn/go-isatty v0.0.14/go.mod h1:7GGIvUiUoEMVVmxf/4nioHXj79iQHKdU27kJ6hsGG94=
+github.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM=
+github.com/mattn/go-isatty v0.0.19 h1:JITubQf0MOLdlGRuRq+jtsDlekdYPia9ZFsB8h/APPA=
+github.com/mattn/go-isatty v0.0.19/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y=
github.com/mattn/go-runewidth v0.0.3/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzpuz5H//U1FU=
-github.com/mattn/go-runewidth v0.0.9 h1:Lm995f3rfxdpd6TSmuVCHVb/QhupuXlYr8sCI/QdE+0=
github.com/mattn/go-runewidth v0.0.9/go.mod h1:H031xJmbD/WCDINGzjvQ9THkh0rPKHF+m2gUSrubnMI=
+github.com/mattn/go-runewidth v0.0.14 h1:+xnbZSEeDbOIg5/mE6JF0w6n9duR1l3/WmbinWVwUuU=
+github.com/mattn/go-runewidth v0.0.14/go.mod h1:Jdepj2loyihRzMpdS35Xk/zdY8IAYHsh153qUoGf23w=
github.com/mattn/go-sqlite3 v1.9.0/go.mod h1:FPy6KqzDD04eiIsT53CuJW3U88zkxoIYsOqkbpncsNc=
-github.com/mattn/go-sqlite3 v1.11.0/go.mod h1:FPy6KqzDD04eiIsT53CuJW3U88zkxoIYsOqkbpncsNc=
github.com/mattn/go-sqlite3 v2.0.1+incompatible h1:xQ15muvnzGBHpIpdrNi1DA5x0+TcBZzsIDwmw9uTHzw=
github.com/mattn/go-sqlite3 v2.0.1+incompatible/go.mod h1:FPy6KqzDD04eiIsT53CuJW3U88zkxoIYsOqkbpncsNc=
-github.com/mattn/go-tty v0.0.0-20180907095812-13ff1204f104/go.mod h1:XPvLUNfbS4fJH25nqRHfWLMa1ONC8Amw+mIA639KxkE=
-github.com/matttproud/golang_protobuf_extensions v1.0.1 h1:4hp9jkHxhMHkqkrB3Ix0jegS5sx/RkqARlsWZ6pIwiU=
github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0=
+github.com/matttproud/golang_protobuf_extensions v1.0.4 h1:mmDVorXM7PCGKw94cs5zkfA9PSy5pEvNWRP0ET0TIVo=
+github.com/matttproud/golang_protobuf_extensions v1.0.4/go.mod h1:BSXmuO+STAnVfrANrmjBb36TMTDstsz7MSK+HVaYKv4=
github.com/miekg/dns v1.0.14/go.mod h1:W1PPwlIAgtquWBMBEV9nkV9Cazfe8ScdGz/Lj7v3Nrg=
github.com/miekg/dns v1.1.26/go.mod h1:bPDLeHnStXmXAq1m/Ch/hvfNHr14JKNPMBo3VZKjuso=
github.com/miekg/dns v1.1.41/go.mod h1:p6aan82bvRIyn+zDIv9xYNUpwa73JcSh9BKwknJysuI=
-github.com/minio/blake2b-simd v0.0.0-20160723061019-3f5f724cb5b1 h1:lYpkrQH5ajf0OXOcUbGjvZxxijuBwbbmlSxLiuofa+g=
-github.com/minio/blake2b-simd v0.0.0-20160723061019-3f5f724cb5b1/go.mod h1:pD8RvIylQ358TN4wwqatJ8rNavkEINozVn9DtGI3dfQ=
-github.com/minio/sha256-simd v0.0.0-20190131020904-2d45a736cd16/go.mod h1:2FMWW+8GMoPweT6+pI63m9YE3Lmw4J71hV56Chs1E/U=
-github.com/minio/sha256-simd v0.1.1-0.20190913151208-6de447530771 h1:MHkK1uRtFbVqvAgvWxafZe54+5uBxLluGylDiKgdhwo=
-github.com/minio/sha256-simd v0.1.1-0.20190913151208-6de447530771/go.mod h1:B5e1o+1/KgNmWrSQK08Y6Z1Vb5pwIktudl0J58iy0KM=
+github.com/minio/sha256-simd v1.0.1 h1:6kaan5IFmwTNynnKKpDHe6FWHohJOHhCPchzK49dzMM=
+github.com/minio/sha256-simd v1.0.1/go.mod h1:Pz6AKMiUdngCLpeTL/RJY1M9rUuPMYujV5xJjtbRSN8=
github.com/mitchellh/cli v1.1.0/go.mod h1:xcISNoH86gajksDmfB23e/pu+B+GeFRMYmoHXxx3xhI=
github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0=
github.com/mitchellh/go-testing-interface v1.0.0/go.mod h1:kRemZodwjscx+RGhAo8eIhFbs2+BFgRtFPeD/KE+zxI=
github.com/mitchellh/mapstructure v0.0.0-20160808181253-ca63d7c062ee/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y=
github.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y=
github.com/mitchellh/mapstructure v1.4.1/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo=
-github.com/mitchellh/mapstructure v1.4.3 h1:OVowDSCllw/YjdLkam3/sm7wEtOy59d8ndGgCcyj8cs=
github.com/mitchellh/mapstructure v1.4.3/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo=
-github.com/mitchellh/pointerstructure v1.2.0 h1:O+i9nHnXS3l/9Wu7r4NrEdwA2VFTicjUEN1uBnDo34A=
-github.com/mitchellh/pointerstructure v1.2.0/go.mod h1:BRAsLI5zgXmw97Lf6s25bs8ohIXc3tViBH44KcwB2g4=
+github.com/mitchellh/mapstructure v1.5.0 h1:jeMsZIYE/09sWLaz43PL7Gy6RuMjD2eJVyuac5Z2hdY=
+github.com/mitchellh/mapstructure v1.5.0/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo=
+github.com/mitchellh/pointerstructure v1.2.1 h1:ZhBBeX8tSlRpu/FFhXH4RC4OJzFlqsQhoHZAz4x7TIw=
+github.com/mitchellh/pointerstructure v1.2.1/go.mod h1:BRAsLI5zgXmw97Lf6s25bs8ohIXc3tViBH44KcwB2g4=
github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=
github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=
github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0=
github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0=
github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk=
-github.com/modocache/gover v0.0.0-20171022184752-b58185e213c5/go.mod h1:caMODM3PzxT8aQXRPkAt8xlV/e7d7w8GM5g0fa5F0D8=
-github.com/mr-tron/base58 v1.1.0/go.mod h1:xcD2VGqlgYjBdcBLw+TuYLr8afG+Hj8g2eTVqeSzSU8=
-github.com/mr-tron/base58 v1.1.3 h1:v+sk57XuaCKGXpWtVBX8YJzO7hMGx4Aajh4TQbdEFdc=
-github.com/mr-tron/base58 v1.1.3/go.mod h1:BinMc/sQntlIE1frQmRFPUoPA1Zkr8VRgBdjWI2mNwc=
-github.com/mschoch/smat v0.0.0-20160514031455-90eadee771ae/go.mod h1:qAyveg+e4CE+eKJXWVjKXM4ck2QobLqTDytGJbLLhJg=
-github.com/multiformats/go-base32 v0.0.3 h1:tw5+NhuwaOjJCC5Pp82QuXbrmLzWg7uxlMFp8Nq/kkI=
-github.com/multiformats/go-base32 v0.0.3/go.mod h1:pLiuGC8y0QR3Ue4Zug5UzK9LjgbkL8NSQj0zQ5Nz/AA=
-github.com/multiformats/go-base36 v0.1.0 h1:JR6TyF7JjGd3m6FbLU2cOxhC0Li8z8dLNGQ89tUg4F4=
-github.com/multiformats/go-base36 v0.1.0/go.mod h1:kFGE83c6s80PklsHO9sRn2NCoffoRdUUOENyW/Vv6sM=
-github.com/multiformats/go-multibase v0.0.1/go.mod h1:bja2MqRZ3ggyXtZSEDKpl0uO/gviWFaSteVbWT51qgs=
-github.com/multiformats/go-multibase v0.0.3 h1:l/B6bJDQjvQ5G52jw4QGSYeOTZoAwIO77RblWplfIqk=
-github.com/multiformats/go-multibase v0.0.3/go.mod h1:5+1R4eQrT3PkYZ24C3W2Ue2tPwIdYQD509ZjSb5y9Oc=
-github.com/multiformats/go-multihash v0.0.1/go.mod h1:w/5tugSrLEbWqlcgJabL3oHFKTwfvkofsjW2Qa1ct4U=
-github.com/multiformats/go-multihash v0.0.13/go.mod h1:VdAWLKTwram9oKAatUcLxBNUjdtcVwxObEQBtRfuyjc=
-github.com/multiformats/go-multihash v0.0.14 h1:QoBceQYQQtNUuf6s7wHxnE2c8bhbMqhfGzNI032se/I=
-github.com/multiformats/go-multihash v0.0.14/go.mod h1:VdAWLKTwram9oKAatUcLxBNUjdtcVwxObEQBtRfuyjc=
-github.com/multiformats/go-varint v0.0.5 h1:XVZwSo04Cs3j/jS0uAEPpT3JY6DzMcVLLoWOSnCxOjg=
-github.com/multiformats/go-varint v0.0.5/go.mod h1:3Ls8CIEsrijN6+B7PbrXRPxHRPuXSrVKRY101jdMZYE=
+github.com/mr-tron/base58 v1.2.0 h1:T/HDJBh4ZCPbU39/+c3rRvE0uKBQlU27+QI8LJ4t64o=
+github.com/mr-tron/base58 v1.2.0/go.mod h1:BinMc/sQntlIE1frQmRFPUoPA1Zkr8VRgBdjWI2mNwc=
+github.com/multiformats/go-base32 v0.1.0 h1:pVx9xoSPqEIQG8o+UbAe7DNi51oej1NtK+aGkbLYxPE=
+github.com/multiformats/go-base32 v0.1.0/go.mod h1:Kj3tFY6zNr+ABYMqeUNeGvkIC/UYgtWibDcT0rExnbI=
+github.com/multiformats/go-base36 v0.2.0 h1:lFsAbNOGeKtuKozrtBsAkSVhv1p9D0/qedU9rQyccr0=
+github.com/multiformats/go-base36 v0.2.0/go.mod h1:qvnKE++v+2MWCfePClUEjE78Z7P2a1UV0xHgWc0hkp4=
+github.com/multiformats/go-multibase v0.2.0 h1:isdYCVLvksgWlMW9OZRYJEa9pZETFivncJHmHnnd87g=
+github.com/multiformats/go-multibase v0.2.0/go.mod h1:bFBZX4lKCA/2lyOFSAoKH5SS6oPyjtnzK/XTFDPkNuk=
+github.com/multiformats/go-multihash v0.2.3 h1:7Lyc8XfX/IY2jWb/gI7JP+o7JEq9hOa7BFvVU9RSh+U=
+github.com/multiformats/go-multihash v0.2.3/go.mod h1:dXgKXCXjBzdscBLk9JkjINiEsCKRVch90MdaGiKsvSM=
+github.com/multiformats/go-varint v0.0.7 h1:sWSGR+f/eu5ABZA2ZpYKBILXTTs9JWpdEM/nEGOHFS8=
+github.com/multiformats/go-varint v0.0.7/go.mod h1:r8PUYw/fD/SjBCiKOoDlGF6QawOELpZAu9eioSos/OU=
github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U=
-github.com/naoina/go-stringutil v0.1.0/go.mod h1:XJ2SJL9jCtBh+P9q5btrd/Ylo8XwT/h1USek5+NqSA0=
-github.com/naoina/toml v0.1.2-0.20170918210437-9fafd6967416/go.mod h1:NBIhNtsFMo3G2szEBne+bO4gS192HuIYRqfvOWb4i1E=
github.com/nxadm/tail v1.4.4 h1:DQuhQpB1tVlglWS2hLQ5OV6B5r8aGxSrPc5Qo6uTN78=
github.com/nxadm/tail v1.4.4/go.mod h1:kenIhsEOeOJmVchQTgglprH7qJGnHDVpk1VPCcaMI8A=
-github.com/oklog/ulid v1.3.1/go.mod h1:CirwcVhetQ6Lv90oh/F+FBtV6XMibvdAFo93nm5qn4U=
github.com/olekukonko/tablewriter v0.0.5 h1:P2Ga83D34wi1o9J6Wh1mRuqd4mF/x/lgBS7N7AbDhec=
github.com/olekukonko/tablewriter v0.0.5/go.mod h1:hPp6KlRPjbx+hW8ykQs1w3UBbZlj6HuIJcUGPhkA7kY=
github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE=
-github.com/onsi/ginkgo v1.10.3/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE=
github.com/onsi/ginkgo v1.12.1/go.mod h1:zj2OWP4+oCPe1qIXoGWkgMRwljMUYCdkwsT2108oapk=
github.com/onsi/ginkgo v1.14.0/go.mod h1:iSB4RoI2tjJc9BBv4NKIKWKya62Rps+oPG/Lv9klQyY=
github.com/onsi/ginkgo v1.16.5 h1:8xi0RTUf59SOSfEtZMvwTvXYMzG4gV23XVHOZiXNtnE=
github.com/onsi/gomega v1.7.1/go.mod h1:XdKZgCCFLUoM/7CFJVPcG8C1xQ1AJ0vpAezJrB7JYyY=
github.com/onsi/gomega v1.10.1/go.mod h1:iN09h71vgCQne3DLsj+A5owkum+a2tYe+TOCB1ybHNo=
github.com/onsi/gomega v1.13.0 h1:7lLHu94wT9Ij0o6EWWclhu0aOh32VxhkwEJvzuWPeak=
-github.com/opentracing/opentracing-go v1.0.2/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o=
-github.com/opentracing/opentracing-go v1.0.3-0.20180606204148-bd9c31933947/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o=
github.com/opentracing/opentracing-go v1.1.0/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o=
github.com/opentracing/opentracing-go v1.2.0 h1:uEJPy/1a5RIPAJ0Ov+OIO8OxWu77jEv+1B0VhjKrZUs=
github.com/opentracing/opentracing-go v1.2.0/go.mod h1:GxEUsuufX4nBwe+T+Wl9TAgYrxe9dPLANfrWvHYVTgc=
github.com/pascaldekloe/goe v0.0.0-20180627143212-57f6aae5913c/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc=
github.com/pascaldekloe/goe v0.1.0/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc=
-github.com/paulbellamy/ratecounter v0.2.0/go.mod h1:Hfx1hDpSGoqxkVVpBi/IlYD7kChlfo5C6hzIHwPqfFE=
github.com/pelletier/go-toml v1.9.4 h1:tjENF6MfZAg8e4ZmZTeWaWiT2vXtsoO6+iuOjFhECwM=
github.com/pelletier/go-toml v1.9.4/go.mod h1:u1nR/EPcESfeI/szUZKdtJ0xRNbUoANCkoOuaOx1Y+c=
-github.com/peterh/liner v1.0.1-0.20180619022028-8c1271fcf47f/go.mod h1:xIteQHvHuaLYG9IFj6mSxM0fCKrs34IrEQUhOYuGPHc=
github.com/peterh/liner v1.1.1-0.20190123174540-a2c9a5303de7 h1:oYW+YCJ1pachXTQmzR3rNLYGGz4g/UgFcjb28p/viDM=
github.com/peterh/liner v1.1.1-0.20190123174540-a2c9a5303de7/go.mod h1:CRroGNssyjTd/qIG2FyxByd2S8JEAZXBl4qUrZf8GS0=
-github.com/pganalyze/pg_query_go/v2 v2.1.0 h1:donwPZ4G/X+kMs7j5eYtKjdziqyOLVp3pkUrzb9lDl8=
-github.com/pganalyze/pg_query_go/v2 v2.1.0/go.mod h1:XAxmVqz1tEGqizcQ3YSdN90vCOHBWjJi8URL1er5+cA=
-github.com/philhofer/fwd v1.0.0/go.mod h1:gk3iGcWd9+svBvR0sR+KPcfE+RNWozjowpeBVG3ZVNU=
-github.com/pierrec/lz4 v2.0.5+incompatible/go.mod h1:pdkljMzZIN41W+lC3N2tnIh5sFi+IEE17M5jbnwPHcY=
+github.com/pganalyze/pg_query_go/v4 v4.2.1 h1:id/vuyIQccb9f6Yx3pzH5l4QYrxE3v6/m8RPlgMrprc=
+github.com/pganalyze/pg_query_go/v4 v4.2.1/go.mod h1:aEkDNOXNM5j0YGzaAapwJ7LB3dLNj+bvbWcLv1hOVqA=
+github.com/pingcap/errors v0.11.4 h1:lFuQV/oaUMGcD2tqt+01ROSmJs75VG1ToEOkZIZ4nE4=
+github.com/pkg/diff v0.0.0-20210226163009-20ebb0f2a09e/go.mod h1:pJLUxLENpZxwdsKMEsNbx1VGcRFpLqf3715MtcvvzbA=
github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4=
github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
github.com/pkg/sftp v1.10.1/go.mod h1:lYOWFsE0bwd1+KfKJaKeuokY15vzFx25BLbzYYoAxZI=
-github.com/pkg/term v0.0.0-20180730021639-bffc007b7fd5/go.mod h1:eCbImbZ95eXtAUIbLAuAVnBnwf83mjf6QIVH8SHYwqQ=
github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
github.com/posener/complete v1.1.1/go.mod h1:em0nMJCgc9GFtwrmVmEMR/ZL6WyhyjMBndrE9hABlRI=
github.com/posener/complete v1.2.3/go.mod h1:WZIdtGGp+qx0sLrYKtIRAruyNpv6hFCicSgv7Sy7s/s=
github.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw=
github.com/prometheus/client_golang v1.0.0/go.mod h1:db9x61etRT2tGnBNRi70OPL5FsnadC4Ky3P0J6CfImo=
-github.com/prometheus/client_golang v1.4.0 h1:YVIb/fVcOTMSqtqZWSKnHpSLBxu8DKgxq8z6RuBZwqI=
github.com/prometheus/client_golang v1.4.0/go.mod h1:e9GMxYsXl05ICDXkRhurwBS4Q3OK1iX/F2sw+iXX5zU=
+github.com/prometheus/client_golang v1.16.0 h1:yk/hx9hDbrGHovbci4BY+pRMfSuuat626eFsHb7tmT8=
+github.com/prometheus/client_golang v1.16.0/go.mod h1:Zsulrv/L9oM40tJ7T815tM89lFEugiJ9HzIqaAx4LKc=
github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo=
github.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=
github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=
-github.com/prometheus/client_model v0.2.0 h1:uq5h0d+GuxiXLJLNABMgp2qUWDPiLvgCzz2dUR+/W/M=
github.com/prometheus/client_model v0.2.0/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=
-github.com/prometheus/common v0.0.0-20181113130724-41aa239b4cce/go.mod h1:daVV7qP5qjZbuso7PdcryaAu0sAZbrN9i7WWcTMWvro=
+github.com/prometheus/client_model v0.4.0 h1:5lQXD3cAg1OXBf4Wq03gTrXHeaV0TQvGfUooCfx1yqY=
+github.com/prometheus/client_model v0.4.0/go.mod h1:oMQmHW1/JoDwqLtg57MGgP/Fb1CJEYF2imWWhWtMkYU=
github.com/prometheus/common v0.4.1/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4=
-github.com/prometheus/common v0.6.0/go.mod h1:eBmuwkDJBwy6iBfxCBob6t6dR6ENT/y+J+Zk0j9GMYc=
-github.com/prometheus/common v0.9.1 h1:KOMtN28tlbam3/7ZKEYKHhKoJZYYj3gMH4uc62x7X7U=
github.com/prometheus/common v0.9.1/go.mod h1:yhUN8i9wzaXS3w1O07YhxHEBxD+W35wd8bs7vj7HSQ4=
+github.com/prometheus/common v0.44.0 h1:+5BrQJwiBB9xsMygAB3TNvpQKOwlkc25LbISbrdOOfY=
+github.com/prometheus/common v0.44.0/go.mod h1:ofAIvZbQ1e/nugmZGz4/qCb9Ap1VoSTIO7x0VV9VvuY=
github.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk=
github.com/prometheus/procfs v0.0.2/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA=
-github.com/prometheus/procfs v0.0.8 h1:+fpWZdT24pJBiqJdAwYBjPSk+5YmQzYNPYzQsdzLkt8=
github.com/prometheus/procfs v0.0.8/go.mod h1:7Qr8sr6344vo1JqZ6HhLceV9o3AJ1Ff+GxbHq6oeK9A=
-github.com/prometheus/tsdb v0.7.1 h1:YZcsG11NqnK4czYLrWd9mpEuAJIHVQLwdrleYfszMAA=
-github.com/prometheus/tsdb v0.7.1/go.mod h1:qhTCs0VvXwvX/y3TZrWD7rabWM+ijKTux40TwIPHuXU=
-github.com/retailnext/hllpp v1.0.1-0.20180308014038-101a6d2f8b52/go.mod h1:RDpi1RftBQPUCDRw6SmxeaREsAaRKnOclghuzp/WRzc=
-github.com/rjeczalik/notify v0.9.1 h1:CLCKso/QK1snAlnhNR/CNvNiFU2saUtjV0bx3EwNeCE=
-github.com/rjeczalik/notify v0.9.1/go.mod h1:rKwnCoCGeuQnwBtTSPL9Dad03Vh2n40ePRrjvIXnJho=
+github.com/prometheus/procfs v0.11.0 h1:5EAgkfkMl659uZPbe9AS2N68a7Cc1TJbPEuGzFuRbyk=
+github.com/prometheus/procfs v0.11.0/go.mod h1:nwNm2aOCAYw8uTR/9bWRREkZFxAUcWzPHWJq+XBB/FM=
+github.com/rivo/uniseg v0.2.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc=
+github.com/rivo/uniseg v0.4.4 h1:8TfxU8dW6PdqD27gjM8MVNuicgxIjxpm4K7x4jp8sis=
+github.com/rivo/uniseg v0.4.4/go.mod h1:FN3SvrM+Zdj16jyLfmOkMNblXMcoc8DfTHruCPUcx88=
github.com/rogpeppe/fastuuid v1.2.0/go.mod h1:jVj6XXZzXRy/MSR5jhDC/2q6DgLz+nrA6LYCDYWNEvQ=
github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4=
-github.com/rs/cors v1.7.0 h1:+88SsELBHx5r+hZ8TCkggzSstaWNbDvThkVK8H6f9ik=
-github.com/rs/cors v1.7.0/go.mod h1:gFx+x8UowdsKA9AchylcLynDq+nNFfI8FkUZdN/jGCU=
+github.com/rogpeppe/go-internal v1.9.0/go.mod h1:WtVeX8xhTBvf0smdhujwtBcq4Qrzq/fJaraNFVN+nFs=
+github.com/rogpeppe/go-internal v1.11.0 h1:cWPaGQEPrBb5/AsnsZesgZZ9yb1OQ+GOISoDNXVBh4M=
+github.com/rogpeppe/go-internal v1.11.0/go.mod h1:ddIwULY96R17DhadqLgMfk9H9tvdUzkipdSkR5nkCZA=
+github.com/rs/cors v1.9.0 h1:l9HGsTsHJcvW14Nk7J9KFz8bzeAWXn3CG6bgt7LsrAE=
+github.com/rs/cors v1.9.0/go.mod h1:XyqrcTp5zjWr1wsJ8PIRZssZ8b/WMcMf71DJnit4EMU=
github.com/rs/xid v1.2.1/go.mod h1:+uKXf+4Djp6Md1KODXJxgGQPKngRmWyn10oCKFzNHOQ=
github.com/rs/zerolog v1.13.0/go.mod h1:YbFCdg8HfsridGWAh22vktObvhZbQsZXe4/zB0OKkWU=
github.com/rs/zerolog v1.15.0/go.mod h1:xYTKnLHcpfU2225ny5qZjxnj9NvkumZYjJHlAThCjNc=
-github.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM=
+github.com/russross/blackfriday/v2 v2.1.0 h1:JIOH55/0cWyOuilr9/qlrm0BSXldqnqwMsf35Ld67mk=
github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM=
github.com/ryanuber/columnize v0.0.0-20160712163229-9b3edd62028f/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts=
github.com/sagikazarmark/crypt v0.3.0/go.mod h1:uD/D+6UF4SrIR1uGEv7bBNkNqLGqUr43MRiaGWX1Nig=
github.com/satori/go.uuid v1.2.0/go.mod h1:dA0hQrYB0VpLJoorglMZABFdXlWrHn1NEOzdhQKdks0=
github.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529/go.mod h1:DxrIzT+xaE7yg65j358z/aeFdxmN0P9QXhEzd20vsDc=
-github.com/segmentio/kafka-go v0.1.0/go.mod h1:X6itGqS9L4jDletMsxZ7Dz+JFWxM6JHfPOCvTvk+EJo=
-github.com/segmentio/kafka-go v0.2.0/go.mod h1:X6itGqS9L4jDletMsxZ7Dz+JFWxM6JHfPOCvTvk+EJo=
-github.com/sergi/go-diff v1.0.0/go.mod h1:0CfEIISq7TuYL3j771MWULgwwjU+GofnZX9QAmXWZgo=
-github.com/shirou/gopsutil v3.21.4-0.20210419000835-c7a38de76ee5+incompatible/go.mod h1:5b4v6he4MtMOwMlS0TUMTu2PcXUg8+E1lC7eC3UO/RA=
-github.com/shirou/gopsutil v3.21.5+incompatible h1:OloQyEerMi7JUrXiNzy8wQ5XN+baemxSl12QgIzt0jc=
-github.com/shirou/gopsutil v3.21.5+incompatible/go.mod h1:5b4v6he4MtMOwMlS0TUMTu2PcXUg8+E1lC7eC3UO/RA=
+github.com/shirou/gopsutil v3.21.11+incompatible h1:+1+c1VGhc88SSonWP6foOcLhvnKlUeu/erjjvaPEYiI=
+github.com/shirou/gopsutil v3.21.11+incompatible/go.mod h1:5b4v6he4MtMOwMlS0TUMTu2PcXUg8+E1lC7eC3UO/RA=
github.com/shopspring/decimal v0.0.0-20180709203117-cd690d0c9e24/go.mod h1:M+9NzErvs504Cn4c5DxATwIqPbtswREoFCre64PpcG4=
github.com/shopspring/decimal v0.0.0-20200227202807-02e2044944cc/go.mod h1:DKyhrW/HYNuLGql+MJL6WCR6knT2jwCFRcu2hWCYk4o=
github.com/shopspring/decimal v0.0.0-20200419222939-1884f454f8ea/go.mod h1:DKyhrW/HYNuLGql+MJL6WCR6knT2jwCFRcu2hWCYk4o=
github.com/shopspring/decimal v1.2.0 h1:abSATXmQEYyShuxI4/vyW3tV1MrKAJzCZ/0zLUXYbsQ=
github.com/shopspring/decimal v1.2.0/go.mod h1:DKyhrW/HYNuLGql+MJL6WCR6knT2jwCFRcu2hWCYk4o=
-github.com/shurcooL/sanitized_anchor_name v1.0.0/go.mod h1:1NzhyTcUVG4SuEtjjoZeVRXNmyL/1OwPU0+IJeTBvfc=
github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo=
github.com/sirupsen/logrus v1.4.1/go.mod h1:ni0Sbl8bgC9z8RoU9G6nDWqqs/fq4eDPysMBDgk/93Q=
github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE=
-github.com/sirupsen/logrus v1.7.0 h1:ShrD1U9pZB12TX0cVy0DtePoCH97K8EtX+mg7ZARUtM=
-github.com/sirupsen/logrus v1.7.0/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0=
-github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc=
-github.com/smartystreets/goconvey v1.6.4/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA=
+github.com/sirupsen/logrus v1.9.0 h1:trlNQbNUG3OdDrDil03MCb1H2o9nJ1x4/5LYw7byDE0=
+github.com/sirupsen/logrus v1.9.0/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ=
github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA=
github.com/spaolacci/murmur3 v1.1.0 h1:7c1g84S4BPRrfL5Xrdp6fOJ206sU9y293DDHaoy0bLI=
github.com/spaolacci/murmur3 v1.1.0/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA=
github.com/spf13/afero v1.3.3/go.mod h1:5KUK8ByomD5Ti5Artl0RtHeI5pTF7MIDuXL3yY520V4=
github.com/spf13/afero v1.6.0 h1:xoax2sJ2DT8S8xA2paPFjDCScCNeWsg75VG0DLRreiY=
github.com/spf13/afero v1.6.0/go.mod h1:Ai8FlHk4v/PARR026UzYexafAt9roJ7LcLMAmO6Z93I=
-github.com/spf13/cast v1.3.0/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE=
github.com/spf13/cast v1.4.1 h1:s0hze+J0196ZfEMTs80N7UlFt0BDuQ7Q+JDnHiMWKdA=
github.com/spf13/cast v1.4.1/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE=
-github.com/spf13/cobra v0.0.3/go.mod h1:1l0Ry5zgKvJasoi3XT1TypsSe7PqH0Sj9dhYf7v3XqQ=
github.com/spf13/cobra v1.3.0 h1:R7cSvGu+Vv+qX0gW5R/85dx2kmmJT5z5NM8ifdYjdn0=
github.com/spf13/cobra v1.3.0/go.mod h1:BrRVncBjOJa/eUcVVm9CE+oC6as8k+VYr4NY7WCi9V4=
github.com/spf13/jwalterweatherman v1.1.0 h1:ue6voC5bR5F8YxI5S67j9i582FU4Qvo2bmqnqMYADFk=
github.com/spf13/jwalterweatherman v1.1.0/go.mod h1:aNWZUN0dPAAO/Ljvb5BEdw96iTZ0EXowPYD95IqWIGo=
-github.com/spf13/pflag v1.0.3/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4=
github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA=
github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg=
github.com/spf13/viper v1.10.0/go.mod h1:SoyBPwAtKDzypXNDFKN5kzH7ppppbGZtls1UpIy5AsM=
github.com/spf13/viper v1.10.1 h1:nuJZuYpG7gTj/XqiUwg8bA0cp1+M2mC3J4g5luUYBKk=
github.com/spf13/viper v1.10.1/go.mod h1:IGlFPqhNAPKRxohIzWpI5QEy4kuI7tcl5WvR+8qy1rU=
-github.com/status-im/keycard-go v0.0.0-20190316090335-8537d3370df4 h1:Gb2Tyox57NRNuZ2d3rmvB3pcmbu7O1RS3m8WRx7ilrg=
-github.com/status-im/keycard-go v0.0.0-20190316090335-8537d3370df4/go.mod h1:RZLeN1LMWmRsyYjvAu+I6Dm9QmlDaIIt+Y+4Kd7Tp+Q=
+github.com/status-im/keycard-go v0.2.0 h1:QDLFswOQu1r5jsycloeQh3bVU8n/NatHHaZobtDnDzA=
+github.com/status-im/keycard-go v0.2.0/go.mod h1:wlp8ZLbsmrF6g6WjugPAx+IzoLrkdf9+mHxBEeo3Hbg=
github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
-github.com/stretchr/objx v0.2.0 h1:Hbg2NidpLE8veEBkEZTL3CvlkUIVzuU9jDplZO54c48=
github.com/stretchr/objx v0.2.0/go.mod h1:qt09Ya8vawLte6SNmTgCsAVtYtaKzEcn8ATUoHMkEqE=
-github.com/stretchr/testify v1.2.0/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs=
+github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw=
+github.com/stretchr/objx v0.5.0 h1:1zr/of2m5FGMsad5YfcqgdqdWrIhu+EBEJRhR1U7z/c=
+github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo=
github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs=
github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=
github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4=
github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA=
github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
-github.com/stretchr/testify v1.7.0 h1:nwc3DEeHmmLAfoZucVR881uASk0Mfjw8xYJ99tb5CcY=
github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
+github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
+github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU=
+github.com/stretchr/testify v1.8.2 h1:+h33VjcLVPDHtOdpUCuF+7gSuG3yGIftsP1YvFihtJ8=
+github.com/stretchr/testify v1.8.2/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4=
github.com/subosito/gotenv v1.2.0 h1:Slr1R9HxAlEKefgq5jn9U+DnETlIUa6HfgEzj0g5d7s=
github.com/subosito/gotenv v1.2.0/go.mod h1:N0PQaV/YGNqwC0u51sEeR/aUtSLEXKX9iv69rRypqCw=
github.com/syndtr/goleveldb v1.0.1-0.20210819022825-2ae1ddf74ef7 h1:epCh84lMvA70Z7CTTCmYQn2CKbY8j86K7/FAIr141uY=
github.com/syndtr/goleveldb v1.0.1-0.20210819022825-2ae1ddf74ef7/go.mod h1:q4W45IWZaF22tdD+VEXcAWRA037jwmWEB5VWYORlTpc=
-github.com/thoas/go-funk v0.9.2 h1:oKlNYv0AY5nyf9g+/GhMgS/UO2ces0QRdPKwkhY3VCk=
-github.com/thoas/go-funk v0.9.2/go.mod h1:+IWnUfUmFO1+WVYQWQtIJHeRRdaIyyYglZN7xzUPe4Q=
-github.com/tinylib/msgp v1.0.2/go.mod h1:+d+yLhGm8mzTaHzB+wgMYrodPfmZrzkirds8fDWklFE=
-github.com/tklauser/go-sysconf v0.3.5/go.mod h1:MkWzOF4RMCshBAMXuhXJs64Rte09mITnppBXY/rYEFI=
-github.com/tklauser/go-sysconf v0.3.6 h1:oc1sJWvKkmvIxhDHeKWvZS4f6AW+YcoguSfRF2/Hmo4=
-github.com/tklauser/go-sysconf v0.3.6/go.mod h1:MkWzOF4RMCshBAMXuhXJs64Rte09mITnppBXY/rYEFI=
-github.com/tklauser/numcpus v0.2.2 h1:oyhllyrScuYI6g+h/zUvNXNp1wy7x8qQy3t/piefldA=
-github.com/tklauser/numcpus v0.2.2/go.mod h1:x3qojaO3uyYt0i56EW/VUYs7uBvdl2fkfZFu0T9wgjM=
+github.com/thoas/go-funk v0.9.3 h1:7+nAEx3kn5ZJcnDm2Bh23N2yOtweO14bi//dvRtgLpw=
+github.com/thoas/go-funk v0.9.3/go.mod h1:+IWnUfUmFO1+WVYQWQtIJHeRRdaIyyYglZN7xzUPe4Q=
+github.com/tklauser/go-sysconf v0.3.11 h1:89WgdJhk5SNwJfu+GKyYveZ4IaJ7xAkecBo+KdJV0CM=
+github.com/tklauser/go-sysconf v0.3.11/go.mod h1:GqXfhXY3kiPa0nAXPDIQIWzJbMCB7AmcWpGR8lSZfqI=
+github.com/tklauser/numcpus v0.6.0/go.mod h1:FEZLMke0lhOUG6w2JadTzp0a+Nl8PF/GFkQ5UVIcaL4=
+github.com/tklauser/numcpus v0.6.1 h1:ng9scYS7az0Bk4OZLvrNXNSAO2Pxr1XXRAPyjhIx+Fk=
+github.com/tklauser/numcpus v0.6.1/go.mod h1:1XfjsgE2zo8GVw7POkMbHENHzVg3GzmoZ9fESEdAacY=
github.com/tv42/httpunix v0.0.0-20150427012821-b75d8614f926/go.mod h1:9ESjWnEqriFuLhtthL60Sar/7RFoluCcXsuvEwTV5KM=
-github.com/tyler-smith/go-bip39 v1.0.1-0.20181017060643-dbb3b84ba2ef h1:wHSqTBrZW24CsNJDfeh9Ex6Pm0Rcpc7qrgKBiL44vF4=
-github.com/tyler-smith/go-bip39 v1.0.1-0.20181017060643-dbb3b84ba2ef/go.mod h1:sJ5fKU0s6JVwZjjcUEX2zFOnvq0ASQ2K9Zr6cf67kNs=
-github.com/urfave/cli/v2 v2.3.0/go.mod h1:LJmUH05zAU44vOAcrfzZQKsZbVcdbOG8rtL3/XcUArI=
+github.com/tyler-smith/go-bip39 v1.1.0 h1:5eUemwrMargf3BSLRRCalXT93Ns6pQJIjYQN2nyfOP8=
+github.com/tyler-smith/go-bip39 v1.1.0/go.mod h1:gUYDtqQw1JS3ZJ8UWVcGTGqqr6YIN3CWg+kkNaLt55U=
+github.com/urfave/cli/v2 v2.25.7 h1:VAzn5oq403l5pHjc4OhD54+XGO9cdKVL/7lDjF+iKUs=
+github.com/urfave/cli/v2 v2.25.7/go.mod h1:8qnjx1vcq5s2/wpsqoZFndg2CE5tNFyrTvS6SinrnYQ=
github.com/valyala/bytebufferpool v1.0.0/go.mod h1:6bBcMArwyJ5K/AmCkWv1jt77kVWyCJ6HpOuEn7z0Csc=
github.com/valyala/fasttemplate v1.0.1/go.mod h1:UQGH1tvbgY+Nz5t2n7tXsz52dQxojPUpymEIMZ47gx8=
github.com/valyala/fasttemplate v1.2.1/go.mod h1:KHLXt3tVN2HBp8eijSv/kGJopbvo7S+qRAEEKiv+SiQ=
-github.com/vulcanize/go-eth-state-node-iterator v1.0.3 h1:gtkU0aP7aW0tPBfzxVSymRhX9eyIQv7HiGkGVGwoh8I=
-github.com/vulcanize/go-eth-state-node-iterator v1.0.3/go.mod h1:a1aRW1/fEmcpY8AAU47p9TNL3QNjpeqCJd/hLtFKVL8=
-github.com/vulcanize/go-ethereum v1.10.18-statediff-3.2.1 h1:XgCj40pL5hADIl7ov4NpSK6MMFThUJrPuRnOSjEIae0=
-github.com/vulcanize/go-ethereum v1.10.18-statediff-3.2.1/go.mod h1:HelXH7UT1uWdb+St6UAj4pPf93GOggjIV7pVbrWIZ3o=
github.com/vulcanize/leveldb-ethdb-rpc v0.1.2 h1:ws/CsvxsPQh6IOQGsUDCPaNuPzcDjtVW1sT8o20Nfg4=
github.com/vulcanize/leveldb-ethdb-rpc v0.1.2/go.mod h1:lksnBYanEe9GuDDeYMtpbc0JnPy4mOKImw4M8vkqJDw=
-github.com/whyrusleeping/go-logging v0.0.0-20170515211332-0457bb6b88fc h1:9lDbC6Rz4bwmou+oE6Dt4Cb2BGMur5eR/GYptkKUVHo=
-github.com/whyrusleeping/go-logging v0.0.0-20170515211332-0457bb6b88fc/go.mod h1:bopw91TMyo8J3tvftk8xmU2kPmlrt4nScJQZU2hE5EM=
-github.com/willf/bitset v1.1.3/go.mod h1:RjeCKbqT1RxIR/KWY6phxZiaY1IyutSBfGjNPySAYV4=
-github.com/xlab/treeprint v0.0.0-20180616005107-d6fb6747feb6/go.mod h1:ce1O1j6UtZfjr22oyGxGLbauSBp2YVXpARAosm7dHBg=
+github.com/xrash/smetrics v0.0.0-20201216005158-039620a65673 h1:bAn7/zixMGCfxrRTfdpNzjtPYqr8smhKouy9mxVdGPU=
+github.com/xrash/smetrics v0.0.0-20201216005158-039620a65673/go.mod h1:N3UwUGtsrSj3ccvlPHLoLsHnpR27oXr4ZE984MbSER8=
github.com/yuin/goldmark v1.1.25/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
github.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k=
-github.com/yuin/goldmark v1.4.1/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k=
+github.com/yusufpapurcu/wmi v1.2.3 h1:E1ctvB7uKFMOJw3fdOW32DwGE9I7t++CRUEMKvFoFiw=
+github.com/yusufpapurcu/wmi v1.2.3/go.mod h1:SBZ9tNy3G9/m5Oi98Zks0QjeHVDvuK0qfxQmPyzfmi0=
github.com/zenazn/goji v0.9.0/go.mod h1:7S9M489iMyHBNxwZnk9/EHS098H4/F6TATF2mIxtB1Q=
go.etcd.io/etcd/api/v3 v3.5.1/go.mod h1:cbVKeC6lCfl7j/8jBhAK6aIYO9XOjdptoxU/nLQcPvs=
go.etcd.io/etcd/client/pkg/v3 v3.5.1/go.mod h1:IJHfcCEKxYu1Os13ZdwCwIUTUVGYTSAM3YSwc9/Ac1g=
@@ -805,7 +706,6 @@ go.uber.org/atomic v1.3.2/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE=
go.uber.org/atomic v1.4.0/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE=
go.uber.org/atomic v1.5.0/go.mod h1:sABNBOSYdrvTF6hTgEIbc7YasKWGhgEQZyfxyTvoXHQ=
go.uber.org/atomic v1.6.0/go.mod h1:sABNBOSYdrvTF6hTgEIbc7YasKWGhgEQZyfxyTvoXHQ=
-go.uber.org/atomic v1.7.0 h1:ADUqmZGgLDDfbSL9ZmPxKTybcoEYHgpYfELNoN+7hsw=
go.uber.org/atomic v1.7.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc=
go.uber.org/multierr v1.1.0/go.mod h1:wR5kodmAFQ0UK8QlbwjlSNy0Z68gJhDJUG5sjR94q/0=
go.uber.org/multierr v1.3.0/go.mod h1:VgVr7evmIr6uPjLBxg28wmKNXyqE9akIJ5XnfpiKl+4=
@@ -818,15 +718,12 @@ go.uber.org/zap v1.13.0/go.mod h1:zwrFLgMcdUuIBviXEYEH1YKNaOBnKXsx2IPda5bBwHM=
go.uber.org/zap v1.17.0/go.mod h1:MXVU+bhUf/A7Xi2HNOnopQOrmycQ5Ih87HtOu4q5SSo=
golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4=
golang.org/x/crypto v0.0.0-20181029021203-45a5f77698d3/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4=
-golang.org/x/crypto v0.0.0-20190211182817-74369b46fc67/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4=
golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
golang.org/x/crypto v0.0.0-20190325154230-a5d413f7728c/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
golang.org/x/crypto v0.0.0-20190411191339-88737f569e3a/go.mod h1:WFFai1msRO1wXaEeE5yQxYXgSfI8pQAWXbQop6sCtWE=
golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
golang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
-golang.org/x/crypto v0.0.0-20190611184440-5c40567a22f8/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
golang.org/x/crypto v0.0.0-20190820162420-60c769a6c586/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
-golang.org/x/crypto v0.0.0-20190909091759-094676da4a83/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
golang.org/x/crypto v0.0.0-20190911031432-227b76d455e7/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
golang.org/x/crypto v0.0.0-20190923035154-9ee001bba392/go.mod h1:/lpIB1dKB+9EgE3H3cr1v9wB50oz8l4C4h62xy7jSTY=
golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
@@ -836,17 +733,12 @@ golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPh
golang.org/x/crypto v0.0.0-20200820211705-5c72a883971a/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
golang.org/x/crypto v0.0.0-20201203163018-be400aefbc4c/go.mod h1:jdWPYTVW3xRLrWPugEBEK3UY2ZEsg3UU495nc5E+M+I=
golang.org/x/crypto v0.0.0-20201221181555-eec23a3978ad/go.mod h1:jdWPYTVW3xRLrWPugEBEK3UY2ZEsg3UU495nc5E+M+I=
-golang.org/x/crypto v0.0.0-20210322153248-0c34fe9e7dc2/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4=
golang.org/x/crypto v0.0.0-20210616213533-5ff15b29337e/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc=
golang.org/x/crypto v0.0.0-20210711020723-a769d52b0f97/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc=
golang.org/x/crypto v0.0.0-20210817164053-32db794688a5/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc=
-golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc=
-golang.org/x/crypto v0.0.0-20220525230936-793ad666bf5e h1:T8NU3HyQ8ClP4SEE+KbFlg6n0NhuTsN4MyznaarGsZM=
-golang.org/x/crypto v0.0.0-20220525230936-793ad666bf5e/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4=
-golang.org/x/exp v0.0.0-20180321215751-8460e604b9de/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
-golang.org/x/exp v0.0.0-20180807140117-3d87b88a115f/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
+golang.org/x/crypto v0.11.0 h1:6Ewdq3tDic1mg5xRO4milcWCfMVQhI4NkqWWvqejpuA=
+golang.org/x/crypto v0.11.0/go.mod h1:xgJhtzW8F9jGdVFWZESrid1U1bjeNy4zgy5cRr/CIio=
golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
-golang.org/x/exp v0.0.0-20190125153040-c74c464bbbf2/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8=
golang.org/x/exp v0.0.0-20190829153037-c13cbed26979/go.mod h1:86+5VVa7VpoJ4kLfm080zCjGlMRFzhUhsZKEZO7MGek=
@@ -856,8 +748,8 @@ golang.org/x/exp v0.0.0-20191227195350-da58074b4299/go.mod h1:2RIsYlXP63K8oxa1u0
golang.org/x/exp v0.0.0-20200119233911-0405dc783f0a/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4=
golang.org/x/exp v0.0.0-20200207192155-f17229e696bd/go.mod h1:J/WKrq2StrnmMY6+EHIKF9dgMWnmCNThgcyBT1FY9mM=
golang.org/x/exp v0.0.0-20200224162631-6cc2880d07d6/go.mod h1:3jZMyOhIsHpP37uCMkUooju7aAi5cS1Q23tOzKc+0MU=
-golang.org/x/exp v0.0.0-20220426173459-3bcf042a4bf5/go.mod h1:lgLbSvA5ygNOMpwM/9anMpWVlVJ7Z+cHWq/eFuinpGE=
-golang.org/x/image v0.0.0-20180708004352-c73c2afc3b81/go.mod h1:ux5Hcp/YLpHSI86hEcLt0YII63i6oz57MZXIpbrjZUs=
+golang.org/x/exp v0.0.0-20230713183714-613f0c0eb8a1 h1:MGwJjxBy0HJshjDNfLsYO8xppfqWlA5ZT9OhtUUhTNw=
+golang.org/x/exp v0.0.0-20230713183714-613f0c0eb8a1/go.mod h1:FXUEEKJgO7OQYeo8N01OfiKP8RXMtf6e8aTskBGqWdc=
golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js=
golang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=
golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE=
@@ -884,8 +776,6 @@ golang.org/x/mod v0.4.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
golang.org/x/mod v0.4.1/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
golang.org/x/mod v0.5.0/go.mod h1:5OXOZSfqPIIbmVBIIKWRFfZjPR0E5r58TLhUjH0a2Ro=
-golang.org/x/mod v0.5.1/go.mod h1:5OXOZSfqPIIbmVBIIKWRFfZjPR0E5r58TLhUjH0a2Ro=
-golang.org/x/mod v0.6.0-dev.0.20211013180041-c96bc1413d57/go.mod h1:3p9vT2HGsQu2K1YbXdKPJLVgG5VJdoTa1poYQBtP1AY=
golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
@@ -893,7 +783,6 @@ golang.org/x/net v0.0.0-20181023162649-9b4f9f5ad519/go.mod h1:mL1N/T3taQHkDXs73r
golang.org/x/net v0.0.0-20181114220301-adae6a3d119a/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
golang.org/x/net v0.0.0-20190108225652-1e06a53dbb7e/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
-golang.org/x/net v0.0.0-20190227160552-c95aed5357e7/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
golang.org/x/net v0.0.0-20190501004415-9ce7a6920f09/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
@@ -921,24 +810,19 @@ golang.org/x/net v0.0.0-20200625001655-4c5254603344/go.mod h1:/O7V0waA8r7cgGh81R
golang.org/x/net v0.0.0-20200707034311-ab3426394381/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA=
golang.org/x/net v0.0.0-20200813134508-3edf25e44fcc/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA=
golang.org/x/net v0.0.0-20200822124328-c89045814202/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA=
-golang.org/x/net v0.0.0-20201010224723-4f7140c49acb/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU=
golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU=
golang.org/x/net v0.0.0-20201031054903-ff519b6c9102/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU=
golang.org/x/net v0.0.0-20201110031124-69a78807bb2b/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU=
golang.org/x/net v0.0.0-20201209123823-ac852fbbde11/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg=
golang.org/x/net v0.0.0-20210119194325-5f4716e94777/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg=
-golang.org/x/net v0.0.0-20210220033124-5f55cee0dc0d/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg=
golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg=
golang.org/x/net v0.0.0-20210316092652-d523dce5a7f4/go.mod h1:RBQZq4jEuRlivfhVLdyRGr576XBO4/greRjx4P4O3yc=
golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM=
golang.org/x/net v0.0.0-20210410081132-afb366fc7cd1/go.mod h1:9tjilg8BloeKEkVJvy7fQ90B1CfIiPueXVOjqfkSzI8=
golang.org/x/net v0.0.0-20210503060351-7fd8e65b6420/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
-golang.org/x/net v0.0.0-20210610132358-84b48f89b13b/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
-golang.org/x/net v0.0.0-20210805182204-aaa1db679c0d/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
golang.org/x/net v0.0.0-20210813160813-60bc85c4be6d/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
-golang.org/x/net v0.0.0-20211015210444-4f30a5c0130f/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
-golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2 h1:CIJ76btIcR3eFI5EgSo6k1qKw9KJexJuRLI9G7Hp5wE=
-golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
+golang.org/x/net v0.10.0 h1:X2//UzNDwYmtCLn7To6G58Wr6f5ahEAQgKNzv9Y951M=
+golang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg=
golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=
golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
@@ -966,17 +850,16 @@ golang.org/x/sync v0.0.0-20200317015054-43a5402ce75a/go.mod h1:RxMgew5VJxzue5/jJ
golang.org/x/sync v0.0.0-20200625203802-6e8e738ad208/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sync v0.0.0-20201207232520-09787c993a3a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
-golang.org/x/sync v0.0.0-20210220032951-036812b2e83c h1:5KslGYwFpkhGh+Q16bwMP3cOontH8FOep7tGV86Y7SQ=
golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
+golang.org/x/sync v0.3.0 h1:ftCYgMx6zT/asHUrPw8BLLscYtGznsLAnjq5RH9P66E=
+golang.org/x/sync v0.3.0/go.mod h1:FU7BRWz2tNW+3quACPkgCx/L+uEAv1htQ0V83Z9Rj+Y=
golang.org/x/sys v0.0.0-20180823144017-11551d06cbcc/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
golang.org/x/sys v0.0.0-20181026203630-95b1ffbd15a5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
-golang.org/x/sys v0.0.0-20181107165924-66b7b1311ac8/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
golang.org/x/sys v0.0.0-20181116152217-5ac8a444bdc5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
-golang.org/x/sys v0.0.0-20190219092855-153ac476189d/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
golang.org/x/sys v0.0.0-20190222072716-a9d3bda3a223/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
golang.org/x/sys v0.0.0-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20190403152447-81d4e9dc473e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
@@ -990,6 +873,7 @@ golang.org/x/sys v0.0.0-20190726091711-fc99dfbffb4e/go.mod h1:h1NjWce9XRLGQEsW7w
golang.org/x/sys v0.0.0-20190813064441-fde4db37ae7a/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20190826190057-c7b8b68b1456/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20190904154756-749cb33beabd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20190916202348-b4ddaad3f8a3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20190922100055-0a153f010e69/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20190924154521-2837fb4f24fe/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20191001151750-bb3f8db39f24/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
@@ -999,7 +883,6 @@ golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7w
golang.org/x/sys v0.0.0-20191120155948-bd437916bb0e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20191204072324-ce4227a45e2e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20191228213918-04cbcbbfeed8/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
-golang.org/x/sys v0.0.0-20200107162124-548cf772de50/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20200113162924-86b910548bc1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20200122134326-e047566fdf82/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
@@ -1029,12 +912,9 @@ golang.org/x/sys v0.0.0-20210220050731-9a76102bfb43/go.mod h1:h1NjWce9XRLGQEsW7w
golang.org/x/sys v0.0.0-20210303074136-134d130e1a04/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20210305230114-8fe3ee5dd75b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20210315160823-c6e025ad8005/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
-golang.org/x/sys v0.0.0-20210316164454-77fc1eacc6aa/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20210320140829-1e4c9ba3b0c4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
-golang.org/x/sys v0.0.0-20210324051608-47abb6519492/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20210403161142-5e06dd20ab57/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
-golang.org/x/sys v0.0.0-20210420205809-ac73e9fd8988/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.0.0-20210514084401-e8d321eab015/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
@@ -1048,13 +928,21 @@ golang.org/x/sys v0.0.0-20210823070655-63515b42dcdf/go.mod h1:oPkhp1MJrh7nUepCBc
golang.org/x/sys v0.0.0-20210908233432-aa78b53d3365/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.0.0-20210927094055-39ccf1dd6fa6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.0.0-20211007075335-d3039528d8ac/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
-golang.org/x/sys v0.0.0-20211019181941-9d821ace8654/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.0.0-20211124211545-fe61309f8881/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.0.0-20211205182925-97ca703d548d/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
-golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a h1:dGzPydgVsqGcTRVwiLJ1jVbufYwmzD3LfVPLKsKg+0k=
-golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
+golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
+golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
+golang.org/x/sys v0.0.0-20220908164124-27713097b956/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
+golang.org/x/sys v0.2.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
+golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
+golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
+golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
+golang.org/x/sys v0.10.0 h1:SqMFp9UcQJZa+pmYuAKjd9xq1f0j5rLcDIk0mj4qAsA=
+golang.org/x/sys v0.10.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw=
golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
+golang.org/x/term v0.10.0 h1:3R7pNqamzBraeqj/Tj8qt1aQ2HpmlC+Cx/qL/7hn4/c=
+golang.org/x/term v0.10.0/go.mod h1:lpqdcUyK/oCiQxvxVrppt5ggO2KCZ5QblwqPnfZ6d5o=
golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
@@ -1063,25 +951,22 @@ golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
golang.org/x/text v0.3.4/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
golang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
-golang.org/x/text v0.3.7 h1:olpwvP2KacW1ZWvsR7uQhoyTYvKAupfQrRGBFM352Gk=
golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ=
+golang.org/x/text v0.11.0 h1:LAntKIrcmeSKERyiOh0XMV39LXS8IE9UL2yP7+f5ij4=
+golang.org/x/text v0.11.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE=
golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
golang.org/x/time v0.0.0-20201208040808-7e3f01d25324/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
-golang.org/x/time v0.0.0-20210220033141-f8bda1e9f3ba h1:O8mE0/t419eoIwhTFpKVkHiTs/Igowgfkj25AcZrtiE=
golang.org/x/time v0.0.0-20210220033141-f8bda1e9f3ba/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
-golang.org/x/tools v0.0.0-20180221164845-07fd8470d635/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
-golang.org/x/tools v0.0.0-20180525024113-a5b4c53f6e8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
+golang.org/x/time v0.3.0 h1:rg5rLMjNzMS1RkNLzCG38eapWhnYLFYXDXj2gOlr8j4=
+golang.org/x/time v0.3.0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
-golang.org/x/tools v0.0.0-20181030221726-6c7e314b6563/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
-golang.org/x/tools v0.0.0-20190206041539-40960b6deb8e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY=
golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=
golang.org/x/tools v0.0.0-20190312151545-0bb0c0a6e846/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=
golang.org/x/tools v0.0.0-20190312170243-e65039ee4138/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=
-golang.org/x/tools v0.0.0-20190328211700-ab21143f2384/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=
golang.org/x/tools v0.0.0-20190425150028-36563e24a262/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q=
golang.org/x/tools v0.0.0-20190425163242-31fd60d6bfdc/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q=
golang.org/x/tools v0.0.0-20190506145303-2d16b83fe98c/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q=
@@ -1100,12 +985,10 @@ golang.org/x/tools v0.0.0-20191113191852-77e3bb0ad9e7/go.mod h1:b+2E5dAYhXwXZwtn
golang.org/x/tools v0.0.0-20191115202509-3a792d9c32b2/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
golang.org/x/tools v0.0.0-20191125144606-a911d9008d1f/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
-golang.org/x/tools v0.0.0-20191126055441-b0650ceb63d9/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
golang.org/x/tools v0.0.0-20191130070609-6e064ea0cf2d/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
golang.org/x/tools v0.0.0-20191216173652-a0e659d51361/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
golang.org/x/tools v0.0.0-20191227053925-7b8e75db28f4/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
golang.org/x/tools v0.0.0-20200103221440-774c71fcf114/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
-golang.org/x/tools v0.0.0-20200108203644-89082a384178/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
golang.org/x/tools v0.0.0-20200117161641-43d50277825c/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
golang.org/x/tools v0.0.0-20200122220014-bf1340f18c4a/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
golang.org/x/tools v0.0.0-20200130002326-2f3ba24bd6e7/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
@@ -1137,20 +1020,12 @@ golang.org/x/tools v0.1.2/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk=
golang.org/x/tools v0.1.3/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk=
golang.org/x/tools v0.1.4/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk=
golang.org/x/tools v0.1.5/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk=
-golang.org/x/tools v0.1.8-0.20211029000441-d6a9af8af023/go.mod h1:nABZi5QlRsZVlzPpHl034qft6wpY4eDcsTt5AaioBiU=
golang.org/x/xerrors v0.0.0-20190410155217-1f06c39b4373/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
golang.org/x/xerrors v0.0.0-20190513163551-3ee3066db522/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
-golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1 h1:go1bK/D/BFZV2I8cIQd1NKEZ+0owSTG1fDTci4IqFcE=
golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
-gonum.org/v1/gonum v0.0.0-20180816165407-929014505bf4/go.mod h1:Y+Yx5eoAFn32cQvJDxZx5Dpnq+c3wtXuadVZAcxbbBo=
-gonum.org/v1/gonum v0.0.0-20181121035319-3f7ecaa7e8ca/go.mod h1:Y+Yx5eoAFn32cQvJDxZx5Dpnq+c3wtXuadVZAcxbbBo=
-gonum.org/v1/gonum v0.6.0/go.mod h1:9mxDZsDKxgMAuccQkewq682L+0eCu4dCN2yonUJTCLU=
-gonum.org/v1/netlib v0.0.0-20181029234149-ec6d1f5cefe6/go.mod h1:wa6Ws7BG/ESfp6dHfk7C6KdzKA7wR7u/rKwOGE66zvw=
-gonum.org/v1/netlib v0.0.0-20190313105609-8cb42192e0e0/go.mod h1:wa6Ws7BG/ESfp6dHfk7C6KdzKA7wR7u/rKwOGE66zvw=
-gonum.org/v1/plot v0.0.0-20190515093506-e2840ee46a6b/go.mod h1:Wt8AAjI+ypCyYX3nZBvf6cAIx93T+c/OS2HFAYskSZc=
google.golang.org/api v0.4.0/go.mod h1:8k5glujaEP+g9n7WNsDg8QP6cUVNI86fCNMcbazEtwE=
google.golang.org/api v0.7.0/go.mod h1:WtwebWUNSVBH/HAw79HIFXZNqEvBhG+Ra+ax0hx3E3M=
google.golang.org/api v0.8.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg=
@@ -1196,7 +1071,6 @@ google.golang.org/genproto v0.0.0-20190307195333-5fe7a883aa19/go.mod h1:VzzqZJRn
google.golang.org/genproto v0.0.0-20190418145605-e7d98fc518a7/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE=
google.golang.org/genproto v0.0.0-20190425155659-357c62f0e4bb/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE=
google.golang.org/genproto v0.0.0-20190502173448-54afdca5d873/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE=
-google.golang.org/genproto v0.0.0-20190716160619-c506a9f90610/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc=
google.golang.org/genproto v0.0.0-20190801165951-fa694d86fc64/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc=
google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc=
google.golang.org/genproto v0.0.0-20190911173649-1774047e7e51/go.mod h1:IbNlFCBrqXvoKpeg0TB2l7cyZUmoaFKYIwrEpbDKLA8=
@@ -1204,7 +1078,6 @@ google.golang.org/genproto v0.0.0-20191108220845-16a3f7862a1a/go.mod h1:n3cpQtvx
google.golang.org/genproto v0.0.0-20191115194625-c23dd37a84c9/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc=
google.golang.org/genproto v0.0.0-20191216164720-4f79533eabd1/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc=
google.golang.org/genproto v0.0.0-20191230161307-f3c370f40bfb/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc=
-google.golang.org/genproto v0.0.0-20200108215221-bd8f9a0ef82f/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc=
google.golang.org/genproto v0.0.0-20200115191322-ca5a22157cba/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc=
google.golang.org/genproto v0.0.0-20200122232147-0452cf42e150/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc=
google.golang.org/genproto v0.0.0-20200204135345-fa8e72b47b90/go.mod h1:GmwEX6Z4W5gMy59cAlVYjN9JhxgbQH6Gn+gFDQe2lzA=
@@ -1296,25 +1169,26 @@ google.golang.org/protobuf v1.24.0/go.mod h1:r/3tXBNzIEhYS9I1OUVjXDlt8tc493IdKGj
google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c=
google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw=
google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc=
-google.golang.org/protobuf v1.27.1 h1:SnqbnDw1V7RiZcXPx5MEeqPv2s79L9i7BJUlG/+RurQ=
google.golang.org/protobuf v1.27.1/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc=
+google.golang.org/protobuf v1.31.0 h1:g0LDEJHgrBl9N9r17Ru3sqWhkIx2NB67okBHPwC7hs8=
+google.golang.org/protobuf v1.31.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I=
gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw=
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk=
-gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q=
gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI=
gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys=
gopkg.in/inconshreveable/log15.v2 v2.0.0-20180818164646-67afb5ed74ec/go.mod h1:aPpfJ7XW+gOuirDoZ8gHhLh3kZ1B08FtV2bbmy7Jv3s=
-gopkg.in/ini.v1 v1.66.2 h1:XfR1dOYubytKy4Shzc2LHrrGhU0lDCfDGG1yLPmpgsI=
gopkg.in/ini.v1 v1.66.2/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k=
+gopkg.in/ini.v1 v1.67.0 h1:Dgnx+6+nfE+IfzjUEISNeydPJh9AXNNsWbGP9KzCsOA=
+gopkg.in/ini.v1 v1.67.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k=
+gopkg.in/natefinch/lumberjack.v2 v2.2.1 h1:bBRl1b0OH9s/DuPhuXpNl+VtCaJXFZ5/uEFST95x9zc=
+gopkg.in/natefinch/lumberjack.v2 v2.2.1/go.mod h1:YD8tP3GAjkrDg1eZH7EGmyESg/lsYskCTPBJVb9jqSc=
gopkg.in/natefinch/npipe.v2 v2.0.0-20160621034901-c1b8fa8bdcce h1:+JknDZhAj8YMt7GC73Ei8pv4MzjDUNPHgQWJdtMAaDU=
gopkg.in/natefinch/npipe.v2 v2.0.0-20160621034901-c1b8fa8bdcce/go.mod h1:5AcXVHNjg+BDxry382+8OKon8SEWiKktQR07RKPsv1c=
gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 h1:uRGJdciOHaEIrze2W8Q3AKkepLTh2hOroT7a+7czfdQ=
gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw=
-gopkg.in/urfave/cli.v1 v1.20.0 h1:NdAVW6RYxDif9DhDHaAortIu956m2c0v+09AZBPTbE0=
-gopkg.in/urfave/cli.v1 v1.20.0/go.mod h1:vuBzUtMdQeixQj8LVd+/98pzhxNGQoyuPBlsXHOQNO0=
gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
gopkg.in/yaml.v2 v2.2.3/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
@@ -1325,8 +1199,9 @@ gopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY=
gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ=
gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
-gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b h1:h8qDotaEPuJATrMmW04NCwg7v22aHH28wwpauUhK9Oo=
gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
+gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=
+gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
honnef.co/go/tools v0.0.0-20190106161140-3f1c8253044a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
honnef.co/go/tools v0.0.0-20190418001031-e561f6794a2a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
@@ -1334,8 +1209,8 @@ honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWh
honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg=
honnef.co/go/tools v0.0.1-2020.1.3/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k=
honnef.co/go/tools v0.0.1-2020.1.4/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k=
-honnef.co/go/tools v0.1.3/go.mod h1:NgwopIslSNH47DimFoV78dnkksY2EFtX0ajyb3K/las=
+lukechampine.com/blake3 v1.2.1 h1:YuqqRuaqsGV71BV/nm9xlI0MKUv4QC54jQnBChWbGnI=
+lukechampine.com/blake3 v1.2.1/go.mod h1:0OFRp7fBtAylGVCO40o87sbupkyIGgbpv1+M1k1LM6k=
rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8=
-rsc.io/pdf v0.1.1/go.mod h1:n8OzWcQ6Sp37PL01nO98y4iUCRdTGarVfzxY20ICaU4=
rsc.io/quote/v3 v3.1.0/go.mod h1:yEA65RcK8LyAZtP9Kv3t0HmxON59tX3rD+tICJqUlj0=
rsc.io/sampler v1.3.0/go.mod h1:T1hPZKmBbMNahiBKFy5HrXp6adAjACjK9JXDnKaTXpA=
diff --git a/pkg/api.go b/pkg/api.go
index 16113db..170c07a 100644
--- a/pkg/api.go
+++ b/pkg/api.go
@@ -30,11 +30,11 @@ const APIVersion = "0.0.1"
// PublicStateDiffAPI provides an RPC interface
// that can be used to fetch historical diffs from LevelDB directly
type PublicStateDiffAPI struct {
- sds StateDiffService
+ sds *Service
}
// NewPublicStateDiffAPI creates an rpc interface for the underlying statediff service
-func NewPublicStateDiffAPI(sds StateDiffService) *PublicStateDiffAPI {
+func NewPublicStateDiffAPI(sds *Service) *PublicStateDiffAPI {
return &PublicStateDiffAPI{
sds: sds,
}
@@ -45,11 +45,6 @@ func (api *PublicStateDiffAPI) StateDiffAt(ctx context.Context, blockNumber uint
return api.sds.StateDiffAt(blockNumber, params)
}
-// StateTrieAt returns a state trie payload at the specific blockheight
-func (api *PublicStateDiffAPI) StateTrieAt(ctx context.Context, blockNumber uint64, params sd.Params) (*sd.Payload, error) {
- return api.sds.StateTrieAt(blockNumber, params)
-}
-
// WriteStateDiffAt writes a state diff object directly to DB at the specific blockheight
func (api *PublicStateDiffAPI) WriteStateDiffAt(ctx context.Context, blockNumber uint64, params sd.Params) error {
return api.sds.WriteStateDiffAt(blockNumber, params)
diff --git a/pkg/builder.go b/pkg/builder.go
deleted file mode 100644
index 752a82f..0000000
--- a/pkg/builder.go
+++ /dev/null
@@ -1,886 +0,0 @@
-// Copyright 2019 The go-ethereum Authors
-// This file is part of the go-ethereum library.
-//
-// The go-ethereum library is free software: you can redistribute it and/or modify
-// it under the terms of the GNU Lesser General Public License as published by
-// the Free Software Foundation, either version 3 of the License, or
-// (at your option) any later version.
-//
-// The go-ethereum library is distributed in the hope that it will be useful,
-// but WITHOUT ANY WARRANTY; without even the implied warranty of
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-// GNU Lesser General Public License for more details.
-//
-// You should have received a copy of the GNU Lesser General Public License
-// along with the go-ethereum library. If not, see .
-
-// Contains a batch of utility type declarations used by the tests. As the node
-// operates on unique types, a lot of them are needed to check various features.
-
-package statediff
-
-import (
- "bytes"
- "fmt"
- "math/bits"
- "sync"
-
- sd "github.com/cerc-io/plugeth-statediff"
- sdtrie "github.com/cerc-io/plugeth-statediff/trie_helpers"
- sdtypes "github.com/cerc-io/plugeth-statediff/types"
- "github.com/ethereum/go-ethereum/common"
- "github.com/ethereum/go-ethereum/core/state"
- "github.com/ethereum/go-ethereum/core/types"
- "github.com/ethereum/go-ethereum/crypto"
- "github.com/ethereum/go-ethereum/log"
- "github.com/ethereum/go-ethereum/rlp"
- "github.com/ethereum/go-ethereum/trie"
- "github.com/sirupsen/logrus"
-
- iter "github.com/vulcanize/go-eth-state-node-iterator"
-)
-
-var (
- nullHashBytes = common.Hex2Bytes("0000000000000000000000000000000000000000000000000000000000000000")
- emptyNode, _ = rlp.EncodeToBytes(&[]byte{})
- emptyContractRoot = crypto.Keccak256Hash(emptyNode)
- nullCodeHash = crypto.Keccak256Hash([]byte{}).Bytes()
-)
-
-// Builder interface exposes the method for building a state diff between two blocks
-type Builder interface {
- BuildStateDiffObject(args sd.Args, params sd.Params) (sdtypes.StateObject, error)
- BuildStateTrieObject(current *types.Block) (sdtypes.StateObject, error)
- WriteStateDiffObject(args sdtypes.StateRoots, params sd.Params, output sdtypes.StateNodeSink, codeOutput sdtypes.CodeSink) error
-}
-
-type builder struct {
- stateCache state.Database
- numWorkers uint
-}
-
-type iterPair struct {
- older, newer trie.NodeIterator
-}
-
-func resolveNode(it trie.NodeIterator, trieDB *trie.Database) (sdtypes.StateNode, []interface{}, error) {
- nodePath := make([]byte, len(it.Path()))
- copy(nodePath, it.Path())
- node, err := trieDB.Node(it.Hash())
- if err != nil {
- return sdtypes.StateNode{}, nil, err
- }
- var nodeElements []interface{}
- if err := rlp.DecodeBytes(node, &nodeElements); err != nil {
- return sdtypes.StateNode{}, nil, err
- }
- ty, err := sdtrie.CheckKeyType(nodeElements)
- if err != nil {
- return sdtypes.StateNode{}, nil, err
- }
- return sdtypes.StateNode{
- NodeType: ty,
- Path: nodePath,
- NodeValue: node,
- }, nodeElements, nil
-}
-
-// convenience
-func stateNodeAppender(nodes *[]sdtypes.StateNode) sdtypes.StateNodeSink {
- return func(node sdtypes.StateNode) error {
- *nodes = append(*nodes, node)
- return nil
- }
-}
-func storageNodeAppender(nodes *[]sdtypes.StorageNode) sdtypes.StorageNodeSink {
- return func(node sdtypes.StorageNode) error {
- *nodes = append(*nodes, node)
- return nil
- }
-}
-func codeMappingAppender(data *[]sdtypes.CodeAndCodeHash) sdtypes.CodeSink {
- return func(c sdtypes.CodeAndCodeHash) error {
- *data = append(*data, c)
- return nil
- }
-}
-
-// NewBuilder is used to create a statediff builder
-func NewBuilder(stateCache state.Database, workers uint) (Builder, error) {
- if workers == 0 {
- workers = 1
- }
- if bits.OnesCount(workers) != 1 {
- return nil, fmt.Errorf("workers must be a power of 2")
- }
- return &builder{
- stateCache: stateCache, // state cache is safe for concurrent reads
- numWorkers: workers,
- }, nil
-}
-
-// BuildStateTrieObject builds a state trie object from the provided block
-func (sdb *builder) BuildStateTrieObject(current *types.Block) (sdtypes.StateObject, error) {
- currentTrie, err := sdb.stateCache.OpenTrie(current.Root())
- if err != nil {
- return sdtypes.StateObject{}, fmt.Errorf("error creating trie for block %d: %v", current.Number(), err)
- }
- it := currentTrie.NodeIterator([]byte{})
- stateNodes, codeAndCodeHashes, err := sdb.buildStateTrie(it)
- if err != nil {
- return sdtypes.StateObject{}, fmt.Errorf("error collecting state nodes for block %d: %v", current.Number(), err)
- }
- return sdtypes.StateObject{
- BlockNumber: current.Number(),
- BlockHash: current.Hash(),
- Nodes: stateNodes,
- CodeAndCodeHashes: codeAndCodeHashes,
- }, nil
-}
-
-func (sdb *builder) buildStateTrie(it trie.NodeIterator) ([]sdtypes.StateNode, []sdtypes.CodeAndCodeHash, error) {
- stateNodes := make([]sdtypes.StateNode, 0)
- codeAndCodeHashes := make([]sdtypes.CodeAndCodeHash, 0)
- for it.Next(true) {
- // skip value nodes
- if it.Leaf() || bytes.Equal(nullHashBytes, it.Hash().Bytes()) {
- continue
- }
- node, nodeElements, err := resolveNode(it, sdb.stateCache.TrieDB())
- if err != nil {
- return nil, nil, err
- }
- switch node.NodeType {
- case sdtypes.Leaf:
- var account types.StateAccount
- if err := rlp.DecodeBytes(nodeElements[1].([]byte), &account); err != nil {
- return nil, nil, fmt.Errorf("error decoding account for leaf node at path %x nerror: %v", node.Path, err)
- }
- partialPath := trie.CompactToHex(nodeElements[0].([]byte))
- valueNodePath := append(node.Path, partialPath...)
- encodedPath := trie.HexToCompact(valueNodePath)
- leafKey := encodedPath[1:]
- node.LeafKey = leafKey
- if !bytes.Equal(account.CodeHash, nullCodeHash) {
- var storageNodes []sdtypes.StorageNode
- err := sdb.buildStorageNodesEventual(account.Root, true, storageNodeAppender(&storageNodes))
- if err != nil {
- return nil, nil, fmt.Errorf("failed building eventual storage diffs for account %+v\r\nerror: %v", account, err)
- }
- node.StorageNodes = storageNodes
- // emit codehash => code mappings for code
- codeHash := common.BytesToHash(account.CodeHash)
- code, err := sdb.stateCache.ContractCode(common.Hash{}, codeHash)
- if err != nil {
- return nil, nil, fmt.Errorf("failed to retrieve code for codehash %s\r\n error: %v", codeHash.String(), err)
- }
- codeAndCodeHashes = append(codeAndCodeHashes, sdtypes.CodeAndCodeHash{
- Hash: codeHash,
- Code: code,
- })
- }
- stateNodes = append(stateNodes, node)
- case sdtypes.Extension, sdtypes.Branch:
- stateNodes = append(stateNodes, node)
- default:
- return nil, nil, fmt.Errorf("unexpected node type %s", node.NodeType)
- }
- }
- return stateNodes, codeAndCodeHashes, it.Error()
-}
-
-// BuildStateDiffObject builds a statediff object from two blocks and the provided parameters
-func (sdb *builder) BuildStateDiffObject(args sd.Args, params sd.Params) (sdtypes.StateObject, error) {
- var stateNodes []sdtypes.StateNode
- var codeAndCodeHashes []sdtypes.CodeAndCodeHash
- err := sdb.WriteStateDiffObject(
- sdtypes.StateRoots{OldStateRoot: args.OldStateRoot, NewStateRoot: args.NewStateRoot},
- params, stateNodeAppender(&stateNodes), codeMappingAppender(&codeAndCodeHashes))
- if err != nil {
- return sdtypes.StateObject{}, err
- }
- return sdtypes.StateObject{
- BlockHash: args.BlockHash,
- BlockNumber: args.BlockNumber,
- Nodes: stateNodes,
- CodeAndCodeHashes: codeAndCodeHashes,
- }, nil
-}
-
-// WriteStateDiffObject writes a statediff object to output callback
-func (sdb *builder) WriteStateDiffObject(args sdtypes.StateRoots, params sd.Params, output sdtypes.StateNodeSink, codeOutput sdtypes.CodeSink) error {
- if len(params.WatchedAddresses) > 0 {
- // if we are watching only specific accounts then we are only diffing leaf nodes
- log.Info("Ignoring intermediate state nodes because WatchedAddresses was passed")
- params.IntermediateStateNodes = false
- }
-
- // Load tries for old and new states
- oldTrie, err := sdb.stateCache.OpenTrie(args.OldStateRoot)
- if err != nil {
- return fmt.Errorf("error creating trie for oldStateRoot: %v", err)
- }
- newTrie, err := sdb.stateCache.OpenTrie(args.NewStateRoot)
- if err != nil {
- return fmt.Errorf("error creating trie for newStateRoot: %v", err)
- }
-
- // Split old and new tries into corresponding subtrie iterators
- oldIters1 := iter.SubtrieIterators(oldTrie, sdb.numWorkers)
- oldIters2 := iter.SubtrieIterators(oldTrie, sdb.numWorkers)
- newIters1 := iter.SubtrieIterators(newTrie, sdb.numWorkers)
- newIters2 := iter.SubtrieIterators(newTrie, sdb.numWorkers)
-
- // Create iterators ahead of time to avoid race condition in state.Trie access
- // We do two state iterations per subtrie: one for new/updated nodes,
- // one for deleted/updated nodes; prepare 2 iterator instances for each task
- var iterPairs [][]iterPair
- for i := uint(0); i < sdb.numWorkers; i++ {
- iterPairs = append(iterPairs, []iterPair{
- {older: oldIters1[i], newer: newIters1[i]},
- {older: oldIters2[i], newer: newIters2[i]},
- })
- }
-
- // Dispatch workers to process trie data; sync and collect results here via channels
- nodeChan := make(chan sdtypes.StateNode)
- codeChan := make(chan sdtypes.CodeAndCodeHash)
-
- go func() {
- nodeSender := func(node sdtypes.StateNode) error { nodeChan <- node; return nil }
- codeSender := func(code sdtypes.CodeAndCodeHash) error { codeChan <- code; return nil }
- var wg sync.WaitGroup
-
- for w := uint(0); w < sdb.numWorkers; w++ {
- wg.Add(1)
- go func(worker uint) {
- defer wg.Done()
- if err := sdb.buildStateDiff(iterPairs[worker], params, nodeSender, codeSender); err != nil {
- logrus.Errorf("buildStateDiff error for worker %d, pparams %+v", worker, params)
- }
- }(w)
- }
- wg.Wait()
- close(nodeChan)
- close(codeChan)
- }()
-
- for nodeChan != nil || codeChan != nil {
- select {
- case node, more := <-nodeChan:
- if more {
- if err := output(node); err != nil {
- return err
- }
- } else {
- nodeChan = nil
- }
- case codeAndCodeHash, more := <-codeChan:
- if more {
- if err := codeOutput(codeAndCodeHash); err != nil {
- return err
- }
- } else {
- codeChan = nil
- }
- }
- }
-
- return nil
-}
-
-func (sdb *builder) buildStateDiff(args []iterPair, params sd.Params, output sdtypes.StateNodeSink, codeOutput sdtypes.CodeSink) error {
- // collect a slice of all the intermediate nodes that were touched and exist at B
- // a map of their leafkey to all the accounts that were touched and exist at B
- // and a slice of all the paths for the nodes in both of the above sets
- var diffAccountsAtB AccountMap
- var diffPathsAtB map[string]bool
- var err error
- if params.IntermediateStateNodes {
- diffAccountsAtB, diffPathsAtB, err = sdb.createdAndUpdatedStateWithIntermediateNodes(args[0], output)
- } else {
- diffAccountsAtB, diffPathsAtB, err = sdb.createdAndUpdatedState(args[0], params.WatchedAddressesLeafKeys())
- }
-
- if err != nil {
- return fmt.Errorf("error collecting createdAndUpdatedNodes: %v", err)
- }
-
- // collect a slice of all the nodes that existed at a path in A that doesn't exist in B
- // a map of their leafkey to all the accounts that were touched and exist at A
- diffAccountsAtA, err := sdb.deletedOrUpdatedState(args[1], diffAccountsAtB, diffPathsAtB, params.WatchedAddressesLeafKeys(), params.IntermediateStorageNodes, output)
- if err != nil {
- return fmt.Errorf("error collecting deletedOrUpdatedNodes: %v", err)
- }
-
- // collect and sort the leafkeys for both account mappings into a slice
- createKeys := sortKeys(diffAccountsAtB)
- deleteKeys := sortKeys(diffAccountsAtA)
-
- // and then find the intersection of these keys
- // these are the leafkeys for the accounts which exist at both A and B but are different
- // this also mutates the passed in createKeys and deleteKeys, removing the intersection keys
- // and leaving the truly created or deleted keys in place
- updatedKeys := findIntersection(createKeys, deleteKeys)
-
- // build the diff nodes for the updated accounts using the mappings at both A and B as directed by the keys found as the intersection of the two
- err = sdb.buildAccountUpdates(
- diffAccountsAtB, diffAccountsAtA, updatedKeys, params.IntermediateStorageNodes, output)
- if err != nil {
- return fmt.Errorf("error building diff for updated accounts: %v", err)
- }
- // build the diff nodes for created accounts
- err = sdb.buildAccountCreations(diffAccountsAtB, params.IntermediateStorageNodes, output, codeOutput)
- if err != nil {
- return fmt.Errorf("error building diff for created accounts: %v", err)
- }
- return nil
-}
-
-// createdAndUpdatedState returns
-// a mapping of their leafkeys to all the accounts that exist in a different state at B than A
-// and a slice of the paths for all of the nodes included in both
-func (sdb *builder) createdAndUpdatedState(iters iterPair, watchedAddressesLeafKeys map[common.Hash]struct{}) (AccountMap, map[string]bool, error) {
- diffPathsAtB := make(map[string]bool)
- diffAcountsAtB := make(AccountMap)
- it, _ := trie.NewDifferenceIterator(iters.older, iters.newer)
- for it.Next(true) {
- if it.Leaf() || bytes.Equal(nullHashBytes, it.Hash().Bytes()) {
- continue
- }
- node, nodeElements, err := sdtrie.ResolveNode(it, sdb.stateCache.TrieDB())
- if err != nil {
- return nil, nil, err
- }
- switch node.NodeType {
- case sdtypes.Leaf:
- // created vs updated is important for leaf nodes since we need to diff their storage
- // so we need to map all changed accounts at B to their leafkey, since account can change pathes but not leafkey
- var account types.StateAccount
- if err := rlp.DecodeBytes(nodeElements[1].([]byte), &account); err != nil {
- return nil, nil, fmt.Errorf("error decoding account for leaf node at path %x nerror: %v", node.Path, err)
- }
- partialPath := trie.CompactToHex(nodeElements[0].([]byte))
- valueNodePath := append(node.Path, partialPath...)
- encodedPath := trie.HexToCompact(valueNodePath)
- leafKey := encodedPath[1:]
- if isWatchedAddress(watchedAddressesLeafKeys, leafKey) {
- diffAcountsAtB[common.Bytes2Hex(leafKey)] = accountWrapper{
- NodeType: node.NodeType,
- Path: node.Path,
- NodeValue: node.NodeValue,
- LeafKey: leafKey,
- Account: &account,
- }
- }
- }
- // add both intermediate and leaf node paths to the list of diffPathsAtB
- diffPathsAtB[common.Bytes2Hex(node.Path)] = true
- }
- return diffAcountsAtB, diffPathsAtB, it.Error()
-}
-
-// createdAndUpdatedStateWithIntermediateNodes returns
-// a slice of all the intermediate nodes that exist in a different state at B than A
-// a mapping of their leafkeys to all the accounts that exist in a different state at B than A
-// and a slice of the paths for all of the nodes included in both
-func (sdb *builder) createdAndUpdatedStateWithIntermediateNodes(iters iterPair, output sdtypes.StateNodeSink) (AccountMap, map[string]bool, error) {
- diffPathsAtB := make(map[string]bool)
- diffAcountsAtB := make(AccountMap)
- it, _ := trie.NewDifferenceIterator(iters.older, iters.newer)
- for it.Next(true) {
- if it.Leaf() || bytes.Equal(nullHashBytes, it.Hash().Bytes()) {
- continue
- }
- node, nodeElements, err := resolveNode(it, sdb.stateCache.TrieDB())
- if err != nil {
- return nil, nil, err
- }
- switch node.NodeType {
- case sdtypes.Leaf:
- // created vs updated is important for leaf nodes since we need to diff their storage
- // so we need to map all changed accounts at B to their leafkey, since account can change paths but not leafkey
- var account types.StateAccount
- if err := rlp.DecodeBytes(nodeElements[1].([]byte), &account); err != nil {
- return nil, nil, fmt.Errorf("error decoding account for leaf node at path %x nerror: %v", node.Path, err)
- }
- partialPath := trie.CompactToHex(nodeElements[0].([]byte))
- valueNodePath := append(node.Path, partialPath...)
- encodedPath := trie.HexToCompact(valueNodePath)
- leafKey := encodedPath[1:]
- diffAcountsAtB[common.Bytes2Hex(leafKey)] = accountWrapper{
- NodeType: node.NodeType,
- Path: node.Path,
- NodeValue: node.NodeValue,
- LeafKey: leafKey,
- Account: &account,
- }
- case sdtypes.Extension, sdtypes.Branch:
- // create a diff for any intermediate node that has changed at b
- // created vs updated makes no difference for intermediate nodes since we do not need to diff storage
- if err := output(sdtypes.StateNode{
- NodeType: node.NodeType,
- Path: node.Path,
- NodeValue: node.NodeValue,
- }); err != nil {
- return nil, nil, err
- }
- default:
- return nil, nil, fmt.Errorf("unexpected node type %s", node.NodeType)
- }
- // add both intermediate and leaf node paths to the list of diffPathsAtB
- diffPathsAtB[common.Bytes2Hex(node.Path)] = true
- }
- return diffAcountsAtB, diffPathsAtB, it.Error()
-}
-
-// deletedOrUpdatedState returns a slice of all the paths that are emptied at B
-// and a mapping of their leafkeys to all the accounts that exist in a different state at A than B
-func (sdb *builder) deletedOrUpdatedState(iters iterPair, diffAccountsAtB AccountMap, diffPathsAtB map[string]bool, watchedAddressesLeafKeys map[common.Hash]struct{}, intermediateStorageNodes bool, output sdtypes.StateNodeSink) (AccountMap, error) {
- diffAccountAtA := make(AccountMap)
- it, _ := trie.NewDifferenceIterator(iters.newer, iters.older)
- for it.Next(true) {
- // skip value nodes
- if it.Leaf() || bytes.Equal(nullHashBytes, it.Hash().Bytes()) {
- continue
- }
- node, nodeElements, err := sdtrie.ResolveNode(it, sdb.stateCache.TrieDB())
- if err != nil {
- return nil, err
- }
- switch node.NodeType {
- case sdtypes.Leaf:
- // map all different accounts at A to their leafkey
- var account types.StateAccount
- if err := rlp.DecodeBytes(nodeElements[1].([]byte), &account); err != nil {
- return nil, fmt.Errorf("error decoding account for leaf node at path %x nerror: %v", node.Path, err)
- }
- partialPath := trie.CompactToHex(nodeElements[0].([]byte))
- valueNodePath := append(node.Path, partialPath...)
- encodedPath := trie.HexToCompact(valueNodePath)
- leafKey := encodedPath[1:]
- if isWatchedAddress(watchedAddressesLeafKeys, leafKey) {
- diffAccountAtA[common.Bytes2Hex(leafKey)] = accountWrapper{
- NodeType: node.NodeType,
- Path: node.Path,
- NodeValue: node.NodeValue,
- LeafKey: leafKey,
- Account: &account,
- }
- // if this node's path did not show up in diffPathsAtB
- // that means the node at this path was deleted (or moved) in B
- if _, ok := diffPathsAtB[common.Bytes2Hex(node.Path)]; !ok {
- var diff sdtypes.StateNode
- // if this node's leaf key also did not show up in diffAccountsAtB
- // that means the node was deleted
- // in that case, emit an empty "removed" diff state node
- // include empty "removed" diff storage nodes for all the storage slots
- if _, ok := diffAccountsAtB[common.Bytes2Hex(leafKey)]; !ok {
- diff = sdtypes.StateNode{
- NodeType: sdtypes.Removed,
- Path: node.Path,
- LeafKey: leafKey,
- NodeValue: []byte{},
- }
-
- var storageDiffs []sdtypes.StorageNode
- err := sdb.buildRemovedAccountStorageNodes(account.Root, intermediateStorageNodes, storageNodeAppender(&storageDiffs))
- if err != nil {
- return nil, fmt.Errorf("failed building storage diffs for removed node %x\r\nerror: %v", node.Path, err)
- }
- diff.StorageNodes = storageDiffs
- } else {
- // emit an empty "removed" diff with empty leaf key if the account was moved
- diff = sdtypes.StateNode{
- NodeType: sdtypes.Removed,
- Path: node.Path,
- NodeValue: []byte{},
- }
- }
-
- if err := output(diff); err != nil {
- return nil, err
- }
- }
- }
- case sdtypes.Extension, sdtypes.Branch:
- // if this node's path did not show up in diffPathsAtB
- // that means the node at this path was deleted (or moved) in B
- // emit an empty "removed" diff to signify as such
- if _, ok := diffPathsAtB[common.Bytes2Hex(node.Path)]; !ok {
- if err := output(sdtypes.StateNode{
- Path: node.Path,
- NodeValue: []byte{},
- NodeType: sdtypes.Removed,
- }); err != nil {
- return nil, err
- }
- }
- // fall through, we did everything we need to do with these node types
- default:
- return nil, fmt.Errorf("unexpected node type %s", node.NodeType)
- }
- }
- return diffAccountAtA, it.Error()
-}
-
-// buildAccountUpdates uses the account diffs maps for A => B and B => A and the known intersection of their leafkeys
-// to generate the statediff node objects for all of the accounts that existed at both A and B but in different states
-// needs to be called before building account creations and deletions as this mutates
-// those account maps to remove the accounts which were updated
-func (sdb *builder) buildAccountUpdates(creations, deletions AccountMap, updatedKeys []string, intermediateStorageNodes bool, output sdtypes.StateNodeSink) error {
- var err error
- for _, key := range updatedKeys {
- createdAcc := creations[key]
- deletedAcc := deletions[key]
- var storageDiffs []sdtypes.StorageNode
- if deletedAcc.Account != nil && createdAcc.Account != nil {
- oldSR := deletedAcc.Account.Root
- newSR := createdAcc.Account.Root
- err = sdb.buildStorageNodesIncremental(oldSR, newSR, intermediateStorageNodes, storageNodeAppender(&storageDiffs))
- if err != nil {
- return fmt.Errorf("failed building incremental storage diffs for account with leafkey %s\r\nerror: %v", key, err)
- }
- }
- if err = output(sdtypes.StateNode{
- NodeType: createdAcc.NodeType,
- Path: createdAcc.Path,
- NodeValue: createdAcc.NodeValue,
- LeafKey: createdAcc.LeafKey,
- StorageNodes: storageDiffs,
- }); err != nil {
- return err
- }
- delete(creations, key)
- delete(deletions, key)
- }
-
- return nil
-}
-
-// buildAccountCreations returns the statediff node objects for all the accounts that exist at B but not at A
-// it also returns the code and codehash for created contract accounts
-func (sdb *builder) buildAccountCreations(accounts AccountMap, intermediateStorageNodes bool, output sdtypes.StateNodeSink, codeOutput sdtypes.CodeSink) error {
- for _, val := range accounts {
- diff := sdtypes.StateNode{
- NodeType: val.NodeType,
- Path: val.Path,
- LeafKey: val.LeafKey,
- NodeValue: val.NodeValue,
- }
- if !bytes.Equal(val.Account.CodeHash, nullCodeHash) {
- // For contract creations, any storage node contained is a diff
- var storageDiffs []sdtypes.StorageNode
- err := sdb.buildStorageNodesEventual(val.Account.Root, intermediateStorageNodes, storageNodeAppender(&storageDiffs))
- if err != nil {
- return fmt.Errorf("failed building eventual storage diffs for node %x\r\nerror: %v", val.Path, err)
- }
- diff.StorageNodes = storageDiffs
- // emit codehash => code mappings for code
- codeHash := common.BytesToHash(val.Account.CodeHash)
- code, err := sdb.stateCache.ContractCode(common.Hash{}, codeHash)
- if err != nil {
- return fmt.Errorf("failed to retrieve code for codehash %s\r\n error: %v", codeHash.String(), err)
- }
- if err := codeOutput(sdtypes.CodeAndCodeHash{
- Hash: codeHash,
- Code: code,
- }); err != nil {
- return err
- }
- }
- if err := output(diff); err != nil {
- return err
- }
- }
-
- return nil
-}
-
-// buildStorageNodesEventual builds the storage diff node objects for a created account
-// i.e. it returns all the storage nodes at this state, since there is no previous state
-func (sdb *builder) buildStorageNodesEventual(sr common.Hash, intermediateNodes bool, output sdtypes.StorageNodeSink) error {
- if bytes.Equal(sr.Bytes(), emptyContractRoot.Bytes()) {
- return nil
- }
- log.Debug("Storage Root For Eventual Diff", "root", sr.Hex())
- sTrie, err := sdb.stateCache.OpenTrie(sr)
- if err != nil {
- log.Info("error in build storage diff eventual", "error", err)
- return err
- }
- it := sTrie.NodeIterator(make([]byte, 0))
- err = sdb.buildStorageNodesFromTrie(it, intermediateNodes, output)
- if err != nil {
- return err
- }
- return nil
-}
-
-// buildStorageNodesFromTrie returns all the storage diff node objects in the provided node iterator
-// if any storage keys are provided it will only return those leaf nodes
-// including intermediate nodes can be turned on or off
-func (sdb *builder) buildStorageNodesFromTrie(it trie.NodeIterator, intermediateNodes bool, output sdtypes.StorageNodeSink) error {
- for it.Next(true) {
- if it.Leaf() || bytes.Equal(nullHashBytes, it.Hash().Bytes()) {
- continue
- }
- node, nodeElements, err := resolveNode(it, sdb.stateCache.TrieDB())
- if err != nil {
- return err
- }
- switch node.NodeType {
- case sdtypes.Leaf:
- partialPath := trie.CompactToHex(nodeElements[0].([]byte))
- valueNodePath := append(node.Path, partialPath...)
- encodedPath := trie.HexToCompact(valueNodePath)
- leafKey := encodedPath[1:]
- if err := output(sdtypes.StorageNode{
- NodeType: node.NodeType,
- Path: node.Path,
- NodeValue: node.NodeValue,
- LeafKey: leafKey,
- }); err != nil {
- return err
- }
- case sdtypes.Extension, sdtypes.Branch:
- if intermediateNodes {
- if err := output(sdtypes.StorageNode{
- NodeType: node.NodeType,
- Path: node.Path,
- NodeValue: node.NodeValue,
- }); err != nil {
- return err
- }
- }
- default:
- return fmt.Errorf("unexpected node type %s", node.NodeType)
- }
- }
- return it.Error()
-}
-
-// buildRemovedAccountStorageNodes builds the "removed" diffs for all the storage nodes for a destroyed account
-func (sdb *builder) buildRemovedAccountStorageNodes(sr common.Hash, intermediateNodes bool, output sdtypes.StorageNodeSink) error {
- if bytes.Equal(sr.Bytes(), emptyContractRoot.Bytes()) {
- return nil
- }
- log.Debug("Storage Root For Removed Diffs", "root", sr.Hex())
- sTrie, err := sdb.stateCache.OpenTrie(sr)
- if err != nil {
- log.Info("error in build removed account storage diffs", "error", err)
- return err
- }
- it := sTrie.NodeIterator(make([]byte, 0))
- err = sdb.buildRemovedStorageNodesFromTrie(it, intermediateNodes, output)
- if err != nil {
- return err
- }
- return nil
-}
-
-// buildRemovedStorageNodesFromTrie returns diffs for all the storage nodes in the provided node interator
-// including intermediate nodes can be turned on or off
-func (sdb *builder) buildRemovedStorageNodesFromTrie(it trie.NodeIterator, intermediateNodes bool, output sdtypes.StorageNodeSink) error {
- for it.Next(true) {
- // skip value nodes
- if it.Leaf() || bytes.Equal(nullHashBytes, it.Hash().Bytes()) {
- continue
- }
- node, nodeElements, err := resolveNode(it, sdb.stateCache.TrieDB())
- if err != nil {
- return err
- }
- switch node.NodeType {
- case sdtypes.Leaf:
- partialPath := trie.CompactToHex(nodeElements[0].([]byte))
- valueNodePath := append(node.Path, partialPath...)
- encodedPath := trie.HexToCompact(valueNodePath)
- leafKey := encodedPath[1:]
- if err := output(sdtypes.StorageNode{
- NodeType: sdtypes.Removed,
- Path: node.Path,
- NodeValue: []byte{},
- LeafKey: leafKey,
- }); err != nil {
- return err
- }
- case sdtypes.Extension, sdtypes.Branch:
- if intermediateNodes {
- if err := output(sdtypes.StorageNode{
- NodeType: sdtypes.Removed,
- Path: node.Path,
- NodeValue: []byte{},
- }); err != nil {
- return err
- }
- }
- default:
- return fmt.Errorf("unexpected node type %s", node.NodeType)
- }
- }
- return it.Error()
-}
-
-// buildStorageNodesIncremental builds the storage diff node objects for all nodes that exist in a different state at B than A
-func (sdb *builder) buildStorageNodesIncremental(oldSR common.Hash, newSR common.Hash, intermediateNodes bool, output sdtypes.StorageNodeSink) error {
- if bytes.Equal(newSR.Bytes(), oldSR.Bytes()) {
- return nil
- }
- log.Debug("Storage Roots for Incremental Diff", "old", oldSR.Hex(), "new", newSR.Hex())
- oldTrie, err := sdb.stateCache.OpenTrie(oldSR)
- if err != nil {
- return err
- }
- newTrie, err := sdb.stateCache.OpenTrie(newSR)
- if err != nil {
- return err
- }
-
- diffSlotsAtB, diffPathsAtB, err := sdb.createdAndUpdatedStorage(oldTrie.NodeIterator([]byte{}), newTrie.NodeIterator([]byte{}), intermediateNodes, output)
- if err != nil {
- return err
- }
- err = sdb.deletedOrUpdatedStorage(oldTrie.NodeIterator([]byte{}), newTrie.NodeIterator([]byte{}), diffSlotsAtB, diffPathsAtB, intermediateNodes, output)
- if err != nil {
- return err
- }
- return nil
-}
-
-func (sdb *builder) createdAndUpdatedStorage(a, b trie.NodeIterator, intermediateNodes bool, output sdtypes.StorageNodeSink) (map[string]bool, map[string]bool, error) {
- diffPathsAtB := make(map[string]bool)
- diffSlotsAtB := make(map[string]bool)
- it, _ := trie.NewDifferenceIterator(a, b)
- for it.Next(true) {
- if it.Leaf() || bytes.Equal(nullHashBytes, it.Hash().Bytes()) {
- continue
- }
- node, nodeElements, err := resolveNode(it, sdb.stateCache.TrieDB())
- if err != nil {
- return nil, nil, err
- }
- switch node.NodeType {
- case sdtypes.Leaf:
- partialPath := trie.CompactToHex(nodeElements[0].([]byte))
- valueNodePath := append(node.Path, partialPath...)
- encodedPath := trie.HexToCompact(valueNodePath)
- leafKey := encodedPath[1:]
- diffSlotsAtB[common.Bytes2Hex(leafKey)] = true
- if err := output(sdtypes.StorageNode{
- NodeType: node.NodeType,
- Path: node.Path,
- NodeValue: node.NodeValue,
- LeafKey: leafKey,
- }); err != nil {
- return nil, nil, err
- }
- case sdtypes.Extension, sdtypes.Branch:
- if intermediateNodes {
- if err := output(sdtypes.StorageNode{
- NodeType: node.NodeType,
- Path: node.Path,
- NodeValue: node.NodeValue,
- }); err != nil {
- return nil, nil, err
- }
- }
- default:
- return nil, nil, fmt.Errorf("unexpected node type %s", node.NodeType)
- }
- diffPathsAtB[common.Bytes2Hex(node.Path)] = true
- }
- return diffSlotsAtB, diffPathsAtB, it.Error()
-}
-
-func (sdb *builder) deletedOrUpdatedStorage(a, b trie.NodeIterator, diffSlotsAtB, diffPathsAtB map[string]bool, intermediateNodes bool, output sdtypes.StorageNodeSink) error {
- it, _ := trie.NewDifferenceIterator(b, a)
- for it.Next(true) {
- // skip value nodes
- if it.Leaf() || bytes.Equal(nullHashBytes, it.Hash().Bytes()) {
- continue
- }
- node, nodeElements, err := sdtrie.ResolveNode(it, sdb.stateCache.TrieDB())
- if err != nil {
- return err
- }
-
- switch node.NodeType {
- case sdtypes.Leaf:
- partialPath := trie.CompactToHex(nodeElements[0].([]byte))
- valueNodePath := append(node.Path, partialPath...)
- encodedPath := trie.HexToCompact(valueNodePath)
- leafKey := encodedPath[1:]
-
- // if this node's path did not show up in diffPathsAtB
- // that means the node at this path was deleted (or moved) in B
- if _, ok := diffPathsAtB[common.Bytes2Hex(node.Path)]; !ok {
- // if this node's leaf key also did not show up in diffSlotsAtB
- // that means the node was deleted
- // in that case, emit an empty "removed" diff storage node
- if _, ok := diffSlotsAtB[common.Bytes2Hex(leafKey)]; !ok {
- if err := output(sdtypes.StorageNode{
- NodeType: sdtypes.Removed,
- Path: node.Path,
- NodeValue: []byte{},
- LeafKey: leafKey,
- }); err != nil {
- return err
- }
- } else {
- // emit an empty "removed" diff with empty leaf key if the account was moved
- if err := output(sdtypes.StorageNode{
- NodeType: sdtypes.Removed,
- Path: node.Path,
- NodeValue: []byte{},
- }); err != nil {
- return err
- }
- }
- }
- case sdtypes.Extension, sdtypes.Branch:
- // if this node's path did not show up in diffPathsAtB
- // that means the node at this path was deleted in B
- // in that case, emit an empty "removed" diff storage node
- if _, ok := diffPathsAtB[common.Bytes2Hex(node.Path)]; !ok {
- if intermediateNodes {
- if err := output(sdtypes.StorageNode{
- NodeType: sdtypes.Removed,
- Path: node.Path,
- NodeValue: []byte{},
- }); err != nil {
- return err
- }
- }
- }
- default:
- return fmt.Errorf("unexpected node type %s", node.NodeType)
- }
- }
- return it.Error()
-}
-
-// isWatchedAddress is used to check if a state account corresponds to one of the addresses the builder is configured to watch
-func isWatchedAddress(watchedAddressesLeafKeys map[common.Hash]struct{}, stateLeafKey []byte) bool {
- // If we aren't watching any specific addresses, we are watching everything
- if len(watchedAddressesLeafKeys) == 0 {
- return true
- }
-
- _, ok := watchedAddressesLeafKeys[common.BytesToHash(stateLeafKey)]
- return ok
-}
-
-// isWatchedStorageKey is used to check if a storage leaf corresponds to one of the storage slots the builder is configured to watch
-func isWatchedStorageKey(watchedKeys []common.Hash, storageLeafKey []byte) bool {
- // If we aren't watching any specific addresses, we are watching everything
- if len(watchedKeys) == 0 {
- return true
- }
- for _, hashKey := range watchedKeys {
- if bytes.Equal(hashKey.Bytes(), storageLeafKey) {
- return true
- }
- }
- return false
-}
diff --git a/pkg/builder_test.go b/pkg/builder_test.go
deleted file mode 100644
index a83f15f..0000000
--- a/pkg/builder_test.go
+++ /dev/null
@@ -1,2523 +0,0 @@
-// Copyright 2019 The go-ethereum Authors
-// This file is part of the go-ethereum library.
-//
-// The go-ethereum library is free software: you can redistribute it and/or modify
-// it under the terms of the GNU Lesser General Public License as published by
-// the Free Software Foundation, either version 3 of the License, or
-// (at your option) any later version.
-//
-// The go-ethereum library is distributed in the hope that it will be useful,
-// but WITHOUT ANY WARRANTY; without even the implied warranty of
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-// GNU Lesser General Public License for more details.
-//
-// You should have received a copy of the GNU Lesser General Public License
-// along with the go-ethereum library. If not, see .
-
-package statediff_test
-
-import (
- "bytes"
- "math/big"
- "sort"
- "testing"
-
- "github.com/cerc-io/plugeth-statediff"
- "github.com/cerc-io/plugeth-statediff/test_helpers"
- sdtypes "github.com/cerc-io/plugeth-statediff/types"
- "github.com/ethereum/go-ethereum/common"
- "github.com/ethereum/go-ethereum/core/types"
- "github.com/ethereum/go-ethereum/crypto"
- "github.com/ethereum/go-ethereum/rlp"
-
- pkg "github.com/vulcanize/eth-statediff-service/pkg"
-)
-
-// TODO: add test that filters on address
-var (
- contractLeafKey []byte
- emptyDiffs = make([]sdtypes.StateNode, 0)
- emptyStorage = make([]sdtypes.StorageNode, 0)
- block0, block1, block2, block3, block4, block5, block6 *types.Block
- builder pkg.Builder
- miningReward = int64(2000000000000000000)
- minerAddress = common.HexToAddress("0x0")
- minerLeafKey = test_helpers.AddressToLeafKey(minerAddress)
- workerCounts = []uint{0, 1, 2, 4, 8}
-
- slot0 = common.HexToHash("0")
- slot1 = common.HexToHash("1")
- slot2 = common.HexToHash("2")
- slot3 = common.HexToHash("3")
-
- slot0StorageKey = crypto.Keccak256Hash(slot0[:])
- slot1StorageKey = crypto.Keccak256Hash(slot1[:])
- slot2StorageKey = crypto.Keccak256Hash(slot2[:])
- slot3StorageKey = crypto.Keccak256Hash(slot3[:])
-
- slot0StorageValue = common.Hex2Bytes("94703c4b2bd70c169f5717101caee543299fc946c7") // prefixed AccountAddr1
- slot1StorageValue = common.Hex2Bytes("01")
- slot2StorageValue = common.Hex2Bytes("09")
- slot3StorageValue = common.Hex2Bytes("03")
-
- slot0StorageLeafNode, _ = rlp.EncodeToBytes(&[]interface{}{
- common.Hex2Bytes("390decd9548b62a8d60345a988386fc84ba6bc95484008f6362f93160ef3e563"),
- slot0StorageValue,
- })
- slot1StorageLeafNode, _ = rlp.EncodeToBytes(&[]interface{}{
- common.Hex2Bytes("310e2d527612073b26eecdfd717e6a320cf44b4afac2b0732d9fcbe2b7fa0cf6"),
- slot1StorageValue,
- })
- slot2StorageLeafNode, _ = rlp.EncodeToBytes(&[]interface{}{
- common.Hex2Bytes("305787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5ace"),
- slot2StorageValue,
- })
- slot3StorageLeafNode, _ = rlp.EncodeToBytes(&[]interface{}{
- common.Hex2Bytes("32575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85b"),
- slot3StorageValue,
- })
-
- contractAccountAtBlock2, _ = rlp.EncodeToBytes(&types.StateAccount{
- Nonce: 1,
- Balance: big.NewInt(0),
- CodeHash: common.HexToHash("0xaaea5efba4fd7b45d7ec03918ac5d8b31aa93b48986af0e6b591f0f087c80127").Bytes(),
- Root: crypto.Keccak256Hash(block2StorageBranchRootNode),
- })
- contractAccountAtBlock2LeafNode, _ = rlp.EncodeToBytes(&[]interface{}{
- common.Hex2Bytes("3114658a74d9cc9f7acf2c5cd696c3494d7c344d78bfec3add0d91ec4e8d1c45"),
- contractAccountAtBlock2,
- })
- contractAccountAtBlock3, _ = rlp.EncodeToBytes(&types.StateAccount{
- Nonce: 1,
- Balance: big.NewInt(0),
- CodeHash: common.HexToHash("0xaaea5efba4fd7b45d7ec03918ac5d8b31aa93b48986af0e6b591f0f087c80127").Bytes(),
- Root: crypto.Keccak256Hash(block3StorageBranchRootNode),
- })
- contractAccountAtBlock3LeafNode, _ = rlp.EncodeToBytes(&[]interface{}{
- common.Hex2Bytes("3114658a74d9cc9f7acf2c5cd696c3494d7c344d78bfec3add0d91ec4e8d1c45"),
- contractAccountAtBlock3,
- })
- contractAccountAtBlock4, _ = rlp.EncodeToBytes(&types.StateAccount{
- Nonce: 1,
- Balance: big.NewInt(0),
- CodeHash: common.HexToHash("0xaaea5efba4fd7b45d7ec03918ac5d8b31aa93b48986af0e6b591f0f087c80127").Bytes(),
- Root: crypto.Keccak256Hash(block4StorageBranchRootNode),
- })
- contractAccountAtBlock4LeafNode, _ = rlp.EncodeToBytes(&[]interface{}{
- common.Hex2Bytes("3114658a74d9cc9f7acf2c5cd696c3494d7c344d78bfec3add0d91ec4e8d1c45"),
- contractAccountAtBlock4,
- })
- contractAccountAtBlock5, _ = rlp.EncodeToBytes(&types.StateAccount{
- Nonce: 1,
- Balance: big.NewInt(0),
- CodeHash: common.HexToHash("0xaaea5efba4fd7b45d7ec03918ac5d8b31aa93b48986af0e6b591f0f087c80127").Bytes(),
- Root: crypto.Keccak256Hash(block5StorageBranchRootNode),
- })
- contractAccountAtBlock5LeafNode, _ = rlp.EncodeToBytes(&[]interface{}{
- common.Hex2Bytes("3114658a74d9cc9f7acf2c5cd696c3494d7c344d78bfec3add0d91ec4e8d1c45"),
- contractAccountAtBlock5,
- })
-
- minerAccountAtBlock1, _ = rlp.EncodeToBytes(&types.StateAccount{
- Nonce: 0,
- Balance: big.NewInt(2000002625000000000),
- CodeHash: test_helpers.NullCodeHash.Bytes(),
- Root: test_helpers.EmptyContractRoot,
- })
- minerAccountAtBlock1LeafNode, _ = rlp.EncodeToBytes(&[]interface{}{
- common.Hex2Bytes("3380c7b7ae81a58eb98d9c78de4a1fd7fd9535fc953ed2be602daaa41767312a"),
- minerAccountAtBlock1,
- })
- minerAccountAtBlock2, _ = rlp.EncodeToBytes(&types.StateAccount{
- Nonce: 0,
- Balance: big.NewInt(4000111203461610525),
- CodeHash: test_helpers.NullCodeHash.Bytes(),
- Root: test_helpers.EmptyContractRoot,
- })
- minerAccountAtBlock2LeafNode, _ = rlp.EncodeToBytes(&[]interface{}{
- common.Hex2Bytes("3380c7b7ae81a58eb98d9c78de4a1fd7fd9535fc953ed2be602daaa41767312a"),
- minerAccountAtBlock2,
- })
-
- account1AtBlock1, _ = rlp.EncodeToBytes(&types.StateAccount{
- Nonce: 0,
- Balance: test_helpers.Block1Account1Balance,
- CodeHash: test_helpers.NullCodeHash.Bytes(),
- Root: test_helpers.EmptyContractRoot,
- })
- account1AtBlock1LeafNode, _ = rlp.EncodeToBytes(&[]interface{}{
- common.Hex2Bytes("3926db69aaced518e9b9f0f434a473e7174109c943548bb8f23be41ca76d9ad2"),
- account1AtBlock1,
- })
- account1AtBlock2, _ = rlp.EncodeToBytes(&types.StateAccount{
- Nonce: 2,
- Balance: big.NewInt(999555797000009000),
- CodeHash: test_helpers.NullCodeHash.Bytes(),
- Root: test_helpers.EmptyContractRoot,
- })
- account1AtBlock2LeafNode, _ = rlp.EncodeToBytes(&[]interface{}{
- common.Hex2Bytes("3926db69aaced518e9b9f0f434a473e7174109c943548bb8f23be41ca76d9ad2"),
- account1AtBlock2,
- })
- account1AtBlock5, _ = rlp.EncodeToBytes(&types.StateAccount{
- Nonce: 2,
- Balance: big.NewInt(2999586469962854280),
- CodeHash: test_helpers.NullCodeHash.Bytes(),
- Root: test_helpers.EmptyContractRoot,
- })
- account1AtBlock5LeafNode, _ = rlp.EncodeToBytes(&[]interface{}{
- common.Hex2Bytes("3926db69aaced518e9b9f0f434a473e7174109c943548bb8f23be41ca76d9ad2"),
- account1AtBlock5,
- })
- account1AtBlock6, _ = rlp.EncodeToBytes(&types.StateAccount{
- Nonce: 3,
- Balance: big.NewInt(2999557977962854280),
- CodeHash: test_helpers.NullCodeHash.Bytes(),
- Root: test_helpers.EmptyContractRoot,
- })
- account1AtBlock6LeafNode, _ = rlp.EncodeToBytes(&[]interface{}{
- common.Hex2Bytes("3926db69aaced518e9b9f0f434a473e7174109c943548bb8f23be41ca76d9ad2"),
- account1AtBlock6,
- })
-
- account2AtBlock2, _ = rlp.EncodeToBytes(&types.StateAccount{
- Nonce: 0,
- Balance: big.NewInt(1000),
- CodeHash: test_helpers.NullCodeHash.Bytes(),
- Root: test_helpers.EmptyContractRoot,
- })
- account2AtBlock2LeafNode, _ = rlp.EncodeToBytes(&[]interface{}{
- common.Hex2Bytes("3957f3e2f04a0764c3a0491b175f69926da61efbcc8f61fa1455fd2d2b4cdd45"),
- account2AtBlock2,
- })
- account2AtBlock3, _ = rlp.EncodeToBytes(&types.StateAccount{
- Nonce: 0,
- Balance: big.NewInt(2000013574009435976),
- CodeHash: test_helpers.NullCodeHash.Bytes(),
- Root: test_helpers.EmptyContractRoot,
- })
- account2AtBlock3LeafNode, _ = rlp.EncodeToBytes(&[]interface{}{
- common.Hex2Bytes("3957f3e2f04a0764c3a0491b175f69926da61efbcc8f61fa1455fd2d2b4cdd45"),
- account2AtBlock3,
- })
- account2AtBlock4, _ = rlp.EncodeToBytes(&types.StateAccount{
- Nonce: 0,
- Balance: big.NewInt(4000048088163070348),
- CodeHash: test_helpers.NullCodeHash.Bytes(),
- Root: test_helpers.EmptyContractRoot,
- })
- account2AtBlock4LeafNode, _ = rlp.EncodeToBytes(&[]interface{}{
- common.Hex2Bytes("3957f3e2f04a0764c3a0491b175f69926da61efbcc8f61fa1455fd2d2b4cdd45"),
- account2AtBlock4,
- })
- account2AtBlock6, _ = rlp.EncodeToBytes(&types.StateAccount{
- Nonce: 0,
- Balance: big.NewInt(6000063258066544204),
- CodeHash: test_helpers.NullCodeHash.Bytes(),
- Root: test_helpers.EmptyContractRoot,
- })
- account2AtBlock6LeafNode, _ = rlp.EncodeToBytes(&[]interface{}{
- common.Hex2Bytes("3957f3e2f04a0764c3a0491b175f69926da61efbcc8f61fa1455fd2d2b4cdd45"),
- account2AtBlock6,
- })
-
- bankAccountAtBlock0, _ = rlp.EncodeToBytes(&types.StateAccount{
- Nonce: 0,
- Balance: big.NewInt(test_helpers.TestBankFunds.Int64()),
- CodeHash: test_helpers.NullCodeHash.Bytes(),
- Root: test_helpers.EmptyContractRoot,
- })
- bankAccountAtBlock0LeafNode, _ = rlp.EncodeToBytes(&[]interface{}{
- common.Hex2Bytes("2000bf49f440a1cd0527e4d06e2765654c0f56452257516d793a9b8d604dcfdf2a"),
- bankAccountAtBlock0,
- })
-
- block1BankBalance = big.NewInt(test_helpers.TestBankFunds.Int64() - test_helpers.BalanceChange10000 - test_helpers.GasFees)
- bankAccountAtBlock1, _ = rlp.EncodeToBytes(&types.StateAccount{
- Nonce: 1,
- Balance: block1BankBalance,
- CodeHash: test_helpers.NullCodeHash.Bytes(),
- Root: test_helpers.EmptyContractRoot,
- })
- bankAccountAtBlock1LeafNode, _ = rlp.EncodeToBytes(&[]interface{}{
- common.Hex2Bytes("30bf49f440a1cd0527e4d06e2765654c0f56452257516d793a9b8d604dcfdf2a"),
- bankAccountAtBlock1,
- })
-
- block2BankBalance = block1BankBalance.Int64() - test_helpers.BalanceChange1Ether - test_helpers.GasFees
- bankAccountAtBlock2, _ = rlp.EncodeToBytes(&types.StateAccount{
- Nonce: 2,
- Balance: big.NewInt(block2BankBalance),
- CodeHash: test_helpers.NullCodeHash.Bytes(),
- Root: test_helpers.EmptyContractRoot,
- })
- bankAccountAtBlock2LeafNode, _ = rlp.EncodeToBytes(&[]interface{}{
- common.Hex2Bytes("30bf49f440a1cd0527e4d06e2765654c0f56452257516d793a9b8d604dcfdf2a"),
- bankAccountAtBlock2,
- })
- bankAccountAtBlock3, _ = rlp.EncodeToBytes(&types.StateAccount{
- Nonce: 3,
- Balance: big.NewInt(999914255999990000),
- CodeHash: test_helpers.NullCodeHash.Bytes(),
- Root: test_helpers.EmptyContractRoot,
- })
- bankAccountAtBlock3LeafNode, _ = rlp.EncodeToBytes(&[]interface{}{
- common.Hex2Bytes("30bf49f440a1cd0527e4d06e2765654c0f56452257516d793a9b8d604dcfdf2a"),
- bankAccountAtBlock3,
- })
- bankAccountAtBlock4, _ = rlp.EncodeToBytes(&types.StateAccount{
- Nonce: 6,
- Balance: big.NewInt(999826859999990000),
- CodeHash: test_helpers.NullCodeHash.Bytes(),
- Root: test_helpers.EmptyContractRoot,
- })
- bankAccountAtBlock4LeafNode, _ = rlp.EncodeToBytes(&[]interface{}{
- common.Hex2Bytes("30bf49f440a1cd0527e4d06e2765654c0f56452257516d793a9b8d604dcfdf2a"),
- bankAccountAtBlock4,
- })
- bankAccountAtBlock5, _ = rlp.EncodeToBytes(&types.StateAccount{
- Nonce: 8,
- Balance: big.NewInt(999761283999990000),
- CodeHash: test_helpers.NullCodeHash.Bytes(),
- Root: test_helpers.EmptyContractRoot,
- })
- bankAccountAtBlock5LeafNode, _ = rlp.EncodeToBytes(&[]interface{}{
- common.Hex2Bytes("30bf49f440a1cd0527e4d06e2765654c0f56452257516d793a9b8d604dcfdf2a"),
- bankAccountAtBlock5,
- })
-
- block1BranchRootNode, _ = rlp.EncodeToBytes(&[]interface{}{
- crypto.Keccak256(bankAccountAtBlock1LeafNode),
- []byte{},
- []byte{},
- []byte{},
- []byte{},
- crypto.Keccak256(minerAccountAtBlock1LeafNode),
- []byte{},
- []byte{},
- []byte{},
- []byte{},
- []byte{},
- []byte{},
- []byte{},
- []byte{},
- crypto.Keccak256(account1AtBlock1LeafNode),
- []byte{},
- []byte{},
- })
- block2BranchRootNode, _ = rlp.EncodeToBytes(&[]interface{}{
- crypto.Keccak256(bankAccountAtBlock2LeafNode),
- []byte{},
- []byte{},
- []byte{},
- []byte{},
- crypto.Keccak256(minerAccountAtBlock2LeafNode),
- crypto.Keccak256(contractAccountAtBlock2LeafNode),
- []byte{},
- []byte{},
- []byte{},
- []byte{},
- []byte{},
- crypto.Keccak256(account2AtBlock2LeafNode),
- []byte{},
- crypto.Keccak256(account1AtBlock2LeafNode),
- []byte{},
- []byte{},
- })
- block3BranchRootNode, _ = rlp.EncodeToBytes(&[]interface{}{
- crypto.Keccak256(bankAccountAtBlock3LeafNode),
- []byte{},
- []byte{},
- []byte{},
- []byte{},
- crypto.Keccak256(minerAccountAtBlock2LeafNode),
- crypto.Keccak256(contractAccountAtBlock3LeafNode),
- []byte{},
- []byte{},
- []byte{},
- []byte{},
- []byte{},
- crypto.Keccak256(account2AtBlock3LeafNode),
- []byte{},
- crypto.Keccak256(account1AtBlock2LeafNode),
- []byte{},
- []byte{},
- })
- block4BranchRootNode, _ = rlp.EncodeToBytes(&[]interface{}{
- crypto.Keccak256(bankAccountAtBlock4LeafNode),
- []byte{},
- []byte{},
- []byte{},
- []byte{},
- crypto.Keccak256(minerAccountAtBlock2LeafNode),
- crypto.Keccak256(contractAccountAtBlock4LeafNode),
- []byte{},
- []byte{},
- []byte{},
- []byte{},
- []byte{},
- crypto.Keccak256(account2AtBlock4LeafNode),
- []byte{},
- crypto.Keccak256(account1AtBlock2LeafNode),
- []byte{},
- []byte{},
- })
- block5BranchRootNode, _ = rlp.EncodeToBytes(&[]interface{}{
- crypto.Keccak256(bankAccountAtBlock5LeafNode),
- []byte{},
- []byte{},
- []byte{},
- []byte{},
- crypto.Keccak256(minerAccountAtBlock2LeafNode),
- crypto.Keccak256(contractAccountAtBlock5LeafNode),
- []byte{},
- []byte{},
- []byte{},
- []byte{},
- []byte{},
- crypto.Keccak256(account2AtBlock4LeafNode),
- []byte{},
- crypto.Keccak256(account1AtBlock5LeafNode),
- []byte{},
- []byte{},
- })
- block6BranchRootNode, _ = rlp.EncodeToBytes(&[]interface{}{
- crypto.Keccak256(bankAccountAtBlock5LeafNode),
- []byte{},
- []byte{},
- []byte{},
- []byte{},
- crypto.Keccak256(minerAccountAtBlock2LeafNode),
- []byte{},
- []byte{},
- []byte{},
- []byte{},
- []byte{},
- []byte{},
- crypto.Keccak256(account2AtBlock6LeafNode),
- []byte{},
- crypto.Keccak256(account1AtBlock6LeafNode),
- []byte{},
- []byte{},
- })
-
- block2StorageBranchRootNode, _ = rlp.EncodeToBytes(&[]interface{}{
- []byte{},
- []byte{},
- crypto.Keccak256(slot0StorageLeafNode),
- []byte{},
- []byte{},
- []byte{},
- []byte{},
- []byte{},
- []byte{},
- []byte{},
- []byte{},
- crypto.Keccak256(slot1StorageLeafNode),
- []byte{},
- []byte{},
- []byte{},
- []byte{},
- []byte{},
- })
- block3StorageBranchRootNode, _ = rlp.EncodeToBytes(&[]interface{}{
- []byte{},
- []byte{},
- crypto.Keccak256(slot0StorageLeafNode),
- []byte{},
- []byte{},
- []byte{},
- []byte{},
- []byte{},
- []byte{},
- []byte{},
- []byte{},
- crypto.Keccak256(slot1StorageLeafNode),
- crypto.Keccak256(slot3StorageLeafNode),
- []byte{},
- []byte{},
- []byte{},
- []byte{},
- })
- block4StorageBranchRootNode, _ = rlp.EncodeToBytes(&[]interface{}{
- []byte{},
- []byte{},
- crypto.Keccak256(slot0StorageLeafNode),
- []byte{},
- crypto.Keccak256(slot2StorageLeafNode),
- []byte{},
- []byte{},
- []byte{},
- []byte{},
- []byte{},
- []byte{},
- []byte{},
- []byte{},
- []byte{},
- []byte{},
- []byte{},
- []byte{},
- })
- block5StorageBranchRootNode, _ = rlp.EncodeToBytes(&[]interface{}{
- []byte{},
- []byte{},
- crypto.Keccak256(slot0StorageLeafNode),
- []byte{},
- []byte{},
- []byte{},
- []byte{},
- []byte{},
- []byte{},
- []byte{},
- []byte{},
- []byte{},
- crypto.Keccak256(slot3StorageLeafNode),
- []byte{},
- []byte{},
- []byte{},
- []byte{},
- })
-)
-
-func TestBuilder(t *testing.T) {
- blocks, chain := test_helpers.MakeChain(3, test_helpers.Genesis, test_helpers.TestChainGen)
- contractLeafKey = test_helpers.AddressToLeafKey(test_helpers.ContractAddr)
- defer chain.Stop()
- block0 = test_helpers.Genesis
- block1 = blocks[0]
- block2 = blocks[1]
- block3 = blocks[2]
- params := statediff.Params{}
-
- var tests = []struct {
- name string
- startingArguments statediff.Args
- expected *sdtypes.StateObject
- }{
- {
- "testEmptyDiff",
- statediff.Args{
- OldStateRoot: block0.Root(),
- NewStateRoot: block0.Root(),
- BlockNumber: block0.Number(),
- BlockHash: block0.Hash(),
- },
- &sdtypes.StateObject{
- BlockNumber: block0.Number(),
- BlockHash: block0.Hash(),
- Nodes: emptyDiffs,
- },
- },
- {
- "testBlock0",
- //10000 transferred from testBankAddress to account1Addr
- statediff.Args{
- OldStateRoot: test_helpers.NullHash,
- NewStateRoot: block0.Root(),
- BlockNumber: block0.Number(),
- BlockHash: block0.Hash(),
- },
- &sdtypes.StateObject{
- BlockNumber: block0.Number(),
- BlockHash: block0.Hash(),
- Nodes: []sdtypes.StateNode{
- {
- Path: []byte{},
- NodeType: sdtypes.Leaf,
- LeafKey: test_helpers.BankLeafKey,
- NodeValue: bankAccountAtBlock0LeafNode,
- StorageNodes: emptyStorage,
- },
- },
- },
- },
- {
- "testBlock1",
- //10000 transferred from testBankAddress to account1Addr
- statediff.Args{
- OldStateRoot: block0.Root(),
- NewStateRoot: block1.Root(),
- BlockNumber: block1.Number(),
- BlockHash: block1.Hash(),
- },
- &sdtypes.StateObject{
- BlockNumber: block1.Number(),
- BlockHash: block1.Hash(),
- Nodes: []sdtypes.StateNode{
- {
- Path: []byte{'\x00'},
- NodeType: sdtypes.Leaf,
- LeafKey: test_helpers.BankLeafKey,
- NodeValue: bankAccountAtBlock1LeafNode,
- StorageNodes: emptyStorage,
- },
- {
- Path: []byte{'\x05'},
- NodeType: sdtypes.Leaf,
- LeafKey: minerLeafKey,
- NodeValue: minerAccountAtBlock1LeafNode,
- StorageNodes: emptyStorage,
- },
- {
- Path: []byte{'\x0e'},
- NodeType: sdtypes.Leaf,
- LeafKey: test_helpers.Account1LeafKey,
- NodeValue: account1AtBlock1LeafNode,
- StorageNodes: emptyStorage,
- },
- },
- },
- },
- {
- "testBlock2",
- // 1000 transferred from testBankAddress to account1Addr
- // 1000 transferred from account1Addr to account2Addr
- // account1addr creates a new contract
- statediff.Args{
- OldStateRoot: block1.Root(),
- NewStateRoot: block2.Root(),
- BlockNumber: block2.Number(),
- BlockHash: block2.Hash(),
- },
- &sdtypes.StateObject{
- BlockNumber: block2.Number(),
- BlockHash: block2.Hash(),
- Nodes: []sdtypes.StateNode{
- {
- Path: []byte{'\x00'},
- NodeType: sdtypes.Leaf,
- LeafKey: test_helpers.BankLeafKey,
- NodeValue: bankAccountAtBlock2LeafNode,
- StorageNodes: emptyStorage,
- },
- {
- Path: []byte{'\x05'},
- NodeType: sdtypes.Leaf,
- LeafKey: minerLeafKey,
- NodeValue: minerAccountAtBlock2LeafNode,
- StorageNodes: emptyStorage,
- },
- {
- Path: []byte{'\x0e'},
- NodeType: sdtypes.Leaf,
- LeafKey: test_helpers.Account1LeafKey,
- NodeValue: account1AtBlock2LeafNode,
- StorageNodes: emptyStorage,
- },
- {
- Path: []byte{'\x06'},
- NodeType: sdtypes.Leaf,
- LeafKey: contractLeafKey,
- NodeValue: contractAccountAtBlock2LeafNode,
- StorageNodes: []sdtypes.StorageNode{
- {
- Path: []byte{'\x02'},
- NodeType: sdtypes.Leaf,
- LeafKey: slot0StorageKey.Bytes(),
- NodeValue: slot0StorageLeafNode,
- },
- {
- Path: []byte{'\x0b'},
- NodeType: sdtypes.Leaf,
- LeafKey: slot1StorageKey.Bytes(),
- NodeValue: slot1StorageLeafNode,
- },
- },
- },
- {
- Path: []byte{'\x0c'},
- NodeType: sdtypes.Leaf,
- LeafKey: test_helpers.Account2LeafKey,
- NodeValue: account2AtBlock2LeafNode,
- StorageNodes: emptyStorage,
- },
- },
- CodeAndCodeHashes: []sdtypes.CodeAndCodeHash{
- {
- Hash: test_helpers.CodeHash,
- Code: test_helpers.ByteCodeAfterDeployment,
- },
- },
- },
- },
- {
- "testBlock3",
- //the contract's storage is changed
- //and the block is mined by account 2
- statediff.Args{
- OldStateRoot: block2.Root(),
- NewStateRoot: block3.Root(),
- BlockNumber: block3.Number(),
- BlockHash: block3.Hash(),
- },
- &sdtypes.StateObject{
- BlockNumber: block3.Number(),
- BlockHash: block3.Hash(),
- Nodes: []sdtypes.StateNode{
- {
- Path: []byte{'\x00'},
- NodeType: sdtypes.Leaf,
- LeafKey: test_helpers.BankLeafKey,
- NodeValue: bankAccountAtBlock3LeafNode,
- StorageNodes: emptyStorage,
- },
- {
- Path: []byte{'\x06'},
- NodeType: sdtypes.Leaf,
- LeafKey: contractLeafKey,
- NodeValue: contractAccountAtBlock3LeafNode,
- StorageNodes: []sdtypes.StorageNode{
- {
- Path: []byte{'\x0c'},
- NodeType: sdtypes.Leaf,
- LeafKey: slot3StorageKey.Bytes(),
- NodeValue: slot3StorageLeafNode,
- },
- },
- },
- {
- Path: []byte{'\x0c'},
- NodeType: sdtypes.Leaf,
- LeafKey: test_helpers.Account2LeafKey,
- NodeValue: account2AtBlock3LeafNode,
- StorageNodes: emptyStorage,
- },
- },
- },
- },
- }
-
- for _, workers := range workerCounts {
- builder, _ = pkg.NewBuilder(chain.StateCache(), workers)
- for _, test := range tests {
- diff, err := builder.BuildStateDiffObject(test.startingArguments, params)
- if err != nil {
- t.Error(err)
- }
- receivedStateDiffRlp, err := rlp.EncodeToBytes(&diff)
- if err != nil {
- t.Error(err)
- }
- expectedStateDiffRlp, err := rlp.EncodeToBytes(test.expected)
- if err != nil {
- t.Error(err)
- }
- sort.Slice(receivedStateDiffRlp, func(i, j int) bool { return receivedStateDiffRlp[i] < receivedStateDiffRlp[j] })
- sort.Slice(expectedStateDiffRlp, func(i, j int) bool { return expectedStateDiffRlp[i] < expectedStateDiffRlp[j] })
- if !bytes.Equal(receivedStateDiffRlp, expectedStateDiffRlp) {
- t.Logf("Test failed: %s", test.name)
- t.Errorf("actual state diff: %+v\nexpected state diff: %+v", diff, test.expected)
- }
- }
- }
-}
-
-func TestBuilderWithIntermediateNodes(t *testing.T) {
- blocks, chain := test_helpers.MakeChain(3, test_helpers.Genesis, test_helpers.TestChainGen)
- contractLeafKey = test_helpers.AddressToLeafKey(test_helpers.ContractAddr)
- defer chain.Stop()
- block0 = test_helpers.Genesis
- block1 = blocks[0]
- block2 = blocks[1]
- block3 = blocks[2]
- blocks = append([]*types.Block{block0}, blocks...)
- params := statediff.Params{
- IntermediateStateNodes: true,
- IntermediateStorageNodes: true,
- }
-
- var tests = []struct {
- name string
- startingArguments statediff.Args
- expected *sdtypes.StateObject
- }{
- {
- "testEmptyDiff",
- statediff.Args{
- OldStateRoot: block0.Root(),
- NewStateRoot: block0.Root(),
- BlockNumber: block0.Number(),
- BlockHash: block0.Hash(),
- },
- &sdtypes.StateObject{
- BlockNumber: block0.Number(),
- BlockHash: block0.Hash(),
- Nodes: emptyDiffs,
- },
- },
- {
- "testBlock0",
- //10000 transferred from testBankAddress to account1Addr
- statediff.Args{
- OldStateRoot: test_helpers.NullHash,
- NewStateRoot: block0.Root(),
- BlockNumber: block0.Number(),
- BlockHash: block0.Hash(),
- },
- &sdtypes.StateObject{
- BlockNumber: block0.Number(),
- BlockHash: block0.Hash(),
- Nodes: []sdtypes.StateNode{
- {
- Path: []byte{},
- NodeType: sdtypes.Leaf,
- LeafKey: test_helpers.BankLeafKey,
- NodeValue: bankAccountAtBlock0LeafNode,
- StorageNodes: emptyStorage,
- },
- },
- },
- },
- {
- "testBlock1",
- //10000 transferred from testBankAddress to account1Addr
- statediff.Args{
- OldStateRoot: block0.Root(),
- NewStateRoot: block1.Root(),
- BlockNumber: block1.Number(),
- BlockHash: block1.Hash(),
- },
- &sdtypes.StateObject{
- BlockNumber: block1.Number(),
- BlockHash: block1.Hash(),
- Nodes: []sdtypes.StateNode{
- {
- Path: []byte{},
- NodeType: sdtypes.Branch,
- NodeValue: block1BranchRootNode,
- StorageNodes: emptyStorage,
- },
- {
- Path: []byte{'\x00'},
- NodeType: sdtypes.Leaf,
- LeafKey: test_helpers.BankLeafKey,
- NodeValue: bankAccountAtBlock1LeafNode,
- StorageNodes: emptyStorage,
- },
- {
- Path: []byte{'\x05'},
- NodeType: sdtypes.Leaf,
- LeafKey: minerLeafKey,
- NodeValue: minerAccountAtBlock1LeafNode,
- StorageNodes: emptyStorage,
- },
- {
- Path: []byte{'\x0e'},
- NodeType: sdtypes.Leaf,
- LeafKey: test_helpers.Account1LeafKey,
- NodeValue: account1AtBlock1LeafNode,
- StorageNodes: emptyStorage,
- },
- },
- },
- },
- {
- "testBlock2",
- // 1000 transferred from testBankAddress to account1Addr
- // 1000 transferred from account1Addr to account2Addr
- // account1addr creates a new contract
- statediff.Args{
- OldStateRoot: block1.Root(),
- NewStateRoot: block2.Root(),
- BlockNumber: block2.Number(),
- BlockHash: block2.Hash(),
- },
- &sdtypes.StateObject{
- BlockNumber: block2.Number(),
- BlockHash: block2.Hash(),
- Nodes: []sdtypes.StateNode{
- {
- Path: []byte{},
- NodeType: sdtypes.Branch,
- NodeValue: block2BranchRootNode,
- StorageNodes: emptyStorage,
- },
- {
- Path: []byte{'\x00'},
- NodeType: sdtypes.Leaf,
- LeafKey: test_helpers.BankLeafKey,
- NodeValue: bankAccountAtBlock2LeafNode,
- StorageNodes: emptyStorage,
- },
- {
- Path: []byte{'\x05'},
- NodeType: sdtypes.Leaf,
- LeafKey: minerLeafKey,
- NodeValue: minerAccountAtBlock2LeafNode,
- StorageNodes: emptyStorage,
- },
- {
- Path: []byte{'\x0e'},
- NodeType: sdtypes.Leaf,
- LeafKey: test_helpers.Account1LeafKey,
- NodeValue: account1AtBlock2LeafNode,
- StorageNodes: emptyStorage,
- },
- {
- Path: []byte{'\x06'},
- NodeType: sdtypes.Leaf,
- LeafKey: contractLeafKey,
- NodeValue: contractAccountAtBlock2LeafNode,
- StorageNodes: []sdtypes.StorageNode{
- {
- Path: []byte{},
- NodeType: sdtypes.Branch,
- NodeValue: block2StorageBranchRootNode,
- },
- {
- Path: []byte{'\x02'},
- NodeType: sdtypes.Leaf,
- LeafKey: slot0StorageKey.Bytes(),
- NodeValue: slot0StorageLeafNode,
- },
- {
- Path: []byte{'\x0b'},
- NodeType: sdtypes.Leaf,
- LeafKey: slot1StorageKey.Bytes(),
- NodeValue: slot1StorageLeafNode,
- },
- },
- },
- {
- Path: []byte{'\x0c'},
- NodeType: sdtypes.Leaf,
- LeafKey: test_helpers.Account2LeafKey,
- NodeValue: account2AtBlock2LeafNode,
- StorageNodes: emptyStorage,
- },
- },
- CodeAndCodeHashes: []sdtypes.CodeAndCodeHash{
- {
- Hash: test_helpers.CodeHash,
- Code: test_helpers.ByteCodeAfterDeployment,
- },
- },
- },
- },
- {
- "testBlock3",
- //the contract's storage is changed
- //and the block is mined by account 2
- statediff.Args{
- OldStateRoot: block2.Root(),
- NewStateRoot: block3.Root(),
- BlockNumber: block3.Number(),
- BlockHash: block3.Hash(),
- },
- &sdtypes.StateObject{
- BlockNumber: block3.Number(),
- BlockHash: block3.Hash(),
- Nodes: []sdtypes.StateNode{
- {
- Path: []byte{},
- NodeType: sdtypes.Branch,
- NodeValue: block3BranchRootNode,
- StorageNodes: emptyStorage,
- },
- {
- Path: []byte{'\x00'},
- NodeType: sdtypes.Leaf,
- LeafKey: test_helpers.BankLeafKey,
- NodeValue: bankAccountAtBlock3LeafNode,
- StorageNodes: emptyStorage,
- },
- {
- Path: []byte{'\x06'},
- NodeType: sdtypes.Leaf,
- LeafKey: contractLeafKey,
- NodeValue: contractAccountAtBlock3LeafNode,
- StorageNodes: []sdtypes.StorageNode{
- {
- Path: []byte{},
- NodeType: sdtypes.Branch,
- NodeValue: block3StorageBranchRootNode,
- },
- {
- Path: []byte{'\x0c'},
- NodeType: sdtypes.Leaf,
- LeafKey: slot3StorageKey.Bytes(),
- NodeValue: slot3StorageLeafNode,
- },
- },
- },
- {
- Path: []byte{'\x0c'},
- NodeType: sdtypes.Leaf,
- LeafKey: test_helpers.Account2LeafKey,
- NodeValue: account2AtBlock3LeafNode,
- StorageNodes: emptyStorage,
- },
- },
- },
- },
- }
-
- for _, workers := range workerCounts {
- builder, _ = pkg.NewBuilder(chain.StateCache(), workers)
- for i, test := range tests {
- diff, err := builder.BuildStateDiffObject(test.startingArguments, params)
- if err != nil {
- t.Error(err)
- }
- receivedStateDiffRlp, err := rlp.EncodeToBytes(&diff)
- if err != nil {
- t.Error(err)
- }
- expectedStateDiffRlp, err := rlp.EncodeToBytes(test.expected)
- if err != nil {
- t.Error(err)
- }
- sort.Slice(receivedStateDiffRlp, func(i, j int) bool { return receivedStateDiffRlp[i] < receivedStateDiffRlp[j] })
- sort.Slice(expectedStateDiffRlp, func(i, j int) bool { return expectedStateDiffRlp[i] < expectedStateDiffRlp[j] })
- if !bytes.Equal(receivedStateDiffRlp, expectedStateDiffRlp) {
- t.Logf("Test failed: %s", test.name)
- t.Errorf("actual state diff: %+v\r\n\r\n\r\nexpected state diff: %+v", diff, test.expected)
- }
- // Let's also confirm that our root state nodes form the state root hash in the headers
- if i > 0 {
- block := blocks[i-1]
- expectedStateRoot := block.Root()
- for _, node := range test.expected.Nodes {
- if bytes.Equal(node.Path, []byte{}) {
- stateRoot := crypto.Keccak256Hash(node.NodeValue)
- if !bytes.Equal(expectedStateRoot.Bytes(), stateRoot.Bytes()) {
- t.Logf("Test failed: %s", test.name)
- t.Errorf("actual stateroot: %x\r\nexpected stateroot: %x", stateRoot.Bytes(), expectedStateRoot.Bytes())
- }
- }
- }
- }
- }
- }
-}
-
-func TestBuilderWithWatchedAddressList(t *testing.T) {
- blocks, chain := test_helpers.MakeChain(3, test_helpers.Genesis, test_helpers.TestChainGen)
- contractLeafKey = test_helpers.AddressToLeafKey(test_helpers.ContractAddr)
- defer chain.Stop()
- block0 = test_helpers.Genesis
- block1 = blocks[0]
- block2 = blocks[1]
- block3 = blocks[2]
- params := statediff.Params{
- WatchedAddresses: []common.Address{test_helpers.Account1Addr, test_helpers.ContractAddr},
- }
- params.ComputeWatchedAddressesLeafKeys()
-
- var tests = []struct {
- name string
- startingArguments statediff.Args
- expected *sdtypes.StateObject
- }{
- {
- "testEmptyDiff",
- statediff.Args{
- OldStateRoot: block0.Root(),
- NewStateRoot: block0.Root(),
- BlockNumber: block0.Number(),
- BlockHash: block0.Hash(),
- },
- &sdtypes.StateObject{
- BlockNumber: block0.Number(),
- BlockHash: block0.Hash(),
- Nodes: emptyDiffs,
- },
- },
- {
- "testBlock0",
- //10000 transferred from testBankAddress to account1Addr
- statediff.Args{
- OldStateRoot: test_helpers.NullHash,
- NewStateRoot: block0.Root(),
- BlockNumber: block0.Number(),
- BlockHash: block0.Hash(),
- },
- &sdtypes.StateObject{
- BlockNumber: block0.Number(),
- BlockHash: block0.Hash(),
- Nodes: emptyDiffs,
- },
- },
- {
- "testBlock1",
- //10000 transferred from testBankAddress to account1Addr
- statediff.Args{
- OldStateRoot: block0.Root(),
- NewStateRoot: block1.Root(),
- BlockNumber: block1.Number(),
- BlockHash: block1.Hash(),
- },
- &sdtypes.StateObject{
- BlockNumber: block1.Number(),
- BlockHash: block1.Hash(),
- Nodes: []sdtypes.StateNode{
- {
- Path: []byte{'\x0e'},
- NodeType: sdtypes.Leaf,
- LeafKey: test_helpers.Account1LeafKey,
- NodeValue: account1AtBlock1LeafNode,
- StorageNodes: emptyStorage,
- },
- },
- },
- },
- {
- "testBlock2",
- //1000 transferred from testBankAddress to account1Addr
- //1000 transferred from account1Addr to account2Addr
- statediff.Args{
- OldStateRoot: block1.Root(),
- NewStateRoot: block2.Root(),
- BlockNumber: block2.Number(),
- BlockHash: block2.Hash(),
- },
- &sdtypes.StateObject{
- BlockNumber: block2.Number(),
- BlockHash: block2.Hash(),
- Nodes: []sdtypes.StateNode{
- {
- Path: []byte{'\x06'},
- NodeType: sdtypes.Leaf,
- LeafKey: contractLeafKey,
- NodeValue: contractAccountAtBlock2LeafNode,
- StorageNodes: []sdtypes.StorageNode{
- {
- Path: []byte{'\x02'},
- NodeType: sdtypes.Leaf,
- LeafKey: slot0StorageKey.Bytes(),
- NodeValue: slot0StorageLeafNode,
- },
- {
- Path: []byte{'\x0b'},
- NodeType: sdtypes.Leaf,
- LeafKey: slot1StorageKey.Bytes(),
- NodeValue: slot1StorageLeafNode,
- },
- },
- },
- {
- Path: []byte{'\x0e'},
- NodeType: sdtypes.Leaf,
- LeafKey: test_helpers.Account1LeafKey,
- NodeValue: account1AtBlock2LeafNode,
- StorageNodes: emptyStorage,
- },
- },
- CodeAndCodeHashes: []sdtypes.CodeAndCodeHash{
- {
- Hash: test_helpers.CodeHash,
- Code: test_helpers.ByteCodeAfterDeployment,
- },
- },
- },
- },
- {
- "testBlock3",
- //the contract's storage is changed
- //and the block is mined by account 2
- statediff.Args{
- OldStateRoot: block2.Root(),
- NewStateRoot: block3.Root(),
- BlockNumber: block3.Number(),
- BlockHash: block3.Hash(),
- },
- &sdtypes.StateObject{
- BlockNumber: block3.Number(),
- BlockHash: block3.Hash(),
- Nodes: []sdtypes.StateNode{
- {
- Path: []byte{'\x06'},
- NodeType: sdtypes.Leaf,
- LeafKey: contractLeafKey,
- NodeValue: contractAccountAtBlock3LeafNode,
- StorageNodes: []sdtypes.StorageNode{
- {
- Path: []byte{'\x0c'},
- NodeType: sdtypes.Leaf,
- LeafKey: slot3StorageKey.Bytes(),
- NodeValue: slot3StorageLeafNode,
- },
- },
- },
- },
- },
- },
- }
-
- for _, workers := range workerCounts {
- builder, _ = pkg.NewBuilder(chain.StateCache(), workers)
- for _, test := range tests {
- diff, err := builder.BuildStateDiffObject(test.startingArguments, params)
- if err != nil {
- t.Error(err)
- }
- receivedStateDiffRlp, err := rlp.EncodeToBytes(&diff)
- if err != nil {
- t.Error(err)
- }
- expectedStateDiffRlp, err := rlp.EncodeToBytes(test.expected)
- if err != nil {
- t.Error(err)
- }
- sort.Slice(receivedStateDiffRlp, func(i, j int) bool { return receivedStateDiffRlp[i] < receivedStateDiffRlp[j] })
- sort.Slice(expectedStateDiffRlp, func(i, j int) bool { return expectedStateDiffRlp[i] < expectedStateDiffRlp[j] })
- if !bytes.Equal(receivedStateDiffRlp, expectedStateDiffRlp) {
- t.Logf("Test failed: %s", test.name)
- t.Errorf("actual state diff: %+v\nexpected state diff: %+v", diff, test.expected)
- }
- }
- }
-}
-
-func TestBuilderWithRemovedAccountAndStorage(t *testing.T) {
- blocks, chain := test_helpers.MakeChain(6, test_helpers.Genesis, test_helpers.TestChainGen)
- contractLeafKey = test_helpers.AddressToLeafKey(test_helpers.ContractAddr)
- defer chain.Stop()
- block3 = blocks[2]
- block4 = blocks[3]
- block5 = blocks[4]
- block6 = blocks[5]
- params := statediff.Params{
- IntermediateStateNodes: true,
- IntermediateStorageNodes: true,
- }
-
- var tests = []struct {
- name string
- startingArguments statediff.Args
- expected *sdtypes.StateObject
- }{
- // blocks 0-3 are the same as in TestBuilderWithIntermediateNodes
- {
- "testBlock4",
- statediff.Args{
- OldStateRoot: block3.Root(),
- NewStateRoot: block4.Root(),
- BlockNumber: block4.Number(),
- BlockHash: block4.Hash(),
- },
- &sdtypes.StateObject{
- BlockNumber: block4.Number(),
- BlockHash: block4.Hash(),
- Nodes: []sdtypes.StateNode{
- {
- Path: []byte{},
- NodeType: sdtypes.Branch,
- NodeValue: block4BranchRootNode,
- StorageNodes: emptyStorage,
- },
- {
- Path: []byte{'\x00'},
- NodeType: sdtypes.Leaf,
- LeafKey: test_helpers.BankLeafKey,
- NodeValue: bankAccountAtBlock4LeafNode,
- StorageNodes: emptyStorage,
- },
- {
- Path: []byte{'\x06'},
- NodeType: sdtypes.Leaf,
- LeafKey: contractLeafKey,
- NodeValue: contractAccountAtBlock4LeafNode,
- StorageNodes: []sdtypes.StorageNode{
- {
- Path: []byte{},
- NodeType: sdtypes.Branch,
- NodeValue: block4StorageBranchRootNode,
- },
- {
- Path: []byte{'\x04'},
- NodeType: sdtypes.Leaf,
- LeafKey: slot2StorageKey.Bytes(),
- NodeValue: slot2StorageLeafNode,
- },
- {
- Path: []byte{'\x0b'},
- NodeType: sdtypes.Removed,
- LeafKey: slot1StorageKey.Bytes(),
- NodeValue: []byte{},
- },
- {
- Path: []byte{'\x0c'},
- NodeType: sdtypes.Removed,
- LeafKey: slot3StorageKey.Bytes(),
- NodeValue: []byte{},
- },
- },
- },
- {
- Path: []byte{'\x0c'},
- NodeType: sdtypes.Leaf,
- LeafKey: test_helpers.Account2LeafKey,
- NodeValue: account2AtBlock4LeafNode,
- StorageNodes: emptyStorage,
- },
- },
- },
- },
- {
- "testBlock5",
- statediff.Args{
- OldStateRoot: block4.Root(),
- NewStateRoot: block5.Root(),
- BlockNumber: block5.Number(),
- BlockHash: block5.Hash(),
- },
- &sdtypes.StateObject{
- BlockNumber: block5.Number(),
- BlockHash: block5.Hash(),
- Nodes: []sdtypes.StateNode{
- {
- Path: []byte{},
- NodeType: sdtypes.Branch,
- NodeValue: block5BranchRootNode,
- StorageNodes: emptyStorage,
- },
- {
- Path: []byte{'\x00'},
- NodeType: sdtypes.Leaf,
- LeafKey: test_helpers.BankLeafKey,
- NodeValue: bankAccountAtBlock5LeafNode,
- StorageNodes: emptyStorage,
- },
- {
- Path: []byte{'\x06'},
- NodeType: sdtypes.Leaf,
- LeafKey: contractLeafKey,
- NodeValue: contractAccountAtBlock5LeafNode,
- StorageNodes: []sdtypes.StorageNode{
- {
- Path: []byte{},
- NodeType: sdtypes.Branch,
- NodeValue: block5StorageBranchRootNode,
- },
- {
- Path: []byte{'\x0c'},
- NodeType: sdtypes.Leaf,
- LeafKey: slot3StorageKey.Bytes(),
- NodeValue: slot3StorageLeafNode,
- },
- {
- Path: []byte{'\x04'},
- NodeType: sdtypes.Removed,
- LeafKey: slot2StorageKey.Bytes(),
- NodeValue: []byte{},
- },
- },
- },
- {
- Path: []byte{'\x0e'},
- NodeType: sdtypes.Leaf,
- LeafKey: test_helpers.Account1LeafKey,
- NodeValue: account1AtBlock5LeafNode,
- StorageNodes: emptyStorage,
- },
- },
- },
- },
- {
- "testBlock6",
- statediff.Args{
- OldStateRoot: block5.Root(),
- NewStateRoot: block6.Root(),
- BlockNumber: block6.Number(),
- BlockHash: block6.Hash(),
- },
- &sdtypes.StateObject{
- BlockNumber: block6.Number(),
- BlockHash: block6.Hash(),
- Nodes: []sdtypes.StateNode{
- {
- Path: []byte{},
- NodeType: sdtypes.Branch,
- NodeValue: block6BranchRootNode,
- StorageNodes: emptyStorage,
- },
- {
- Path: []byte{'\x06'},
- NodeType: sdtypes.Removed,
- LeafKey: contractLeafKey,
- NodeValue: []byte{},
- StorageNodes: []sdtypes.StorageNode{
- {
- Path: []byte{},
- NodeType: sdtypes.Removed,
- NodeValue: []byte{},
- },
- {
- Path: []byte{'\x02'},
- NodeType: sdtypes.Removed,
- LeafKey: slot0StorageKey.Bytes(),
- NodeValue: []byte{},
- },
- {
- Path: []byte{'\x0c'},
- NodeType: sdtypes.Removed,
- LeafKey: slot3StorageKey.Bytes(),
- NodeValue: []byte{},
- },
- },
- },
- {
- Path: []byte{'\x0c'},
- NodeType: sdtypes.Leaf,
- LeafKey: test_helpers.Account2LeafKey,
- NodeValue: account2AtBlock6LeafNode,
- StorageNodes: emptyStorage,
- },
- {
- Path: []byte{'\x0e'},
- NodeType: sdtypes.Leaf,
- LeafKey: test_helpers.Account1LeafKey,
- NodeValue: account1AtBlock6LeafNode,
- StorageNodes: emptyStorage,
- },
- },
- },
- },
- }
-
- for _, workers := range workerCounts {
- builder, _ = pkg.NewBuilder(chain.StateCache(), workers)
- for index, test := range tests {
- if index != 1 {
- continue
- }
- diff, err := builder.BuildStateDiffObject(test.startingArguments, params)
- if err != nil {
- t.Error(err)
- }
- receivedStateDiffRlp, err := rlp.EncodeToBytes(&diff)
- if err != nil {
- t.Error(err)
- }
- expectedStateDiffRlp, err := rlp.EncodeToBytes(test.expected)
- if err != nil {
- t.Error(err)
- }
- sort.Slice(receivedStateDiffRlp, func(i, j int) bool { return receivedStateDiffRlp[i] < receivedStateDiffRlp[j] })
- sort.Slice(expectedStateDiffRlp, func(i, j int) bool { return expectedStateDiffRlp[i] < expectedStateDiffRlp[j] })
- if !bytes.Equal(receivedStateDiffRlp, expectedStateDiffRlp) {
- t.Logf("Test failed: %s", test.name)
- t.Errorf("actual state diff: %+v\r\n\r\n\r\nexpected state diff: %+v", diff, test.expected)
- }
- }
- }
-}
-
-func TestBuilderWithRemovedAccountAndStorageWithoutIntermediateNodes(t *testing.T) {
- blocks, chain := test_helpers.MakeChain(6, test_helpers.Genesis, test_helpers.TestChainGen)
- contractLeafKey = test_helpers.AddressToLeafKey(test_helpers.ContractAddr)
- defer chain.Stop()
- block3 = blocks[2]
- block4 = blocks[3]
- block5 = blocks[4]
- block6 = blocks[5]
- params := statediff.Params{
- IntermediateStateNodes: false,
- IntermediateStorageNodes: false,
- }
-
- var tests = []struct {
- name string
- startingArguments statediff.Args
- expected *sdtypes.StateObject
- }{
- // blocks 0-3 are the same as in TestBuilderWithIntermediateNodes
- {
- "testBlock4",
- statediff.Args{
- OldStateRoot: block3.Root(),
- NewStateRoot: block4.Root(),
- BlockNumber: block4.Number(),
- BlockHash: block4.Hash(),
- },
- &sdtypes.StateObject{
- BlockNumber: block4.Number(),
- BlockHash: block4.Hash(),
- Nodes: []sdtypes.StateNode{
- {
- Path: []byte{'\x00'},
- NodeType: sdtypes.Leaf,
- LeafKey: test_helpers.BankLeafKey,
- NodeValue: bankAccountAtBlock4LeafNode,
- StorageNodes: emptyStorage,
- },
- {
- Path: []byte{'\x06'},
- NodeType: sdtypes.Leaf,
- LeafKey: contractLeafKey,
- NodeValue: contractAccountAtBlock4LeafNode,
- StorageNodes: []sdtypes.StorageNode{
- {
- Path: []byte{'\x04'},
- NodeType: sdtypes.Leaf,
- LeafKey: slot2StorageKey.Bytes(),
- NodeValue: slot2StorageLeafNode,
- },
- {
- Path: []byte{'\x0b'},
- NodeType: sdtypes.Removed,
- LeafKey: slot1StorageKey.Bytes(),
- NodeValue: []byte{},
- },
- {
- Path: []byte{'\x0c'},
- NodeType: sdtypes.Removed,
- LeafKey: slot3StorageKey.Bytes(),
- NodeValue: []byte{},
- },
- },
- },
- {
- Path: []byte{'\x0c'},
- NodeType: sdtypes.Leaf,
- LeafKey: test_helpers.Account2LeafKey,
- NodeValue: account2AtBlock4LeafNode,
- StorageNodes: emptyStorage,
- },
- },
- },
- },
- {
- "testBlock5",
- statediff.Args{
- OldStateRoot: block4.Root(),
- NewStateRoot: block5.Root(),
- BlockNumber: block5.Number(),
- BlockHash: block5.Hash(),
- },
- &sdtypes.StateObject{
- BlockNumber: block5.Number(),
- BlockHash: block5.Hash(),
- Nodes: []sdtypes.StateNode{
- {
- Path: []byte{'\x00'},
- NodeType: sdtypes.Leaf,
- LeafKey: test_helpers.BankLeafKey,
- NodeValue: bankAccountAtBlock5LeafNode,
- StorageNodes: emptyStorage,
- },
- {
- Path: []byte{'\x06'},
- NodeType: sdtypes.Leaf,
- LeafKey: contractLeafKey,
- NodeValue: contractAccountAtBlock5LeafNode,
- StorageNodes: []sdtypes.StorageNode{
- {
- Path: []byte{'\x0c'},
- NodeType: sdtypes.Leaf,
- LeafKey: slot3StorageKey.Bytes(),
- NodeValue: slot3StorageLeafNode,
- },
- {
- Path: []byte{'\x04'},
- NodeType: sdtypes.Removed,
- LeafKey: slot2StorageKey.Bytes(),
- NodeValue: []byte{},
- },
- },
- },
- {
- Path: []byte{'\x0e'},
- NodeType: sdtypes.Leaf,
- LeafKey: test_helpers.Account1LeafKey,
- NodeValue: account1AtBlock5LeafNode,
- StorageNodes: emptyStorage,
- },
- },
- },
- },
- {
- "testBlock6",
- statediff.Args{
- OldStateRoot: block5.Root(),
- NewStateRoot: block6.Root(),
- BlockNumber: block6.Number(),
- BlockHash: block6.Hash(),
- },
- &sdtypes.StateObject{
- BlockNumber: block6.Number(),
- BlockHash: block6.Hash(),
- Nodes: []sdtypes.StateNode{
- {
- Path: []byte{'\x06'},
- NodeType: sdtypes.Removed,
- LeafKey: contractLeafKey,
- NodeValue: []byte{},
- StorageNodes: []sdtypes.StorageNode{
- {
- Path: []byte{'\x02'},
- NodeType: sdtypes.Removed,
- LeafKey: slot0StorageKey.Bytes(),
- NodeValue: []byte{},
- },
- {
- Path: []byte{'\x0c'},
- NodeType: sdtypes.Removed,
- LeafKey: slot3StorageKey.Bytes(),
- NodeValue: []byte{},
- },
- },
- },
- {
- Path: []byte{'\x0c'},
- NodeType: sdtypes.Leaf,
- LeafKey: test_helpers.Account2LeafKey,
- NodeValue: account2AtBlock6LeafNode,
- StorageNodes: emptyStorage,
- },
- {
- Path: []byte{'\x0e'},
- NodeType: sdtypes.Leaf,
- LeafKey: test_helpers.Account1LeafKey,
- NodeValue: account1AtBlock6LeafNode,
- StorageNodes: emptyStorage,
- },
- },
- },
- },
- }
-
- for _, workers := range workerCounts {
- builder, _ = pkg.NewBuilder(chain.StateCache(), workers)
- for _, test := range tests {
- diff, err := builder.BuildStateDiffObject(test.startingArguments, params)
- if err != nil {
- t.Error(err)
- }
- receivedStateDiffRlp, err := rlp.EncodeToBytes(&diff)
- if err != nil {
- t.Error(err)
- }
- expectedStateDiffRlp, err := rlp.EncodeToBytes(test.expected)
- if err != nil {
- t.Error(err)
- }
- sort.Slice(receivedStateDiffRlp, func(i, j int) bool { return receivedStateDiffRlp[i] < receivedStateDiffRlp[j] })
- sort.Slice(expectedStateDiffRlp, func(i, j int) bool { return expectedStateDiffRlp[i] < expectedStateDiffRlp[j] })
- if !bytes.Equal(receivedStateDiffRlp, expectedStateDiffRlp) {
- t.Logf("Test failed: %s", test.name)
- t.Errorf("actual state diff: %+v\r\n\r\n\r\nexpected state diff: %+v", diff, test.expected)
- }
- }
- }
-}
-
-func TestBuilderWithRemovedNonWatchedAccount(t *testing.T) {
- blocks, chain := test_helpers.MakeChain(6, test_helpers.Genesis, test_helpers.TestChainGen)
- contractLeafKey = test_helpers.AddressToLeafKey(test_helpers.ContractAddr)
- defer chain.Stop()
- block3 = blocks[2]
- block4 = blocks[3]
- block5 = blocks[4]
- block6 = blocks[5]
- params := statediff.Params{
- WatchedAddresses: []common.Address{test_helpers.Account1Addr, test_helpers.Account2Addr},
- }
- params.ComputeWatchedAddressesLeafKeys()
-
- var tests = []struct {
- name string
- startingArguments statediff.Args
- expected *sdtypes.StateObject
- }{
- {
- "testBlock4",
- statediff.Args{
- OldStateRoot: block3.Root(),
- NewStateRoot: block4.Root(),
- BlockNumber: block4.Number(),
- BlockHash: block4.Hash(),
- },
- &sdtypes.StateObject{
- BlockNumber: block4.Number(),
- BlockHash: block4.Hash(),
- Nodes: []sdtypes.StateNode{
- {
- Path: []byte{'\x0c'},
- NodeType: sdtypes.Leaf,
- LeafKey: test_helpers.Account2LeafKey,
- NodeValue: account2AtBlock4LeafNode,
- StorageNodes: emptyStorage,
- },
- },
- },
- },
- {
- "testBlock5",
- statediff.Args{
- OldStateRoot: block4.Root(),
- NewStateRoot: block5.Root(),
- BlockNumber: block5.Number(),
- BlockHash: block5.Hash(),
- },
- &sdtypes.StateObject{
- BlockNumber: block5.Number(),
- BlockHash: block5.Hash(),
- Nodes: []sdtypes.StateNode{
- {
- Path: []byte{'\x0e'},
- NodeType: sdtypes.Leaf,
- LeafKey: test_helpers.Account1LeafKey,
- NodeValue: account1AtBlock5LeafNode,
- StorageNodes: emptyStorage,
- },
- },
- },
- },
- {
- "testBlock6",
- statediff.Args{
- OldStateRoot: block5.Root(),
- NewStateRoot: block6.Root(),
- BlockNumber: block6.Number(),
- BlockHash: block6.Hash(),
- },
- &sdtypes.StateObject{
- BlockNumber: block6.Number(),
- BlockHash: block6.Hash(),
- Nodes: []sdtypes.StateNode{
- {
- Path: []byte{'\x0c'},
- NodeType: sdtypes.Leaf,
- LeafKey: test_helpers.Account2LeafKey,
- NodeValue: account2AtBlock6LeafNode,
- StorageNodes: emptyStorage,
- },
- {
- Path: []byte{'\x0e'},
- NodeType: sdtypes.Leaf,
- LeafKey: test_helpers.Account1LeafKey,
- NodeValue: account1AtBlock6LeafNode,
- StorageNodes: emptyStorage,
- },
- },
- },
- },
- }
-
- for _, workers := range workerCounts {
- builder, _ = pkg.NewBuilder(chain.StateCache(), workers)
- for _, test := range tests {
- diff, err := builder.BuildStateDiffObject(test.startingArguments, params)
- if err != nil {
- t.Error(err)
- }
- receivedStateDiffRlp, err := rlp.EncodeToBytes(&diff)
- if err != nil {
- t.Error(err)
- }
- expectedStateDiffRlp, err := rlp.EncodeToBytes(test.expected)
- if err != nil {
- t.Error(err)
- }
- sort.Slice(receivedStateDiffRlp, func(i, j int) bool { return receivedStateDiffRlp[i] < receivedStateDiffRlp[j] })
- sort.Slice(expectedStateDiffRlp, func(i, j int) bool { return expectedStateDiffRlp[i] < expectedStateDiffRlp[j] })
- if !bytes.Equal(receivedStateDiffRlp, expectedStateDiffRlp) {
- t.Logf("Test failed: %s", test.name)
- t.Errorf("actual state diff: %+v\r\n\r\n\r\nexpected state diff: %+v", diff, test.expected)
- }
- }
- }
-}
-
-func TestBuilderWithRemovedWatchedAccount(t *testing.T) {
- blocks, chain := test_helpers.MakeChain(6, test_helpers.Genesis, test_helpers.TestChainGen)
- contractLeafKey = test_helpers.AddressToLeafKey(test_helpers.ContractAddr)
- defer chain.Stop()
- block3 = blocks[2]
- block4 = blocks[3]
- block5 = blocks[4]
- block6 = blocks[5]
- params := statediff.Params{
- WatchedAddresses: []common.Address{test_helpers.Account1Addr, test_helpers.ContractAddr},
- }
- params.ComputeWatchedAddressesLeafKeys()
-
- var tests = []struct {
- name string
- startingArguments statediff.Args
- expected *sdtypes.StateObject
- }{
- {
- "testBlock4",
- statediff.Args{
- OldStateRoot: block3.Root(),
- NewStateRoot: block4.Root(),
- BlockNumber: block4.Number(),
- BlockHash: block4.Hash(),
- },
- &sdtypes.StateObject{
- BlockNumber: block4.Number(),
- BlockHash: block4.Hash(),
- Nodes: []sdtypes.StateNode{
- {
- Path: []byte{'\x06'},
- NodeType: sdtypes.Leaf,
- LeafKey: contractLeafKey,
- NodeValue: contractAccountAtBlock4LeafNode,
- StorageNodes: []sdtypes.StorageNode{
- {
- Path: []byte{'\x04'},
- NodeType: sdtypes.Leaf,
- LeafKey: slot2StorageKey.Bytes(),
- NodeValue: slot2StorageLeafNode,
- },
- {
- Path: []byte{'\x0b'},
- NodeType: sdtypes.Removed,
- LeafKey: slot1StorageKey.Bytes(),
- NodeValue: []byte{},
- },
- {
- Path: []byte{'\x0c'},
- NodeType: sdtypes.Removed,
- LeafKey: slot3StorageKey.Bytes(),
- NodeValue: []byte{},
- },
- },
- },
- },
- },
- },
- {
- "testBlock5",
- statediff.Args{
- OldStateRoot: block4.Root(),
- NewStateRoot: block5.Root(),
- BlockNumber: block5.Number(),
- BlockHash: block5.Hash(),
- },
- &sdtypes.StateObject{
- BlockNumber: block5.Number(),
- BlockHash: block5.Hash(),
- Nodes: []sdtypes.StateNode{
- {
- Path: []byte{'\x06'},
- NodeType: sdtypes.Leaf,
- LeafKey: contractLeafKey,
- NodeValue: contractAccountAtBlock5LeafNode,
- StorageNodes: []sdtypes.StorageNode{
- {
- Path: []byte{'\x0c'},
- NodeType: sdtypes.Leaf,
- LeafKey: slot3StorageKey.Bytes(),
- NodeValue: slot3StorageLeafNode,
- },
- {
- Path: []byte{'\x04'},
- NodeType: sdtypes.Removed,
- LeafKey: slot2StorageKey.Bytes(),
- NodeValue: []byte{},
- },
- },
- },
- {
- Path: []byte{'\x0e'},
- NodeType: sdtypes.Leaf,
- LeafKey: test_helpers.Account1LeafKey,
- NodeValue: account1AtBlock5LeafNode,
- StorageNodes: emptyStorage,
- },
- },
- },
- },
- {
- "testBlock6",
- statediff.Args{
- OldStateRoot: block5.Root(),
- NewStateRoot: block6.Root(),
- BlockNumber: block6.Number(),
- BlockHash: block6.Hash(),
- },
- &sdtypes.StateObject{
- BlockNumber: block6.Number(),
- BlockHash: block6.Hash(),
- Nodes: []sdtypes.StateNode{
- {
- Path: []byte{'\x06'},
- NodeType: sdtypes.Removed,
- LeafKey: contractLeafKey,
- NodeValue: []byte{},
- StorageNodes: []sdtypes.StorageNode{
- {
- Path: []byte{'\x02'},
- NodeType: sdtypes.Removed,
- LeafKey: slot0StorageKey.Bytes(),
- NodeValue: []byte{},
- },
- {
- Path: []byte{'\x0c'},
- NodeType: sdtypes.Removed,
- LeafKey: slot3StorageKey.Bytes(),
- NodeValue: []byte{},
- },
- },
- },
- {
- Path: []byte{'\x0e'},
- NodeType: sdtypes.Leaf,
- LeafKey: test_helpers.Account1LeafKey,
- NodeValue: account1AtBlock6LeafNode,
- StorageNodes: emptyStorage,
- },
- },
- },
- },
- }
-
- for _, workers := range workerCounts {
- builder, _ = pkg.NewBuilder(chain.StateCache(), workers)
- for _, test := range tests {
- diff, err := builder.BuildStateDiffObject(test.startingArguments, params)
- if err != nil {
- t.Error(err)
- }
- receivedStateDiffRlp, err := rlp.EncodeToBytes(&diff)
- if err != nil {
- t.Error(err)
- }
- expectedStateDiffRlp, err := rlp.EncodeToBytes(test.expected)
- if err != nil {
- t.Error(err)
- }
- sort.Slice(receivedStateDiffRlp, func(i, j int) bool { return receivedStateDiffRlp[i] < receivedStateDiffRlp[j] })
- sort.Slice(expectedStateDiffRlp, func(i, j int) bool { return expectedStateDiffRlp[i] < expectedStateDiffRlp[j] })
- if !bytes.Equal(receivedStateDiffRlp, expectedStateDiffRlp) {
- t.Logf("Test failed: %s", test.name)
- t.Errorf("actual state diff: %+v\r\n\r\n\r\nexpected state diff: %+v", diff, test.expected)
- }
- }
- }
-}
-
-var (
- slot00StorageValue = common.Hex2Bytes("9471562b71999873db5b286df957af199ec94617f7") // prefixed TestBankAddress
-
- slot00StorageLeafNode, _ = rlp.EncodeToBytes(&[]interface{}{
- common.Hex2Bytes("390decd9548b62a8d60345a988386fc84ba6bc95484008f6362f93160ef3e563"),
- slot00StorageValue,
- })
-
- contractAccountAtBlock01, _ = rlp.EncodeToBytes(&types.StateAccount{
- Nonce: 1,
- Balance: big.NewInt(0),
- CodeHash: common.HexToHash("0xaaea5efba4fd7b45d7ec03918ac5d8b31aa93b48986af0e6b591f0f087c80127").Bytes(),
- Root: crypto.Keccak256Hash(block01StorageBranchRootNode),
- })
- contractAccountAtBlock01LeafNode, _ = rlp.EncodeToBytes(&[]interface{}{
- common.Hex2Bytes("3cb2583748c26e89ef19c2a8529b05a270f735553b4d44b6f2a1894987a71c8b"),
- contractAccountAtBlock01,
- })
-
- bankAccountAtBlock01, _ = rlp.EncodeToBytes(&types.StateAccount{
- Nonce: 1,
- Balance: big.NewInt(3999629697375000000),
- CodeHash: test_helpers.NullCodeHash.Bytes(),
- Root: test_helpers.EmptyContractRoot,
- })
- bankAccountAtBlock01LeafNode, _ = rlp.EncodeToBytes(&[]interface{}{
- common.Hex2Bytes("30bf49f440a1cd0527e4d06e2765654c0f56452257516d793a9b8d604dcfdf2a"),
- bankAccountAtBlock01,
- })
- bankAccountAtBlock02, _ = rlp.EncodeToBytes(&types.StateAccount{
- Nonce: 2,
- Balance: big.NewInt(5999607323457344852),
- CodeHash: test_helpers.NullCodeHash.Bytes(),
- Root: test_helpers.EmptyContractRoot,
- })
- bankAccountAtBlock02LeafNode, _ = rlp.EncodeToBytes(&[]interface{}{
- common.Hex2Bytes("2000bf49f440a1cd0527e4d06e2765654c0f56452257516d793a9b8d604dcfdf2a"),
- bankAccountAtBlock02,
- })
-
- block01BranchRootNode, _ = rlp.EncodeToBytes(&[]interface{}{
- crypto.Keccak256Hash(bankAccountAtBlock01LeafNode),
- crypto.Keccak256Hash(contractAccountAtBlock01LeafNode),
- []byte{},
- []byte{},
- []byte{},
- []byte{},
- []byte{},
- []byte{},
- []byte{},
- []byte{},
- []byte{},
- []byte{},
- []byte{},
- []byte{},
- []byte{},
- []byte{},
- []byte{},
- })
-
- block01StorageBranchRootNode, _ = rlp.EncodeToBytes(&[]interface{}{
- []byte{},
- []byte{},
- crypto.Keccak256(slot00StorageLeafNode),
- []byte{},
- []byte{},
- []byte{},
- []byte{},
- []byte{},
- []byte{},
- []byte{},
- []byte{},
- crypto.Keccak256(slot1StorageLeafNode),
- []byte{},
- []byte{},
- []byte{},
- []byte{},
- []byte{},
- })
-)
-
-func TestBuilderWithMovedAccount(t *testing.T) {
- blocks, chain := test_helpers.MakeChain(2, test_helpers.Genesis, test_helpers.TestSelfDestructChainGen)
- contractLeafKey = test_helpers.AddressToLeafKey(test_helpers.ContractAddr)
- defer chain.Stop()
- block0 = test_helpers.Genesis
- block1 = blocks[0]
- block2 = blocks[1]
- params := statediff.Params{
- IntermediateStateNodes: true,
- IntermediateStorageNodes: true,
- }
-
- var tests = []struct {
- name string
- startingArguments statediff.Args
- expected *sdtypes.StateObject
- }{
- {
- "testBlock1",
- statediff.Args{
- OldStateRoot: block0.Root(),
- NewStateRoot: block1.Root(),
- BlockNumber: block1.Number(),
- BlockHash: block1.Hash(),
- },
- &sdtypes.StateObject{
- BlockNumber: block1.Number(),
- BlockHash: block1.Hash(),
- Nodes: []sdtypes.StateNode{
- {
- Path: []byte{},
- NodeType: sdtypes.Branch,
- NodeValue: block01BranchRootNode,
- StorageNodes: emptyStorage,
- },
- {
- Path: []byte{'\x00'},
- NodeType: sdtypes.Leaf,
- LeafKey: test_helpers.BankLeafKey,
- NodeValue: bankAccountAtBlock01LeafNode,
- StorageNodes: emptyStorage,
- },
- {
- Path: []byte{'\x01'},
- NodeType: sdtypes.Leaf,
- LeafKey: contractLeafKey,
- NodeValue: contractAccountAtBlock01LeafNode,
- StorageNodes: []sdtypes.StorageNode{
- {
- Path: []byte{},
- NodeType: sdtypes.Branch,
- NodeValue: block01StorageBranchRootNode,
- },
- {
- Path: []byte{'\x02'},
- NodeType: sdtypes.Leaf,
- LeafKey: slot0StorageKey.Bytes(),
- NodeValue: slot00StorageLeafNode,
- },
- {
- Path: []byte{'\x0b'},
- NodeType: sdtypes.Leaf,
- LeafKey: slot1StorageKey.Bytes(),
- NodeValue: slot1StorageLeafNode,
- },
- },
- },
- },
- CodeAndCodeHashes: []sdtypes.CodeAndCodeHash{
- {
- Hash: test_helpers.CodeHash,
- Code: test_helpers.ByteCodeAfterDeployment,
- },
- },
- },
- },
- {
- "testBlock2",
- statediff.Args{
- OldStateRoot: block1.Root(),
- NewStateRoot: block2.Root(),
- BlockNumber: block2.Number(),
- BlockHash: block2.Hash(),
- },
- &sdtypes.StateObject{
- BlockNumber: block2.Number(),
- BlockHash: block2.Hash(),
- Nodes: []sdtypes.StateNode{
- {
- Path: []byte{},
- NodeType: sdtypes.Leaf,
- LeafKey: test_helpers.BankLeafKey,
- NodeValue: bankAccountAtBlock02LeafNode,
- StorageNodes: emptyStorage,
- },
- {
- Path: []byte{'\x01'},
- NodeType: sdtypes.Removed,
- LeafKey: contractLeafKey,
- NodeValue: []byte{},
- StorageNodes: []sdtypes.StorageNode{
- {
- Path: []byte{},
- NodeType: sdtypes.Removed,
- },
- {
- Path: []byte{'\x02'},
- NodeType: sdtypes.Removed,
- LeafKey: slot0StorageKey.Bytes(),
- },
- {
- Path: []byte{'\x0b'},
- NodeType: sdtypes.Removed,
- LeafKey: slot1StorageKey.Bytes(),
- },
- },
- },
- {
- Path: []byte{'\x00'},
- NodeType: sdtypes.Removed,
- NodeValue: []byte{},
- },
- },
- },
- },
- }
-
- for _, workers := range workerCounts {
- builder, _ = pkg.NewBuilder(chain.StateCache(), workers)
- for _, test := range tests {
- diff, err := builder.BuildStateDiffObject(test.startingArguments, params)
- if err != nil {
- t.Error(err)
- }
- receivedStateDiffRlp, err := rlp.EncodeToBytes(&diff)
- if err != nil {
- t.Error(err)
- }
- expectedStateDiffRlp, err := rlp.EncodeToBytes(test.expected)
- if err != nil {
- t.Error(err)
- }
- sort.Slice(receivedStateDiffRlp, func(i, j int) bool { return receivedStateDiffRlp[i] < receivedStateDiffRlp[j] })
- sort.Slice(expectedStateDiffRlp, func(i, j int) bool { return expectedStateDiffRlp[i] < expectedStateDiffRlp[j] })
- if !bytes.Equal(receivedStateDiffRlp, expectedStateDiffRlp) {
- t.Logf("Test failed: %s", test.name)
- t.Errorf("actual state diff: %+v\r\n\r\n\r\nexpected state diff: %+v", diff, test.expected)
- }
- }
- }
-}
-
-func TestBuilderWithMovedAccountOnlyLeafs(t *testing.T) {
- blocks, chain := test_helpers.MakeChain(2, test_helpers.Genesis, test_helpers.TestSelfDestructChainGen)
- contractLeafKey = test_helpers.AddressToLeafKey(test_helpers.ContractAddr)
- defer chain.Stop()
- block0 = test_helpers.Genesis
- block1 = blocks[0]
- block2 = blocks[1]
- params := statediff.Params{
- IntermediateStateNodes: false,
- IntermediateStorageNodes: false,
- }
-
- var tests = []struct {
- name string
- startingArguments statediff.Args
- expected *sdtypes.StateObject
- }{
- {
- "testBlock1",
- statediff.Args{
- OldStateRoot: block0.Root(),
- NewStateRoot: block1.Root(),
- BlockNumber: block1.Number(),
- BlockHash: block1.Hash(),
- },
- &sdtypes.StateObject{
- BlockNumber: block1.Number(),
- BlockHash: block1.Hash(),
- Nodes: []sdtypes.StateNode{
- {
- Path: []byte{'\x00'},
- NodeType: sdtypes.Leaf,
- LeafKey: test_helpers.BankLeafKey,
- NodeValue: bankAccountAtBlock01LeafNode,
- StorageNodes: emptyStorage,
- },
- {
- Path: []byte{'\x01'},
- NodeType: sdtypes.Leaf,
- LeafKey: contractLeafKey,
- NodeValue: contractAccountAtBlock01LeafNode,
- StorageNodes: []sdtypes.StorageNode{
- {
- Path: []byte{'\x02'},
- NodeType: sdtypes.Leaf,
- LeafKey: slot0StorageKey.Bytes(),
- NodeValue: slot00StorageLeafNode,
- },
- {
- Path: []byte{'\x0b'},
- NodeType: sdtypes.Leaf,
- LeafKey: slot1StorageKey.Bytes(),
- NodeValue: slot1StorageLeafNode,
- },
- },
- },
- },
- CodeAndCodeHashes: []sdtypes.CodeAndCodeHash{
- {
- Hash: test_helpers.CodeHash,
- Code: test_helpers.ByteCodeAfterDeployment,
- },
- },
- },
- },
- {
- "testBlock2",
- statediff.Args{
- OldStateRoot: block1.Root(),
- NewStateRoot: block2.Root(),
- BlockNumber: block2.Number(),
- BlockHash: block2.Hash(),
- },
- &sdtypes.StateObject{
- BlockNumber: block2.Number(),
- BlockHash: block2.Hash(),
- Nodes: []sdtypes.StateNode{
- {
- Path: []byte{},
- NodeType: sdtypes.Leaf,
- LeafKey: test_helpers.BankLeafKey,
- NodeValue: bankAccountAtBlock02LeafNode,
- StorageNodes: emptyStorage,
- },
- {
- Path: []byte{'\x01'},
- NodeType: sdtypes.Removed,
- LeafKey: contractLeafKey,
- NodeValue: []byte{},
- StorageNodes: []sdtypes.StorageNode{
- {
- Path: []byte{'\x02'},
- NodeType: sdtypes.Removed,
- LeafKey: slot0StorageKey.Bytes(),
- },
- {
- Path: []byte{'\x0b'},
- NodeType: sdtypes.Removed,
- LeafKey: slot1StorageKey.Bytes(),
- },
- },
- },
- {
- Path: []byte{'\x00'},
- NodeType: sdtypes.Removed,
- NodeValue: []byte{},
- },
- },
- },
- },
- }
-
- for _, workers := range workerCounts {
- builder, _ = pkg.NewBuilder(chain.StateCache(), workers)
- for _, test := range tests {
- diff, err := builder.BuildStateDiffObject(test.startingArguments, params)
- if err != nil {
- t.Error(err)
- }
- receivedStateDiffRlp, err := rlp.EncodeToBytes(&diff)
- if err != nil {
- t.Error(err)
- }
- expectedStateDiffRlp, err := rlp.EncodeToBytes(test.expected)
- if err != nil {
- t.Error(err)
- }
- sort.Slice(receivedStateDiffRlp, func(i, j int) bool { return receivedStateDiffRlp[i] < receivedStateDiffRlp[j] })
- sort.Slice(expectedStateDiffRlp, func(i, j int) bool { return expectedStateDiffRlp[i] < expectedStateDiffRlp[j] })
- if !bytes.Equal(receivedStateDiffRlp, expectedStateDiffRlp) {
- t.Logf("Test failed: %s", test.name)
- t.Errorf("actual state diff: %+v\r\n\r\n\r\nexpected state diff: %+v", diff, test.expected)
- }
- }
- }
-}
-
-func TestBuildStateTrie(t *testing.T) {
- blocks, chain := test_helpers.MakeChain(3, test_helpers.Genesis, test_helpers.TestChainGen)
- contractLeafKey = test_helpers.AddressToLeafKey(test_helpers.ContractAddr)
- defer chain.Stop()
- block1 = blocks[0]
- block2 = blocks[1]
- block3 = blocks[2]
-
- var tests = []struct {
- name string
- block *types.Block
- expected *sdtypes.StateObject
- }{
- {
- "testBlock1",
- block1,
- &sdtypes.StateObject{
- BlockNumber: block1.Number(),
- BlockHash: block1.Hash(),
- Nodes: []sdtypes.StateNode{
- {
- Path: []byte{},
- NodeType: sdtypes.Branch,
- NodeValue: block1BranchRootNode,
- StorageNodes: emptyStorage,
- },
- {
- Path: []byte{'\x00'},
- NodeType: sdtypes.Leaf,
- LeafKey: test_helpers.BankLeafKey,
- NodeValue: bankAccountAtBlock1LeafNode,
- StorageNodes: emptyStorage,
- },
- {
- Path: []byte{'\x05'},
- NodeType: sdtypes.Leaf,
- LeafKey: minerLeafKey,
- NodeValue: minerAccountAtBlock1LeafNode,
- StorageNodes: emptyStorage,
- },
- {
- Path: []byte{'\x0e'},
- NodeType: sdtypes.Leaf,
- LeafKey: test_helpers.Account1LeafKey,
- NodeValue: account1AtBlock1LeafNode,
- StorageNodes: emptyStorage,
- },
- },
- },
- },
- {
- "testBlock2",
- block2,
- &sdtypes.StateObject{
- BlockNumber: block2.Number(),
- BlockHash: block2.Hash(),
- Nodes: []sdtypes.StateNode{
- {
- Path: []byte{},
- NodeType: sdtypes.Branch,
- NodeValue: block2BranchRootNode,
- StorageNodes: emptyStorage,
- },
- {
- Path: []byte{'\x00'},
- NodeType: sdtypes.Leaf,
- LeafKey: test_helpers.BankLeafKey,
- NodeValue: bankAccountAtBlock2LeafNode,
- StorageNodes: emptyStorage,
- },
- {
- Path: []byte{'\x05'},
- NodeType: sdtypes.Leaf,
- LeafKey: minerLeafKey,
- NodeValue: minerAccountAtBlock2LeafNode,
- StorageNodes: emptyStorage,
- },
- {
- Path: []byte{'\x0e'},
- NodeType: sdtypes.Leaf,
- LeafKey: test_helpers.Account1LeafKey,
- NodeValue: account1AtBlock2LeafNode,
- StorageNodes: emptyStorage,
- },
- {
- Path: []byte{'\x06'},
- NodeType: sdtypes.Leaf,
- LeafKey: contractLeafKey,
- NodeValue: contractAccountAtBlock2LeafNode,
- StorageNodes: []sdtypes.StorageNode{
- {
- Path: []byte{},
- NodeType: sdtypes.Branch,
- NodeValue: block2StorageBranchRootNode,
- },
- {
- Path: []byte{'\x02'},
- NodeType: sdtypes.Leaf,
- LeafKey: slot0StorageKey.Bytes(),
- NodeValue: slot0StorageLeafNode,
- },
- {
- Path: []byte{'\x0b'},
- NodeType: sdtypes.Leaf,
- LeafKey: slot1StorageKey.Bytes(),
- NodeValue: slot1StorageLeafNode,
- },
- },
- },
- {
- Path: []byte{'\x0c'},
- NodeType: sdtypes.Leaf,
- LeafKey: test_helpers.Account2LeafKey,
- NodeValue: account2AtBlock2LeafNode,
- StorageNodes: emptyStorage,
- },
- },
- CodeAndCodeHashes: []sdtypes.CodeAndCodeHash{
- {
- Hash: test_helpers.CodeHash,
- Code: test_helpers.ByteCodeAfterDeployment,
- },
- },
- },
- },
- {
- "testBlock3",
- block3,
- &sdtypes.StateObject{
- BlockNumber: block3.Number(),
- BlockHash: block3.Hash(),
- Nodes: []sdtypes.StateNode{
- {
- Path: []byte{},
- NodeType: sdtypes.Branch,
- NodeValue: block3BranchRootNode,
- StorageNodes: emptyStorage,
- },
- {
- Path: []byte{'\x00'},
- NodeType: sdtypes.Leaf,
- LeafKey: test_helpers.BankLeafKey,
- NodeValue: bankAccountAtBlock3LeafNode,
- StorageNodes: emptyStorage,
- },
- {
- Path: []byte{'\x05'},
- NodeType: sdtypes.Leaf,
- LeafKey: minerLeafKey,
- NodeValue: minerAccountAtBlock2LeafNode,
- StorageNodes: emptyStorage,
- },
- {
- Path: []byte{'\x0e'},
- NodeType: sdtypes.Leaf,
- LeafKey: test_helpers.Account1LeafKey,
- NodeValue: account1AtBlock2LeafNode,
- StorageNodes: emptyStorage,
- },
- {
- Path: []byte{'\x06'},
- NodeType: sdtypes.Leaf,
- LeafKey: contractLeafKey,
- NodeValue: contractAccountAtBlock3LeafNode,
- StorageNodes: []sdtypes.StorageNode{
- {
- Path: []byte{},
- NodeType: sdtypes.Branch,
- NodeValue: block3StorageBranchRootNode,
- },
- {
- Path: []byte{'\x02'},
- NodeType: sdtypes.Leaf,
- LeafKey: slot0StorageKey.Bytes(),
- NodeValue: slot0StorageLeafNode,
- },
- {
- Path: []byte{'\x0b'},
- NodeType: sdtypes.Leaf,
- LeafKey: slot1StorageKey.Bytes(),
- NodeValue: slot1StorageLeafNode,
- },
- {
- Path: []byte{'\x0c'},
- NodeType: sdtypes.Leaf,
- LeafKey: slot3StorageKey.Bytes(),
- NodeValue: slot3StorageLeafNode,
- },
- },
- },
- {
- Path: []byte{'\x0c'},
- NodeType: sdtypes.Leaf,
- LeafKey: test_helpers.Account2LeafKey,
- NodeValue: account2AtBlock3LeafNode,
- StorageNodes: emptyStorage,
- },
- },
- CodeAndCodeHashes: []sdtypes.CodeAndCodeHash{
- {
- Hash: test_helpers.CodeHash,
- Code: test_helpers.ByteCodeAfterDeployment,
- },
- },
- },
- },
- }
-
- for _, test := range tests {
- diff, err := builder.BuildStateTrieObject(test.block)
- if err != nil {
- t.Error(err)
- }
- receivedStateTrieRlp, err := rlp.EncodeToBytes(&diff)
- if err != nil {
- t.Error(err)
- }
- expectedStateTrieRlp, err := rlp.EncodeToBytes(test.expected)
- if err != nil {
- t.Error(err)
- }
- sort.Slice(receivedStateTrieRlp, func(i, j int) bool { return receivedStateTrieRlp[i] < receivedStateTrieRlp[j] })
- sort.Slice(expectedStateTrieRlp, func(i, j int) bool { return expectedStateTrieRlp[i] < expectedStateTrieRlp[j] })
- if !bytes.Equal(receivedStateTrieRlp, expectedStateTrieRlp) {
- t.Logf("Test failed: %s", test.name)
- t.Errorf("actual state trie: %+v\r\n\r\n\r\nexpected state trie: %+v", diff, test.expected)
- }
- }
-}
-
-/*
-pragma solidity ^0.5.10;
-
-contract test {
- address payable owner;
-
- modifier onlyOwner {
- require(
- msg.sender == owner,
- "Only owner can call this function."
- );
- _;
- }
-
- uint256[100] data;
-
- constructor() public {
- owner = msg.sender;
- data = [1];
- }
-
- function Put(uint256 addr, uint256 value) public {
- data[addr] = value;
- }
-
- function close() public onlyOwner { //onlyOwner is custom modifier
- selfdestruct(owner); // `owner` is the owners address
- }
-}
-*/
diff --git a/pkg/config.go b/pkg/config.go
index 318ffc1..211af44 100644
--- a/pkg/config.go
+++ b/pkg/config.go
@@ -1,7 +1,7 @@
package statediff
-// Config holds config params for the statediffing service
-type Config struct {
+// ServiceConfig holds config params for the statediffing service
+type ServiceConfig struct {
ServiceWorkers uint
TrieWorkers uint
WorkerQueueSize uint
diff --git a/pkg/helpers.go b/pkg/helpers.go
index ae0d1b0..977a9f6 100644
--- a/pkg/helpers.go
+++ b/pkg/helpers.go
@@ -22,9 +22,11 @@ package statediff
import (
"sort"
"strings"
+
+ sdtypes "github.com/cerc-io/plugeth-statediff/types"
)
-func sortKeys(data AccountMap) []string {
+func sortKeys(data sdtypes.AccountMap) []string {
keys := make([]string, 0, len(data))
for key := range data {
keys = append(keys, key)
diff --git a/pkg/reader.go b/pkg/reader.go
index fcfe7af..6a7af67 100644
--- a/pkg/reader.go
+++ b/pkg/reader.go
@@ -54,22 +54,29 @@ type LvLDBReaderConfig struct {
DBCacheSize int
}
-// NewLvlDBReader creates a new Read using LevelDB
+// NewLvlDBReader creates a new Reader using LevelDB
func NewLvlDBReader(conf LvLDBReaderConfig) (*LvlDBReader, error) {
var edb ethdb.Database
var err error
- if conf.Mode == "local" {
- edb, err = rawdb.NewLevelDBDatabaseWithFreezer(conf.Path, conf.DBCacheSize, 256, conf.AncientPath, "eth-statediff-service", true)
- }
+ switch conf.Mode {
+ case "local":
+ edb, err = rawdb.NewLevelDBDatabase(conf.Path, conf.DBCacheSize, 256, "eth-statediff-service", true)
+ if err != nil {
+ return nil, err
+ }
- if conf.Mode == "remote" {
+ edb, err = rawdb.NewDatabaseWithFreezer(edb, conf.AncientPath, "eth-statediff-service", true)
+ if err != nil {
+ return nil, err
+ }
+ case "remote":
edb, err = client.NewDatabaseClient(conf.Url)
+ if err != nil {
+ return nil, err
+ }
}
- if err != nil {
- return nil, err
- }
return &LvlDBReader{
ethDB: edb,
stateDB: state.NewDatabaseWithConfig(edb, conf.TrieConfig),
diff --git a/pkg/rpc/http.go b/pkg/rpc/http.go
index 8ffcf9c..a8c71b1 100644
--- a/pkg/rpc/http.go
+++ b/pkg/rpc/http.go
@@ -31,7 +31,7 @@ import (
func StartHTTPEndpoint(endpoint string, apis []rpc.API, modules []string, cors []string, vhosts []string, timeouts rpc.HTTPTimeouts) (*rpc.Server, error) {
srv := rpc.NewServer()
- err := node.RegisterApis(apis, modules, srv, false)
+ err := node.RegisterApis(apis, modules, srv)
if err != nil {
utils.Fatalf("Could not register HTTP API: %w", err)
}
diff --git a/pkg/service.go b/pkg/service.go
index 239dcaa..758c354 100644
--- a/pkg/service.go
+++ b/pkg/service.go
@@ -22,12 +22,12 @@ import (
"sync"
"time"
- sd "github.com/cerc-io/plugeth-statediff"
+ "github.com/cerc-io/plugeth-statediff"
+ "github.com/cerc-io/plugeth-statediff/adapt"
"github.com/cerc-io/plugeth-statediff/indexer/interfaces"
sdtypes "github.com/cerc-io/plugeth-statediff/types"
"github.com/ethereum/go-ethereum/common"
"github.com/ethereum/go-ethereum/core/types"
- "github.com/ethereum/go-ethereum/node"
"github.com/ethereum/go-ethereum/p2p"
"github.com/ethereum/go-ethereum/rlp"
"github.com/ethereum/go-ethereum/rpc"
@@ -38,35 +38,10 @@ import (
const defaultQueueSize = 1024
-// StateDiffService is the state-diffing service interface
-type StateDiffService interface {
- // Lifecycle Start() and Stop()
- node.Lifecycle
- // APIs and Protocols() interface for node service registration
- APIs() []rpc.API
- Protocols() []p2p.Protocol
- // Loop is the main event loop for processing state diffs
- Loop(wg *sync.WaitGroup) error
- // Run is a one-off command to run on a predefined set of ranges
- Run(ranges []RangeRequest) error
- // StateDiffAt method to get state diff object at specific block
- StateDiffAt(blockNumber uint64, params sd.Params) (*sd.Payload, error)
- // StateDiffFor method to get state diff object at specific block
- StateDiffFor(blockHash common.Hash, params sd.Params) (*sd.Payload, error)
- // StateTrieAt method to get state trie object at specific block
- StateTrieAt(blockNumber uint64, params sd.Params) (*sd.Payload, error)
- // WriteStateDiffAt method to write state diff object directly to DB
- WriteStateDiffAt(blockNumber uint64, params sd.Params) error
- // WriteStateDiffFor method to get state trie object at specific block
- WriteStateDiffFor(blockHash common.Hash, params sd.Params) error
- // WriteStateDiffsInRange method to wrtie state diff objects within the range directly to the DB
- WriteStateDiffsInRange(start, stop uint64, params sd.Params) error
-}
-
// Service is the underlying struct for the state diffing service
type Service struct {
// Used to build the state diff objects
- Builder Builder
+ Builder statediff.Builder
// Used to read data from LevelDB
lvlDBReader Reader
// Used to signal shutdown of the service
@@ -82,22 +57,22 @@ type Service struct {
}
// NewStateDiffService creates a new Service
-func NewStateDiffService(lvlDBReader Reader, indexer interfaces.StateDiffIndexer, conf Config) (*Service, error) {
- b, err := NewBuilder(lvlDBReader.StateDB(), conf.TrieWorkers)
- if err != nil {
- return nil, err
- }
+func NewStateDiffService(lvlDBReader Reader, indexer interfaces.StateDiffIndexer, conf ServiceConfig) *Service {
+ builder := statediff.NewBuilderWithOptions(
+ adapt.GethStateView(lvlDBReader.StateDB()),
+ statediff.BuilderOptions{SubtrieWorkers: conf.TrieWorkers},
+ )
if conf.WorkerQueueSize == 0 {
conf.WorkerQueueSize = defaultQueueSize
}
return &Service{
lvlDBReader: lvlDBReader,
- Builder: b,
+ Builder: builder,
indexer: indexer,
workers: conf.ServiceWorkers,
queue: make(chan RangeRequest, conf.WorkerQueueSize),
preruns: conf.PreRuns,
- }, nil
+ }
}
// Protocols exports the services p2p protocols, this service has none
@@ -188,7 +163,7 @@ func (sds *Service) Loop(wg *sync.WaitGroup) error {
// StateDiffAt returns a state diff object payload at the specific blockheight
// This operation cannot be performed back past the point of db pruning; it requires an archival node for historical data
-func (sds *Service) StateDiffAt(blockNumber uint64, params sd.Params) (*sd.Payload, error) {
+func (sds *Service) StateDiffAt(blockNumber uint64, params statediff.Params) (*statediff.Payload, error) {
currentBlock, err := sds.lvlDBReader.GetBlockByNumber(blockNumber)
if err != nil {
return nil, err
@@ -196,7 +171,7 @@ func (sds *Service) StateDiffAt(blockNumber uint64, params sd.Params) (*sd.Paylo
logrus.Infof("sending state diff at block %d", blockNumber)
// compute leaf keys of watched addresses in the params
- params.ComputeWatchedAddressesLeafKeys()
+ params.ComputeWatchedAddressesLeafPaths()
if blockNumber == 0 {
return sds.processStateDiff(currentBlock, common.Hash{}, params)
@@ -210,7 +185,7 @@ func (sds *Service) StateDiffAt(blockNumber uint64, params sd.Params) (*sd.Paylo
// StateDiffFor returns a state diff object payload for the specific blockhash
// This operation cannot be performed back past the point of db pruning; it requires an archival node for historical data
-func (sds *Service) StateDiffFor(blockHash common.Hash, params sd.Params) (*sd.Payload, error) {
+func (sds *Service) StateDiffFor(blockHash common.Hash, params statediff.Params) (*statediff.Payload, error) {
currentBlock, err := sds.lvlDBReader.GetBlockByHash(blockHash)
if err != nil {
return nil, err
@@ -218,7 +193,7 @@ func (sds *Service) StateDiffFor(blockHash common.Hash, params sd.Params) (*sd.P
logrus.Infof("sending state diff at block %s", blockHash.Hex())
// compute leaf keys of watched addresses in the params
- params.ComputeWatchedAddressesLeafKeys()
+ params.ComputeWatchedAddressesLeafPaths()
if currentBlock.NumberU64() == 0 {
return sds.processStateDiff(currentBlock, common.Hash{}, params)
@@ -231,8 +206,8 @@ func (sds *Service) StateDiffFor(blockHash common.Hash, params sd.Params) (*sd.P
}
// processStateDiff method builds the state diff payload from the current block, parent state root, and provided params
-func (sds *Service) processStateDiff(currentBlock *types.Block, parentRoot common.Hash, params sd.Params) (*sd.Payload, error) {
- stateDiff, err := sds.Builder.BuildStateDiffObject(sd.Args{
+func (sds *Service) processStateDiff(currentBlock *types.Block, parentRoot common.Hash, params statediff.Params) (*statediff.Payload, error) {
+ stateDiff, err := sds.Builder.BuildStateDiffObject(statediff.Args{
BlockHash: currentBlock.Hash(),
BlockNumber: currentBlock.Number(),
OldStateRoot: parentRoot,
@@ -249,8 +224,8 @@ func (sds *Service) processStateDiff(currentBlock *types.Block, parentRoot commo
return sds.newPayload(stateDiffRlp, currentBlock, params)
}
-func (sds *Service) newPayload(stateObject []byte, block *types.Block, params sd.Params) (*sd.Payload, error) {
- payload := &sd.Payload{
+func (sds *Service) newPayload(stateObject []byte, block *types.Block, params statediff.Params) (*statediff.Payload, error) {
+ payload := &statediff.Payload{
StateObjectRlp: stateObject,
}
if params.IncludeBlock {
@@ -281,34 +256,6 @@ func (sds *Service) newPayload(stateObject []byte, block *types.Block, params sd
return payload, nil
}
-// StateTrieAt returns a state trie object payload at the specified blockheight
-// This operation cannot be performed back past the point of db pruning; it requires an archival node for historical data
-func (sds *Service) StateTrieAt(blockNumber uint64, params sd.Params) (*sd.Payload, error) {
- currentBlock, err := sds.lvlDBReader.GetBlockByNumber(blockNumber)
- if err != nil {
- return nil, err
- }
- logrus.Infof("sending state trie at block %d", blockNumber)
-
- // compute leaf keys of watched addresses in the params
- params.ComputeWatchedAddressesLeafKeys()
-
- return sds.processStateTrie(currentBlock, params)
-}
-
-func (sds *Service) processStateTrie(block *types.Block, params sd.Params) (*sd.Payload, error) {
- stateNodes, err := sds.Builder.BuildStateTrieObject(block)
- if err != nil {
- return nil, err
- }
- stateTrieRlp, err := rlp.EncodeToBytes(&stateNodes)
- if err != nil {
- return nil, err
- }
- logrus.Infof("state trie object at block %d is %d bytes in length", block.Number().Uint64(), len(stateTrieRlp))
- return sds.newPayload(stateTrieRlp, block, params)
-}
-
// Start is used to begin the service
func (sds *Service) Start() error {
logrus.Info("starting statediff service")
@@ -325,7 +272,7 @@ func (sds *Service) Stop() error {
// WriteStateDiffAt writes a state diff at the specific blockheight directly to the database
// This operation cannot be performed back past the point of db pruning; it requires an archival node
// for historical data
-func (sds *Service) WriteStateDiffAt(blockNumber uint64, params sd.Params) error {
+func (sds *Service) WriteStateDiffAt(blockNumber uint64, params statediff.Params) error {
logrus.Infof("Writing state diff at block %d", blockNumber)
t := time.Now()
currentBlock, err := sds.lvlDBReader.GetBlockByNumber(blockNumber)
@@ -334,7 +281,7 @@ func (sds *Service) WriteStateDiffAt(blockNumber uint64, params sd.Params) error
}
// compute leaf keys of watched addresses in the params
- params.ComputeWatchedAddressesLeafKeys()
+ params.ComputeWatchedAddressesLeafPaths()
parentRoot := common.Hash{}
if blockNumber != 0 {
@@ -350,7 +297,7 @@ func (sds *Service) WriteStateDiffAt(blockNumber uint64, params sd.Params) error
// WriteStateDiffFor writes a state diff for the specific blockHash directly to the database
// This operation cannot be performed back past the point of db pruning; it requires an archival node
// for historical data
-func (sds *Service) WriteStateDiffFor(blockHash common.Hash, params sd.Params) error {
+func (sds *Service) WriteStateDiffFor(blockHash common.Hash, params statediff.Params) error {
logrus.Infof("Writing state diff for block %s", blockHash.Hex())
t := time.Now()
currentBlock, err := sds.lvlDBReader.GetBlockByHash(blockHash)
@@ -359,7 +306,7 @@ func (sds *Service) WriteStateDiffFor(blockHash common.Hash, params sd.Params) e
}
// compute leaf keys of watched addresses in the params
- params.ComputeWatchedAddressesLeafKeys()
+ params.ComputeWatchedAddressesLeafPaths()
parentRoot := common.Hash{}
if currentBlock.NumberU64() != 0 {
@@ -373,7 +320,7 @@ func (sds *Service) WriteStateDiffFor(blockHash common.Hash, params sd.Params) e
}
// Writes a state diff from the current block, parent state root, and provided params
-func (sds *Service) writeStateDiff(block *types.Block, parentRoot common.Hash, params sd.Params, t time.Time) error {
+func (sds *Service) writeStateDiff(block *types.Block, parentRoot common.Hash, params statediff.Params, t time.Time) error {
var totalDifficulty *big.Int
var receipts types.Receipts
var err error
@@ -398,28 +345,30 @@ func (sds *Service) writeStateDiff(block *types.Block, parentRoot common.Hash, p
return err
}
// defer handling of commit/rollback for any return case
- output := func(node sdtypes.StateNode) error {
+ output := func(node sdtypes.StateLeafNode) error {
return sds.indexer.PushStateNode(tx, node, block.Hash().String())
}
- codeOutput := func(c sdtypes.CodeAndCodeHash) error {
- return sds.indexer.PushCodeAndCodeHash(tx, c)
+ codeOutput := func(c sdtypes.IPLD) error {
+ return sds.indexer.PushIPLD(tx, c)
}
prom.SetTimeMetric(prom.T_BLOCK_PROCESSING, time.Now().Sub(t))
t = time.Now()
- err = sds.Builder.WriteStateDiffObject(sdtypes.StateRoots{
+ err = sds.Builder.WriteStateDiff(statediff.Args{
NewStateRoot: block.Root(),
OldStateRoot: parentRoot,
+ BlockNumber: block.Number(),
+ BlockHash: block.Hash(),
}, params, output, codeOutput)
prom.SetTimeMetric(prom.T_STATE_PROCESSING, time.Now().Sub(t))
t = time.Now()
- err = tx.Submit(err)
+ err = tx.Submit()
prom.SetLastProcessedHeight(height)
prom.SetTimeMetric(prom.T_POSTGRES_TX_COMMIT, time.Now().Sub(t))
return err
}
// WriteStateDiffsInRange adds a RangeRequest to the work queue
-func (sds *Service) WriteStateDiffsInRange(start, stop uint64, params sd.Params) error {
+func (sds *Service) WriteStateDiffsInRange(start, stop uint64, params statediff.Params) error {
if stop < start {
return fmt.Errorf("invalid block range (%d, %d): stop height must be greater or equal to start height", start, stop)
}
diff --git a/pkg/types.go b/pkg/types.go
index 9f88afc..1fffcb6 100644
--- a/pkg/types.go
+++ b/pkg/types.go
@@ -21,22 +21,8 @@ package statediff
import (
sd "github.com/cerc-io/plugeth-statediff"
- sdTypes "github.com/cerc-io/plugeth-statediff/types"
- "github.com/ethereum/go-ethereum/core/types"
)
-// AccountMap is a mapping of hex encoded path => account wrapper
-type AccountMap map[string]accountWrapper
-
-// accountWrapper is used to temporary associate the unpacked node with its raw values
-type accountWrapper struct {
- Account *types.StateAccount
- NodeType sdTypes.NodeType
- Path []byte
- NodeValue []byte
- LeafKey []byte
-}
-
// RangeRequest holds range quest work params
type RangeRequest struct {
Start, Stop uint64