From a05d1be531355928f2310170064c1f68f48924b2 Mon Sep 17 00:00:00 2001 From: ledgerwatch <akhounov@gmail.com> Date: Thu, 1 Jul 2021 22:31:14 +0100 Subject: [PATCH] Pull grpc bindings into erigon-lib (#2265) * Pull grpc bindings into erigon-lib * Remove mdbx dist Co-authored-by: Alexey Sharp <alexeysharp@Alexeys-iMac.local> --- Makefile | 33 - cmd/cons/commands/clique.go | 4 +- cmd/integration/commands/testing.go | 4 +- cmd/rpcdaemon/cli/config.go | 2 +- cmd/rpcdaemon/commands/daemon.go | 2 +- cmd/rpcdaemon/commands/eth_api.go | 5 +- cmd/rpcdaemon/commands/eth_ming_test.go | 2 +- cmd/rpcdaemon/commands/eth_mining.go | 2 +- cmd/rpcdaemon/commands/eth_txs.go | 6 +- cmd/rpcdaemon/commands/send_transaction.go | 2 +- .../commands/send_transaction_test.go | 4 +- cmd/rpcdaemon/commands/txpool_api.go | 2 +- cmd/rpcdaemon/commands/txpool_api_test.go | 4 +- cmd/rpcdaemon/filters/filters.go | 4 +- cmd/rpcdaemon/rpcdaemontest/test_util.go | 2 +- cmd/rpcdaemon/services/eth_backend.go | 4 +- cmd/rpcdaemon/services/eth_mining.go | 4 +- cmd/rpcdaemon/services/eth_txpool.go | 4 +- cmd/sentry/download/broadcast.go | 2 +- cmd/sentry/download/downloader.go | 4 +- cmd/sentry/download/sentry.go | 6 +- cmd/sentry/download/sentry_api.go | 4 +- cmd/sentry/download/sentry_test.go | 4 +- common/dbutils/bucket.go | 2 +- eth/backend.go | 2 +- eth/protocols/eth/handler_test.go | 2 +- eth/protocols/eth/protocol.go | 2 +- ethdb/kv/kv_abstract_test.go | 4 +- ethdb/kv/kv_remote.go | 4 +- ethdb/remote/remotedbserver/ethbackend.go | 6 +- ethdb/remote/remotedbserver/mining.go | 4 +- ethdb/remote/remotedbserver/server.go | 6 +- ethdb/remote/remotedbserver/txpool.go | 6 +- go.mod | 6 +- go.sum | 25 +- gointerfaces/consensus/consensus.pb.go | 2078 ----------------- gointerfaces/consensus/consensus_grpc.pb.go | 634 ----- gointerfaces/remote/ethbackend.pb.go | 904 ------- gointerfaces/remote/ethbackend_grpc.pb.go | 353 --- gointerfaces/remote/kv.pb.go | 795 ------- gointerfaces/remote/kv_grpc.pb.go | 239 -- gointerfaces/sentry/sentry.pb.go | 1455 ------------ gointerfaces/sentry/sentry_grpc.pb.go | 418 ---- .../snapshotsync/external_downloader.pb.go | 470 ---- .../external_downloader_grpc.pb.go | 138 -- gointerfaces/testing/testing.pb.go | 242 -- gointerfaces/testing/testing_grpc.pb.go | 172 -- gointerfaces/txpool/mining.pb.go | 1153 --------- gointerfaces/txpool/mining_grpc.pb.go | 517 ---- gointerfaces/txpool/txpool.pb.go | 880 ------- gointerfaces/txpool/txpool_grpc.pb.go | 325 --- gointerfaces/type_utils.go | 97 - gointerfaces/types/types.pb.go | 515 ---- gointerfaces/version.go | 30 - interfaces/.github/workflows/rust.yml | 51 - interfaces/.gitignore | 2 - interfaces/Cargo.toml | 27 - interfaces/LICENSE | 201 -- interfaces/README.md | 34 - interfaces/_docs/README.md | 138 -- interfaces/_docs/staged-sync.drawio | 1 - interfaces/_docs/staged-sync.md | 103 - interfaces/_docs/stages-batch-process.png | Bin 83515 -> 0 bytes interfaces/_docs/stages-commitment.png | Bin 61030 -> 0 bytes interfaces/_docs/stages-etl.png | Bin 49802 -> 0 bytes interfaces/_docs/stages-ordering.png | Bin 12190 -> 0 bytes interfaces/_docs/stages-overview.png | Bin 16305 -> 0 bytes interfaces/_docs/stages-rpc-methods.png | Bin 19284 -> 0 bytes interfaces/build.rs | 45 - interfaces/consensus_engine/consensus.proto | 163 -- interfaces/db_tables.toml | 49 - interfaces/p2psentry/sentry.proto | 141 -- interfaces/remote/ethbackend.proto | 63 - interfaces/remote/kv.proto | 88 - .../external_downloader.proto | 40 - interfaces/src/lib.rs | 166 -- interfaces/testing/testing.proto | 27 - interfaces/turbo-geth-architecture.png | Bin 179413 -> 0 bytes interfaces/turbo-geth.drawio | 1 - interfaces/txpool/README.md | 45 - interfaces/txpool/mining.proto | 103 - interfaces/txpool/txpool.proto | 61 - interfaces/txpool/txpool_control.proto | 57 - interfaces/types/types.proto | 46 - turbo/remote/sentry_client.go | 2 +- turbo/shards/state_change_accumulator.go | 4 +- turbo/stages/mock_sentry.go | 6 +- turbo/stages/sentry_mock_test.go | 2 +- turbo/txpool/p2p.go | 4 +- 89 files changed, 87 insertions(+), 13177 deletions(-) delete mode 100644 gointerfaces/consensus/consensus.pb.go delete mode 100644 gointerfaces/consensus/consensus_grpc.pb.go delete mode 100644 gointerfaces/remote/ethbackend.pb.go delete mode 100644 gointerfaces/remote/ethbackend_grpc.pb.go delete mode 100644 gointerfaces/remote/kv.pb.go delete mode 100644 gointerfaces/remote/kv_grpc.pb.go delete mode 100644 gointerfaces/sentry/sentry.pb.go delete mode 100644 gointerfaces/sentry/sentry_grpc.pb.go delete mode 100644 gointerfaces/snapshotsync/external_downloader.pb.go delete mode 100644 gointerfaces/snapshotsync/external_downloader_grpc.pb.go delete mode 100644 gointerfaces/testing/testing.pb.go delete mode 100644 gointerfaces/testing/testing_grpc.pb.go delete mode 100644 gointerfaces/txpool/mining.pb.go delete mode 100644 gointerfaces/txpool/mining_grpc.pb.go delete mode 100644 gointerfaces/txpool/txpool.pb.go delete mode 100644 gointerfaces/txpool/txpool_grpc.pb.go delete mode 100644 gointerfaces/type_utils.go delete mode 100644 gointerfaces/types/types.pb.go delete mode 100644 gointerfaces/version.go delete mode 100644 interfaces/.github/workflows/rust.yml delete mode 100644 interfaces/.gitignore delete mode 100644 interfaces/Cargo.toml delete mode 100644 interfaces/LICENSE delete mode 100644 interfaces/README.md delete mode 100644 interfaces/_docs/README.md delete mode 100644 interfaces/_docs/staged-sync.drawio delete mode 100644 interfaces/_docs/staged-sync.md delete mode 100644 interfaces/_docs/stages-batch-process.png delete mode 100644 interfaces/_docs/stages-commitment.png delete mode 100644 interfaces/_docs/stages-etl.png delete mode 100644 interfaces/_docs/stages-ordering.png delete mode 100644 interfaces/_docs/stages-overview.png delete mode 100644 interfaces/_docs/stages-rpc-methods.png delete mode 100644 interfaces/build.rs delete mode 100644 interfaces/consensus_engine/consensus.proto delete mode 100644 interfaces/db_tables.toml delete mode 100644 interfaces/p2psentry/sentry.proto delete mode 100644 interfaces/remote/ethbackend.proto delete mode 100644 interfaces/remote/kv.proto delete mode 100644 interfaces/snapshot_downloader/external_downloader.proto delete mode 100644 interfaces/src/lib.rs delete mode 100644 interfaces/testing/testing.proto delete mode 100644 interfaces/turbo-geth-architecture.png delete mode 100644 interfaces/turbo-geth.drawio delete mode 100644 interfaces/txpool/README.md delete mode 100644 interfaces/txpool/mining.proto delete mode 100644 interfaces/txpool/txpool.proto delete mode 100644 interfaces/txpool/txpool_control.proto delete mode 100644 interfaces/types/types.proto diff --git a/Makefile b/Makefile index 82a4ab7d95..78945ad8b5 100644 --- a/Makefile +++ b/Makefile @@ -10,15 +10,6 @@ GO_DBG_BUILD = go build -trimpath -tags=debug -ldflags "-X github.com/ledgerwatc GO_MAJOR_VERSION = $(shell go version | cut -c 14- | cut -d' ' -f1 | cut -d'.' -f1) GO_MINOR_VERSION = $(shell go version | cut -c 14- | cut -d' ' -f1 | cut -d'.' -f2) -OS = $(shell uname -s) -ARCH = $(shell uname -m) - -ifeq ($(OS),Darwin) -PROTOC_OS := osx -endif -ifeq ($(OS),Linux) -PROTOC_OS = linux -endif all: erigon hack rpctest state pics rpcdaemon integration db-tools sentry go-version: @@ -160,30 +151,6 @@ bindings: PATH=$(GOBIN):$(PATH) go generate ./tests/contracts/ PATH=$(GOBIN):$(PATH) go generate ./core/state/contracts/ -grpc: - # See also: ./cmd/hack/binary-deps/main.go - mkdir -p ./build/bin/ - rm -f ./build/bin/protoc* - rm -rf ./build/include* - - $(eval PROTOC_TMP := $(shell mktemp -d)) - cd $(PROTOC_TMP); curl -sSL https://github.com/protocolbuffers/protobuf/releases/download/v3.17.3/protoc-3.17.3-$(PROTOC_OS)-$(ARCH).zip -o protoc.zip - cd $(PROTOC_TMP); unzip protoc.zip && mv bin/protoc $(GOBIN) && mv include $(GOBIN)/.. - - $(GOBUILD) -o $(GOBIN)/protoc-gen-go google.golang.org/protobuf/cmd/protoc-gen-go # generates proto messages - $(GOBUILD) -o $(GOBIN)/protoc-gen-go-grpc google.golang.org/grpc/cmd/protoc-gen-go-grpc # generates grpc services - PATH=$(GOBIN):$(PATH) protoc --proto_path=interfaces --go_out=gointerfaces -I=build/include/google \ - types/types.proto - PATH=$(GOBIN):$(PATH) protoc --proto_path=interfaces --go_out=gointerfaces --go-grpc_out=gointerfaces -I=build/include/google \ - --go_opt=Mtypes/types.proto=github.com/ledgerwatch/erigon/gointerfaces/types \ - --go-grpc_opt=Mtypes/types.proto=github.com/ledgerwatch/erigon/gointerfaces/types \ - p2psentry/sentry.proto \ - remote/kv.proto remote/ethbackend.proto \ - snapshot_downloader/external_downloader.proto \ - consensus_engine/consensus.proto \ - testing/testing.proto \ - txpool/txpool.proto txpool/mining.proto - prometheus: docker-compose up prometheus grafana diff --git a/cmd/cons/commands/clique.go b/cmd/cons/commands/clique.go index 48fe3ef0c7..89c10f821d 100644 --- a/cmd/cons/commands/clique.go +++ b/cmd/cons/commands/clique.go @@ -17,14 +17,14 @@ import ( grpc_recovery "github.com/grpc-ecosystem/go-grpc-middleware/recovery" grpc_prometheus "github.com/grpc-ecosystem/go-grpc-prometheus" "github.com/holiman/uint256" + "github.com/ledgerwatch/erigon-lib/gointerfaces" + proto_cons "github.com/ledgerwatch/erigon-lib/gointerfaces/consensus" "github.com/ledgerwatch/erigon/cmd/utils" "github.com/ledgerwatch/erigon/common" "github.com/ledgerwatch/erigon/consensus/clique" "github.com/ledgerwatch/erigon/core" "github.com/ledgerwatch/erigon/core/types" "github.com/ledgerwatch/erigon/ethdb" - "github.com/ledgerwatch/erigon/gointerfaces" - proto_cons "github.com/ledgerwatch/erigon/gointerfaces/consensus" "github.com/ledgerwatch/erigon/log" "github.com/ledgerwatch/erigon/metrics" "github.com/ledgerwatch/erigon/params" diff --git a/cmd/integration/commands/testing.go b/cmd/integration/commands/testing.go index 36eebcb8cb..1ba97887d9 100644 --- a/cmd/integration/commands/testing.go +++ b/cmd/integration/commands/testing.go @@ -11,9 +11,9 @@ import ( grpc_middleware "github.com/grpc-ecosystem/go-grpc-middleware" grpc_recovery "github.com/grpc-ecosystem/go-grpc-middleware/recovery" grpc_prometheus "github.com/grpc-ecosystem/go-grpc-prometheus" + proto_sentry "github.com/ledgerwatch/erigon-lib/gointerfaces/sentry" + proto_testing "github.com/ledgerwatch/erigon-lib/gointerfaces/testing" "github.com/ledgerwatch/erigon/cmd/utils" - proto_sentry "github.com/ledgerwatch/erigon/gointerfaces/sentry" - proto_testing "github.com/ledgerwatch/erigon/gointerfaces/testing" "github.com/ledgerwatch/erigon/log" "github.com/ledgerwatch/erigon/metrics" "github.com/spf13/cobra" diff --git a/cmd/rpcdaemon/cli/config.go b/cmd/rpcdaemon/cli/config.go index d2c035c044..e88c957219 100644 --- a/cmd/rpcdaemon/cli/config.go +++ b/cmd/rpcdaemon/cli/config.go @@ -8,6 +8,7 @@ import ( "path" "time" + "github.com/ledgerwatch/erigon-lib/gointerfaces" "github.com/ledgerwatch/erigon/cmd/rpcdaemon/services" "github.com/ledgerwatch/erigon/cmd/utils" "github.com/ledgerwatch/erigon/common/dbutils" @@ -15,7 +16,6 @@ import ( "github.com/ledgerwatch/erigon/ethdb" kv2 "github.com/ledgerwatch/erigon/ethdb/kv" "github.com/ledgerwatch/erigon/ethdb/remote/remotedbserver" - "github.com/ledgerwatch/erigon/gointerfaces" "github.com/ledgerwatch/erigon/internal/debug" "github.com/ledgerwatch/erigon/log" "github.com/ledgerwatch/erigon/node" diff --git a/cmd/rpcdaemon/commands/daemon.go b/cmd/rpcdaemon/commands/daemon.go index 27196b3a0d..9a04d346ea 100644 --- a/cmd/rpcdaemon/commands/daemon.go +++ b/cmd/rpcdaemon/commands/daemon.go @@ -3,11 +3,11 @@ package commands import ( "context" + "github.com/ledgerwatch/erigon-lib/gointerfaces/txpool" "github.com/ledgerwatch/erigon/cmd/rpcdaemon/cli" "github.com/ledgerwatch/erigon/cmd/rpcdaemon/filters" "github.com/ledgerwatch/erigon/cmd/rpcdaemon/services" "github.com/ledgerwatch/erigon/ethdb" - "github.com/ledgerwatch/erigon/gointerfaces/txpool" "github.com/ledgerwatch/erigon/rpc" ) diff --git a/cmd/rpcdaemon/commands/eth_api.go b/cmd/rpcdaemon/commands/eth_api.go index f24cc2c20f..69ae26d18e 100644 --- a/cmd/rpcdaemon/commands/eth_api.go +++ b/cmd/rpcdaemon/commands/eth_api.go @@ -3,10 +3,12 @@ package commands import ( "bytes" "context" - "github.com/holiman/uint256" "math/big" "sync" + "github.com/holiman/uint256" + + "github.com/ledgerwatch/erigon-lib/gointerfaces/txpool" "github.com/ledgerwatch/erigon/cmd/rpcdaemon/filters" "github.com/ledgerwatch/erigon/cmd/rpcdaemon/services" "github.com/ledgerwatch/erigon/common" @@ -16,7 +18,6 @@ import ( "github.com/ledgerwatch/erigon/core/types" ethFilters "github.com/ledgerwatch/erigon/eth/filters" "github.com/ledgerwatch/erigon/ethdb" - "github.com/ledgerwatch/erigon/gointerfaces/txpool" "github.com/ledgerwatch/erigon/internal/ethapi" "github.com/ledgerwatch/erigon/params" "github.com/ledgerwatch/erigon/rpc" diff --git a/cmd/rpcdaemon/commands/eth_ming_test.go b/cmd/rpcdaemon/commands/eth_ming_test.go index 749738fb9a..4d8868491f 100644 --- a/cmd/rpcdaemon/commands/eth_ming_test.go +++ b/cmd/rpcdaemon/commands/eth_ming_test.go @@ -5,10 +5,10 @@ import ( "testing" "time" + "github.com/ledgerwatch/erigon-lib/gointerfaces/txpool" "github.com/ledgerwatch/erigon/cmd/rpcdaemon/filters" "github.com/ledgerwatch/erigon/cmd/rpcdaemon/rpcdaemontest" "github.com/ledgerwatch/erigon/core/types" - "github.com/ledgerwatch/erigon/gointerfaces/txpool" "github.com/ledgerwatch/erigon/rlp" "github.com/ledgerwatch/erigon/turbo/stages" "github.com/stretchr/testify/require" diff --git a/cmd/rpcdaemon/commands/eth_mining.go b/cmd/rpcdaemon/commands/eth_mining.go index 5e29aba959..9f4cf4982e 100644 --- a/cmd/rpcdaemon/commands/eth_mining.go +++ b/cmd/rpcdaemon/commands/eth_mining.go @@ -4,10 +4,10 @@ import ( "context" "errors" + "github.com/ledgerwatch/erigon-lib/gointerfaces/txpool" "github.com/ledgerwatch/erigon/common" "github.com/ledgerwatch/erigon/common/hexutil" "github.com/ledgerwatch/erigon/core/types" - "github.com/ledgerwatch/erigon/gointerfaces/txpool" "google.golang.org/grpc/status" ) diff --git a/cmd/rpcdaemon/commands/eth_txs.go b/cmd/rpcdaemon/commands/eth_txs.go index 2db4478a62..98acd10145 100644 --- a/cmd/rpcdaemon/commands/eth_txs.go +++ b/cmd/rpcdaemon/commands/eth_txs.go @@ -6,13 +6,13 @@ import ( "fmt" "math/big" + "github.com/ledgerwatch/erigon-lib/gointerfaces" + "github.com/ledgerwatch/erigon-lib/gointerfaces/txpool" + "github.com/ledgerwatch/erigon-lib/gointerfaces/types" "github.com/ledgerwatch/erigon/common" "github.com/ledgerwatch/erigon/common/hexutil" "github.com/ledgerwatch/erigon/core/rawdb" types2 "github.com/ledgerwatch/erigon/core/types" - "github.com/ledgerwatch/erigon/gointerfaces" - "github.com/ledgerwatch/erigon/gointerfaces/txpool" - "github.com/ledgerwatch/erigon/gointerfaces/types" "github.com/ledgerwatch/erigon/rpc" ) diff --git a/cmd/rpcdaemon/commands/send_transaction.go b/cmd/rpcdaemon/commands/send_transaction.go index f4649bab89..6a97981ebd 100644 --- a/cmd/rpcdaemon/commands/send_transaction.go +++ b/cmd/rpcdaemon/commands/send_transaction.go @@ -7,13 +7,13 @@ import ( "fmt" "math/big" + "github.com/ledgerwatch/erigon-lib/gointerfaces/txpool" "github.com/ledgerwatch/erigon/common" "github.com/ledgerwatch/erigon/common/hexutil" "github.com/ledgerwatch/erigon/core/rawdb" "github.com/ledgerwatch/erigon/core/types" "github.com/ledgerwatch/erigon/crypto" "github.com/ledgerwatch/erigon/eth/ethconfig" - "github.com/ledgerwatch/erigon/gointerfaces/txpool" "github.com/ledgerwatch/erigon/log" "github.com/ledgerwatch/erigon/params" "github.com/ledgerwatch/erigon/rlp" diff --git a/cmd/rpcdaemon/commands/send_transaction_test.go b/cmd/rpcdaemon/commands/send_transaction_test.go index 3be92dae2a..4118fc0dc0 100644 --- a/cmd/rpcdaemon/commands/send_transaction_test.go +++ b/cmd/rpcdaemon/commands/send_transaction_test.go @@ -7,6 +7,8 @@ import ( "testing" "github.com/holiman/uint256" + "github.com/ledgerwatch/erigon-lib/gointerfaces/sentry" + "github.com/ledgerwatch/erigon-lib/gointerfaces/txpool" "github.com/ledgerwatch/erigon/cmd/rpcdaemon/commands" "github.com/ledgerwatch/erigon/cmd/rpcdaemon/filters" "github.com/ledgerwatch/erigon/cmd/rpcdaemon/rpcdaemontest" @@ -16,8 +18,6 @@ import ( "github.com/ledgerwatch/erigon/core/types" "github.com/ledgerwatch/erigon/eth/protocols/eth" "github.com/ledgerwatch/erigon/ethdb/remote/remotedbserver" - "github.com/ledgerwatch/erigon/gointerfaces/sentry" - "github.com/ledgerwatch/erigon/gointerfaces/txpool" "github.com/ledgerwatch/erigon/params" "github.com/ledgerwatch/erigon/rlp" "github.com/ledgerwatch/erigon/turbo/stages" diff --git a/cmd/rpcdaemon/commands/txpool_api.go b/cmd/rpcdaemon/commands/txpool_api.go index 1453c1c0f4..bc6d8f39a0 100644 --- a/cmd/rpcdaemon/commands/txpool_api.go +++ b/cmd/rpcdaemon/commands/txpool_api.go @@ -5,10 +5,10 @@ import ( "context" "fmt" + proto_txpool "github.com/ledgerwatch/erigon-lib/gointerfaces/txpool" "github.com/ledgerwatch/erigon/common" "github.com/ledgerwatch/erigon/core/types" "github.com/ledgerwatch/erigon/ethdb" - proto_txpool "github.com/ledgerwatch/erigon/gointerfaces/txpool" "github.com/ledgerwatch/erigon/rlp" ) diff --git a/cmd/rpcdaemon/commands/txpool_api_test.go b/cmd/rpcdaemon/commands/txpool_api_test.go index da7287fec7..62a6010a11 100644 --- a/cmd/rpcdaemon/commands/txpool_api_test.go +++ b/cmd/rpcdaemon/commands/txpool_api_test.go @@ -6,6 +6,8 @@ import ( "testing" "github.com/holiman/uint256" + "github.com/ledgerwatch/erigon-lib/gointerfaces/sentry" + "github.com/ledgerwatch/erigon-lib/gointerfaces/txpool" "github.com/ledgerwatch/erigon/cmd/rpcdaemon/filters" "github.com/ledgerwatch/erigon/cmd/rpcdaemon/rpcdaemontest" "github.com/ledgerwatch/erigon/common" @@ -14,8 +16,6 @@ import ( "github.com/ledgerwatch/erigon/core/types" "github.com/ledgerwatch/erigon/eth/protocols/eth" "github.com/ledgerwatch/erigon/ethdb/remote/remotedbserver" - "github.com/ledgerwatch/erigon/gointerfaces/sentry" - "github.com/ledgerwatch/erigon/gointerfaces/txpool" "github.com/ledgerwatch/erigon/params" "github.com/ledgerwatch/erigon/rlp" "github.com/ledgerwatch/erigon/turbo/stages" diff --git a/cmd/rpcdaemon/filters/filters.go b/cmd/rpcdaemon/filters/filters.go index f7535d60c8..bef86f75ce 100644 --- a/cmd/rpcdaemon/filters/filters.go +++ b/cmd/rpcdaemon/filters/filters.go @@ -10,10 +10,10 @@ import ( "sync" "time" + "github.com/ledgerwatch/erigon-lib/gointerfaces/remote" + "github.com/ledgerwatch/erigon-lib/gointerfaces/txpool" "github.com/ledgerwatch/erigon/cmd/rpcdaemon/services" "github.com/ledgerwatch/erigon/core/types" - "github.com/ledgerwatch/erigon/gointerfaces/remote" - "github.com/ledgerwatch/erigon/gointerfaces/txpool" "github.com/ledgerwatch/erigon/log" "github.com/ledgerwatch/erigon/rlp" "google.golang.org/grpc" diff --git a/cmd/rpcdaemon/rpcdaemontest/test_util.go b/cmd/rpcdaemon/rpcdaemontest/test_util.go index 671bf62c21..7ee937f5b7 100644 --- a/cmd/rpcdaemon/rpcdaemontest/test_util.go +++ b/cmd/rpcdaemon/rpcdaemontest/test_util.go @@ -8,6 +8,7 @@ import ( "testing" "github.com/holiman/uint256" + "github.com/ledgerwatch/erigon-lib/gointerfaces/txpool" "github.com/ledgerwatch/erigon/accounts/abi/bind" "github.com/ledgerwatch/erigon/accounts/abi/bind/backends" "github.com/ledgerwatch/erigon/cmd/rpcdaemon/commands/contracts" @@ -18,7 +19,6 @@ import ( "github.com/ledgerwatch/erigon/crypto" "github.com/ledgerwatch/erigon/ethdb" "github.com/ledgerwatch/erigon/ethdb/remote/remotedbserver" - "github.com/ledgerwatch/erigon/gointerfaces/txpool" "github.com/ledgerwatch/erigon/params" "github.com/ledgerwatch/erigon/turbo/stages" "google.golang.org/grpc" diff --git a/cmd/rpcdaemon/services/eth_backend.go b/cmd/rpcdaemon/services/eth_backend.go index 4707283dd7..4fabf30fb0 100644 --- a/cmd/rpcdaemon/services/eth_backend.go +++ b/cmd/rpcdaemon/services/eth_backend.go @@ -6,10 +6,10 @@ import ( "fmt" "io" + "github.com/ledgerwatch/erigon-lib/gointerfaces" + "github.com/ledgerwatch/erigon-lib/gointerfaces/remote" "github.com/ledgerwatch/erigon/common" "github.com/ledgerwatch/erigon/ethdb/remote/remotedbserver" - "github.com/ledgerwatch/erigon/gointerfaces" - "github.com/ledgerwatch/erigon/gointerfaces/remote" "github.com/ledgerwatch/erigon/log" "google.golang.org/grpc" "google.golang.org/grpc/status" diff --git a/cmd/rpcdaemon/services/eth_mining.go b/cmd/rpcdaemon/services/eth_mining.go index 5d5407ea4e..3f4ee155e0 100644 --- a/cmd/rpcdaemon/services/eth_mining.go +++ b/cmd/rpcdaemon/services/eth_mining.go @@ -4,9 +4,9 @@ import ( "context" "fmt" + "github.com/ledgerwatch/erigon-lib/gointerfaces" + "github.com/ledgerwatch/erigon-lib/gointerfaces/txpool" "github.com/ledgerwatch/erigon/ethdb/remote/remotedbserver" - "github.com/ledgerwatch/erigon/gointerfaces" - "github.com/ledgerwatch/erigon/gointerfaces/txpool" "github.com/ledgerwatch/erigon/log" "google.golang.org/grpc" "google.golang.org/protobuf/types/known/emptypb" diff --git a/cmd/rpcdaemon/services/eth_txpool.go b/cmd/rpcdaemon/services/eth_txpool.go index fb12583b74..d0cd93070b 100644 --- a/cmd/rpcdaemon/services/eth_txpool.go +++ b/cmd/rpcdaemon/services/eth_txpool.go @@ -4,9 +4,9 @@ import ( "context" "fmt" + "github.com/ledgerwatch/erigon-lib/gointerfaces" + "github.com/ledgerwatch/erigon-lib/gointerfaces/txpool" "github.com/ledgerwatch/erigon/ethdb/remote/remotedbserver" - "github.com/ledgerwatch/erigon/gointerfaces" - "github.com/ledgerwatch/erigon/gointerfaces/txpool" "github.com/ledgerwatch/erigon/log" "google.golang.org/grpc" "google.golang.org/protobuf/types/known/emptypb" diff --git a/cmd/sentry/download/broadcast.go b/cmd/sentry/download/broadcast.go index 4e0e8af9a3..693db00190 100644 --- a/cmd/sentry/download/broadcast.go +++ b/cmd/sentry/download/broadcast.go @@ -4,10 +4,10 @@ import ( "context" "math/big" + proto_sentry "github.com/ledgerwatch/erigon-lib/gointerfaces/sentry" "github.com/ledgerwatch/erigon/common" "github.com/ledgerwatch/erigon/core/types" "github.com/ledgerwatch/erigon/eth/protocols/eth" - proto_sentry "github.com/ledgerwatch/erigon/gointerfaces/sentry" "github.com/ledgerwatch/erigon/log" "github.com/ledgerwatch/erigon/rlp" "github.com/ledgerwatch/erigon/turbo/stages/headerdownload" diff --git a/cmd/sentry/download/downloader.go b/cmd/sentry/download/downloader.go index faff0e899e..7478e3b84f 100644 --- a/cmd/sentry/download/downloader.go +++ b/cmd/sentry/download/downloader.go @@ -12,14 +12,14 @@ import ( "github.com/c2h5oh/datasize" "github.com/holiman/uint256" + "github.com/ledgerwatch/erigon-lib/gointerfaces" + proto_sentry "github.com/ledgerwatch/erigon-lib/gointerfaces/sentry" "github.com/ledgerwatch/erigon/common" debug2 "github.com/ledgerwatch/erigon/common/debug" "github.com/ledgerwatch/erigon/consensus" "github.com/ledgerwatch/erigon/core/forkid" "github.com/ledgerwatch/erigon/eth/protocols/eth" "github.com/ledgerwatch/erigon/ethdb" - "github.com/ledgerwatch/erigon/gointerfaces" - proto_sentry "github.com/ledgerwatch/erigon/gointerfaces/sentry" "github.com/ledgerwatch/erigon/log" "github.com/ledgerwatch/erigon/params" "github.com/ledgerwatch/erigon/rlp" diff --git a/cmd/sentry/download/sentry.go b/cmd/sentry/download/sentry.go index 26a6611084..c5bec9189f 100644 --- a/cmd/sentry/download/sentry.go +++ b/cmd/sentry/download/sentry.go @@ -21,13 +21,13 @@ import ( grpc_recovery "github.com/grpc-ecosystem/go-grpc-middleware/recovery" grpc_prometheus "github.com/grpc-ecosystem/go-grpc-prometheus" "github.com/holiman/uint256" + "github.com/ledgerwatch/erigon-lib/gointerfaces" + proto_sentry "github.com/ledgerwatch/erigon-lib/gointerfaces/sentry" + proto_types "github.com/ledgerwatch/erigon-lib/gointerfaces/types" "github.com/ledgerwatch/erigon/common" "github.com/ledgerwatch/erigon/common/debug" "github.com/ledgerwatch/erigon/core/forkid" "github.com/ledgerwatch/erigon/eth/protocols/eth" - "github.com/ledgerwatch/erigon/gointerfaces" - proto_sentry "github.com/ledgerwatch/erigon/gointerfaces/sentry" - proto_types "github.com/ledgerwatch/erigon/gointerfaces/types" "github.com/ledgerwatch/erigon/log" "github.com/ledgerwatch/erigon/metrics" "github.com/ledgerwatch/erigon/p2p" diff --git a/cmd/sentry/download/sentry_api.go b/cmd/sentry/download/sentry_api.go index 2d05dab931..aaacc1c1c4 100644 --- a/cmd/sentry/download/sentry_api.go +++ b/cmd/sentry/download/sentry_api.go @@ -5,10 +5,10 @@ import ( "math/rand" "github.com/holiman/uint256" + "github.com/ledgerwatch/erigon-lib/gointerfaces" + proto_sentry "github.com/ledgerwatch/erigon-lib/gointerfaces/sentry" "github.com/ledgerwatch/erigon/common" "github.com/ledgerwatch/erigon/eth/protocols/eth" - "github.com/ledgerwatch/erigon/gointerfaces" - proto_sentry "github.com/ledgerwatch/erigon/gointerfaces/sentry" "github.com/ledgerwatch/erigon/log" "github.com/ledgerwatch/erigon/rlp" "github.com/ledgerwatch/erigon/turbo/stages/bodydownload" diff --git a/cmd/sentry/download/sentry_test.go b/cmd/sentry/download/sentry_test.go index 44151c4d06..a5663d790e 100644 --- a/cmd/sentry/download/sentry_test.go +++ b/cmd/sentry/download/sentry_test.go @@ -7,6 +7,8 @@ import ( "time" "github.com/holiman/uint256" + "github.com/ledgerwatch/erigon-lib/gointerfaces" + proto_sentry "github.com/ledgerwatch/erigon-lib/gointerfaces/sentry" "github.com/ledgerwatch/erigon/common" "github.com/ledgerwatch/erigon/core" "github.com/ledgerwatch/erigon/core/forkid" @@ -14,8 +16,6 @@ import ( "github.com/ledgerwatch/erigon/eth/protocols/eth" "github.com/ledgerwatch/erigon/ethdb" "github.com/ledgerwatch/erigon/ethdb/kv" - "github.com/ledgerwatch/erigon/gointerfaces" - proto_sentry "github.com/ledgerwatch/erigon/gointerfaces/sentry" "github.com/ledgerwatch/erigon/p2p" "github.com/ledgerwatch/erigon/params" "github.com/stretchr/testify/require" diff --git a/common/dbutils/bucket.go b/common/dbutils/bucket.go index 9a8f540d7e..e19938ad35 100644 --- a/common/dbutils/bucket.go +++ b/common/dbutils/bucket.go @@ -4,7 +4,7 @@ import ( "sort" "strings" - "github.com/ledgerwatch/erigon/gointerfaces/types" + "github.com/ledgerwatch/erigon-lib/gointerfaces/types" ) // DBSchemaVersion diff --git a/eth/backend.go b/eth/backend.go index cbf78bbc05..a8611889c0 100644 --- a/eth/backend.go +++ b/eth/backend.go @@ -32,6 +32,7 @@ import ( "time" "github.com/holiman/uint256" + "github.com/ledgerwatch/erigon-lib/gointerfaces/sentry" "github.com/ledgerwatch/erigon/cmd/sentry/download" "github.com/ledgerwatch/erigon/common" "github.com/ledgerwatch/erigon/common/dbutils" @@ -53,7 +54,6 @@ import ( "github.com/ledgerwatch/erigon/eth/stagedsync/stages" "github.com/ledgerwatch/erigon/ethdb" "github.com/ledgerwatch/erigon/ethdb/remote/remotedbserver" - "github.com/ledgerwatch/erigon/gointerfaces/sentry" "github.com/ledgerwatch/erigon/log" "github.com/ledgerwatch/erigon/node" "github.com/ledgerwatch/erigon/p2p" diff --git a/eth/protocols/eth/handler_test.go b/eth/protocols/eth/handler_test.go index 8081da62cb..f9a59b4cc1 100644 --- a/eth/protocols/eth/handler_test.go +++ b/eth/protocols/eth/handler_test.go @@ -24,6 +24,7 @@ import ( "testing" "github.com/holiman/uint256" + "github.com/ledgerwatch/erigon-lib/gointerfaces/sentry" "github.com/ledgerwatch/erigon/common" "github.com/ledgerwatch/erigon/core" "github.com/ledgerwatch/erigon/core/rawdb" @@ -32,7 +33,6 @@ import ( "github.com/ledgerwatch/erigon/eth/protocols/eth" "github.com/ledgerwatch/erigon/ethdb" "github.com/ledgerwatch/erigon/ethdb/kv" - "github.com/ledgerwatch/erigon/gointerfaces/sentry" "github.com/ledgerwatch/erigon/p2p" "github.com/ledgerwatch/erigon/p2p/enode" "github.com/ledgerwatch/erigon/params" diff --git a/eth/protocols/eth/protocol.go b/eth/protocols/eth/protocol.go index d8b1e47c19..7ce8bee56f 100644 --- a/eth/protocols/eth/protocol.go +++ b/eth/protocols/eth/protocol.go @@ -24,10 +24,10 @@ import ( "math/big" "math/bits" + proto_sentry "github.com/ledgerwatch/erigon-lib/gointerfaces/sentry" "github.com/ledgerwatch/erigon/common" "github.com/ledgerwatch/erigon/core/forkid" "github.com/ledgerwatch/erigon/core/types" - proto_sentry "github.com/ledgerwatch/erigon/gointerfaces/sentry" "github.com/ledgerwatch/erigon/rlp" ) diff --git a/ethdb/kv/kv_abstract_test.go b/ethdb/kv/kv_abstract_test.go index d153970a04..5a314875d2 100644 --- a/ethdb/kv/kv_abstract_test.go +++ b/ethdb/kv/kv_abstract_test.go @@ -7,12 +7,12 @@ import ( "testing" "time" + "github.com/ledgerwatch/erigon-lib/gointerfaces" + "github.com/ledgerwatch/erigon-lib/gointerfaces/remote" "github.com/ledgerwatch/erigon/common/dbutils" "github.com/ledgerwatch/erigon/ethdb" "github.com/ledgerwatch/erigon/ethdb/kv" "github.com/ledgerwatch/erigon/ethdb/remote/remotedbserver" - "github.com/ledgerwatch/erigon/gointerfaces" - "github.com/ledgerwatch/erigon/gointerfaces/remote" "github.com/ledgerwatch/erigon/log" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" diff --git a/ethdb/kv/kv_remote.go b/ethdb/kv/kv_remote.go index 6487d9cb2a..0f0a69f92b 100644 --- a/ethdb/kv/kv_remote.go +++ b/ethdb/kv/kv_remote.go @@ -14,10 +14,10 @@ import ( "unsafe" "github.com/c2h5oh/datasize" + "github.com/ledgerwatch/erigon-lib/gointerfaces" + "github.com/ledgerwatch/erigon-lib/gointerfaces/remote" "github.com/ledgerwatch/erigon/common/dbutils" "github.com/ledgerwatch/erigon/ethdb" - "github.com/ledgerwatch/erigon/gointerfaces" - "github.com/ledgerwatch/erigon/gointerfaces/remote" "github.com/ledgerwatch/erigon/log" "google.golang.org/grpc" "google.golang.org/grpc/backoff" diff --git a/ethdb/remote/remotedbserver/ethbackend.go b/ethdb/remote/remotedbserver/ethbackend.go index 049434d88a..0ea64b8f9a 100644 --- a/ethdb/remote/remotedbserver/ethbackend.go +++ b/ethdb/remote/remotedbserver/ethbackend.go @@ -4,11 +4,11 @@ import ( "bytes" "context" + "github.com/ledgerwatch/erigon-lib/gointerfaces" + "github.com/ledgerwatch/erigon-lib/gointerfaces/remote" + types2 "github.com/ledgerwatch/erigon-lib/gointerfaces/types" "github.com/ledgerwatch/erigon/common" "github.com/ledgerwatch/erigon/core/types" - "github.com/ledgerwatch/erigon/gointerfaces" - "github.com/ledgerwatch/erigon/gointerfaces/remote" - types2 "github.com/ledgerwatch/erigon/gointerfaces/types" "github.com/ledgerwatch/erigon/log" "github.com/ledgerwatch/erigon/params" "github.com/ledgerwatch/erigon/rlp" diff --git a/ethdb/remote/remotedbserver/mining.go b/ethdb/remote/remotedbserver/mining.go index 2959b34595..8154b29547 100644 --- a/ethdb/remote/remotedbserver/mining.go +++ b/ethdb/remote/remotedbserver/mining.go @@ -6,12 +6,12 @@ import ( "errors" "sync" + proto_txpool "github.com/ledgerwatch/erigon-lib/gointerfaces/txpool" + types2 "github.com/ledgerwatch/erigon-lib/gointerfaces/types" "github.com/ledgerwatch/erigon/common" "github.com/ledgerwatch/erigon/common/hexutil" "github.com/ledgerwatch/erigon/consensus/ethash" "github.com/ledgerwatch/erigon/core/types" - proto_txpool "github.com/ledgerwatch/erigon/gointerfaces/txpool" - types2 "github.com/ledgerwatch/erigon/gointerfaces/types" "github.com/ledgerwatch/erigon/log" "github.com/ledgerwatch/erigon/rlp" "google.golang.org/protobuf/types/known/emptypb" diff --git a/ethdb/remote/remotedbserver/server.go b/ethdb/remote/remotedbserver/server.go index c25df382ff..07f499b1d0 100644 --- a/ethdb/remote/remotedbserver/server.go +++ b/ethdb/remote/remotedbserver/server.go @@ -10,12 +10,12 @@ import ( grpc_middleware "github.com/grpc-ecosystem/go-grpc-middleware" grpc_recovery "github.com/grpc-ecosystem/go-grpc-middleware/recovery" grpc_prometheus "github.com/grpc-ecosystem/go-grpc-prometheus" + "github.com/ledgerwatch/erigon-lib/gointerfaces/remote" + "github.com/ledgerwatch/erigon-lib/gointerfaces/txpool" + "github.com/ledgerwatch/erigon-lib/gointerfaces/types" "github.com/ledgerwatch/erigon/common" "github.com/ledgerwatch/erigon/common/dbutils" "github.com/ledgerwatch/erigon/ethdb" - "github.com/ledgerwatch/erigon/gointerfaces/remote" - "github.com/ledgerwatch/erigon/gointerfaces/txpool" - "github.com/ledgerwatch/erigon/gointerfaces/types" "github.com/ledgerwatch/erigon/log" "github.com/ledgerwatch/erigon/metrics" "google.golang.org/grpc" diff --git a/ethdb/remote/remotedbserver/txpool.go b/ethdb/remote/remotedbserver/txpool.go index d1ef82ad31..c8ea239c0b 100644 --- a/ethdb/remote/remotedbserver/txpool.go +++ b/ethdb/remote/remotedbserver/txpool.go @@ -5,13 +5,13 @@ import ( "context" "fmt" + "github.com/ledgerwatch/erigon-lib/gointerfaces" + proto_txpool "github.com/ledgerwatch/erigon-lib/gointerfaces/txpool" + types2 "github.com/ledgerwatch/erigon-lib/gointerfaces/types" "github.com/ledgerwatch/erigon/common" "github.com/ledgerwatch/erigon/core" "github.com/ledgerwatch/erigon/core/types" "github.com/ledgerwatch/erigon/event" - "github.com/ledgerwatch/erigon/gointerfaces" - proto_txpool "github.com/ledgerwatch/erigon/gointerfaces/txpool" - types2 "github.com/ledgerwatch/erigon/gointerfaces/types" "github.com/ledgerwatch/erigon/log" "github.com/ledgerwatch/erigon/rlp" "google.golang.org/protobuf/types/known/emptypb" diff --git a/go.mod b/go.mod index 00672add7f..fbf516dd2b 100644 --- a/go.mod +++ b/go.mod @@ -41,7 +41,7 @@ require ( github.com/json-iterator/go v1.1.11 github.com/julienschmidt/httprouter v1.3.0 github.com/kevinburke/go-bindata v3.21.0+incompatible - github.com/ledgerwatch/erigon-lib v0.0.0-20210626115532-b71c118e1758 + github.com/ledgerwatch/erigon-lib v0.0.0-20210701162843-a58e7da26f29 github.com/ledgerwatch/secp256k1 v0.0.0-20210626115225-cd5cd00ed72d github.com/logrusorgru/aurora v2.0.3+incompatible github.com/mattn/go-colorable v0.1.7 @@ -67,9 +67,9 @@ require ( golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1 golang.org/x/time v0.0.0-20201208040808-7e3f01d25324 golang.org/x/tools v0.0.0-20210106214847-113979e3529a - google.golang.org/grpc v1.37.1 + google.golang.org/grpc v1.39.0 google.golang.org/grpc/cmd/protoc-gen-go-grpc v1.1.0 - google.golang.org/protobuf v1.26.0 + google.golang.org/protobuf v1.27.1 gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15 gopkg.in/natefinch/npipe.v2 v2.0.0-20160621034901-c1b8fa8bdcce gopkg.in/olebedev/go-duktape.v3 v3.0.0-20200619000410-60c24ae608a6 diff --git a/go.sum b/go.sum index 5706650120..b0d8ab1bf5 100644 --- a/go.sum +++ b/go.sum @@ -187,6 +187,7 @@ github.com/anacrolix/utp v0.0.0-20180219060659-9e0e1d1d0572/go.mod h1:MDwc+vsGEq github.com/anacrolix/utp v0.1.0 h1:FOpQOmIwYsnENnz7tAGohA+r6iXpRjrq8ssKSre2Cp4= github.com/anacrolix/utp v0.1.0/go.mod h1:MDwc+vsGEq7RMw6lr2GKOEqjWny5hO5OZXRVNaBJ2Dk= github.com/anmitsu/go-shlex v0.0.0-20161002113705-648efa622239/go.mod h1:2FmKhYUyUczH0OGQWaF5ceTx0UBShxjsH6f8oGKYe2c= +github.com/antihax/optional v1.0.0/go.mod h1:uupD/76wgC+ih3iEmQUL+0Ugr19nfwCT1kdvxnR2qWY= github.com/apache/thrift v0.12.0/go.mod h1:cp2SuWMxlEZw2r+iP2GNCdIi4C1qmUzdZFSVb+bacwQ= github.com/apache/thrift v0.13.0/go.mod h1:cp2SuWMxlEZw2r+iP2GNCdIi4C1qmUzdZFSVb+bacwQ= github.com/aristanetworks/goarista v0.0.0-20170210015632-ea17b1a17847/go.mod h1:D/tb0zPVXnP7fmsLZjtdUhSsumbK/ij54UXjjVgMGxQ= @@ -256,6 +257,7 @@ github.com/cloudflare/cloudflare-go v0.13.2/go.mod h1:27kfc1apuifUmJhp069y0+hwlK 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= +github.com/cncf/xds/go v0.0.0-20210312221358-fbca930ec8ed/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= github.com/cockroachdb/apd v1.1.0/go.mod h1:8Sl8LxpKi29FqWXR16WEFZRNSz3SoPzUzeMeY4+DwBQ= github.com/cockroachdb/datadriven v0.0.0-20190809214429-80d97fb3cbaa/go.mod h1:zn76sxSg3SzpJ0PPJaLDCu+Bu0Lg3sKTORVIj19EIF8= github.com/codahale/hdrhistogram v0.0.0-20161010025455-3a0bb77429bd/go.mod h1:sE/e/2PUdi/liOCUjSTXgM1o87ZssimdTWN964YiIeI= @@ -316,7 +318,8 @@ github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymF github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98= github.com/envoyproxy/go-control-plane v0.9.7/go.mod h1:cwu0lG7PUMfa9snN8LXBig5ynNVH9qI8YYLbd1fK2po= -github.com/envoyproxy/go-control-plane v0.9.9-0.20210217033140-668b12f5399d/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk= +github.com/envoyproxy/go-control-plane v0.9.9-0.20201210154907-fd9021fe5dad/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk= +github.com/envoyproxy/go-control-plane v0.9.9-0.20210512163311-63b5d3c536b0/go.mod h1:hliV/p42l8fGbc6Y9bQ70uLwIvmJyVE5k4iMKlh8wCQ= github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= github.com/etcd-io/bbolt v1.3.3/go.mod h1:ZF2nL25h33cCyBtcyWeZ2/I3HQOfTP+0PIEvHjkjCrw= github.com/ethereum/go-ethereum v1.9.25/go.mod h1:vMkFiYLHI4tgPw4k2j4MHKoovchFE8plZ0M9VMk4/oM= @@ -488,6 +491,7 @@ github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0/go.mod h1:8NvIoxWQoOIhqOTXgf github.com/grpc-ecosystem/grpc-gateway v1.5.0/go.mod h1:RSKVYQBd5MCa4OVpNdGskqpgL2+G+NZTnrVHpWWfpdw= github.com/grpc-ecosystem/grpc-gateway v1.9.0/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY= github.com/grpc-ecosystem/grpc-gateway v1.9.5/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY= +github.com/grpc-ecosystem/grpc-gateway v1.16.0/go.mod h1:BDjrQk3hbvj6Nolgz8mAMFbcEtjT1g+wF4CSlocrBnw= github.com/hashicorp/consul/api v1.1.0/go.mod h1:VmuI/Lkw1nC05EYQWNKwWGbkg+FbDBtguAZLlVdkD9Q= github.com/hashicorp/consul/api v1.3.0/go.mod h1:MmDNSzIMUjNpY/mQ398R4bk2FnqQLoPndWW5VkKPlCE= github.com/hashicorp/consul/sdk v0.1.1/go.mod h1:VKf9jXwCTEY1QZP2MOLRhb5i/I/ssyNV1vwHyQBF0x8= @@ -633,8 +637,8 @@ github.com/kylelemons/godebug v1.1.0/go.mod h1:9/0rRGxNHcop5bhtWyNeEfOS8JIWk580+ github.com/leanovate/gopter v0.2.8/go.mod h1:gNcbPWNEWRe4lm+bycKqxUYoH5uoVje5SkOJ3uoLer8= github.com/leanovate/gopter v0.2.9 h1:fQjYxZaynp97ozCzfOyOuAGOU4aU/z37zf/tOujFk7c= github.com/leanovate/gopter v0.2.9/go.mod h1:U2L/78B+KVFIx2VmW6onHJQzXtFb+p5y3y2Sh+Jxxv8= -github.com/ledgerwatch/erigon-lib v0.0.0-20210626115532-b71c118e1758 h1:x3EJ/h5n2f7XGVBEJO2UtsyyKtSnlFXETijTPypolVE= -github.com/ledgerwatch/erigon-lib v0.0.0-20210626115532-b71c118e1758/go.mod h1:nrVFoWX5dK/VeV5h1fy9LPHveykqevMRoh1PHKgH7ow= +github.com/ledgerwatch/erigon-lib v0.0.0-20210701162843-a58e7da26f29 h1:qITgajvqFhBFsqmcE31u/90/ZKe0aFCJON2VgOrm96k= +github.com/ledgerwatch/erigon-lib v0.0.0-20210701162843-a58e7da26f29/go.mod h1:y8vIF0uAO6raqzgKZ5AILLXC+7gfr8nyRLbacmZrZ8Y= github.com/ledgerwatch/secp256k1 v0.0.0-20210626115225-cd5cd00ed72d h1:/IKMrJdfRsoYNc36PXqP4xMH3vhW/8IQyBKGQbKZUno= github.com/ledgerwatch/secp256k1 v0.0.0-20210626115225-cd5cd00ed72d/go.mod h1:SPmqJFciiF/Q0mPt2jVs2dTr/1TZBTIA+kPMmKgBAak= github.com/lib/pq v1.0.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo= @@ -874,6 +878,7 @@ github.com/prometheus/tsdb v0.10.0/go.mod h1:oi49uRhEe9dPUTlS3JRZOwJuVi6tmh10QSg github.com/rcrowley/go-metrics v0.0.0-20181016184325-3113b8401b8a/go.mod h1:bCqnVzQkZxMG4s8nGwiZ5l3QUCyqpo9Y+/ZMZ9VjZe4= github.com/rjeczalik/notify v0.9.1/go.mod h1:rKwnCoCGeuQnwBtTSPL9Dad03Vh2n40ePRrjvIXnJho= github.com/rogpeppe/fastuuid v0.0.0-20150106093220-6724a57986af/go.mod h1:XWv6SoW27p1b0cqNHllgS5HIMJraePCO15w5zCzIWYg= +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 v0.0.0-20160617231935-a62a804a8a00/go.mod h1:gFx+x8UowdsKA9AchylcLynDq+nNFfI8FkUZdN/jGCU= github.com/rs/cors v1.7.0 h1:+88SsELBHx5r+hZ8TCkggzSstaWNbDvThkVK8H6f9ik= @@ -988,8 +993,6 @@ github.com/tklauser/numcpus v0.2.1 h1:ct88eFm+Q7m2ZfXJdan1xYoXKlmwsfP+k88q05KvlZ github.com/tklauser/numcpus v0.2.1/go.mod h1:9aU+wOc6WjUIZEwWMP62PL/41d65P+iks1gBkr4QyP8= github.com/tmc/grpc-websocket-proxy v0.0.0-20170815181823-89b8d40f7ca8/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U= github.com/tmc/grpc-websocket-proxy v0.0.0-20190109142713-0ad062ec5ee5/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U= -github.com/torquem-ch/mdbx-go v0.13.0 h1:+QSPxgDKXgv/5SlSXFgmM5OVL1KOB25y7j2U09wLsXg= -github.com/torquem-ch/mdbx-go v0.13.0/go.mod h1:T2fsoJDVppxfAPTLd1svUgH1kpPmeXdPESmroSHcL1E= github.com/torquem-ch/mdbx-go v0.14.0 h1:iFwLOOGUZVhVWu1zqH7W1k2nLEJFW9zrdHNnkwLjMvE= github.com/torquem-ch/mdbx-go v0.14.0/go.mod h1:T2fsoJDVppxfAPTLd1svUgH1kpPmeXdPESmroSHcL1E= github.com/ttacon/chalk v0.0.0-20160626202418-22c06c80ed31/go.mod h1:onvgF043R+lC5RZ8IT9rBXDaEDnpnw/Cl+HFiw+v/7Q= @@ -1040,6 +1043,7 @@ go.opencensus.io v0.22.0/go.mod h1:+kGneAE2xo2IficOXnaByMWTGM9T73dGwxeWcUqIpI8= go.opencensus.io v0.22.2/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= go.opencensus.io v0.22.3/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= go.opencensus.io v0.22.4/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= +go.opentelemetry.io/proto/otlp v0.7.0/go.mod h1:PqfVotwruBrMGOCsRd/89rSnXhoiJIqeYNgFYFoEGnI= 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= @@ -1398,6 +1402,7 @@ google.golang.org/genproto v0.0.0-20200331122359-1ee6d9798940/go.mod h1:55QSHmfG google.golang.org/genproto v0.0.0-20200423170343-7949de9c1215/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= google.golang.org/genproto v0.0.0-20200430143042-b979b6f78d84/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= google.golang.org/genproto v0.0.0-20200511104702-f5ebc3bea380/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200513103714-09dca8ec2884/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= google.golang.org/genproto v0.0.0-20200515170657-fc4c6c6a6587/go.mod h1:YsZOwe1myG/8QRHRsmBRE1LrgQY60beZKjly0O1fX9U= google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo= google.golang.org/genproto v0.0.0-20200618031413-b414f8b61790/go.mod h1:jDfRM7FcilCzHH/e9qn6dsT145K34l5v+OpcnNgKAAA= @@ -1424,9 +1429,11 @@ google.golang.org/grpc v1.28.0/go.mod h1:rpkK4SK4GF4Ach/+MFLZUBavHOvF2JJB5uozKKa google.golang.org/grpc v1.29.1/go.mod h1:itym6AZVZYACWQqET3MqgPpjcuV5QH3BxFS3IjizoKk= google.golang.org/grpc v1.30.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= google.golang.org/grpc v1.31.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= +google.golang.org/grpc v1.33.1/go.mod h1:fr5YgcSWrqhRRxogOsw7RzIpsmvOZ6IcH4kBYTpR3n0= google.golang.org/grpc v1.34.0/go.mod h1:WotjhfgOW/POjDeRt8vscBtXq+2VjORFy659qA51WJ8= -google.golang.org/grpc v1.37.1 h1:ARnQJNWxGyYJpdf/JXscNlQr/uv607ZPU9Z7ogHi+iI= -google.golang.org/grpc v1.37.1/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM= +google.golang.org/grpc v1.36.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= +google.golang.org/grpc v1.39.0 h1:Klz8I9kdtkIN6EpHHUOMLCYhTn/2WAe5a0s1hcBkdTI= +google.golang.org/grpc v1.39.0/go.mod h1:PImNr+rS9TWYb2O4/emRugxiyHZ5JyHW5F+RPnDzfrE= google.golang.org/grpc/cmd/protoc-gen-go-grpc v1.1.0 h1:M1YKkFIboKNieVO5DLUEVzQfGwJD30Nv2jfUgzb5UcE= google.golang.org/grpc/cmd/protoc-gen-go-grpc v1.1.0/go.mod h1:6Kw0yEErY5E/yWrBtf03jp27GLLJujG4z/JK95pnjjw= google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= @@ -1440,8 +1447,9 @@ google.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpAD google.golang.org/protobuf v1.24.0/go.mod h1:r/3tXBNzIEhYS9I1OUVjXDlt8tc493IdKGjtUeSXeh4= 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 h1:bxAC2xTBsZGibn2RTntX0oH50xLsqy1OxA9tTL3p/lk= 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= gopkg.in/DataDog/dd-trace-go.v1 v1.27.1/go.mod h1:Sp1lku8WJMvNV0kjDI4Ni/T7J/U3BO5ct5kEaoVU8+I= 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= @@ -1467,6 +1475,7 @@ gopkg.in/warnings.v0 v0.1.2/go.mod h1:jksf8JmL6Qr/oQM2OXTHunEvvTAsrWBLb6OOjuVWRN gopkg.in/yaml.v2 v2.0.0-20170812160011-eb3733d160e7/go.mod h1:JAlM8MvJe8wmxCU4Bli9HhUf9+ttbYbLASfIpnQbh74= 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= gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.5/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.7/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= diff --git a/gointerfaces/consensus/consensus.pb.go b/gointerfaces/consensus/consensus.pb.go deleted file mode 100644 index 96eb1b3ddf..0000000000 --- a/gointerfaces/consensus/consensus.pb.go +++ /dev/null @@ -1,2078 +0,0 @@ -// Code generated by protoc-gen-go. DO NOT EDIT. -// versions: -// protoc-gen-go v1.26.0 -// protoc v3.17.3 -// source: consensus_engine/consensus.proto - -package consensus - -import ( - types "github.com/ledgerwatch/erigon/gointerfaces/types" - protoreflect "google.golang.org/protobuf/reflect/protoreflect" - protoimpl "google.golang.org/protobuf/runtime/protoimpl" - emptypb "google.golang.org/protobuf/types/known/emptypb" - reflect "reflect" - sync "sync" -) - -const ( - // Verify that this generated code is sufficiently up-to-date. - _ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion) - // Verify that runtime/protoimpl is sufficiently up-to-date. - _ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20) -) - -type ChainSpecMessage struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - Mechanism string `protobuf:"bytes,1,opt,name=mechanism,proto3" json:"mechanism,omitempty"` // Name of consensus mechanism, e.g. ethash, clique, aura - MechanismConfig []byte `protobuf:"bytes,2,opt,name=mechanism_config,json=mechanismConfig,proto3" json:"mechanism_config,omitempty"` // Configuration of specific consensus mechanism - format is specific to the mechanism - Genesis *Genesis `protobuf:"bytes,3,opt,name=genesis,proto3" json:"genesis,omitempty"` // Description of genesis block - Forks []*Fork `protobuf:"bytes,4,rep,name=forks,proto3" json:"forks,omitempty"` // Description of forks (upgrades) -} - -func (x *ChainSpecMessage) Reset() { - *x = ChainSpecMessage{} - if protoimpl.UnsafeEnabled { - mi := &file_consensus_engine_consensus_proto_msgTypes[0] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *ChainSpecMessage) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*ChainSpecMessage) ProtoMessage() {} - -func (x *ChainSpecMessage) ProtoReflect() protoreflect.Message { - mi := &file_consensus_engine_consensus_proto_msgTypes[0] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use ChainSpecMessage.ProtoReflect.Descriptor instead. -func (*ChainSpecMessage) Descriptor() ([]byte, []int) { - return file_consensus_engine_consensus_proto_rawDescGZIP(), []int{0} -} - -func (x *ChainSpecMessage) GetMechanism() string { - if x != nil { - return x.Mechanism - } - return "" -} - -func (x *ChainSpecMessage) GetMechanismConfig() []byte { - if x != nil { - return x.MechanismConfig - } - return nil -} - -func (x *ChainSpecMessage) GetGenesis() *Genesis { - if x != nil { - return x.Genesis - } - return nil -} - -func (x *ChainSpecMessage) GetForks() []*Fork { - if x != nil { - return x.Forks - } - return nil -} - -type Genesis struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - ChainId *types.H256 `protobuf:"bytes,1,opt,name=chain_id,json=chainId,proto3" json:"chain_id,omitempty"` // Chain id starting from genesis block and until the first fork - Template *Template `protobuf:"bytes,2,opt,name=template,proto3" json:"template,omitempty"` // Genesis header without values like "uncle hash", "tx hash" and "state root" calculated -} - -func (x *Genesis) Reset() { - *x = Genesis{} - if protoimpl.UnsafeEnabled { - mi := &file_consensus_engine_consensus_proto_msgTypes[1] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *Genesis) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*Genesis) ProtoMessage() {} - -func (x *Genesis) ProtoReflect() protoreflect.Message { - mi := &file_consensus_engine_consensus_proto_msgTypes[1] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use Genesis.ProtoReflect.Descriptor instead. -func (*Genesis) Descriptor() ([]byte, []int) { - return file_consensus_engine_consensus_proto_rawDescGZIP(), []int{1} -} - -func (x *Genesis) GetChainId() *types.H256 { - if x != nil { - return x.ChainId - } - return nil -} - -func (x *Genesis) GetTemplate() *Template { - if x != nil { - return x.Template - } - return nil -} - -type Fork struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` // Code name of the fork - Number uint64 `protobuf:"varint,2,opt,name=number,proto3" json:"number,omitempty"` // First block number at which rules of the fork activate - ChainId *types.H256 `protobuf:"bytes,3,opt,name=chain_id,json=chainId,proto3" json:"chain_id,omitempty"` // Chain id starting from this fork until the next fork -} - -func (x *Fork) Reset() { - *x = Fork{} - if protoimpl.UnsafeEnabled { - mi := &file_consensus_engine_consensus_proto_msgTypes[2] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *Fork) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*Fork) ProtoMessage() {} - -func (x *Fork) ProtoReflect() protoreflect.Message { - mi := &file_consensus_engine_consensus_proto_msgTypes[2] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use Fork.ProtoReflect.Descriptor instead. -func (*Fork) Descriptor() ([]byte, []int) { - return file_consensus_engine_consensus_proto_rawDescGZIP(), []int{2} -} - -func (x *Fork) GetName() string { - if x != nil { - return x.Name - } - return "" -} - -func (x *Fork) GetNumber() uint64 { - if x != nil { - return x.Number - } - return 0 -} - -func (x *Fork) GetChainId() *types.H256 { - if x != nil { - return x.ChainId - } - return nil -} - -type Error struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - Code uint32 `protobuf:"varint,1,opt,name=code,proto3" json:"code,omitempty"` - Description string `protobuf:"bytes,2,opt,name=description,proto3" json:"description,omitempty"` -} - -func (x *Error) Reset() { - *x = Error{} - if protoimpl.UnsafeEnabled { - mi := &file_consensus_engine_consensus_proto_msgTypes[3] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *Error) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*Error) ProtoMessage() {} - -func (x *Error) ProtoReflect() protoreflect.Message { - mi := &file_consensus_engine_consensus_proto_msgTypes[3] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use Error.ProtoReflect.Descriptor instead. -func (*Error) Descriptor() ([]byte, []int) { - return file_consensus_engine_consensus_proto_rawDescGZIP(), []int{3} -} - -func (x *Error) GetCode() uint32 { - if x != nil { - return x.Code - } - return 0 -} - -func (x *Error) GetDescription() string { - if x != nil { - return x.Description - } - return "" -} - -type Result struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - Ok bool `protobuf:"varint,1,opt,name=ok,proto3" json:"ok,omitempty"` - Error *Error `protobuf:"bytes,2,opt,name=error,proto3,oneof" json:"error,omitempty"` -} - -func (x *Result) Reset() { - *x = Result{} - if protoimpl.UnsafeEnabled { - mi := &file_consensus_engine_consensus_proto_msgTypes[4] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *Result) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*Result) ProtoMessage() {} - -func (x *Result) ProtoReflect() protoreflect.Message { - mi := &file_consensus_engine_consensus_proto_msgTypes[4] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use Result.ProtoReflect.Descriptor instead. -func (*Result) Descriptor() ([]byte, []int) { - return file_consensus_engine_consensus_proto_rawDescGZIP(), []int{4} -} - -func (x *Result) GetOk() bool { - if x != nil { - return x.Ok - } - return false -} - -func (x *Result) GetError() *Error { - if x != nil { - return x.Error - } - return nil -} - -type Template struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - ParentHash *types.H256 `protobuf:"bytes,1,opt,name=parent_hash,json=parentHash,proto3" json:"parent_hash,omitempty"` - Coinbase *types.H160 `protobuf:"bytes,2,opt,name=coinbase,proto3" json:"coinbase,omitempty"` - Difficulty *types.H256 `protobuf:"bytes,3,opt,name=difficulty,proto3" json:"difficulty,omitempty"` - Number uint64 `protobuf:"varint,4,opt,name=number,proto3" json:"number,omitempty"` - GasLimit uint64 `protobuf:"varint,5,opt,name=gas_limit,json=gasLimit,proto3" json:"gas_limit,omitempty"` - Time uint64 `protobuf:"varint,6,opt,name=time,proto3" json:"time,omitempty"` - Extra []byte `protobuf:"bytes,7,opt,name=extra,proto3" json:"extra,omitempty"` - Nonce uint64 `protobuf:"varint,8,opt,name=nonce,proto3" json:"nonce,omitempty"` -} - -func (x *Template) Reset() { - *x = Template{} - if protoimpl.UnsafeEnabled { - mi := &file_consensus_engine_consensus_proto_msgTypes[5] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *Template) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*Template) ProtoMessage() {} - -func (x *Template) ProtoReflect() protoreflect.Message { - mi := &file_consensus_engine_consensus_proto_msgTypes[5] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use Template.ProtoReflect.Descriptor instead. -func (*Template) Descriptor() ([]byte, []int) { - return file_consensus_engine_consensus_proto_rawDescGZIP(), []int{5} -} - -func (x *Template) GetParentHash() *types.H256 { - if x != nil { - return x.ParentHash - } - return nil -} - -func (x *Template) GetCoinbase() *types.H160 { - if x != nil { - return x.Coinbase - } - return nil -} - -func (x *Template) GetDifficulty() *types.H256 { - if x != nil { - return x.Difficulty - } - return nil -} - -func (x *Template) GetNumber() uint64 { - if x != nil { - return x.Number - } - return 0 -} - -func (x *Template) GetGasLimit() uint64 { - if x != nil { - return x.GasLimit - } - return 0 -} - -func (x *Template) GetTime() uint64 { - if x != nil { - return x.Time - } - return 0 -} - -func (x *Template) GetExtra() []byte { - if x != nil { - return x.Extra - } - return nil -} - -func (x *Template) GetNonce() uint64 { - if x != nil { - return x.Nonce - } - return 0 -} - -type BlockHeader struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - Template *Template `protobuf:"bytes,1,opt,name=template,proto3" json:"template,omitempty"` - UncleHash *types.H256 `protobuf:"bytes,2,opt,name=uncle_hash,json=uncleHash,proto3" json:"uncle_hash,omitempty"` - RootHash *types.H256 `protobuf:"bytes,3,opt,name=root_hash,json=rootHash,proto3" json:"root_hash,omitempty"` - TxHash *types.H256 `protobuf:"bytes,4,opt,name=tx_hash,json=txHash,proto3" json:"tx_hash,omitempty"` - ReceiptHash *types.H256 `protobuf:"bytes,5,opt,name=receipt_hash,json=receiptHash,proto3" json:"receipt_hash,omitempty"` - Bloom []byte `protobuf:"bytes,6,opt,name=bloom,proto3" json:"bloom,omitempty"` - GasUsed uint64 `protobuf:"varint,7,opt,name=gas_used,json=gasUsed,proto3" json:"gas_used,omitempty"` - MixDigest *types.H256 `protobuf:"bytes,8,opt,name=mix_digest,json=mixDigest,proto3" json:"mix_digest,omitempty"` -} - -func (x *BlockHeader) Reset() { - *x = BlockHeader{} - if protoimpl.UnsafeEnabled { - mi := &file_consensus_engine_consensus_proto_msgTypes[6] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *BlockHeader) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*BlockHeader) ProtoMessage() {} - -func (x *BlockHeader) ProtoReflect() protoreflect.Message { - mi := &file_consensus_engine_consensus_proto_msgTypes[6] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use BlockHeader.ProtoReflect.Descriptor instead. -func (*BlockHeader) Descriptor() ([]byte, []int) { - return file_consensus_engine_consensus_proto_rawDescGZIP(), []int{6} -} - -func (x *BlockHeader) GetTemplate() *Template { - if x != nil { - return x.Template - } - return nil -} - -func (x *BlockHeader) GetUncleHash() *types.H256 { - if x != nil { - return x.UncleHash - } - return nil -} - -func (x *BlockHeader) GetRootHash() *types.H256 { - if x != nil { - return x.RootHash - } - return nil -} - -func (x *BlockHeader) GetTxHash() *types.H256 { - if x != nil { - return x.TxHash - } - return nil -} - -func (x *BlockHeader) GetReceiptHash() *types.H256 { - if x != nil { - return x.ReceiptHash - } - return nil -} - -func (x *BlockHeader) GetBloom() []byte { - if x != nil { - return x.Bloom - } - return nil -} - -func (x *BlockHeader) GetGasUsed() uint64 { - if x != nil { - return x.GasUsed - } - return 0 -} - -func (x *BlockHeader) GetMixDigest() *types.H256 { - if x != nil { - return x.MixDigest - } - return nil -} - -type Transaction struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields -} - -func (x *Transaction) Reset() { - *x = Transaction{} - if protoimpl.UnsafeEnabled { - mi := &file_consensus_engine_consensus_proto_msgTypes[7] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *Transaction) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*Transaction) ProtoMessage() {} - -func (x *Transaction) ProtoReflect() protoreflect.Message { - mi := &file_consensus_engine_consensus_proto_msgTypes[7] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use Transaction.ProtoReflect.Descriptor instead. -func (*Transaction) Descriptor() ([]byte, []int) { - return file_consensus_engine_consensus_proto_rawDescGZIP(), []int{7} -} - -type Block struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - Header *BlockHeader `protobuf:"bytes,1,opt,name=header,proto3" json:"header,omitempty"` - Uncles []*BlockHeader `protobuf:"bytes,2,rep,name=uncles,proto3" json:"uncles,omitempty"` - Transactions []*Transaction `protobuf:"bytes,3,rep,name=transactions,proto3" json:"transactions,omitempty"` - TotalDifficulty []byte `protobuf:"bytes,4,opt,name=total_difficulty,json=totalDifficulty,proto3" json:"total_difficulty,omitempty"` -} - -func (x *Block) Reset() { - *x = Block{} - if protoimpl.UnsafeEnabled { - mi := &file_consensus_engine_consensus_proto_msgTypes[8] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *Block) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*Block) ProtoMessage() {} - -func (x *Block) ProtoReflect() protoreflect.Message { - mi := &file_consensus_engine_consensus_proto_msgTypes[8] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use Block.ProtoReflect.Descriptor instead. -func (*Block) Descriptor() ([]byte, []int) { - return file_consensus_engine_consensus_proto_rawDescGZIP(), []int{8} -} - -func (x *Block) GetHeader() *BlockHeader { - if x != nil { - return x.Header - } - return nil -} - -func (x *Block) GetUncles() []*BlockHeader { - if x != nil { - return x.Uncles - } - return nil -} - -func (x *Block) GetTransactions() []*Transaction { - if x != nil { - return x.Transactions - } - return nil -} - -func (x *Block) GetTotalDifficulty() []byte { - if x != nil { - return x.TotalDifficulty - } - return nil -} - -type GetAuthorRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - Header *BlockHeader `protobuf:"bytes,1,opt,name=header,proto3" json:"header,omitempty"` -} - -func (x *GetAuthorRequest) Reset() { - *x = GetAuthorRequest{} - if protoimpl.UnsafeEnabled { - mi := &file_consensus_engine_consensus_proto_msgTypes[9] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *GetAuthorRequest) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*GetAuthorRequest) ProtoMessage() {} - -func (x *GetAuthorRequest) ProtoReflect() protoreflect.Message { - mi := &file_consensus_engine_consensus_proto_msgTypes[9] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use GetAuthorRequest.ProtoReflect.Descriptor instead. -func (*GetAuthorRequest) Descriptor() ([]byte, []int) { - return file_consensus_engine_consensus_proto_rawDescGZIP(), []int{9} -} - -func (x *GetAuthorRequest) GetHeader() *BlockHeader { - if x != nil { - return x.Header - } - return nil -} - -type GetAuthorResponse struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - Result *Result `protobuf:"bytes,1,opt,name=result,proto3" json:"result,omitempty"` - Address *types.H160 `protobuf:"bytes,2,opt,name=address,proto3" json:"address,omitempty"` -} - -func (x *GetAuthorResponse) Reset() { - *x = GetAuthorResponse{} - if protoimpl.UnsafeEnabled { - mi := &file_consensus_engine_consensus_proto_msgTypes[10] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *GetAuthorResponse) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*GetAuthorResponse) ProtoMessage() {} - -func (x *GetAuthorResponse) ProtoReflect() protoreflect.Message { - mi := &file_consensus_engine_consensus_proto_msgTypes[10] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use GetAuthorResponse.ProtoReflect.Descriptor instead. -func (*GetAuthorResponse) Descriptor() ([]byte, []int) { - return file_consensus_engine_consensus_proto_rawDescGZIP(), []int{10} -} - -func (x *GetAuthorResponse) GetResult() *Result { - if x != nil { - return x.Result - } - return nil -} - -func (x *GetAuthorResponse) GetAddress() *types.H160 { - if x != nil { - return x.Address - } - return nil -} - -type VerifyHeaderRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - Header *BlockHeader `protobuf:"bytes,1,opt,name=header,proto3" json:"header,omitempty"` - Seal bool `protobuf:"varint,2,opt,name=seal,proto3" json:"seal,omitempty"` -} - -func (x *VerifyHeaderRequest) Reset() { - *x = VerifyHeaderRequest{} - if protoimpl.UnsafeEnabled { - mi := &file_consensus_engine_consensus_proto_msgTypes[11] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *VerifyHeaderRequest) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*VerifyHeaderRequest) ProtoMessage() {} - -func (x *VerifyHeaderRequest) ProtoReflect() protoreflect.Message { - mi := &file_consensus_engine_consensus_proto_msgTypes[11] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use VerifyHeaderRequest.ProtoReflect.Descriptor instead. -func (*VerifyHeaderRequest) Descriptor() ([]byte, []int) { - return file_consensus_engine_consensus_proto_rawDescGZIP(), []int{11} -} - -func (x *VerifyHeaderRequest) GetHeader() *BlockHeader { - if x != nil { - return x.Header - } - return nil -} - -func (x *VerifyHeaderRequest) GetSeal() bool { - if x != nil { - return x.Seal - } - return false -} - -type VerifyHeaderResponse struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - Hash *types.H256 `protobuf:"bytes,1,opt,name=hash,proto3" json:"hash,omitempty"` - Result *Result `protobuf:"bytes,2,opt,name=result,proto3" json:"result,omitempty"` - FinaliseCode []byte `protobuf:"bytes,3,opt,name=finaliseCode,proto3" json:"finaliseCode,omitempty"` // Code (in TEVM to execute at the end of the block to finalise it according to the consensus engine rules) -} - -func (x *VerifyHeaderResponse) Reset() { - *x = VerifyHeaderResponse{} - if protoimpl.UnsafeEnabled { - mi := &file_consensus_engine_consensus_proto_msgTypes[12] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *VerifyHeaderResponse) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*VerifyHeaderResponse) ProtoMessage() {} - -func (x *VerifyHeaderResponse) ProtoReflect() protoreflect.Message { - mi := &file_consensus_engine_consensus_proto_msgTypes[12] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use VerifyHeaderResponse.ProtoReflect.Descriptor instead. -func (*VerifyHeaderResponse) Descriptor() ([]byte, []int) { - return file_consensus_engine_consensus_proto_rawDescGZIP(), []int{12} -} - -func (x *VerifyHeaderResponse) GetHash() *types.H256 { - if x != nil { - return x.Hash - } - return nil -} - -func (x *VerifyHeaderResponse) GetResult() *Result { - if x != nil { - return x.Result - } - return nil -} - -func (x *VerifyHeaderResponse) GetFinaliseCode() []byte { - if x != nil { - return x.FinaliseCode - } - return nil -} - -type HeadersRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - Hash *types.H256 `protobuf:"bytes,1,opt,name=hash,proto3" json:"hash,omitempty"` // Hash of the highest header requested - Amount uint32 `protobuf:"varint,2,opt,name=amount,proto3" json:"amount,omitempty"` // Number of headers requested -} - -func (x *HeadersRequest) Reset() { - *x = HeadersRequest{} - if protoimpl.UnsafeEnabled { - mi := &file_consensus_engine_consensus_proto_msgTypes[13] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *HeadersRequest) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*HeadersRequest) ProtoMessage() {} - -func (x *HeadersRequest) ProtoReflect() protoreflect.Message { - mi := &file_consensus_engine_consensus_proto_msgTypes[13] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use HeadersRequest.ProtoReflect.Descriptor instead. -func (*HeadersRequest) Descriptor() ([]byte, []int) { - return file_consensus_engine_consensus_proto_rawDescGZIP(), []int{13} -} - -func (x *HeadersRequest) GetHash() *types.H256 { - if x != nil { - return x.Hash - } - return nil -} - -func (x *HeadersRequest) GetAmount() uint32 { - if x != nil { - return x.Amount - } - return 0 -} - -type HeadersResponse struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - Header *BlockHeader `protobuf:"bytes,1,opt,name=header,proto3" json:"header,omitempty"` -} - -func (x *HeadersResponse) Reset() { - *x = HeadersResponse{} - if protoimpl.UnsafeEnabled { - mi := &file_consensus_engine_consensus_proto_msgTypes[14] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *HeadersResponse) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*HeadersResponse) ProtoMessage() {} - -func (x *HeadersResponse) ProtoReflect() protoreflect.Message { - mi := &file_consensus_engine_consensus_proto_msgTypes[14] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use HeadersResponse.ProtoReflect.Descriptor instead. -func (*HeadersResponse) Descriptor() ([]byte, []int) { - return file_consensus_engine_consensus_proto_rawDescGZIP(), []int{14} -} - -func (x *HeadersResponse) GetHeader() *BlockHeader { - if x != nil { - return x.Header - } - return nil -} - -type VerifyUnclesRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - Block *Block `protobuf:"bytes,1,opt,name=block,proto3" json:"block,omitempty"` -} - -func (x *VerifyUnclesRequest) Reset() { - *x = VerifyUnclesRequest{} - if protoimpl.UnsafeEnabled { - mi := &file_consensus_engine_consensus_proto_msgTypes[15] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *VerifyUnclesRequest) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*VerifyUnclesRequest) ProtoMessage() {} - -func (x *VerifyUnclesRequest) ProtoReflect() protoreflect.Message { - mi := &file_consensus_engine_consensus_proto_msgTypes[15] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use VerifyUnclesRequest.ProtoReflect.Descriptor instead. -func (*VerifyUnclesRequest) Descriptor() ([]byte, []int) { - return file_consensus_engine_consensus_proto_rawDescGZIP(), []int{15} -} - -func (x *VerifyUnclesRequest) GetBlock() *Block { - if x != nil { - return x.Block - } - return nil -} - -type VerifyUnclesResponse struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - Result *Result `protobuf:"bytes,1,opt,name=result,proto3" json:"result,omitempty"` -} - -func (x *VerifyUnclesResponse) Reset() { - *x = VerifyUnclesResponse{} - if protoimpl.UnsafeEnabled { - mi := &file_consensus_engine_consensus_proto_msgTypes[16] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *VerifyUnclesResponse) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*VerifyUnclesResponse) ProtoMessage() {} - -func (x *VerifyUnclesResponse) ProtoReflect() protoreflect.Message { - mi := &file_consensus_engine_consensus_proto_msgTypes[16] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use VerifyUnclesResponse.ProtoReflect.Descriptor instead. -func (*VerifyUnclesResponse) Descriptor() ([]byte, []int) { - return file_consensus_engine_consensus_proto_rawDescGZIP(), []int{16} -} - -func (x *VerifyUnclesResponse) GetResult() *Result { - if x != nil { - return x.Result - } - return nil -} - -type SealBlockRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - Result *Result `protobuf:"bytes,1,opt,name=result,proto3" json:"result,omitempty"` - Block *Block `protobuf:"bytes,2,opt,name=block,proto3" json:"block,omitempty"` -} - -func (x *SealBlockRequest) Reset() { - *x = SealBlockRequest{} - if protoimpl.UnsafeEnabled { - mi := &file_consensus_engine_consensus_proto_msgTypes[17] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *SealBlockRequest) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*SealBlockRequest) ProtoMessage() {} - -func (x *SealBlockRequest) ProtoReflect() protoreflect.Message { - mi := &file_consensus_engine_consensus_proto_msgTypes[17] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use SealBlockRequest.ProtoReflect.Descriptor instead. -func (*SealBlockRequest) Descriptor() ([]byte, []int) { - return file_consensus_engine_consensus_proto_rawDescGZIP(), []int{17} -} - -func (x *SealBlockRequest) GetResult() *Result { - if x != nil { - return x.Result - } - return nil -} - -func (x *SealBlockRequest) GetBlock() *Block { - if x != nil { - return x.Block - } - return nil -} - -type SealBlockResponse struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - Result *Result `protobuf:"bytes,1,opt,name=result,proto3" json:"result,omitempty"` - Block *Block `protobuf:"bytes,2,opt,name=block,proto3" json:"block,omitempty"` -} - -func (x *SealBlockResponse) Reset() { - *x = SealBlockResponse{} - if protoimpl.UnsafeEnabled { - mi := &file_consensus_engine_consensus_proto_msgTypes[18] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *SealBlockResponse) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*SealBlockResponse) ProtoMessage() {} - -func (x *SealBlockResponse) ProtoReflect() protoreflect.Message { - mi := &file_consensus_engine_consensus_proto_msgTypes[18] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use SealBlockResponse.ProtoReflect.Descriptor instead. -func (*SealBlockResponse) Descriptor() ([]byte, []int) { - return file_consensus_engine_consensus_proto_rawDescGZIP(), []int{18} -} - -func (x *SealBlockResponse) GetResult() *Result { - if x != nil { - return x.Result - } - return nil -} - -func (x *SealBlockResponse) GetBlock() *Block { - if x != nil { - return x.Block - } - return nil -} - -type PrepareRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - Header *BlockHeader `protobuf:"bytes,1,opt,name=header,proto3" json:"header,omitempty"` -} - -func (x *PrepareRequest) Reset() { - *x = PrepareRequest{} - if protoimpl.UnsafeEnabled { - mi := &file_consensus_engine_consensus_proto_msgTypes[19] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *PrepareRequest) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*PrepareRequest) ProtoMessage() {} - -func (x *PrepareRequest) ProtoReflect() protoreflect.Message { - mi := &file_consensus_engine_consensus_proto_msgTypes[19] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use PrepareRequest.ProtoReflect.Descriptor instead. -func (*PrepareRequest) Descriptor() ([]byte, []int) { - return file_consensus_engine_consensus_proto_rawDescGZIP(), []int{19} -} - -func (x *PrepareRequest) GetHeader() *BlockHeader { - if x != nil { - return x.Header - } - return nil -} - -type PrepareResponse struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - Result *Result `protobuf:"bytes,1,opt,name=result,proto3" json:"result,omitempty"` -} - -func (x *PrepareResponse) Reset() { - *x = PrepareResponse{} - if protoimpl.UnsafeEnabled { - mi := &file_consensus_engine_consensus_proto_msgTypes[20] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *PrepareResponse) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*PrepareResponse) ProtoMessage() {} - -func (x *PrepareResponse) ProtoReflect() protoreflect.Message { - mi := &file_consensus_engine_consensus_proto_msgTypes[20] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use PrepareResponse.ProtoReflect.Descriptor instead. -func (*PrepareResponse) Descriptor() ([]byte, []int) { - return file_consensus_engine_consensus_proto_rawDescGZIP(), []int{20} -} - -func (x *PrepareResponse) GetResult() *Result { - if x != nil { - return x.Result - } - return nil -} - -type FinalizeRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - Header *BlockHeader `protobuf:"bytes,1,opt,name=header,proto3" json:"header,omitempty"` - Uncles []*BlockHeader `protobuf:"bytes,2,rep,name=uncles,proto3" json:"uncles,omitempty"` -} - -func (x *FinalizeRequest) Reset() { - *x = FinalizeRequest{} - if protoimpl.UnsafeEnabled { - mi := &file_consensus_engine_consensus_proto_msgTypes[21] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *FinalizeRequest) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*FinalizeRequest) ProtoMessage() {} - -func (x *FinalizeRequest) ProtoReflect() protoreflect.Message { - mi := &file_consensus_engine_consensus_proto_msgTypes[21] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use FinalizeRequest.ProtoReflect.Descriptor instead. -func (*FinalizeRequest) Descriptor() ([]byte, []int) { - return file_consensus_engine_consensus_proto_rawDescGZIP(), []int{21} -} - -func (x *FinalizeRequest) GetHeader() *BlockHeader { - if x != nil { - return x.Header - } - return nil -} - -func (x *FinalizeRequest) GetUncles() []*BlockHeader { - if x != nil { - return x.Uncles - } - return nil -} - -type FinalizeResponse struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - Result *Result `protobuf:"bytes,1,opt,name=result,proto3" json:"result,omitempty"` - MinerReward *types.H256 `protobuf:"bytes,2,opt,name=miner_reward,json=minerReward,proto3" json:"miner_reward,omitempty"` - UncleRewards []*types.H256 `protobuf:"bytes,3,rep,name=uncle_rewards,json=uncleRewards,proto3" json:"uncle_rewards,omitempty"` -} - -func (x *FinalizeResponse) Reset() { - *x = FinalizeResponse{} - if protoimpl.UnsafeEnabled { - mi := &file_consensus_engine_consensus_proto_msgTypes[22] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *FinalizeResponse) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*FinalizeResponse) ProtoMessage() {} - -func (x *FinalizeResponse) ProtoReflect() protoreflect.Message { - mi := &file_consensus_engine_consensus_proto_msgTypes[22] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use FinalizeResponse.ProtoReflect.Descriptor instead. -func (*FinalizeResponse) Descriptor() ([]byte, []int) { - return file_consensus_engine_consensus_proto_rawDescGZIP(), []int{22} -} - -func (x *FinalizeResponse) GetResult() *Result { - if x != nil { - return x.Result - } - return nil -} - -func (x *FinalizeResponse) GetMinerReward() *types.H256 { - if x != nil { - return x.MinerReward - } - return nil -} - -func (x *FinalizeResponse) GetUncleRewards() []*types.H256 { - if x != nil { - return x.UncleRewards - } - return nil -} - -type StartTestCaseMessage struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - Mechanism string `protobuf:"bytes,1,opt,name=mechanism,proto3" json:"mechanism,omitempty"` // Consensus mechanism used in the test case - Config []byte `protobuf:"bytes,2,opt,name=config,proto3" json:"config,omitempty"` // Configuration specific to the consensus engine tested -} - -func (x *StartTestCaseMessage) Reset() { - *x = StartTestCaseMessage{} - if protoimpl.UnsafeEnabled { - mi := &file_consensus_engine_consensus_proto_msgTypes[23] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *StartTestCaseMessage) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*StartTestCaseMessage) ProtoMessage() {} - -func (x *StartTestCaseMessage) ProtoReflect() protoreflect.Message { - mi := &file_consensus_engine_consensus_proto_msgTypes[23] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use StartTestCaseMessage.ProtoReflect.Descriptor instead. -func (*StartTestCaseMessage) Descriptor() ([]byte, []int) { - return file_consensus_engine_consensus_proto_rawDescGZIP(), []int{23} -} - -func (x *StartTestCaseMessage) GetMechanism() string { - if x != nil { - return x.Mechanism - } - return "" -} - -func (x *StartTestCaseMessage) GetConfig() []byte { - if x != nil { - return x.Config - } - return nil -} - -var File_consensus_engine_consensus_proto protoreflect.FileDescriptor - -var file_consensus_engine_consensus_proto_rawDesc = []byte{ - 0x0a, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x65, 0x6e, 0x73, 0x75, 0x73, 0x5f, 0x65, 0x6e, 0x67, 0x69, - 0x6e, 0x65, 0x2f, 0x63, 0x6f, 0x6e, 0x73, 0x65, 0x6e, 0x73, 0x75, 0x73, 0x2e, 0x70, 0x72, 0x6f, - 0x74, 0x6f, 0x12, 0x09, 0x63, 0x6f, 0x6e, 0x73, 0x65, 0x6e, 0x73, 0x75, 0x73, 0x1a, 0x1b, 0x67, - 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2f, 0x65, - 0x6d, 0x70, 0x74, 0x79, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x11, 0x74, 0x79, 0x70, 0x65, - 0x73, 0x2f, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0xb0, 0x01, - 0x0a, 0x10, 0x43, 0x68, 0x61, 0x69, 0x6e, 0x53, 0x70, 0x65, 0x63, 0x4d, 0x65, 0x73, 0x73, 0x61, - 0x67, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x6d, 0x65, 0x63, 0x68, 0x61, 0x6e, 0x69, 0x73, 0x6d, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x6d, 0x65, 0x63, 0x68, 0x61, 0x6e, 0x69, 0x73, 0x6d, - 0x12, 0x29, 0x0a, 0x10, 0x6d, 0x65, 0x63, 0x68, 0x61, 0x6e, 0x69, 0x73, 0x6d, 0x5f, 0x63, 0x6f, - 0x6e, 0x66, 0x69, 0x67, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0f, 0x6d, 0x65, 0x63, 0x68, - 0x61, 0x6e, 0x69, 0x73, 0x6d, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x2c, 0x0a, 0x07, 0x67, - 0x65, 0x6e, 0x65, 0x73, 0x69, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x63, - 0x6f, 0x6e, 0x73, 0x65, 0x6e, 0x73, 0x75, 0x73, 0x2e, 0x47, 0x65, 0x6e, 0x65, 0x73, 0x69, 0x73, - 0x52, 0x07, 0x67, 0x65, 0x6e, 0x65, 0x73, 0x69, 0x73, 0x12, 0x25, 0x0a, 0x05, 0x66, 0x6f, 0x72, - 0x6b, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x0f, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x65, - 0x6e, 0x73, 0x75, 0x73, 0x2e, 0x46, 0x6f, 0x72, 0x6b, 0x52, 0x05, 0x66, 0x6f, 0x72, 0x6b, 0x73, - 0x22, 0x62, 0x0a, 0x07, 0x47, 0x65, 0x6e, 0x65, 0x73, 0x69, 0x73, 0x12, 0x26, 0x0a, 0x08, 0x63, - 0x68, 0x61, 0x69, 0x6e, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0b, 0x2e, - 0x74, 0x79, 0x70, 0x65, 0x73, 0x2e, 0x48, 0x32, 0x35, 0x36, 0x52, 0x07, 0x63, 0x68, 0x61, 0x69, - 0x6e, 0x49, 0x64, 0x12, 0x2f, 0x0a, 0x08, 0x74, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x65, 0x6e, 0x73, 0x75, - 0x73, 0x2e, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x52, 0x08, 0x74, 0x65, 0x6d, 0x70, - 0x6c, 0x61, 0x74, 0x65, 0x22, 0x5a, 0x0a, 0x04, 0x46, 0x6f, 0x72, 0x6b, 0x12, 0x12, 0x0a, 0x04, - 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, - 0x12, 0x16, 0x0a, 0x06, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, - 0x52, 0x06, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x12, 0x26, 0x0a, 0x08, 0x63, 0x68, 0x61, 0x69, - 0x6e, 0x5f, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0b, 0x2e, 0x74, 0x79, 0x70, - 0x65, 0x73, 0x2e, 0x48, 0x32, 0x35, 0x36, 0x52, 0x07, 0x63, 0x68, 0x61, 0x69, 0x6e, 0x49, 0x64, - 0x22, 0x3d, 0x0a, 0x05, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x12, 0x12, 0x0a, 0x04, 0x63, 0x6f, 0x64, - 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x04, 0x63, 0x6f, 0x64, 0x65, 0x12, 0x20, 0x0a, - 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, - 0x4f, 0x0a, 0x06, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x6f, 0x6b, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x02, 0x6f, 0x6b, 0x12, 0x2b, 0x0a, 0x05, 0x65, 0x72, 0x72, - 0x6f, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x65, - 0x6e, 0x73, 0x75, 0x73, 0x2e, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x48, 0x00, 0x52, 0x05, 0x65, 0x72, - 0x72, 0x6f, 0x72, 0x88, 0x01, 0x01, 0x42, 0x08, 0x0a, 0x06, 0x5f, 0x65, 0x72, 0x72, 0x6f, 0x72, - 0x22, 0x83, 0x02, 0x0a, 0x08, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x12, 0x2c, 0x0a, - 0x0b, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x5f, 0x68, 0x61, 0x73, 0x68, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x0b, 0x2e, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2e, 0x48, 0x32, 0x35, 0x36, 0x52, - 0x0a, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x48, 0x61, 0x73, 0x68, 0x12, 0x27, 0x0a, 0x08, 0x63, - 0x6f, 0x69, 0x6e, 0x62, 0x61, 0x73, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0b, 0x2e, - 0x74, 0x79, 0x70, 0x65, 0x73, 0x2e, 0x48, 0x31, 0x36, 0x30, 0x52, 0x08, 0x63, 0x6f, 0x69, 0x6e, - 0x62, 0x61, 0x73, 0x65, 0x12, 0x2b, 0x0a, 0x0a, 0x64, 0x69, 0x66, 0x66, 0x69, 0x63, 0x75, 0x6c, - 0x74, 0x79, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0b, 0x2e, 0x74, 0x79, 0x70, 0x65, 0x73, - 0x2e, 0x48, 0x32, 0x35, 0x36, 0x52, 0x0a, 0x64, 0x69, 0x66, 0x66, 0x69, 0x63, 0x75, 0x6c, 0x74, - 0x79, 0x12, 0x16, 0x0a, 0x06, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x18, 0x04, 0x20, 0x01, 0x28, - 0x04, 0x52, 0x06, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x12, 0x1b, 0x0a, 0x09, 0x67, 0x61, 0x73, - 0x5f, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x04, 0x52, 0x08, 0x67, 0x61, - 0x73, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x06, - 0x20, 0x01, 0x28, 0x04, 0x52, 0x04, 0x74, 0x69, 0x6d, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x65, 0x78, - 0x74, 0x72, 0x61, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x05, 0x65, 0x78, 0x74, 0x72, 0x61, - 0x12, 0x14, 0x0a, 0x05, 0x6e, 0x6f, 0x6e, 0x63, 0x65, 0x18, 0x08, 0x20, 0x01, 0x28, 0x04, 0x52, - 0x05, 0x6e, 0x6f, 0x6e, 0x63, 0x65, 0x22, 0xc7, 0x02, 0x0a, 0x0b, 0x42, 0x6c, 0x6f, 0x63, 0x6b, - 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x12, 0x2f, 0x0a, 0x08, 0x74, 0x65, 0x6d, 0x70, 0x6c, 0x61, - 0x74, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x65, - 0x6e, 0x73, 0x75, 0x73, 0x2e, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x52, 0x08, 0x74, - 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x12, 0x2a, 0x0a, 0x0a, 0x75, 0x6e, 0x63, 0x6c, 0x65, - 0x5f, 0x68, 0x61, 0x73, 0x68, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0b, 0x2e, 0x74, 0x79, - 0x70, 0x65, 0x73, 0x2e, 0x48, 0x32, 0x35, 0x36, 0x52, 0x09, 0x75, 0x6e, 0x63, 0x6c, 0x65, 0x48, - 0x61, 0x73, 0x68, 0x12, 0x28, 0x0a, 0x09, 0x72, 0x6f, 0x6f, 0x74, 0x5f, 0x68, 0x61, 0x73, 0x68, - 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0b, 0x2e, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2e, 0x48, - 0x32, 0x35, 0x36, 0x52, 0x08, 0x72, 0x6f, 0x6f, 0x74, 0x48, 0x61, 0x73, 0x68, 0x12, 0x24, 0x0a, - 0x07, 0x74, 0x78, 0x5f, 0x68, 0x61, 0x73, 0x68, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0b, - 0x2e, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2e, 0x48, 0x32, 0x35, 0x36, 0x52, 0x06, 0x74, 0x78, 0x48, - 0x61, 0x73, 0x68, 0x12, 0x2e, 0x0a, 0x0c, 0x72, 0x65, 0x63, 0x65, 0x69, 0x70, 0x74, 0x5f, 0x68, - 0x61, 0x73, 0x68, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0b, 0x2e, 0x74, 0x79, 0x70, 0x65, - 0x73, 0x2e, 0x48, 0x32, 0x35, 0x36, 0x52, 0x0b, 0x72, 0x65, 0x63, 0x65, 0x69, 0x70, 0x74, 0x48, - 0x61, 0x73, 0x68, 0x12, 0x14, 0x0a, 0x05, 0x62, 0x6c, 0x6f, 0x6f, 0x6d, 0x18, 0x06, 0x20, 0x01, - 0x28, 0x0c, 0x52, 0x05, 0x62, 0x6c, 0x6f, 0x6f, 0x6d, 0x12, 0x19, 0x0a, 0x08, 0x67, 0x61, 0x73, - 0x5f, 0x75, 0x73, 0x65, 0x64, 0x18, 0x07, 0x20, 0x01, 0x28, 0x04, 0x52, 0x07, 0x67, 0x61, 0x73, - 0x55, 0x73, 0x65, 0x64, 0x12, 0x2a, 0x0a, 0x0a, 0x6d, 0x69, 0x78, 0x5f, 0x64, 0x69, 0x67, 0x65, - 0x73, 0x74, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0b, 0x2e, 0x74, 0x79, 0x70, 0x65, 0x73, - 0x2e, 0x48, 0x32, 0x35, 0x36, 0x52, 0x09, 0x6d, 0x69, 0x78, 0x44, 0x69, 0x67, 0x65, 0x73, 0x74, - 0x22, 0x0d, 0x0a, 0x0b, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x22, - 0xce, 0x01, 0x0a, 0x05, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x12, 0x2e, 0x0a, 0x06, 0x68, 0x65, 0x61, - 0x64, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x63, 0x6f, 0x6e, 0x73, - 0x65, 0x6e, 0x73, 0x75, 0x73, 0x2e, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x48, 0x65, 0x61, 0x64, 0x65, - 0x72, 0x52, 0x06, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x12, 0x2e, 0x0a, 0x06, 0x75, 0x6e, 0x63, - 0x6c, 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x63, 0x6f, 0x6e, 0x73, - 0x65, 0x6e, 0x73, 0x75, 0x73, 0x2e, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x48, 0x65, 0x61, 0x64, 0x65, - 0x72, 0x52, 0x06, 0x75, 0x6e, 0x63, 0x6c, 0x65, 0x73, 0x12, 0x3a, 0x0a, 0x0c, 0x74, 0x72, 0x61, - 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, - 0x16, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x65, 0x6e, 0x73, 0x75, 0x73, 0x2e, 0x54, 0x72, 0x61, 0x6e, - 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0c, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, - 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x29, 0x0a, 0x10, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x5f, 0x64, - 0x69, 0x66, 0x66, 0x69, 0x63, 0x75, 0x6c, 0x74, 0x79, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0c, 0x52, - 0x0f, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x44, 0x69, 0x66, 0x66, 0x69, 0x63, 0x75, 0x6c, 0x74, 0x79, - 0x22, 0x42, 0x0a, 0x10, 0x47, 0x65, 0x74, 0x41, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x12, 0x2e, 0x0a, 0x06, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x65, 0x6e, 0x73, 0x75, 0x73, - 0x2e, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x52, 0x06, 0x68, 0x65, - 0x61, 0x64, 0x65, 0x72, 0x22, 0x65, 0x0a, 0x11, 0x47, 0x65, 0x74, 0x41, 0x75, 0x74, 0x68, 0x6f, - 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x29, 0x0a, 0x06, 0x72, 0x65, 0x73, - 0x75, 0x6c, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x63, 0x6f, 0x6e, 0x73, - 0x65, 0x6e, 0x73, 0x75, 0x73, 0x2e, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x52, 0x06, 0x72, 0x65, - 0x73, 0x75, 0x6c, 0x74, 0x12, 0x25, 0x0a, 0x07, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0b, 0x2e, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2e, 0x48, 0x31, - 0x36, 0x30, 0x52, 0x07, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x22, 0x59, 0x0a, 0x13, 0x56, - 0x65, 0x72, 0x69, 0x66, 0x79, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x12, 0x2e, 0x0a, 0x06, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x65, 0x6e, 0x73, 0x75, 0x73, 0x2e, 0x42, - 0x6c, 0x6f, 0x63, 0x6b, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x52, 0x06, 0x68, 0x65, 0x61, 0x64, - 0x65, 0x72, 0x12, 0x12, 0x0a, 0x04, 0x73, 0x65, 0x61, 0x6c, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, - 0x52, 0x04, 0x73, 0x65, 0x61, 0x6c, 0x22, 0x86, 0x01, 0x0a, 0x14, 0x56, 0x65, 0x72, 0x69, 0x66, - 0x79, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, - 0x1f, 0x0a, 0x04, 0x68, 0x61, 0x73, 0x68, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0b, 0x2e, - 0x74, 0x79, 0x70, 0x65, 0x73, 0x2e, 0x48, 0x32, 0x35, 0x36, 0x52, 0x04, 0x68, 0x61, 0x73, 0x68, - 0x12, 0x29, 0x0a, 0x06, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x11, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x65, 0x6e, 0x73, 0x75, 0x73, 0x2e, 0x52, 0x65, 0x73, - 0x75, 0x6c, 0x74, 0x52, 0x06, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x12, 0x22, 0x0a, 0x0c, 0x66, - 0x69, 0x6e, 0x61, 0x6c, 0x69, 0x73, 0x65, 0x43, 0x6f, 0x64, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, - 0x0c, 0x52, 0x0c, 0x66, 0x69, 0x6e, 0x61, 0x6c, 0x69, 0x73, 0x65, 0x43, 0x6f, 0x64, 0x65, 0x22, - 0x49, 0x0a, 0x0e, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x12, 0x1f, 0x0a, 0x04, 0x68, 0x61, 0x73, 0x68, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x0b, 0x2e, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2e, 0x48, 0x32, 0x35, 0x36, 0x52, 0x04, 0x68, 0x61, - 0x73, 0x68, 0x12, 0x16, 0x0a, 0x06, 0x61, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x0d, 0x52, 0x06, 0x61, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x22, 0x41, 0x0a, 0x0f, 0x48, 0x65, - 0x61, 0x64, 0x65, 0x72, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x2e, 0x0a, - 0x06, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, - 0x63, 0x6f, 0x6e, 0x73, 0x65, 0x6e, 0x73, 0x75, 0x73, 0x2e, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x48, - 0x65, 0x61, 0x64, 0x65, 0x72, 0x52, 0x06, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x22, 0x3d, 0x0a, - 0x13, 0x56, 0x65, 0x72, 0x69, 0x66, 0x79, 0x55, 0x6e, 0x63, 0x6c, 0x65, 0x73, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x12, 0x26, 0x0a, 0x05, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x65, 0x6e, 0x73, 0x75, 0x73, 0x2e, - 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x52, 0x05, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x22, 0x41, 0x0a, 0x14, - 0x56, 0x65, 0x72, 0x69, 0x66, 0x79, 0x55, 0x6e, 0x63, 0x6c, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x29, 0x0a, 0x06, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x65, 0x6e, 0x73, 0x75, 0x73, - 0x2e, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x52, 0x06, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x22, - 0x65, 0x0a, 0x10, 0x53, 0x65, 0x61, 0x6c, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x12, 0x29, 0x0a, 0x06, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x65, 0x6e, 0x73, 0x75, 0x73, 0x2e, - 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x52, 0x06, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x12, 0x26, - 0x0a, 0x05, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x10, 0x2e, - 0x63, 0x6f, 0x6e, 0x73, 0x65, 0x6e, 0x73, 0x75, 0x73, 0x2e, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x52, - 0x05, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x22, 0x66, 0x0a, 0x11, 0x53, 0x65, 0x61, 0x6c, 0x42, 0x6c, - 0x6f, 0x63, 0x6b, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x29, 0x0a, 0x06, 0x72, - 0x65, 0x73, 0x75, 0x6c, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x63, 0x6f, - 0x6e, 0x73, 0x65, 0x6e, 0x73, 0x75, 0x73, 0x2e, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x52, 0x06, - 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x12, 0x26, 0x0a, 0x05, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x65, 0x6e, 0x73, 0x75, - 0x73, 0x2e, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x52, 0x05, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x22, 0x40, - 0x0a, 0x0e, 0x50, 0x72, 0x65, 0x70, 0x61, 0x72, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x12, 0x2e, 0x0a, 0x06, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x16, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x65, 0x6e, 0x73, 0x75, 0x73, 0x2e, 0x42, 0x6c, 0x6f, - 0x63, 0x6b, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x52, 0x06, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, - 0x22, 0x3c, 0x0a, 0x0f, 0x50, 0x72, 0x65, 0x70, 0x61, 0x72, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x12, 0x29, 0x0a, 0x06, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x65, 0x6e, 0x73, 0x75, 0x73, 0x2e, - 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x52, 0x06, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x22, 0x71, - 0x0a, 0x0f, 0x46, 0x69, 0x6e, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x12, 0x2e, 0x0a, 0x06, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x16, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x65, 0x6e, 0x73, 0x75, 0x73, 0x2e, 0x42, 0x6c, - 0x6f, 0x63, 0x6b, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x52, 0x06, 0x68, 0x65, 0x61, 0x64, 0x65, - 0x72, 0x12, 0x2e, 0x0a, 0x06, 0x75, 0x6e, 0x63, 0x6c, 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, - 0x0b, 0x32, 0x16, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x65, 0x6e, 0x73, 0x75, 0x73, 0x2e, 0x42, 0x6c, - 0x6f, 0x63, 0x6b, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x52, 0x06, 0x75, 0x6e, 0x63, 0x6c, 0x65, - 0x73, 0x22, 0x9f, 0x01, 0x0a, 0x10, 0x46, 0x69, 0x6e, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x29, 0x0a, 0x06, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x65, 0x6e, 0x73, - 0x75, 0x73, 0x2e, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x52, 0x06, 0x72, 0x65, 0x73, 0x75, 0x6c, - 0x74, 0x12, 0x2e, 0x0a, 0x0c, 0x6d, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x72, 0x65, 0x77, 0x61, 0x72, - 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0b, 0x2e, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2e, - 0x48, 0x32, 0x35, 0x36, 0x52, 0x0b, 0x6d, 0x69, 0x6e, 0x65, 0x72, 0x52, 0x65, 0x77, 0x61, 0x72, - 0x64, 0x12, 0x30, 0x0a, 0x0d, 0x75, 0x6e, 0x63, 0x6c, 0x65, 0x5f, 0x72, 0x65, 0x77, 0x61, 0x72, - 0x64, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x0b, 0x2e, 0x74, 0x79, 0x70, 0x65, 0x73, - 0x2e, 0x48, 0x32, 0x35, 0x36, 0x52, 0x0c, 0x75, 0x6e, 0x63, 0x6c, 0x65, 0x52, 0x65, 0x77, 0x61, - 0x72, 0x64, 0x73, 0x22, 0x4c, 0x0a, 0x14, 0x53, 0x74, 0x61, 0x72, 0x74, 0x54, 0x65, 0x73, 0x74, - 0x43, 0x61, 0x73, 0x65, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x6d, - 0x65, 0x63, 0x68, 0x61, 0x6e, 0x69, 0x73, 0x6d, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, - 0x6d, 0x65, 0x63, 0x68, 0x61, 0x6e, 0x69, 0x73, 0x6d, 0x12, 0x16, 0x0a, 0x06, 0x63, 0x6f, 0x6e, - 0x66, 0x69, 0x67, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x06, 0x63, 0x6f, 0x6e, 0x66, 0x69, - 0x67, 0x32, 0xe7, 0x04, 0x0a, 0x0f, 0x43, 0x6f, 0x6e, 0x73, 0x65, 0x6e, 0x73, 0x75, 0x73, 0x45, - 0x6e, 0x67, 0x69, 0x6e, 0x65, 0x12, 0x46, 0x0a, 0x09, 0x47, 0x65, 0x74, 0x41, 0x75, 0x74, 0x68, - 0x6f, 0x72, 0x12, 0x1b, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x65, 0x6e, 0x73, 0x75, 0x73, 0x2e, 0x47, - 0x65, 0x74, 0x41, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, - 0x1c, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x65, 0x6e, 0x73, 0x75, 0x73, 0x2e, 0x47, 0x65, 0x74, 0x41, - 0x75, 0x74, 0x68, 0x6f, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x40, 0x0a, - 0x09, 0x43, 0x68, 0x61, 0x69, 0x6e, 0x53, 0x70, 0x65, 0x63, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, - 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, - 0x74, 0x79, 0x1a, 0x1b, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x65, 0x6e, 0x73, 0x75, 0x73, 0x2e, 0x43, - 0x68, 0x61, 0x69, 0x6e, 0x53, 0x70, 0x65, 0x63, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, - 0x54, 0x0a, 0x0d, 0x56, 0x65, 0x72, 0x69, 0x66, 0x79, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x73, - 0x12, 0x1e, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x65, 0x6e, 0x73, 0x75, 0x73, 0x2e, 0x56, 0x65, 0x72, - 0x69, 0x66, 0x79, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x1a, 0x1f, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x65, 0x6e, 0x73, 0x75, 0x73, 0x2e, 0x56, 0x65, 0x72, - 0x69, 0x66, 0x79, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x28, 0x01, 0x30, 0x01, 0x12, 0x4b, 0x0a, 0x0e, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, - 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x73, 0x12, 0x1a, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x65, 0x6e, - 0x73, 0x75, 0x73, 0x2e, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x1a, 0x19, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x65, 0x6e, 0x73, 0x75, 0x73, 0x2e, - 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x28, 0x01, - 0x30, 0x01, 0x12, 0x53, 0x0a, 0x0c, 0x56, 0x65, 0x72, 0x69, 0x66, 0x79, 0x55, 0x6e, 0x63, 0x6c, - 0x65, 0x73, 0x12, 0x1e, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x65, 0x6e, 0x73, 0x75, 0x73, 0x2e, 0x56, - 0x65, 0x72, 0x69, 0x66, 0x79, 0x55, 0x6e, 0x63, 0x6c, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x1a, 0x1f, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x65, 0x6e, 0x73, 0x75, 0x73, 0x2e, 0x56, - 0x65, 0x72, 0x69, 0x66, 0x79, 0x55, 0x6e, 0x63, 0x6c, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x28, 0x01, 0x30, 0x01, 0x12, 0x44, 0x0a, 0x07, 0x50, 0x72, 0x65, 0x70, 0x61, - 0x72, 0x65, 0x12, 0x19, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x65, 0x6e, 0x73, 0x75, 0x73, 0x2e, 0x50, - 0x72, 0x65, 0x70, 0x61, 0x72, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1a, 0x2e, - 0x63, 0x6f, 0x6e, 0x73, 0x65, 0x6e, 0x73, 0x75, 0x73, 0x2e, 0x50, 0x72, 0x65, 0x70, 0x61, 0x72, - 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x28, 0x01, 0x30, 0x01, 0x12, 0x47, 0x0a, - 0x08, 0x46, 0x69, 0x6e, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x12, 0x1a, 0x2e, 0x63, 0x6f, 0x6e, 0x73, - 0x65, 0x6e, 0x73, 0x75, 0x73, 0x2e, 0x46, 0x69, 0x6e, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1b, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x65, 0x6e, 0x73, 0x75, - 0x73, 0x2e, 0x46, 0x69, 0x6e, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x28, 0x01, 0x30, 0x01, 0x12, 0x43, 0x0a, 0x04, 0x53, 0x65, 0x61, 0x6c, 0x12, 0x1b, - 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x65, 0x6e, 0x73, 0x75, 0x73, 0x2e, 0x53, 0x65, 0x61, 0x6c, 0x42, - 0x6c, 0x6f, 0x63, 0x6b, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1c, 0x2e, 0x63, 0x6f, - 0x6e, 0x73, 0x65, 0x6e, 0x73, 0x75, 0x73, 0x2e, 0x53, 0x65, 0x61, 0x6c, 0x42, 0x6c, 0x6f, 0x63, - 0x6b, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x30, 0x01, 0x32, 0x50, 0x0a, 0x04, 0x54, - 0x65, 0x73, 0x74, 0x12, 0x48, 0x0a, 0x0d, 0x53, 0x74, 0x61, 0x72, 0x74, 0x54, 0x65, 0x73, 0x74, - 0x43, 0x61, 0x73, 0x65, 0x12, 0x1f, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x65, 0x6e, 0x73, 0x75, 0x73, - 0x2e, 0x53, 0x74, 0x61, 0x72, 0x74, 0x54, 0x65, 0x73, 0x74, 0x43, 0x61, 0x73, 0x65, 0x4d, 0x65, - 0x73, 0x73, 0x61, 0x67, 0x65, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, - 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x42, 0x17, 0x5a, - 0x15, 0x2e, 0x2f, 0x63, 0x6f, 0x6e, 0x73, 0x65, 0x6e, 0x73, 0x75, 0x73, 0x3b, 0x63, 0x6f, 0x6e, - 0x73, 0x65, 0x6e, 0x73, 0x75, 0x73, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, -} - -var ( - file_consensus_engine_consensus_proto_rawDescOnce sync.Once - file_consensus_engine_consensus_proto_rawDescData = file_consensus_engine_consensus_proto_rawDesc -) - -func file_consensus_engine_consensus_proto_rawDescGZIP() []byte { - file_consensus_engine_consensus_proto_rawDescOnce.Do(func() { - file_consensus_engine_consensus_proto_rawDescData = protoimpl.X.CompressGZIP(file_consensus_engine_consensus_proto_rawDescData) - }) - return file_consensus_engine_consensus_proto_rawDescData -} - -var file_consensus_engine_consensus_proto_msgTypes = make([]protoimpl.MessageInfo, 24) -var file_consensus_engine_consensus_proto_goTypes = []interface{}{ - (*ChainSpecMessage)(nil), // 0: consensus.ChainSpecMessage - (*Genesis)(nil), // 1: consensus.Genesis - (*Fork)(nil), // 2: consensus.Fork - (*Error)(nil), // 3: consensus.Error - (*Result)(nil), // 4: consensus.Result - (*Template)(nil), // 5: consensus.Template - (*BlockHeader)(nil), // 6: consensus.BlockHeader - (*Transaction)(nil), // 7: consensus.Transaction - (*Block)(nil), // 8: consensus.Block - (*GetAuthorRequest)(nil), // 9: consensus.GetAuthorRequest - (*GetAuthorResponse)(nil), // 10: consensus.GetAuthorResponse - (*VerifyHeaderRequest)(nil), // 11: consensus.VerifyHeaderRequest - (*VerifyHeaderResponse)(nil), // 12: consensus.VerifyHeaderResponse - (*HeadersRequest)(nil), // 13: consensus.HeadersRequest - (*HeadersResponse)(nil), // 14: consensus.HeadersResponse - (*VerifyUnclesRequest)(nil), // 15: consensus.VerifyUnclesRequest - (*VerifyUnclesResponse)(nil), // 16: consensus.VerifyUnclesResponse - (*SealBlockRequest)(nil), // 17: consensus.SealBlockRequest - (*SealBlockResponse)(nil), // 18: consensus.SealBlockResponse - (*PrepareRequest)(nil), // 19: consensus.PrepareRequest - (*PrepareResponse)(nil), // 20: consensus.PrepareResponse - (*FinalizeRequest)(nil), // 21: consensus.FinalizeRequest - (*FinalizeResponse)(nil), // 22: consensus.FinalizeResponse - (*StartTestCaseMessage)(nil), // 23: consensus.StartTestCaseMessage - (*types.H256)(nil), // 24: types.H256 - (*types.H160)(nil), // 25: types.H160 - (*emptypb.Empty)(nil), // 26: google.protobuf.Empty -} -var file_consensus_engine_consensus_proto_depIdxs = []int32{ - 1, // 0: consensus.ChainSpecMessage.genesis:type_name -> consensus.Genesis - 2, // 1: consensus.ChainSpecMessage.forks:type_name -> consensus.Fork - 24, // 2: consensus.Genesis.chain_id:type_name -> types.H256 - 5, // 3: consensus.Genesis.template:type_name -> consensus.Template - 24, // 4: consensus.Fork.chain_id:type_name -> types.H256 - 3, // 5: consensus.Result.error:type_name -> consensus.Error - 24, // 6: consensus.Template.parent_hash:type_name -> types.H256 - 25, // 7: consensus.Template.coinbase:type_name -> types.H160 - 24, // 8: consensus.Template.difficulty:type_name -> types.H256 - 5, // 9: consensus.BlockHeader.template:type_name -> consensus.Template - 24, // 10: consensus.BlockHeader.uncle_hash:type_name -> types.H256 - 24, // 11: consensus.BlockHeader.root_hash:type_name -> types.H256 - 24, // 12: consensus.BlockHeader.tx_hash:type_name -> types.H256 - 24, // 13: consensus.BlockHeader.receipt_hash:type_name -> types.H256 - 24, // 14: consensus.BlockHeader.mix_digest:type_name -> types.H256 - 6, // 15: consensus.Block.header:type_name -> consensus.BlockHeader - 6, // 16: consensus.Block.uncles:type_name -> consensus.BlockHeader - 7, // 17: consensus.Block.transactions:type_name -> consensus.Transaction - 6, // 18: consensus.GetAuthorRequest.header:type_name -> consensus.BlockHeader - 4, // 19: consensus.GetAuthorResponse.result:type_name -> consensus.Result - 25, // 20: consensus.GetAuthorResponse.address:type_name -> types.H160 - 6, // 21: consensus.VerifyHeaderRequest.header:type_name -> consensus.BlockHeader - 24, // 22: consensus.VerifyHeaderResponse.hash:type_name -> types.H256 - 4, // 23: consensus.VerifyHeaderResponse.result:type_name -> consensus.Result - 24, // 24: consensus.HeadersRequest.hash:type_name -> types.H256 - 6, // 25: consensus.HeadersResponse.header:type_name -> consensus.BlockHeader - 8, // 26: consensus.VerifyUnclesRequest.block:type_name -> consensus.Block - 4, // 27: consensus.VerifyUnclesResponse.result:type_name -> consensus.Result - 4, // 28: consensus.SealBlockRequest.result:type_name -> consensus.Result - 8, // 29: consensus.SealBlockRequest.block:type_name -> consensus.Block - 4, // 30: consensus.SealBlockResponse.result:type_name -> consensus.Result - 8, // 31: consensus.SealBlockResponse.block:type_name -> consensus.Block - 6, // 32: consensus.PrepareRequest.header:type_name -> consensus.BlockHeader - 4, // 33: consensus.PrepareResponse.result:type_name -> consensus.Result - 6, // 34: consensus.FinalizeRequest.header:type_name -> consensus.BlockHeader - 6, // 35: consensus.FinalizeRequest.uncles:type_name -> consensus.BlockHeader - 4, // 36: consensus.FinalizeResponse.result:type_name -> consensus.Result - 24, // 37: consensus.FinalizeResponse.miner_reward:type_name -> types.H256 - 24, // 38: consensus.FinalizeResponse.uncle_rewards:type_name -> types.H256 - 9, // 39: consensus.ConsensusEngine.GetAuthor:input_type -> consensus.GetAuthorRequest - 26, // 40: consensus.ConsensusEngine.ChainSpec:input_type -> google.protobuf.Empty - 11, // 41: consensus.ConsensusEngine.VerifyHeaders:input_type -> consensus.VerifyHeaderRequest - 14, // 42: consensus.ConsensusEngine.ProvideHeaders:input_type -> consensus.HeadersResponse - 15, // 43: consensus.ConsensusEngine.VerifyUncles:input_type -> consensus.VerifyUnclesRequest - 19, // 44: consensus.ConsensusEngine.Prepare:input_type -> consensus.PrepareRequest - 21, // 45: consensus.ConsensusEngine.Finalize:input_type -> consensus.FinalizeRequest - 17, // 46: consensus.ConsensusEngine.Seal:input_type -> consensus.SealBlockRequest - 23, // 47: consensus.Test.StartTestCase:input_type -> consensus.StartTestCaseMessage - 10, // 48: consensus.ConsensusEngine.GetAuthor:output_type -> consensus.GetAuthorResponse - 0, // 49: consensus.ConsensusEngine.ChainSpec:output_type -> consensus.ChainSpecMessage - 12, // 50: consensus.ConsensusEngine.VerifyHeaders:output_type -> consensus.VerifyHeaderResponse - 13, // 51: consensus.ConsensusEngine.ProvideHeaders:output_type -> consensus.HeadersRequest - 16, // 52: consensus.ConsensusEngine.VerifyUncles:output_type -> consensus.VerifyUnclesResponse - 20, // 53: consensus.ConsensusEngine.Prepare:output_type -> consensus.PrepareResponse - 22, // 54: consensus.ConsensusEngine.Finalize:output_type -> consensus.FinalizeResponse - 18, // 55: consensus.ConsensusEngine.Seal:output_type -> consensus.SealBlockResponse - 26, // 56: consensus.Test.StartTestCase:output_type -> google.protobuf.Empty - 48, // [48:57] is the sub-list for method output_type - 39, // [39:48] is the sub-list for method input_type - 39, // [39:39] is the sub-list for extension type_name - 39, // [39:39] is the sub-list for extension extendee - 0, // [0:39] is the sub-list for field type_name -} - -func init() { file_consensus_engine_consensus_proto_init() } -func file_consensus_engine_consensus_proto_init() { - if File_consensus_engine_consensus_proto != nil { - return - } - if !protoimpl.UnsafeEnabled { - file_consensus_engine_consensus_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ChainSpecMessage); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_consensus_engine_consensus_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*Genesis); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_consensus_engine_consensus_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*Fork); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_consensus_engine_consensus_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*Error); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_consensus_engine_consensus_proto_msgTypes[4].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*Result); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_consensus_engine_consensus_proto_msgTypes[5].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*Template); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_consensus_engine_consensus_proto_msgTypes[6].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*BlockHeader); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_consensus_engine_consensus_proto_msgTypes[7].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*Transaction); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_consensus_engine_consensus_proto_msgTypes[8].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*Block); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_consensus_engine_consensus_proto_msgTypes[9].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GetAuthorRequest); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_consensus_engine_consensus_proto_msgTypes[10].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GetAuthorResponse); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_consensus_engine_consensus_proto_msgTypes[11].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*VerifyHeaderRequest); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_consensus_engine_consensus_proto_msgTypes[12].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*VerifyHeaderResponse); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_consensus_engine_consensus_proto_msgTypes[13].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*HeadersRequest); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_consensus_engine_consensus_proto_msgTypes[14].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*HeadersResponse); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_consensus_engine_consensus_proto_msgTypes[15].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*VerifyUnclesRequest); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_consensus_engine_consensus_proto_msgTypes[16].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*VerifyUnclesResponse); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_consensus_engine_consensus_proto_msgTypes[17].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*SealBlockRequest); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_consensus_engine_consensus_proto_msgTypes[18].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*SealBlockResponse); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_consensus_engine_consensus_proto_msgTypes[19].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*PrepareRequest); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_consensus_engine_consensus_proto_msgTypes[20].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*PrepareResponse); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_consensus_engine_consensus_proto_msgTypes[21].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*FinalizeRequest); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_consensus_engine_consensus_proto_msgTypes[22].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*FinalizeResponse); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_consensus_engine_consensus_proto_msgTypes[23].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*StartTestCaseMessage); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - } - file_consensus_engine_consensus_proto_msgTypes[4].OneofWrappers = []interface{}{} - type x struct{} - out := protoimpl.TypeBuilder{ - File: protoimpl.DescBuilder{ - GoPackagePath: reflect.TypeOf(x{}).PkgPath(), - RawDescriptor: file_consensus_engine_consensus_proto_rawDesc, - NumEnums: 0, - NumMessages: 24, - NumExtensions: 0, - NumServices: 2, - }, - GoTypes: file_consensus_engine_consensus_proto_goTypes, - DependencyIndexes: file_consensus_engine_consensus_proto_depIdxs, - MessageInfos: file_consensus_engine_consensus_proto_msgTypes, - }.Build() - File_consensus_engine_consensus_proto = out.File - file_consensus_engine_consensus_proto_rawDesc = nil - file_consensus_engine_consensus_proto_goTypes = nil - file_consensus_engine_consensus_proto_depIdxs = nil -} diff --git a/gointerfaces/consensus/consensus_grpc.pb.go b/gointerfaces/consensus/consensus_grpc.pb.go deleted file mode 100644 index 6e382500c6..0000000000 --- a/gointerfaces/consensus/consensus_grpc.pb.go +++ /dev/null @@ -1,634 +0,0 @@ -// Code generated by protoc-gen-go-grpc. DO NOT EDIT. - -package consensus - -import ( - context "context" - grpc "google.golang.org/grpc" - codes "google.golang.org/grpc/codes" - status "google.golang.org/grpc/status" - emptypb "google.golang.org/protobuf/types/known/emptypb" -) - -// This is a compile-time assertion to ensure that this generated file -// is compatible with the grpc package it is being compiled against. -// Requires gRPC-Go v1.32.0 or later. -const _ = grpc.SupportPackageIsVersion7 - -// ConsensusEngineClient is the client API for ConsensusEngine service. -// -// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://pkg.go.dev/google.golang.org/grpc/?tab=doc#ClientConn.NewStream. -type ConsensusEngineClient interface { - GetAuthor(ctx context.Context, in *GetAuthorRequest, opts ...grpc.CallOption) (*GetAuthorResponse, error) - ChainSpec(ctx context.Context, in *emptypb.Empty, opts ...grpc.CallOption) (*ChainSpecMessage, error) - // Core requests verifications from the Consensus Engine via this function - VerifyHeaders(ctx context.Context, opts ...grpc.CallOption) (ConsensusEngine_VerifyHeadersClient, error) - // Consensis Engine may ask for extra informaton (more headers) from the core, and these requests are coming through the stream - // returned by the ProvideHeaders function - ProvideHeaders(ctx context.Context, opts ...grpc.CallOption) (ConsensusEngine_ProvideHeadersClient, error) - VerifyUncles(ctx context.Context, opts ...grpc.CallOption) (ConsensusEngine_VerifyUnclesClient, error) - Prepare(ctx context.Context, opts ...grpc.CallOption) (ConsensusEngine_PrepareClient, error) - Finalize(ctx context.Context, opts ...grpc.CallOption) (ConsensusEngine_FinalizeClient, error) - Seal(ctx context.Context, in *SealBlockRequest, opts ...grpc.CallOption) (ConsensusEngine_SealClient, error) -} - -type consensusEngineClient struct { - cc grpc.ClientConnInterface -} - -func NewConsensusEngineClient(cc grpc.ClientConnInterface) ConsensusEngineClient { - return &consensusEngineClient{cc} -} - -func (c *consensusEngineClient) GetAuthor(ctx context.Context, in *GetAuthorRequest, opts ...grpc.CallOption) (*GetAuthorResponse, error) { - out := new(GetAuthorResponse) - err := c.cc.Invoke(ctx, "/consensus.ConsensusEngine/GetAuthor", in, out, opts...) - if err != nil { - return nil, err - } - return out, nil -} - -func (c *consensusEngineClient) ChainSpec(ctx context.Context, in *emptypb.Empty, opts ...grpc.CallOption) (*ChainSpecMessage, error) { - out := new(ChainSpecMessage) - err := c.cc.Invoke(ctx, "/consensus.ConsensusEngine/ChainSpec", in, out, opts...) - if err != nil { - return nil, err - } - return out, nil -} - -func (c *consensusEngineClient) VerifyHeaders(ctx context.Context, opts ...grpc.CallOption) (ConsensusEngine_VerifyHeadersClient, error) { - stream, err := c.cc.NewStream(ctx, &ConsensusEngine_ServiceDesc.Streams[0], "/consensus.ConsensusEngine/VerifyHeaders", opts...) - if err != nil { - return nil, err - } - x := &consensusEngineVerifyHeadersClient{stream} - return x, nil -} - -type ConsensusEngine_VerifyHeadersClient interface { - Send(*VerifyHeaderRequest) error - Recv() (*VerifyHeaderResponse, error) - grpc.ClientStream -} - -type consensusEngineVerifyHeadersClient struct { - grpc.ClientStream -} - -func (x *consensusEngineVerifyHeadersClient) Send(m *VerifyHeaderRequest) error { - return x.ClientStream.SendMsg(m) -} - -func (x *consensusEngineVerifyHeadersClient) Recv() (*VerifyHeaderResponse, error) { - m := new(VerifyHeaderResponse) - if err := x.ClientStream.RecvMsg(m); err != nil { - return nil, err - } - return m, nil -} - -func (c *consensusEngineClient) ProvideHeaders(ctx context.Context, opts ...grpc.CallOption) (ConsensusEngine_ProvideHeadersClient, error) { - stream, err := c.cc.NewStream(ctx, &ConsensusEngine_ServiceDesc.Streams[1], "/consensus.ConsensusEngine/ProvideHeaders", opts...) - if err != nil { - return nil, err - } - x := &consensusEngineProvideHeadersClient{stream} - return x, nil -} - -type ConsensusEngine_ProvideHeadersClient interface { - Send(*HeadersResponse) error - Recv() (*HeadersRequest, error) - grpc.ClientStream -} - -type consensusEngineProvideHeadersClient struct { - grpc.ClientStream -} - -func (x *consensusEngineProvideHeadersClient) Send(m *HeadersResponse) error { - return x.ClientStream.SendMsg(m) -} - -func (x *consensusEngineProvideHeadersClient) Recv() (*HeadersRequest, error) { - m := new(HeadersRequest) - if err := x.ClientStream.RecvMsg(m); err != nil { - return nil, err - } - return m, nil -} - -func (c *consensusEngineClient) VerifyUncles(ctx context.Context, opts ...grpc.CallOption) (ConsensusEngine_VerifyUnclesClient, error) { - stream, err := c.cc.NewStream(ctx, &ConsensusEngine_ServiceDesc.Streams[2], "/consensus.ConsensusEngine/VerifyUncles", opts...) - if err != nil { - return nil, err - } - x := &consensusEngineVerifyUnclesClient{stream} - return x, nil -} - -type ConsensusEngine_VerifyUnclesClient interface { - Send(*VerifyUnclesRequest) error - Recv() (*VerifyUnclesResponse, error) - grpc.ClientStream -} - -type consensusEngineVerifyUnclesClient struct { - grpc.ClientStream -} - -func (x *consensusEngineVerifyUnclesClient) Send(m *VerifyUnclesRequest) error { - return x.ClientStream.SendMsg(m) -} - -func (x *consensusEngineVerifyUnclesClient) Recv() (*VerifyUnclesResponse, error) { - m := new(VerifyUnclesResponse) - if err := x.ClientStream.RecvMsg(m); err != nil { - return nil, err - } - return m, nil -} - -func (c *consensusEngineClient) Prepare(ctx context.Context, opts ...grpc.CallOption) (ConsensusEngine_PrepareClient, error) { - stream, err := c.cc.NewStream(ctx, &ConsensusEngine_ServiceDesc.Streams[3], "/consensus.ConsensusEngine/Prepare", opts...) - if err != nil { - return nil, err - } - x := &consensusEnginePrepareClient{stream} - return x, nil -} - -type ConsensusEngine_PrepareClient interface { - Send(*PrepareRequest) error - Recv() (*PrepareResponse, error) - grpc.ClientStream -} - -type consensusEnginePrepareClient struct { - grpc.ClientStream -} - -func (x *consensusEnginePrepareClient) Send(m *PrepareRequest) error { - return x.ClientStream.SendMsg(m) -} - -func (x *consensusEnginePrepareClient) Recv() (*PrepareResponse, error) { - m := new(PrepareResponse) - if err := x.ClientStream.RecvMsg(m); err != nil { - return nil, err - } - return m, nil -} - -func (c *consensusEngineClient) Finalize(ctx context.Context, opts ...grpc.CallOption) (ConsensusEngine_FinalizeClient, error) { - stream, err := c.cc.NewStream(ctx, &ConsensusEngine_ServiceDesc.Streams[4], "/consensus.ConsensusEngine/Finalize", opts...) - if err != nil { - return nil, err - } - x := &consensusEngineFinalizeClient{stream} - return x, nil -} - -type ConsensusEngine_FinalizeClient interface { - Send(*FinalizeRequest) error - Recv() (*FinalizeResponse, error) - grpc.ClientStream -} - -type consensusEngineFinalizeClient struct { - grpc.ClientStream -} - -func (x *consensusEngineFinalizeClient) Send(m *FinalizeRequest) error { - return x.ClientStream.SendMsg(m) -} - -func (x *consensusEngineFinalizeClient) Recv() (*FinalizeResponse, error) { - m := new(FinalizeResponse) - if err := x.ClientStream.RecvMsg(m); err != nil { - return nil, err - } - return m, nil -} - -func (c *consensusEngineClient) Seal(ctx context.Context, in *SealBlockRequest, opts ...grpc.CallOption) (ConsensusEngine_SealClient, error) { - stream, err := c.cc.NewStream(ctx, &ConsensusEngine_ServiceDesc.Streams[5], "/consensus.ConsensusEngine/Seal", opts...) - if err != nil { - return nil, err - } - x := &consensusEngineSealClient{stream} - if err := x.ClientStream.SendMsg(in); err != nil { - return nil, err - } - if err := x.ClientStream.CloseSend(); err != nil { - return nil, err - } - return x, nil -} - -type ConsensusEngine_SealClient interface { - Recv() (*SealBlockResponse, error) - grpc.ClientStream -} - -type consensusEngineSealClient struct { - grpc.ClientStream -} - -func (x *consensusEngineSealClient) Recv() (*SealBlockResponse, error) { - m := new(SealBlockResponse) - if err := x.ClientStream.RecvMsg(m); err != nil { - return nil, err - } - return m, nil -} - -// ConsensusEngineServer is the server API for ConsensusEngine service. -// All implementations must embed UnimplementedConsensusEngineServer -// for forward compatibility -type ConsensusEngineServer interface { - GetAuthor(context.Context, *GetAuthorRequest) (*GetAuthorResponse, error) - ChainSpec(context.Context, *emptypb.Empty) (*ChainSpecMessage, error) - // Core requests verifications from the Consensus Engine via this function - VerifyHeaders(ConsensusEngine_VerifyHeadersServer) error - // Consensis Engine may ask for extra informaton (more headers) from the core, and these requests are coming through the stream - // returned by the ProvideHeaders function - ProvideHeaders(ConsensusEngine_ProvideHeadersServer) error - VerifyUncles(ConsensusEngine_VerifyUnclesServer) error - Prepare(ConsensusEngine_PrepareServer) error - Finalize(ConsensusEngine_FinalizeServer) error - Seal(*SealBlockRequest, ConsensusEngine_SealServer) error - mustEmbedUnimplementedConsensusEngineServer() -} - -// UnimplementedConsensusEngineServer must be embedded to have forward compatible implementations. -type UnimplementedConsensusEngineServer struct { -} - -func (UnimplementedConsensusEngineServer) GetAuthor(context.Context, *GetAuthorRequest) (*GetAuthorResponse, error) { - return nil, status.Errorf(codes.Unimplemented, "method GetAuthor not implemented") -} -func (UnimplementedConsensusEngineServer) ChainSpec(context.Context, *emptypb.Empty) (*ChainSpecMessage, error) { - return nil, status.Errorf(codes.Unimplemented, "method ChainSpec not implemented") -} -func (UnimplementedConsensusEngineServer) VerifyHeaders(ConsensusEngine_VerifyHeadersServer) error { - return status.Errorf(codes.Unimplemented, "method VerifyHeaders not implemented") -} -func (UnimplementedConsensusEngineServer) ProvideHeaders(ConsensusEngine_ProvideHeadersServer) error { - return status.Errorf(codes.Unimplemented, "method ProvideHeaders not implemented") -} -func (UnimplementedConsensusEngineServer) VerifyUncles(ConsensusEngine_VerifyUnclesServer) error { - return status.Errorf(codes.Unimplemented, "method VerifyUncles not implemented") -} -func (UnimplementedConsensusEngineServer) Prepare(ConsensusEngine_PrepareServer) error { - return status.Errorf(codes.Unimplemented, "method Prepare not implemented") -} -func (UnimplementedConsensusEngineServer) Finalize(ConsensusEngine_FinalizeServer) error { - return status.Errorf(codes.Unimplemented, "method Finalize not implemented") -} -func (UnimplementedConsensusEngineServer) Seal(*SealBlockRequest, ConsensusEngine_SealServer) error { - return status.Errorf(codes.Unimplemented, "method Seal not implemented") -} -func (UnimplementedConsensusEngineServer) mustEmbedUnimplementedConsensusEngineServer() {} - -// UnsafeConsensusEngineServer may be embedded to opt out of forward compatibility for this service. -// Use of this interface is not recommended, as added methods to ConsensusEngineServer will -// result in compilation errors. -type UnsafeConsensusEngineServer interface { - mustEmbedUnimplementedConsensusEngineServer() -} - -func RegisterConsensusEngineServer(s grpc.ServiceRegistrar, srv ConsensusEngineServer) { - s.RegisterService(&ConsensusEngine_ServiceDesc, srv) -} - -func _ConsensusEngine_GetAuthor_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(GetAuthorRequest) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(ConsensusEngineServer).GetAuthor(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/consensus.ConsensusEngine/GetAuthor", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(ConsensusEngineServer).GetAuthor(ctx, req.(*GetAuthorRequest)) - } - return interceptor(ctx, in, info, handler) -} - -func _ConsensusEngine_ChainSpec_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(emptypb.Empty) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(ConsensusEngineServer).ChainSpec(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/consensus.ConsensusEngine/ChainSpec", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(ConsensusEngineServer).ChainSpec(ctx, req.(*emptypb.Empty)) - } - return interceptor(ctx, in, info, handler) -} - -func _ConsensusEngine_VerifyHeaders_Handler(srv interface{}, stream grpc.ServerStream) error { - return srv.(ConsensusEngineServer).VerifyHeaders(&consensusEngineVerifyHeadersServer{stream}) -} - -type ConsensusEngine_VerifyHeadersServer interface { - Send(*VerifyHeaderResponse) error - Recv() (*VerifyHeaderRequest, error) - grpc.ServerStream -} - -type consensusEngineVerifyHeadersServer struct { - grpc.ServerStream -} - -func (x *consensusEngineVerifyHeadersServer) Send(m *VerifyHeaderResponse) error { - return x.ServerStream.SendMsg(m) -} - -func (x *consensusEngineVerifyHeadersServer) Recv() (*VerifyHeaderRequest, error) { - m := new(VerifyHeaderRequest) - if err := x.ServerStream.RecvMsg(m); err != nil { - return nil, err - } - return m, nil -} - -func _ConsensusEngine_ProvideHeaders_Handler(srv interface{}, stream grpc.ServerStream) error { - return srv.(ConsensusEngineServer).ProvideHeaders(&consensusEngineProvideHeadersServer{stream}) -} - -type ConsensusEngine_ProvideHeadersServer interface { - Send(*HeadersRequest) error - Recv() (*HeadersResponse, error) - grpc.ServerStream -} - -type consensusEngineProvideHeadersServer struct { - grpc.ServerStream -} - -func (x *consensusEngineProvideHeadersServer) Send(m *HeadersRequest) error { - return x.ServerStream.SendMsg(m) -} - -func (x *consensusEngineProvideHeadersServer) Recv() (*HeadersResponse, error) { - m := new(HeadersResponse) - if err := x.ServerStream.RecvMsg(m); err != nil { - return nil, err - } - return m, nil -} - -func _ConsensusEngine_VerifyUncles_Handler(srv interface{}, stream grpc.ServerStream) error { - return srv.(ConsensusEngineServer).VerifyUncles(&consensusEngineVerifyUnclesServer{stream}) -} - -type ConsensusEngine_VerifyUnclesServer interface { - Send(*VerifyUnclesResponse) error - Recv() (*VerifyUnclesRequest, error) - grpc.ServerStream -} - -type consensusEngineVerifyUnclesServer struct { - grpc.ServerStream -} - -func (x *consensusEngineVerifyUnclesServer) Send(m *VerifyUnclesResponse) error { - return x.ServerStream.SendMsg(m) -} - -func (x *consensusEngineVerifyUnclesServer) Recv() (*VerifyUnclesRequest, error) { - m := new(VerifyUnclesRequest) - if err := x.ServerStream.RecvMsg(m); err != nil { - return nil, err - } - return m, nil -} - -func _ConsensusEngine_Prepare_Handler(srv interface{}, stream grpc.ServerStream) error { - return srv.(ConsensusEngineServer).Prepare(&consensusEnginePrepareServer{stream}) -} - -type ConsensusEngine_PrepareServer interface { - Send(*PrepareResponse) error - Recv() (*PrepareRequest, error) - grpc.ServerStream -} - -type consensusEnginePrepareServer struct { - grpc.ServerStream -} - -func (x *consensusEnginePrepareServer) Send(m *PrepareResponse) error { - return x.ServerStream.SendMsg(m) -} - -func (x *consensusEnginePrepareServer) Recv() (*PrepareRequest, error) { - m := new(PrepareRequest) - if err := x.ServerStream.RecvMsg(m); err != nil { - return nil, err - } - return m, nil -} - -func _ConsensusEngine_Finalize_Handler(srv interface{}, stream grpc.ServerStream) error { - return srv.(ConsensusEngineServer).Finalize(&consensusEngineFinalizeServer{stream}) -} - -type ConsensusEngine_FinalizeServer interface { - Send(*FinalizeResponse) error - Recv() (*FinalizeRequest, error) - grpc.ServerStream -} - -type consensusEngineFinalizeServer struct { - grpc.ServerStream -} - -func (x *consensusEngineFinalizeServer) Send(m *FinalizeResponse) error { - return x.ServerStream.SendMsg(m) -} - -func (x *consensusEngineFinalizeServer) Recv() (*FinalizeRequest, error) { - m := new(FinalizeRequest) - if err := x.ServerStream.RecvMsg(m); err != nil { - return nil, err - } - return m, nil -} - -func _ConsensusEngine_Seal_Handler(srv interface{}, stream grpc.ServerStream) error { - m := new(SealBlockRequest) - if err := stream.RecvMsg(m); err != nil { - return err - } - return srv.(ConsensusEngineServer).Seal(m, &consensusEngineSealServer{stream}) -} - -type ConsensusEngine_SealServer interface { - Send(*SealBlockResponse) error - grpc.ServerStream -} - -type consensusEngineSealServer struct { - grpc.ServerStream -} - -func (x *consensusEngineSealServer) Send(m *SealBlockResponse) error { - return x.ServerStream.SendMsg(m) -} - -// ConsensusEngine_ServiceDesc is the grpc.ServiceDesc for ConsensusEngine service. -// It's only intended for direct use with grpc.RegisterService, -// and not to be introspected or modified (even as a copy) -var ConsensusEngine_ServiceDesc = grpc.ServiceDesc{ - ServiceName: "consensus.ConsensusEngine", - HandlerType: (*ConsensusEngineServer)(nil), - Methods: []grpc.MethodDesc{ - { - MethodName: "GetAuthor", - Handler: _ConsensusEngine_GetAuthor_Handler, - }, - { - MethodName: "ChainSpec", - Handler: _ConsensusEngine_ChainSpec_Handler, - }, - }, - Streams: []grpc.StreamDesc{ - { - StreamName: "VerifyHeaders", - Handler: _ConsensusEngine_VerifyHeaders_Handler, - ServerStreams: true, - ClientStreams: true, - }, - { - StreamName: "ProvideHeaders", - Handler: _ConsensusEngine_ProvideHeaders_Handler, - ServerStreams: true, - ClientStreams: true, - }, - { - StreamName: "VerifyUncles", - Handler: _ConsensusEngine_VerifyUncles_Handler, - ServerStreams: true, - ClientStreams: true, - }, - { - StreamName: "Prepare", - Handler: _ConsensusEngine_Prepare_Handler, - ServerStreams: true, - ClientStreams: true, - }, - { - StreamName: "Finalize", - Handler: _ConsensusEngine_Finalize_Handler, - ServerStreams: true, - ClientStreams: true, - }, - { - StreamName: "Seal", - Handler: _ConsensusEngine_Seal_Handler, - ServerStreams: true, - }, - }, - Metadata: "consensus_engine/consensus.proto", -} - -// TestClient is the client API for Test service. -// -// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://pkg.go.dev/google.golang.org/grpc/?tab=doc#ClientConn.NewStream. -type TestClient interface { - StartTestCase(ctx context.Context, in *StartTestCaseMessage, opts ...grpc.CallOption) (*emptypb.Empty, error) -} - -type testClient struct { - cc grpc.ClientConnInterface -} - -func NewTestClient(cc grpc.ClientConnInterface) TestClient { - return &testClient{cc} -} - -func (c *testClient) StartTestCase(ctx context.Context, in *StartTestCaseMessage, opts ...grpc.CallOption) (*emptypb.Empty, error) { - out := new(emptypb.Empty) - err := c.cc.Invoke(ctx, "/consensus.Test/StartTestCase", in, out, opts...) - if err != nil { - return nil, err - } - return out, nil -} - -// TestServer is the server API for Test service. -// All implementations must embed UnimplementedTestServer -// for forward compatibility -type TestServer interface { - StartTestCase(context.Context, *StartTestCaseMessage) (*emptypb.Empty, error) - mustEmbedUnimplementedTestServer() -} - -// UnimplementedTestServer must be embedded to have forward compatible implementations. -type UnimplementedTestServer struct { -} - -func (UnimplementedTestServer) StartTestCase(context.Context, *StartTestCaseMessage) (*emptypb.Empty, error) { - return nil, status.Errorf(codes.Unimplemented, "method StartTestCase not implemented") -} -func (UnimplementedTestServer) mustEmbedUnimplementedTestServer() {} - -// UnsafeTestServer may be embedded to opt out of forward compatibility for this service. -// Use of this interface is not recommended, as added methods to TestServer will -// result in compilation errors. -type UnsafeTestServer interface { - mustEmbedUnimplementedTestServer() -} - -func RegisterTestServer(s grpc.ServiceRegistrar, srv TestServer) { - s.RegisterService(&Test_ServiceDesc, srv) -} - -func _Test_StartTestCase_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(StartTestCaseMessage) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(TestServer).StartTestCase(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/consensus.Test/StartTestCase", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(TestServer).StartTestCase(ctx, req.(*StartTestCaseMessage)) - } - return interceptor(ctx, in, info, handler) -} - -// Test_ServiceDesc is the grpc.ServiceDesc for Test service. -// It's only intended for direct use with grpc.RegisterService, -// and not to be introspected or modified (even as a copy) -var Test_ServiceDesc = grpc.ServiceDesc{ - ServiceName: "consensus.Test", - HandlerType: (*TestServer)(nil), - Methods: []grpc.MethodDesc{ - { - MethodName: "StartTestCase", - Handler: _Test_StartTestCase_Handler, - }, - }, - Streams: []grpc.StreamDesc{}, - Metadata: "consensus_engine/consensus.proto", -} diff --git a/gointerfaces/remote/ethbackend.pb.go b/gointerfaces/remote/ethbackend.pb.go deleted file mode 100644 index 1ca4c93abc..0000000000 --- a/gointerfaces/remote/ethbackend.pb.go +++ /dev/null @@ -1,904 +0,0 @@ -// Code generated by protoc-gen-go. DO NOT EDIT. -// versions: -// protoc-gen-go v1.26.0 -// protoc v3.17.3 -// source: remote/ethbackend.proto - -package remote - -import ( - types "github.com/ledgerwatch/erigon/gointerfaces/types" - protoreflect "google.golang.org/protobuf/reflect/protoreflect" - protoimpl "google.golang.org/protobuf/runtime/protoimpl" - emptypb "google.golang.org/protobuf/types/known/emptypb" - reflect "reflect" - sync "sync" -) - -const ( - // Verify that this generated code is sufficiently up-to-date. - _ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion) - // Verify that runtime/protoimpl is sufficiently up-to-date. - _ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20) -) - -type Event int32 - -const ( - Event_HEADER Event = 0 - Event_PENDING_LOGS Event = 1 - Event_PENDING_BLOCK Event = 2 -) - -// Enum value maps for Event. -var ( - Event_name = map[int32]string{ - 0: "HEADER", - 1: "PENDING_LOGS", - 2: "PENDING_BLOCK", - } - Event_value = map[string]int32{ - "HEADER": 0, - "PENDING_LOGS": 1, - "PENDING_BLOCK": 2, - } -) - -func (x Event) Enum() *Event { - p := new(Event) - *p = x - return p -} - -func (x Event) String() string { - return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) -} - -func (Event) Descriptor() protoreflect.EnumDescriptor { - return file_remote_ethbackend_proto_enumTypes[0].Descriptor() -} - -func (Event) Type() protoreflect.EnumType { - return &file_remote_ethbackend_proto_enumTypes[0] -} - -func (x Event) Number() protoreflect.EnumNumber { - return protoreflect.EnumNumber(x) -} - -// Deprecated: Use Event.Descriptor instead. -func (Event) EnumDescriptor() ([]byte, []int) { - return file_remote_ethbackend_proto_rawDescGZIP(), []int{0} -} - -type EtherbaseRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields -} - -func (x *EtherbaseRequest) Reset() { - *x = EtherbaseRequest{} - if protoimpl.UnsafeEnabled { - mi := &file_remote_ethbackend_proto_msgTypes[0] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *EtherbaseRequest) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*EtherbaseRequest) ProtoMessage() {} - -func (x *EtherbaseRequest) ProtoReflect() protoreflect.Message { - mi := &file_remote_ethbackend_proto_msgTypes[0] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use EtherbaseRequest.ProtoReflect.Descriptor instead. -func (*EtherbaseRequest) Descriptor() ([]byte, []int) { - return file_remote_ethbackend_proto_rawDescGZIP(), []int{0} -} - -type EtherbaseReply struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - Address *types.H160 `protobuf:"bytes,1,opt,name=address,proto3" json:"address,omitempty"` -} - -func (x *EtherbaseReply) Reset() { - *x = EtherbaseReply{} - if protoimpl.UnsafeEnabled { - mi := &file_remote_ethbackend_proto_msgTypes[1] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *EtherbaseReply) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*EtherbaseReply) ProtoMessage() {} - -func (x *EtherbaseReply) ProtoReflect() protoreflect.Message { - mi := &file_remote_ethbackend_proto_msgTypes[1] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use EtherbaseReply.ProtoReflect.Descriptor instead. -func (*EtherbaseReply) Descriptor() ([]byte, []int) { - return file_remote_ethbackend_proto_rawDescGZIP(), []int{1} -} - -func (x *EtherbaseReply) GetAddress() *types.H160 { - if x != nil { - return x.Address - } - return nil -} - -type NetVersionRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields -} - -func (x *NetVersionRequest) Reset() { - *x = NetVersionRequest{} - if protoimpl.UnsafeEnabled { - mi := &file_remote_ethbackend_proto_msgTypes[2] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *NetVersionRequest) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*NetVersionRequest) ProtoMessage() {} - -func (x *NetVersionRequest) ProtoReflect() protoreflect.Message { - mi := &file_remote_ethbackend_proto_msgTypes[2] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use NetVersionRequest.ProtoReflect.Descriptor instead. -func (*NetVersionRequest) Descriptor() ([]byte, []int) { - return file_remote_ethbackend_proto_rawDescGZIP(), []int{2} -} - -type NetVersionReply struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - Id uint64 `protobuf:"varint,1,opt,name=id,proto3" json:"id,omitempty"` -} - -func (x *NetVersionReply) Reset() { - *x = NetVersionReply{} - if protoimpl.UnsafeEnabled { - mi := &file_remote_ethbackend_proto_msgTypes[3] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *NetVersionReply) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*NetVersionReply) ProtoMessage() {} - -func (x *NetVersionReply) ProtoReflect() protoreflect.Message { - mi := &file_remote_ethbackend_proto_msgTypes[3] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use NetVersionReply.ProtoReflect.Descriptor instead. -func (*NetVersionReply) Descriptor() ([]byte, []int) { - return file_remote_ethbackend_proto_rawDescGZIP(), []int{3} -} - -func (x *NetVersionReply) GetId() uint64 { - if x != nil { - return x.Id - } - return 0 -} - -type NetPeerCountRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields -} - -func (x *NetPeerCountRequest) Reset() { - *x = NetPeerCountRequest{} - if protoimpl.UnsafeEnabled { - mi := &file_remote_ethbackend_proto_msgTypes[4] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *NetPeerCountRequest) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*NetPeerCountRequest) ProtoMessage() {} - -func (x *NetPeerCountRequest) ProtoReflect() protoreflect.Message { - mi := &file_remote_ethbackend_proto_msgTypes[4] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use NetPeerCountRequest.ProtoReflect.Descriptor instead. -func (*NetPeerCountRequest) Descriptor() ([]byte, []int) { - return file_remote_ethbackend_proto_rawDescGZIP(), []int{4} -} - -type NetPeerCountReply struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - Count uint64 `protobuf:"varint,1,opt,name=count,proto3" json:"count,omitempty"` -} - -func (x *NetPeerCountReply) Reset() { - *x = NetPeerCountReply{} - if protoimpl.UnsafeEnabled { - mi := &file_remote_ethbackend_proto_msgTypes[5] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *NetPeerCountReply) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*NetPeerCountReply) ProtoMessage() {} - -func (x *NetPeerCountReply) ProtoReflect() protoreflect.Message { - mi := &file_remote_ethbackend_proto_msgTypes[5] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use NetPeerCountReply.ProtoReflect.Descriptor instead. -func (*NetPeerCountReply) Descriptor() ([]byte, []int) { - return file_remote_ethbackend_proto_rawDescGZIP(), []int{5} -} - -func (x *NetPeerCountReply) GetCount() uint64 { - if x != nil { - return x.Count - } - return 0 -} - -type ProtocolVersionRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields -} - -func (x *ProtocolVersionRequest) Reset() { - *x = ProtocolVersionRequest{} - if protoimpl.UnsafeEnabled { - mi := &file_remote_ethbackend_proto_msgTypes[6] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *ProtocolVersionRequest) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*ProtocolVersionRequest) ProtoMessage() {} - -func (x *ProtocolVersionRequest) ProtoReflect() protoreflect.Message { - mi := &file_remote_ethbackend_proto_msgTypes[6] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use ProtocolVersionRequest.ProtoReflect.Descriptor instead. -func (*ProtocolVersionRequest) Descriptor() ([]byte, []int) { - return file_remote_ethbackend_proto_rawDescGZIP(), []int{6} -} - -type ProtocolVersionReply struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - Id uint64 `protobuf:"varint,1,opt,name=id,proto3" json:"id,omitempty"` -} - -func (x *ProtocolVersionReply) Reset() { - *x = ProtocolVersionReply{} - if protoimpl.UnsafeEnabled { - mi := &file_remote_ethbackend_proto_msgTypes[7] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *ProtocolVersionReply) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*ProtocolVersionReply) ProtoMessage() {} - -func (x *ProtocolVersionReply) ProtoReflect() protoreflect.Message { - mi := &file_remote_ethbackend_proto_msgTypes[7] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use ProtocolVersionReply.ProtoReflect.Descriptor instead. -func (*ProtocolVersionReply) Descriptor() ([]byte, []int) { - return file_remote_ethbackend_proto_rawDescGZIP(), []int{7} -} - -func (x *ProtocolVersionReply) GetId() uint64 { - if x != nil { - return x.Id - } - return 0 -} - -type ClientVersionRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields -} - -func (x *ClientVersionRequest) Reset() { - *x = ClientVersionRequest{} - if protoimpl.UnsafeEnabled { - mi := &file_remote_ethbackend_proto_msgTypes[8] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *ClientVersionRequest) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*ClientVersionRequest) ProtoMessage() {} - -func (x *ClientVersionRequest) ProtoReflect() protoreflect.Message { - mi := &file_remote_ethbackend_proto_msgTypes[8] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use ClientVersionRequest.ProtoReflect.Descriptor instead. -func (*ClientVersionRequest) Descriptor() ([]byte, []int) { - return file_remote_ethbackend_proto_rawDescGZIP(), []int{8} -} - -type ClientVersionReply struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - NodeName string `protobuf:"bytes,1,opt,name=nodeName,proto3" json:"nodeName,omitempty"` -} - -func (x *ClientVersionReply) Reset() { - *x = ClientVersionReply{} - if protoimpl.UnsafeEnabled { - mi := &file_remote_ethbackend_proto_msgTypes[9] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *ClientVersionReply) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*ClientVersionReply) ProtoMessage() {} - -func (x *ClientVersionReply) ProtoReflect() protoreflect.Message { - mi := &file_remote_ethbackend_proto_msgTypes[9] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use ClientVersionReply.ProtoReflect.Descriptor instead. -func (*ClientVersionReply) Descriptor() ([]byte, []int) { - return file_remote_ethbackend_proto_rawDescGZIP(), []int{9} -} - -func (x *ClientVersionReply) GetNodeName() string { - if x != nil { - return x.NodeName - } - return "" -} - -type SubscribeRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - Type Event `protobuf:"varint,1,opt,name=type,proto3,enum=remote.Event" json:"type,omitempty"` -} - -func (x *SubscribeRequest) Reset() { - *x = SubscribeRequest{} - if protoimpl.UnsafeEnabled { - mi := &file_remote_ethbackend_proto_msgTypes[10] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *SubscribeRequest) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*SubscribeRequest) ProtoMessage() {} - -func (x *SubscribeRequest) ProtoReflect() protoreflect.Message { - mi := &file_remote_ethbackend_proto_msgTypes[10] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use SubscribeRequest.ProtoReflect.Descriptor instead. -func (*SubscribeRequest) Descriptor() ([]byte, []int) { - return file_remote_ethbackend_proto_rawDescGZIP(), []int{10} -} - -func (x *SubscribeRequest) GetType() Event { - if x != nil { - return x.Type - } - return Event_HEADER -} - -type SubscribeReply struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - Type Event `protobuf:"varint,1,opt,name=type,proto3,enum=remote.Event" json:"type,omitempty"` - Data []byte `protobuf:"bytes,2,opt,name=data,proto3" json:"data,omitempty"` // serialized data -} - -func (x *SubscribeReply) Reset() { - *x = SubscribeReply{} - if protoimpl.UnsafeEnabled { - mi := &file_remote_ethbackend_proto_msgTypes[11] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *SubscribeReply) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*SubscribeReply) ProtoMessage() {} - -func (x *SubscribeReply) ProtoReflect() protoreflect.Message { - mi := &file_remote_ethbackend_proto_msgTypes[11] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use SubscribeReply.ProtoReflect.Descriptor instead. -func (*SubscribeReply) Descriptor() ([]byte, []int) { - return file_remote_ethbackend_proto_rawDescGZIP(), []int{11} -} - -func (x *SubscribeReply) GetType() Event { - if x != nil { - return x.Type - } - return Event_HEADER -} - -func (x *SubscribeReply) GetData() []byte { - if x != nil { - return x.Data - } - return nil -} - -var File_remote_ethbackend_proto protoreflect.FileDescriptor - -var file_remote_ethbackend_proto_rawDesc = []byte{ - 0x0a, 0x17, 0x72, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x2f, 0x65, 0x74, 0x68, 0x62, 0x61, 0x63, 0x6b, - 0x65, 0x6e, 0x64, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x06, 0x72, 0x65, 0x6d, 0x6f, 0x74, - 0x65, 0x1a, 0x1b, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, - 0x75, 0x66, 0x2f, 0x65, 0x6d, 0x70, 0x74, 0x79, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x11, - 0x74, 0x79, 0x70, 0x65, 0x73, 0x2f, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, - 0x6f, 0x22, 0x12, 0x0a, 0x10, 0x45, 0x74, 0x68, 0x65, 0x72, 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x37, 0x0a, 0x0e, 0x45, 0x74, 0x68, 0x65, 0x72, 0x62, 0x61, - 0x73, 0x65, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x25, 0x0a, 0x07, 0x61, 0x64, 0x64, 0x72, 0x65, - 0x73, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0b, 0x2e, 0x74, 0x79, 0x70, 0x65, 0x73, - 0x2e, 0x48, 0x31, 0x36, 0x30, 0x52, 0x07, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x22, 0x13, - 0x0a, 0x11, 0x4e, 0x65, 0x74, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x22, 0x21, 0x0a, 0x0f, 0x4e, 0x65, 0x74, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, - 0x6e, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x04, 0x52, 0x02, 0x69, 0x64, 0x22, 0x15, 0x0a, 0x13, 0x4e, 0x65, 0x74, 0x50, 0x65, 0x65, - 0x72, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x29, 0x0a, - 0x11, 0x4e, 0x65, 0x74, 0x50, 0x65, 0x65, 0x72, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x52, 0x65, 0x70, - 0x6c, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x04, 0x52, 0x05, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x22, 0x18, 0x0a, 0x16, 0x50, 0x72, 0x6f, 0x74, - 0x6f, 0x63, 0x6f, 0x6c, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x22, 0x26, 0x0a, 0x14, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x56, 0x65, - 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x02, 0x69, 0x64, 0x22, 0x16, 0x0a, 0x14, 0x43, 0x6c, - 0x69, 0x65, 0x6e, 0x74, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x22, 0x30, 0x0a, 0x12, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x56, 0x65, 0x72, 0x73, - 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x1a, 0x0a, 0x08, 0x6e, 0x6f, 0x64, 0x65, - 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6e, 0x6f, 0x64, 0x65, - 0x4e, 0x61, 0x6d, 0x65, 0x22, 0x35, 0x0a, 0x10, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, - 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x21, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x0d, 0x2e, 0x72, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x2e, - 0x45, 0x76, 0x65, 0x6e, 0x74, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x22, 0x47, 0x0a, 0x0e, 0x53, - 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x21, 0x0a, - 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x0d, 0x2e, 0x72, 0x65, - 0x6d, 0x6f, 0x74, 0x65, 0x2e, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, - 0x12, 0x12, 0x0a, 0x04, 0x64, 0x61, 0x74, 0x61, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x04, - 0x64, 0x61, 0x74, 0x61, 0x2a, 0x38, 0x0a, 0x05, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x0a, 0x0a, - 0x06, 0x48, 0x45, 0x41, 0x44, 0x45, 0x52, 0x10, 0x00, 0x12, 0x10, 0x0a, 0x0c, 0x50, 0x45, 0x4e, - 0x44, 0x49, 0x4e, 0x47, 0x5f, 0x4c, 0x4f, 0x47, 0x53, 0x10, 0x01, 0x12, 0x11, 0x0a, 0x0d, 0x50, - 0x45, 0x4e, 0x44, 0x49, 0x4e, 0x47, 0x5f, 0x42, 0x4c, 0x4f, 0x43, 0x4b, 0x10, 0x02, 0x32, 0xea, - 0x03, 0x0a, 0x0a, 0x45, 0x54, 0x48, 0x42, 0x41, 0x43, 0x4b, 0x45, 0x4e, 0x44, 0x12, 0x3d, 0x0a, - 0x09, 0x45, 0x74, 0x68, 0x65, 0x72, 0x62, 0x61, 0x73, 0x65, 0x12, 0x18, 0x2e, 0x72, 0x65, 0x6d, - 0x6f, 0x74, 0x65, 0x2e, 0x45, 0x74, 0x68, 0x65, 0x72, 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x72, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x2e, 0x45, 0x74, - 0x68, 0x65, 0x72, 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x40, 0x0a, 0x0a, - 0x4e, 0x65, 0x74, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x19, 0x2e, 0x72, 0x65, 0x6d, - 0x6f, 0x74, 0x65, 0x2e, 0x4e, 0x65, 0x74, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x17, 0x2e, 0x72, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x2e, 0x4e, - 0x65, 0x74, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x46, - 0x0a, 0x0c, 0x4e, 0x65, 0x74, 0x50, 0x65, 0x65, 0x72, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x1b, - 0x2e, 0x72, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x2e, 0x4e, 0x65, 0x74, 0x50, 0x65, 0x65, 0x72, 0x43, - 0x6f, 0x75, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x19, 0x2e, 0x72, 0x65, - 0x6d, 0x6f, 0x74, 0x65, 0x2e, 0x4e, 0x65, 0x74, 0x50, 0x65, 0x65, 0x72, 0x43, 0x6f, 0x75, 0x6e, - 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x36, 0x0a, 0x07, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, - 0x6e, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, - 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x13, 0x2e, 0x74, 0x79, 0x70, 0x65, - 0x73, 0x2e, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x4f, - 0x0a, 0x0f, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, - 0x6e, 0x12, 0x1e, 0x2e, 0x72, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x2e, 0x50, 0x72, 0x6f, 0x74, 0x6f, - 0x63, 0x6f, 0x6c, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x1a, 0x1c, 0x2e, 0x72, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x2e, 0x50, 0x72, 0x6f, 0x74, 0x6f, - 0x63, 0x6f, 0x6c, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, - 0x49, 0x0a, 0x0d, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, - 0x12, 0x1c, 0x2e, 0x72, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x2e, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, - 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1a, - 0x2e, 0x72, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x2e, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x56, 0x65, - 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x3f, 0x0a, 0x09, 0x53, 0x75, - 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x12, 0x18, 0x2e, 0x72, 0x65, 0x6d, 0x6f, 0x74, 0x65, - 0x2e, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x1a, 0x16, 0x2e, 0x72, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x2e, 0x53, 0x75, 0x62, 0x73, 0x63, - 0x72, 0x69, 0x62, 0x65, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x30, 0x01, 0x42, 0x11, 0x5a, 0x0f, 0x2e, - 0x2f, 0x72, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x3b, 0x72, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x62, 0x06, - 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, -} - -var ( - file_remote_ethbackend_proto_rawDescOnce sync.Once - file_remote_ethbackend_proto_rawDescData = file_remote_ethbackend_proto_rawDesc -) - -func file_remote_ethbackend_proto_rawDescGZIP() []byte { - file_remote_ethbackend_proto_rawDescOnce.Do(func() { - file_remote_ethbackend_proto_rawDescData = protoimpl.X.CompressGZIP(file_remote_ethbackend_proto_rawDescData) - }) - return file_remote_ethbackend_proto_rawDescData -} - -var file_remote_ethbackend_proto_enumTypes = make([]protoimpl.EnumInfo, 1) -var file_remote_ethbackend_proto_msgTypes = make([]protoimpl.MessageInfo, 12) -var file_remote_ethbackend_proto_goTypes = []interface{}{ - (Event)(0), // 0: remote.Event - (*EtherbaseRequest)(nil), // 1: remote.EtherbaseRequest - (*EtherbaseReply)(nil), // 2: remote.EtherbaseReply - (*NetVersionRequest)(nil), // 3: remote.NetVersionRequest - (*NetVersionReply)(nil), // 4: remote.NetVersionReply - (*NetPeerCountRequest)(nil), // 5: remote.NetPeerCountRequest - (*NetPeerCountReply)(nil), // 6: remote.NetPeerCountReply - (*ProtocolVersionRequest)(nil), // 7: remote.ProtocolVersionRequest - (*ProtocolVersionReply)(nil), // 8: remote.ProtocolVersionReply - (*ClientVersionRequest)(nil), // 9: remote.ClientVersionRequest - (*ClientVersionReply)(nil), // 10: remote.ClientVersionReply - (*SubscribeRequest)(nil), // 11: remote.SubscribeRequest - (*SubscribeReply)(nil), // 12: remote.SubscribeReply - (*types.H160)(nil), // 13: types.H160 - (*emptypb.Empty)(nil), // 14: google.protobuf.Empty - (*types.VersionReply)(nil), // 15: types.VersionReply -} -var file_remote_ethbackend_proto_depIdxs = []int32{ - 13, // 0: remote.EtherbaseReply.address:type_name -> types.H160 - 0, // 1: remote.SubscribeRequest.type:type_name -> remote.Event - 0, // 2: remote.SubscribeReply.type:type_name -> remote.Event - 1, // 3: remote.ETHBACKEND.Etherbase:input_type -> remote.EtherbaseRequest - 3, // 4: remote.ETHBACKEND.NetVersion:input_type -> remote.NetVersionRequest - 5, // 5: remote.ETHBACKEND.NetPeerCount:input_type -> remote.NetPeerCountRequest - 14, // 6: remote.ETHBACKEND.Version:input_type -> google.protobuf.Empty - 7, // 7: remote.ETHBACKEND.ProtocolVersion:input_type -> remote.ProtocolVersionRequest - 9, // 8: remote.ETHBACKEND.ClientVersion:input_type -> remote.ClientVersionRequest - 11, // 9: remote.ETHBACKEND.Subscribe:input_type -> remote.SubscribeRequest - 2, // 10: remote.ETHBACKEND.Etherbase:output_type -> remote.EtherbaseReply - 4, // 11: remote.ETHBACKEND.NetVersion:output_type -> remote.NetVersionReply - 6, // 12: remote.ETHBACKEND.NetPeerCount:output_type -> remote.NetPeerCountReply - 15, // 13: remote.ETHBACKEND.Version:output_type -> types.VersionReply - 8, // 14: remote.ETHBACKEND.ProtocolVersion:output_type -> remote.ProtocolVersionReply - 10, // 15: remote.ETHBACKEND.ClientVersion:output_type -> remote.ClientVersionReply - 12, // 16: remote.ETHBACKEND.Subscribe:output_type -> remote.SubscribeReply - 10, // [10:17] is the sub-list for method output_type - 3, // [3:10] is the sub-list for method input_type - 3, // [3:3] is the sub-list for extension type_name - 3, // [3:3] is the sub-list for extension extendee - 0, // [0:3] is the sub-list for field type_name -} - -func init() { file_remote_ethbackend_proto_init() } -func file_remote_ethbackend_proto_init() { - if File_remote_ethbackend_proto != nil { - return - } - if !protoimpl.UnsafeEnabled { - file_remote_ethbackend_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*EtherbaseRequest); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_remote_ethbackend_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*EtherbaseReply); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_remote_ethbackend_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*NetVersionRequest); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_remote_ethbackend_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*NetVersionReply); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_remote_ethbackend_proto_msgTypes[4].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*NetPeerCountRequest); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_remote_ethbackend_proto_msgTypes[5].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*NetPeerCountReply); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_remote_ethbackend_proto_msgTypes[6].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ProtocolVersionRequest); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_remote_ethbackend_proto_msgTypes[7].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ProtocolVersionReply); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_remote_ethbackend_proto_msgTypes[8].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ClientVersionRequest); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_remote_ethbackend_proto_msgTypes[9].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ClientVersionReply); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_remote_ethbackend_proto_msgTypes[10].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*SubscribeRequest); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_remote_ethbackend_proto_msgTypes[11].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*SubscribeReply); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - } - type x struct{} - out := protoimpl.TypeBuilder{ - File: protoimpl.DescBuilder{ - GoPackagePath: reflect.TypeOf(x{}).PkgPath(), - RawDescriptor: file_remote_ethbackend_proto_rawDesc, - NumEnums: 1, - NumMessages: 12, - NumExtensions: 0, - NumServices: 1, - }, - GoTypes: file_remote_ethbackend_proto_goTypes, - DependencyIndexes: file_remote_ethbackend_proto_depIdxs, - EnumInfos: file_remote_ethbackend_proto_enumTypes, - MessageInfos: file_remote_ethbackend_proto_msgTypes, - }.Build() - File_remote_ethbackend_proto = out.File - file_remote_ethbackend_proto_rawDesc = nil - file_remote_ethbackend_proto_goTypes = nil - file_remote_ethbackend_proto_depIdxs = nil -} diff --git a/gointerfaces/remote/ethbackend_grpc.pb.go b/gointerfaces/remote/ethbackend_grpc.pb.go deleted file mode 100644 index 8ffd4fcaeb..0000000000 --- a/gointerfaces/remote/ethbackend_grpc.pb.go +++ /dev/null @@ -1,353 +0,0 @@ -// Code generated by protoc-gen-go-grpc. DO NOT EDIT. - -package remote - -import ( - context "context" - types "github.com/ledgerwatch/erigon/gointerfaces/types" - grpc "google.golang.org/grpc" - codes "google.golang.org/grpc/codes" - status "google.golang.org/grpc/status" - emptypb "google.golang.org/protobuf/types/known/emptypb" -) - -// This is a compile-time assertion to ensure that this generated file -// is compatible with the grpc package it is being compiled against. -// Requires gRPC-Go v1.32.0 or later. -const _ = grpc.SupportPackageIsVersion7 - -// ETHBACKENDClient is the client API for ETHBACKEND service. -// -// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://pkg.go.dev/google.golang.org/grpc/?tab=doc#ClientConn.NewStream. -type ETHBACKENDClient interface { - Etherbase(ctx context.Context, in *EtherbaseRequest, opts ...grpc.CallOption) (*EtherbaseReply, error) - NetVersion(ctx context.Context, in *NetVersionRequest, opts ...grpc.CallOption) (*NetVersionReply, error) - NetPeerCount(ctx context.Context, in *NetPeerCountRequest, opts ...grpc.CallOption) (*NetPeerCountReply, error) - // Version returns the service version number - Version(ctx context.Context, in *emptypb.Empty, opts ...grpc.CallOption) (*types.VersionReply, error) - // ProtocolVersion returns the Ethereum protocol version number (e.g. 66 for ETH66). - ProtocolVersion(ctx context.Context, in *ProtocolVersionRequest, opts ...grpc.CallOption) (*ProtocolVersionReply, error) - // ClientVersion returns the Ethereum client version string using node name convention (e.g. TurboGeth/v2021.03.2-alpha/Linux). - ClientVersion(ctx context.Context, in *ClientVersionRequest, opts ...grpc.CallOption) (*ClientVersionReply, error) - Subscribe(ctx context.Context, in *SubscribeRequest, opts ...grpc.CallOption) (ETHBACKEND_SubscribeClient, error) -} - -type eTHBACKENDClient struct { - cc grpc.ClientConnInterface -} - -func NewETHBACKENDClient(cc grpc.ClientConnInterface) ETHBACKENDClient { - return &eTHBACKENDClient{cc} -} - -func (c *eTHBACKENDClient) Etherbase(ctx context.Context, in *EtherbaseRequest, opts ...grpc.CallOption) (*EtherbaseReply, error) { - out := new(EtherbaseReply) - err := c.cc.Invoke(ctx, "/remote.ETHBACKEND/Etherbase", in, out, opts...) - if err != nil { - return nil, err - } - return out, nil -} - -func (c *eTHBACKENDClient) NetVersion(ctx context.Context, in *NetVersionRequest, opts ...grpc.CallOption) (*NetVersionReply, error) { - out := new(NetVersionReply) - err := c.cc.Invoke(ctx, "/remote.ETHBACKEND/NetVersion", in, out, opts...) - if err != nil { - return nil, err - } - return out, nil -} - -func (c *eTHBACKENDClient) NetPeerCount(ctx context.Context, in *NetPeerCountRequest, opts ...grpc.CallOption) (*NetPeerCountReply, error) { - out := new(NetPeerCountReply) - err := c.cc.Invoke(ctx, "/remote.ETHBACKEND/NetPeerCount", in, out, opts...) - if err != nil { - return nil, err - } - return out, nil -} - -func (c *eTHBACKENDClient) Version(ctx context.Context, in *emptypb.Empty, opts ...grpc.CallOption) (*types.VersionReply, error) { - out := new(types.VersionReply) - err := c.cc.Invoke(ctx, "/remote.ETHBACKEND/Version", in, out, opts...) - if err != nil { - return nil, err - } - return out, nil -} - -func (c *eTHBACKENDClient) ProtocolVersion(ctx context.Context, in *ProtocolVersionRequest, opts ...grpc.CallOption) (*ProtocolVersionReply, error) { - out := new(ProtocolVersionReply) - err := c.cc.Invoke(ctx, "/remote.ETHBACKEND/ProtocolVersion", in, out, opts...) - if err != nil { - return nil, err - } - return out, nil -} - -func (c *eTHBACKENDClient) ClientVersion(ctx context.Context, in *ClientVersionRequest, opts ...grpc.CallOption) (*ClientVersionReply, error) { - out := new(ClientVersionReply) - err := c.cc.Invoke(ctx, "/remote.ETHBACKEND/ClientVersion", in, out, opts...) - if err != nil { - return nil, err - } - return out, nil -} - -func (c *eTHBACKENDClient) Subscribe(ctx context.Context, in *SubscribeRequest, opts ...grpc.CallOption) (ETHBACKEND_SubscribeClient, error) { - stream, err := c.cc.NewStream(ctx, ÐBACKEND_ServiceDesc.Streams[0], "/remote.ETHBACKEND/Subscribe", opts...) - if err != nil { - return nil, err - } - x := &eTHBACKENDSubscribeClient{stream} - if err := x.ClientStream.SendMsg(in); err != nil { - return nil, err - } - if err := x.ClientStream.CloseSend(); err != nil { - return nil, err - } - return x, nil -} - -type ETHBACKEND_SubscribeClient interface { - Recv() (*SubscribeReply, error) - grpc.ClientStream -} - -type eTHBACKENDSubscribeClient struct { - grpc.ClientStream -} - -func (x *eTHBACKENDSubscribeClient) Recv() (*SubscribeReply, error) { - m := new(SubscribeReply) - if err := x.ClientStream.RecvMsg(m); err != nil { - return nil, err - } - return m, nil -} - -// ETHBACKENDServer is the server API for ETHBACKEND service. -// All implementations must embed UnimplementedETHBACKENDServer -// for forward compatibility -type ETHBACKENDServer interface { - Etherbase(context.Context, *EtherbaseRequest) (*EtherbaseReply, error) - NetVersion(context.Context, *NetVersionRequest) (*NetVersionReply, error) - NetPeerCount(context.Context, *NetPeerCountRequest) (*NetPeerCountReply, error) - // Version returns the service version number - Version(context.Context, *emptypb.Empty) (*types.VersionReply, error) - // ProtocolVersion returns the Ethereum protocol version number (e.g. 66 for ETH66). - ProtocolVersion(context.Context, *ProtocolVersionRequest) (*ProtocolVersionReply, error) - // ClientVersion returns the Ethereum client version string using node name convention (e.g. TurboGeth/v2021.03.2-alpha/Linux). - ClientVersion(context.Context, *ClientVersionRequest) (*ClientVersionReply, error) - Subscribe(*SubscribeRequest, ETHBACKEND_SubscribeServer) error - mustEmbedUnimplementedETHBACKENDServer() -} - -// UnimplementedETHBACKENDServer must be embedded to have forward compatible implementations. -type UnimplementedETHBACKENDServer struct { -} - -func (UnimplementedETHBACKENDServer) Etherbase(context.Context, *EtherbaseRequest) (*EtherbaseReply, error) { - return nil, status.Errorf(codes.Unimplemented, "method Etherbase not implemented") -} -func (UnimplementedETHBACKENDServer) NetVersion(context.Context, *NetVersionRequest) (*NetVersionReply, error) { - return nil, status.Errorf(codes.Unimplemented, "method NetVersion not implemented") -} -func (UnimplementedETHBACKENDServer) NetPeerCount(context.Context, *NetPeerCountRequest) (*NetPeerCountReply, error) { - return nil, status.Errorf(codes.Unimplemented, "method NetPeerCount not implemented") -} -func (UnimplementedETHBACKENDServer) Version(context.Context, *emptypb.Empty) (*types.VersionReply, error) { - return nil, status.Errorf(codes.Unimplemented, "method Version not implemented") -} -func (UnimplementedETHBACKENDServer) ProtocolVersion(context.Context, *ProtocolVersionRequest) (*ProtocolVersionReply, error) { - return nil, status.Errorf(codes.Unimplemented, "method ProtocolVersion not implemented") -} -func (UnimplementedETHBACKENDServer) ClientVersion(context.Context, *ClientVersionRequest) (*ClientVersionReply, error) { - return nil, status.Errorf(codes.Unimplemented, "method ClientVersion not implemented") -} -func (UnimplementedETHBACKENDServer) Subscribe(*SubscribeRequest, ETHBACKEND_SubscribeServer) error { - return status.Errorf(codes.Unimplemented, "method Subscribe not implemented") -} -func (UnimplementedETHBACKENDServer) mustEmbedUnimplementedETHBACKENDServer() {} - -// UnsafeETHBACKENDServer may be embedded to opt out of forward compatibility for this service. -// Use of this interface is not recommended, as added methods to ETHBACKENDServer will -// result in compilation errors. -type UnsafeETHBACKENDServer interface { - mustEmbedUnimplementedETHBACKENDServer() -} - -func RegisterETHBACKENDServer(s grpc.ServiceRegistrar, srv ETHBACKENDServer) { - s.RegisterService(ÐBACKEND_ServiceDesc, srv) -} - -func _ETHBACKEND_Etherbase_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(EtherbaseRequest) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(ETHBACKENDServer).Etherbase(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/remote.ETHBACKEND/Etherbase", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(ETHBACKENDServer).Etherbase(ctx, req.(*EtherbaseRequest)) - } - return interceptor(ctx, in, info, handler) -} - -func _ETHBACKEND_NetVersion_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(NetVersionRequest) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(ETHBACKENDServer).NetVersion(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/remote.ETHBACKEND/NetVersion", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(ETHBACKENDServer).NetVersion(ctx, req.(*NetVersionRequest)) - } - return interceptor(ctx, in, info, handler) -} - -func _ETHBACKEND_NetPeerCount_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(NetPeerCountRequest) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(ETHBACKENDServer).NetPeerCount(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/remote.ETHBACKEND/NetPeerCount", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(ETHBACKENDServer).NetPeerCount(ctx, req.(*NetPeerCountRequest)) - } - return interceptor(ctx, in, info, handler) -} - -func _ETHBACKEND_Version_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(emptypb.Empty) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(ETHBACKENDServer).Version(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/remote.ETHBACKEND/Version", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(ETHBACKENDServer).Version(ctx, req.(*emptypb.Empty)) - } - return interceptor(ctx, in, info, handler) -} - -func _ETHBACKEND_ProtocolVersion_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(ProtocolVersionRequest) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(ETHBACKENDServer).ProtocolVersion(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/remote.ETHBACKEND/ProtocolVersion", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(ETHBACKENDServer).ProtocolVersion(ctx, req.(*ProtocolVersionRequest)) - } - return interceptor(ctx, in, info, handler) -} - -func _ETHBACKEND_ClientVersion_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(ClientVersionRequest) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(ETHBACKENDServer).ClientVersion(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/remote.ETHBACKEND/ClientVersion", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(ETHBACKENDServer).ClientVersion(ctx, req.(*ClientVersionRequest)) - } - return interceptor(ctx, in, info, handler) -} - -func _ETHBACKEND_Subscribe_Handler(srv interface{}, stream grpc.ServerStream) error { - m := new(SubscribeRequest) - if err := stream.RecvMsg(m); err != nil { - return err - } - return srv.(ETHBACKENDServer).Subscribe(m, &eTHBACKENDSubscribeServer{stream}) -} - -type ETHBACKEND_SubscribeServer interface { - Send(*SubscribeReply) error - grpc.ServerStream -} - -type eTHBACKENDSubscribeServer struct { - grpc.ServerStream -} - -func (x *eTHBACKENDSubscribeServer) Send(m *SubscribeReply) error { - return x.ServerStream.SendMsg(m) -} - -// ETHBACKEND_ServiceDesc is the grpc.ServiceDesc for ETHBACKEND service. -// It's only intended for direct use with grpc.RegisterService, -// and not to be introspected or modified (even as a copy) -var ETHBACKEND_ServiceDesc = grpc.ServiceDesc{ - ServiceName: "remote.ETHBACKEND", - HandlerType: (*ETHBACKENDServer)(nil), - Methods: []grpc.MethodDesc{ - { - MethodName: "Etherbase", - Handler: _ETHBACKEND_Etherbase_Handler, - }, - { - MethodName: "NetVersion", - Handler: _ETHBACKEND_NetVersion_Handler, - }, - { - MethodName: "NetPeerCount", - Handler: _ETHBACKEND_NetPeerCount_Handler, - }, - { - MethodName: "Version", - Handler: _ETHBACKEND_Version_Handler, - }, - { - MethodName: "ProtocolVersion", - Handler: _ETHBACKEND_ProtocolVersion_Handler, - }, - { - MethodName: "ClientVersion", - Handler: _ETHBACKEND_ClientVersion_Handler, - }, - }, - Streams: []grpc.StreamDesc{ - { - StreamName: "Subscribe", - Handler: _ETHBACKEND_Subscribe_Handler, - ServerStreams: true, - }, - }, - Metadata: "remote/ethbackend.proto", -} diff --git a/gointerfaces/remote/kv.pb.go b/gointerfaces/remote/kv.pb.go deleted file mode 100644 index ecd34d89ba..0000000000 --- a/gointerfaces/remote/kv.pb.go +++ /dev/null @@ -1,795 +0,0 @@ -// Code generated by protoc-gen-go. DO NOT EDIT. -// versions: -// protoc-gen-go v1.26.0 -// protoc v3.17.3 -// source: remote/kv.proto - -package remote - -import ( - types "github.com/ledgerwatch/erigon/gointerfaces/types" - protoreflect "google.golang.org/protobuf/reflect/protoreflect" - protoimpl "google.golang.org/protobuf/runtime/protoimpl" - emptypb "google.golang.org/protobuf/types/known/emptypb" - reflect "reflect" - sync "sync" -) - -const ( - // Verify that this generated code is sufficiently up-to-date. - _ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion) - // Verify that runtime/protoimpl is sufficiently up-to-date. - _ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20) -) - -type Op int32 - -const ( - Op_FIRST Op = 0 - Op_FIRST_DUP Op = 1 - Op_SEEK Op = 2 - Op_SEEK_BOTH Op = 3 - Op_CURRENT Op = 4 - Op_LAST Op = 6 - Op_LAST_DUP Op = 7 - Op_NEXT Op = 8 - Op_NEXT_DUP Op = 9 - Op_NEXT_NO_DUP Op = 11 - Op_PREV Op = 12 - Op_PREV_DUP Op = 13 - Op_PREV_NO_DUP Op = 14 - Op_SEEK_EXACT Op = 15 - Op_SEEK_BOTH_EXACT Op = 16 - Op_OPEN Op = 30 - Op_CLOSE Op = 31 -) - -// Enum value maps for Op. -var ( - Op_name = map[int32]string{ - 0: "FIRST", - 1: "FIRST_DUP", - 2: "SEEK", - 3: "SEEK_BOTH", - 4: "CURRENT", - 6: "LAST", - 7: "LAST_DUP", - 8: "NEXT", - 9: "NEXT_DUP", - 11: "NEXT_NO_DUP", - 12: "PREV", - 13: "PREV_DUP", - 14: "PREV_NO_DUP", - 15: "SEEK_EXACT", - 16: "SEEK_BOTH_EXACT", - 30: "OPEN", - 31: "CLOSE", - } - Op_value = map[string]int32{ - "FIRST": 0, - "FIRST_DUP": 1, - "SEEK": 2, - "SEEK_BOTH": 3, - "CURRENT": 4, - "LAST": 6, - "LAST_DUP": 7, - "NEXT": 8, - "NEXT_DUP": 9, - "NEXT_NO_DUP": 11, - "PREV": 12, - "PREV_DUP": 13, - "PREV_NO_DUP": 14, - "SEEK_EXACT": 15, - "SEEK_BOTH_EXACT": 16, - "OPEN": 30, - "CLOSE": 31, - } -) - -func (x Op) Enum() *Op { - p := new(Op) - *p = x - return p -} - -func (x Op) String() string { - return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) -} - -func (Op) Descriptor() protoreflect.EnumDescriptor { - return file_remote_kv_proto_enumTypes[0].Descriptor() -} - -func (Op) Type() protoreflect.EnumType { - return &file_remote_kv_proto_enumTypes[0] -} - -func (x Op) Number() protoreflect.EnumNumber { - return protoreflect.EnumNumber(x) -} - -// Deprecated: Use Op.Descriptor instead. -func (Op) EnumDescriptor() ([]byte, []int) { - return file_remote_kv_proto_rawDescGZIP(), []int{0} -} - -type Action int32 - -const ( - Action_STORAGE Action = 0 // Change only in the storage - Action_UPSERT Action = 1 // Change of balance or nonce (and optionally storage) - Action_CODE Action = 2 // Change of code (and optionally storage) - Action_UPSERT_CODE Action = 3 // Change in (balance or nonce) and code (and optinally storage) - Action_DELETE Action = 4 // Account is deleted -) - -// Enum value maps for Action. -var ( - Action_name = map[int32]string{ - 0: "STORAGE", - 1: "UPSERT", - 2: "CODE", - 3: "UPSERT_CODE", - 4: "DELETE", - } - Action_value = map[string]int32{ - "STORAGE": 0, - "UPSERT": 1, - "CODE": 2, - "UPSERT_CODE": 3, - "DELETE": 4, - } -) - -func (x Action) Enum() *Action { - p := new(Action) - *p = x - return p -} - -func (x Action) String() string { - return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) -} - -func (Action) Descriptor() protoreflect.EnumDescriptor { - return file_remote_kv_proto_enumTypes[1].Descriptor() -} - -func (Action) Type() protoreflect.EnumType { - return &file_remote_kv_proto_enumTypes[1] -} - -func (x Action) Number() protoreflect.EnumNumber { - return protoreflect.EnumNumber(x) -} - -// Deprecated: Use Action.Descriptor instead. -func (Action) EnumDescriptor() ([]byte, []int) { - return file_remote_kv_proto_rawDescGZIP(), []int{1} -} - -type Direction int32 - -const ( - Direction_FORWARD Direction = 0 - Direction_UNWIND Direction = 1 -) - -// Enum value maps for Direction. -var ( - Direction_name = map[int32]string{ - 0: "FORWARD", - 1: "UNWIND", - } - Direction_value = map[string]int32{ - "FORWARD": 0, - "UNWIND": 1, - } -) - -func (x Direction) Enum() *Direction { - p := new(Direction) - *p = x - return p -} - -func (x Direction) String() string { - return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) -} - -func (Direction) Descriptor() protoreflect.EnumDescriptor { - return file_remote_kv_proto_enumTypes[2].Descriptor() -} - -func (Direction) Type() protoreflect.EnumType { - return &file_remote_kv_proto_enumTypes[2] -} - -func (x Direction) Number() protoreflect.EnumNumber { - return protoreflect.EnumNumber(x) -} - -// Deprecated: Use Direction.Descriptor instead. -func (Direction) EnumDescriptor() ([]byte, []int) { - return file_remote_kv_proto_rawDescGZIP(), []int{2} -} - -type Cursor struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - Op Op `protobuf:"varint,1,opt,name=op,proto3,enum=remote.Op" json:"op,omitempty"` - BucketName string `protobuf:"bytes,2,opt,name=bucketName,proto3" json:"bucketName,omitempty"` - Cursor uint32 `protobuf:"varint,3,opt,name=cursor,proto3" json:"cursor,omitempty"` - K []byte `protobuf:"bytes,4,opt,name=k,proto3" json:"k,omitempty"` - V []byte `protobuf:"bytes,5,opt,name=v,proto3" json:"v,omitempty"` -} - -func (x *Cursor) Reset() { - *x = Cursor{} - if protoimpl.UnsafeEnabled { - mi := &file_remote_kv_proto_msgTypes[0] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *Cursor) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*Cursor) ProtoMessage() {} - -func (x *Cursor) ProtoReflect() protoreflect.Message { - mi := &file_remote_kv_proto_msgTypes[0] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use Cursor.ProtoReflect.Descriptor instead. -func (*Cursor) Descriptor() ([]byte, []int) { - return file_remote_kv_proto_rawDescGZIP(), []int{0} -} - -func (x *Cursor) GetOp() Op { - if x != nil { - return x.Op - } - return Op_FIRST -} - -func (x *Cursor) GetBucketName() string { - if x != nil { - return x.BucketName - } - return "" -} - -func (x *Cursor) GetCursor() uint32 { - if x != nil { - return x.Cursor - } - return 0 -} - -func (x *Cursor) GetK() []byte { - if x != nil { - return x.K - } - return nil -} - -func (x *Cursor) GetV() []byte { - if x != nil { - return x.V - } - return nil -} - -type Pair struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - K []byte `protobuf:"bytes,1,opt,name=k,proto3" json:"k,omitempty"` - V []byte `protobuf:"bytes,2,opt,name=v,proto3" json:"v,omitempty"` - CursorID uint32 `protobuf:"varint,3,opt,name=cursorID,proto3" json:"cursorID,omitempty"` -} - -func (x *Pair) Reset() { - *x = Pair{} - if protoimpl.UnsafeEnabled { - mi := &file_remote_kv_proto_msgTypes[1] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *Pair) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*Pair) ProtoMessage() {} - -func (x *Pair) ProtoReflect() protoreflect.Message { - mi := &file_remote_kv_proto_msgTypes[1] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use Pair.ProtoReflect.Descriptor instead. -func (*Pair) Descriptor() ([]byte, []int) { - return file_remote_kv_proto_rawDescGZIP(), []int{1} -} - -func (x *Pair) GetK() []byte { - if x != nil { - return x.K - } - return nil -} - -func (x *Pair) GetV() []byte { - if x != nil { - return x.V - } - return nil -} - -func (x *Pair) GetCursorID() uint32 { - if x != nil { - return x.CursorID - } - return 0 -} - -type StorageChange struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - Location *types.H256 `protobuf:"bytes,1,opt,name=location,proto3" json:"location,omitempty"` - Data []byte `protobuf:"bytes,2,opt,name=data,proto3" json:"data,omitempty"` -} - -func (x *StorageChange) Reset() { - *x = StorageChange{} - if protoimpl.UnsafeEnabled { - mi := &file_remote_kv_proto_msgTypes[2] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *StorageChange) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*StorageChange) ProtoMessage() {} - -func (x *StorageChange) ProtoReflect() protoreflect.Message { - mi := &file_remote_kv_proto_msgTypes[2] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use StorageChange.ProtoReflect.Descriptor instead. -func (*StorageChange) Descriptor() ([]byte, []int) { - return file_remote_kv_proto_rawDescGZIP(), []int{2} -} - -func (x *StorageChange) GetLocation() *types.H256 { - if x != nil { - return x.Location - } - return nil -} - -func (x *StorageChange) GetData() []byte { - if x != nil { - return x.Data - } - return nil -} - -type AccountChange struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - Address *types.H160 `protobuf:"bytes,1,opt,name=address,proto3" json:"address,omitempty"` - Incarnation uint64 `protobuf:"varint,2,opt,name=incarnation,proto3" json:"incarnation,omitempty"` - Action Action `protobuf:"varint,3,opt,name=action,proto3,enum=remote.Action" json:"action,omitempty"` - Data []byte `protobuf:"bytes,4,opt,name=data,proto3" json:"data,omitempty"` // nil if there is no UPSERT in action - Code []byte `protobuf:"bytes,5,opt,name=code,proto3" json:"code,omitempty"` // nil if there is no CODE in action - StorageChanges []*StorageChange `protobuf:"bytes,6,rep,name=storageChanges,proto3" json:"storageChanges,omitempty"` -} - -func (x *AccountChange) Reset() { - *x = AccountChange{} - if protoimpl.UnsafeEnabled { - mi := &file_remote_kv_proto_msgTypes[3] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *AccountChange) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*AccountChange) ProtoMessage() {} - -func (x *AccountChange) ProtoReflect() protoreflect.Message { - mi := &file_remote_kv_proto_msgTypes[3] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use AccountChange.ProtoReflect.Descriptor instead. -func (*AccountChange) Descriptor() ([]byte, []int) { - return file_remote_kv_proto_rawDescGZIP(), []int{3} -} - -func (x *AccountChange) GetAddress() *types.H160 { - if x != nil { - return x.Address - } - return nil -} - -func (x *AccountChange) GetIncarnation() uint64 { - if x != nil { - return x.Incarnation - } - return 0 -} - -func (x *AccountChange) GetAction() Action { - if x != nil { - return x.Action - } - return Action_STORAGE -} - -func (x *AccountChange) GetData() []byte { - if x != nil { - return x.Data - } - return nil -} - -func (x *AccountChange) GetCode() []byte { - if x != nil { - return x.Code - } - return nil -} - -func (x *AccountChange) GetStorageChanges() []*StorageChange { - if x != nil { - return x.StorageChanges - } - return nil -} - -type StateChange struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - Direction Direction `protobuf:"varint,1,opt,name=direction,proto3,enum=remote.Direction" json:"direction,omitempty"` - BlockHeight uint64 `protobuf:"varint,2,opt,name=blockHeight,proto3" json:"blockHeight,omitempty"` - BlockHash *types.H256 `protobuf:"bytes,3,opt,name=blockHash,proto3" json:"blockHash,omitempty"` - Changes []*AccountChange `protobuf:"bytes,4,rep,name=changes,proto3" json:"changes,omitempty"` -} - -func (x *StateChange) Reset() { - *x = StateChange{} - if protoimpl.UnsafeEnabled { - mi := &file_remote_kv_proto_msgTypes[4] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *StateChange) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*StateChange) ProtoMessage() {} - -func (x *StateChange) ProtoReflect() protoreflect.Message { - mi := &file_remote_kv_proto_msgTypes[4] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use StateChange.ProtoReflect.Descriptor instead. -func (*StateChange) Descriptor() ([]byte, []int) { - return file_remote_kv_proto_rawDescGZIP(), []int{4} -} - -func (x *StateChange) GetDirection() Direction { - if x != nil { - return x.Direction - } - return Direction_FORWARD -} - -func (x *StateChange) GetBlockHeight() uint64 { - if x != nil { - return x.BlockHeight - } - return 0 -} - -func (x *StateChange) GetBlockHash() *types.H256 { - if x != nil { - return x.BlockHash - } - return nil -} - -func (x *StateChange) GetChanges() []*AccountChange { - if x != nil { - return x.Changes - } - return nil -} - -var File_remote_kv_proto protoreflect.FileDescriptor - -var file_remote_kv_proto_rawDesc = []byte{ - 0x0a, 0x0f, 0x72, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x2f, 0x6b, 0x76, 0x2e, 0x70, 0x72, 0x6f, 0x74, - 0x6f, 0x12, 0x06, 0x72, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x1a, 0x1b, 0x67, 0x6f, 0x6f, 0x67, 0x6c, - 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2f, 0x65, 0x6d, 0x70, 0x74, 0x79, - 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x11, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2f, 0x74, 0x79, - 0x70, 0x65, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0x78, 0x0a, 0x06, 0x43, 0x75, 0x72, - 0x73, 0x6f, 0x72, 0x12, 0x1a, 0x0a, 0x02, 0x6f, 0x70, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, - 0x0a, 0x2e, 0x72, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x2e, 0x4f, 0x70, 0x52, 0x02, 0x6f, 0x70, 0x12, - 0x1e, 0x0a, 0x0a, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x0a, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x12, - 0x16, 0x0a, 0x06, 0x63, 0x75, 0x72, 0x73, 0x6f, 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0d, 0x52, - 0x06, 0x63, 0x75, 0x72, 0x73, 0x6f, 0x72, 0x12, 0x0c, 0x0a, 0x01, 0x6b, 0x18, 0x04, 0x20, 0x01, - 0x28, 0x0c, 0x52, 0x01, 0x6b, 0x12, 0x0c, 0x0a, 0x01, 0x76, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0c, - 0x52, 0x01, 0x76, 0x22, 0x3e, 0x0a, 0x04, 0x50, 0x61, 0x69, 0x72, 0x12, 0x0c, 0x0a, 0x01, 0x6b, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x01, 0x6b, 0x12, 0x0c, 0x0a, 0x01, 0x76, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x0c, 0x52, 0x01, 0x76, 0x12, 0x1a, 0x0a, 0x08, 0x63, 0x75, 0x72, 0x73, 0x6f, - 0x72, 0x49, 0x44, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x08, 0x63, 0x75, 0x72, 0x73, 0x6f, - 0x72, 0x49, 0x44, 0x22, 0x4c, 0x0a, 0x0d, 0x53, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x43, 0x68, - 0x61, 0x6e, 0x67, 0x65, 0x12, 0x27, 0x0a, 0x08, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0b, 0x2e, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2e, 0x48, - 0x32, 0x35, 0x36, 0x52, 0x08, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x12, 0x0a, - 0x04, 0x64, 0x61, 0x74, 0x61, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x04, 0x64, 0x61, 0x74, - 0x61, 0x22, 0xe7, 0x01, 0x0a, 0x0d, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x43, 0x68, 0x61, - 0x6e, 0x67, 0x65, 0x12, 0x25, 0x0a, 0x07, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0b, 0x2e, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2e, 0x48, 0x31, 0x36, - 0x30, 0x52, 0x07, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x20, 0x0a, 0x0b, 0x69, 0x6e, - 0x63, 0x61, 0x72, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, - 0x0b, 0x69, 0x6e, 0x63, 0x61, 0x72, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x26, 0x0a, 0x06, - 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x0e, 0x2e, 0x72, - 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x2e, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x06, 0x61, 0x63, - 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x12, 0x0a, 0x04, 0x64, 0x61, 0x74, 0x61, 0x18, 0x04, 0x20, 0x01, - 0x28, 0x0c, 0x52, 0x04, 0x64, 0x61, 0x74, 0x61, 0x12, 0x12, 0x0a, 0x04, 0x63, 0x6f, 0x64, 0x65, - 0x18, 0x05, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x04, 0x63, 0x6f, 0x64, 0x65, 0x12, 0x3d, 0x0a, 0x0e, - 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x73, 0x18, 0x06, - 0x20, 0x03, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x72, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x2e, 0x53, 0x74, - 0x6f, 0x72, 0x61, 0x67, 0x65, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x52, 0x0e, 0x73, 0x74, 0x6f, - 0x72, 0x61, 0x67, 0x65, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x73, 0x22, 0xbc, 0x01, 0x0a, 0x0b, - 0x53, 0x74, 0x61, 0x74, 0x65, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x12, 0x2f, 0x0a, 0x09, 0x64, - 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x11, - 0x2e, 0x72, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x2e, 0x44, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6f, - 0x6e, 0x52, 0x09, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x20, 0x0a, 0x0b, - 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x48, 0x65, 0x69, 0x67, 0x68, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x04, 0x52, 0x0b, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x48, 0x65, 0x69, 0x67, 0x68, 0x74, 0x12, 0x29, - 0x0a, 0x09, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x48, 0x61, 0x73, 0x68, 0x18, 0x03, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x0b, 0x2e, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2e, 0x48, 0x32, 0x35, 0x36, 0x52, 0x09, - 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x48, 0x61, 0x73, 0x68, 0x12, 0x2f, 0x0a, 0x07, 0x63, 0x68, 0x61, - 0x6e, 0x67, 0x65, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x72, 0x65, 0x6d, - 0x6f, 0x74, 0x65, 0x2e, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x43, 0x68, 0x61, 0x6e, 0x67, - 0x65, 0x52, 0x07, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x73, 0x2a, 0xe8, 0x01, 0x0a, 0x02, 0x4f, - 0x70, 0x12, 0x09, 0x0a, 0x05, 0x46, 0x49, 0x52, 0x53, 0x54, 0x10, 0x00, 0x12, 0x0d, 0x0a, 0x09, - 0x46, 0x49, 0x52, 0x53, 0x54, 0x5f, 0x44, 0x55, 0x50, 0x10, 0x01, 0x12, 0x08, 0x0a, 0x04, 0x53, - 0x45, 0x45, 0x4b, 0x10, 0x02, 0x12, 0x0d, 0x0a, 0x09, 0x53, 0x45, 0x45, 0x4b, 0x5f, 0x42, 0x4f, - 0x54, 0x48, 0x10, 0x03, 0x12, 0x0b, 0x0a, 0x07, 0x43, 0x55, 0x52, 0x52, 0x45, 0x4e, 0x54, 0x10, - 0x04, 0x12, 0x08, 0x0a, 0x04, 0x4c, 0x41, 0x53, 0x54, 0x10, 0x06, 0x12, 0x0c, 0x0a, 0x08, 0x4c, - 0x41, 0x53, 0x54, 0x5f, 0x44, 0x55, 0x50, 0x10, 0x07, 0x12, 0x08, 0x0a, 0x04, 0x4e, 0x45, 0x58, - 0x54, 0x10, 0x08, 0x12, 0x0c, 0x0a, 0x08, 0x4e, 0x45, 0x58, 0x54, 0x5f, 0x44, 0x55, 0x50, 0x10, - 0x09, 0x12, 0x0f, 0x0a, 0x0b, 0x4e, 0x45, 0x58, 0x54, 0x5f, 0x4e, 0x4f, 0x5f, 0x44, 0x55, 0x50, - 0x10, 0x0b, 0x12, 0x08, 0x0a, 0x04, 0x50, 0x52, 0x45, 0x56, 0x10, 0x0c, 0x12, 0x0c, 0x0a, 0x08, - 0x50, 0x52, 0x45, 0x56, 0x5f, 0x44, 0x55, 0x50, 0x10, 0x0d, 0x12, 0x0f, 0x0a, 0x0b, 0x50, 0x52, - 0x45, 0x56, 0x5f, 0x4e, 0x4f, 0x5f, 0x44, 0x55, 0x50, 0x10, 0x0e, 0x12, 0x0e, 0x0a, 0x0a, 0x53, - 0x45, 0x45, 0x4b, 0x5f, 0x45, 0x58, 0x41, 0x43, 0x54, 0x10, 0x0f, 0x12, 0x13, 0x0a, 0x0f, 0x53, - 0x45, 0x45, 0x4b, 0x5f, 0x42, 0x4f, 0x54, 0x48, 0x5f, 0x45, 0x58, 0x41, 0x43, 0x54, 0x10, 0x10, - 0x12, 0x08, 0x0a, 0x04, 0x4f, 0x50, 0x45, 0x4e, 0x10, 0x1e, 0x12, 0x09, 0x0a, 0x05, 0x43, 0x4c, - 0x4f, 0x53, 0x45, 0x10, 0x1f, 0x2a, 0x48, 0x0a, 0x06, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, - 0x0b, 0x0a, 0x07, 0x53, 0x54, 0x4f, 0x52, 0x41, 0x47, 0x45, 0x10, 0x00, 0x12, 0x0a, 0x0a, 0x06, - 0x55, 0x50, 0x53, 0x45, 0x52, 0x54, 0x10, 0x01, 0x12, 0x08, 0x0a, 0x04, 0x43, 0x4f, 0x44, 0x45, - 0x10, 0x02, 0x12, 0x0f, 0x0a, 0x0b, 0x55, 0x50, 0x53, 0x45, 0x52, 0x54, 0x5f, 0x43, 0x4f, 0x44, - 0x45, 0x10, 0x03, 0x12, 0x0a, 0x0a, 0x06, 0x44, 0x45, 0x4c, 0x45, 0x54, 0x45, 0x10, 0x04, 0x2a, - 0x24, 0x0a, 0x09, 0x44, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x0b, 0x0a, 0x07, - 0x46, 0x4f, 0x52, 0x57, 0x41, 0x52, 0x44, 0x10, 0x00, 0x12, 0x0a, 0x0a, 0x06, 0x55, 0x4e, 0x57, - 0x49, 0x4e, 0x44, 0x10, 0x01, 0x32, 0xaa, 0x01, 0x0a, 0x02, 0x4b, 0x56, 0x12, 0x36, 0x0a, 0x07, - 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, - 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, - 0x13, 0x2e, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2e, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x52, - 0x65, 0x70, 0x6c, 0x79, 0x12, 0x26, 0x0a, 0x02, 0x54, 0x78, 0x12, 0x0e, 0x2e, 0x72, 0x65, 0x6d, - 0x6f, 0x74, 0x65, 0x2e, 0x43, 0x75, 0x72, 0x73, 0x6f, 0x72, 0x1a, 0x0c, 0x2e, 0x72, 0x65, 0x6d, - 0x6f, 0x74, 0x65, 0x2e, 0x50, 0x61, 0x69, 0x72, 0x28, 0x01, 0x30, 0x01, 0x12, 0x44, 0x0a, 0x13, - 0x52, 0x65, 0x63, 0x65, 0x69, 0x76, 0x65, 0x53, 0x74, 0x61, 0x74, 0x65, 0x43, 0x68, 0x61, 0x6e, - 0x67, 0x65, 0x73, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, - 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x13, 0x2e, 0x72, 0x65, - 0x6d, 0x6f, 0x74, 0x65, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x65, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, - 0x30, 0x01, 0x42, 0x11, 0x5a, 0x0f, 0x2e, 0x2f, 0x72, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x3b, 0x72, - 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, -} - -var ( - file_remote_kv_proto_rawDescOnce sync.Once - file_remote_kv_proto_rawDescData = file_remote_kv_proto_rawDesc -) - -func file_remote_kv_proto_rawDescGZIP() []byte { - file_remote_kv_proto_rawDescOnce.Do(func() { - file_remote_kv_proto_rawDescData = protoimpl.X.CompressGZIP(file_remote_kv_proto_rawDescData) - }) - return file_remote_kv_proto_rawDescData -} - -var file_remote_kv_proto_enumTypes = make([]protoimpl.EnumInfo, 3) -var file_remote_kv_proto_msgTypes = make([]protoimpl.MessageInfo, 5) -var file_remote_kv_proto_goTypes = []interface{}{ - (Op)(0), // 0: remote.Op - (Action)(0), // 1: remote.Action - (Direction)(0), // 2: remote.Direction - (*Cursor)(nil), // 3: remote.Cursor - (*Pair)(nil), // 4: remote.Pair - (*StorageChange)(nil), // 5: remote.StorageChange - (*AccountChange)(nil), // 6: remote.AccountChange - (*StateChange)(nil), // 7: remote.StateChange - (*types.H256)(nil), // 8: types.H256 - (*types.H160)(nil), // 9: types.H160 - (*emptypb.Empty)(nil), // 10: google.protobuf.Empty - (*types.VersionReply)(nil), // 11: types.VersionReply -} -var file_remote_kv_proto_depIdxs = []int32{ - 0, // 0: remote.Cursor.op:type_name -> remote.Op - 8, // 1: remote.StorageChange.location:type_name -> types.H256 - 9, // 2: remote.AccountChange.address:type_name -> types.H160 - 1, // 3: remote.AccountChange.action:type_name -> remote.Action - 5, // 4: remote.AccountChange.storageChanges:type_name -> remote.StorageChange - 2, // 5: remote.StateChange.direction:type_name -> remote.Direction - 8, // 6: remote.StateChange.blockHash:type_name -> types.H256 - 6, // 7: remote.StateChange.changes:type_name -> remote.AccountChange - 10, // 8: remote.KV.Version:input_type -> google.protobuf.Empty - 3, // 9: remote.KV.Tx:input_type -> remote.Cursor - 10, // 10: remote.KV.ReceiveStateChanges:input_type -> google.protobuf.Empty - 11, // 11: remote.KV.Version:output_type -> types.VersionReply - 4, // 12: remote.KV.Tx:output_type -> remote.Pair - 7, // 13: remote.KV.ReceiveStateChanges:output_type -> remote.StateChange - 11, // [11:14] is the sub-list for method output_type - 8, // [8:11] is the sub-list for method input_type - 8, // [8:8] is the sub-list for extension type_name - 8, // [8:8] is the sub-list for extension extendee - 0, // [0:8] is the sub-list for field type_name -} - -func init() { file_remote_kv_proto_init() } -func file_remote_kv_proto_init() { - if File_remote_kv_proto != nil { - return - } - if !protoimpl.UnsafeEnabled { - file_remote_kv_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*Cursor); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_remote_kv_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*Pair); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_remote_kv_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*StorageChange); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_remote_kv_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*AccountChange); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_remote_kv_proto_msgTypes[4].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*StateChange); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - } - type x struct{} - out := protoimpl.TypeBuilder{ - File: protoimpl.DescBuilder{ - GoPackagePath: reflect.TypeOf(x{}).PkgPath(), - RawDescriptor: file_remote_kv_proto_rawDesc, - NumEnums: 3, - NumMessages: 5, - NumExtensions: 0, - NumServices: 1, - }, - GoTypes: file_remote_kv_proto_goTypes, - DependencyIndexes: file_remote_kv_proto_depIdxs, - EnumInfos: file_remote_kv_proto_enumTypes, - MessageInfos: file_remote_kv_proto_msgTypes, - }.Build() - File_remote_kv_proto = out.File - file_remote_kv_proto_rawDesc = nil - file_remote_kv_proto_goTypes = nil - file_remote_kv_proto_depIdxs = nil -} diff --git a/gointerfaces/remote/kv_grpc.pb.go b/gointerfaces/remote/kv_grpc.pb.go deleted file mode 100644 index 26c0707704..0000000000 --- a/gointerfaces/remote/kv_grpc.pb.go +++ /dev/null @@ -1,239 +0,0 @@ -// Code generated by protoc-gen-go-grpc. DO NOT EDIT. - -package remote - -import ( - context "context" - types "github.com/ledgerwatch/erigon/gointerfaces/types" - grpc "google.golang.org/grpc" - codes "google.golang.org/grpc/codes" - status "google.golang.org/grpc/status" - emptypb "google.golang.org/protobuf/types/known/emptypb" -) - -// This is a compile-time assertion to ensure that this generated file -// is compatible with the grpc package it is being compiled against. -// Requires gRPC-Go v1.32.0 or later. -const _ = grpc.SupportPackageIsVersion7 - -// KVClient is the client API for KV service. -// -// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://pkg.go.dev/google.golang.org/grpc/?tab=doc#ClientConn.NewStream. -type KVClient interface { - // Version returns the service version number - Version(ctx context.Context, in *emptypb.Empty, opts ...grpc.CallOption) (*types.VersionReply, error) - // Tx exposes read-only transactions for the key-value store - Tx(ctx context.Context, opts ...grpc.CallOption) (KV_TxClient, error) - ReceiveStateChanges(ctx context.Context, in *emptypb.Empty, opts ...grpc.CallOption) (KV_ReceiveStateChangesClient, error) -} - -type kVClient struct { - cc grpc.ClientConnInterface -} - -func NewKVClient(cc grpc.ClientConnInterface) KVClient { - return &kVClient{cc} -} - -func (c *kVClient) Version(ctx context.Context, in *emptypb.Empty, opts ...grpc.CallOption) (*types.VersionReply, error) { - out := new(types.VersionReply) - err := c.cc.Invoke(ctx, "/remote.KV/Version", in, out, opts...) - if err != nil { - return nil, err - } - return out, nil -} - -func (c *kVClient) Tx(ctx context.Context, opts ...grpc.CallOption) (KV_TxClient, error) { - stream, err := c.cc.NewStream(ctx, &KV_ServiceDesc.Streams[0], "/remote.KV/Tx", opts...) - if err != nil { - return nil, err - } - x := &kVTxClient{stream} - return x, nil -} - -type KV_TxClient interface { - Send(*Cursor) error - Recv() (*Pair, error) - grpc.ClientStream -} - -type kVTxClient struct { - grpc.ClientStream -} - -func (x *kVTxClient) Send(m *Cursor) error { - return x.ClientStream.SendMsg(m) -} - -func (x *kVTxClient) Recv() (*Pair, error) { - m := new(Pair) - if err := x.ClientStream.RecvMsg(m); err != nil { - return nil, err - } - return m, nil -} - -func (c *kVClient) ReceiveStateChanges(ctx context.Context, in *emptypb.Empty, opts ...grpc.CallOption) (KV_ReceiveStateChangesClient, error) { - stream, err := c.cc.NewStream(ctx, &KV_ServiceDesc.Streams[1], "/remote.KV/ReceiveStateChanges", opts...) - if err != nil { - return nil, err - } - x := &kVReceiveStateChangesClient{stream} - if err := x.ClientStream.SendMsg(in); err != nil { - return nil, err - } - if err := x.ClientStream.CloseSend(); err != nil { - return nil, err - } - return x, nil -} - -type KV_ReceiveStateChangesClient interface { - Recv() (*StateChange, error) - grpc.ClientStream -} - -type kVReceiveStateChangesClient struct { - grpc.ClientStream -} - -func (x *kVReceiveStateChangesClient) Recv() (*StateChange, error) { - m := new(StateChange) - if err := x.ClientStream.RecvMsg(m); err != nil { - return nil, err - } - return m, nil -} - -// KVServer is the server API for KV service. -// All implementations must embed UnimplementedKVServer -// for forward compatibility -type KVServer interface { - // Version returns the service version number - Version(context.Context, *emptypb.Empty) (*types.VersionReply, error) - // Tx exposes read-only transactions for the key-value store - Tx(KV_TxServer) error - ReceiveStateChanges(*emptypb.Empty, KV_ReceiveStateChangesServer) error - mustEmbedUnimplementedKVServer() -} - -// UnimplementedKVServer must be embedded to have forward compatible implementations. -type UnimplementedKVServer struct { -} - -func (UnimplementedKVServer) Version(context.Context, *emptypb.Empty) (*types.VersionReply, error) { - return nil, status.Errorf(codes.Unimplemented, "method Version not implemented") -} -func (UnimplementedKVServer) Tx(KV_TxServer) error { - return status.Errorf(codes.Unimplemented, "method Tx not implemented") -} -func (UnimplementedKVServer) ReceiveStateChanges(*emptypb.Empty, KV_ReceiveStateChangesServer) error { - return status.Errorf(codes.Unimplemented, "method ReceiveStateChanges not implemented") -} -func (UnimplementedKVServer) mustEmbedUnimplementedKVServer() {} - -// UnsafeKVServer may be embedded to opt out of forward compatibility for this service. -// Use of this interface is not recommended, as added methods to KVServer will -// result in compilation errors. -type UnsafeKVServer interface { - mustEmbedUnimplementedKVServer() -} - -func RegisterKVServer(s grpc.ServiceRegistrar, srv KVServer) { - s.RegisterService(&KV_ServiceDesc, srv) -} - -func _KV_Version_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(emptypb.Empty) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(KVServer).Version(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/remote.KV/Version", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(KVServer).Version(ctx, req.(*emptypb.Empty)) - } - return interceptor(ctx, in, info, handler) -} - -func _KV_Tx_Handler(srv interface{}, stream grpc.ServerStream) error { - return srv.(KVServer).Tx(&kVTxServer{stream}) -} - -type KV_TxServer interface { - Send(*Pair) error - Recv() (*Cursor, error) - grpc.ServerStream -} - -type kVTxServer struct { - grpc.ServerStream -} - -func (x *kVTxServer) Send(m *Pair) error { - return x.ServerStream.SendMsg(m) -} - -func (x *kVTxServer) Recv() (*Cursor, error) { - m := new(Cursor) - if err := x.ServerStream.RecvMsg(m); err != nil { - return nil, err - } - return m, nil -} - -func _KV_ReceiveStateChanges_Handler(srv interface{}, stream grpc.ServerStream) error { - m := new(emptypb.Empty) - if err := stream.RecvMsg(m); err != nil { - return err - } - return srv.(KVServer).ReceiveStateChanges(m, &kVReceiveStateChangesServer{stream}) -} - -type KV_ReceiveStateChangesServer interface { - Send(*StateChange) error - grpc.ServerStream -} - -type kVReceiveStateChangesServer struct { - grpc.ServerStream -} - -func (x *kVReceiveStateChangesServer) Send(m *StateChange) error { - return x.ServerStream.SendMsg(m) -} - -// KV_ServiceDesc is the grpc.ServiceDesc for KV service. -// It's only intended for direct use with grpc.RegisterService, -// and not to be introspected or modified (even as a copy) -var KV_ServiceDesc = grpc.ServiceDesc{ - ServiceName: "remote.KV", - HandlerType: (*KVServer)(nil), - Methods: []grpc.MethodDesc{ - { - MethodName: "Version", - Handler: _KV_Version_Handler, - }, - }, - Streams: []grpc.StreamDesc{ - { - StreamName: "Tx", - Handler: _KV_Tx_Handler, - ServerStreams: true, - ClientStreams: true, - }, - { - StreamName: "ReceiveStateChanges", - Handler: _KV_ReceiveStateChanges_Handler, - ServerStreams: true, - }, - }, - Metadata: "remote/kv.proto", -} diff --git a/gointerfaces/sentry/sentry.pb.go b/gointerfaces/sentry/sentry.pb.go deleted file mode 100644 index d1847084d4..0000000000 --- a/gointerfaces/sentry/sentry.pb.go +++ /dev/null @@ -1,1455 +0,0 @@ -// Code generated by protoc-gen-go. DO NOT EDIT. -// versions: -// protoc-gen-go v1.26.0 -// protoc v3.17.3 -// source: p2psentry/sentry.proto - -package sentry - -import ( - types "github.com/ledgerwatch/erigon/gointerfaces/types" - protoreflect "google.golang.org/protobuf/reflect/protoreflect" - protoimpl "google.golang.org/protobuf/runtime/protoimpl" - emptypb "google.golang.org/protobuf/types/known/emptypb" - reflect "reflect" - sync "sync" -) - -const ( - // Verify that this generated code is sufficiently up-to-date. - _ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion) - // Verify that runtime/protoimpl is sufficiently up-to-date. - _ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20) -) - -type MessageId int32 - -const ( - MessageId_STATUS_65 MessageId = 0 - MessageId_GET_BLOCK_HEADERS_65 MessageId = 1 - MessageId_BLOCK_HEADERS_65 MessageId = 2 - MessageId_BLOCK_HASHES_65 MessageId = 3 - MessageId_GET_BLOCK_BODIES_65 MessageId = 4 - MessageId_BLOCK_BODIES_65 MessageId = 5 - MessageId_GET_NODE_DATA_65 MessageId = 6 - MessageId_NODE_DATA_65 MessageId = 7 - MessageId_GET_RECEIPTS_65 MessageId = 8 - MessageId_RECEIPTS_65 MessageId = 9 - MessageId_NEW_BLOCK_HASHES_65 MessageId = 10 - MessageId_NEW_BLOCK_65 MessageId = 11 - MessageId_TRANSACTIONS_65 MessageId = 12 - MessageId_NEW_POOLED_TRANSACTION_HASHES_65 MessageId = 13 - MessageId_GET_POOLED_TRANSACTIONS_65 MessageId = 14 - MessageId_POOLED_TRANSACTIONS_65 MessageId = 15 - // eth64 announcement messages (no id) - MessageId_STATUS_66 MessageId = 17 - MessageId_NEW_BLOCK_HASHES_66 MessageId = 18 - MessageId_NEW_BLOCK_66 MessageId = 19 - MessageId_TRANSACTIONS_66 MessageId = 20 - // eth65 announcement messages (no id) - MessageId_NEW_POOLED_TRANSACTION_HASHES_66 MessageId = 21 - // eth66 messages with request-id - MessageId_GET_BLOCK_HEADERS_66 MessageId = 22 - MessageId_GET_BLOCK_BODIES_66 MessageId = 23 - MessageId_GET_NODE_DATA_66 MessageId = 24 - MessageId_GET_RECEIPTS_66 MessageId = 25 - MessageId_GET_POOLED_TRANSACTIONS_66 MessageId = 26 - MessageId_BLOCK_HEADERS_66 MessageId = 27 - MessageId_BLOCK_BODIES_66 MessageId = 28 - MessageId_NODE_DATA_66 MessageId = 29 - MessageId_RECEIPTS_66 MessageId = 30 - MessageId_POOLED_TRANSACTIONS_66 MessageId = 31 -) - -// Enum value maps for MessageId. -var ( - MessageId_name = map[int32]string{ - 0: "STATUS_65", - 1: "GET_BLOCK_HEADERS_65", - 2: "BLOCK_HEADERS_65", - 3: "BLOCK_HASHES_65", - 4: "GET_BLOCK_BODIES_65", - 5: "BLOCK_BODIES_65", - 6: "GET_NODE_DATA_65", - 7: "NODE_DATA_65", - 8: "GET_RECEIPTS_65", - 9: "RECEIPTS_65", - 10: "NEW_BLOCK_HASHES_65", - 11: "NEW_BLOCK_65", - 12: "TRANSACTIONS_65", - 13: "NEW_POOLED_TRANSACTION_HASHES_65", - 14: "GET_POOLED_TRANSACTIONS_65", - 15: "POOLED_TRANSACTIONS_65", - 17: "STATUS_66", - 18: "NEW_BLOCK_HASHES_66", - 19: "NEW_BLOCK_66", - 20: "TRANSACTIONS_66", - 21: "NEW_POOLED_TRANSACTION_HASHES_66", - 22: "GET_BLOCK_HEADERS_66", - 23: "GET_BLOCK_BODIES_66", - 24: "GET_NODE_DATA_66", - 25: "GET_RECEIPTS_66", - 26: "GET_POOLED_TRANSACTIONS_66", - 27: "BLOCK_HEADERS_66", - 28: "BLOCK_BODIES_66", - 29: "NODE_DATA_66", - 30: "RECEIPTS_66", - 31: "POOLED_TRANSACTIONS_66", - } - MessageId_value = map[string]int32{ - "STATUS_65": 0, - "GET_BLOCK_HEADERS_65": 1, - "BLOCK_HEADERS_65": 2, - "BLOCK_HASHES_65": 3, - "GET_BLOCK_BODIES_65": 4, - "BLOCK_BODIES_65": 5, - "GET_NODE_DATA_65": 6, - "NODE_DATA_65": 7, - "GET_RECEIPTS_65": 8, - "RECEIPTS_65": 9, - "NEW_BLOCK_HASHES_65": 10, - "NEW_BLOCK_65": 11, - "TRANSACTIONS_65": 12, - "NEW_POOLED_TRANSACTION_HASHES_65": 13, - "GET_POOLED_TRANSACTIONS_65": 14, - "POOLED_TRANSACTIONS_65": 15, - "STATUS_66": 17, - "NEW_BLOCK_HASHES_66": 18, - "NEW_BLOCK_66": 19, - "TRANSACTIONS_66": 20, - "NEW_POOLED_TRANSACTION_HASHES_66": 21, - "GET_BLOCK_HEADERS_66": 22, - "GET_BLOCK_BODIES_66": 23, - "GET_NODE_DATA_66": 24, - "GET_RECEIPTS_66": 25, - "GET_POOLED_TRANSACTIONS_66": 26, - "BLOCK_HEADERS_66": 27, - "BLOCK_BODIES_66": 28, - "NODE_DATA_66": 29, - "RECEIPTS_66": 30, - "POOLED_TRANSACTIONS_66": 31, - } -) - -func (x MessageId) Enum() *MessageId { - p := new(MessageId) - *p = x - return p -} - -func (x MessageId) String() string { - return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) -} - -func (MessageId) Descriptor() protoreflect.EnumDescriptor { - return file_p2psentry_sentry_proto_enumTypes[0].Descriptor() -} - -func (MessageId) Type() protoreflect.EnumType { - return &file_p2psentry_sentry_proto_enumTypes[0] -} - -func (x MessageId) Number() protoreflect.EnumNumber { - return protoreflect.EnumNumber(x) -} - -// Deprecated: Use MessageId.Descriptor instead. -func (MessageId) EnumDescriptor() ([]byte, []int) { - return file_p2psentry_sentry_proto_rawDescGZIP(), []int{0} -} - -type PenaltyKind int32 - -const ( - PenaltyKind_Kick PenaltyKind = 0 -) - -// Enum value maps for PenaltyKind. -var ( - PenaltyKind_name = map[int32]string{ - 0: "Kick", - } - PenaltyKind_value = map[string]int32{ - "Kick": 0, - } -) - -func (x PenaltyKind) Enum() *PenaltyKind { - p := new(PenaltyKind) - *p = x - return p -} - -func (x PenaltyKind) String() string { - return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) -} - -func (PenaltyKind) Descriptor() protoreflect.EnumDescriptor { - return file_p2psentry_sentry_proto_enumTypes[1].Descriptor() -} - -func (PenaltyKind) Type() protoreflect.EnumType { - return &file_p2psentry_sentry_proto_enumTypes[1] -} - -func (x PenaltyKind) Number() protoreflect.EnumNumber { - return protoreflect.EnumNumber(x) -} - -// Deprecated: Use PenaltyKind.Descriptor instead. -func (PenaltyKind) EnumDescriptor() ([]byte, []int) { - return file_p2psentry_sentry_proto_rawDescGZIP(), []int{1} -} - -type Protocol int32 - -const ( - Protocol_ETH65 Protocol = 0 - Protocol_ETH66 Protocol = 1 -) - -// Enum value maps for Protocol. -var ( - Protocol_name = map[int32]string{ - 0: "ETH65", - 1: "ETH66", - } - Protocol_value = map[string]int32{ - "ETH65": 0, - "ETH66": 1, - } -) - -func (x Protocol) Enum() *Protocol { - p := new(Protocol) - *p = x - return p -} - -func (x Protocol) String() string { - return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) -} - -func (Protocol) Descriptor() protoreflect.EnumDescriptor { - return file_p2psentry_sentry_proto_enumTypes[2].Descriptor() -} - -func (Protocol) Type() protoreflect.EnumType { - return &file_p2psentry_sentry_proto_enumTypes[2] -} - -func (x Protocol) Number() protoreflect.EnumNumber { - return protoreflect.EnumNumber(x) -} - -// Deprecated: Use Protocol.Descriptor instead. -func (Protocol) EnumDescriptor() ([]byte, []int) { - return file_p2psentry_sentry_proto_rawDescGZIP(), []int{2} -} - -type OutboundMessageData struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - Id MessageId `protobuf:"varint,1,opt,name=id,proto3,enum=sentry.MessageId" json:"id,omitempty"` - Data []byte `protobuf:"bytes,2,opt,name=data,proto3" json:"data,omitempty"` -} - -func (x *OutboundMessageData) Reset() { - *x = OutboundMessageData{} - if protoimpl.UnsafeEnabled { - mi := &file_p2psentry_sentry_proto_msgTypes[0] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *OutboundMessageData) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*OutboundMessageData) ProtoMessage() {} - -func (x *OutboundMessageData) ProtoReflect() protoreflect.Message { - mi := &file_p2psentry_sentry_proto_msgTypes[0] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use OutboundMessageData.ProtoReflect.Descriptor instead. -func (*OutboundMessageData) Descriptor() ([]byte, []int) { - return file_p2psentry_sentry_proto_rawDescGZIP(), []int{0} -} - -func (x *OutboundMessageData) GetId() MessageId { - if x != nil { - return x.Id - } - return MessageId_STATUS_65 -} - -func (x *OutboundMessageData) GetData() []byte { - if x != nil { - return x.Data - } - return nil -} - -type SendMessageByMinBlockRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - Data *OutboundMessageData `protobuf:"bytes,1,opt,name=data,proto3" json:"data,omitempty"` - MinBlock uint64 `protobuf:"varint,2,opt,name=min_block,json=minBlock,proto3" json:"min_block,omitempty"` -} - -func (x *SendMessageByMinBlockRequest) Reset() { - *x = SendMessageByMinBlockRequest{} - if protoimpl.UnsafeEnabled { - mi := &file_p2psentry_sentry_proto_msgTypes[1] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *SendMessageByMinBlockRequest) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*SendMessageByMinBlockRequest) ProtoMessage() {} - -func (x *SendMessageByMinBlockRequest) ProtoReflect() protoreflect.Message { - mi := &file_p2psentry_sentry_proto_msgTypes[1] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use SendMessageByMinBlockRequest.ProtoReflect.Descriptor instead. -func (*SendMessageByMinBlockRequest) Descriptor() ([]byte, []int) { - return file_p2psentry_sentry_proto_rawDescGZIP(), []int{1} -} - -func (x *SendMessageByMinBlockRequest) GetData() *OutboundMessageData { - if x != nil { - return x.Data - } - return nil -} - -func (x *SendMessageByMinBlockRequest) GetMinBlock() uint64 { - if x != nil { - return x.MinBlock - } - return 0 -} - -type SendMessageByIdRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - Data *OutboundMessageData `protobuf:"bytes,1,opt,name=data,proto3" json:"data,omitempty"` - PeerId *types.H512 `protobuf:"bytes,2,opt,name=peer_id,json=peerId,proto3" json:"peer_id,omitempty"` -} - -func (x *SendMessageByIdRequest) Reset() { - *x = SendMessageByIdRequest{} - if protoimpl.UnsafeEnabled { - mi := &file_p2psentry_sentry_proto_msgTypes[2] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *SendMessageByIdRequest) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*SendMessageByIdRequest) ProtoMessage() {} - -func (x *SendMessageByIdRequest) ProtoReflect() protoreflect.Message { - mi := &file_p2psentry_sentry_proto_msgTypes[2] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use SendMessageByIdRequest.ProtoReflect.Descriptor instead. -func (*SendMessageByIdRequest) Descriptor() ([]byte, []int) { - return file_p2psentry_sentry_proto_rawDescGZIP(), []int{2} -} - -func (x *SendMessageByIdRequest) GetData() *OutboundMessageData { - if x != nil { - return x.Data - } - return nil -} - -func (x *SendMessageByIdRequest) GetPeerId() *types.H512 { - if x != nil { - return x.PeerId - } - return nil -} - -type SendMessageToRandomPeersRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - Data *OutboundMessageData `protobuf:"bytes,1,opt,name=data,proto3" json:"data,omitempty"` - MaxPeers uint64 `protobuf:"varint,2,opt,name=max_peers,json=maxPeers,proto3" json:"max_peers,omitempty"` -} - -func (x *SendMessageToRandomPeersRequest) Reset() { - *x = SendMessageToRandomPeersRequest{} - if protoimpl.UnsafeEnabled { - mi := &file_p2psentry_sentry_proto_msgTypes[3] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *SendMessageToRandomPeersRequest) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*SendMessageToRandomPeersRequest) ProtoMessage() {} - -func (x *SendMessageToRandomPeersRequest) ProtoReflect() protoreflect.Message { - mi := &file_p2psentry_sentry_proto_msgTypes[3] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use SendMessageToRandomPeersRequest.ProtoReflect.Descriptor instead. -func (*SendMessageToRandomPeersRequest) Descriptor() ([]byte, []int) { - return file_p2psentry_sentry_proto_rawDescGZIP(), []int{3} -} - -func (x *SendMessageToRandomPeersRequest) GetData() *OutboundMessageData { - if x != nil { - return x.Data - } - return nil -} - -func (x *SendMessageToRandomPeersRequest) GetMaxPeers() uint64 { - if x != nil { - return x.MaxPeers - } - return 0 -} - -type SentPeers struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - Peers []*types.H512 `protobuf:"bytes,1,rep,name=peers,proto3" json:"peers,omitempty"` -} - -func (x *SentPeers) Reset() { - *x = SentPeers{} - if protoimpl.UnsafeEnabled { - mi := &file_p2psentry_sentry_proto_msgTypes[4] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *SentPeers) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*SentPeers) ProtoMessage() {} - -func (x *SentPeers) ProtoReflect() protoreflect.Message { - mi := &file_p2psentry_sentry_proto_msgTypes[4] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use SentPeers.ProtoReflect.Descriptor instead. -func (*SentPeers) Descriptor() ([]byte, []int) { - return file_p2psentry_sentry_proto_rawDescGZIP(), []int{4} -} - -func (x *SentPeers) GetPeers() []*types.H512 { - if x != nil { - return x.Peers - } - return nil -} - -type PenalizePeerRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - PeerId *types.H512 `protobuf:"bytes,1,opt,name=peer_id,json=peerId,proto3" json:"peer_id,omitempty"` - Penalty PenaltyKind `protobuf:"varint,2,opt,name=penalty,proto3,enum=sentry.PenaltyKind" json:"penalty,omitempty"` -} - -func (x *PenalizePeerRequest) Reset() { - *x = PenalizePeerRequest{} - if protoimpl.UnsafeEnabled { - mi := &file_p2psentry_sentry_proto_msgTypes[5] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *PenalizePeerRequest) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*PenalizePeerRequest) ProtoMessage() {} - -func (x *PenalizePeerRequest) ProtoReflect() protoreflect.Message { - mi := &file_p2psentry_sentry_proto_msgTypes[5] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use PenalizePeerRequest.ProtoReflect.Descriptor instead. -func (*PenalizePeerRequest) Descriptor() ([]byte, []int) { - return file_p2psentry_sentry_proto_rawDescGZIP(), []int{5} -} - -func (x *PenalizePeerRequest) GetPeerId() *types.H512 { - if x != nil { - return x.PeerId - } - return nil -} - -func (x *PenalizePeerRequest) GetPenalty() PenaltyKind { - if x != nil { - return x.Penalty - } - return PenaltyKind_Kick -} - -type PeerMinBlockRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - PeerId *types.H512 `protobuf:"bytes,1,opt,name=peer_id,json=peerId,proto3" json:"peer_id,omitempty"` - MinBlock uint64 `protobuf:"varint,2,opt,name=min_block,json=minBlock,proto3" json:"min_block,omitempty"` -} - -func (x *PeerMinBlockRequest) Reset() { - *x = PeerMinBlockRequest{} - if protoimpl.UnsafeEnabled { - mi := &file_p2psentry_sentry_proto_msgTypes[6] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *PeerMinBlockRequest) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*PeerMinBlockRequest) ProtoMessage() {} - -func (x *PeerMinBlockRequest) ProtoReflect() protoreflect.Message { - mi := &file_p2psentry_sentry_proto_msgTypes[6] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use PeerMinBlockRequest.ProtoReflect.Descriptor instead. -func (*PeerMinBlockRequest) Descriptor() ([]byte, []int) { - return file_p2psentry_sentry_proto_rawDescGZIP(), []int{6} -} - -func (x *PeerMinBlockRequest) GetPeerId() *types.H512 { - if x != nil { - return x.PeerId - } - return nil -} - -func (x *PeerMinBlockRequest) GetMinBlock() uint64 { - if x != nil { - return x.MinBlock - } - return 0 -} - -type InboundMessage struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - Id MessageId `protobuf:"varint,1,opt,name=id,proto3,enum=sentry.MessageId" json:"id,omitempty"` - Data []byte `protobuf:"bytes,2,opt,name=data,proto3" json:"data,omitempty"` - PeerId *types.H512 `protobuf:"bytes,3,opt,name=peer_id,json=peerId,proto3" json:"peer_id,omitempty"` -} - -func (x *InboundMessage) Reset() { - *x = InboundMessage{} - if protoimpl.UnsafeEnabled { - mi := &file_p2psentry_sentry_proto_msgTypes[7] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *InboundMessage) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*InboundMessage) ProtoMessage() {} - -func (x *InboundMessage) ProtoReflect() protoreflect.Message { - mi := &file_p2psentry_sentry_proto_msgTypes[7] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use InboundMessage.ProtoReflect.Descriptor instead. -func (*InboundMessage) Descriptor() ([]byte, []int) { - return file_p2psentry_sentry_proto_rawDescGZIP(), []int{7} -} - -func (x *InboundMessage) GetId() MessageId { - if x != nil { - return x.Id - } - return MessageId_STATUS_65 -} - -func (x *InboundMessage) GetData() []byte { - if x != nil { - return x.Data - } - return nil -} - -func (x *InboundMessage) GetPeerId() *types.H512 { - if x != nil { - return x.PeerId - } - return nil -} - -type Forks struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - Genesis *types.H256 `protobuf:"bytes,1,opt,name=genesis,proto3" json:"genesis,omitempty"` - Forks []uint64 `protobuf:"varint,2,rep,packed,name=forks,proto3" json:"forks,omitempty"` -} - -func (x *Forks) Reset() { - *x = Forks{} - if protoimpl.UnsafeEnabled { - mi := &file_p2psentry_sentry_proto_msgTypes[8] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *Forks) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*Forks) ProtoMessage() {} - -func (x *Forks) ProtoReflect() protoreflect.Message { - mi := &file_p2psentry_sentry_proto_msgTypes[8] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use Forks.ProtoReflect.Descriptor instead. -func (*Forks) Descriptor() ([]byte, []int) { - return file_p2psentry_sentry_proto_rawDescGZIP(), []int{8} -} - -func (x *Forks) GetGenesis() *types.H256 { - if x != nil { - return x.Genesis - } - return nil -} - -func (x *Forks) GetForks() []uint64 { - if x != nil { - return x.Forks - } - return nil -} - -type StatusData struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - NetworkId uint64 `protobuf:"varint,1,opt,name=network_id,json=networkId,proto3" json:"network_id,omitempty"` - TotalDifficulty *types.H256 `protobuf:"bytes,2,opt,name=total_difficulty,json=totalDifficulty,proto3" json:"total_difficulty,omitempty"` - BestHash *types.H256 `protobuf:"bytes,3,opt,name=best_hash,json=bestHash,proto3" json:"best_hash,omitempty"` - ForkData *Forks `protobuf:"bytes,4,opt,name=fork_data,json=forkData,proto3" json:"fork_data,omitempty"` - MaxBlock uint64 `protobuf:"varint,5,opt,name=max_block,json=maxBlock,proto3" json:"max_block,omitempty"` -} - -func (x *StatusData) Reset() { - *x = StatusData{} - if protoimpl.UnsafeEnabled { - mi := &file_p2psentry_sentry_proto_msgTypes[9] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *StatusData) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*StatusData) ProtoMessage() {} - -func (x *StatusData) ProtoReflect() protoreflect.Message { - mi := &file_p2psentry_sentry_proto_msgTypes[9] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use StatusData.ProtoReflect.Descriptor instead. -func (*StatusData) Descriptor() ([]byte, []int) { - return file_p2psentry_sentry_proto_rawDescGZIP(), []int{9} -} - -func (x *StatusData) GetNetworkId() uint64 { - if x != nil { - return x.NetworkId - } - return 0 -} - -func (x *StatusData) GetTotalDifficulty() *types.H256 { - if x != nil { - return x.TotalDifficulty - } - return nil -} - -func (x *StatusData) GetBestHash() *types.H256 { - if x != nil { - return x.BestHash - } - return nil -} - -func (x *StatusData) GetForkData() *Forks { - if x != nil { - return x.ForkData - } - return nil -} - -func (x *StatusData) GetMaxBlock() uint64 { - if x != nil { - return x.MaxBlock - } - return 0 -} - -type SetStatusReply struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - Protocol Protocol `protobuf:"varint,1,opt,name=protocol,proto3,enum=sentry.Protocol" json:"protocol,omitempty"` -} - -func (x *SetStatusReply) Reset() { - *x = SetStatusReply{} - if protoimpl.UnsafeEnabled { - mi := &file_p2psentry_sentry_proto_msgTypes[10] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *SetStatusReply) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*SetStatusReply) ProtoMessage() {} - -func (x *SetStatusReply) ProtoReflect() protoreflect.Message { - mi := &file_p2psentry_sentry_proto_msgTypes[10] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use SetStatusReply.ProtoReflect.Descriptor instead. -func (*SetStatusReply) Descriptor() ([]byte, []int) { - return file_p2psentry_sentry_proto_rawDescGZIP(), []int{10} -} - -func (x *SetStatusReply) GetProtocol() Protocol { - if x != nil { - return x.Protocol - } - return Protocol_ETH65 -} - -type MessagesRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - Ids []MessageId `protobuf:"varint,1,rep,packed,name=ids,proto3,enum=sentry.MessageId" json:"ids,omitempty"` -} - -func (x *MessagesRequest) Reset() { - *x = MessagesRequest{} - if protoimpl.UnsafeEnabled { - mi := &file_p2psentry_sentry_proto_msgTypes[11] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *MessagesRequest) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*MessagesRequest) ProtoMessage() {} - -func (x *MessagesRequest) ProtoReflect() protoreflect.Message { - mi := &file_p2psentry_sentry_proto_msgTypes[11] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use MessagesRequest.ProtoReflect.Descriptor instead. -func (*MessagesRequest) Descriptor() ([]byte, []int) { - return file_p2psentry_sentry_proto_rawDescGZIP(), []int{11} -} - -func (x *MessagesRequest) GetIds() []MessageId { - if x != nil { - return x.Ids - } - return nil -} - -type PeerCountRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields -} - -func (x *PeerCountRequest) Reset() { - *x = PeerCountRequest{} - if protoimpl.UnsafeEnabled { - mi := &file_p2psentry_sentry_proto_msgTypes[12] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *PeerCountRequest) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*PeerCountRequest) ProtoMessage() {} - -func (x *PeerCountRequest) ProtoReflect() protoreflect.Message { - mi := &file_p2psentry_sentry_proto_msgTypes[12] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use PeerCountRequest.ProtoReflect.Descriptor instead. -func (*PeerCountRequest) Descriptor() ([]byte, []int) { - return file_p2psentry_sentry_proto_rawDescGZIP(), []int{12} -} - -type PeerCountReply struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - Count uint64 `protobuf:"varint,1,opt,name=count,proto3" json:"count,omitempty"` -} - -func (x *PeerCountReply) Reset() { - *x = PeerCountReply{} - if protoimpl.UnsafeEnabled { - mi := &file_p2psentry_sentry_proto_msgTypes[13] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *PeerCountReply) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*PeerCountReply) ProtoMessage() {} - -func (x *PeerCountReply) ProtoReflect() protoreflect.Message { - mi := &file_p2psentry_sentry_proto_msgTypes[13] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use PeerCountReply.ProtoReflect.Descriptor instead. -func (*PeerCountReply) Descriptor() ([]byte, []int) { - return file_p2psentry_sentry_proto_rawDescGZIP(), []int{13} -} - -func (x *PeerCountReply) GetCount() uint64 { - if x != nil { - return x.Count - } - return 0 -} - -var File_p2psentry_sentry_proto protoreflect.FileDescriptor - -var file_p2psentry_sentry_proto_rawDesc = []byte{ - 0x0a, 0x16, 0x70, 0x32, 0x70, 0x73, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x2f, 0x73, 0x65, 0x6e, 0x74, - 0x72, 0x79, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x06, 0x73, 0x65, 0x6e, 0x74, 0x72, 0x79, - 0x1a, 0x1b, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, - 0x66, 0x2f, 0x65, 0x6d, 0x70, 0x74, 0x79, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x11, 0x74, - 0x79, 0x70, 0x65, 0x73, 0x2f, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, - 0x22, 0x4c, 0x0a, 0x13, 0x4f, 0x75, 0x74, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x4d, 0x65, 0x73, 0x73, - 0x61, 0x67, 0x65, 0x44, 0x61, 0x74, 0x61, 0x12, 0x21, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x0e, 0x32, 0x11, 0x2e, 0x73, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x2e, 0x4d, 0x65, 0x73, - 0x73, 0x61, 0x67, 0x65, 0x49, 0x64, 0x52, 0x02, 0x69, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x64, 0x61, - 0x74, 0x61, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x04, 0x64, 0x61, 0x74, 0x61, 0x22, 0x6c, - 0x0a, 0x1c, 0x53, 0x65, 0x6e, 0x64, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x42, 0x79, 0x4d, - 0x69, 0x6e, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x2f, - 0x0a, 0x04, 0x64, 0x61, 0x74, 0x61, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x73, - 0x65, 0x6e, 0x74, 0x72, 0x79, 0x2e, 0x4f, 0x75, 0x74, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x4d, 0x65, - 0x73, 0x73, 0x61, 0x67, 0x65, 0x44, 0x61, 0x74, 0x61, 0x52, 0x04, 0x64, 0x61, 0x74, 0x61, 0x12, - 0x1b, 0x0a, 0x09, 0x6d, 0x69, 0x6e, 0x5f, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x04, 0x52, 0x08, 0x6d, 0x69, 0x6e, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x22, 0x6f, 0x0a, 0x16, - 0x53, 0x65, 0x6e, 0x64, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x42, 0x79, 0x49, 0x64, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x2f, 0x0a, 0x04, 0x64, 0x61, 0x74, 0x61, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x73, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x2e, 0x4f, 0x75, - 0x74, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x44, 0x61, 0x74, - 0x61, 0x52, 0x04, 0x64, 0x61, 0x74, 0x61, 0x12, 0x24, 0x0a, 0x07, 0x70, 0x65, 0x65, 0x72, 0x5f, - 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0b, 0x2e, 0x74, 0x79, 0x70, 0x65, 0x73, - 0x2e, 0x48, 0x35, 0x31, 0x32, 0x52, 0x06, 0x70, 0x65, 0x65, 0x72, 0x49, 0x64, 0x22, 0x6f, 0x0a, - 0x1f, 0x53, 0x65, 0x6e, 0x64, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x54, 0x6f, 0x52, 0x61, - 0x6e, 0x64, 0x6f, 0x6d, 0x50, 0x65, 0x65, 0x72, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x12, 0x2f, 0x0a, 0x04, 0x64, 0x61, 0x74, 0x61, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, - 0x2e, 0x73, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x2e, 0x4f, 0x75, 0x74, 0x62, 0x6f, 0x75, 0x6e, 0x64, - 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x44, 0x61, 0x74, 0x61, 0x52, 0x04, 0x64, 0x61, 0x74, - 0x61, 0x12, 0x1b, 0x0a, 0x09, 0x6d, 0x61, 0x78, 0x5f, 0x70, 0x65, 0x65, 0x72, 0x73, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x04, 0x52, 0x08, 0x6d, 0x61, 0x78, 0x50, 0x65, 0x65, 0x72, 0x73, 0x22, 0x2e, - 0x0a, 0x09, 0x53, 0x65, 0x6e, 0x74, 0x50, 0x65, 0x65, 0x72, 0x73, 0x12, 0x21, 0x0a, 0x05, 0x70, - 0x65, 0x65, 0x72, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x0b, 0x2e, 0x74, 0x79, 0x70, - 0x65, 0x73, 0x2e, 0x48, 0x35, 0x31, 0x32, 0x52, 0x05, 0x70, 0x65, 0x65, 0x72, 0x73, 0x22, 0x6a, - 0x0a, 0x13, 0x50, 0x65, 0x6e, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x50, 0x65, 0x65, 0x72, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x24, 0x0a, 0x07, 0x70, 0x65, 0x65, 0x72, 0x5f, 0x69, 0x64, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0b, 0x2e, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2e, 0x48, - 0x35, 0x31, 0x32, 0x52, 0x06, 0x70, 0x65, 0x65, 0x72, 0x49, 0x64, 0x12, 0x2d, 0x0a, 0x07, 0x70, - 0x65, 0x6e, 0x61, 0x6c, 0x74, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x13, 0x2e, 0x73, - 0x65, 0x6e, 0x74, 0x72, 0x79, 0x2e, 0x50, 0x65, 0x6e, 0x61, 0x6c, 0x74, 0x79, 0x4b, 0x69, 0x6e, - 0x64, 0x52, 0x07, 0x70, 0x65, 0x6e, 0x61, 0x6c, 0x74, 0x79, 0x22, 0x58, 0x0a, 0x13, 0x50, 0x65, - 0x65, 0x72, 0x4d, 0x69, 0x6e, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x12, 0x24, 0x0a, 0x07, 0x70, 0x65, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x0b, 0x2e, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2e, 0x48, 0x35, 0x31, 0x32, 0x52, - 0x06, 0x70, 0x65, 0x65, 0x72, 0x49, 0x64, 0x12, 0x1b, 0x0a, 0x09, 0x6d, 0x69, 0x6e, 0x5f, 0x62, - 0x6c, 0x6f, 0x63, 0x6b, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x08, 0x6d, 0x69, 0x6e, 0x42, - 0x6c, 0x6f, 0x63, 0x6b, 0x22, 0x6d, 0x0a, 0x0e, 0x49, 0x6e, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x4d, - 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x21, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x0e, 0x32, 0x11, 0x2e, 0x73, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x2e, 0x4d, 0x65, 0x73, 0x73, - 0x61, 0x67, 0x65, 0x49, 0x64, 0x52, 0x02, 0x69, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x64, 0x61, 0x74, - 0x61, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x04, 0x64, 0x61, 0x74, 0x61, 0x12, 0x24, 0x0a, - 0x07, 0x70, 0x65, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0b, - 0x2e, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2e, 0x48, 0x35, 0x31, 0x32, 0x52, 0x06, 0x70, 0x65, 0x65, - 0x72, 0x49, 0x64, 0x22, 0x44, 0x0a, 0x05, 0x46, 0x6f, 0x72, 0x6b, 0x73, 0x12, 0x25, 0x0a, 0x07, - 0x67, 0x65, 0x6e, 0x65, 0x73, 0x69, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0b, 0x2e, - 0x74, 0x79, 0x70, 0x65, 0x73, 0x2e, 0x48, 0x32, 0x35, 0x36, 0x52, 0x07, 0x67, 0x65, 0x6e, 0x65, - 0x73, 0x69, 0x73, 0x12, 0x14, 0x0a, 0x05, 0x66, 0x6f, 0x72, 0x6b, 0x73, 0x18, 0x02, 0x20, 0x03, - 0x28, 0x04, 0x52, 0x05, 0x66, 0x6f, 0x72, 0x6b, 0x73, 0x22, 0xd6, 0x01, 0x0a, 0x0a, 0x53, 0x74, - 0x61, 0x74, 0x75, 0x73, 0x44, 0x61, 0x74, 0x61, 0x12, 0x1d, 0x0a, 0x0a, 0x6e, 0x65, 0x74, 0x77, - 0x6f, 0x72, 0x6b, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x09, 0x6e, 0x65, - 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x49, 0x64, 0x12, 0x36, 0x0a, 0x10, 0x74, 0x6f, 0x74, 0x61, 0x6c, - 0x5f, 0x64, 0x69, 0x66, 0x66, 0x69, 0x63, 0x75, 0x6c, 0x74, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x0b, 0x2e, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2e, 0x48, 0x32, 0x35, 0x36, 0x52, 0x0f, - 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x44, 0x69, 0x66, 0x66, 0x69, 0x63, 0x75, 0x6c, 0x74, 0x79, 0x12, - 0x28, 0x0a, 0x09, 0x62, 0x65, 0x73, 0x74, 0x5f, 0x68, 0x61, 0x73, 0x68, 0x18, 0x03, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x0b, 0x2e, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2e, 0x48, 0x32, 0x35, 0x36, 0x52, - 0x08, 0x62, 0x65, 0x73, 0x74, 0x48, 0x61, 0x73, 0x68, 0x12, 0x2a, 0x0a, 0x09, 0x66, 0x6f, 0x72, - 0x6b, 0x5f, 0x64, 0x61, 0x74, 0x61, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0d, 0x2e, 0x73, - 0x65, 0x6e, 0x74, 0x72, 0x79, 0x2e, 0x46, 0x6f, 0x72, 0x6b, 0x73, 0x52, 0x08, 0x66, 0x6f, 0x72, - 0x6b, 0x44, 0x61, 0x74, 0x61, 0x12, 0x1b, 0x0a, 0x09, 0x6d, 0x61, 0x78, 0x5f, 0x62, 0x6c, 0x6f, - 0x63, 0x6b, 0x18, 0x05, 0x20, 0x01, 0x28, 0x04, 0x52, 0x08, 0x6d, 0x61, 0x78, 0x42, 0x6c, 0x6f, - 0x63, 0x6b, 0x22, 0x3e, 0x0a, 0x0e, 0x53, 0x65, 0x74, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, - 0x65, 0x70, 0x6c, 0x79, 0x12, 0x2c, 0x0a, 0x08, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x10, 0x2e, 0x73, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x2e, - 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x52, 0x08, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, - 0x6f, 0x6c, 0x22, 0x36, 0x0a, 0x0f, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x73, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x23, 0x0a, 0x03, 0x69, 0x64, 0x73, 0x18, 0x01, 0x20, 0x03, - 0x28, 0x0e, 0x32, 0x11, 0x2e, 0x73, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x2e, 0x4d, 0x65, 0x73, 0x73, - 0x61, 0x67, 0x65, 0x49, 0x64, 0x52, 0x03, 0x69, 0x64, 0x73, 0x22, 0x12, 0x0a, 0x10, 0x50, 0x65, - 0x65, 0x72, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x26, - 0x0a, 0x0e, 0x50, 0x65, 0x65, 0x72, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, - 0x12, 0x14, 0x0a, 0x05, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, - 0x05, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x2a, 0xda, 0x05, 0x0a, 0x09, 0x4d, 0x65, 0x73, 0x73, 0x61, - 0x67, 0x65, 0x49, 0x64, 0x12, 0x0d, 0x0a, 0x09, 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, 0x5f, 0x36, - 0x35, 0x10, 0x00, 0x12, 0x18, 0x0a, 0x14, 0x47, 0x45, 0x54, 0x5f, 0x42, 0x4c, 0x4f, 0x43, 0x4b, - 0x5f, 0x48, 0x45, 0x41, 0x44, 0x45, 0x52, 0x53, 0x5f, 0x36, 0x35, 0x10, 0x01, 0x12, 0x14, 0x0a, - 0x10, 0x42, 0x4c, 0x4f, 0x43, 0x4b, 0x5f, 0x48, 0x45, 0x41, 0x44, 0x45, 0x52, 0x53, 0x5f, 0x36, - 0x35, 0x10, 0x02, 0x12, 0x13, 0x0a, 0x0f, 0x42, 0x4c, 0x4f, 0x43, 0x4b, 0x5f, 0x48, 0x41, 0x53, - 0x48, 0x45, 0x53, 0x5f, 0x36, 0x35, 0x10, 0x03, 0x12, 0x17, 0x0a, 0x13, 0x47, 0x45, 0x54, 0x5f, - 0x42, 0x4c, 0x4f, 0x43, 0x4b, 0x5f, 0x42, 0x4f, 0x44, 0x49, 0x45, 0x53, 0x5f, 0x36, 0x35, 0x10, - 0x04, 0x12, 0x13, 0x0a, 0x0f, 0x42, 0x4c, 0x4f, 0x43, 0x4b, 0x5f, 0x42, 0x4f, 0x44, 0x49, 0x45, - 0x53, 0x5f, 0x36, 0x35, 0x10, 0x05, 0x12, 0x14, 0x0a, 0x10, 0x47, 0x45, 0x54, 0x5f, 0x4e, 0x4f, - 0x44, 0x45, 0x5f, 0x44, 0x41, 0x54, 0x41, 0x5f, 0x36, 0x35, 0x10, 0x06, 0x12, 0x10, 0x0a, 0x0c, - 0x4e, 0x4f, 0x44, 0x45, 0x5f, 0x44, 0x41, 0x54, 0x41, 0x5f, 0x36, 0x35, 0x10, 0x07, 0x12, 0x13, - 0x0a, 0x0f, 0x47, 0x45, 0x54, 0x5f, 0x52, 0x45, 0x43, 0x45, 0x49, 0x50, 0x54, 0x53, 0x5f, 0x36, - 0x35, 0x10, 0x08, 0x12, 0x0f, 0x0a, 0x0b, 0x52, 0x45, 0x43, 0x45, 0x49, 0x50, 0x54, 0x53, 0x5f, - 0x36, 0x35, 0x10, 0x09, 0x12, 0x17, 0x0a, 0x13, 0x4e, 0x45, 0x57, 0x5f, 0x42, 0x4c, 0x4f, 0x43, - 0x4b, 0x5f, 0x48, 0x41, 0x53, 0x48, 0x45, 0x53, 0x5f, 0x36, 0x35, 0x10, 0x0a, 0x12, 0x10, 0x0a, - 0x0c, 0x4e, 0x45, 0x57, 0x5f, 0x42, 0x4c, 0x4f, 0x43, 0x4b, 0x5f, 0x36, 0x35, 0x10, 0x0b, 0x12, - 0x13, 0x0a, 0x0f, 0x54, 0x52, 0x41, 0x4e, 0x53, 0x41, 0x43, 0x54, 0x49, 0x4f, 0x4e, 0x53, 0x5f, - 0x36, 0x35, 0x10, 0x0c, 0x12, 0x24, 0x0a, 0x20, 0x4e, 0x45, 0x57, 0x5f, 0x50, 0x4f, 0x4f, 0x4c, - 0x45, 0x44, 0x5f, 0x54, 0x52, 0x41, 0x4e, 0x53, 0x41, 0x43, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x48, - 0x41, 0x53, 0x48, 0x45, 0x53, 0x5f, 0x36, 0x35, 0x10, 0x0d, 0x12, 0x1e, 0x0a, 0x1a, 0x47, 0x45, - 0x54, 0x5f, 0x50, 0x4f, 0x4f, 0x4c, 0x45, 0x44, 0x5f, 0x54, 0x52, 0x41, 0x4e, 0x53, 0x41, 0x43, - 0x54, 0x49, 0x4f, 0x4e, 0x53, 0x5f, 0x36, 0x35, 0x10, 0x0e, 0x12, 0x1a, 0x0a, 0x16, 0x50, 0x4f, - 0x4f, 0x4c, 0x45, 0x44, 0x5f, 0x54, 0x52, 0x41, 0x4e, 0x53, 0x41, 0x43, 0x54, 0x49, 0x4f, 0x4e, - 0x53, 0x5f, 0x36, 0x35, 0x10, 0x0f, 0x12, 0x0d, 0x0a, 0x09, 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, - 0x5f, 0x36, 0x36, 0x10, 0x11, 0x12, 0x17, 0x0a, 0x13, 0x4e, 0x45, 0x57, 0x5f, 0x42, 0x4c, 0x4f, - 0x43, 0x4b, 0x5f, 0x48, 0x41, 0x53, 0x48, 0x45, 0x53, 0x5f, 0x36, 0x36, 0x10, 0x12, 0x12, 0x10, - 0x0a, 0x0c, 0x4e, 0x45, 0x57, 0x5f, 0x42, 0x4c, 0x4f, 0x43, 0x4b, 0x5f, 0x36, 0x36, 0x10, 0x13, - 0x12, 0x13, 0x0a, 0x0f, 0x54, 0x52, 0x41, 0x4e, 0x53, 0x41, 0x43, 0x54, 0x49, 0x4f, 0x4e, 0x53, - 0x5f, 0x36, 0x36, 0x10, 0x14, 0x12, 0x24, 0x0a, 0x20, 0x4e, 0x45, 0x57, 0x5f, 0x50, 0x4f, 0x4f, - 0x4c, 0x45, 0x44, 0x5f, 0x54, 0x52, 0x41, 0x4e, 0x53, 0x41, 0x43, 0x54, 0x49, 0x4f, 0x4e, 0x5f, - 0x48, 0x41, 0x53, 0x48, 0x45, 0x53, 0x5f, 0x36, 0x36, 0x10, 0x15, 0x12, 0x18, 0x0a, 0x14, 0x47, - 0x45, 0x54, 0x5f, 0x42, 0x4c, 0x4f, 0x43, 0x4b, 0x5f, 0x48, 0x45, 0x41, 0x44, 0x45, 0x52, 0x53, - 0x5f, 0x36, 0x36, 0x10, 0x16, 0x12, 0x17, 0x0a, 0x13, 0x47, 0x45, 0x54, 0x5f, 0x42, 0x4c, 0x4f, - 0x43, 0x4b, 0x5f, 0x42, 0x4f, 0x44, 0x49, 0x45, 0x53, 0x5f, 0x36, 0x36, 0x10, 0x17, 0x12, 0x14, - 0x0a, 0x10, 0x47, 0x45, 0x54, 0x5f, 0x4e, 0x4f, 0x44, 0x45, 0x5f, 0x44, 0x41, 0x54, 0x41, 0x5f, - 0x36, 0x36, 0x10, 0x18, 0x12, 0x13, 0x0a, 0x0f, 0x47, 0x45, 0x54, 0x5f, 0x52, 0x45, 0x43, 0x45, - 0x49, 0x50, 0x54, 0x53, 0x5f, 0x36, 0x36, 0x10, 0x19, 0x12, 0x1e, 0x0a, 0x1a, 0x47, 0x45, 0x54, - 0x5f, 0x50, 0x4f, 0x4f, 0x4c, 0x45, 0x44, 0x5f, 0x54, 0x52, 0x41, 0x4e, 0x53, 0x41, 0x43, 0x54, - 0x49, 0x4f, 0x4e, 0x53, 0x5f, 0x36, 0x36, 0x10, 0x1a, 0x12, 0x14, 0x0a, 0x10, 0x42, 0x4c, 0x4f, - 0x43, 0x4b, 0x5f, 0x48, 0x45, 0x41, 0x44, 0x45, 0x52, 0x53, 0x5f, 0x36, 0x36, 0x10, 0x1b, 0x12, - 0x13, 0x0a, 0x0f, 0x42, 0x4c, 0x4f, 0x43, 0x4b, 0x5f, 0x42, 0x4f, 0x44, 0x49, 0x45, 0x53, 0x5f, - 0x36, 0x36, 0x10, 0x1c, 0x12, 0x10, 0x0a, 0x0c, 0x4e, 0x4f, 0x44, 0x45, 0x5f, 0x44, 0x41, 0x54, - 0x41, 0x5f, 0x36, 0x36, 0x10, 0x1d, 0x12, 0x0f, 0x0a, 0x0b, 0x52, 0x45, 0x43, 0x45, 0x49, 0x50, - 0x54, 0x53, 0x5f, 0x36, 0x36, 0x10, 0x1e, 0x12, 0x1a, 0x0a, 0x16, 0x50, 0x4f, 0x4f, 0x4c, 0x45, - 0x44, 0x5f, 0x54, 0x52, 0x41, 0x4e, 0x53, 0x41, 0x43, 0x54, 0x49, 0x4f, 0x4e, 0x53, 0x5f, 0x36, - 0x36, 0x10, 0x1f, 0x2a, 0x17, 0x0a, 0x0b, 0x50, 0x65, 0x6e, 0x61, 0x6c, 0x74, 0x79, 0x4b, 0x69, - 0x6e, 0x64, 0x12, 0x08, 0x0a, 0x04, 0x4b, 0x69, 0x63, 0x6b, 0x10, 0x00, 0x2a, 0x20, 0x0a, 0x08, - 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x12, 0x09, 0x0a, 0x05, 0x45, 0x54, 0x48, 0x36, - 0x35, 0x10, 0x00, 0x12, 0x09, 0x0a, 0x05, 0x45, 0x54, 0x48, 0x36, 0x36, 0x10, 0x01, 0x32, 0xfd, - 0x04, 0x0a, 0x06, 0x53, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x43, 0x0a, 0x0c, 0x50, 0x65, 0x6e, - 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x50, 0x65, 0x65, 0x72, 0x12, 0x1b, 0x2e, 0x73, 0x65, 0x6e, 0x74, - 0x72, 0x79, 0x2e, 0x50, 0x65, 0x6e, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x50, 0x65, 0x65, 0x72, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, - 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x12, 0x43, - 0x0a, 0x0c, 0x50, 0x65, 0x65, 0x72, 0x4d, 0x69, 0x6e, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x12, 0x1b, - 0x2e, 0x73, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x2e, 0x50, 0x65, 0x65, 0x72, 0x4d, 0x69, 0x6e, 0x42, - 0x6c, 0x6f, 0x63, 0x6b, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x67, 0x6f, - 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, - 0x70, 0x74, 0x79, 0x12, 0x50, 0x0a, 0x15, 0x53, 0x65, 0x6e, 0x64, 0x4d, 0x65, 0x73, 0x73, 0x61, - 0x67, 0x65, 0x42, 0x79, 0x4d, 0x69, 0x6e, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x12, 0x24, 0x2e, 0x73, - 0x65, 0x6e, 0x74, 0x72, 0x79, 0x2e, 0x53, 0x65, 0x6e, 0x64, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, - 0x65, 0x42, 0x79, 0x4d, 0x69, 0x6e, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x1a, 0x11, 0x2e, 0x73, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x2e, 0x53, 0x65, 0x6e, 0x74, - 0x50, 0x65, 0x65, 0x72, 0x73, 0x12, 0x44, 0x0a, 0x0f, 0x53, 0x65, 0x6e, 0x64, 0x4d, 0x65, 0x73, - 0x73, 0x61, 0x67, 0x65, 0x42, 0x79, 0x49, 0x64, 0x12, 0x1e, 0x2e, 0x73, 0x65, 0x6e, 0x74, 0x72, - 0x79, 0x2e, 0x53, 0x65, 0x6e, 0x64, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x42, 0x79, 0x49, - 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x11, 0x2e, 0x73, 0x65, 0x6e, 0x74, 0x72, - 0x79, 0x2e, 0x53, 0x65, 0x6e, 0x74, 0x50, 0x65, 0x65, 0x72, 0x73, 0x12, 0x56, 0x0a, 0x18, 0x53, - 0x65, 0x6e, 0x64, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x54, 0x6f, 0x52, 0x61, 0x6e, 0x64, - 0x6f, 0x6d, 0x50, 0x65, 0x65, 0x72, 0x73, 0x12, 0x27, 0x2e, 0x73, 0x65, 0x6e, 0x74, 0x72, 0x79, - 0x2e, 0x53, 0x65, 0x6e, 0x64, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x54, 0x6f, 0x52, 0x61, - 0x6e, 0x64, 0x6f, 0x6d, 0x50, 0x65, 0x65, 0x72, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x1a, 0x11, 0x2e, 0x73, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x2e, 0x53, 0x65, 0x6e, 0x74, 0x50, 0x65, - 0x65, 0x72, 0x73, 0x12, 0x42, 0x0a, 0x10, 0x53, 0x65, 0x6e, 0x64, 0x4d, 0x65, 0x73, 0x73, 0x61, - 0x67, 0x65, 0x54, 0x6f, 0x41, 0x6c, 0x6c, 0x12, 0x1b, 0x2e, 0x73, 0x65, 0x6e, 0x74, 0x72, 0x79, - 0x2e, 0x4f, 0x75, 0x74, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, - 0x44, 0x61, 0x74, 0x61, 0x1a, 0x11, 0x2e, 0x73, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x2e, 0x53, 0x65, - 0x6e, 0x74, 0x50, 0x65, 0x65, 0x72, 0x73, 0x12, 0x37, 0x0a, 0x09, 0x53, 0x65, 0x74, 0x53, 0x74, - 0x61, 0x74, 0x75, 0x73, 0x12, 0x12, 0x2e, 0x73, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x2e, 0x53, 0x74, - 0x61, 0x74, 0x75, 0x73, 0x44, 0x61, 0x74, 0x61, 0x1a, 0x16, 0x2e, 0x73, 0x65, 0x6e, 0x74, 0x72, - 0x79, 0x2e, 0x53, 0x65, 0x74, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, - 0x12, 0x3d, 0x0a, 0x08, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x73, 0x12, 0x17, 0x2e, 0x73, - 0x65, 0x6e, 0x74, 0x72, 0x79, 0x2e, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x73, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x73, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x2e, 0x49, - 0x6e, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x30, 0x01, 0x12, - 0x3d, 0x0a, 0x09, 0x50, 0x65, 0x65, 0x72, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x18, 0x2e, 0x73, - 0x65, 0x6e, 0x74, 0x72, 0x79, 0x2e, 0x50, 0x65, 0x65, 0x72, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x73, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x2e, - 0x50, 0x65, 0x65, 0x72, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x42, 0x11, - 0x5a, 0x0f, 0x2e, 0x2f, 0x73, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x3b, 0x73, 0x65, 0x6e, 0x74, 0x72, - 0x79, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, -} - -var ( - file_p2psentry_sentry_proto_rawDescOnce sync.Once - file_p2psentry_sentry_proto_rawDescData = file_p2psentry_sentry_proto_rawDesc -) - -func file_p2psentry_sentry_proto_rawDescGZIP() []byte { - file_p2psentry_sentry_proto_rawDescOnce.Do(func() { - file_p2psentry_sentry_proto_rawDescData = protoimpl.X.CompressGZIP(file_p2psentry_sentry_proto_rawDescData) - }) - return file_p2psentry_sentry_proto_rawDescData -} - -var file_p2psentry_sentry_proto_enumTypes = make([]protoimpl.EnumInfo, 3) -var file_p2psentry_sentry_proto_msgTypes = make([]protoimpl.MessageInfo, 14) -var file_p2psentry_sentry_proto_goTypes = []interface{}{ - (MessageId)(0), // 0: sentry.MessageId - (PenaltyKind)(0), // 1: sentry.PenaltyKind - (Protocol)(0), // 2: sentry.Protocol - (*OutboundMessageData)(nil), // 3: sentry.OutboundMessageData - (*SendMessageByMinBlockRequest)(nil), // 4: sentry.SendMessageByMinBlockRequest - (*SendMessageByIdRequest)(nil), // 5: sentry.SendMessageByIdRequest - (*SendMessageToRandomPeersRequest)(nil), // 6: sentry.SendMessageToRandomPeersRequest - (*SentPeers)(nil), // 7: sentry.SentPeers - (*PenalizePeerRequest)(nil), // 8: sentry.PenalizePeerRequest - (*PeerMinBlockRequest)(nil), // 9: sentry.PeerMinBlockRequest - (*InboundMessage)(nil), // 10: sentry.InboundMessage - (*Forks)(nil), // 11: sentry.Forks - (*StatusData)(nil), // 12: sentry.StatusData - (*SetStatusReply)(nil), // 13: sentry.SetStatusReply - (*MessagesRequest)(nil), // 14: sentry.MessagesRequest - (*PeerCountRequest)(nil), // 15: sentry.PeerCountRequest - (*PeerCountReply)(nil), // 16: sentry.PeerCountReply - (*types.H512)(nil), // 17: types.H512 - (*types.H256)(nil), // 18: types.H256 - (*emptypb.Empty)(nil), // 19: google.protobuf.Empty -} -var file_p2psentry_sentry_proto_depIdxs = []int32{ - 0, // 0: sentry.OutboundMessageData.id:type_name -> sentry.MessageId - 3, // 1: sentry.SendMessageByMinBlockRequest.data:type_name -> sentry.OutboundMessageData - 3, // 2: sentry.SendMessageByIdRequest.data:type_name -> sentry.OutboundMessageData - 17, // 3: sentry.SendMessageByIdRequest.peer_id:type_name -> types.H512 - 3, // 4: sentry.SendMessageToRandomPeersRequest.data:type_name -> sentry.OutboundMessageData - 17, // 5: sentry.SentPeers.peers:type_name -> types.H512 - 17, // 6: sentry.PenalizePeerRequest.peer_id:type_name -> types.H512 - 1, // 7: sentry.PenalizePeerRequest.penalty:type_name -> sentry.PenaltyKind - 17, // 8: sentry.PeerMinBlockRequest.peer_id:type_name -> types.H512 - 0, // 9: sentry.InboundMessage.id:type_name -> sentry.MessageId - 17, // 10: sentry.InboundMessage.peer_id:type_name -> types.H512 - 18, // 11: sentry.Forks.genesis:type_name -> types.H256 - 18, // 12: sentry.StatusData.total_difficulty:type_name -> types.H256 - 18, // 13: sentry.StatusData.best_hash:type_name -> types.H256 - 11, // 14: sentry.StatusData.fork_data:type_name -> sentry.Forks - 2, // 15: sentry.SetStatusReply.protocol:type_name -> sentry.Protocol - 0, // 16: sentry.MessagesRequest.ids:type_name -> sentry.MessageId - 8, // 17: sentry.Sentry.PenalizePeer:input_type -> sentry.PenalizePeerRequest - 9, // 18: sentry.Sentry.PeerMinBlock:input_type -> sentry.PeerMinBlockRequest - 4, // 19: sentry.Sentry.SendMessageByMinBlock:input_type -> sentry.SendMessageByMinBlockRequest - 5, // 20: sentry.Sentry.SendMessageById:input_type -> sentry.SendMessageByIdRequest - 6, // 21: sentry.Sentry.SendMessageToRandomPeers:input_type -> sentry.SendMessageToRandomPeersRequest - 3, // 22: sentry.Sentry.SendMessageToAll:input_type -> sentry.OutboundMessageData - 12, // 23: sentry.Sentry.SetStatus:input_type -> sentry.StatusData - 14, // 24: sentry.Sentry.Messages:input_type -> sentry.MessagesRequest - 15, // 25: sentry.Sentry.PeerCount:input_type -> sentry.PeerCountRequest - 19, // 26: sentry.Sentry.PenalizePeer:output_type -> google.protobuf.Empty - 19, // 27: sentry.Sentry.PeerMinBlock:output_type -> google.protobuf.Empty - 7, // 28: sentry.Sentry.SendMessageByMinBlock:output_type -> sentry.SentPeers - 7, // 29: sentry.Sentry.SendMessageById:output_type -> sentry.SentPeers - 7, // 30: sentry.Sentry.SendMessageToRandomPeers:output_type -> sentry.SentPeers - 7, // 31: sentry.Sentry.SendMessageToAll:output_type -> sentry.SentPeers - 13, // 32: sentry.Sentry.SetStatus:output_type -> sentry.SetStatusReply - 10, // 33: sentry.Sentry.Messages:output_type -> sentry.InboundMessage - 16, // 34: sentry.Sentry.PeerCount:output_type -> sentry.PeerCountReply - 26, // [26:35] is the sub-list for method output_type - 17, // [17:26] is the sub-list for method input_type - 17, // [17:17] is the sub-list for extension type_name - 17, // [17:17] is the sub-list for extension extendee - 0, // [0:17] is the sub-list for field type_name -} - -func init() { file_p2psentry_sentry_proto_init() } -func file_p2psentry_sentry_proto_init() { - if File_p2psentry_sentry_proto != nil { - return - } - if !protoimpl.UnsafeEnabled { - file_p2psentry_sentry_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*OutboundMessageData); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_p2psentry_sentry_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*SendMessageByMinBlockRequest); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_p2psentry_sentry_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*SendMessageByIdRequest); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_p2psentry_sentry_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*SendMessageToRandomPeersRequest); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_p2psentry_sentry_proto_msgTypes[4].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*SentPeers); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_p2psentry_sentry_proto_msgTypes[5].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*PenalizePeerRequest); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_p2psentry_sentry_proto_msgTypes[6].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*PeerMinBlockRequest); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_p2psentry_sentry_proto_msgTypes[7].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*InboundMessage); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_p2psentry_sentry_proto_msgTypes[8].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*Forks); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_p2psentry_sentry_proto_msgTypes[9].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*StatusData); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_p2psentry_sentry_proto_msgTypes[10].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*SetStatusReply); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_p2psentry_sentry_proto_msgTypes[11].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*MessagesRequest); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_p2psentry_sentry_proto_msgTypes[12].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*PeerCountRequest); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_p2psentry_sentry_proto_msgTypes[13].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*PeerCountReply); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - } - type x struct{} - out := protoimpl.TypeBuilder{ - File: protoimpl.DescBuilder{ - GoPackagePath: reflect.TypeOf(x{}).PkgPath(), - RawDescriptor: file_p2psentry_sentry_proto_rawDesc, - NumEnums: 3, - NumMessages: 14, - NumExtensions: 0, - NumServices: 1, - }, - GoTypes: file_p2psentry_sentry_proto_goTypes, - DependencyIndexes: file_p2psentry_sentry_proto_depIdxs, - EnumInfos: file_p2psentry_sentry_proto_enumTypes, - MessageInfos: file_p2psentry_sentry_proto_msgTypes, - }.Build() - File_p2psentry_sentry_proto = out.File - file_p2psentry_sentry_proto_rawDesc = nil - file_p2psentry_sentry_proto_goTypes = nil - file_p2psentry_sentry_proto_depIdxs = nil -} diff --git a/gointerfaces/sentry/sentry_grpc.pb.go b/gointerfaces/sentry/sentry_grpc.pb.go deleted file mode 100644 index 52334e00fa..0000000000 --- a/gointerfaces/sentry/sentry_grpc.pb.go +++ /dev/null @@ -1,418 +0,0 @@ -// Code generated by protoc-gen-go-grpc. DO NOT EDIT. - -package sentry - -import ( - context "context" - grpc "google.golang.org/grpc" - codes "google.golang.org/grpc/codes" - status "google.golang.org/grpc/status" - emptypb "google.golang.org/protobuf/types/known/emptypb" -) - -// This is a compile-time assertion to ensure that this generated file -// is compatible with the grpc package it is being compiled against. -// Requires gRPC-Go v1.32.0 or later. -const _ = grpc.SupportPackageIsVersion7 - -// SentryClient is the client API for Sentry service. -// -// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://pkg.go.dev/google.golang.org/grpc/?tab=doc#ClientConn.NewStream. -type SentryClient interface { - PenalizePeer(ctx context.Context, in *PenalizePeerRequest, opts ...grpc.CallOption) (*emptypb.Empty, error) - PeerMinBlock(ctx context.Context, in *PeerMinBlockRequest, opts ...grpc.CallOption) (*emptypb.Empty, error) - SendMessageByMinBlock(ctx context.Context, in *SendMessageByMinBlockRequest, opts ...grpc.CallOption) (*SentPeers, error) - SendMessageById(ctx context.Context, in *SendMessageByIdRequest, opts ...grpc.CallOption) (*SentPeers, error) - SendMessageToRandomPeers(ctx context.Context, in *SendMessageToRandomPeersRequest, opts ...grpc.CallOption) (*SentPeers, error) - SendMessageToAll(ctx context.Context, in *OutboundMessageData, opts ...grpc.CallOption) (*SentPeers, error) - SetStatus(ctx context.Context, in *StatusData, opts ...grpc.CallOption) (*SetStatusReply, error) - Messages(ctx context.Context, in *MessagesRequest, opts ...grpc.CallOption) (Sentry_MessagesClient, error) - PeerCount(ctx context.Context, in *PeerCountRequest, opts ...grpc.CallOption) (*PeerCountReply, error) -} - -type sentryClient struct { - cc grpc.ClientConnInterface -} - -func NewSentryClient(cc grpc.ClientConnInterface) SentryClient { - return &sentryClient{cc} -} - -func (c *sentryClient) PenalizePeer(ctx context.Context, in *PenalizePeerRequest, opts ...grpc.CallOption) (*emptypb.Empty, error) { - out := new(emptypb.Empty) - err := c.cc.Invoke(ctx, "/sentry.Sentry/PenalizePeer", in, out, opts...) - if err != nil { - return nil, err - } - return out, nil -} - -func (c *sentryClient) PeerMinBlock(ctx context.Context, in *PeerMinBlockRequest, opts ...grpc.CallOption) (*emptypb.Empty, error) { - out := new(emptypb.Empty) - err := c.cc.Invoke(ctx, "/sentry.Sentry/PeerMinBlock", in, out, opts...) - if err != nil { - return nil, err - } - return out, nil -} - -func (c *sentryClient) SendMessageByMinBlock(ctx context.Context, in *SendMessageByMinBlockRequest, opts ...grpc.CallOption) (*SentPeers, error) { - out := new(SentPeers) - err := c.cc.Invoke(ctx, "/sentry.Sentry/SendMessageByMinBlock", in, out, opts...) - if err != nil { - return nil, err - } - return out, nil -} - -func (c *sentryClient) SendMessageById(ctx context.Context, in *SendMessageByIdRequest, opts ...grpc.CallOption) (*SentPeers, error) { - out := new(SentPeers) - err := c.cc.Invoke(ctx, "/sentry.Sentry/SendMessageById", in, out, opts...) - if err != nil { - return nil, err - } - return out, nil -} - -func (c *sentryClient) SendMessageToRandomPeers(ctx context.Context, in *SendMessageToRandomPeersRequest, opts ...grpc.CallOption) (*SentPeers, error) { - out := new(SentPeers) - err := c.cc.Invoke(ctx, "/sentry.Sentry/SendMessageToRandomPeers", in, out, opts...) - if err != nil { - return nil, err - } - return out, nil -} - -func (c *sentryClient) SendMessageToAll(ctx context.Context, in *OutboundMessageData, opts ...grpc.CallOption) (*SentPeers, error) { - out := new(SentPeers) - err := c.cc.Invoke(ctx, "/sentry.Sentry/SendMessageToAll", in, out, opts...) - if err != nil { - return nil, err - } - return out, nil -} - -func (c *sentryClient) SetStatus(ctx context.Context, in *StatusData, opts ...grpc.CallOption) (*SetStatusReply, error) { - out := new(SetStatusReply) - err := c.cc.Invoke(ctx, "/sentry.Sentry/SetStatus", in, out, opts...) - if err != nil { - return nil, err - } - return out, nil -} - -func (c *sentryClient) Messages(ctx context.Context, in *MessagesRequest, opts ...grpc.CallOption) (Sentry_MessagesClient, error) { - stream, err := c.cc.NewStream(ctx, &Sentry_ServiceDesc.Streams[0], "/sentry.Sentry/Messages", opts...) - if err != nil { - return nil, err - } - x := &sentryMessagesClient{stream} - if err := x.ClientStream.SendMsg(in); err != nil { - return nil, err - } - if err := x.ClientStream.CloseSend(); err != nil { - return nil, err - } - return x, nil -} - -type Sentry_MessagesClient interface { - Recv() (*InboundMessage, error) - grpc.ClientStream -} - -type sentryMessagesClient struct { - grpc.ClientStream -} - -func (x *sentryMessagesClient) Recv() (*InboundMessage, error) { - m := new(InboundMessage) - if err := x.ClientStream.RecvMsg(m); err != nil { - return nil, err - } - return m, nil -} - -func (c *sentryClient) PeerCount(ctx context.Context, in *PeerCountRequest, opts ...grpc.CallOption) (*PeerCountReply, error) { - out := new(PeerCountReply) - err := c.cc.Invoke(ctx, "/sentry.Sentry/PeerCount", in, out, opts...) - if err != nil { - return nil, err - } - return out, nil -} - -// SentryServer is the server API for Sentry service. -// All implementations must embed UnimplementedSentryServer -// for forward compatibility -type SentryServer interface { - PenalizePeer(context.Context, *PenalizePeerRequest) (*emptypb.Empty, error) - PeerMinBlock(context.Context, *PeerMinBlockRequest) (*emptypb.Empty, error) - SendMessageByMinBlock(context.Context, *SendMessageByMinBlockRequest) (*SentPeers, error) - SendMessageById(context.Context, *SendMessageByIdRequest) (*SentPeers, error) - SendMessageToRandomPeers(context.Context, *SendMessageToRandomPeersRequest) (*SentPeers, error) - SendMessageToAll(context.Context, *OutboundMessageData) (*SentPeers, error) - SetStatus(context.Context, *StatusData) (*SetStatusReply, error) - Messages(*MessagesRequest, Sentry_MessagesServer) error - PeerCount(context.Context, *PeerCountRequest) (*PeerCountReply, error) - mustEmbedUnimplementedSentryServer() -} - -// UnimplementedSentryServer must be embedded to have forward compatible implementations. -type UnimplementedSentryServer struct { -} - -func (UnimplementedSentryServer) PenalizePeer(context.Context, *PenalizePeerRequest) (*emptypb.Empty, error) { - return nil, status.Errorf(codes.Unimplemented, "method PenalizePeer not implemented") -} -func (UnimplementedSentryServer) PeerMinBlock(context.Context, *PeerMinBlockRequest) (*emptypb.Empty, error) { - return nil, status.Errorf(codes.Unimplemented, "method PeerMinBlock not implemented") -} -func (UnimplementedSentryServer) SendMessageByMinBlock(context.Context, *SendMessageByMinBlockRequest) (*SentPeers, error) { - return nil, status.Errorf(codes.Unimplemented, "method SendMessageByMinBlock not implemented") -} -func (UnimplementedSentryServer) SendMessageById(context.Context, *SendMessageByIdRequest) (*SentPeers, error) { - return nil, status.Errorf(codes.Unimplemented, "method SendMessageById not implemented") -} -func (UnimplementedSentryServer) SendMessageToRandomPeers(context.Context, *SendMessageToRandomPeersRequest) (*SentPeers, error) { - return nil, status.Errorf(codes.Unimplemented, "method SendMessageToRandomPeers not implemented") -} -func (UnimplementedSentryServer) SendMessageToAll(context.Context, *OutboundMessageData) (*SentPeers, error) { - return nil, status.Errorf(codes.Unimplemented, "method SendMessageToAll not implemented") -} -func (UnimplementedSentryServer) SetStatus(context.Context, *StatusData) (*SetStatusReply, error) { - return nil, status.Errorf(codes.Unimplemented, "method SetStatus not implemented") -} -func (UnimplementedSentryServer) Messages(*MessagesRequest, Sentry_MessagesServer) error { - return status.Errorf(codes.Unimplemented, "method Messages not implemented") -} -func (UnimplementedSentryServer) PeerCount(context.Context, *PeerCountRequest) (*PeerCountReply, error) { - return nil, status.Errorf(codes.Unimplemented, "method PeerCount not implemented") -} -func (UnimplementedSentryServer) mustEmbedUnimplementedSentryServer() {} - -// UnsafeSentryServer may be embedded to opt out of forward compatibility for this service. -// Use of this interface is not recommended, as added methods to SentryServer will -// result in compilation errors. -type UnsafeSentryServer interface { - mustEmbedUnimplementedSentryServer() -} - -func RegisterSentryServer(s grpc.ServiceRegistrar, srv SentryServer) { - s.RegisterService(&Sentry_ServiceDesc, srv) -} - -func _Sentry_PenalizePeer_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(PenalizePeerRequest) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(SentryServer).PenalizePeer(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/sentry.Sentry/PenalizePeer", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(SentryServer).PenalizePeer(ctx, req.(*PenalizePeerRequest)) - } - return interceptor(ctx, in, info, handler) -} - -func _Sentry_PeerMinBlock_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(PeerMinBlockRequest) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(SentryServer).PeerMinBlock(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/sentry.Sentry/PeerMinBlock", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(SentryServer).PeerMinBlock(ctx, req.(*PeerMinBlockRequest)) - } - return interceptor(ctx, in, info, handler) -} - -func _Sentry_SendMessageByMinBlock_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(SendMessageByMinBlockRequest) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(SentryServer).SendMessageByMinBlock(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/sentry.Sentry/SendMessageByMinBlock", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(SentryServer).SendMessageByMinBlock(ctx, req.(*SendMessageByMinBlockRequest)) - } - return interceptor(ctx, in, info, handler) -} - -func _Sentry_SendMessageById_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(SendMessageByIdRequest) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(SentryServer).SendMessageById(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/sentry.Sentry/SendMessageById", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(SentryServer).SendMessageById(ctx, req.(*SendMessageByIdRequest)) - } - return interceptor(ctx, in, info, handler) -} - -func _Sentry_SendMessageToRandomPeers_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(SendMessageToRandomPeersRequest) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(SentryServer).SendMessageToRandomPeers(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/sentry.Sentry/SendMessageToRandomPeers", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(SentryServer).SendMessageToRandomPeers(ctx, req.(*SendMessageToRandomPeersRequest)) - } - return interceptor(ctx, in, info, handler) -} - -func _Sentry_SendMessageToAll_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(OutboundMessageData) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(SentryServer).SendMessageToAll(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/sentry.Sentry/SendMessageToAll", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(SentryServer).SendMessageToAll(ctx, req.(*OutboundMessageData)) - } - return interceptor(ctx, in, info, handler) -} - -func _Sentry_SetStatus_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(StatusData) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(SentryServer).SetStatus(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/sentry.Sentry/SetStatus", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(SentryServer).SetStatus(ctx, req.(*StatusData)) - } - return interceptor(ctx, in, info, handler) -} - -func _Sentry_Messages_Handler(srv interface{}, stream grpc.ServerStream) error { - m := new(MessagesRequest) - if err := stream.RecvMsg(m); err != nil { - return err - } - return srv.(SentryServer).Messages(m, &sentryMessagesServer{stream}) -} - -type Sentry_MessagesServer interface { - Send(*InboundMessage) error - grpc.ServerStream -} - -type sentryMessagesServer struct { - grpc.ServerStream -} - -func (x *sentryMessagesServer) Send(m *InboundMessage) error { - return x.ServerStream.SendMsg(m) -} - -func _Sentry_PeerCount_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(PeerCountRequest) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(SentryServer).PeerCount(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/sentry.Sentry/PeerCount", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(SentryServer).PeerCount(ctx, req.(*PeerCountRequest)) - } - return interceptor(ctx, in, info, handler) -} - -// Sentry_ServiceDesc is the grpc.ServiceDesc for Sentry service. -// It's only intended for direct use with grpc.RegisterService, -// and not to be introspected or modified (even as a copy) -var Sentry_ServiceDesc = grpc.ServiceDesc{ - ServiceName: "sentry.Sentry", - HandlerType: (*SentryServer)(nil), - Methods: []grpc.MethodDesc{ - { - MethodName: "PenalizePeer", - Handler: _Sentry_PenalizePeer_Handler, - }, - { - MethodName: "PeerMinBlock", - Handler: _Sentry_PeerMinBlock_Handler, - }, - { - MethodName: "SendMessageByMinBlock", - Handler: _Sentry_SendMessageByMinBlock_Handler, - }, - { - MethodName: "SendMessageById", - Handler: _Sentry_SendMessageById_Handler, - }, - { - MethodName: "SendMessageToRandomPeers", - Handler: _Sentry_SendMessageToRandomPeers_Handler, - }, - { - MethodName: "SendMessageToAll", - Handler: _Sentry_SendMessageToAll_Handler, - }, - { - MethodName: "SetStatus", - Handler: _Sentry_SetStatus_Handler, - }, - { - MethodName: "PeerCount", - Handler: _Sentry_PeerCount_Handler, - }, - }, - Streams: []grpc.StreamDesc{ - { - StreamName: "Messages", - Handler: _Sentry_Messages_Handler, - ServerStreams: true, - }, - }, - Metadata: "p2psentry/sentry.proto", -} diff --git a/gointerfaces/snapshotsync/external_downloader.pb.go b/gointerfaces/snapshotsync/external_downloader.pb.go deleted file mode 100644 index 119ca92a35..0000000000 --- a/gointerfaces/snapshotsync/external_downloader.pb.go +++ /dev/null @@ -1,470 +0,0 @@ -// Code generated by protoc-gen-go. DO NOT EDIT. -// versions: -// protoc-gen-go v1.26.0 -// protoc v3.17.3 -// source: snapshot_downloader/external_downloader.proto - -package snapshotsync - -import ( - protoreflect "google.golang.org/protobuf/reflect/protoreflect" - protoimpl "google.golang.org/protobuf/runtime/protoimpl" - emptypb "google.golang.org/protobuf/types/known/emptypb" - reflect "reflect" - sync "sync" -) - -const ( - // Verify that this generated code is sufficiently up-to-date. - _ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion) - // Verify that runtime/protoimpl is sufficiently up-to-date. - _ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20) -) - -type SnapshotType int32 - -const ( - SnapshotType_headers SnapshotType = 0 - SnapshotType_bodies SnapshotType = 1 - SnapshotType_state SnapshotType = 2 - SnapshotType_receipts SnapshotType = 3 -) - -// Enum value maps for SnapshotType. -var ( - SnapshotType_name = map[int32]string{ - 0: "headers", - 1: "bodies", - 2: "state", - 3: "receipts", - } - SnapshotType_value = map[string]int32{ - "headers": 0, - "bodies": 1, - "state": 2, - "receipts": 3, - } -) - -func (x SnapshotType) Enum() *SnapshotType { - p := new(SnapshotType) - *p = x - return p -} - -func (x SnapshotType) String() string { - return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) -} - -func (SnapshotType) Descriptor() protoreflect.EnumDescriptor { - return file_snapshot_downloader_external_downloader_proto_enumTypes[0].Descriptor() -} - -func (SnapshotType) Type() protoreflect.EnumType { - return &file_snapshot_downloader_external_downloader_proto_enumTypes[0] -} - -func (x SnapshotType) Number() protoreflect.EnumNumber { - return protoreflect.EnumNumber(x) -} - -// Deprecated: Use SnapshotType.Descriptor instead. -func (SnapshotType) EnumDescriptor() ([]byte, []int) { - return file_snapshot_downloader_external_downloader_proto_rawDescGZIP(), []int{0} -} - -type DownloadSnapshotRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - NetworkId uint64 `protobuf:"varint,1,opt,name=network_id,json=networkId,proto3" json:"network_id,omitempty"` - Type []SnapshotType `protobuf:"varint,2,rep,packed,name=type,proto3,enum=snapshotsync.SnapshotType" json:"type,omitempty"` -} - -func (x *DownloadSnapshotRequest) Reset() { - *x = DownloadSnapshotRequest{} - if protoimpl.UnsafeEnabled { - mi := &file_snapshot_downloader_external_downloader_proto_msgTypes[0] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *DownloadSnapshotRequest) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*DownloadSnapshotRequest) ProtoMessage() {} - -func (x *DownloadSnapshotRequest) ProtoReflect() protoreflect.Message { - mi := &file_snapshot_downloader_external_downloader_proto_msgTypes[0] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use DownloadSnapshotRequest.ProtoReflect.Descriptor instead. -func (*DownloadSnapshotRequest) Descriptor() ([]byte, []int) { - return file_snapshot_downloader_external_downloader_proto_rawDescGZIP(), []int{0} -} - -func (x *DownloadSnapshotRequest) GetNetworkId() uint64 { - if x != nil { - return x.NetworkId - } - return 0 -} - -func (x *DownloadSnapshotRequest) GetType() []SnapshotType { - if x != nil { - return x.Type - } - return nil -} - -type SnapshotsRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - NetworkId uint64 `protobuf:"varint,1,opt,name=network_id,json=networkId,proto3" json:"network_id,omitempty"` -} - -func (x *SnapshotsRequest) Reset() { - *x = SnapshotsRequest{} - if protoimpl.UnsafeEnabled { - mi := &file_snapshot_downloader_external_downloader_proto_msgTypes[1] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *SnapshotsRequest) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*SnapshotsRequest) ProtoMessage() {} - -func (x *SnapshotsRequest) ProtoReflect() protoreflect.Message { - mi := &file_snapshot_downloader_external_downloader_proto_msgTypes[1] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use SnapshotsRequest.ProtoReflect.Descriptor instead. -func (*SnapshotsRequest) Descriptor() ([]byte, []int) { - return file_snapshot_downloader_external_downloader_proto_rawDescGZIP(), []int{1} -} - -func (x *SnapshotsRequest) GetNetworkId() uint64 { - if x != nil { - return x.NetworkId - } - return 0 -} - -type SnapshotsInfo struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - Type SnapshotType `protobuf:"varint,1,opt,name=type,proto3,enum=snapshotsync.SnapshotType" json:"type,omitempty"` - GotInfoByte bool `protobuf:"varint,2,opt,name=gotInfoByte,proto3" json:"gotInfoByte,omitempty"` - Readiness int32 `protobuf:"varint,3,opt,name=readiness,proto3" json:"readiness,omitempty"` - SnapshotBlock uint64 `protobuf:"varint,4,opt,name=snapshotBlock,proto3" json:"snapshotBlock,omitempty"` - Dbpath string `protobuf:"bytes,5,opt,name=dbpath,proto3" json:"dbpath,omitempty"` -} - -func (x *SnapshotsInfo) Reset() { - *x = SnapshotsInfo{} - if protoimpl.UnsafeEnabled { - mi := &file_snapshot_downloader_external_downloader_proto_msgTypes[2] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *SnapshotsInfo) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*SnapshotsInfo) ProtoMessage() {} - -func (x *SnapshotsInfo) ProtoReflect() protoreflect.Message { - mi := &file_snapshot_downloader_external_downloader_proto_msgTypes[2] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use SnapshotsInfo.ProtoReflect.Descriptor instead. -func (*SnapshotsInfo) Descriptor() ([]byte, []int) { - return file_snapshot_downloader_external_downloader_proto_rawDescGZIP(), []int{2} -} - -func (x *SnapshotsInfo) GetType() SnapshotType { - if x != nil { - return x.Type - } - return SnapshotType_headers -} - -func (x *SnapshotsInfo) GetGotInfoByte() bool { - if x != nil { - return x.GotInfoByte - } - return false -} - -func (x *SnapshotsInfo) GetReadiness() int32 { - if x != nil { - return x.Readiness - } - return 0 -} - -func (x *SnapshotsInfo) GetSnapshotBlock() uint64 { - if x != nil { - return x.SnapshotBlock - } - return 0 -} - -func (x *SnapshotsInfo) GetDbpath() string { - if x != nil { - return x.Dbpath - } - return "" -} - -type SnapshotsInfoReply struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - Info []*SnapshotsInfo `protobuf:"bytes,1,rep,name=info,proto3" json:"info,omitempty"` -} - -func (x *SnapshotsInfoReply) Reset() { - *x = SnapshotsInfoReply{} - if protoimpl.UnsafeEnabled { - mi := &file_snapshot_downloader_external_downloader_proto_msgTypes[3] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *SnapshotsInfoReply) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*SnapshotsInfoReply) ProtoMessage() {} - -func (x *SnapshotsInfoReply) ProtoReflect() protoreflect.Message { - mi := &file_snapshot_downloader_external_downloader_proto_msgTypes[3] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use SnapshotsInfoReply.ProtoReflect.Descriptor instead. -func (*SnapshotsInfoReply) Descriptor() ([]byte, []int) { - return file_snapshot_downloader_external_downloader_proto_rawDescGZIP(), []int{3} -} - -func (x *SnapshotsInfoReply) GetInfo() []*SnapshotsInfo { - if x != nil { - return x.Info - } - return nil -} - -var File_snapshot_downloader_external_downloader_proto protoreflect.FileDescriptor - -var file_snapshot_downloader_external_downloader_proto_rawDesc = []byte{ - 0x0a, 0x2d, 0x73, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x5f, 0x64, 0x6f, 0x77, 0x6e, 0x6c, - 0x6f, 0x61, 0x64, 0x65, 0x72, 0x2f, 0x65, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x5f, 0x64, - 0x6f, 0x77, 0x6e, 0x6c, 0x6f, 0x61, 0x64, 0x65, 0x72, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, - 0x0c, 0x73, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x73, 0x79, 0x6e, 0x63, 0x1a, 0x1b, 0x67, - 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2f, 0x65, - 0x6d, 0x70, 0x74, 0x79, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0x68, 0x0a, 0x17, 0x44, 0x6f, - 0x77, 0x6e, 0x6c, 0x6f, 0x61, 0x64, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1d, 0x0a, 0x0a, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, - 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x09, 0x6e, 0x65, 0x74, 0x77, 0x6f, - 0x72, 0x6b, 0x49, 0x64, 0x12, 0x2e, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x02, 0x20, 0x03, - 0x28, 0x0e, 0x32, 0x1a, 0x2e, 0x73, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x73, 0x79, 0x6e, - 0x63, 0x2e, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x54, 0x79, 0x70, 0x65, 0x52, 0x04, - 0x74, 0x79, 0x70, 0x65, 0x22, 0x31, 0x0a, 0x10, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, - 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1d, 0x0a, 0x0a, 0x6e, 0x65, 0x74, 0x77, - 0x6f, 0x72, 0x6b, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x09, 0x6e, 0x65, - 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x49, 0x64, 0x22, 0xbd, 0x01, 0x0a, 0x0d, 0x53, 0x6e, 0x61, 0x70, - 0x73, 0x68, 0x6f, 0x74, 0x73, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x2e, 0x0a, 0x04, 0x74, 0x79, 0x70, - 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x1a, 0x2e, 0x73, 0x6e, 0x61, 0x70, 0x73, 0x68, - 0x6f, 0x74, 0x73, 0x79, 0x6e, 0x63, 0x2e, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x54, - 0x79, 0x70, 0x65, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x67, 0x6f, 0x74, - 0x49, 0x6e, 0x66, 0x6f, 0x42, 0x79, 0x74, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0b, - 0x67, 0x6f, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x42, 0x79, 0x74, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x72, - 0x65, 0x61, 0x64, 0x69, 0x6e, 0x65, 0x73, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, 0x09, - 0x72, 0x65, 0x61, 0x64, 0x69, 0x6e, 0x65, 0x73, 0x73, 0x12, 0x24, 0x0a, 0x0d, 0x73, 0x6e, 0x61, - 0x70, 0x73, 0x68, 0x6f, 0x74, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x18, 0x04, 0x20, 0x01, 0x28, 0x04, - 0x52, 0x0d, 0x73, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x12, - 0x16, 0x0a, 0x06, 0x64, 0x62, 0x70, 0x61, 0x74, 0x68, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x06, 0x64, 0x62, 0x70, 0x61, 0x74, 0x68, 0x22, 0x45, 0x0a, 0x12, 0x53, 0x6e, 0x61, 0x70, 0x73, - 0x68, 0x6f, 0x74, 0x73, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x2f, 0x0a, - 0x04, 0x69, 0x6e, 0x66, 0x6f, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x73, 0x6e, - 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x73, 0x79, 0x6e, 0x63, 0x2e, 0x53, 0x6e, 0x61, 0x70, 0x73, - 0x68, 0x6f, 0x74, 0x73, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x04, 0x69, 0x6e, 0x66, 0x6f, 0x2a, 0x40, - 0x0a, 0x0c, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x54, 0x79, 0x70, 0x65, 0x12, 0x0b, - 0x0a, 0x07, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x73, 0x10, 0x00, 0x12, 0x0a, 0x0a, 0x06, 0x62, - 0x6f, 0x64, 0x69, 0x65, 0x73, 0x10, 0x01, 0x12, 0x09, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, - 0x10, 0x02, 0x12, 0x0c, 0x0a, 0x08, 0x72, 0x65, 0x63, 0x65, 0x69, 0x70, 0x74, 0x73, 0x10, 0x03, - 0x32, 0xaa, 0x01, 0x0a, 0x0a, 0x44, 0x6f, 0x77, 0x6e, 0x6c, 0x6f, 0x61, 0x64, 0x65, 0x72, 0x12, - 0x4b, 0x0a, 0x08, 0x44, 0x6f, 0x77, 0x6e, 0x6c, 0x6f, 0x61, 0x64, 0x12, 0x25, 0x2e, 0x73, 0x6e, - 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x73, 0x79, 0x6e, 0x63, 0x2e, 0x44, 0x6f, 0x77, 0x6e, 0x6c, - 0x6f, 0x61, 0x64, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, - 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x00, 0x12, 0x4f, 0x0a, 0x09, - 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x73, 0x12, 0x1e, 0x2e, 0x73, 0x6e, 0x61, 0x70, - 0x73, 0x68, 0x6f, 0x74, 0x73, 0x79, 0x6e, 0x63, 0x2e, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, - 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x20, 0x2e, 0x73, 0x6e, 0x61, 0x70, - 0x73, 0x68, 0x6f, 0x74, 0x73, 0x79, 0x6e, 0x63, 0x2e, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, - 0x74, 0x73, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x42, 0x1d, 0x5a, - 0x1b, 0x2e, 0x2f, 0x73, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x73, 0x79, 0x6e, 0x63, 0x3b, - 0x73, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x73, 0x79, 0x6e, 0x63, 0x62, 0x06, 0x70, 0x72, - 0x6f, 0x74, 0x6f, 0x33, -} - -var ( - file_snapshot_downloader_external_downloader_proto_rawDescOnce sync.Once - file_snapshot_downloader_external_downloader_proto_rawDescData = file_snapshot_downloader_external_downloader_proto_rawDesc -) - -func file_snapshot_downloader_external_downloader_proto_rawDescGZIP() []byte { - file_snapshot_downloader_external_downloader_proto_rawDescOnce.Do(func() { - file_snapshot_downloader_external_downloader_proto_rawDescData = protoimpl.X.CompressGZIP(file_snapshot_downloader_external_downloader_proto_rawDescData) - }) - return file_snapshot_downloader_external_downloader_proto_rawDescData -} - -var file_snapshot_downloader_external_downloader_proto_enumTypes = make([]protoimpl.EnumInfo, 1) -var file_snapshot_downloader_external_downloader_proto_msgTypes = make([]protoimpl.MessageInfo, 4) -var file_snapshot_downloader_external_downloader_proto_goTypes = []interface{}{ - (SnapshotType)(0), // 0: snapshotsync.SnapshotType - (*DownloadSnapshotRequest)(nil), // 1: snapshotsync.DownloadSnapshotRequest - (*SnapshotsRequest)(nil), // 2: snapshotsync.SnapshotsRequest - (*SnapshotsInfo)(nil), // 3: snapshotsync.SnapshotsInfo - (*SnapshotsInfoReply)(nil), // 4: snapshotsync.SnapshotsInfoReply - (*emptypb.Empty)(nil), // 5: google.protobuf.Empty -} -var file_snapshot_downloader_external_downloader_proto_depIdxs = []int32{ - 0, // 0: snapshotsync.DownloadSnapshotRequest.type:type_name -> snapshotsync.SnapshotType - 0, // 1: snapshotsync.SnapshotsInfo.type:type_name -> snapshotsync.SnapshotType - 3, // 2: snapshotsync.SnapshotsInfoReply.info:type_name -> snapshotsync.SnapshotsInfo - 1, // 3: snapshotsync.Downloader.Download:input_type -> snapshotsync.DownloadSnapshotRequest - 2, // 4: snapshotsync.Downloader.Snapshots:input_type -> snapshotsync.SnapshotsRequest - 5, // 5: snapshotsync.Downloader.Download:output_type -> google.protobuf.Empty - 4, // 6: snapshotsync.Downloader.Snapshots:output_type -> snapshotsync.SnapshotsInfoReply - 5, // [5:7] is the sub-list for method output_type - 3, // [3:5] is the sub-list for method input_type - 3, // [3:3] is the sub-list for extension type_name - 3, // [3:3] is the sub-list for extension extendee - 0, // [0:3] is the sub-list for field type_name -} - -func init() { file_snapshot_downloader_external_downloader_proto_init() } -func file_snapshot_downloader_external_downloader_proto_init() { - if File_snapshot_downloader_external_downloader_proto != nil { - return - } - if !protoimpl.UnsafeEnabled { - file_snapshot_downloader_external_downloader_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*DownloadSnapshotRequest); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_snapshot_downloader_external_downloader_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*SnapshotsRequest); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_snapshot_downloader_external_downloader_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*SnapshotsInfo); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_snapshot_downloader_external_downloader_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*SnapshotsInfoReply); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - } - type x struct{} - out := protoimpl.TypeBuilder{ - File: protoimpl.DescBuilder{ - GoPackagePath: reflect.TypeOf(x{}).PkgPath(), - RawDescriptor: file_snapshot_downloader_external_downloader_proto_rawDesc, - NumEnums: 1, - NumMessages: 4, - NumExtensions: 0, - NumServices: 1, - }, - GoTypes: file_snapshot_downloader_external_downloader_proto_goTypes, - DependencyIndexes: file_snapshot_downloader_external_downloader_proto_depIdxs, - EnumInfos: file_snapshot_downloader_external_downloader_proto_enumTypes, - MessageInfos: file_snapshot_downloader_external_downloader_proto_msgTypes, - }.Build() - File_snapshot_downloader_external_downloader_proto = out.File - file_snapshot_downloader_external_downloader_proto_rawDesc = nil - file_snapshot_downloader_external_downloader_proto_goTypes = nil - file_snapshot_downloader_external_downloader_proto_depIdxs = nil -} diff --git a/gointerfaces/snapshotsync/external_downloader_grpc.pb.go b/gointerfaces/snapshotsync/external_downloader_grpc.pb.go deleted file mode 100644 index 1ad2286c33..0000000000 --- a/gointerfaces/snapshotsync/external_downloader_grpc.pb.go +++ /dev/null @@ -1,138 +0,0 @@ -// Code generated by protoc-gen-go-grpc. DO NOT EDIT. - -package snapshotsync - -import ( - context "context" - grpc "google.golang.org/grpc" - codes "google.golang.org/grpc/codes" - status "google.golang.org/grpc/status" - emptypb "google.golang.org/protobuf/types/known/emptypb" -) - -// This is a compile-time assertion to ensure that this generated file -// is compatible with the grpc package it is being compiled against. -// Requires gRPC-Go v1.32.0 or later. -const _ = grpc.SupportPackageIsVersion7 - -// DownloaderClient is the client API for Downloader service. -// -// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://pkg.go.dev/google.golang.org/grpc/?tab=doc#ClientConn.NewStream. -type DownloaderClient interface { - Download(ctx context.Context, in *DownloadSnapshotRequest, opts ...grpc.CallOption) (*emptypb.Empty, error) - Snapshots(ctx context.Context, in *SnapshotsRequest, opts ...grpc.CallOption) (*SnapshotsInfoReply, error) -} - -type downloaderClient struct { - cc grpc.ClientConnInterface -} - -func NewDownloaderClient(cc grpc.ClientConnInterface) DownloaderClient { - return &downloaderClient{cc} -} - -func (c *downloaderClient) Download(ctx context.Context, in *DownloadSnapshotRequest, opts ...grpc.CallOption) (*emptypb.Empty, error) { - out := new(emptypb.Empty) - err := c.cc.Invoke(ctx, "/snapshotsync.Downloader/Download", in, out, opts...) - if err != nil { - return nil, err - } - return out, nil -} - -func (c *downloaderClient) Snapshots(ctx context.Context, in *SnapshotsRequest, opts ...grpc.CallOption) (*SnapshotsInfoReply, error) { - out := new(SnapshotsInfoReply) - err := c.cc.Invoke(ctx, "/snapshotsync.Downloader/Snapshots", in, out, opts...) - if err != nil { - return nil, err - } - return out, nil -} - -// DownloaderServer is the server API for Downloader service. -// All implementations must embed UnimplementedDownloaderServer -// for forward compatibility -type DownloaderServer interface { - Download(context.Context, *DownloadSnapshotRequest) (*emptypb.Empty, error) - Snapshots(context.Context, *SnapshotsRequest) (*SnapshotsInfoReply, error) - mustEmbedUnimplementedDownloaderServer() -} - -// UnimplementedDownloaderServer must be embedded to have forward compatible implementations. -type UnimplementedDownloaderServer struct { -} - -func (UnimplementedDownloaderServer) Download(context.Context, *DownloadSnapshotRequest) (*emptypb.Empty, error) { - return nil, status.Errorf(codes.Unimplemented, "method Download not implemented") -} -func (UnimplementedDownloaderServer) Snapshots(context.Context, *SnapshotsRequest) (*SnapshotsInfoReply, error) { - return nil, status.Errorf(codes.Unimplemented, "method Snapshots not implemented") -} -func (UnimplementedDownloaderServer) mustEmbedUnimplementedDownloaderServer() {} - -// UnsafeDownloaderServer may be embedded to opt out of forward compatibility for this service. -// Use of this interface is not recommended, as added methods to DownloaderServer will -// result in compilation errors. -type UnsafeDownloaderServer interface { - mustEmbedUnimplementedDownloaderServer() -} - -func RegisterDownloaderServer(s grpc.ServiceRegistrar, srv DownloaderServer) { - s.RegisterService(&Downloader_ServiceDesc, srv) -} - -func _Downloader_Download_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(DownloadSnapshotRequest) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(DownloaderServer).Download(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/snapshotsync.Downloader/Download", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(DownloaderServer).Download(ctx, req.(*DownloadSnapshotRequest)) - } - return interceptor(ctx, in, info, handler) -} - -func _Downloader_Snapshots_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(SnapshotsRequest) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(DownloaderServer).Snapshots(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/snapshotsync.Downloader/Snapshots", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(DownloaderServer).Snapshots(ctx, req.(*SnapshotsRequest)) - } - return interceptor(ctx, in, info, handler) -} - -// Downloader_ServiceDesc is the grpc.ServiceDesc for Downloader service. -// It's only intended for direct use with grpc.RegisterService, -// and not to be introspected or modified (even as a copy) -var Downloader_ServiceDesc = grpc.ServiceDesc{ - ServiceName: "snapshotsync.Downloader", - HandlerType: (*DownloaderServer)(nil), - Methods: []grpc.MethodDesc{ - { - MethodName: "Download", - Handler: _Downloader_Download_Handler, - }, - { - MethodName: "Snapshots", - Handler: _Downloader_Snapshots_Handler, - }, - }, - Streams: []grpc.StreamDesc{}, - Metadata: "snapshot_downloader/external_downloader.proto", -} diff --git a/gointerfaces/testing/testing.pb.go b/gointerfaces/testing/testing.pb.go deleted file mode 100644 index 0082b9ac78..0000000000 --- a/gointerfaces/testing/testing.pb.go +++ /dev/null @@ -1,242 +0,0 @@ -// Code generated by protoc-gen-go. DO NOT EDIT. -// versions: -// protoc-gen-go v1.26.0 -// protoc v3.17.3 -// source: testing/testing.proto - -package testing - -import ( - protoreflect "google.golang.org/protobuf/reflect/protoreflect" - protoimpl "google.golang.org/protobuf/runtime/protoimpl" - emptypb "google.golang.org/protobuf/types/known/emptypb" - reflect "reflect" - sync "sync" -) - -const ( - // Verify that this generated code is sufficiently up-to-date. - _ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion) - // Verify that runtime/protoimpl is sufficiently up-to-date. - _ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20) -) - -type TestCaseNumber struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - Count uint64 `protobuf:"varint,1,opt,name=count,proto3" json:"count,omitempty"` -} - -func (x *TestCaseNumber) Reset() { - *x = TestCaseNumber{} - if protoimpl.UnsafeEnabled { - mi := &file_testing_testing_proto_msgTypes[0] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *TestCaseNumber) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*TestCaseNumber) ProtoMessage() {} - -func (x *TestCaseNumber) ProtoReflect() protoreflect.Message { - mi := &file_testing_testing_proto_msgTypes[0] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use TestCaseNumber.ProtoReflect.Descriptor instead. -func (*TestCaseNumber) Descriptor() ([]byte, []int) { - return file_testing_testing_proto_rawDescGZIP(), []int{0} -} - -func (x *TestCaseNumber) GetCount() uint64 { - if x != nil { - return x.Count - } - return 0 -} - -type TestReport struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - // End of test signal - End bool `protobuf:"varint,1,opt,name=end,proto3" json:"end,omitempty"` - // Indication whether the report is about success of part of the test, or failure - Success bool `protobuf:"varint,2,opt,name=success,proto3" json:"success,omitempty"` - Log string `protobuf:"bytes,3,opt,name=log,proto3" json:"log,omitempty"` -} - -func (x *TestReport) Reset() { - *x = TestReport{} - if protoimpl.UnsafeEnabled { - mi := &file_testing_testing_proto_msgTypes[1] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *TestReport) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*TestReport) ProtoMessage() {} - -func (x *TestReport) ProtoReflect() protoreflect.Message { - mi := &file_testing_testing_proto_msgTypes[1] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use TestReport.ProtoReflect.Descriptor instead. -func (*TestReport) Descriptor() ([]byte, []int) { - return file_testing_testing_proto_rawDescGZIP(), []int{1} -} - -func (x *TestReport) GetEnd() bool { - if x != nil { - return x.End - } - return false -} - -func (x *TestReport) GetSuccess() bool { - if x != nil { - return x.Success - } - return false -} - -func (x *TestReport) GetLog() string { - if x != nil { - return x.Log - } - return "" -} - -var File_testing_testing_proto protoreflect.FileDescriptor - -var file_testing_testing_proto_rawDesc = []byte{ - 0x0a, 0x15, 0x74, 0x65, 0x73, 0x74, 0x69, 0x6e, 0x67, 0x2f, 0x74, 0x65, 0x73, 0x74, 0x69, 0x6e, - 0x67, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x07, 0x74, 0x65, 0x73, 0x74, 0x69, 0x6e, 0x67, - 0x1a, 0x1b, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, - 0x66, 0x2f, 0x65, 0x6d, 0x70, 0x74, 0x79, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0x26, 0x0a, - 0x0e, 0x54, 0x65, 0x73, 0x74, 0x43, 0x61, 0x73, 0x65, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x12, - 0x14, 0x0a, 0x05, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x05, - 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x22, 0x4a, 0x0a, 0x0a, 0x54, 0x65, 0x73, 0x74, 0x52, 0x65, 0x70, - 0x6f, 0x72, 0x74, 0x12, 0x10, 0x0a, 0x03, 0x65, 0x6e, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, - 0x52, 0x03, 0x65, 0x6e, 0x64, 0x12, 0x18, 0x0a, 0x07, 0x73, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x73, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x12, - 0x10, 0x0a, 0x03, 0x6c, 0x6f, 0x67, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6c, 0x6f, - 0x67, 0x32, 0x8f, 0x01, 0x0a, 0x0a, 0x54, 0x65, 0x73, 0x74, 0x44, 0x72, 0x69, 0x76, 0x65, 0x72, - 0x12, 0x40, 0x0a, 0x0d, 0x54, 0x65, 0x73, 0x74, 0x43, 0x61, 0x73, 0x65, 0x43, 0x6f, 0x75, 0x6e, - 0x74, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, - 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x17, 0x2e, 0x74, 0x65, 0x73, 0x74, - 0x69, 0x6e, 0x67, 0x2e, 0x54, 0x65, 0x73, 0x74, 0x43, 0x61, 0x73, 0x65, 0x4e, 0x75, 0x6d, 0x62, - 0x65, 0x72, 0x12, 0x3f, 0x0a, 0x0d, 0x53, 0x74, 0x61, 0x72, 0x74, 0x54, 0x65, 0x73, 0x74, 0x43, - 0x61, 0x73, 0x65, 0x12, 0x17, 0x2e, 0x74, 0x65, 0x73, 0x74, 0x69, 0x6e, 0x67, 0x2e, 0x54, 0x65, - 0x73, 0x74, 0x43, 0x61, 0x73, 0x65, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x1a, 0x13, 0x2e, 0x74, - 0x65, 0x73, 0x74, 0x69, 0x6e, 0x67, 0x2e, 0x54, 0x65, 0x73, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x72, - 0x74, 0x30, 0x01, 0x42, 0x13, 0x5a, 0x11, 0x2e, 0x2f, 0x74, 0x65, 0x73, 0x74, 0x69, 0x6e, 0x67, - 0x3b, 0x74, 0x65, 0x73, 0x74, 0x69, 0x6e, 0x67, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, -} - -var ( - file_testing_testing_proto_rawDescOnce sync.Once - file_testing_testing_proto_rawDescData = file_testing_testing_proto_rawDesc -) - -func file_testing_testing_proto_rawDescGZIP() []byte { - file_testing_testing_proto_rawDescOnce.Do(func() { - file_testing_testing_proto_rawDescData = protoimpl.X.CompressGZIP(file_testing_testing_proto_rawDescData) - }) - return file_testing_testing_proto_rawDescData -} - -var file_testing_testing_proto_msgTypes = make([]protoimpl.MessageInfo, 2) -var file_testing_testing_proto_goTypes = []interface{}{ - (*TestCaseNumber)(nil), // 0: testing.TestCaseNumber - (*TestReport)(nil), // 1: testing.TestReport - (*emptypb.Empty)(nil), // 2: google.protobuf.Empty -} -var file_testing_testing_proto_depIdxs = []int32{ - 2, // 0: testing.TestDriver.TestCaseCount:input_type -> google.protobuf.Empty - 0, // 1: testing.TestDriver.StartTestCase:input_type -> testing.TestCaseNumber - 0, // 2: testing.TestDriver.TestCaseCount:output_type -> testing.TestCaseNumber - 1, // 3: testing.TestDriver.StartTestCase:output_type -> testing.TestReport - 2, // [2:4] is the sub-list for method output_type - 0, // [0:2] is the sub-list for method input_type - 0, // [0:0] is the sub-list for extension type_name - 0, // [0:0] is the sub-list for extension extendee - 0, // [0:0] is the sub-list for field type_name -} - -func init() { file_testing_testing_proto_init() } -func file_testing_testing_proto_init() { - if File_testing_testing_proto != nil { - return - } - if !protoimpl.UnsafeEnabled { - file_testing_testing_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*TestCaseNumber); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_testing_testing_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*TestReport); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - } - type x struct{} - out := protoimpl.TypeBuilder{ - File: protoimpl.DescBuilder{ - GoPackagePath: reflect.TypeOf(x{}).PkgPath(), - RawDescriptor: file_testing_testing_proto_rawDesc, - NumEnums: 0, - NumMessages: 2, - NumExtensions: 0, - NumServices: 1, - }, - GoTypes: file_testing_testing_proto_goTypes, - DependencyIndexes: file_testing_testing_proto_depIdxs, - MessageInfos: file_testing_testing_proto_msgTypes, - }.Build() - File_testing_testing_proto = out.File - file_testing_testing_proto_rawDesc = nil - file_testing_testing_proto_goTypes = nil - file_testing_testing_proto_depIdxs = nil -} diff --git a/gointerfaces/testing/testing_grpc.pb.go b/gointerfaces/testing/testing_grpc.pb.go deleted file mode 100644 index f5bbfa5ded..0000000000 --- a/gointerfaces/testing/testing_grpc.pb.go +++ /dev/null @@ -1,172 +0,0 @@ -// Code generated by protoc-gen-go-grpc. DO NOT EDIT. - -package testing - -import ( - context "context" - grpc "google.golang.org/grpc" - codes "google.golang.org/grpc/codes" - status "google.golang.org/grpc/status" - emptypb "google.golang.org/protobuf/types/known/emptypb" -) - -// This is a compile-time assertion to ensure that this generated file -// is compatible with the grpc package it is being compiled against. -// Requires gRPC-Go v1.32.0 or later. -const _ = grpc.SupportPackageIsVersion7 - -// TestDriverClient is the client API for TestDriver service. -// -// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://pkg.go.dev/google.golang.org/grpc/?tab=doc#ClientConn.NewStream. -type TestDriverClient interface { - // Returns number of available integration test caes in the test driver - TestCaseCount(ctx context.Context, in *emptypb.Empty, opts ...grpc.CallOption) (*TestCaseNumber, error) - // Ask the test driver to start the test case with given number. As test case progresses, the driver sends reports via the stream - // Test drivier also notifies about the end of test case via the stream - StartTestCase(ctx context.Context, in *TestCaseNumber, opts ...grpc.CallOption) (TestDriver_StartTestCaseClient, error) -} - -type testDriverClient struct { - cc grpc.ClientConnInterface -} - -func NewTestDriverClient(cc grpc.ClientConnInterface) TestDriverClient { - return &testDriverClient{cc} -} - -func (c *testDriverClient) TestCaseCount(ctx context.Context, in *emptypb.Empty, opts ...grpc.CallOption) (*TestCaseNumber, error) { - out := new(TestCaseNumber) - err := c.cc.Invoke(ctx, "/testing.TestDriver/TestCaseCount", in, out, opts...) - if err != nil { - return nil, err - } - return out, nil -} - -func (c *testDriverClient) StartTestCase(ctx context.Context, in *TestCaseNumber, opts ...grpc.CallOption) (TestDriver_StartTestCaseClient, error) { - stream, err := c.cc.NewStream(ctx, &TestDriver_ServiceDesc.Streams[0], "/testing.TestDriver/StartTestCase", opts...) - if err != nil { - return nil, err - } - x := &testDriverStartTestCaseClient{stream} - if err := x.ClientStream.SendMsg(in); err != nil { - return nil, err - } - if err := x.ClientStream.CloseSend(); err != nil { - return nil, err - } - return x, nil -} - -type TestDriver_StartTestCaseClient interface { - Recv() (*TestReport, error) - grpc.ClientStream -} - -type testDriverStartTestCaseClient struct { - grpc.ClientStream -} - -func (x *testDriverStartTestCaseClient) Recv() (*TestReport, error) { - m := new(TestReport) - if err := x.ClientStream.RecvMsg(m); err != nil { - return nil, err - } - return m, nil -} - -// TestDriverServer is the server API for TestDriver service. -// All implementations must embed UnimplementedTestDriverServer -// for forward compatibility -type TestDriverServer interface { - // Returns number of available integration test caes in the test driver - TestCaseCount(context.Context, *emptypb.Empty) (*TestCaseNumber, error) - // Ask the test driver to start the test case with given number. As test case progresses, the driver sends reports via the stream - // Test drivier also notifies about the end of test case via the stream - StartTestCase(*TestCaseNumber, TestDriver_StartTestCaseServer) error - mustEmbedUnimplementedTestDriverServer() -} - -// UnimplementedTestDriverServer must be embedded to have forward compatible implementations. -type UnimplementedTestDriverServer struct { -} - -func (UnimplementedTestDriverServer) TestCaseCount(context.Context, *emptypb.Empty) (*TestCaseNumber, error) { - return nil, status.Errorf(codes.Unimplemented, "method TestCaseCount not implemented") -} -func (UnimplementedTestDriverServer) StartTestCase(*TestCaseNumber, TestDriver_StartTestCaseServer) error { - return status.Errorf(codes.Unimplemented, "method StartTestCase not implemented") -} -func (UnimplementedTestDriverServer) mustEmbedUnimplementedTestDriverServer() {} - -// UnsafeTestDriverServer may be embedded to opt out of forward compatibility for this service. -// Use of this interface is not recommended, as added methods to TestDriverServer will -// result in compilation errors. -type UnsafeTestDriverServer interface { - mustEmbedUnimplementedTestDriverServer() -} - -func RegisterTestDriverServer(s grpc.ServiceRegistrar, srv TestDriverServer) { - s.RegisterService(&TestDriver_ServiceDesc, srv) -} - -func _TestDriver_TestCaseCount_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(emptypb.Empty) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(TestDriverServer).TestCaseCount(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/testing.TestDriver/TestCaseCount", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(TestDriverServer).TestCaseCount(ctx, req.(*emptypb.Empty)) - } - return interceptor(ctx, in, info, handler) -} - -func _TestDriver_StartTestCase_Handler(srv interface{}, stream grpc.ServerStream) error { - m := new(TestCaseNumber) - if err := stream.RecvMsg(m); err != nil { - return err - } - return srv.(TestDriverServer).StartTestCase(m, &testDriverStartTestCaseServer{stream}) -} - -type TestDriver_StartTestCaseServer interface { - Send(*TestReport) error - grpc.ServerStream -} - -type testDriverStartTestCaseServer struct { - grpc.ServerStream -} - -func (x *testDriverStartTestCaseServer) Send(m *TestReport) error { - return x.ServerStream.SendMsg(m) -} - -// TestDriver_ServiceDesc is the grpc.ServiceDesc for TestDriver service. -// It's only intended for direct use with grpc.RegisterService, -// and not to be introspected or modified (even as a copy) -var TestDriver_ServiceDesc = grpc.ServiceDesc{ - ServiceName: "testing.TestDriver", - HandlerType: (*TestDriverServer)(nil), - Methods: []grpc.MethodDesc{ - { - MethodName: "TestCaseCount", - Handler: _TestDriver_TestCaseCount_Handler, - }, - }, - Streams: []grpc.StreamDesc{ - { - StreamName: "StartTestCase", - Handler: _TestDriver_StartTestCase_Handler, - ServerStreams: true, - }, - }, - Metadata: "testing/testing.proto", -} diff --git a/gointerfaces/txpool/mining.pb.go b/gointerfaces/txpool/mining.pb.go deleted file mode 100644 index 766e041d26..0000000000 --- a/gointerfaces/txpool/mining.pb.go +++ /dev/null @@ -1,1153 +0,0 @@ -// Code generated by protoc-gen-go. DO NOT EDIT. -// versions: -// protoc-gen-go v1.26.0 -// protoc v3.17.3 -// source: txpool/mining.proto - -package txpool - -import ( - types "github.com/ledgerwatch/erigon/gointerfaces/types" - protoreflect "google.golang.org/protobuf/reflect/protoreflect" - protoimpl "google.golang.org/protobuf/runtime/protoimpl" - emptypb "google.golang.org/protobuf/types/known/emptypb" - reflect "reflect" - sync "sync" -) - -const ( - // Verify that this generated code is sufficiently up-to-date. - _ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion) - // Verify that runtime/protoimpl is sufficiently up-to-date. - _ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20) -) - -type OnPendingBlockRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields -} - -func (x *OnPendingBlockRequest) Reset() { - *x = OnPendingBlockRequest{} - if protoimpl.UnsafeEnabled { - mi := &file_txpool_mining_proto_msgTypes[0] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *OnPendingBlockRequest) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*OnPendingBlockRequest) ProtoMessage() {} - -func (x *OnPendingBlockRequest) ProtoReflect() protoreflect.Message { - mi := &file_txpool_mining_proto_msgTypes[0] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use OnPendingBlockRequest.ProtoReflect.Descriptor instead. -func (*OnPendingBlockRequest) Descriptor() ([]byte, []int) { - return file_txpool_mining_proto_rawDescGZIP(), []int{0} -} - -type OnPendingBlockReply struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - RplBlock []byte `protobuf:"bytes,1,opt,name=rplBlock,proto3" json:"rplBlock,omitempty"` -} - -func (x *OnPendingBlockReply) Reset() { - *x = OnPendingBlockReply{} - if protoimpl.UnsafeEnabled { - mi := &file_txpool_mining_proto_msgTypes[1] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *OnPendingBlockReply) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*OnPendingBlockReply) ProtoMessage() {} - -func (x *OnPendingBlockReply) ProtoReflect() protoreflect.Message { - mi := &file_txpool_mining_proto_msgTypes[1] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use OnPendingBlockReply.ProtoReflect.Descriptor instead. -func (*OnPendingBlockReply) Descriptor() ([]byte, []int) { - return file_txpool_mining_proto_rawDescGZIP(), []int{1} -} - -func (x *OnPendingBlockReply) GetRplBlock() []byte { - if x != nil { - return x.RplBlock - } - return nil -} - -type OnMinedBlockRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields -} - -func (x *OnMinedBlockRequest) Reset() { - *x = OnMinedBlockRequest{} - if protoimpl.UnsafeEnabled { - mi := &file_txpool_mining_proto_msgTypes[2] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *OnMinedBlockRequest) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*OnMinedBlockRequest) ProtoMessage() {} - -func (x *OnMinedBlockRequest) ProtoReflect() protoreflect.Message { - mi := &file_txpool_mining_proto_msgTypes[2] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use OnMinedBlockRequest.ProtoReflect.Descriptor instead. -func (*OnMinedBlockRequest) Descriptor() ([]byte, []int) { - return file_txpool_mining_proto_rawDescGZIP(), []int{2} -} - -type OnMinedBlockReply struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - RplBlock []byte `protobuf:"bytes,1,opt,name=rplBlock,proto3" json:"rplBlock,omitempty"` -} - -func (x *OnMinedBlockReply) Reset() { - *x = OnMinedBlockReply{} - if protoimpl.UnsafeEnabled { - mi := &file_txpool_mining_proto_msgTypes[3] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *OnMinedBlockReply) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*OnMinedBlockReply) ProtoMessage() {} - -func (x *OnMinedBlockReply) ProtoReflect() protoreflect.Message { - mi := &file_txpool_mining_proto_msgTypes[3] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use OnMinedBlockReply.ProtoReflect.Descriptor instead. -func (*OnMinedBlockReply) Descriptor() ([]byte, []int) { - return file_txpool_mining_proto_rawDescGZIP(), []int{3} -} - -func (x *OnMinedBlockReply) GetRplBlock() []byte { - if x != nil { - return x.RplBlock - } - return nil -} - -type OnPendingLogsRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields -} - -func (x *OnPendingLogsRequest) Reset() { - *x = OnPendingLogsRequest{} - if protoimpl.UnsafeEnabled { - mi := &file_txpool_mining_proto_msgTypes[4] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *OnPendingLogsRequest) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*OnPendingLogsRequest) ProtoMessage() {} - -func (x *OnPendingLogsRequest) ProtoReflect() protoreflect.Message { - mi := &file_txpool_mining_proto_msgTypes[4] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use OnPendingLogsRequest.ProtoReflect.Descriptor instead. -func (*OnPendingLogsRequest) Descriptor() ([]byte, []int) { - return file_txpool_mining_proto_rawDescGZIP(), []int{4} -} - -type OnPendingLogsReply struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - RplLogs []byte `protobuf:"bytes,1,opt,name=rplLogs,proto3" json:"rplLogs,omitempty"` -} - -func (x *OnPendingLogsReply) Reset() { - *x = OnPendingLogsReply{} - if protoimpl.UnsafeEnabled { - mi := &file_txpool_mining_proto_msgTypes[5] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *OnPendingLogsReply) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*OnPendingLogsReply) ProtoMessage() {} - -func (x *OnPendingLogsReply) ProtoReflect() protoreflect.Message { - mi := &file_txpool_mining_proto_msgTypes[5] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use OnPendingLogsReply.ProtoReflect.Descriptor instead. -func (*OnPendingLogsReply) Descriptor() ([]byte, []int) { - return file_txpool_mining_proto_rawDescGZIP(), []int{5} -} - -func (x *OnPendingLogsReply) GetRplLogs() []byte { - if x != nil { - return x.RplLogs - } - return nil -} - -type GetWorkRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields -} - -func (x *GetWorkRequest) Reset() { - *x = GetWorkRequest{} - if protoimpl.UnsafeEnabled { - mi := &file_txpool_mining_proto_msgTypes[6] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *GetWorkRequest) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*GetWorkRequest) ProtoMessage() {} - -func (x *GetWorkRequest) ProtoReflect() protoreflect.Message { - mi := &file_txpool_mining_proto_msgTypes[6] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use GetWorkRequest.ProtoReflect.Descriptor instead. -func (*GetWorkRequest) Descriptor() ([]byte, []int) { - return file_txpool_mining_proto_rawDescGZIP(), []int{6} -} - -type GetWorkReply struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - HeaderHash string `protobuf:"bytes,1,opt,name=headerHash,proto3" json:"headerHash,omitempty"` // 32 bytes hex encoded current block header pow-hash - SeedHash string `protobuf:"bytes,2,opt,name=seedHash,proto3" json:"seedHash,omitempty"` // 32 bytes hex encoded seed hash used for DAG - Target string `protobuf:"bytes,3,opt,name=target,proto3" json:"target,omitempty"` // 32 bytes hex encoded boundary condition ("target"), 2^256/difficulty - BlockNumber string `protobuf:"bytes,4,opt,name=blockNumber,proto3" json:"blockNumber,omitempty"` // hex encoded block number -} - -func (x *GetWorkReply) Reset() { - *x = GetWorkReply{} - if protoimpl.UnsafeEnabled { - mi := &file_txpool_mining_proto_msgTypes[7] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *GetWorkReply) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*GetWorkReply) ProtoMessage() {} - -func (x *GetWorkReply) ProtoReflect() protoreflect.Message { - mi := &file_txpool_mining_proto_msgTypes[7] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use GetWorkReply.ProtoReflect.Descriptor instead. -func (*GetWorkReply) Descriptor() ([]byte, []int) { - return file_txpool_mining_proto_rawDescGZIP(), []int{7} -} - -func (x *GetWorkReply) GetHeaderHash() string { - if x != nil { - return x.HeaderHash - } - return "" -} - -func (x *GetWorkReply) GetSeedHash() string { - if x != nil { - return x.SeedHash - } - return "" -} - -func (x *GetWorkReply) GetTarget() string { - if x != nil { - return x.Target - } - return "" -} - -func (x *GetWorkReply) GetBlockNumber() string { - if x != nil { - return x.BlockNumber - } - return "" -} - -type SubmitWorkRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - BlockNonce []byte `protobuf:"bytes,1,opt,name=blockNonce,proto3" json:"blockNonce,omitempty"` - PowHash []byte `protobuf:"bytes,2,opt,name=powHash,proto3" json:"powHash,omitempty"` - Digest []byte `protobuf:"bytes,3,opt,name=digest,proto3" json:"digest,omitempty"` -} - -func (x *SubmitWorkRequest) Reset() { - *x = SubmitWorkRequest{} - if protoimpl.UnsafeEnabled { - mi := &file_txpool_mining_proto_msgTypes[8] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *SubmitWorkRequest) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*SubmitWorkRequest) ProtoMessage() {} - -func (x *SubmitWorkRequest) ProtoReflect() protoreflect.Message { - mi := &file_txpool_mining_proto_msgTypes[8] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use SubmitWorkRequest.ProtoReflect.Descriptor instead. -func (*SubmitWorkRequest) Descriptor() ([]byte, []int) { - return file_txpool_mining_proto_rawDescGZIP(), []int{8} -} - -func (x *SubmitWorkRequest) GetBlockNonce() []byte { - if x != nil { - return x.BlockNonce - } - return nil -} - -func (x *SubmitWorkRequest) GetPowHash() []byte { - if x != nil { - return x.PowHash - } - return nil -} - -func (x *SubmitWorkRequest) GetDigest() []byte { - if x != nil { - return x.Digest - } - return nil -} - -type SubmitWorkReply struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - Ok bool `protobuf:"varint,1,opt,name=ok,proto3" json:"ok,omitempty"` -} - -func (x *SubmitWorkReply) Reset() { - *x = SubmitWorkReply{} - if protoimpl.UnsafeEnabled { - mi := &file_txpool_mining_proto_msgTypes[9] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *SubmitWorkReply) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*SubmitWorkReply) ProtoMessage() {} - -func (x *SubmitWorkReply) ProtoReflect() protoreflect.Message { - mi := &file_txpool_mining_proto_msgTypes[9] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use SubmitWorkReply.ProtoReflect.Descriptor instead. -func (*SubmitWorkReply) Descriptor() ([]byte, []int) { - return file_txpool_mining_proto_rawDescGZIP(), []int{9} -} - -func (x *SubmitWorkReply) GetOk() bool { - if x != nil { - return x.Ok - } - return false -} - -type SubmitHashRateRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - Rate uint64 `protobuf:"varint,1,opt,name=rate,proto3" json:"rate,omitempty"` - Id []byte `protobuf:"bytes,2,opt,name=id,proto3" json:"id,omitempty"` -} - -func (x *SubmitHashRateRequest) Reset() { - *x = SubmitHashRateRequest{} - if protoimpl.UnsafeEnabled { - mi := &file_txpool_mining_proto_msgTypes[10] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *SubmitHashRateRequest) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*SubmitHashRateRequest) ProtoMessage() {} - -func (x *SubmitHashRateRequest) ProtoReflect() protoreflect.Message { - mi := &file_txpool_mining_proto_msgTypes[10] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use SubmitHashRateRequest.ProtoReflect.Descriptor instead. -func (*SubmitHashRateRequest) Descriptor() ([]byte, []int) { - return file_txpool_mining_proto_rawDescGZIP(), []int{10} -} - -func (x *SubmitHashRateRequest) GetRate() uint64 { - if x != nil { - return x.Rate - } - return 0 -} - -func (x *SubmitHashRateRequest) GetId() []byte { - if x != nil { - return x.Id - } - return nil -} - -type SubmitHashRateReply struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - Ok bool `protobuf:"varint,1,opt,name=ok,proto3" json:"ok,omitempty"` -} - -func (x *SubmitHashRateReply) Reset() { - *x = SubmitHashRateReply{} - if protoimpl.UnsafeEnabled { - mi := &file_txpool_mining_proto_msgTypes[11] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *SubmitHashRateReply) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*SubmitHashRateReply) ProtoMessage() {} - -func (x *SubmitHashRateReply) ProtoReflect() protoreflect.Message { - mi := &file_txpool_mining_proto_msgTypes[11] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use SubmitHashRateReply.ProtoReflect.Descriptor instead. -func (*SubmitHashRateReply) Descriptor() ([]byte, []int) { - return file_txpool_mining_proto_rawDescGZIP(), []int{11} -} - -func (x *SubmitHashRateReply) GetOk() bool { - if x != nil { - return x.Ok - } - return false -} - -type HashRateRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields -} - -func (x *HashRateRequest) Reset() { - *x = HashRateRequest{} - if protoimpl.UnsafeEnabled { - mi := &file_txpool_mining_proto_msgTypes[12] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *HashRateRequest) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*HashRateRequest) ProtoMessage() {} - -func (x *HashRateRequest) ProtoReflect() protoreflect.Message { - mi := &file_txpool_mining_proto_msgTypes[12] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use HashRateRequest.ProtoReflect.Descriptor instead. -func (*HashRateRequest) Descriptor() ([]byte, []int) { - return file_txpool_mining_proto_rawDescGZIP(), []int{12} -} - -type HashRateReply struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - HashRate uint64 `protobuf:"varint,1,opt,name=hashRate,proto3" json:"hashRate,omitempty"` -} - -func (x *HashRateReply) Reset() { - *x = HashRateReply{} - if protoimpl.UnsafeEnabled { - mi := &file_txpool_mining_proto_msgTypes[13] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *HashRateReply) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*HashRateReply) ProtoMessage() {} - -func (x *HashRateReply) ProtoReflect() protoreflect.Message { - mi := &file_txpool_mining_proto_msgTypes[13] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use HashRateReply.ProtoReflect.Descriptor instead. -func (*HashRateReply) Descriptor() ([]byte, []int) { - return file_txpool_mining_proto_rawDescGZIP(), []int{13} -} - -func (x *HashRateReply) GetHashRate() uint64 { - if x != nil { - return x.HashRate - } - return 0 -} - -type MiningRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields -} - -func (x *MiningRequest) Reset() { - *x = MiningRequest{} - if protoimpl.UnsafeEnabled { - mi := &file_txpool_mining_proto_msgTypes[14] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *MiningRequest) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*MiningRequest) ProtoMessage() {} - -func (x *MiningRequest) ProtoReflect() protoreflect.Message { - mi := &file_txpool_mining_proto_msgTypes[14] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use MiningRequest.ProtoReflect.Descriptor instead. -func (*MiningRequest) Descriptor() ([]byte, []int) { - return file_txpool_mining_proto_rawDescGZIP(), []int{14} -} - -type MiningReply struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - Enabled bool `protobuf:"varint,1,opt,name=enabled,proto3" json:"enabled,omitempty"` - Running bool `protobuf:"varint,2,opt,name=running,proto3" json:"running,omitempty"` -} - -func (x *MiningReply) Reset() { - *x = MiningReply{} - if protoimpl.UnsafeEnabled { - mi := &file_txpool_mining_proto_msgTypes[15] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *MiningReply) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*MiningReply) ProtoMessage() {} - -func (x *MiningReply) ProtoReflect() protoreflect.Message { - mi := &file_txpool_mining_proto_msgTypes[15] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use MiningReply.ProtoReflect.Descriptor instead. -func (*MiningReply) Descriptor() ([]byte, []int) { - return file_txpool_mining_proto_rawDescGZIP(), []int{15} -} - -func (x *MiningReply) GetEnabled() bool { - if x != nil { - return x.Enabled - } - return false -} - -func (x *MiningReply) GetRunning() bool { - if x != nil { - return x.Running - } - return false -} - -var File_txpool_mining_proto protoreflect.FileDescriptor - -var file_txpool_mining_proto_rawDesc = []byte{ - 0x0a, 0x13, 0x74, 0x78, 0x70, 0x6f, 0x6f, 0x6c, 0x2f, 0x6d, 0x69, 0x6e, 0x69, 0x6e, 0x67, 0x2e, - 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x06, 0x74, 0x78, 0x70, 0x6f, 0x6f, 0x6c, 0x1a, 0x1b, 0x67, - 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2f, 0x65, - 0x6d, 0x70, 0x74, 0x79, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x11, 0x74, 0x79, 0x70, 0x65, - 0x73, 0x2f, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0x17, 0x0a, - 0x15, 0x4f, 0x6e, 0x50, 0x65, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x31, 0x0a, 0x13, 0x4f, 0x6e, 0x50, 0x65, 0x6e, 0x64, - 0x69, 0x6e, 0x67, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x1a, 0x0a, - 0x08, 0x72, 0x70, 0x6c, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, - 0x08, 0x72, 0x70, 0x6c, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x22, 0x15, 0x0a, 0x13, 0x4f, 0x6e, 0x4d, - 0x69, 0x6e, 0x65, 0x64, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x22, 0x2f, 0x0a, 0x11, 0x4f, 0x6e, 0x4d, 0x69, 0x6e, 0x65, 0x64, 0x42, 0x6c, 0x6f, 0x63, 0x6b, - 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x1a, 0x0a, 0x08, 0x72, 0x70, 0x6c, 0x42, 0x6c, 0x6f, 0x63, - 0x6b, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x08, 0x72, 0x70, 0x6c, 0x42, 0x6c, 0x6f, 0x63, - 0x6b, 0x22, 0x16, 0x0a, 0x14, 0x4f, 0x6e, 0x50, 0x65, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x4c, 0x6f, - 0x67, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x2e, 0x0a, 0x12, 0x4f, 0x6e, 0x50, - 0x65, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x4c, 0x6f, 0x67, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, - 0x18, 0x0a, 0x07, 0x72, 0x70, 0x6c, 0x4c, 0x6f, 0x67, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, - 0x52, 0x07, 0x72, 0x70, 0x6c, 0x4c, 0x6f, 0x67, 0x73, 0x22, 0x10, 0x0a, 0x0e, 0x47, 0x65, 0x74, - 0x57, 0x6f, 0x72, 0x6b, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x84, 0x01, 0x0a, 0x0c, - 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x1e, 0x0a, 0x0a, - 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x48, 0x61, 0x73, 0x68, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x0a, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x48, 0x61, 0x73, 0x68, 0x12, 0x1a, 0x0a, 0x08, - 0x73, 0x65, 0x65, 0x64, 0x48, 0x61, 0x73, 0x68, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, - 0x73, 0x65, 0x65, 0x64, 0x48, 0x61, 0x73, 0x68, 0x12, 0x16, 0x0a, 0x06, 0x74, 0x61, 0x72, 0x67, - 0x65, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, - 0x12, 0x20, 0x0a, 0x0b, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x18, - 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x4e, 0x75, 0x6d, 0x62, - 0x65, 0x72, 0x22, 0x65, 0x0a, 0x11, 0x53, 0x75, 0x62, 0x6d, 0x69, 0x74, 0x57, 0x6f, 0x72, 0x6b, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1e, 0x0a, 0x0a, 0x62, 0x6c, 0x6f, 0x63, 0x6b, - 0x4e, 0x6f, 0x6e, 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0a, 0x62, 0x6c, 0x6f, - 0x63, 0x6b, 0x4e, 0x6f, 0x6e, 0x63, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x70, 0x6f, 0x77, 0x48, 0x61, - 0x73, 0x68, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x07, 0x70, 0x6f, 0x77, 0x48, 0x61, 0x73, - 0x68, 0x12, 0x16, 0x0a, 0x06, 0x64, 0x69, 0x67, 0x65, 0x73, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, - 0x0c, 0x52, 0x06, 0x64, 0x69, 0x67, 0x65, 0x73, 0x74, 0x22, 0x21, 0x0a, 0x0f, 0x53, 0x75, 0x62, - 0x6d, 0x69, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x0e, 0x0a, 0x02, - 0x6f, 0x6b, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x02, 0x6f, 0x6b, 0x22, 0x3b, 0x0a, 0x15, - 0x53, 0x75, 0x62, 0x6d, 0x69, 0x74, 0x48, 0x61, 0x73, 0x68, 0x52, 0x61, 0x74, 0x65, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x72, 0x61, 0x74, 0x65, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x04, 0x52, 0x04, 0x72, 0x61, 0x74, 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x02, 0x69, 0x64, 0x22, 0x25, 0x0a, 0x13, 0x53, 0x75, 0x62, - 0x6d, 0x69, 0x74, 0x48, 0x61, 0x73, 0x68, 0x52, 0x61, 0x74, 0x65, 0x52, 0x65, 0x70, 0x6c, 0x79, - 0x12, 0x0e, 0x0a, 0x02, 0x6f, 0x6b, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x02, 0x6f, 0x6b, - 0x22, 0x11, 0x0a, 0x0f, 0x48, 0x61, 0x73, 0x68, 0x52, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x22, 0x2b, 0x0a, 0x0d, 0x48, 0x61, 0x73, 0x68, 0x52, 0x61, 0x74, 0x65, 0x52, - 0x65, 0x70, 0x6c, 0x79, 0x12, 0x1a, 0x0a, 0x08, 0x68, 0x61, 0x73, 0x68, 0x52, 0x61, 0x74, 0x65, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x08, 0x68, 0x61, 0x73, 0x68, 0x52, 0x61, 0x74, 0x65, - 0x22, 0x0f, 0x0a, 0x0d, 0x4d, 0x69, 0x6e, 0x69, 0x6e, 0x67, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x22, 0x41, 0x0a, 0x0b, 0x4d, 0x69, 0x6e, 0x69, 0x6e, 0x67, 0x52, 0x65, 0x70, 0x6c, 0x79, - 0x12, 0x18, 0x0a, 0x07, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x08, 0x52, 0x07, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x12, 0x18, 0x0a, 0x07, 0x72, 0x75, - 0x6e, 0x6e, 0x69, 0x6e, 0x67, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x72, 0x75, 0x6e, - 0x6e, 0x69, 0x6e, 0x67, 0x32, 0xe2, 0x04, 0x0a, 0x06, 0x4d, 0x69, 0x6e, 0x69, 0x6e, 0x67, 0x12, - 0x36, 0x0a, 0x07, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, - 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, - 0x74, 0x79, 0x1a, 0x13, 0x2e, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2e, 0x56, 0x65, 0x72, 0x73, 0x69, - 0x6f, 0x6e, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x4e, 0x0a, 0x0e, 0x4f, 0x6e, 0x50, 0x65, 0x6e, - 0x64, 0x69, 0x6e, 0x67, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x12, 0x1d, 0x2e, 0x74, 0x78, 0x70, 0x6f, - 0x6f, 0x6c, 0x2e, 0x4f, 0x6e, 0x50, 0x65, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x42, 0x6c, 0x6f, 0x63, - 0x6b, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1b, 0x2e, 0x74, 0x78, 0x70, 0x6f, 0x6f, - 0x6c, 0x2e, 0x4f, 0x6e, 0x50, 0x65, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x42, 0x6c, 0x6f, 0x63, 0x6b, - 0x52, 0x65, 0x70, 0x6c, 0x79, 0x30, 0x01, 0x12, 0x48, 0x0a, 0x0c, 0x4f, 0x6e, 0x4d, 0x69, 0x6e, - 0x65, 0x64, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x12, 0x1b, 0x2e, 0x74, 0x78, 0x70, 0x6f, 0x6f, 0x6c, - 0x2e, 0x4f, 0x6e, 0x4d, 0x69, 0x6e, 0x65, 0x64, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x1a, 0x19, 0x2e, 0x74, 0x78, 0x70, 0x6f, 0x6f, 0x6c, 0x2e, 0x4f, 0x6e, - 0x4d, 0x69, 0x6e, 0x65, 0x64, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x30, - 0x01, 0x12, 0x4b, 0x0a, 0x0d, 0x4f, 0x6e, 0x50, 0x65, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x4c, 0x6f, - 0x67, 0x73, 0x12, 0x1c, 0x2e, 0x74, 0x78, 0x70, 0x6f, 0x6f, 0x6c, 0x2e, 0x4f, 0x6e, 0x50, 0x65, - 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x4c, 0x6f, 0x67, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x1a, 0x1a, 0x2e, 0x74, 0x78, 0x70, 0x6f, 0x6f, 0x6c, 0x2e, 0x4f, 0x6e, 0x50, 0x65, 0x6e, 0x64, - 0x69, 0x6e, 0x67, 0x4c, 0x6f, 0x67, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x30, 0x01, 0x12, 0x37, - 0x0a, 0x07, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x12, 0x16, 0x2e, 0x74, 0x78, 0x70, 0x6f, - 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x1a, 0x14, 0x2e, 0x74, 0x78, 0x70, 0x6f, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x57, 0x6f, - 0x72, 0x6b, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x40, 0x0a, 0x0a, 0x53, 0x75, 0x62, 0x6d, 0x69, - 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x12, 0x19, 0x2e, 0x74, 0x78, 0x70, 0x6f, 0x6f, 0x6c, 0x2e, 0x53, - 0x75, 0x62, 0x6d, 0x69, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x1a, 0x17, 0x2e, 0x74, 0x78, 0x70, 0x6f, 0x6f, 0x6c, 0x2e, 0x53, 0x75, 0x62, 0x6d, 0x69, 0x74, - 0x57, 0x6f, 0x72, 0x6b, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x4c, 0x0a, 0x0e, 0x53, 0x75, 0x62, - 0x6d, 0x69, 0x74, 0x48, 0x61, 0x73, 0x68, 0x52, 0x61, 0x74, 0x65, 0x12, 0x1d, 0x2e, 0x74, 0x78, - 0x70, 0x6f, 0x6f, 0x6c, 0x2e, 0x53, 0x75, 0x62, 0x6d, 0x69, 0x74, 0x48, 0x61, 0x73, 0x68, 0x52, - 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1b, 0x2e, 0x74, 0x78, 0x70, - 0x6f, 0x6f, 0x6c, 0x2e, 0x53, 0x75, 0x62, 0x6d, 0x69, 0x74, 0x48, 0x61, 0x73, 0x68, 0x52, 0x61, - 0x74, 0x65, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x3a, 0x0a, 0x08, 0x48, 0x61, 0x73, 0x68, 0x52, - 0x61, 0x74, 0x65, 0x12, 0x17, 0x2e, 0x74, 0x78, 0x70, 0x6f, 0x6f, 0x6c, 0x2e, 0x48, 0x61, 0x73, - 0x68, 0x52, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x15, 0x2e, 0x74, - 0x78, 0x70, 0x6f, 0x6f, 0x6c, 0x2e, 0x48, 0x61, 0x73, 0x68, 0x52, 0x61, 0x74, 0x65, 0x52, 0x65, - 0x70, 0x6c, 0x79, 0x12, 0x34, 0x0a, 0x06, 0x4d, 0x69, 0x6e, 0x69, 0x6e, 0x67, 0x12, 0x15, 0x2e, - 0x74, 0x78, 0x70, 0x6f, 0x6f, 0x6c, 0x2e, 0x4d, 0x69, 0x6e, 0x69, 0x6e, 0x67, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x1a, 0x13, 0x2e, 0x74, 0x78, 0x70, 0x6f, 0x6f, 0x6c, 0x2e, 0x4d, 0x69, - 0x6e, 0x69, 0x6e, 0x67, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x42, 0x11, 0x5a, 0x0f, 0x2e, 0x2f, 0x74, - 0x78, 0x70, 0x6f, 0x6f, 0x6c, 0x3b, 0x74, 0x78, 0x70, 0x6f, 0x6f, 0x6c, 0x62, 0x06, 0x70, 0x72, - 0x6f, 0x74, 0x6f, 0x33, -} - -var ( - file_txpool_mining_proto_rawDescOnce sync.Once - file_txpool_mining_proto_rawDescData = file_txpool_mining_proto_rawDesc -) - -func file_txpool_mining_proto_rawDescGZIP() []byte { - file_txpool_mining_proto_rawDescOnce.Do(func() { - file_txpool_mining_proto_rawDescData = protoimpl.X.CompressGZIP(file_txpool_mining_proto_rawDescData) - }) - return file_txpool_mining_proto_rawDescData -} - -var file_txpool_mining_proto_msgTypes = make([]protoimpl.MessageInfo, 16) -var file_txpool_mining_proto_goTypes = []interface{}{ - (*OnPendingBlockRequest)(nil), // 0: txpool.OnPendingBlockRequest - (*OnPendingBlockReply)(nil), // 1: txpool.OnPendingBlockReply - (*OnMinedBlockRequest)(nil), // 2: txpool.OnMinedBlockRequest - (*OnMinedBlockReply)(nil), // 3: txpool.OnMinedBlockReply - (*OnPendingLogsRequest)(nil), // 4: txpool.OnPendingLogsRequest - (*OnPendingLogsReply)(nil), // 5: txpool.OnPendingLogsReply - (*GetWorkRequest)(nil), // 6: txpool.GetWorkRequest - (*GetWorkReply)(nil), // 7: txpool.GetWorkReply - (*SubmitWorkRequest)(nil), // 8: txpool.SubmitWorkRequest - (*SubmitWorkReply)(nil), // 9: txpool.SubmitWorkReply - (*SubmitHashRateRequest)(nil), // 10: txpool.SubmitHashRateRequest - (*SubmitHashRateReply)(nil), // 11: txpool.SubmitHashRateReply - (*HashRateRequest)(nil), // 12: txpool.HashRateRequest - (*HashRateReply)(nil), // 13: txpool.HashRateReply - (*MiningRequest)(nil), // 14: txpool.MiningRequest - (*MiningReply)(nil), // 15: txpool.MiningReply - (*emptypb.Empty)(nil), // 16: google.protobuf.Empty - (*types.VersionReply)(nil), // 17: types.VersionReply -} -var file_txpool_mining_proto_depIdxs = []int32{ - 16, // 0: txpool.Mining.Version:input_type -> google.protobuf.Empty - 0, // 1: txpool.Mining.OnPendingBlock:input_type -> txpool.OnPendingBlockRequest - 2, // 2: txpool.Mining.OnMinedBlock:input_type -> txpool.OnMinedBlockRequest - 4, // 3: txpool.Mining.OnPendingLogs:input_type -> txpool.OnPendingLogsRequest - 6, // 4: txpool.Mining.GetWork:input_type -> txpool.GetWorkRequest - 8, // 5: txpool.Mining.SubmitWork:input_type -> txpool.SubmitWorkRequest - 10, // 6: txpool.Mining.SubmitHashRate:input_type -> txpool.SubmitHashRateRequest - 12, // 7: txpool.Mining.HashRate:input_type -> txpool.HashRateRequest - 14, // 8: txpool.Mining.Mining:input_type -> txpool.MiningRequest - 17, // 9: txpool.Mining.Version:output_type -> types.VersionReply - 1, // 10: txpool.Mining.OnPendingBlock:output_type -> txpool.OnPendingBlockReply - 3, // 11: txpool.Mining.OnMinedBlock:output_type -> txpool.OnMinedBlockReply - 5, // 12: txpool.Mining.OnPendingLogs:output_type -> txpool.OnPendingLogsReply - 7, // 13: txpool.Mining.GetWork:output_type -> txpool.GetWorkReply - 9, // 14: txpool.Mining.SubmitWork:output_type -> txpool.SubmitWorkReply - 11, // 15: txpool.Mining.SubmitHashRate:output_type -> txpool.SubmitHashRateReply - 13, // 16: txpool.Mining.HashRate:output_type -> txpool.HashRateReply - 15, // 17: txpool.Mining.Mining:output_type -> txpool.MiningReply - 9, // [9:18] is the sub-list for method output_type - 0, // [0:9] is the sub-list for method input_type - 0, // [0:0] is the sub-list for extension type_name - 0, // [0:0] is the sub-list for extension extendee - 0, // [0:0] is the sub-list for field type_name -} - -func init() { file_txpool_mining_proto_init() } -func file_txpool_mining_proto_init() { - if File_txpool_mining_proto != nil { - return - } - if !protoimpl.UnsafeEnabled { - file_txpool_mining_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*OnPendingBlockRequest); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_txpool_mining_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*OnPendingBlockReply); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_txpool_mining_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*OnMinedBlockRequest); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_txpool_mining_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*OnMinedBlockReply); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_txpool_mining_proto_msgTypes[4].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*OnPendingLogsRequest); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_txpool_mining_proto_msgTypes[5].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*OnPendingLogsReply); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_txpool_mining_proto_msgTypes[6].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GetWorkRequest); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_txpool_mining_proto_msgTypes[7].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GetWorkReply); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_txpool_mining_proto_msgTypes[8].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*SubmitWorkRequest); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_txpool_mining_proto_msgTypes[9].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*SubmitWorkReply); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_txpool_mining_proto_msgTypes[10].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*SubmitHashRateRequest); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_txpool_mining_proto_msgTypes[11].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*SubmitHashRateReply); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_txpool_mining_proto_msgTypes[12].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*HashRateRequest); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_txpool_mining_proto_msgTypes[13].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*HashRateReply); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_txpool_mining_proto_msgTypes[14].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*MiningRequest); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_txpool_mining_proto_msgTypes[15].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*MiningReply); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - } - type x struct{} - out := protoimpl.TypeBuilder{ - File: protoimpl.DescBuilder{ - GoPackagePath: reflect.TypeOf(x{}).PkgPath(), - RawDescriptor: file_txpool_mining_proto_rawDesc, - NumEnums: 0, - NumMessages: 16, - NumExtensions: 0, - NumServices: 1, - }, - GoTypes: file_txpool_mining_proto_goTypes, - DependencyIndexes: file_txpool_mining_proto_depIdxs, - MessageInfos: file_txpool_mining_proto_msgTypes, - }.Build() - File_txpool_mining_proto = out.File - file_txpool_mining_proto_rawDesc = nil - file_txpool_mining_proto_goTypes = nil - file_txpool_mining_proto_depIdxs = nil -} diff --git a/gointerfaces/txpool/mining_grpc.pb.go b/gointerfaces/txpool/mining_grpc.pb.go deleted file mode 100644 index 8dbde21615..0000000000 --- a/gointerfaces/txpool/mining_grpc.pb.go +++ /dev/null @@ -1,517 +0,0 @@ -// Code generated by protoc-gen-go-grpc. DO NOT EDIT. - -package txpool - -import ( - context "context" - types "github.com/ledgerwatch/erigon/gointerfaces/types" - grpc "google.golang.org/grpc" - codes "google.golang.org/grpc/codes" - status "google.golang.org/grpc/status" - emptypb "google.golang.org/protobuf/types/known/emptypb" -) - -// This is a compile-time assertion to ensure that this generated file -// is compatible with the grpc package it is being compiled against. -// Requires gRPC-Go v1.32.0 or later. -const _ = grpc.SupportPackageIsVersion7 - -// MiningClient is the client API for Mining service. -// -// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://pkg.go.dev/google.golang.org/grpc/?tab=doc#ClientConn.NewStream. -type MiningClient interface { - // Version returns the service version number - Version(ctx context.Context, in *emptypb.Empty, opts ...grpc.CallOption) (*types.VersionReply, error) - // subscribe to pending blocks event - OnPendingBlock(ctx context.Context, in *OnPendingBlockRequest, opts ...grpc.CallOption) (Mining_OnPendingBlockClient, error) - // subscribe to mined blocks event - OnMinedBlock(ctx context.Context, in *OnMinedBlockRequest, opts ...grpc.CallOption) (Mining_OnMinedBlockClient, error) - // subscribe to pending blocks event - OnPendingLogs(ctx context.Context, in *OnPendingLogsRequest, opts ...grpc.CallOption) (Mining_OnPendingLogsClient, error) - // GetWork returns a work package for external miner. - // - // The work package consists of 3 strings: - // result[0] - 32 bytes hex encoded current block header pow-hash - // result[1] - 32 bytes hex encoded seed hash used for DAG - // result[2] - 32 bytes hex encoded boundary condition ("target"), 2^256/difficulty - // result[3] - hex encoded block number - GetWork(ctx context.Context, in *GetWorkRequest, opts ...grpc.CallOption) (*GetWorkReply, error) - // SubmitWork can be used by external miner to submit their POW solution. - // It returns an indication if the work was accepted. - // Note either an invalid solution, a stale work a non-existent work will return false. - SubmitWork(ctx context.Context, in *SubmitWorkRequest, opts ...grpc.CallOption) (*SubmitWorkReply, error) - // SubmitHashRate can be used for remote miners to submit their hash rate. - // This enables the node to report the combined hash rate of all miners - // which submit work through this node. - // - // It accepts the miner hash rate and an identifier which must be unique - // between nodes. - SubmitHashRate(ctx context.Context, in *SubmitHashRateRequest, opts ...grpc.CallOption) (*SubmitHashRateReply, error) - // HashRate returns the current hashrate for local CPU miner and remote miner. - HashRate(ctx context.Context, in *HashRateRequest, opts ...grpc.CallOption) (*HashRateReply, error) - // Mining returns an indication if this node is currently mining and it's mining configuration - Mining(ctx context.Context, in *MiningRequest, opts ...grpc.CallOption) (*MiningReply, error) -} - -type miningClient struct { - cc grpc.ClientConnInterface -} - -func NewMiningClient(cc grpc.ClientConnInterface) MiningClient { - return &miningClient{cc} -} - -func (c *miningClient) Version(ctx context.Context, in *emptypb.Empty, opts ...grpc.CallOption) (*types.VersionReply, error) { - out := new(types.VersionReply) - err := c.cc.Invoke(ctx, "/txpool.Mining/Version", in, out, opts...) - if err != nil { - return nil, err - } - return out, nil -} - -func (c *miningClient) OnPendingBlock(ctx context.Context, in *OnPendingBlockRequest, opts ...grpc.CallOption) (Mining_OnPendingBlockClient, error) { - stream, err := c.cc.NewStream(ctx, &Mining_ServiceDesc.Streams[0], "/txpool.Mining/OnPendingBlock", opts...) - if err != nil { - return nil, err - } - x := &miningOnPendingBlockClient{stream} - if err := x.ClientStream.SendMsg(in); err != nil { - return nil, err - } - if err := x.ClientStream.CloseSend(); err != nil { - return nil, err - } - return x, nil -} - -type Mining_OnPendingBlockClient interface { - Recv() (*OnPendingBlockReply, error) - grpc.ClientStream -} - -type miningOnPendingBlockClient struct { - grpc.ClientStream -} - -func (x *miningOnPendingBlockClient) Recv() (*OnPendingBlockReply, error) { - m := new(OnPendingBlockReply) - if err := x.ClientStream.RecvMsg(m); err != nil { - return nil, err - } - return m, nil -} - -func (c *miningClient) OnMinedBlock(ctx context.Context, in *OnMinedBlockRequest, opts ...grpc.CallOption) (Mining_OnMinedBlockClient, error) { - stream, err := c.cc.NewStream(ctx, &Mining_ServiceDesc.Streams[1], "/txpool.Mining/OnMinedBlock", opts...) - if err != nil { - return nil, err - } - x := &miningOnMinedBlockClient{stream} - if err := x.ClientStream.SendMsg(in); err != nil { - return nil, err - } - if err := x.ClientStream.CloseSend(); err != nil { - return nil, err - } - return x, nil -} - -type Mining_OnMinedBlockClient interface { - Recv() (*OnMinedBlockReply, error) - grpc.ClientStream -} - -type miningOnMinedBlockClient struct { - grpc.ClientStream -} - -func (x *miningOnMinedBlockClient) Recv() (*OnMinedBlockReply, error) { - m := new(OnMinedBlockReply) - if err := x.ClientStream.RecvMsg(m); err != nil { - return nil, err - } - return m, nil -} - -func (c *miningClient) OnPendingLogs(ctx context.Context, in *OnPendingLogsRequest, opts ...grpc.CallOption) (Mining_OnPendingLogsClient, error) { - stream, err := c.cc.NewStream(ctx, &Mining_ServiceDesc.Streams[2], "/txpool.Mining/OnPendingLogs", opts...) - if err != nil { - return nil, err - } - x := &miningOnPendingLogsClient{stream} - if err := x.ClientStream.SendMsg(in); err != nil { - return nil, err - } - if err := x.ClientStream.CloseSend(); err != nil { - return nil, err - } - return x, nil -} - -type Mining_OnPendingLogsClient interface { - Recv() (*OnPendingLogsReply, error) - grpc.ClientStream -} - -type miningOnPendingLogsClient struct { - grpc.ClientStream -} - -func (x *miningOnPendingLogsClient) Recv() (*OnPendingLogsReply, error) { - m := new(OnPendingLogsReply) - if err := x.ClientStream.RecvMsg(m); err != nil { - return nil, err - } - return m, nil -} - -func (c *miningClient) GetWork(ctx context.Context, in *GetWorkRequest, opts ...grpc.CallOption) (*GetWorkReply, error) { - out := new(GetWorkReply) - err := c.cc.Invoke(ctx, "/txpool.Mining/GetWork", in, out, opts...) - if err != nil { - return nil, err - } - return out, nil -} - -func (c *miningClient) SubmitWork(ctx context.Context, in *SubmitWorkRequest, opts ...grpc.CallOption) (*SubmitWorkReply, error) { - out := new(SubmitWorkReply) - err := c.cc.Invoke(ctx, "/txpool.Mining/SubmitWork", in, out, opts...) - if err != nil { - return nil, err - } - return out, nil -} - -func (c *miningClient) SubmitHashRate(ctx context.Context, in *SubmitHashRateRequest, opts ...grpc.CallOption) (*SubmitHashRateReply, error) { - out := new(SubmitHashRateReply) - err := c.cc.Invoke(ctx, "/txpool.Mining/SubmitHashRate", in, out, opts...) - if err != nil { - return nil, err - } - return out, nil -} - -func (c *miningClient) HashRate(ctx context.Context, in *HashRateRequest, opts ...grpc.CallOption) (*HashRateReply, error) { - out := new(HashRateReply) - err := c.cc.Invoke(ctx, "/txpool.Mining/HashRate", in, out, opts...) - if err != nil { - return nil, err - } - return out, nil -} - -func (c *miningClient) Mining(ctx context.Context, in *MiningRequest, opts ...grpc.CallOption) (*MiningReply, error) { - out := new(MiningReply) - err := c.cc.Invoke(ctx, "/txpool.Mining/Mining", in, out, opts...) - if err != nil { - return nil, err - } - return out, nil -} - -// MiningServer is the server API for Mining service. -// All implementations must embed UnimplementedMiningServer -// for forward compatibility -type MiningServer interface { - // Version returns the service version number - Version(context.Context, *emptypb.Empty) (*types.VersionReply, error) - // subscribe to pending blocks event - OnPendingBlock(*OnPendingBlockRequest, Mining_OnPendingBlockServer) error - // subscribe to mined blocks event - OnMinedBlock(*OnMinedBlockRequest, Mining_OnMinedBlockServer) error - // subscribe to pending blocks event - OnPendingLogs(*OnPendingLogsRequest, Mining_OnPendingLogsServer) error - // GetWork returns a work package for external miner. - // - // The work package consists of 3 strings: - // result[0] - 32 bytes hex encoded current block header pow-hash - // result[1] - 32 bytes hex encoded seed hash used for DAG - // result[2] - 32 bytes hex encoded boundary condition ("target"), 2^256/difficulty - // result[3] - hex encoded block number - GetWork(context.Context, *GetWorkRequest) (*GetWorkReply, error) - // SubmitWork can be used by external miner to submit their POW solution. - // It returns an indication if the work was accepted. - // Note either an invalid solution, a stale work a non-existent work will return false. - SubmitWork(context.Context, *SubmitWorkRequest) (*SubmitWorkReply, error) - // SubmitHashRate can be used for remote miners to submit their hash rate. - // This enables the node to report the combined hash rate of all miners - // which submit work through this node. - // - // It accepts the miner hash rate and an identifier which must be unique - // between nodes. - SubmitHashRate(context.Context, *SubmitHashRateRequest) (*SubmitHashRateReply, error) - // HashRate returns the current hashrate for local CPU miner and remote miner. - HashRate(context.Context, *HashRateRequest) (*HashRateReply, error) - // Mining returns an indication if this node is currently mining and it's mining configuration - Mining(context.Context, *MiningRequest) (*MiningReply, error) - mustEmbedUnimplementedMiningServer() -} - -// UnimplementedMiningServer must be embedded to have forward compatible implementations. -type UnimplementedMiningServer struct { -} - -func (UnimplementedMiningServer) Version(context.Context, *emptypb.Empty) (*types.VersionReply, error) { - return nil, status.Errorf(codes.Unimplemented, "method Version not implemented") -} -func (UnimplementedMiningServer) OnPendingBlock(*OnPendingBlockRequest, Mining_OnPendingBlockServer) error { - return status.Errorf(codes.Unimplemented, "method OnPendingBlock not implemented") -} -func (UnimplementedMiningServer) OnMinedBlock(*OnMinedBlockRequest, Mining_OnMinedBlockServer) error { - return status.Errorf(codes.Unimplemented, "method OnMinedBlock not implemented") -} -func (UnimplementedMiningServer) OnPendingLogs(*OnPendingLogsRequest, Mining_OnPendingLogsServer) error { - return status.Errorf(codes.Unimplemented, "method OnPendingLogs not implemented") -} -func (UnimplementedMiningServer) GetWork(context.Context, *GetWorkRequest) (*GetWorkReply, error) { - return nil, status.Errorf(codes.Unimplemented, "method GetWork not implemented") -} -func (UnimplementedMiningServer) SubmitWork(context.Context, *SubmitWorkRequest) (*SubmitWorkReply, error) { - return nil, status.Errorf(codes.Unimplemented, "method SubmitWork not implemented") -} -func (UnimplementedMiningServer) SubmitHashRate(context.Context, *SubmitHashRateRequest) (*SubmitHashRateReply, error) { - return nil, status.Errorf(codes.Unimplemented, "method SubmitHashRate not implemented") -} -func (UnimplementedMiningServer) HashRate(context.Context, *HashRateRequest) (*HashRateReply, error) { - return nil, status.Errorf(codes.Unimplemented, "method HashRate not implemented") -} -func (UnimplementedMiningServer) Mining(context.Context, *MiningRequest) (*MiningReply, error) { - return nil, status.Errorf(codes.Unimplemented, "method Mining not implemented") -} -func (UnimplementedMiningServer) mustEmbedUnimplementedMiningServer() {} - -// UnsafeMiningServer may be embedded to opt out of forward compatibility for this service. -// Use of this interface is not recommended, as added methods to MiningServer will -// result in compilation errors. -type UnsafeMiningServer interface { - mustEmbedUnimplementedMiningServer() -} - -func RegisterMiningServer(s grpc.ServiceRegistrar, srv MiningServer) { - s.RegisterService(&Mining_ServiceDesc, srv) -} - -func _Mining_Version_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(emptypb.Empty) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(MiningServer).Version(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/txpool.Mining/Version", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(MiningServer).Version(ctx, req.(*emptypb.Empty)) - } - return interceptor(ctx, in, info, handler) -} - -func _Mining_OnPendingBlock_Handler(srv interface{}, stream grpc.ServerStream) error { - m := new(OnPendingBlockRequest) - if err := stream.RecvMsg(m); err != nil { - return err - } - return srv.(MiningServer).OnPendingBlock(m, &miningOnPendingBlockServer{stream}) -} - -type Mining_OnPendingBlockServer interface { - Send(*OnPendingBlockReply) error - grpc.ServerStream -} - -type miningOnPendingBlockServer struct { - grpc.ServerStream -} - -func (x *miningOnPendingBlockServer) Send(m *OnPendingBlockReply) error { - return x.ServerStream.SendMsg(m) -} - -func _Mining_OnMinedBlock_Handler(srv interface{}, stream grpc.ServerStream) error { - m := new(OnMinedBlockRequest) - if err := stream.RecvMsg(m); err != nil { - return err - } - return srv.(MiningServer).OnMinedBlock(m, &miningOnMinedBlockServer{stream}) -} - -type Mining_OnMinedBlockServer interface { - Send(*OnMinedBlockReply) error - grpc.ServerStream -} - -type miningOnMinedBlockServer struct { - grpc.ServerStream -} - -func (x *miningOnMinedBlockServer) Send(m *OnMinedBlockReply) error { - return x.ServerStream.SendMsg(m) -} - -func _Mining_OnPendingLogs_Handler(srv interface{}, stream grpc.ServerStream) error { - m := new(OnPendingLogsRequest) - if err := stream.RecvMsg(m); err != nil { - return err - } - return srv.(MiningServer).OnPendingLogs(m, &miningOnPendingLogsServer{stream}) -} - -type Mining_OnPendingLogsServer interface { - Send(*OnPendingLogsReply) error - grpc.ServerStream -} - -type miningOnPendingLogsServer struct { - grpc.ServerStream -} - -func (x *miningOnPendingLogsServer) Send(m *OnPendingLogsReply) error { - return x.ServerStream.SendMsg(m) -} - -func _Mining_GetWork_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(GetWorkRequest) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(MiningServer).GetWork(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/txpool.Mining/GetWork", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(MiningServer).GetWork(ctx, req.(*GetWorkRequest)) - } - return interceptor(ctx, in, info, handler) -} - -func _Mining_SubmitWork_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(SubmitWorkRequest) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(MiningServer).SubmitWork(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/txpool.Mining/SubmitWork", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(MiningServer).SubmitWork(ctx, req.(*SubmitWorkRequest)) - } - return interceptor(ctx, in, info, handler) -} - -func _Mining_SubmitHashRate_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(SubmitHashRateRequest) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(MiningServer).SubmitHashRate(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/txpool.Mining/SubmitHashRate", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(MiningServer).SubmitHashRate(ctx, req.(*SubmitHashRateRequest)) - } - return interceptor(ctx, in, info, handler) -} - -func _Mining_HashRate_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(HashRateRequest) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(MiningServer).HashRate(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/txpool.Mining/HashRate", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(MiningServer).HashRate(ctx, req.(*HashRateRequest)) - } - return interceptor(ctx, in, info, handler) -} - -func _Mining_Mining_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(MiningRequest) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(MiningServer).Mining(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/txpool.Mining/Mining", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(MiningServer).Mining(ctx, req.(*MiningRequest)) - } - return interceptor(ctx, in, info, handler) -} - -// Mining_ServiceDesc is the grpc.ServiceDesc for Mining service. -// It's only intended for direct use with grpc.RegisterService, -// and not to be introspected or modified (even as a copy) -var Mining_ServiceDesc = grpc.ServiceDesc{ - ServiceName: "txpool.Mining", - HandlerType: (*MiningServer)(nil), - Methods: []grpc.MethodDesc{ - { - MethodName: "Version", - Handler: _Mining_Version_Handler, - }, - { - MethodName: "GetWork", - Handler: _Mining_GetWork_Handler, - }, - { - MethodName: "SubmitWork", - Handler: _Mining_SubmitWork_Handler, - }, - { - MethodName: "SubmitHashRate", - Handler: _Mining_SubmitHashRate_Handler, - }, - { - MethodName: "HashRate", - Handler: _Mining_HashRate_Handler, - }, - { - MethodName: "Mining", - Handler: _Mining_Mining_Handler, - }, - }, - Streams: []grpc.StreamDesc{ - { - StreamName: "OnPendingBlock", - Handler: _Mining_OnPendingBlock_Handler, - ServerStreams: true, - }, - { - StreamName: "OnMinedBlock", - Handler: _Mining_OnMinedBlock_Handler, - ServerStreams: true, - }, - { - StreamName: "OnPendingLogs", - Handler: _Mining_OnPendingLogs_Handler, - ServerStreams: true, - }, - }, - Metadata: "txpool/mining.proto", -} diff --git a/gointerfaces/txpool/txpool.pb.go b/gointerfaces/txpool/txpool.pb.go deleted file mode 100644 index 6a0f0485ad..0000000000 --- a/gointerfaces/txpool/txpool.pb.go +++ /dev/null @@ -1,880 +0,0 @@ -// Code generated by protoc-gen-go. DO NOT EDIT. -// versions: -// protoc-gen-go v1.26.0 -// protoc v3.17.3 -// source: txpool/txpool.proto - -package txpool - -import ( - types "github.com/ledgerwatch/erigon/gointerfaces/types" - protoreflect "google.golang.org/protobuf/reflect/protoreflect" - protoimpl "google.golang.org/protobuf/runtime/protoimpl" - emptypb "google.golang.org/protobuf/types/known/emptypb" - reflect "reflect" - sync "sync" -) - -const ( - // Verify that this generated code is sufficiently up-to-date. - _ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion) - // Verify that runtime/protoimpl is sufficiently up-to-date. - _ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20) -) - -type ImportResult int32 - -const ( - ImportResult_SUCCESS ImportResult = 0 - ImportResult_ALREADY_EXISTS ImportResult = 1 - ImportResult_FEE_TOO_LOW ImportResult = 2 - ImportResult_STALE ImportResult = 3 - ImportResult_INVALID ImportResult = 4 - ImportResult_INTERNAL_ERROR ImportResult = 5 -) - -// Enum value maps for ImportResult. -var ( - ImportResult_name = map[int32]string{ - 0: "SUCCESS", - 1: "ALREADY_EXISTS", - 2: "FEE_TOO_LOW", - 3: "STALE", - 4: "INVALID", - 5: "INTERNAL_ERROR", - } - ImportResult_value = map[string]int32{ - "SUCCESS": 0, - "ALREADY_EXISTS": 1, - "FEE_TOO_LOW": 2, - "STALE": 3, - "INVALID": 4, - "INTERNAL_ERROR": 5, - } -) - -func (x ImportResult) Enum() *ImportResult { - p := new(ImportResult) - *p = x - return p -} - -func (x ImportResult) String() string { - return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) -} - -func (ImportResult) Descriptor() protoreflect.EnumDescriptor { - return file_txpool_txpool_proto_enumTypes[0].Descriptor() -} - -func (ImportResult) Type() protoreflect.EnumType { - return &file_txpool_txpool_proto_enumTypes[0] -} - -func (x ImportResult) Number() protoreflect.EnumNumber { - return protoreflect.EnumNumber(x) -} - -// Deprecated: Use ImportResult.Descriptor instead. -func (ImportResult) EnumDescriptor() ([]byte, []int) { - return file_txpool_txpool_proto_rawDescGZIP(), []int{0} -} - -type AllReply_Type int32 - -const ( - AllReply_PENDING AllReply_Type = 0 // All currently processable transactions - AllReply_QUEUED AllReply_Type = 1 // Queued but non-processable transactions -) - -// Enum value maps for AllReply_Type. -var ( - AllReply_Type_name = map[int32]string{ - 0: "PENDING", - 1: "QUEUED", - } - AllReply_Type_value = map[string]int32{ - "PENDING": 0, - "QUEUED": 1, - } -) - -func (x AllReply_Type) Enum() *AllReply_Type { - p := new(AllReply_Type) - *p = x - return p -} - -func (x AllReply_Type) String() string { - return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) -} - -func (AllReply_Type) Descriptor() protoreflect.EnumDescriptor { - return file_txpool_txpool_proto_enumTypes[1].Descriptor() -} - -func (AllReply_Type) Type() protoreflect.EnumType { - return &file_txpool_txpool_proto_enumTypes[1] -} - -func (x AllReply_Type) Number() protoreflect.EnumNumber { - return protoreflect.EnumNumber(x) -} - -// Deprecated: Use AllReply_Type.Descriptor instead. -func (AllReply_Type) EnumDescriptor() ([]byte, []int) { - return file_txpool_txpool_proto_rawDescGZIP(), []int{8, 0} -} - -type TxHashes struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - Hashes []*types.H256 `protobuf:"bytes,1,rep,name=hashes,proto3" json:"hashes,omitempty"` -} - -func (x *TxHashes) Reset() { - *x = TxHashes{} - if protoimpl.UnsafeEnabled { - mi := &file_txpool_txpool_proto_msgTypes[0] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *TxHashes) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*TxHashes) ProtoMessage() {} - -func (x *TxHashes) ProtoReflect() protoreflect.Message { - mi := &file_txpool_txpool_proto_msgTypes[0] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use TxHashes.ProtoReflect.Descriptor instead. -func (*TxHashes) Descriptor() ([]byte, []int) { - return file_txpool_txpool_proto_rawDescGZIP(), []int{0} -} - -func (x *TxHashes) GetHashes() []*types.H256 { - if x != nil { - return x.Hashes - } - return nil -} - -type AddRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - RlpTxs [][]byte `protobuf:"bytes,1,rep,name=rlpTxs,proto3" json:"rlpTxs,omitempty"` -} - -func (x *AddRequest) Reset() { - *x = AddRequest{} - if protoimpl.UnsafeEnabled { - mi := &file_txpool_txpool_proto_msgTypes[1] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *AddRequest) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*AddRequest) ProtoMessage() {} - -func (x *AddRequest) ProtoReflect() protoreflect.Message { - mi := &file_txpool_txpool_proto_msgTypes[1] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use AddRequest.ProtoReflect.Descriptor instead. -func (*AddRequest) Descriptor() ([]byte, []int) { - return file_txpool_txpool_proto_rawDescGZIP(), []int{1} -} - -func (x *AddRequest) GetRlpTxs() [][]byte { - if x != nil { - return x.RlpTxs - } - return nil -} - -type AddReply struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - Imported []ImportResult `protobuf:"varint,1,rep,packed,name=imported,proto3,enum=txpool.ImportResult" json:"imported,omitempty"` - Errors []string `protobuf:"bytes,2,rep,name=errors,proto3" json:"errors,omitempty"` -} - -func (x *AddReply) Reset() { - *x = AddReply{} - if protoimpl.UnsafeEnabled { - mi := &file_txpool_txpool_proto_msgTypes[2] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *AddReply) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*AddReply) ProtoMessage() {} - -func (x *AddReply) ProtoReflect() protoreflect.Message { - mi := &file_txpool_txpool_proto_msgTypes[2] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use AddReply.ProtoReflect.Descriptor instead. -func (*AddReply) Descriptor() ([]byte, []int) { - return file_txpool_txpool_proto_rawDescGZIP(), []int{2} -} - -func (x *AddReply) GetImported() []ImportResult { - if x != nil { - return x.Imported - } - return nil -} - -func (x *AddReply) GetErrors() []string { - if x != nil { - return x.Errors - } - return nil -} - -type TransactionsRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - Hashes []*types.H256 `protobuf:"bytes,1,rep,name=hashes,proto3" json:"hashes,omitempty"` -} - -func (x *TransactionsRequest) Reset() { - *x = TransactionsRequest{} - if protoimpl.UnsafeEnabled { - mi := &file_txpool_txpool_proto_msgTypes[3] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *TransactionsRequest) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*TransactionsRequest) ProtoMessage() {} - -func (x *TransactionsRequest) ProtoReflect() protoreflect.Message { - mi := &file_txpool_txpool_proto_msgTypes[3] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use TransactionsRequest.ProtoReflect.Descriptor instead. -func (*TransactionsRequest) Descriptor() ([]byte, []int) { - return file_txpool_txpool_proto_rawDescGZIP(), []int{3} -} - -func (x *TransactionsRequest) GetHashes() []*types.H256 { - if x != nil { - return x.Hashes - } - return nil -} - -type TransactionsReply struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - RlpTxs [][]byte `protobuf:"bytes,1,rep,name=rlpTxs,proto3" json:"rlpTxs,omitempty"` -} - -func (x *TransactionsReply) Reset() { - *x = TransactionsReply{} - if protoimpl.UnsafeEnabled { - mi := &file_txpool_txpool_proto_msgTypes[4] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *TransactionsReply) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*TransactionsReply) ProtoMessage() {} - -func (x *TransactionsReply) ProtoReflect() protoreflect.Message { - mi := &file_txpool_txpool_proto_msgTypes[4] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use TransactionsReply.ProtoReflect.Descriptor instead. -func (*TransactionsReply) Descriptor() ([]byte, []int) { - return file_txpool_txpool_proto_rawDescGZIP(), []int{4} -} - -func (x *TransactionsReply) GetRlpTxs() [][]byte { - if x != nil { - return x.RlpTxs - } - return nil -} - -type OnAddRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields -} - -func (x *OnAddRequest) Reset() { - *x = OnAddRequest{} - if protoimpl.UnsafeEnabled { - mi := &file_txpool_txpool_proto_msgTypes[5] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *OnAddRequest) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*OnAddRequest) ProtoMessage() {} - -func (x *OnAddRequest) ProtoReflect() protoreflect.Message { - mi := &file_txpool_txpool_proto_msgTypes[5] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use OnAddRequest.ProtoReflect.Descriptor instead. -func (*OnAddRequest) Descriptor() ([]byte, []int) { - return file_txpool_txpool_proto_rawDescGZIP(), []int{5} -} - -type OnAddReply struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - RplTxs [][]byte `protobuf:"bytes,1,rep,name=rplTxs,proto3" json:"rplTxs,omitempty"` -} - -func (x *OnAddReply) Reset() { - *x = OnAddReply{} - if protoimpl.UnsafeEnabled { - mi := &file_txpool_txpool_proto_msgTypes[6] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *OnAddReply) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*OnAddReply) ProtoMessage() {} - -func (x *OnAddReply) ProtoReflect() protoreflect.Message { - mi := &file_txpool_txpool_proto_msgTypes[6] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use OnAddReply.ProtoReflect.Descriptor instead. -func (*OnAddReply) Descriptor() ([]byte, []int) { - return file_txpool_txpool_proto_rawDescGZIP(), []int{6} -} - -func (x *OnAddReply) GetRplTxs() [][]byte { - if x != nil { - return x.RplTxs - } - return nil -} - -type AllRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields -} - -func (x *AllRequest) Reset() { - *x = AllRequest{} - if protoimpl.UnsafeEnabled { - mi := &file_txpool_txpool_proto_msgTypes[7] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *AllRequest) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*AllRequest) ProtoMessage() {} - -func (x *AllRequest) ProtoReflect() protoreflect.Message { - mi := &file_txpool_txpool_proto_msgTypes[7] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use AllRequest.ProtoReflect.Descriptor instead. -func (*AllRequest) Descriptor() ([]byte, []int) { - return file_txpool_txpool_proto_rawDescGZIP(), []int{7} -} - -type AllReply struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - Txs []*AllReply_Tx `protobuf:"bytes,1,rep,name=txs,proto3" json:"txs,omitempty"` -} - -func (x *AllReply) Reset() { - *x = AllReply{} - if protoimpl.UnsafeEnabled { - mi := &file_txpool_txpool_proto_msgTypes[8] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *AllReply) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*AllReply) ProtoMessage() {} - -func (x *AllReply) ProtoReflect() protoreflect.Message { - mi := &file_txpool_txpool_proto_msgTypes[8] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use AllReply.ProtoReflect.Descriptor instead. -func (*AllReply) Descriptor() ([]byte, []int) { - return file_txpool_txpool_proto_rawDescGZIP(), []int{8} -} - -func (x *AllReply) GetTxs() []*AllReply_Tx { - if x != nil { - return x.Txs - } - return nil -} - -type AllReply_Tx struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - Type AllReply_Type `protobuf:"varint,1,opt,name=type,proto3,enum=txpool.AllReply_Type" json:"type,omitempty"` - Sender []byte `protobuf:"bytes,2,opt,name=sender,proto3" json:"sender,omitempty"` - RlpTx []byte `protobuf:"bytes,3,opt,name=rlpTx,proto3" json:"rlpTx,omitempty"` -} - -func (x *AllReply_Tx) Reset() { - *x = AllReply_Tx{} - if protoimpl.UnsafeEnabled { - mi := &file_txpool_txpool_proto_msgTypes[9] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *AllReply_Tx) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*AllReply_Tx) ProtoMessage() {} - -func (x *AllReply_Tx) ProtoReflect() protoreflect.Message { - mi := &file_txpool_txpool_proto_msgTypes[9] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use AllReply_Tx.ProtoReflect.Descriptor instead. -func (*AllReply_Tx) Descriptor() ([]byte, []int) { - return file_txpool_txpool_proto_rawDescGZIP(), []int{8, 0} -} - -func (x *AllReply_Tx) GetType() AllReply_Type { - if x != nil { - return x.Type - } - return AllReply_PENDING -} - -func (x *AllReply_Tx) GetSender() []byte { - if x != nil { - return x.Sender - } - return nil -} - -func (x *AllReply_Tx) GetRlpTx() []byte { - if x != nil { - return x.RlpTx - } - return nil -} - -var File_txpool_txpool_proto protoreflect.FileDescriptor - -var file_txpool_txpool_proto_rawDesc = []byte{ - 0x0a, 0x13, 0x74, 0x78, 0x70, 0x6f, 0x6f, 0x6c, 0x2f, 0x74, 0x78, 0x70, 0x6f, 0x6f, 0x6c, 0x2e, - 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x06, 0x74, 0x78, 0x70, 0x6f, 0x6f, 0x6c, 0x1a, 0x1b, 0x67, - 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2f, 0x65, - 0x6d, 0x70, 0x74, 0x79, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x11, 0x74, 0x79, 0x70, 0x65, - 0x73, 0x2f, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0x2f, 0x0a, - 0x08, 0x54, 0x78, 0x48, 0x61, 0x73, 0x68, 0x65, 0x73, 0x12, 0x23, 0x0a, 0x06, 0x68, 0x61, 0x73, - 0x68, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x0b, 0x2e, 0x74, 0x79, 0x70, 0x65, - 0x73, 0x2e, 0x48, 0x32, 0x35, 0x36, 0x52, 0x06, 0x68, 0x61, 0x73, 0x68, 0x65, 0x73, 0x22, 0x24, - 0x0a, 0x0a, 0x41, 0x64, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x16, 0x0a, 0x06, - 0x72, 0x6c, 0x70, 0x54, 0x78, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0c, 0x52, 0x06, 0x72, 0x6c, - 0x70, 0x54, 0x78, 0x73, 0x22, 0x54, 0x0a, 0x08, 0x41, 0x64, 0x64, 0x52, 0x65, 0x70, 0x6c, 0x79, - 0x12, 0x30, 0x0a, 0x08, 0x69, 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x64, 0x18, 0x01, 0x20, 0x03, - 0x28, 0x0e, 0x32, 0x14, 0x2e, 0x74, 0x78, 0x70, 0x6f, 0x6f, 0x6c, 0x2e, 0x49, 0x6d, 0x70, 0x6f, - 0x72, 0x74, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x52, 0x08, 0x69, 0x6d, 0x70, 0x6f, 0x72, 0x74, - 0x65, 0x64, 0x12, 0x16, 0x0a, 0x06, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x73, 0x18, 0x02, 0x20, 0x03, - 0x28, 0x09, 0x52, 0x06, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x73, 0x22, 0x3a, 0x0a, 0x13, 0x54, 0x72, - 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x12, 0x23, 0x0a, 0x06, 0x68, 0x61, 0x73, 0x68, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, - 0x0b, 0x32, 0x0b, 0x2e, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2e, 0x48, 0x32, 0x35, 0x36, 0x52, 0x06, - 0x68, 0x61, 0x73, 0x68, 0x65, 0x73, 0x22, 0x2b, 0x0a, 0x11, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, - 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x16, 0x0a, 0x06, 0x72, - 0x6c, 0x70, 0x54, 0x78, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0c, 0x52, 0x06, 0x72, 0x6c, 0x70, - 0x54, 0x78, 0x73, 0x22, 0x0e, 0x0a, 0x0c, 0x4f, 0x6e, 0x41, 0x64, 0x64, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x22, 0x24, 0x0a, 0x0a, 0x4f, 0x6e, 0x41, 0x64, 0x64, 0x52, 0x65, 0x70, 0x6c, - 0x79, 0x12, 0x16, 0x0a, 0x06, 0x72, 0x70, 0x6c, 0x54, 0x78, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, - 0x0c, 0x52, 0x06, 0x72, 0x70, 0x6c, 0x54, 0x78, 0x73, 0x22, 0x0c, 0x0a, 0x0a, 0x41, 0x6c, 0x6c, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0xb1, 0x01, 0x0a, 0x08, 0x41, 0x6c, 0x6c, 0x52, - 0x65, 0x70, 0x6c, 0x79, 0x12, 0x25, 0x0a, 0x03, 0x74, 0x78, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, - 0x0b, 0x32, 0x13, 0x2e, 0x74, 0x78, 0x70, 0x6f, 0x6f, 0x6c, 0x2e, 0x41, 0x6c, 0x6c, 0x52, 0x65, - 0x70, 0x6c, 0x79, 0x2e, 0x54, 0x78, 0x52, 0x03, 0x74, 0x78, 0x73, 0x1a, 0x5d, 0x0a, 0x02, 0x54, - 0x78, 0x12, 0x29, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, - 0x15, 0x2e, 0x74, 0x78, 0x70, 0x6f, 0x6f, 0x6c, 0x2e, 0x41, 0x6c, 0x6c, 0x52, 0x65, 0x70, 0x6c, - 0x79, 0x2e, 0x54, 0x79, 0x70, 0x65, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0x16, 0x0a, 0x06, - 0x73, 0x65, 0x6e, 0x64, 0x65, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x06, 0x73, 0x65, - 0x6e, 0x64, 0x65, 0x72, 0x12, 0x14, 0x0a, 0x05, 0x72, 0x6c, 0x70, 0x54, 0x78, 0x18, 0x03, 0x20, - 0x01, 0x28, 0x0c, 0x52, 0x05, 0x72, 0x6c, 0x70, 0x54, 0x78, 0x22, 0x1f, 0x0a, 0x04, 0x54, 0x79, - 0x70, 0x65, 0x12, 0x0b, 0x0a, 0x07, 0x50, 0x45, 0x4e, 0x44, 0x49, 0x4e, 0x47, 0x10, 0x00, 0x12, - 0x0a, 0x0a, 0x06, 0x51, 0x55, 0x45, 0x55, 0x45, 0x44, 0x10, 0x01, 0x2a, 0x6c, 0x0a, 0x0c, 0x49, - 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x12, 0x0b, 0x0a, 0x07, 0x53, - 0x55, 0x43, 0x43, 0x45, 0x53, 0x53, 0x10, 0x00, 0x12, 0x12, 0x0a, 0x0e, 0x41, 0x4c, 0x52, 0x45, - 0x41, 0x44, 0x59, 0x5f, 0x45, 0x58, 0x49, 0x53, 0x54, 0x53, 0x10, 0x01, 0x12, 0x0f, 0x0a, 0x0b, - 0x46, 0x45, 0x45, 0x5f, 0x54, 0x4f, 0x4f, 0x5f, 0x4c, 0x4f, 0x57, 0x10, 0x02, 0x12, 0x09, 0x0a, - 0x05, 0x53, 0x54, 0x41, 0x4c, 0x45, 0x10, 0x03, 0x12, 0x0b, 0x0a, 0x07, 0x49, 0x4e, 0x56, 0x41, - 0x4c, 0x49, 0x44, 0x10, 0x04, 0x12, 0x12, 0x0a, 0x0e, 0x49, 0x4e, 0x54, 0x45, 0x52, 0x4e, 0x41, - 0x4c, 0x5f, 0x45, 0x52, 0x52, 0x4f, 0x52, 0x10, 0x05, 0x32, 0xca, 0x02, 0x0a, 0x06, 0x54, 0x78, - 0x70, 0x6f, 0x6f, 0x6c, 0x12, 0x36, 0x0a, 0x07, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, - 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, - 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x13, 0x2e, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2e, - 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x31, 0x0a, 0x0b, - 0x46, 0x69, 0x6e, 0x64, 0x55, 0x6e, 0x6b, 0x6e, 0x6f, 0x77, 0x6e, 0x12, 0x10, 0x2e, 0x74, 0x78, - 0x70, 0x6f, 0x6f, 0x6c, 0x2e, 0x54, 0x78, 0x48, 0x61, 0x73, 0x68, 0x65, 0x73, 0x1a, 0x10, 0x2e, - 0x74, 0x78, 0x70, 0x6f, 0x6f, 0x6c, 0x2e, 0x54, 0x78, 0x48, 0x61, 0x73, 0x68, 0x65, 0x73, 0x12, - 0x2b, 0x0a, 0x03, 0x41, 0x64, 0x64, 0x12, 0x12, 0x2e, 0x74, 0x78, 0x70, 0x6f, 0x6f, 0x6c, 0x2e, - 0x41, 0x64, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x10, 0x2e, 0x74, 0x78, 0x70, - 0x6f, 0x6f, 0x6c, 0x2e, 0x41, 0x64, 0x64, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x46, 0x0a, 0x0c, - 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x1b, 0x2e, 0x74, - 0x78, 0x70, 0x6f, 0x6f, 0x6c, 0x2e, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, - 0x6e, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x19, 0x2e, 0x74, 0x78, 0x70, 0x6f, - 0x6f, 0x6c, 0x2e, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, - 0x65, 0x70, 0x6c, 0x79, 0x12, 0x2b, 0x0a, 0x03, 0x41, 0x6c, 0x6c, 0x12, 0x12, 0x2e, 0x74, 0x78, - 0x70, 0x6f, 0x6f, 0x6c, 0x2e, 0x41, 0x6c, 0x6c, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, - 0x10, 0x2e, 0x74, 0x78, 0x70, 0x6f, 0x6f, 0x6c, 0x2e, 0x41, 0x6c, 0x6c, 0x52, 0x65, 0x70, 0x6c, - 0x79, 0x12, 0x33, 0x0a, 0x05, 0x4f, 0x6e, 0x41, 0x64, 0x64, 0x12, 0x14, 0x2e, 0x74, 0x78, 0x70, - 0x6f, 0x6f, 0x6c, 0x2e, 0x4f, 0x6e, 0x41, 0x64, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x1a, 0x12, 0x2e, 0x74, 0x78, 0x70, 0x6f, 0x6f, 0x6c, 0x2e, 0x4f, 0x6e, 0x41, 0x64, 0x64, 0x52, - 0x65, 0x70, 0x6c, 0x79, 0x30, 0x01, 0x42, 0x11, 0x5a, 0x0f, 0x2e, 0x2f, 0x74, 0x78, 0x70, 0x6f, - 0x6f, 0x6c, 0x3b, 0x74, 0x78, 0x70, 0x6f, 0x6f, 0x6c, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, - 0x33, -} - -var ( - file_txpool_txpool_proto_rawDescOnce sync.Once - file_txpool_txpool_proto_rawDescData = file_txpool_txpool_proto_rawDesc -) - -func file_txpool_txpool_proto_rawDescGZIP() []byte { - file_txpool_txpool_proto_rawDescOnce.Do(func() { - file_txpool_txpool_proto_rawDescData = protoimpl.X.CompressGZIP(file_txpool_txpool_proto_rawDescData) - }) - return file_txpool_txpool_proto_rawDescData -} - -var file_txpool_txpool_proto_enumTypes = make([]protoimpl.EnumInfo, 2) -var file_txpool_txpool_proto_msgTypes = make([]protoimpl.MessageInfo, 10) -var file_txpool_txpool_proto_goTypes = []interface{}{ - (ImportResult)(0), // 0: txpool.ImportResult - (AllReply_Type)(0), // 1: txpool.AllReply.Type - (*TxHashes)(nil), // 2: txpool.TxHashes - (*AddRequest)(nil), // 3: txpool.AddRequest - (*AddReply)(nil), // 4: txpool.AddReply - (*TransactionsRequest)(nil), // 5: txpool.TransactionsRequest - (*TransactionsReply)(nil), // 6: txpool.TransactionsReply - (*OnAddRequest)(nil), // 7: txpool.OnAddRequest - (*OnAddReply)(nil), // 8: txpool.OnAddReply - (*AllRequest)(nil), // 9: txpool.AllRequest - (*AllReply)(nil), // 10: txpool.AllReply - (*AllReply_Tx)(nil), // 11: txpool.AllReply.Tx - (*types.H256)(nil), // 12: types.H256 - (*emptypb.Empty)(nil), // 13: google.protobuf.Empty - (*types.VersionReply)(nil), // 14: types.VersionReply -} -var file_txpool_txpool_proto_depIdxs = []int32{ - 12, // 0: txpool.TxHashes.hashes:type_name -> types.H256 - 0, // 1: txpool.AddReply.imported:type_name -> txpool.ImportResult - 12, // 2: txpool.TransactionsRequest.hashes:type_name -> types.H256 - 11, // 3: txpool.AllReply.txs:type_name -> txpool.AllReply.Tx - 1, // 4: txpool.AllReply.Tx.type:type_name -> txpool.AllReply.Type - 13, // 5: txpool.Txpool.Version:input_type -> google.protobuf.Empty - 2, // 6: txpool.Txpool.FindUnknown:input_type -> txpool.TxHashes - 3, // 7: txpool.Txpool.Add:input_type -> txpool.AddRequest - 5, // 8: txpool.Txpool.Transactions:input_type -> txpool.TransactionsRequest - 9, // 9: txpool.Txpool.All:input_type -> txpool.AllRequest - 7, // 10: txpool.Txpool.OnAdd:input_type -> txpool.OnAddRequest - 14, // 11: txpool.Txpool.Version:output_type -> types.VersionReply - 2, // 12: txpool.Txpool.FindUnknown:output_type -> txpool.TxHashes - 4, // 13: txpool.Txpool.Add:output_type -> txpool.AddReply - 6, // 14: txpool.Txpool.Transactions:output_type -> txpool.TransactionsReply - 10, // 15: txpool.Txpool.All:output_type -> txpool.AllReply - 8, // 16: txpool.Txpool.OnAdd:output_type -> txpool.OnAddReply - 11, // [11:17] is the sub-list for method output_type - 5, // [5:11] is the sub-list for method input_type - 5, // [5:5] is the sub-list for extension type_name - 5, // [5:5] is the sub-list for extension extendee - 0, // [0:5] is the sub-list for field type_name -} - -func init() { file_txpool_txpool_proto_init() } -func file_txpool_txpool_proto_init() { - if File_txpool_txpool_proto != nil { - return - } - if !protoimpl.UnsafeEnabled { - file_txpool_txpool_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*TxHashes); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_txpool_txpool_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*AddRequest); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_txpool_txpool_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*AddReply); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_txpool_txpool_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*TransactionsRequest); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_txpool_txpool_proto_msgTypes[4].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*TransactionsReply); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_txpool_txpool_proto_msgTypes[5].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*OnAddRequest); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_txpool_txpool_proto_msgTypes[6].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*OnAddReply); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_txpool_txpool_proto_msgTypes[7].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*AllRequest); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_txpool_txpool_proto_msgTypes[8].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*AllReply); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_txpool_txpool_proto_msgTypes[9].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*AllReply_Tx); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - } - type x struct{} - out := protoimpl.TypeBuilder{ - File: protoimpl.DescBuilder{ - GoPackagePath: reflect.TypeOf(x{}).PkgPath(), - RawDescriptor: file_txpool_txpool_proto_rawDesc, - NumEnums: 2, - NumMessages: 10, - NumExtensions: 0, - NumServices: 1, - }, - GoTypes: file_txpool_txpool_proto_goTypes, - DependencyIndexes: file_txpool_txpool_proto_depIdxs, - EnumInfos: file_txpool_txpool_proto_enumTypes, - MessageInfos: file_txpool_txpool_proto_msgTypes, - }.Build() - File_txpool_txpool_proto = out.File - file_txpool_txpool_proto_rawDesc = nil - file_txpool_txpool_proto_goTypes = nil - file_txpool_txpool_proto_depIdxs = nil -} diff --git a/gointerfaces/txpool/txpool_grpc.pb.go b/gointerfaces/txpool/txpool_grpc.pb.go deleted file mode 100644 index 73694ea80d..0000000000 --- a/gointerfaces/txpool/txpool_grpc.pb.go +++ /dev/null @@ -1,325 +0,0 @@ -// Code generated by protoc-gen-go-grpc. DO NOT EDIT. - -package txpool - -import ( - context "context" - types "github.com/ledgerwatch/erigon/gointerfaces/types" - grpc "google.golang.org/grpc" - codes "google.golang.org/grpc/codes" - status "google.golang.org/grpc/status" - emptypb "google.golang.org/protobuf/types/known/emptypb" -) - -// This is a compile-time assertion to ensure that this generated file -// is compatible with the grpc package it is being compiled against. -// Requires gRPC-Go v1.32.0 or later. -const _ = grpc.SupportPackageIsVersion7 - -// TxpoolClient is the client API for Txpool service. -// -// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://pkg.go.dev/google.golang.org/grpc/?tab=doc#ClientConn.NewStream. -type TxpoolClient interface { - // Version returns the service version number - Version(ctx context.Context, in *emptypb.Empty, opts ...grpc.CallOption) (*types.VersionReply, error) - // preserves incoming order, changes amount, unknown hashes will be omitted - FindUnknown(ctx context.Context, in *TxHashes, opts ...grpc.CallOption) (*TxHashes, error) - // Expecting signed transactions. Preserves incoming order and amount - // Adding txs as local (use P2P to add remote txs) - Add(ctx context.Context, in *AddRequest, opts ...grpc.CallOption) (*AddReply, error) - // preserves incoming order and amount, if some transaction doesn't exists in pool - returns nil in this slot - Transactions(ctx context.Context, in *TransactionsRequest, opts ...grpc.CallOption) (*TransactionsReply, error) - // returns all transactions from tx pool - All(ctx context.Context, in *AllRequest, opts ...grpc.CallOption) (*AllReply, error) - // subscribe to new transactions add event - OnAdd(ctx context.Context, in *OnAddRequest, opts ...grpc.CallOption) (Txpool_OnAddClient, error) -} - -type txpoolClient struct { - cc grpc.ClientConnInterface -} - -func NewTxpoolClient(cc grpc.ClientConnInterface) TxpoolClient { - return &txpoolClient{cc} -} - -func (c *txpoolClient) Version(ctx context.Context, in *emptypb.Empty, opts ...grpc.CallOption) (*types.VersionReply, error) { - out := new(types.VersionReply) - err := c.cc.Invoke(ctx, "/txpool.Txpool/Version", in, out, opts...) - if err != nil { - return nil, err - } - return out, nil -} - -func (c *txpoolClient) FindUnknown(ctx context.Context, in *TxHashes, opts ...grpc.CallOption) (*TxHashes, error) { - out := new(TxHashes) - err := c.cc.Invoke(ctx, "/txpool.Txpool/FindUnknown", in, out, opts...) - if err != nil { - return nil, err - } - return out, nil -} - -func (c *txpoolClient) Add(ctx context.Context, in *AddRequest, opts ...grpc.CallOption) (*AddReply, error) { - out := new(AddReply) - err := c.cc.Invoke(ctx, "/txpool.Txpool/Add", in, out, opts...) - if err != nil { - return nil, err - } - return out, nil -} - -func (c *txpoolClient) Transactions(ctx context.Context, in *TransactionsRequest, opts ...grpc.CallOption) (*TransactionsReply, error) { - out := new(TransactionsReply) - err := c.cc.Invoke(ctx, "/txpool.Txpool/Transactions", in, out, opts...) - if err != nil { - return nil, err - } - return out, nil -} - -func (c *txpoolClient) All(ctx context.Context, in *AllRequest, opts ...grpc.CallOption) (*AllReply, error) { - out := new(AllReply) - err := c.cc.Invoke(ctx, "/txpool.Txpool/All", in, out, opts...) - if err != nil { - return nil, err - } - return out, nil -} - -func (c *txpoolClient) OnAdd(ctx context.Context, in *OnAddRequest, opts ...grpc.CallOption) (Txpool_OnAddClient, error) { - stream, err := c.cc.NewStream(ctx, &Txpool_ServiceDesc.Streams[0], "/txpool.Txpool/OnAdd", opts...) - if err != nil { - return nil, err - } - x := &txpoolOnAddClient{stream} - if err := x.ClientStream.SendMsg(in); err != nil { - return nil, err - } - if err := x.ClientStream.CloseSend(); err != nil { - return nil, err - } - return x, nil -} - -type Txpool_OnAddClient interface { - Recv() (*OnAddReply, error) - grpc.ClientStream -} - -type txpoolOnAddClient struct { - grpc.ClientStream -} - -func (x *txpoolOnAddClient) Recv() (*OnAddReply, error) { - m := new(OnAddReply) - if err := x.ClientStream.RecvMsg(m); err != nil { - return nil, err - } - return m, nil -} - -// TxpoolServer is the server API for Txpool service. -// All implementations must embed UnimplementedTxpoolServer -// for forward compatibility -type TxpoolServer interface { - // Version returns the service version number - Version(context.Context, *emptypb.Empty) (*types.VersionReply, error) - // preserves incoming order, changes amount, unknown hashes will be omitted - FindUnknown(context.Context, *TxHashes) (*TxHashes, error) - // Expecting signed transactions. Preserves incoming order and amount - // Adding txs as local (use P2P to add remote txs) - Add(context.Context, *AddRequest) (*AddReply, error) - // preserves incoming order and amount, if some transaction doesn't exists in pool - returns nil in this slot - Transactions(context.Context, *TransactionsRequest) (*TransactionsReply, error) - // returns all transactions from tx pool - All(context.Context, *AllRequest) (*AllReply, error) - // subscribe to new transactions add event - OnAdd(*OnAddRequest, Txpool_OnAddServer) error - mustEmbedUnimplementedTxpoolServer() -} - -// UnimplementedTxpoolServer must be embedded to have forward compatible implementations. -type UnimplementedTxpoolServer struct { -} - -func (UnimplementedTxpoolServer) Version(context.Context, *emptypb.Empty) (*types.VersionReply, error) { - return nil, status.Errorf(codes.Unimplemented, "method Version not implemented") -} -func (UnimplementedTxpoolServer) FindUnknown(context.Context, *TxHashes) (*TxHashes, error) { - return nil, status.Errorf(codes.Unimplemented, "method FindUnknown not implemented") -} -func (UnimplementedTxpoolServer) Add(context.Context, *AddRequest) (*AddReply, error) { - return nil, status.Errorf(codes.Unimplemented, "method Add not implemented") -} -func (UnimplementedTxpoolServer) Transactions(context.Context, *TransactionsRequest) (*TransactionsReply, error) { - return nil, status.Errorf(codes.Unimplemented, "method Transactions not implemented") -} -func (UnimplementedTxpoolServer) All(context.Context, *AllRequest) (*AllReply, error) { - return nil, status.Errorf(codes.Unimplemented, "method All not implemented") -} -func (UnimplementedTxpoolServer) OnAdd(*OnAddRequest, Txpool_OnAddServer) error { - return status.Errorf(codes.Unimplemented, "method OnAdd not implemented") -} -func (UnimplementedTxpoolServer) mustEmbedUnimplementedTxpoolServer() {} - -// UnsafeTxpoolServer may be embedded to opt out of forward compatibility for this service. -// Use of this interface is not recommended, as added methods to TxpoolServer will -// result in compilation errors. -type UnsafeTxpoolServer interface { - mustEmbedUnimplementedTxpoolServer() -} - -func RegisterTxpoolServer(s grpc.ServiceRegistrar, srv TxpoolServer) { - s.RegisterService(&Txpool_ServiceDesc, srv) -} - -func _Txpool_Version_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(emptypb.Empty) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(TxpoolServer).Version(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/txpool.Txpool/Version", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(TxpoolServer).Version(ctx, req.(*emptypb.Empty)) - } - return interceptor(ctx, in, info, handler) -} - -func _Txpool_FindUnknown_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(TxHashes) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(TxpoolServer).FindUnknown(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/txpool.Txpool/FindUnknown", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(TxpoolServer).FindUnknown(ctx, req.(*TxHashes)) - } - return interceptor(ctx, in, info, handler) -} - -func _Txpool_Add_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(AddRequest) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(TxpoolServer).Add(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/txpool.Txpool/Add", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(TxpoolServer).Add(ctx, req.(*AddRequest)) - } - return interceptor(ctx, in, info, handler) -} - -func _Txpool_Transactions_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(TransactionsRequest) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(TxpoolServer).Transactions(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/txpool.Txpool/Transactions", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(TxpoolServer).Transactions(ctx, req.(*TransactionsRequest)) - } - return interceptor(ctx, in, info, handler) -} - -func _Txpool_All_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(AllRequest) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(TxpoolServer).All(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/txpool.Txpool/All", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(TxpoolServer).All(ctx, req.(*AllRequest)) - } - return interceptor(ctx, in, info, handler) -} - -func _Txpool_OnAdd_Handler(srv interface{}, stream grpc.ServerStream) error { - m := new(OnAddRequest) - if err := stream.RecvMsg(m); err != nil { - return err - } - return srv.(TxpoolServer).OnAdd(m, &txpoolOnAddServer{stream}) -} - -type Txpool_OnAddServer interface { - Send(*OnAddReply) error - grpc.ServerStream -} - -type txpoolOnAddServer struct { - grpc.ServerStream -} - -func (x *txpoolOnAddServer) Send(m *OnAddReply) error { - return x.ServerStream.SendMsg(m) -} - -// Txpool_ServiceDesc is the grpc.ServiceDesc for Txpool service. -// It's only intended for direct use with grpc.RegisterService, -// and not to be introspected or modified (even as a copy) -var Txpool_ServiceDesc = grpc.ServiceDesc{ - ServiceName: "txpool.Txpool", - HandlerType: (*TxpoolServer)(nil), - Methods: []grpc.MethodDesc{ - { - MethodName: "Version", - Handler: _Txpool_Version_Handler, - }, - { - MethodName: "FindUnknown", - Handler: _Txpool_FindUnknown_Handler, - }, - { - MethodName: "Add", - Handler: _Txpool_Add_Handler, - }, - { - MethodName: "Transactions", - Handler: _Txpool_Transactions_Handler, - }, - { - MethodName: "All", - Handler: _Txpool_All_Handler, - }, - }, - Streams: []grpc.StreamDesc{ - { - StreamName: "OnAdd", - Handler: _Txpool_OnAdd_Handler, - ServerStreams: true, - }, - }, - Metadata: "txpool/txpool.proto", -} diff --git a/gointerfaces/type_utils.go b/gointerfaces/type_utils.go deleted file mode 100644 index 0317267e62..0000000000 --- a/gointerfaces/type_utils.go +++ /dev/null @@ -1,97 +0,0 @@ -package gointerfaces - -import ( - "encoding/binary" - - "github.com/holiman/uint256" - "github.com/ledgerwatch/erigon/common" - "github.com/ledgerwatch/erigon/gointerfaces/types" -) - -func ConvertH256ToHash(h256 *types.H256) common.Hash { - var hash common.Hash - binary.BigEndian.PutUint64(hash[0:], h256.Hi.Hi) - binary.BigEndian.PutUint64(hash[8:], h256.Hi.Lo) - binary.BigEndian.PutUint64(hash[16:], h256.Lo.Hi) - binary.BigEndian.PutUint64(hash[24:], h256.Lo.Lo) - return hash -} - -func ConvertHashesToH256(hashes common.Hashes) []*types.H256 { - res := make([]*types.H256, len(hashes)) - for i := range hashes { - res[i] = ConvertHashToH256(hashes[i]) - } - return res -} - -func ConvertHashToH256(hash common.Hash) *types.H256 { - return &types.H256{ - Lo: &types.H128{Lo: binary.BigEndian.Uint64(hash[24:]), Hi: binary.BigEndian.Uint64(hash[16:])}, - Hi: &types.H128{Lo: binary.BigEndian.Uint64(hash[8:]), Hi: binary.BigEndian.Uint64(hash[0:])}, - } -} - -func ConvertH160toAddress(h160 *types.H160) common.Address { - var addr common.Address - binary.BigEndian.PutUint64(addr[0:], h160.Hi.Hi) - binary.BigEndian.PutUint64(addr[8:], h160.Hi.Lo) - binary.BigEndian.PutUint32(addr[16:], h160.Lo) - return addr -} - -func ConvertAddressToH160(addr common.Address) *types.H160 { - return &types.H160{ - Lo: binary.BigEndian.Uint32(addr[16:]), - Hi: &types.H128{Lo: binary.BigEndian.Uint64(addr[8:]), Hi: binary.BigEndian.Uint64(addr[0:])}, - } -} - -func ConvertH256ToUint256Int(h256 *types.H256) *uint256.Int { - // Note: uint256.Int is an array of 4 uint64 in little-endian order, i.e. most significant word is [3] - var i uint256.Int - i[3] = h256.Hi.Hi - i[2] = h256.Hi.Lo - i[1] = h256.Lo.Hi - i[0] = h256.Lo.Lo - return &i -} - -func ConvertUint256IntToH256(i *uint256.Int) *types.H256 { - // Note: uint256.Int is an array of 4 uint64 in little-endian order, i.e. most significant word is [3] - return &types.H256{ - Lo: &types.H128{Lo: i[0], Hi: i[1]}, - Hi: &types.H128{Lo: i[2], Hi: i[3]}, - } -} - -func ConvertH512ToBytes(h512 *types.H512) []byte { - var b [64]byte - binary.BigEndian.PutUint64(b[0:], h512.Hi.Hi.Hi) - binary.BigEndian.PutUint64(b[8:], h512.Hi.Hi.Lo) - binary.BigEndian.PutUint64(b[16:], h512.Hi.Lo.Hi) - binary.BigEndian.PutUint64(b[24:], h512.Hi.Lo.Lo) - binary.BigEndian.PutUint64(b[32:], h512.Lo.Hi.Hi) - binary.BigEndian.PutUint64(b[40:], h512.Lo.Hi.Lo) - binary.BigEndian.PutUint64(b[48:], h512.Lo.Lo.Hi) - binary.BigEndian.PutUint64(b[56:], h512.Lo.Lo.Lo) - return b[:] -} - -func ConvertBytesToH512(b []byte) *types.H512 { - if len(b) < 64 { - var b1 [64]byte - copy(b1[:], b) - b = b1[:] - } - return &types.H512{ - Lo: &types.H256{ - Lo: &types.H128{Lo: binary.BigEndian.Uint64(b[56:]), Hi: binary.BigEndian.Uint64(b[48:])}, - Hi: &types.H128{Lo: binary.BigEndian.Uint64(b[40:]), Hi: binary.BigEndian.Uint64(b[32:])}, - }, - Hi: &types.H256{ - Lo: &types.H128{Lo: binary.BigEndian.Uint64(b[24:]), Hi: binary.BigEndian.Uint64(b[16:])}, - Hi: &types.H128{Lo: binary.BigEndian.Uint64(b[8:]), Hi: binary.BigEndian.Uint64(b[0:])}, - }, - } -} diff --git a/gointerfaces/types/types.pb.go b/gointerfaces/types/types.pb.go deleted file mode 100644 index 66accbf5f6..0000000000 --- a/gointerfaces/types/types.pb.go +++ /dev/null @@ -1,515 +0,0 @@ -// Code generated by protoc-gen-go. DO NOT EDIT. -// versions: -// protoc-gen-go v1.26.0 -// protoc v3.17.3 -// source: types/types.proto - -package types - -import ( - "reflect" - "sync" - - "google.golang.org/protobuf/reflect/protoreflect" - "google.golang.org/protobuf/runtime/protoimpl" - "google.golang.org/protobuf/types/descriptorpb" -) - -const ( - // Verify that this generated code is sufficiently up-to-date. - _ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion) - // Verify that runtime/protoimpl is sufficiently up-to-date. - _ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20) -) - -type H128 struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - Hi uint64 `protobuf:"varint,1,opt,name=hi,proto3" json:"hi,omitempty"` - Lo uint64 `protobuf:"varint,2,opt,name=lo,proto3" json:"lo,omitempty"` -} - -func (x *H128) Reset() { - *x = H128{} - if protoimpl.UnsafeEnabled { - mi := &file_types_types_proto_msgTypes[0] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *H128) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*H128) ProtoMessage() {} - -func (x *H128) ProtoReflect() protoreflect.Message { - mi := &file_types_types_proto_msgTypes[0] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use H128.ProtoReflect.Descriptor instead. -func (*H128) Descriptor() ([]byte, []int) { - return file_types_types_proto_rawDescGZIP(), []int{0} -} - -func (x *H128) GetHi() uint64 { - if x != nil { - return x.Hi - } - return 0 -} - -func (x *H128) GetLo() uint64 { - if x != nil { - return x.Lo - } - return 0 -} - -type H160 struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - Hi *H128 `protobuf:"bytes,1,opt,name=hi,proto3" json:"hi,omitempty"` - Lo uint32 `protobuf:"varint,2,opt,name=lo,proto3" json:"lo,omitempty"` -} - -func (x *H160) Reset() { - *x = H160{} - if protoimpl.UnsafeEnabled { - mi := &file_types_types_proto_msgTypes[1] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *H160) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*H160) ProtoMessage() {} - -func (x *H160) ProtoReflect() protoreflect.Message { - mi := &file_types_types_proto_msgTypes[1] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use H160.ProtoReflect.Descriptor instead. -func (*H160) Descriptor() ([]byte, []int) { - return file_types_types_proto_rawDescGZIP(), []int{1} -} - -func (x *H160) GetHi() *H128 { - if x != nil { - return x.Hi - } - return nil -} - -func (x *H160) GetLo() uint32 { - if x != nil { - return x.Lo - } - return 0 -} - -type H256 struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - Hi *H128 `protobuf:"bytes,1,opt,name=hi,proto3" json:"hi,omitempty"` - Lo *H128 `protobuf:"bytes,2,opt,name=lo,proto3" json:"lo,omitempty"` -} - -func (x *H256) Reset() { - *x = H256{} - if protoimpl.UnsafeEnabled { - mi := &file_types_types_proto_msgTypes[2] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *H256) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*H256) ProtoMessage() {} - -func (x *H256) ProtoReflect() protoreflect.Message { - mi := &file_types_types_proto_msgTypes[2] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use H256.ProtoReflect.Descriptor instead. -func (*H256) Descriptor() ([]byte, []int) { - return file_types_types_proto_rawDescGZIP(), []int{2} -} - -func (x *H256) GetHi() *H128 { - if x != nil { - return x.Hi - } - return nil -} - -func (x *H256) GetLo() *H128 { - if x != nil { - return x.Lo - } - return nil -} - -type H512 struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - Hi *H256 `protobuf:"bytes,1,opt,name=hi,proto3" json:"hi,omitempty"` - Lo *H256 `protobuf:"bytes,2,opt,name=lo,proto3" json:"lo,omitempty"` -} - -func (x *H512) Reset() { - *x = H512{} - if protoimpl.UnsafeEnabled { - mi := &file_types_types_proto_msgTypes[3] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *H512) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*H512) ProtoMessage() {} - -func (x *H512) ProtoReflect() protoreflect.Message { - mi := &file_types_types_proto_msgTypes[3] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use H512.ProtoReflect.Descriptor instead. -func (*H512) Descriptor() ([]byte, []int) { - return file_types_types_proto_rawDescGZIP(), []int{3} -} - -func (x *H512) GetHi() *H256 { - if x != nil { - return x.Hi - } - return nil -} - -func (x *H512) GetLo() *H256 { - if x != nil { - return x.Lo - } - return nil -} - -// Reply message containing the current service version on the service side -type VersionReply struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - Major uint32 `protobuf:"varint,1,opt,name=major,proto3" json:"major,omitempty"` - Minor uint32 `protobuf:"varint,2,opt,name=minor,proto3" json:"minor,omitempty"` - Patch uint32 `protobuf:"varint,3,opt,name=patch,proto3" json:"patch,omitempty"` -} - -func (x *VersionReply) Reset() { - *x = VersionReply{} - if protoimpl.UnsafeEnabled { - mi := &file_types_types_proto_msgTypes[4] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *VersionReply) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*VersionReply) ProtoMessage() {} - -func (x *VersionReply) ProtoReflect() protoreflect.Message { - mi := &file_types_types_proto_msgTypes[4] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use VersionReply.ProtoReflect.Descriptor instead. -func (*VersionReply) Descriptor() ([]byte, []int) { - return file_types_types_proto_rawDescGZIP(), []int{4} -} - -func (x *VersionReply) GetMajor() uint32 { - if x != nil { - return x.Major - } - return 0 -} - -func (x *VersionReply) GetMinor() uint32 { - if x != nil { - return x.Minor - } - return 0 -} - -func (x *VersionReply) GetPatch() uint32 { - if x != nil { - return x.Patch - } - return 0 -} - -var file_types_types_proto_extTypes = []protoimpl.ExtensionInfo{ - { - ExtendedType: (*descriptorpb.FileOptions)(nil), - ExtensionType: (*uint32)(nil), - Field: 50001, - Name: "types.service_major_version", - Tag: "varint,50001,opt,name=service_major_version", - Filename: "types/types.proto", - }, - { - ExtendedType: (*descriptorpb.FileOptions)(nil), - ExtensionType: (*uint32)(nil), - Field: 50002, - Name: "types.service_minor_version", - Tag: "varint,50002,opt,name=service_minor_version", - Filename: "types/types.proto", - }, - { - ExtendedType: (*descriptorpb.FileOptions)(nil), - ExtensionType: (*uint32)(nil), - Field: 50003, - Name: "types.service_patch_version", - Tag: "varint,50003,opt,name=service_patch_version", - Filename: "types/types.proto", - }, -} - -// Extension fields to descriptorpb.FileOptions. -var ( - // optional uint32 service_major_version = 50001; - E_ServiceMajorVersion = &file_types_types_proto_extTypes[0] - // optional uint32 service_minor_version = 50002; - E_ServiceMinorVersion = &file_types_types_proto_extTypes[1] - // optional uint32 service_patch_version = 50003; - E_ServicePatchVersion = &file_types_types_proto_extTypes[2] -) - -var File_types_types_proto protoreflect.FileDescriptor - -var file_types_types_proto_rawDesc = []byte{ - 0x0a, 0x11, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2f, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2e, 0x70, 0x72, - 0x6f, 0x74, 0x6f, 0x12, 0x05, 0x74, 0x79, 0x70, 0x65, 0x73, 0x1a, 0x20, 0x67, 0x6f, 0x6f, 0x67, - 0x6c, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2f, 0x64, 0x65, 0x73, 0x63, - 0x72, 0x69, 0x70, 0x74, 0x6f, 0x72, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0x26, 0x0a, 0x04, - 0x48, 0x31, 0x32, 0x38, 0x12, 0x0e, 0x0a, 0x02, 0x68, 0x69, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, - 0x52, 0x02, 0x68, 0x69, 0x12, 0x0e, 0x0a, 0x02, 0x6c, 0x6f, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, - 0x52, 0x02, 0x6c, 0x6f, 0x22, 0x33, 0x0a, 0x04, 0x48, 0x31, 0x36, 0x30, 0x12, 0x1b, 0x0a, 0x02, - 0x68, 0x69, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0b, 0x2e, 0x74, 0x79, 0x70, 0x65, 0x73, - 0x2e, 0x48, 0x31, 0x32, 0x38, 0x52, 0x02, 0x68, 0x69, 0x12, 0x0e, 0x0a, 0x02, 0x6c, 0x6f, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x02, 0x6c, 0x6f, 0x22, 0x40, 0x0a, 0x04, 0x48, 0x32, 0x35, - 0x36, 0x12, 0x1b, 0x0a, 0x02, 0x68, 0x69, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0b, 0x2e, - 0x74, 0x79, 0x70, 0x65, 0x73, 0x2e, 0x48, 0x31, 0x32, 0x38, 0x52, 0x02, 0x68, 0x69, 0x12, 0x1b, - 0x0a, 0x02, 0x6c, 0x6f, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0b, 0x2e, 0x74, 0x79, 0x70, - 0x65, 0x73, 0x2e, 0x48, 0x31, 0x32, 0x38, 0x52, 0x02, 0x6c, 0x6f, 0x22, 0x40, 0x0a, 0x04, 0x48, - 0x35, 0x31, 0x32, 0x12, 0x1b, 0x0a, 0x02, 0x68, 0x69, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x0b, 0x2e, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2e, 0x48, 0x32, 0x35, 0x36, 0x52, 0x02, 0x68, 0x69, - 0x12, 0x1b, 0x0a, 0x02, 0x6c, 0x6f, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0b, 0x2e, 0x74, - 0x79, 0x70, 0x65, 0x73, 0x2e, 0x48, 0x32, 0x35, 0x36, 0x52, 0x02, 0x6c, 0x6f, 0x22, 0x50, 0x0a, - 0x0c, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x14, 0x0a, - 0x05, 0x6d, 0x61, 0x6a, 0x6f, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, 0x6d, 0x61, - 0x6a, 0x6f, 0x72, 0x12, 0x14, 0x0a, 0x05, 0x6d, 0x69, 0x6e, 0x6f, 0x72, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x0d, 0x52, 0x05, 0x6d, 0x69, 0x6e, 0x6f, 0x72, 0x12, 0x14, 0x0a, 0x05, 0x70, 0x61, 0x74, - 0x63, 0x68, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, 0x70, 0x61, 0x74, 0x63, 0x68, 0x3a, - 0x52, 0x0a, 0x15, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x6d, 0x61, 0x6a, 0x6f, 0x72, - 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x1c, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, - 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x46, 0x69, 0x6c, 0x65, 0x4f, - 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0xd1, 0x86, 0x03, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x13, - 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x4d, 0x61, 0x6a, 0x6f, 0x72, 0x56, 0x65, 0x72, 0x73, - 0x69, 0x6f, 0x6e, 0x3a, 0x52, 0x0a, 0x15, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x6d, - 0x69, 0x6e, 0x6f, 0x72, 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x1c, 0x2e, 0x67, - 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x46, - 0x69, 0x6c, 0x65, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0xd2, 0x86, 0x03, 0x20, 0x01, - 0x28, 0x0d, 0x52, 0x13, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x4d, 0x69, 0x6e, 0x6f, 0x72, - 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x3a, 0x52, 0x0a, 0x15, 0x73, 0x65, 0x72, 0x76, 0x69, - 0x63, 0x65, 0x5f, 0x70, 0x61, 0x74, 0x63, 0x68, 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, - 0x12, 0x1c, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, - 0x75, 0x66, 0x2e, 0x46, 0x69, 0x6c, 0x65, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0xd3, - 0x86, 0x03, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x13, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x50, - 0x61, 0x74, 0x63, 0x68, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x42, 0x0f, 0x5a, 0x0d, 0x2e, - 0x2f, 0x74, 0x79, 0x70, 0x65, 0x73, 0x3b, 0x74, 0x79, 0x70, 0x65, 0x73, 0x62, 0x06, 0x70, 0x72, - 0x6f, 0x74, 0x6f, 0x33, -} - -var ( - file_types_types_proto_rawDescOnce sync.Once - file_types_types_proto_rawDescData = file_types_types_proto_rawDesc -) - -func file_types_types_proto_rawDescGZIP() []byte { - file_types_types_proto_rawDescOnce.Do(func() { - file_types_types_proto_rawDescData = protoimpl.X.CompressGZIP(file_types_types_proto_rawDescData) - }) - return file_types_types_proto_rawDescData -} - -var file_types_types_proto_msgTypes = make([]protoimpl.MessageInfo, 5) -var file_types_types_proto_goTypes = []interface{}{ - (*H128)(nil), // 0: types.H128 - (*H160)(nil), // 1: types.H160 - (*H256)(nil), // 2: types.H256 - (*H512)(nil), // 3: types.H512 - (*VersionReply)(nil), // 4: types.VersionReply - (*descriptorpb.FileOptions)(nil), // 5: google.protobuf.FileOptions -} -var file_types_types_proto_depIdxs = []int32{ - 0, // 0: types.H160.hi:type_name -> types.H128 - 0, // 1: types.H256.hi:type_name -> types.H128 - 0, // 2: types.H256.lo:type_name -> types.H128 - 2, // 3: types.H512.hi:type_name -> types.H256 - 2, // 4: types.H512.lo:type_name -> types.H256 - 5, // 5: types.service_major_version:extendee -> google.protobuf.FileOptions - 5, // 6: types.service_minor_version:extendee -> google.protobuf.FileOptions - 5, // 7: types.service_patch_version:extendee -> google.protobuf.FileOptions - 8, // [8:8] is the sub-list for method output_type - 8, // [8:8] is the sub-list for method input_type - 8, // [8:8] is the sub-list for extension type_name - 5, // [5:8] is the sub-list for extension extendee - 0, // [0:5] is the sub-list for field type_name -} - -func init() { file_types_types_proto_init() } -func file_types_types_proto_init() { - if File_types_types_proto != nil { - return - } - if !protoimpl.UnsafeEnabled { - file_types_types_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*H128); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_types_types_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*H160); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_types_types_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*H256); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_types_types_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*H512); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_types_types_proto_msgTypes[4].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*VersionReply); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - } - type x struct{} - out := protoimpl.TypeBuilder{ - File: protoimpl.DescBuilder{ - GoPackagePath: reflect.TypeOf(x{}).PkgPath(), - RawDescriptor: file_types_types_proto_rawDesc, - NumEnums: 0, - NumMessages: 5, - NumExtensions: 3, - NumServices: 0, - }, - GoTypes: file_types_types_proto_goTypes, - DependencyIndexes: file_types_types_proto_depIdxs, - MessageInfos: file_types_types_proto_msgTypes, - ExtensionInfos: file_types_types_proto_extTypes, - }.Build() - File_types_types_proto = out.File - file_types_types_proto_rawDesc = nil - file_types_types_proto_goTypes = nil - file_types_types_proto_depIdxs = nil -} diff --git a/gointerfaces/version.go b/gointerfaces/version.go deleted file mode 100644 index e10b5ebf83..0000000000 --- a/gointerfaces/version.go +++ /dev/null @@ -1,30 +0,0 @@ -package gointerfaces - -import ( - "fmt" - - "github.com/ledgerwatch/erigon/gointerfaces/types" -) - -type Version struct { - Major, Minor, Patch uint32 // interface Version of the client - to perform compatibility check when opening -} - -func VersionFromProto(r *types.VersionReply) Version { - return Version{Major: r.Major, Minor: r.Minor, Patch: r.Patch} -} - -// EnsureVersion - Default policy: allow only patch difference -func EnsureVersion(local Version, remote *types.VersionReply) bool { - if remote.Major != local.Major { - return false - } - if remote.Minor != local.Minor { - return false - } - return true -} - -func (v Version) String() string { - return fmt.Sprintf("%d.%d.%d", v.Major, v.Minor, v.Patch) -} diff --git a/interfaces/.github/workflows/rust.yml b/interfaces/.github/workflows/rust.yml deleted file mode 100644 index c80241c6bc..0000000000 --- a/interfaces/.github/workflows/rust.yml +++ /dev/null @@ -1,51 +0,0 @@ -on: [push, pull_request] - -name: Rust - -jobs: - ci: - runs-on: ${{ matrix.os }} - strategy: - matrix: - os: [ubuntu-latest, windows-latest, macOS-latest] - - steps: - - uses: actions/checkout@v2 - with: - submodules: recursive - - - uses: actions-rs/toolchain@v1 - with: - profile: minimal - toolchain: stable - override: true - components: rustfmt, clippy - - - uses: actions-rs/cargo@v1 - with: - command: fmt - args: --all -- --check --config merge_imports=true - - - uses: actions-rs/cargo@v1 - with: - command: install - args: cargo-hack - - - uses: actions-rs/cargo@v1 - with: - command: hack - args: check --all --ignore-private --each-feature --no-dev-deps - - - uses: actions-rs/cargo@v1 - with: - command: check - args: --all --all-targets --all-features - - - uses: actions-rs/cargo@v1 - with: - command: test - - - uses: actions-rs/cargo@v1 - with: - command: clippy - args: -- -D warnings diff --git a/interfaces/.gitignore b/interfaces/.gitignore deleted file mode 100644 index 96ef6c0b94..0000000000 --- a/interfaces/.gitignore +++ /dev/null @@ -1,2 +0,0 @@ -/target -Cargo.lock diff --git a/interfaces/Cargo.toml b/interfaces/Cargo.toml deleted file mode 100644 index 9d9ea68485..0000000000 --- a/interfaces/Cargo.toml +++ /dev/null @@ -1,27 +0,0 @@ -[package] -name = "ethereum-interfaces" -version = "0.1.0" -authors = ["Artem Vorotnikov <artem@vorotnikov.me>"] -edition = "2018" -license = "Apache-2.0" - -[features] -consensus = [] -sentry = [] -remotekv = [] -snapshotsync = [] -txpool = [] -db = ["once_cell", "serde", "toml"] - -[dependencies] -arrayref = "0.3" -ethereum-types = { version = "0.11", default-features = false } -once_cell = { version = "1", optional = true } -prost = "0.7" -serde = { version = "1", features = ["derive"], optional = true } -toml = { version = "0.5", optional = true } -tonic = "0.4" - -[build-dependencies] -prost-build = "0.7" -tonic-build = "0.4" diff --git a/interfaces/LICENSE b/interfaces/LICENSE deleted file mode 100644 index 261eeb9e9f..0000000000 --- a/interfaces/LICENSE +++ /dev/null @@ -1,201 +0,0 @@ - Apache License - Version 2.0, January 2004 - http://www.apache.org/licenses/ - - TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION - - 1. Definitions. - - "License" shall mean the terms and conditions for use, reproduction, - and distribution as defined by Sections 1 through 9 of this document. - - "Licensor" shall mean the copyright owner or entity authorized by - the copyright owner that is granting the License. - - "Legal Entity" shall mean the union of the acting entity and all - other entities that control, are controlled by, or are under common - control with that entity. For the purposes of this definition, - "control" means (i) the power, direct or indirect, to cause the - direction or management of such entity, whether by contract or - otherwise, or (ii) ownership of fifty percent (50%) or more of the - outstanding shares, or (iii) beneficial ownership of such entity. - - "You" (or "Your") shall mean an individual or Legal Entity - exercising permissions granted by this License. - - "Source" form shall mean the preferred form for making modifications, - including but not limited to software source code, documentation - source, and configuration files. - - "Object" form shall mean any form resulting from mechanical - transformation or translation of a Source form, including but - not limited to compiled object code, generated documentation, - and conversions to other media types. - - "Work" shall mean the work of authorship, whether in Source or - Object form, made available under the License, as indicated by a - copyright notice that is included in or attached to the work - (an example is provided in the Appendix below). - - "Derivative Works" shall mean any work, whether in Source or Object - form, that is based on (or derived from) the Work and for which the - editorial revisions, annotations, elaborations, or other modifications - represent, as a whole, an original work of authorship. For the purposes - of this License, Derivative Works shall not include works that remain - separable from, or merely link (or bind by name) to the interfaces of, - the Work and Derivative Works thereof. - - "Contribution" shall mean any work of authorship, including - the original version of the Work and any modifications or additions - to that Work or Derivative Works thereof, that is intentionally - submitted to Licensor for inclusion in the Work by the copyright owner - or by an individual or Legal Entity authorized to submit on behalf of - the copyright owner. For the purposes of this definition, "submitted" - means any form of electronic, verbal, or written communication sent - to the Licensor or its representatives, including but not limited to - communication on electronic mailing lists, source code control systems, - and issue tracking systems that are managed by, or on behalf of, the - Licensor for the purpose of discussing and improving the Work, but - excluding communication that is conspicuously marked or otherwise - designated in writing by the copyright owner as "Not a Contribution." - - "Contributor" shall mean Licensor and any individual or Legal Entity - on behalf of whom a Contribution has been received by Licensor and - subsequently incorporated within the Work. - - 2. Grant of Copyright License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - copyright license to reproduce, prepare Derivative Works of, - publicly display, publicly perform, sublicense, and distribute the - Work and such Derivative Works in Source or Object form. - - 3. Grant of Patent License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - (except as stated in this section) patent license to make, have made, - use, offer to sell, sell, import, and otherwise transfer the Work, - where such license applies only to those patent claims licensable - by such Contributor that are necessarily infringed by their - Contribution(s) alone or by combination of their Contribution(s) - with the Work to which such Contribution(s) was submitted. If You - institute patent litigation against any entity (including a - cross-claim or counterclaim in a lawsuit) alleging that the Work - or a Contribution incorporated within the Work constitutes direct - or contributory patent infringement, then any patent licenses - granted to You under this License for that Work shall terminate - as of the date such litigation is filed. - - 4. Redistribution. You may reproduce and distribute copies of the - Work or Derivative Works thereof in any medium, with or without - modifications, and in Source or Object form, provided that You - meet the following conditions: - - (a) You must give any other recipients of the Work or - Derivative Works a copy of this License; and - - (b) You must cause any modified files to carry prominent notices - stating that You changed the files; and - - (c) You must retain, in the Source form of any Derivative Works - that You distribute, all copyright, patent, trademark, and - attribution notices from the Source form of the Work, - excluding those notices that do not pertain to any part of - the Derivative Works; and - - (d) If the Work includes a "NOTICE" text file as part of its - distribution, then any Derivative Works that You distribute must - include a readable copy of the attribution notices contained - within such NOTICE file, excluding those notices that do not - pertain to any part of the Derivative Works, in at least one - of the following places: within a NOTICE text file distributed - as part of the Derivative Works; within the Source form or - documentation, if provided along with the Derivative Works; or, - within a display generated by the Derivative Works, if and - wherever such third-party notices normally appear. The contents - of the NOTICE file are for informational purposes only and - do not modify the License. You may add Your own attribution - notices within Derivative Works that You distribute, alongside - or as an addendum to the NOTICE text from the Work, provided - that such additional attribution notices cannot be construed - as modifying the License. - - You may add Your own copyright statement to Your modifications and - may provide additional or different license terms and conditions - for use, reproduction, or distribution of Your modifications, or - for any such Derivative Works as a whole, provided Your use, - reproduction, and distribution of the Work otherwise complies with - the conditions stated in this License. - - 5. Submission of Contributions. Unless You explicitly state otherwise, - any Contribution intentionally submitted for inclusion in the Work - by You to the Licensor shall be under the terms and conditions of - this License, without any additional terms or conditions. - Notwithstanding the above, nothing herein shall supersede or modify - the terms of any separate license agreement you may have executed - with Licensor regarding such Contributions. - - 6. Trademarks. This License does not grant permission to use the trade - names, trademarks, service marks, or product names of the Licensor, - except as required for reasonable and customary use in describing the - origin of the Work and reproducing the content of the NOTICE file. - - 7. Disclaimer of Warranty. Unless required by applicable law or - agreed to in writing, Licensor provides the Work (and each - Contributor provides its Contributions) on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or - implied, including, without limitation, any warranties or conditions - of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A - PARTICULAR PURPOSE. You are solely responsible for determining the - appropriateness of using or redistributing the Work and assume any - risks associated with Your exercise of permissions under this License. - - 8. Limitation of Liability. In no event and under no legal theory, - whether in tort (including negligence), contract, or otherwise, - unless required by applicable law (such as deliberate and grossly - negligent acts) or agreed to in writing, shall any Contributor be - liable to You for damages, including any direct, indirect, special, - incidental, or consequential damages of any character arising as a - result of this License or out of the use or inability to use the - Work (including but not limited to damages for loss of goodwill, - work stoppage, computer failure or malfunction, or any and all - other commercial damages or losses), even if such Contributor - has been advised of the possibility of such damages. - - 9. Accepting Warranty or Additional Liability. While redistributing - the Work or Derivative Works thereof, You may choose to offer, - and charge a fee for, acceptance of support, warranty, indemnity, - or other liability obligations and/or rights consistent with this - License. However, in accepting such obligations, You may act only - on Your own behalf and on Your sole responsibility, not on behalf - of any other Contributor, and only if You agree to indemnify, - defend, and hold each Contributor harmless for any liability - incurred by, or claims asserted against, such Contributor by reason - of your accepting any such warranty or additional liability. - - END OF TERMS AND CONDITIONS - - APPENDIX: How to apply the Apache License to your work. - - To apply the Apache License to your work, attach the following - boilerplate notice, with the fields enclosed by brackets "[]" - replaced with your own identifying information. (Don't include - the brackets!) The text should be enclosed in the appropriate - comment syntax for the file format. We also recommend that a - file or class name and description of purpose be included on the - same "printed page" as the copyright notice for easier - identification within third-party archives. - - Copyright [yyyy] [name of copyright owner] - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. diff --git a/interfaces/README.md b/interfaces/README.md deleted file mode 100644 index 85ed4809c4..0000000000 --- a/interfaces/README.md +++ /dev/null @@ -1,34 +0,0 @@ -# Interfaces -Interfaces for turbo-geth components. Currently it is a collection of `.proto` files describing gRPC interfaces between components, but later documentation about each interface, its components, as well as required version of gRPC will be added - -<img src="turbo-geth-architecture.png"> - -See more info on the component and descriptions in [Components](./_docs/README.md) - - -# What's in this repo -- Protobuf definitions -- Wrappers: - - Rust crate with autogenerated client and server based on [Tonic](https://github.com/hyperium/tonic) - -NOTE: You are free to ignore provided wrappers and use the .proto files directly - -# Suggested integration into other repositories -``` -git subtree add --prefix interfaces --squash https://github.com/ledgerwatch/interfaces master -``` - -When you need to update the subtree to a specific commit or tag, you can use these commands: - -``` -git rm -rf interfaces -git commit -m"Remove interfaces for replacement" -git subtree add --prefix interfaces --squash https://github.com/ledgerwatch/interfaces <tag_or_commit> -``` - -Unfortunately `git subtree pull` does not work if we use Squash-Merge for pull requests in this repository -and also automatically delete merged branches. - -# Style guide - -[https://developers.google.com/protocol-buffers/docs/style](https://developers.google.com/protocol-buffers/docs/style) diff --git a/interfaces/_docs/README.md b/interfaces/_docs/README.md deleted file mode 100644 index 62eba7ecd3..0000000000 --- a/interfaces/_docs/README.md +++ /dev/null @@ -1,138 +0,0 @@ -# Erigon Architecture - -The architectural diagram - - - -# Loosely Coupled Architecture - -The node consists of loosely coupled components with well defined "edges" -- protocols that are used between these components. - -Its a reminiscence of [microservices architecture](https://en.wikipedia.org/wiki/Microservices), where each component has clearly defined reponsibilities and interface. Implementation might vary. In case of Erigon, we use gRPC/protobuf definitions, that allows the components to be written in different languages. - -In our experience, each p2p blockchain node has more or less these components, even when those aren't explicitly set up. In that case we have a highly coupled system of the same components but with more resistance to changes. -## Advantages of loosely coupled architecture - -* Less dependencies between components -- less side-effects of chaging one component is on another. - -* Team scalability -- with well specified components, its easy to make sub-teams that work on each component with less coordination overhead. Most cross-team communication is around the interface definition and interpretation. - -* Learning curve reduction -- it is not that easy to find a full-fledged blockchain node developer, but narrowing down the area of responsiblities, makes it easier to both find candidates and coach/mentor the right skillset for them. - -* Innovation and improvements of each layer independently -- for specialized teams for each sub-component, its easier to find some more improvements or optimizations or innovative approaches than in a team that has to keep everything about the node in the head. - -## Designing for upgradeabilty - -One important part of the design of a node is to make sure that we leave ourselves a room to upgrade it in a simple way. - -That means a couple of things: -- protocols for each components should be versioned, to make sure that we can't run inconsistent versions together. [semver](https://semver.org) is a better approach there because it allows to parse even future versions and figure out how compatible they are based on a simple convention; - -- trying to keep compatiblity as much as possible, unless there is a very good reason to break it, we will try to keep it. In practice that means: - - adding new APIs is safe; - - adding new parameters is safe, taking into account that we can always support them missing and revert to the old behaviour; - - renaming parameters and methods considered harmful; - - removing paramters and methods considered harmful; - - radically changing the behaviour of the method w/o any changes to the protocol considered harmful; - -Tools for automatic checks about compabilitity are available for Protobuf: https://github.com/bufbuild/buf -## Implementation variants - -### Microservices - -Erigon uses gRPC-powered variant; each component implements gRPC interface, defined in the protobuf files. No language dependency across components. - -**Advantages** -- it is possible to run a single node spread on multiple machines (and specialize each machine to its job, like GPU/CPU for hash/proof calculations, memory-heavy TX pool, etc) -- it is possible to plug & play multiple variants of each component -- it is possible to write each component in its own language and use the power of each language to the most (perf-critical in Rust or C++, Go for networking, some parts in Python and JS for fast prototyping, etc) -- it is possible to replace components as better version in another language is written - -**Challenges** -- deployment process for average users could be clumsy -- managing multiple sub-projects -- testing interfaces, extensive integration testing is needed - -### Single binary - -That's when each module is in the same language and compiles to the same binary either as a static library or a dynamic library or just a subfolder in the code. - -**Advantages** -- simpler deployment process -- simpler component compatibility - -**Challenges** -- have to settle on a single language/framework for the whole project -- less flexibility with upgrades - -# Components -## 1. API Service (RPCDaemon, SilkRPC, etc) - -Each node exposes an API to plug it into other components. For Ethereum nodes, the example is JSON-RPC APIs or GraphQL APIs. It is an interface between DApps and the nodes. - -The API Service's responsibilities are to expose these APIs. - -The API design is not limited to JSON-RPC/http with `eth_call`s, it could be something completely else: gRPC, GraphQL or even some REST to power some webUIs. - -The API Service connects to the [Core]. - -In Erigon, there are with two interfaces: -- [ETH Backend, proto](../remote/ethbackend.proto) -- blockchain events and core technical information (versions, etc) -- [KV, proto](../remote/kv.proto) -- database access - -## 2. Sentry - -Sentry is the component, connecting the node to the p2p network of the blockchain. In case of Erigon and Ethereum, it implements [`eth/65`, `eth/66`, etc](https://github.com/ethereum/devp2p/blob/master/caps/eth.md#change-log) protocols via [devp2p](https://github.com/ethereum/devp2p). - -Sentry accepts connections from [Core] and [Transaction Pool] components. - -Erigon has the following interface for sentry: -- [P2Psentry, proto](../p2psentry/sentry.proto) -- sending/receiving messages, and peer penalization mechanism. - -Both the [transaction pool] and the [core] use the same interface. - -## 3. Transaction Pool - -Transaction pool contains valid transactions that are gossiped around the network but aren't mined yet. Transaction pool validates transactions that it gets from [Sentry] and, in case, the transaction is valid, adds it to its on in-memory storage. Please note that at the time of writing, Transaction Pool component -has not been split yet, but this should happen relatively soon. - -Miners use this component to get candidate transactions for the block. - -Separating tx pool in a separate components, makes forks like [mev-geth](https://github.com/flashbots/mev-geth) unnecessary, because it could be just a separate tx pool implementation. - -Transaction Pool connects to both Sentry and Core. Sentry provides new transactions to the tx pool, and Core either sends events to remove txs when a block with them is discovered, either from peers or through mining. Also, Core can re-add txs into the transaction pool in cases of chain splits. - -Erigon has the following interfaces for the transaction pool -- [txpool, proto](../txpool/txpool.proto) -- [txpool_control, proto](../txpool/txpool_control.proto) -- [mining, proto](../txpool/mining.proto) - -See more about the architecture: https://github.com/ledgerwatch/erigon/wiki/Transaction-Pool-Design - -## 4. Core - -Core is the passive part of the replicating state machine that is a blockchain. Core maintains its state and reacts to the protocol messages from the -outside, with the goal of synchronizing its state with other nodes in the network. This synchronization is achieved by applying or reverting state -transitions. - -Currently, Core is the largest and the most complex component, and it has its own internal structure. State transitions are split into stages, -and that gives rise to "[Staged Sync](./staged-sync.md)". In the staged sync, we consider two forward state transitions and reverts of previous state transitions -(also called "Unwind"). Forward state transitions are split into the invocation of functions in certain order. At the time of writing, there are -18 such functions, representing "stages". Reverts of previous state transitions are performed by invocation of another array of functions, also -in the specific order. See [Staged Sync Architecture](./staged-sync.md) for more information on Staged Sync. - -Core connects to [Sentry] and [Consensus Engine], and accepts connections from [Transaction Pool] and [API Service]. - -## 5. Consensus Engine - -Consensus Engine is the component that abstracts away consensus mechanism like EtHash Proof Of Work, ProgPOW Proof of Work, Clique Proof Of Authority, -and in the future also AuRa Proof Of Authority and Proof Of Stake mechanism. Note that at the time of writing, Consensus Engine split has not been -done yet, but some [work has been done on the interface](https://github.com/ledgerwatch/erigon/wiki/Consensus-Engine-separation). - -Erigon has the following interface for the consensus engine: -- [consensus_engine, proto](../consensus_engine/consensus.proto) - -## 6. Downloader - -Downloader component abstracts away the functionality of deliverying some parts of the database using "out of band" protocols like BitTorrent, -IPFS, Swarm and others. diff --git a/interfaces/_docs/staged-sync.drawio b/interfaces/_docs/staged-sync.drawio deleted file mode 100644 index d2a1824a5b..0000000000 --- a/interfaces/_docs/staged-sync.drawio +++ /dev/null @@ -1 +0,0 @@ -<mxfile host="app.diagrams.net" modified="2021-06-04T11:19:34.633Z" agent="5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/14.1.1 Safari/605.1.15" etag="UO0vv4cJJQCqTN6NXTbU" version="14.7.1" type="device"><diagram id="daJsa_N0rhhc4I9J-wDo" name="Page-1">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</diagram></mxfile> \ No newline at end of file diff --git a/interfaces/_docs/staged-sync.md b/interfaces/_docs/staged-sync.md deleted file mode 100644 index a1967afdf9..0000000000 --- a/interfaces/_docs/staged-sync.md +++ /dev/null @@ -1,103 +0,0 @@ -Staged Sync (Erigon) ---- - -Staged Sync is a version of [Go-Ethereum](https://github.com/ethereum/go-ethereum)'s [[Full Sync]] that was rearchitected for better performance. - -## How The Sync Works - -Staged sync consists of independent stages, that are launched in special order one after another. This architecture allows for batch processing of data. - -After the last stage is finished, the process starts from the beginning, by looking for the new headers to download. - -If the app is restarted in between stages, it restarts from the first stage. - - - -### Stage - -A Stage consists of: -* stage ID; -* progress function; -* unwind function; -* prune function; - -Only ID and progress functions are required. - -Both progress and unwind functions can have side-effects. In practice, usually only progress do (downloader interaction). - -Each function (progress, unwind, prune) have **input** DB buckets and **output** DB buckets. That allows to build a dependency graph and run them in order. - - - -That is important because unwinds not always follow the reverse order of progress. A good example of that is tx pool update, that is always the final stage. - -Each stage saves its own progress. In Ethereum, at least a couple of stages' progress is "special", so we accord to that. Say, progress of the _execution stage_ is basis of many index-building stages. - -### Batch Processing - - - -Each stage can work on a range of blocks. That is a huge performance improvement over sequential processing. - -In Erigon genesis sync: -- first stage downloads all headers -- then we download all bodies -- then we execute all blocks -- then we add a Merkle commitment (either from scratch or incremental) -- then we build all indices -- then we update the tx pool - -That allows to group similar operations together and optimize each stage for throughput. Also, some stages, like the commitment stage, require way less hashes computation on genesis sync. - -That also allows DB inserts optimisations, see next part. - -### ETL and optimal DB inserts - - - -B-tree based DBs (lmdb, mdbx, etc) usually store data using pages. During random inserts, those pages get fragmented (remember Windows 98?) and often data needs to be moved between them to free up space in a certain page. - -That all is called **write amplification**. The more random stuff you insert into a DB, the more expensive it is to insert it. - -Luckily, if we insert keys in a sorted order, this effect is not there, we fill pages one by one. - -That is where our ETL framework comes to the rescue. When batch processing data, instead of wrting it directly to a database, we first extract it to a temp folder (could be in ram if fits). When extraction happens, we generate the keys for insertion. Then, we load data from these data files in a sorted manner using a heap. That way, the keys are always inserted sorted. - -This approach also allows us to avoid overwrites in certain scenarios, because we can specify the right strategy on loading data: do we want to keep only the latest data, convert it into a list or anything else. - -### RPC calls and indices - - - -Some stages are building indices that serve the RPC API calls later on. That is why often we can introduce a new sync stage together with an API call that uses it. API module can always request state of any stage it needs to plan the execution accordingly. - -### Commitment As A Stage - - - -One more benefit of this approach, that the Merkle commitment (hex tries) in Erigon is its own stage with it own couple of buckets. Other stages are independent enough to either not be changed at all when/if the commitment mechanism changes or be changes minimaly. - -### What About Parallel Execution? - -Some parallel execution could be possible, in case stages aren't dependent on each other in any way. -However, in practice, most stages are bound by their I/O performance, so making those parallel won't bring any performance benefits. - -There could be benefits in having parallelism **inside** stages. For Erigon, there is **senders recovery** stage that is very CPU intensive and could benefit from multicore execution. So it launches as many worker threads as there are CPU cores. - -### Adding/Removing stages - -Adding stages is usually a simple task. On the first launch the stage will launch like it was launched from genesis even though the node might be in a synced state. - -Removing or altering a sync stage could be more tricky because then the dependent stages should be considered. - -### Offline Capabilities - -Not every stage needs network to work. Therefore, it could be possible to run some stages, especially during genesis sync, no matter if the node has a connection or not. An example of that is indices building. - -### Risks & Tradeoffs - -* Malicious unwinds on genesis sync. Since we are checking commitments once per batch, that could be used to slow down the genesis sync significantly, if we sync/execute everything but get a wrong root hash in the end. After genesis sync is done, this is not an issue because even though we do batch processing, but in practice at the tip this architecture becomes block-by-block processor and is not worse than anything else. - -* Batch processing doesn't allow most of the API calls on partial data during genesis sync. Basically, regular geth at 1/2 of the sync will respond to the RPC requests but Erigon requires the commitment stage to complete to allow these requests. - -Those tradeoffs are related to genesis sync, so in Erigon we are focusing on reducing the need for genesis sync (such as off-chain snapshot distribution) to minimize those issues. diff --git a/interfaces/_docs/stages-batch-process.png b/interfaces/_docs/stages-batch-process.png deleted file mode 100644 index 7501442c0886c19c905e2c9d8b1ab5aa7dae7b13..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 83515 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¬xV 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 V`%S{feW&0*3DNr^dBS?W{|6PNNL>H` diff --git a/interfaces/_docs/stages-commitment.png b/interfaces/_docs/stages-commitment.png deleted file mode 100644 index d84708816ae3598a64cee0a0a5b680737eba2bbd..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 61030 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 diff --git a/interfaces/_docs/stages-etl.png b/interfaces/_docs/stages-etl.png deleted file mode 100644 index 13d5e9dd3a807aac72784847cfbafa5bd7a73057..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 49802 zcmeFZby$;a_%{xSC@PA9J~T*}ATeSfT_Z+}7(<#7gVAijXbTe%q)VldP*NHbX~_vl zDAFZJ=X(tW^?Cfh$MOD-<M-e955~QF*RJcl&itI$dEUFNsjftGfZ+fc85xZ-Oddf- zwpWRajN;;cDsZPo^`9y5kK7fZBukdl#54xp$Xn_wTfyOE=fU-UGV(wS86{~5_+tQn zWMq3Dk(2EK|H(=B9#QOkx>xDZo}Fuoi==^Jg6Jz?id8oSeK&g#D-70>j7w1N#}$_V zpN*rd8<(Iwmw<qolM^o*V`lAQX79@DVCe>KfzRz7(HJX?CHlu00X_kK9zJ0nK8OxK zKbN2kKOcC3@bQWWiyHhGZ)R=j@N+^TUOq6vS-6=6#=*_e)rLz@7Q9z>aI?gM|KK)w z)zAhn`rwbB&xBvdMC2T}lyP#xS|TmYRWX1DMPWW6UVdJFA@IRjRhSN3jY~idTw^hI zmf)X~rG=d%=}UT+F0L3y2k-@c2x&aHrEO+q=7RZS3et}7KSyqF8VnX84JLhH>1JmA zW1A3tn1vvZsGB;52c{q@FQ6~y3Kk=car1Pt{4oY?iN{!M-xX8<4E@PDFa-0HR~8xu z{6bJGc_hqAgkMol*i*+=kTi*)f{31zIoP}`++I-=!f%E3)U;D2m^%u<9Yl2D!U9OF zfD;a@Bg=<Z=CekrDT0wOl!&t^URy~Pt)+y=BV2@B4KNl2R~>5$IE-M0hRDgQ>#Nv1 zL;3NFsv<g?d>FVW93ud66I8ZGK}odBs+p_dMYXUF{8$+SA*`MO3QIt$I61ouY6|E> zm6e?I%~c%T5PbS7b~Z|KNEb9-38SGUgu&XX$ztrV0wM<HS`P9eNGRGJqoX5l;jZmr zj^}g1@MF!8mVz=+98Oh`Ur9hmLr-4^BBQTotLx&dM!@PRJL-Da>zKpk9R!sH&|qem z9-n}tpccQaj1xr8Nx)W+k6%_u34w)a=-6YeJq489@dl0-7(CX(z(7$8>!ghJ)K&uY zy9o0OVwDJ<O3HQ`YKp?nRtSg+QXg&$ft%qmYD!QQ86ljKhLSy2Rlwav0V!gu#>eM? z7e(r$_|ZrM7rX%+iba`;s%n^NieLrIZ1{8?b%g~Cu-fK&YH&vn2U%HlGlHwIin5lo zHb&i54dH6%V&;Z`=%Qqha%O-4Ck0srcQ<(%H&0~)B|aQNnNL?q7@^=~DT}j}wbqld zl!IVg6=X$GXki6qEg>_gn>h}q>!hh>4b)3fT?weBtd@rgRs{=J7qS+#w$*^}Yiq-l zlyESZoeo?N3=)9AU36T9(0Gik0s;(o5GIJi)Z7IL3TSt{s)LX@M$S^%)!D{PpWvp3 zMC%GF+hR0T?43kZoiyz=JOtF$&0UZv8(C)oGYfMqQ4eRN7GRyCkf@silHdp?1jZ(d zLOE)Q;4Kw29Bj08P|7kk_AVAKcB*RTz$j(SE%7L{2f@jXU@iy4*xFi(V9;jj9+t`i z$|CM^a4npuwV(_FDvY<*fbt2eDXZ&hBP>Pu94%~-cHrw~9*T-GGU}pMmda391wAXM zrW0I4S;5u~iZl?G7vOV730vzbp#`nwF;ID7oQ9^Lxq`Eml?opOEsAhO8VK5`SZJZF z^n?gD<|sRYh^&T#C_zI-fghu<r)uR4g<7eARYcr01aZzNK?5D|M#%tSrS8P9Er+*I zw;|}OSYT0nmUxJ(yaK->&Oi`Lz=_)Fi&~h;DvRjx>B;chV4V;)qV^UlwyM?$q`9n~ z1zgWbMNnN)$kk3uUq{PQO%N`MAfWUSGU_NxcXLNKjDfr?Ov%k&N#EIAR$Uv8<(D@z z7Zib*Ib!Ufib`h67&8M$1z~=Ew6m2pieO1VIG{-q7k~(%EYSM$THuYoo~tt)=Y;TZ z=Es@25p<y%7H(QLx<bGPTx{W%Ixq}BOwLVIURzs12(74~0L6M}JF7tiRc+wb_E@~W zwYs~NhaJSlK;J?}mQUDG(E*|kv9xw@go>cdu+~spQ8_mSA%vyAvz`{x!VMuSZ^frC zqGhjPr>&u2hSiZHXyRqe%;os4p=yq<?)n5XxQe@qft{0xyoQ5|0`P3IdanA)iZCn= z2Xj(Uv2(*9;MxdVa}tMz1hMi88X5vxP?$T^K+DWV6^RtE!N}XofKRR9?kZY*vQP^V z@WxsJYQ_ga09}^#1lyJswN>#{<JWXk6Cx1wftwVN6|mQ^79qGRp_Sk|{4iG;9W(?X zuWcvd3ei*MLud+G>XGzR#7x!<4%LSuY!E^aZK$K7nhXToRznG4Wzg#2%3Q`(&H`@F zZ!V;Vu~gNEYaq?l9NpZsEL4;Uf=;&lFj-e84}vycRTHCQt?aI+Yr`+13FKhq<SwYF z0WR>W3TU{j2Fk-(-Ax4H1~t>tvUl->>DxQ-skw-#+bb!Wo6AD&G@)inaC28pb9ota zS>U@wQNp5dB`aBi3rZhtNALio2m&osw6@Vu#ArY?1e^smWYLxycp*`6S5OU003#e+ zJw?q#;Fg}w&M2_9tS~|pI21*DJt2L4PgN*ROJB%d1EHW{r^n}FCU5C(<sfWMfVsoK zP-QrY9r|cdGf_1ccU!cqCczpBwX%njxUElcveL8!;X%<AD{7?<g*uYn$PxsE@QOGm zIZ<_4n7W>hfryH$pbeVO%F!GLhN|gV0LD8DgG*U{dksw)v=iQuGzVPOfKQhnt1g2= z*a%tZSZG_|<sCI;5$f(xE2uCWqpZO1rtHFRDWvA&Der8Fv9Yp7I9iD4BZY)K;o9y5 zPqY=(z=fm|=DKE3P11!MTt<%M`~;AAH(|UYUQiL^ECA7lh$zdtqA?C?*48Ln0c*IN zsJ0f?!WL}~gWI~R0?eQ&pl0I;b;pA#_=U|4NFiL8z-K0}5B!%R0fpxiHgMGg?n+V5 z*#*Q=MG~(;2nMe^QFuEfgZDpSj-Y~r7~Y?ZOqxttUPi}*e6p814nD+MGn>f&u5zaS z&^s}_#Rar#`a>T1lsS!vs_S=Dlpo7KhTV9$8Y!%G?x8IE^-zhm%9%s&7Nx3`mW1o$ zeWn{KM!XZYCh#*7OK~HYo7YOV+NQ*tp=Vy>p6=gEPDv|G_VWdyYufgyDZ_v@oIQjy z;1GQ>y7zG?k4Xxr{kyvTZ2n{v`$gewA27_RRX^Ts-%1Xb)_*O7DZH?FO&SsaS5>TU z3QtOL>y@EQZb5ro17BkEmv#&AA9eH$+<vqBV!AKjYKlRWKjh0BMRB)4$?fUb2I$CN zY2`jcoFjd4cWg){1<G~bL2}G$5V@BUiQsQOU|c^dhrzAgL8RfFs{Z~E6c&4(ba#La zjM+ycY^1QWMbc(RsA)sQ92>^?w@Lf5cfZnc$G0)RujcP>a)35ub?8}(4T(Jg5Lz}S z_#QMq;E$z}i^<3_gkZ9@AM_}IwM>}ky0=%}rQAct-@pA}y3XxwdWaO)lYAw-AuPYM zofZ}YCTcC$XC&RN?gL{MSxg9ja_h}8Hn#f;uPC;~6?lL)NX%_uO!#*miCzIKbq#9F z93=_VVLxrq9DG-_+d^hKFD*U(At0@1d#?_FUXi_*eu@7-ys54Nq-+^{JMag!PRV5C z861J}>Kvp^>Qe-$Yk!0k=eL!r`S~cb$x)p{xu>J+k+qQq3RixcJS3eQGgf+Sxv|cj zVtb!QDS{3v;dEXz9Cmp#(5l>j{9^&SVA2q3u>5??%R=t%ukT*>e|U+Uv{nB>O3~~- zXF2u2wkwZJGfr}|-4}h%UlIFib9>J}zHy6-7Dsii3S}|-Y+LHpR$v#xjGCo`YZU7r z=QsGD+}M$|f7{;W#_@SavJH|5<2a;6$K#%-rb%*E2g6wz4#iyEmG^*_e}5JWN`G6~ zOa%e!VrkCy&a#sGVpp5>TM#=|RGmSwZiO3v-{wdXB^0dOL~lnJzeZa5rOadHot4Qb zS}2zr8SY;b*}fxuoQ<il%fFR*>-a!T>ehXF9>pDvjpMF%)JwZBx<S(6UnE{6k;uXn zb90wOQ!ruODe`UJ27!g~OuDOIBS{O_n<cgEEbN~IhK;9xPR$2*{5dH1D>3soxV4&4 z0<K@;P!Qi`<j8?<u^lBA8qK6T;y~fLopr{-Ob&jtXv+-@ezz@rl7R-%4v0MExEZZ} zdixC<6YdRPo3bBiA657NncB6yxHDiMBln>aq@7Kkl@_(F(Mr)Mq6Oo4Zaz@owe_Nt zV7~0Y$R_qb=A$Fc7sNF6i!U6c`R)lxkXD#HOKVf3-g1U=l9P6!#tP^e=aoto{5Xq` z%nl!EzlBy;N}VBOST%QyH^lZ{FbRF8mq;)UNcq8<<ws<n(~lfJ0GDM;1?H%Bv~PEd z``?_Q?R3)gX7!rN2M*3F+u{5VGO8IV;`C-{bjRhZ4^n9DX}xuvvEtdjO!?h4ckM5Z z3+PtXY-+JDFR;OpJ+SY)jNVn9G$0HgTTz=s6x0W4L%6YT7<PoVD`S6Yb1>+5(i^e; z%Td4#gK73R{@UTrYE>uLm=?B$ev39_j%Vlg&O(4X1h=$kjDS>;BAe0P{jj$1#Q0yE z{V56m#Dla!t1D!!-jw@cD~EUG^NXfhptSG=#w+Xt+7y(@l0r-nsy`eBY29^sf2Vd0 zsykMvLqY&oWo5mCer;ywO8yiZ)BWj};*{$Kz=i#xT|28uGXQE*`9;g*s(Zj<eJ4|W zf7{Lv!+&-cNYF?z)R&D`0R({qRG0q4W3m8Iz`sF%Gk%Iqk|1U{U~B&w1Xc*>>my&_ zAjK^oKlOW+)%7#;m)OdXm7HeTk_&SQ={x>=U3XwU+BKBN?qu!5+gq1mHis^mRGtn9 zpy!gid8kG2{=M>xGBVLmcm`>Hdg|p$vMOJ1zk4>1?^C{FIII%chcyroGg_=y|49a$ z&)&I6EVqd-#30A0jC)CPJ&UQggiY^Ssf3u0<l49rYV-TP);xQYmF0?~$4vM7IcKvz zrI0donl(=@U;2#o{8rf+%HdVSxxkjSC^0u2mG(90B+aLu_}~|8&^w<_dkOoVdC7I4 zEb`2dLaO(|*W7-|@Mi~7!t&@RNCph}Eq!3GXtv}Hf9!9P^3OeBScW&sF(C$mcx@$) zD;nIAjJ@#P8vZb*<NW(mtd-{rZLhyA@okveSlH-t9Z8u9OB#ApE11!}S5>TQq4%G( zua1e6%=zp;_;46V9JhSRfBKi&Ef@P!#cd=oa6HzXiBQ3b)jb;NS91&O#(TcHp0+`C z|3RbQOsJNHRLGS0l0uKMTp6+k9yuq}6I-L2lp1C4mID3m8*Y{DrCb?e)mm!d2X$Na zD6n6Edr#SUuO$h5?rlyUhsO^^rr3R5zTIZ^&i46ScCzpH>AAsIbkE1z_Bu}?dweI1 zD!7o(72kcCm^oQi99){4>b?l6zf$PcPynrzbm*;Ais|oFQbCqnAsq2g;8jp8ow&F1 zWkF=?4A=QS_LTGeTw$r+W|DdqL_4EzO<saS3H!cC#g2BJ>OW@R)8%^9Ipz&=<{6SZ z_W6OsWpX#mA+-|5{5|zvKXsXwooVRG4=HSm!k_hEx#bO~e($Zj_k1iL-DBy~;8x#M zJ9*JCI-Nyg!9yg!?|5+UC9XTCLUsMH54F>p6?^b?`|`hr6Z<1;2)GF3&4qB0{uP~f z8ZqpI^DA-{H*0&{A)y*l9;hH@Da%(KHjGyszu5JgOcWcKO*6XK4VEG*vC3oX9|ZI4 z*Ni>AJ_)*9$tQ3-^**=rD>y&coog&MkfXlmYaHEK-_6fwON!+Vj(xO$hV3ft!Ls5^ zuB}ShL`X<2AFYi&llG=V$ta`#wcOWxIC$r&z<CI6s>kmQc4CaRztQA$lJVpPp4k42 zTRvZOQ6+?H56>CNN-i&7SsGt8h<vM?z&cx0E^ePnUmpj}dy6@Stf=B$lk1CFFHwvB z7FP~Qjx1kUOv`gy>3)H)arwbNrc2dAO3YhyWWW4xb>d!!oGZExnc51r#4NOx&q*Fb z=}p68g&2|SSkq$gSz}gGv$K)c_o=1Ihto$s@dPhSVmpnBonyWE?E)@4%`m%se#Hg# z{(9YQqP5$wXMS`x?D=A}=2`;%^0PxerGeO<=SW|J0z?E)6nA%mu)A=?CF?Ep-m1GP zeu+8L1YBamV%hrALLR1Gy{iacM9q3dDECsLH@}8eGm7)tzEAt*jMl^mlZxVupLC1_ ztPh92SoJVT)627(vO*QF3uZ8#JYU?Ni?JFlWjsFkHeUlDxhCFk#v-*@ZV0(Jg}qTQ z*taTwnCY^u!<XcMu`3q)YCg`ryAuESsl9R0fKP^AieWjob4Qt3+u_@{UYtF8iZ=#t zBXQ&4@X`yZlRquqfB)yR{XdZ94@R!*OV0@OKi#^}dGYN+s5tU)iOY~}=AzYFkk8zR ziC=8j6NBdoS99`D9{k$OVWD`LxA{=)*`yl3vkZ{&wJ5H~iygVhUhI?4=_e)P`*3GG zdLwV<YN;Bo^_F;5eQk~u@6J-QANkC&l`uZjjci|?#~Jz<F4v#04Hqn<R>W1ba@|$_ zEW0wFQq%f1!eDynv(WjNt^%B$Zbaxyg~mzaDWpxtm*LW!X}YBHsM#U!iSB2_p@GL1 zRv2%v)hkK1dym)k^?LfFn<I3^3ajAn?lb&jd8zzoSPn=B;7Ciz<Ni+g0XQg;`Z7N{ z4&4}o!e^~1%Bq}rK!7_ogsNpbe0{DiPHdamH($Z;rTw}tEUhUjuqpX+scQh#-s`Jf z+t*t5!6D*`cG8sC<Hfy{XugS&+W5B1xhAtE4-cI)H+JmKyP)?^#@b>*KeYu_v?|3Y zPHe%=jfcS85jb5|U*75WVsXg$Tl3u)tLbK`ooSH_9~Q^Hw^*c^J52lL64g4sY2Qs~ z>Mz0_|6Z!SHvEJrRhTI#sN5)fWNUdYsby~Ch-!ln8aM1H%bhUZTR7r>&&ShWjbW`o zmx%BjFPTN8An3=46UIlp&_{p9Ag4yH$~`-Q6)<7>dG&*&Gb!pGT*vQ?)7;x!w!0hc z6J=mz+xje`AtwLBr+;9ttM(BNh1bqB3(QOiPg$v3I(DZQ6_hV<LtPiWvwFFUd>97C z8k#fOtX1Fn-^=qJB4FCbk1h$x8PVA>UY;seESy7R*~rj;e;4R7hDfHyy3a_A&dyQL z3tB-s;zga`U9Rb<`8H0MV)KAv*dUW3w9?GTPB+({0ZA`1Yf<9Ck8q<(Px#_@r7gB0 zlW<`Ds=|e=8kI3@<JWsnAJXu!b0o}IFe%;hZN45e8|{&ayyWTR7d+C)JD*3EB6}yg zp7u?lM#PU;GvG#U6(qL7D82P7@UI(4JEpc<SD$q~<wi3%jd6WiZqu7>XiZnDu0f=~ zn?uwRe_CJoBEhk|Y__kkvhVts`h@ztWo98iD>6ez@1_*7r(tx`MdJc>)sXKweYRk9 z-HEeeUV>K2YHMzc6~kj*jx>d@h$D?c(j<IPvDx<Wz&{fTPxG)g&)yXFn>Eiv+#j-v z%pP}bY&?}^7d_k<R*#(-53a0@6p0+gj0rK~!+RM=q8Q<x<4F!lxKX2Vlf-XQEj|;I zpVDy(_MdVj_HlVVxXCTe++G#y)%o;h76ZbnIibT)6*4ZIL(CCd$Rj6kqy#hv3FR9P z3eM^{7W29rhzzY7-a)=Fnh&KKs-ujxdsn*nTJWcm$e(&|YE&~qm{(ZzEyg%lQ``Ns zrW9M@1)quIeTJ#Ep)T7HOcVUz_rqbd>ag+nxhIITvWv;J;Z%zI)|IXykOL8|K@-^8 z>`tSv3sTJIBQDWpi^a!#uFgX<3`($ZYpN=1^NO+rmC`=_OxWiaj+`fmzPQEl#rU;* zH;k_dRX)kr#95_AEU%_dj1{UD&XAMOCVCgU_nRHRYD>mgs8hCLJl0WhZGNnUfBcJl zMNsn_?Fuokg&F%Yc>kSK7apejBzLN;Ppk1Lk8guy*aaZ^)Nsh!Z;-iKl|pPnV7zyD zVScXtBEx>Yv&dG9a6&#i_2TjaFEd1UT0XO#-qV3T;ha+dA~-&J7&TRBjO5GA9h^wY zIfXMalFB(|_{6CoIAW_(y)S+-yrdRUoa3&zcJaC6<>)s^$B2tE&P|%|NlDa^AMiMB z|C=pqjkL2LG=7Ht9{?Ss5QLHd1iQk}(py%=gU_@}FF1C@w&I^l{1C||cXfl7A0vPF z-CvH2jKY^g^QmIgC`aMl;&J#C9>Mx!a3wDoY{JUk{pTsdE{Zok3Q~jvPu(wch`Wo8 zNgC7yCC>5Mh_&YorVYY=W6y3Rg-MaWYMIXuc5kj&t-4sTul$R1{Il+*_n%lJJ=YuB zUL~H)et0z{)@$`_ZT);xq$7OOa6TxhkGE`*iMC?R>RL~!mlsmNtLbzGA~%e<G}!%e zN$O%aLU-DwVu=1fX#=e^8#4gvZR8UCWd+<PQ@bZMvnRR>?QVD3U!91Pa5r9+gc_*F zT@D*4J!fRrb*Jj<*9^fqqGMueK_+D}F*<Hs{%@Ob3i3~S-GXB*Qf|Cy)GK2WIo+&M zmG&;GMGD0C6*Y}9N#8F8pVq$RBeJ|NWb~Jpt-o-(QRDc&zh@Daq$k1YKKsr^DbP1> zJovs<1;C-T+3pJwhHn{^Q^c5u0A!3EI_QVu;^|q$5f{FH=}*DcY)&uboVrpx^I+J0 z=|QXRv~a%iC4d?w?<|)44&pI>{o07L^THSsLY?Tj(IQC{5o65nNs?<+Yt0nFMX>rB zJ9OT@SB_mZPR1TQXONR}h_DF{PV*@)S)$JOeTomRef+wn(U-e?E!xJY>Y@>cbD>$S zqn}Ew*S<Qz*W4;jADOKb({pm)YR7iwtX;Vo<e?PABF<&B^*s(X^F7!1;hjRUe`<Pq zmIQmo_Hopxg|T0PhZY$ngpg|lhd<`%e-O}oPbi}FQtwFeITM&oN7?<VrsVs%Hs78O z&b_LiiRmbq5)txx|H5rjSU-qKf?bSzwYS9@Ip(y*=IP#zWLX<DI5Yme<0%sEbr<=f z*Td$YEQM>`zeD#I*Iby1>3z31929#m<^J-?zm9(#_KS)!WozanV|$B`zE@Tv4PQ7Z zOUAAwd5eAD$C321w=4fBg3XWRKd9BMhlE;ZK6E@Ksx3!eu*OF()Y^seTscWU_k~l? z;yVe*ek$3&vi@4j#WC>Y6Y`#j?6RTuvHU#WHoUvUs_)=1Gf93%EG(z3o8rPq7`BIm zVHdOtMwHg>L)O;D2l-pS4KuV_51cJ=J4XmvUH|6(6~ta*Vo*3Yjh*t6<fZ5V`{mJ$ zx!P0T(W3(_0+z2_1*Vd6EhpauCw1gHCU|~f&!1d*84T;Y3?0f{xRTAbKvPoaY;?|~ zDEUnXRqu#M|JG>+LZ#p)s+Q>l=e0of7g~{l!r|vpYGOrpyl?NE2uWk{tHu%+q~wyH zcMQ)|dduY)R-9&L_2@3}X|9x;o3m?Ei|U!q;m-4FmZ4wjJcB6Kv-F&QyeMEhxo@sJ zmbF&3c_Fk_uYw`soo<uCV0)&K$<xiJa}CvjL)9;nTAxh$rPvPT&3*nFnH8O7o$c%^ zTX&PH{`PU}hOuRX$fD0r9epFZKbswkbZ+pmC9ATW;Po8rIK$<h!!+0KI@ow#TQZ6( zw|ukma_7_ha)GSe@|C7E0pHd`-%)BaZ@fh;rX!brgCn~>N`#Uk{?O4A4{Hzfys{jd zD+Fn+@Hy?$>yzS6A1OobW;+$U%@(OGV)jz7X5hWT2M1st-u<adzcOwkjBcJMV$-Lz zbVV=A;8N^XAD2{vuj*CR6A>WSwR{t`^p$Ao_db<J+_I;;D|J(^aUzx$k?V}A#NP5+ zdtp3!@vV@ZNPX#0qVmu)&5{&fxZs}FwpE5yp^B6uG>EGW4(-+7K0Fv~(d%eyUwClF z{jlf85P2&=X)UJi-AeuM!!}q#BqhXR78X{%qonEv$d4%YY^I9oHm*^L=ted~Uu&?V zIT|S0`?@?RmnK?ZZ(SN|`Dq3=lM<JX16C%G9uHgXMJy@>@m8}Ill^q9o&Ish(}+m- zeveM9;Nnn#RnbsW@4kk$^Wk+-A9VUb;!kw3uD_WICqT)W_f0i##LqlijF)4XT)EoC zJuG$lG;hqn+FbaBxkhUXF4YLO=*?QD;~^TpuD8(dLtY-RI~ZdZW^2=(v0-m@@|$+B zyI}L<lsl@~3})|$Va}$e?`+Br?cX2LoEjVovN7d%_sHj9{hx=w7x%9rN~N5NFL&nW zdsaCN3a^-VQqX_vXY3b=bT_YxZNb+u{t@GThLd9dB<rBet4)+fMdsObA)6RuJF?6) zt%-(~lZ_77lS&g3)LBEyf;>kj)#DdV6^>?nW^lpqWu~MH4bEm0_gyiYI9i){shC>P zXu@v4m#CsmMxtk_S4jdP*X#*Zl7ZW>1xOznCZe`JIOVE`?Q6hnFmMyjiyhaxM5kHe zaHfS(-2U0>6Y?)F<!X|Rr_N8qA){@k!u%<|730$#U+m;6%S+Tu+$`hIWr(=9e#wCI zUwac@wiFxv$ZF37tEH@JR3vXry8VYE?aFtlLS&)^lpAg78rB{?l0M!LBf`J=*y6=% zFuW7nVln;v1DVTA<?B#>4I{zDoLFIID8BW2QWe0K@vDB|iXp;QS<TN)B0fB;pPonT z9dGcI_+oT)Zq7{4-CVUG;gdO)wmk)$^SzJ@vq%2I$^d<epd(5`WJVx^zPOGHj}Gs8 zA@hQ|)a|5A{ySV2eFT)IdzCJ+K6=mHMvI{*M^ctJmgHZzYtJ`d`J9{}nWK<<C4>0t zB9i+}oMdjAUD=(^Z1${^71PO2C-c<z1*7UBs89ClX_OG3G!vMcq7+^mNZhY%=3s_1 z`fZrmHt062-R;CI`tioI$Ljf<Tk2~=BzWNCs0l*PI<#LKaoI8&)qf!z-v8cIQYD>+ zUQjU+I+oe29SaG$XK+3+oS!|#F1kp=8sC|v*K#qB8>e`|c}f-8YDXZPXApBl3AV)? zjjc6&twU^?&DF{-_nOq0TtWG+F4||H8xQ3iH&#};aU%SPwfC93ky#N<Q&*yFkGHWJ z@mrB$g^M;H)RY>&RFxx?EM?>eNo@>R5^MAZypr-ks3{fsy7wp0-E}vlqb~?~O<)pX z91j%0^5v`W*7stT6}NE)tHrK<{P`zv!ifnv*@9AO>WMt`dj#s{!Y8t0c_qx%D}v8w zq-meJU?BajeD-l1fWfa#;?GO*7-PoI=@mRe<q)^pwU<H8bG9+IGdyJAG<Q@x<7LdV zbmGcA)T^gRNWSJmY4mp1<JH<0KOzL_h&|uydu5NSMDz3G4u+TJy9-BUOq*+z42Zew zZwv*$OZ9d~J^JSTW^c(_km7JVfd+<?BD9^Q39>ke98D+o+(RAfxf#{-wj(utq8GQu zV<ntBVWq<AI~Olx{27!@N{v;FN17v*08HkzxGBXuQ!di>N%LtfPhr+XrbB*?YFSf* zEVIO>oU1Eu<h7=gKE7{ytgN2hOgA{zmbl!VLA)9-Wc|40XjGrmSOANh<=k4nxqaxz z8LKQB)Ncn^yGYfPl8H4a^OZe(BD(FF&_8Y3^$P|uIi{Mq3afor<gzF9n<C2D;VCJ& z{DkQv1^hj4)(=;#%bHBQliCWq%oX##d~f~Nx7J=Ux;G`-+CKS|OJ@uZJ1i2~lFB_@ zlnd*Ik{<|Z7b?VVsoeOssK<Cm=_x{knmA!tX=>E0?RfTKb9YrA-}z+uqxqM|>%?4j zuay!SSqeJstkmO)u~cL6V>rE(&ZMC+@*~kjCwN_BuZxsx5Vl5GGW07SUS4(b>dIdV zd6?0uIG=xY?_8aPz2p7TgWnA_?h_fA$Ktz%V7QK_tnY|7_32Ot4SU{oaQD6wQbp7Z zb#miUR(gFJddH<Uy>mw4j|~;F4HYJE9a9Fwgw6#+Txmo}!WMgIQztyXfhL>kUTB$v zBd0`Jv4}--4y*Tiwwm9P!cvw-JWr;`cfvrQxKYO&%%m}U(5W2Z3Cs$E?S%d)$Cp<M z^qYo``QdiVK4A}MteDEs+m+2--fzoez$V~O=ec(+X(zkmEI^g_7$|6jdS#G@_nB4N ze5ODoJ8g;<6DJf|BngHpRHyD2HAUx-SgtksJR#1tPuMH+tYuGxjxU@s5)r+#8a+|i z#MVAxXB$E<wBOBVn$X$S;`;Ty?JH!wa%S3!-3R)@(T2_i#$wfl^Fv&Aoek5$^W4gW zQbLYl7o2Qjv-<Tx`{1VZ1)XDUKa@0T0@K@lhQ@q>N&};Nm|2o{-x1cZJ3}f8f^9SM zL#51?GpRF;hfI)O$9h<atNe*L{I||2uf_&r=I_fY=9RIr5%(gV^+?^#WssEn5n}>$ zPQs>VnsgkfI@m)}DL@ve?SS7dmW3Pu=RX<#FuJA_9y70V8;4HTp@=s&oaR&|?^g%w zB(ktDY$r{o+N3Jq;fuX@kpBJgvvc3J&#wKC97yhM7iXQk3<^al6olT+oOpwj0*0dP zBJjUTEwFtcX>yacj$EYuVEXV^HSw2)3{+8U^}T)Pw<cZxH|PsMZ~!N$d~iqKqxl7h zf4{0eOe*#Lqp<pG&Ofe{Pl6(i06pXHZtj<6_>;1%DZV@N+hxPuWN&vHp%+1&2rVGI zd*k<|L0J$KnY+zSjP3c0F9nNmqWqm8wP@@g1pPvKcu-X@e0{cc-(TVy$OvJ1WS?z9 zYd`*%s%;`B*+2;~P%HV!uL*y@3PA(bbA~<Nt{eZ_@Xpmo8BmuxoCIV2b3;3nu+;*t zDsx-x*}3s25znrHN)xl<gP$!6|K6W;DCj8&Q+r4CJ3+q&nF6iQ62Eua=kHwoUxEMS zH~{c}l8x3TQ2oR2+TyKc+7{YU`SId!O&8yS$v&So+54N|%Gqe~Yu3i;;pcyu7(&~> zZCqPBtn}~luXY4>v0;^NbN26=otz4E)7BPo>hB*f-v|29e~6A|xBC6ZG6C(NKnsV% z$7TOis~vr)A|1}eK7R7}@A?xGLvmml%0_?xct8Yv>?^1PIq`Qsf~`A2goH8<{{7>1 zMPM0@H}Bm1Ssd80n4b<r+7`3|q^5G?Nagwe65!ttT*7LjW{c);0{Ct7FgP&F_V#4n zzkmFVF+jQsgE=qk2IQKd!9tRi&){lbCH4=ZZFC>2oijwh6QPt3B(Ys_B)pT9p3 zsAu*?yjDs3jgB2w12Wjy0ZG@dFEjm}AJ}ui&(xcxX#aP!BnE)8_Gg>Fm$gY8D*}=( z9D3Gz?(h4B!GJ8-*(LuLJOGJTNNpD``eP^l!fCKLCnxaEA+(9Vim1PPd9ZH^`>qRO zH-5^g=-90n9twD-%RFUA;)Q~Jl$z?gZo#T%ESj(~h$our=TKkYaTM4%)JD8TNi{D{ zc5!?M2oW6J)Mx5GMfaBCj?s^8SxhXMsEdJ(9XoM?Q}?M}I5?D3%{C}ZwycjhcI?=f zv(c)jP7i%(vT*Te=7;7jU1#d?L-59xjV@84T+t6G-hNkkJm8HGP4+)=&PZConr3dz zw*@dBmLPp|LQlCb6?;Rvm6C<A7{-0bCbZ!G&z`6jipX5Uup4%ZwarhLR35KGQ%w7q z5FZJ=4=)9xi(mS^i7Vbr`u_g5tIP5-3QCxZV|tzt+i@Tw^)nZz_M-}oZ?|vV3VFbx zRQK?lb~0|FliMR5m7hv|8WQq|#IiA-M}Fz3D&LAMRQ|hla&XoIZB0@-LN9>6g|3g_ zsfZov*f6PZ(e32zGnWun=AGy-D_PJQc*mhy)L`7}ZlL4K|0Og|62JKF^{V>}{e)J9 zbJRjQ8~q-^RE6Uo_kj`%(312cG&g%=L8s}`(NsU6Ow!{An8bZ#xcw@O^DG-r)4Z1B zDi*4LJv~$)#Asa`!+gy7^OMWnsdrAikMD>ulJs7FR$$wqA}c3nxxPG$NY`Y)vKXe$ z?(bhg8N>uVy|K0w$t;e4U+(!m+3EAE#qj~D3aIOPTtocgT}qVS^+Qj!74wD)Myl>U zIc)r<>tNp4($q1`M$6pd^!+SpQKj}^Pf!pOKJ{$rA!Y0lmfjyQsyc@vt;r~KHgW6R zkm{)i;*7d3@_d;V8RX9vk!#r-$bDsW@wYp2jKl@6%!g@6vj0=qL)OMhiM{y9?|sW) zL=&Dk7{z>v+-2JBdV{ZBzzG^2&cYa7XE28eipIaNs@rj@N=);&PN_TF%Ia^j->?F2 zl<He1lNoV=yQBWp_q)Prc#gvUZa<vn5%KWPuLD&#*H;=b8Tj#2q#mD<{iB!#0#n;y zbbMXmQzCkEpDJgvEdMz=y;tf+s%|C){oPwDZIQPKq{ZlggKYZ8ny}rI=MP-g=z_u? z3IUZDa$Bz(gfzF;D0^7pwNxiQQ_gYxjQYbv^a3AKuFUTtr)1)ORC7rpXlzz3*baZr zkGBuY9IGJvRBR$uo4-b5EqCiC;>ZEeC@BZLDE*+?&lZ$#2gxfgY+Tj#O3|9i^KCJ9 z6hSbz%Nb2-LSQduD%X->4^HDp50e1FzJsIAYQfe7!+g1xvevB<n=qYBWYghZWoOoQ z8Hx5A07Nc==83|sf7;}J_>^@;)3@*B5Scc{HHH?D#{n&NA(?@tA0K-!^}4q{mfI)p zc4Hf-411*32#G&zteSavm1_<<%#cKVKic@3&i^#&RFMUu2rW~EaWsH{L2nNO6X!vc zxLE#c!uW|rl@`Q}$q(T=6W0jo2SH2e<R#!UxA;>7fB4Mh`_%y!BOt?w^KI)Zut_JR z->r(AAm-Mms77*nElzIs(RBv{!T&=pkuc^A4|d!%4r0B`<$2)i+>%4G?OKPN(b@fM zrhWi6tp)Q-{HWuC5Y1~?dKx8YJr}!}svrjjtyhfFs7=zcEw71w0PR6ABXWtHuFq7i z4^CZD)jYYm!MM=#m}OiRsLL9_)ZKpf#(uV={M)sA0A#x0|LXMLo%XXTV9XmeQ7nIt zkp3iicjWBF{~@^l@6vw(4*#zVH$L?OzfnqDdU-gG$7yvQQ{ugnmw$BhXQga^aw!PP znPG@s@eW)L(2Wg#Ppp~_IT)EEn)`kJ;{-)-nS12GfN9q=vuh8}YRUSpj-5fhaC&^= zlJRBK+UD9!)liW5G_14eM=vp;dhr-AJfcVI?wKZ=5v6U!g|i3srXI+IMZAx*6sJ~h zvpg|b()Rv6ESlfqW<#`~l5KmsnQ>rXU_H*RC{HpJp`LL09I*ME%gY1T@;qk0BxCDJ ze=6W^%DJmMtq3-4Q-3!bgdT+;)q4>9>Rh#bIXL0<<j-a+#qg6hvL6EW?5m65xq@zp z;?MJ0TeOkr44E$^8i$?N&5Wvf|A0e+Ds63PCX&@}U5jGRo+SI`9rB%WfF8TnBqZ$O zhm7+d9@+9!=gGF#BXg9$4n4h|oRK;4sSa|YqqWM<&y`_gyyK}tt`tL|TC8y6^;DnL z`3Jxi*C#87p<i96)<W{<3SHiqtG{G9`r+|&NsFE2OH|umDq76-)0of>kO_HIZ83O~ z>qSr+9fbgzwn8TCX0pL>?nir;k~zBB0<n79TgXSo6@+0|pQZ;Kfi<`@8VOkSaH5mW zUE^4{;fCneTob9_iF{gsr9IYa=`&FAHKl~A&bNauKe}3y4FR$my4k*~Y#;SZU-@(2 zo{qiwxEXHDeRS*7LuHM^X4AbX@YkyEvkR|UeyNtbopYD&DC|yk5VJUXs=IKy>j@#o z$HvA6k!fl~8Ok#-H6XzAiimbkpdqCajHL9}ly;0_XIBFUDO8EfA+QT<_v!CgH8yCd zoBYEnUd--3{Yk*Inrum}g+nRmR-gCn-J<|b&gx4Ye}GRm8S;1`G1nI1eB*ioSEHJi zYzt+VK6^MNgODv}zxVh1pZvBqQr`u#`s$xY=3FcUm>@+$bEm)Xqb`U$IUK50J6JaW za$?zHLJMOoE^p9Ib5ynka^1Z;XTJ52fnjqF?}QgI?<j{Ntf$DH>*B=*@2r=j&&*yM zK7B{P+n<`)bMhyi1bx?_Pgvxu+dn%P8RiqvO?U8i->utMrEL$Qo8nNs#^s|q_^r*2 z=f<Zl=&40qGT{ZY9<S)Lxp9E*(}V}1rQFjM>bF^*7OcP1w0szJkm5f2w;Am?TF_8S znbfD5(v-ZPl9Cd(GB*^KN4?XS2tcR*jz;|sbV-n5Kpr^VGeKfLyZymC4ERB@RnQ#s zZ<zo0yvzCkpKE*cp!#2HkF-wZz(@wGD9HZ3;<jQ9sDWjzgTyQTx@`3<02)DC2gr7n z@b^jl1;HsnJal@VVTY-I5Lg33l-TA4vY+VvUm>aq<Q2H#7j1Ssocn!8luRK0jxXne zhiQLbaAzi9jZXjHHyj{sGPAfaK^%H@<Dkptx+g%^w-#=dULLn2mgZQlW-W}m5bcQ8 zk-SEs!279!Jc8>=5jIrFPOlaivS;>;(GiV$H%219G-0A}qO0)Y*|YD78JM4a3x5#o ze`@dhlJZ-i<;UkVQ%AMSOkYKw*OEh5zO_cd2uMC^!!ID!q%#7Ns3LQ!`74PEcTeK> zg_kB=$hx=MO-Hch%OuA%NDJj?>dAG4ozbYP^jT{V)*{|r?bc0{Bq=HIn-@Si>|sa< zE%o8U!p%8ER32J+m^P1o*P_=bR#_=PBJgeFW~(e<HXAhs!EkUnf|5^9p_-lItKrKp z8c<}+jU)yJhyF^VB8Ogv3Fq}?=i@A;S7m7qJC=@dkF{rn>7;AEq`cj?xfOij>_Vq+ z!HhV5k}n{W>gB;xypVurH(%~M%oIYg_dwLQ0`HZ%;S$3VmnXp=K4>1_@AcHEeYfKy z`G!B${?&b$4UYWHmhHzAmdpHEn&)4<WA$D4;lxN$fTrw`JdLKIaHo0T`{zay{px_{ z|Log|dd%QEK3OYZSqJOL)J-ue!w*;7d`wQhSh=3Dh+<8sE3_l3*<_NB7uokTSj>KT z%dMs-5^ryiq)3wia;3Er)0bBhGR=Q+CZA$eX@-VT7zR>9pQ8JaL!>k=YnvLyZHN`( z`j*8)e8@24SkU;`kl1mTmM02N9``-Bs7W>`v_(`9aG1XGlFPGijw7C%E7XG23=5Bl zGS$Ck;RCVnhQ!=5MwkM~nTMY;I1Xu!7bliCMP5pTIDFENfndy882GezZQSJKi|<Y1 zmLM)%PpZ5OE1)5#JjU~=Mo=P03*dcUAf|JS+VNy#Kva3JTJD~@RClRr{q*<YM!_Qz zJe6jzZ@Sd;6vKdirML{$6(v%~<mD=VDL#DY5G27CWVp!u$Hr||ZK?3NiQK9>qKO}m zhU7}Jjed8YrRw(&A9OAqm)>nR@m79>%r!p7!os_U>QKmOg*(fLHk*S$pTHwka)F0y zYgqj*+I40rx8k$zkx^8hlWq#f4}Q4|MLv1m;yTh)>)!8Uz1h9hrXf{geM3D_vN!H@ zGfuB{`fhS(_<3D{-~<V;n1lWk4Xv!c%QA}h8Mur}-5yvq#wZ6KW+tV!q2lh-1$Inc zyAa|F?FT_42-{Roajy65+f#;Vmkysf$>HzscyJU=N6KXG2`+nkW!W%O%u)l9rG*tG zrnooJ&D@Y&c$AxeoRu)j?rQO<S#qu6x_zvO<4K8%D;kl+wh?N@wnf$Bu8!lmL{4Ui zO$aq?0pd-gVBHX9mV+ep`z+NqOKo9g+oO8scG~4>VX6T@BaP>?l0Y(^I^@trIzS7t zr68=g4o0yw1C&2t0)(~6Z;Xj|^*p4sKqa$E^p=>y3{(doa*ZXrUN|RF_lUVqUj!Yg zb4TETMFJWLm!AZr8}CuNHVGtEKNu{<tDC9ApXNJ?Q#-fgPNWI@DfjNJ1?fEqRnXy3 z8N#(aAWLH#I6^@vZ&i&Sn^g_AAY4uYt)PDULtIyCMBjF(IF1-Tf7JrA9%XRAfu8$X zD}bNW2M*%4+f1L4%Wwldk`Xoin!@w@aJZz;>U+{D$^2-`T;~<XXw}oBGzDNcKO8?; z{RFR}egv<Pt;5HRD)EJw1?@ETaB#GuibkUeklQ|_OyW7^yhk$eM8{wlOWM3giU>pJ zU?fWoi6yMtEK$F0Z`lxM*P5)%J<=Nc=1lR6TxjOLO?J7P??w8(IdZEuOF!Xz>}#{b zro43?0jiz^15a81`iRs;pi{-vYWe8eFG)P9sGnq+BFQT}lM`Yxi5iJgewEaU{eD|M zsA30Z@(iPW@xJT>))Zob;K(6!SgkzPu@ZHYhS6%ea?-l@QOSN$J^#4+O*vMfkyh2K z+#(|apGPya(~{w_!iXG0DC)WS4bV&5v3d3Iv>5;aLx3ehr;ZXw9IG}uKTY+$<aA^H z8S`3|**H1n3G<_7EMx7I_#H<Fo`)LA>+<LR5dU!4kUS>2A4fFezSyRnL#=q6wz#&2 z5Pf~DElqV}b)m5_me;5h9hT5S^Pf=Ylt~7S6jYMrf+DM5I1e@~AgGS8OsYu)E)m|` zI%?IKZmbfpi^P6K%H@3UHK}0Zx}Jo%xC_#kc;S38F5Z4QpS!FR!!d2CE3T((#CHP3 z4+)b(tEs~i#ipUjOR@;p9DiVKswpbraoNM)`hYty!cTtu?6kL(l;!?fh;#)WLuneC z;fR`BJR>x6;Dzr-DfZI~{voeasw%n<v&0$lKc3M1;qbm$le_Txu~f8Uyueyyy;Dzf zD`UjG(oR;LFkRnp`Dg?A_bU5Af;IBZ|H~r<WoEzQK`fU&G=b|FV&g6yKlZ_yIGgq- zQQI_v^2|uy>$BXsM`~+J)I?W1kS4WP_a02vNR$LE@i)Fs#b>XpNY|ihuGARSB>shu zpvDqce>f?sKr)#VXoyY1WzVl5tBU+o;;LFfSojJ&p_;)#{hnM(H*Z`Vt{nFXx4vt! zzZeB-RPReB`R?4FkyCNaktXI`y?XU)IMVomuzmM?lDQAo1V;iZfB|hVdirg0gaQPO zFw$Wkh%_X#b!mf(tat|7NdAW_Y_wPW<1Q54?u|&+YZ^MNWF*ZHwXxXaC}7ulk)F@g zA6@rQxzv4z7aXiTjDxzC>J4^jP&Oq<TrlyTy#Z1nIIl_N#cNbFq4=q8WoiFt$mE%d zN74V1FnBB73V=+g!*Kl-4~~(!s1S@(CpefvReG0{gjH}qH#0M9O;J6yGMV4}6=0^y z$*;>rW6PtWV;*BK#+Jw8OWiKx45<~tlMUp5z&w&R)R5fOlBSpV$Q>b9$a&;V@Yt@* zHL79f=}*vTarc~t1c{!8v)OvtF(l_OtW{{M+k!hc#^JQFiUY<TU!s>~Z2cKHkI+<j ztjgNrlqEPL4Fze+Jmw#-zmzY$<$+L@s7?o1CF7dt97P!lvl*U^Wh|_|@R)sa5tS$J zyZm|ISZ8)Dla#NaL&?y|?=~NwJ=V!FjPAOvHH%nT05AhR`0hR_l9sZrd>@HC$z$*y zoE@GMqauN?p$Y`^f8}I)1ZaFeea(DR$uZ_2MXt7iY~bLA`3dtjT~&Tn7mdq5UglPd zGJS=Jhm#P?_jKcmQk^XQ7Q-rttwg!HzI5*KQqS*Js4{%^`pQV+@Z)@Wp+g<gr66Dm zST+1}&bZv;RrqtN|E^5x3317>VKVj^1Th+bhbR?>2HaG4$L0C_B&Fce*O%js0B8bH znG-lN5}*VO<ZoUzV14=WWl#bplX|7E!pjnP!ReaCsh&o=$XKdI!ntc{iM|F9EU*4E z(+0DFopX!dtq?qh^}Yl_HR=dOW?oO?uZ6sDZM=x{!GC_Wx9hn@p!j+lD#XNhCB@V4 z%Ny!*dRbA_%0g#5Xgd}RAIt9j-mM#4C26-@Vp)Ik_^}B)8i@rID+yu(aH(+c-a@+v zO^}?N94O6aZFbvt|Mn=vj@>O6l0lJ^pYydzP!b{>9p$f)tB@HS#dZ3$EZE1$;X^{A zhNW&9;M75`GYiFm%rSg`?aF(*@;*VLEW?C&d&M9U^CG?8q7vT`4Ry6DaT^P@5jPA5 zHHEuWrK^&|c1Ed*V{=itMm;s&0BAk@_RZ<|y6y7Q&uJIPc(tBf$6Qf6_1hzuzgV-J z;BN*0YPk5mr1c`x{TaI~c1w^aHgXIT2!ZF3FnS>;H=er;hKd`8)=8y(HHQR@>WzA~ zbAfi+4!Y!V*Y@fTy7X~@jrxFz3I|4FX{n(UvFr%|ivKY#%E=3lptR7)t$Vo|*OO+Q zF^@(Munk@bZvNX?+HaO5C1s2!>$f|`vkSleHME?Rn)z5P{)!uaTuFilW5=&ulMUPc zT3>RR`_69x{A(TnYu7+_*(YN4KNP?Ru7QswMbAR0|C(M>{y!1&zl-lO@&9kO(~e%V zfAZUN;)joZ%(o71NR%?s%QfbCs+S!Ke3mjAoh(Pt5IHJc9l008!(;%{5M_A#4Be*@ z1=ucxET~A9)RNL5kg<}=9ktRH$9M5jz(Z<zdHMGsKO{N()>53^@yl)#osE=78DOA3 zLKZN8@`F@+mPwT{$+D|97GpvEV;iI;<O4X|*J!b|9pf@c^+%NuogY8)K=K?Rq5-c1 zkEjAFIU$hthJScK-up!u%|jxCX7BtFq0gT`56`~m2!4O}Qsr4v&5DYKVW(z=`N)9Z zE>;fkkmo?hc~IlO;?FIvM}p4*zPGlz>pNF_MwXA^?ybE58YhwP`;S7?Kapg!EdftR z@K*X5sR3jEyYXM4xc1aPlHM=AHYfJSMZ~Ndd^`qN1D<J+s4)Hs`~msPRb*)$Yg_-c zUONFEcl9+|WQLxJU5b0Sq10SI<{J66VFfnftjudv8S|>Ui&QR#l}Hb((Q_de8#*~) zE+g+RzCCCad57IIMgB3<u@H8-I(KQB{mBoiK?E3zckkmDF|Mn27rEcw1&-^Ii~L!t zxYgrq9NOnclY&*8oSbZDuC8udTB{~Fyrg;F74AqKmnZw-t>0v1c<f<i%~WY>-caO$ zp=OR06?DWT>RJQG`vaV$JVTmrP~N~V9qPwEmsrEq<vtm=UgR4lZ(MmA_xcWOFy<{+ zFkK9S_8X3zMscQWM)DjY`Btt-_#&ykK6~J2$*C>2{)ZP_M}iX~znY+kGumulzR<0h z4LPjXzh=+SFAXWM*MrY}ZHQ^;{zyvrzg7BgKIT5Ftydd6@$Px1YzCu9E)=(THLD-5 zX}n?+{>iZ9Rzdm|M4shmlc_$|ql+Pi0pRdk9R%x;PmNuNNmHB)ILs{e-Xd5+QFL58 zN!Eg-fyoEInP@7DSR9l(sb4X4tHH1Uu0q#*#%N}LvFvp=sc9NGD4C}n9A(8bbRG)- z_Uu@md9MRKzfTJ3sN7a}ps8Pd%VF7es~FpL8k`a>b_}<WS`OHhDF~O_1{t<Nb#)cc zk`1qQ8=upAc}+^V1y8Q?h#yHHRXHPMS6nz<RP{(zP;V3Itq*Ml;8$x9!*LC$A_d{e z%j`xmk&$WvpWIuPl$xPD<qk%JYXHK9N_gQ%++q?=`}=3_ohQ}XBr2VmEw3CAiU%{r zf<3{7SxrmN9P=E?EMMp_apC@w>1K-xGktgow4;91livE4R0Eah8*|nO_B%o8tss4E z4-G9zzW(u)`xU1kG4p`(xbq-Jv_Ei%RV`G#lw9@=BOSjQ2&bP7pkJvIM~{wiQv}g{ z7>r|?nSYU1Bb9fy#+PnX^mk~(DeIqn_9!gtOBID{<V<MT2(M~>>Ck%d@q%rwzUj}h zG{2lyBST7&e+y6k*5I_WnfGF0Ky{~28oJhGUyANEK5Ee2dyS=q)N#W$OF{V5Hkin= zZ^7f=PZ8bXkrrj>xy~g_d#l`AcT>bKAMzC0RLbGQ%{YIHm$Z!XsSiKCnqH&uua%|U zK##^KOL_k7>T<fW6j*>EBG1M+cK((F>5H|;KMX!%IkNELKWp-WHG8kQ3)71FOov`H za@TaoG47_Sczlp#GIc;iU?~Yn#J|GZCLJ5o2JtFV_~^1{qa;b|(aj9#FqZ8Ulg$#S zQ2XE$7S?~~DqEmiW7F>C1;+h`B?P!0R+O`&jxJxuag<aa2qA!T!}h@>mNWnUng}>s zU*Z0!V)}hLEcBAQaBVop-RxBbYmyl}1g5DK988Ey{#_2hReb^#%Ar`(3jy#lbr`J0 zyJ-A)Jn0Aup(_1<9c~oZq|!nGweL71M)KOp5&kT!3!=)qr&m8X@q%4iv`*xu9z~71 zNl1A~URS1u8|k+lU_9g!lH<;y|4R0pK(YIw<5hdg9FtQePGfoK+PGR_pC=q7Cfgnu zoz)5sBb5Jp2e-iQ)9^gIUyUo_rJwhs$F^~ak)}<~+@>g_M)hAR0J^&R$r-6B^|w0w z?vH5-Gia59@qM%(29sGXodfQaZ0oSPz1H~Mb3Y4$E)8$Xcl&A(oYf62CuX1jY7p{2 zkk#!iU%813#Esp&;LjE^{(mb7)~>}|_RK55v?-DfpYp95L*KuD&q;i_)8c2!3QS|| z9+$)}CtKl<tV*utnRc+yLom02-v|qV^eVpc74Q7!^6nnJfOQj7hE~!|Pi7Vt2P3Jj zQW)%5Gee9RF7xuneA}^;C%GGAMItvh*6NpM2d4rRgMaEMTMLNhw^Pj(ens;almdIH zV1eA0TznS(>*a*p%OXP}vaK(k=_haofJ#;jts6K#%LAzZc-;0Lw!c!sfEo0fFLv7@ zQdH=^{{wYNt{IpI1*H(uF;==(QnFGoi_6x=Qawmg7_xc$e(IioK6oIf!-%kRNCUzz zPXLwf-P%w6c;z=zX`ObkQl~~q41=+(LpI%Hb}u5gaWCXVJUCp69?D2-$u+Jpm|snz ze_|-**<FC)hWLEGaVpuS<w<L?qe*SFVA}iy@ls6Fz{_imBc+;qI)L9+i5J5?$$q_C zv5Wx4nEZFKeY=%+<zpV$Pfs|rb1#%RgnF#h3FS|%)0HW(f-0i2ixJje8XPnnx+*#H z{=sXGTgFQBFZZ!R@?~**D}={DrfqQ}3DnO7dRU<@@`QzPQabdYB}vIEE9}O8PQ8Jt zGuE7V-OlY+m~S#bz^qIsVs?MtY57j|b#nNz-V-!(iLvDk60SNLg~TqOoam(E`&d-m zjIwS?BPhYS54#;PC!G2?cT}UB9w;TI*PNekUv=m$RR(o2^xHdhh$1X1c;Y#2z?%c} zzS*kgNO&jVdTy<`1qaEa{#V?~lo2`NY!CFL83a!>#zZH^&6dof>h`*fH1U8FXQ$>9 z9np_Lwe+6u^MnMynTn;lTSqw>F1Dqo4c8b%1I)DT&<FOD`(}ulM~!jrxcC91ow{RK z#DYqU-MwRX2*kMVEjpX_^atMG8%2hxR7>YS2eL-gg<rTk0U;1$NS!h7?lY=}al=U| zy_GXKe~*?Jr}*;ofzExvA&NPD7!%l8Bcz+c4=ZuL(Jl~nx0GG>Y)p4)Q%<u`S=+*7 z>xZQrOR?hx_B};F`K=^7P2D~|Gt1HKZLZqdEQ=GvsSG#9ju`8KBZ96x%e!k5J3m}i zjRFSI#NhZ#Ej<(-;or&*E2<f1#HldzJQ5VY1ZtDQA3+5>iwGDVHdG&3PpWbljV=(L zB-A~YGhFHnJ6Qk2!kj?caeA0iV&$)@IOikx^fb1R1PXF;azv%~$~=~0ZKvQTbz=Xw z*TQY+U2_C(^0!2i?Jc109Cz~Xzpn7x=iiioR{1drb%RpCAEEZ=+jFGuZGLvTe|i5M zgOmacUL8ztvHD}p-82^V9JE2)q0ZR7@f%^_-nte*d8|tJg?D%Q2MN-506fxGg8`KZ zVW1%9nnYfRyp*P>+ddoof7tuVuqeCkU!@ckQ4~;+QbJnk1_7nJV?d?5K^iO+q)WQH zq;m+BF3F)mYJj0*XgGT?pZ9(K=eo|P^WmH?T)@D6?^t{7Rlncza>=Iu@3<r%$XL2K zJ_E#UsfG2^3G<SnJO+w2FdqENt($3n`aLh#(mV#HY4e#&>8wlXOP8di`M=L?wvy#U z&=?MI!EW<p2G%^-tDE0iO0#QSYxnfGg9!X{#K7sD#6UaFYbYTE%luAm>R`w0xlCl( z(su`gquJXVdC}<!l_TNlyaRD**7L^wQ5kC<+ofT+IU)0qr$394{w(DSDX*xMiI6lM z@F=Az1hZhoJf}(!)_`P75RFS)qaR^M6)ayTJkm#i0>|vNI3k^0zjLiFYA%vltZkj* zI89^R*7lH5MSojLt{PEWV4<|X0Da$EC9z{%Oyp!aNf%1<0iZPMIi07CO%wz>_^4|I z#%31hufw|~c3rI^9X#`GVPsp4O%4FAJ721QT06cPcpy0P*ihP2ZQ3lu%ph(c`_MXk zPKux{Wp{GLg+51(Aw0mTpOfR5bdjMski^E50Oki7J&nk>h<Vp_(>>M9Ory@R)ODb8 z(u3BCJ%_fupMiF*X2aKYe^(b^v{ucZBDaR_#f=?1yB@W(Aj9ElyCN%{>J^-ybZXcg zU*8$3Zf1~_<xLrE{I9&S8>(QQ@QF7Eic}AW@B%+F$iC`SaC3S=BKiANIji79wB`WP z2$IpV7Q1^*5?$JrdDrZNG*0SFLTBOolWoP!wbZZP*3zBEAR`zK=V-QuBV-WL>MmQ1 z<&s(7Y%N<^Gvum7K6jsTs!X_VsW?vwo`%!B{SbzmAsdEEUH4rFwlfX<Kih+T36T2n zHB-oiUmEOa{c-{KBXYsV=j!SW9P%6=Sn&wH6E6fmj^ADKWTK{FN3~0Rt^63;S|ez? z;Kesq8P3jIoc$qw-8;7I;M-w?<EjHcw89j#4Vvp<JKI7PI*~xDQEX8Bxf4E?V>(K@ zI;^{D-q-p%zACV#MQXFRI8e%uceM5OZta8f%e+<}SVr#*)xln8x<GqJSB(+*V!FAI zVnq-kW^6SvD)IeEfB5HYdj(#!)`SLL!RQpKr$s9kIF-*H$h{YcgkE>U!oq4hfmTcJ zqNAbB;vkgwmbq;u0hz|;a=lpRW^}1l1W~DFNcMnPYy9|V+SBjJMJC4yigi7C^IP%9 zSW=TT@tg(x$1|aeYc2c`(z4GzwevG|oOzMXr?1~Cz`BE3BRgUVPuY1`HCHSg)GlZ| zSR+=N44mwa_*R6UsyIMIZU3PlPGNU$v2<j%Q%&ee4Ke^=Lmyqjr=@n{$Txgbc$j9b z&<&Fts8>Xv+Z9ZpdF+QN6=jQW&|48Hqh(Kqo^YFKg;(%CQL@MOgq9(MpWUNnz0g+e zkjZwtg@TqubK*tSh;r?7gQ(4o^7$3cQw&&s_ck~8%7-fc|0=y$N0C74-o_sB_7cHB zYCJNoyc9kTwdg&%x}|BAnA(sCP@Zg=A8PD-YPzD?W3G_&Yn>d-IGH(H(l7W46tmXI zx)<wcpAHq9`QV@AIdl^Y^eu}>hQBx4!H6ukbSki~hI4Sc&X*jmk26$Oi>MXL2(N4_ zZ-moFj{7;SjRE-4a=35f%MKRUjzAz8FOd;fc0*A#fS^8pHADDB=0U*@Sp$_wC*s3x zR>`vE;kgilY=qUGnSae*hn_9PUE$4nX7b0$uM603tV_%Cj^j-K7upbT44Ui+u-#(A zJWq2mj8;qGD%r@|>QZ!gyM9-$T&HVX_+nNK%d$jkELF}?iEYkN?f$!{tlJL!aW+J{ zpztA(Pr&%&QQ=CeGlP2V<EA>-8Re6`GCxGIrUS8f!^_7VSK3tQBcpGBtg;kdu^-5Q zsXE}}_(7=DR{8K$)2gcD>a4iw$UOE_!t$=oYf=r`nV1bOy?M7qojHIjm%u~eGA_^W zpySt7@2_EBhWLO>qg5;dZ_%ypl5|3p9A-W?%4<>!>Fe5CnqkGbX8qRdq=6=B#*dY9 zfeJXX5<-Dy`GUryS-L2H^_q2v(9!#sp_B{s;A(g;R2<>dYD#}?z|4QC^R4}pOdTiI z+GK=Ej)IskK5lTDA7RTAMA(6ui`s!`gbNN)d!U_BduwQO=S)^DF2G64ye}>7%68lB zR46inA=MKeLlOmFt{IO?=#X)LHC3~qy{<Uo7W>hWfbsfW7YmgY9|2G98FZ%s2LxvX zBQXqh-$-H6ugCFhurE#)=QMlul`4drepk%2ei+5G=+Hwf31xRoJwhV7@ot6<mrCZs zq18@+6IkkF`_0%-=5<A~@Ia!WrV;X{m$N0TPw;C%l<LBzg+f-l`3_V;%mrjT6G*R< z{0IP?tm`%Rq{#tWnG%RJjX#I`<N6C2rv2G8E_BfNhzYKm5^kKDV<@hR<**>@t<yfU zL^u8M*IBCjM}rUqS)^(nZ_8KM+ZeO(rlW^MJ5a>VjqZRjU{XqLxy*IWfFhh;&vm~- zr1OUG>zb2IyCSpZLG^@2?Zk{h-A{u~af$^AH0g2pc`=Lwm5T&+GiebxbQ0F$v`zz^ znk5mg)%>OcIZ8>1Zac&Fh$iVZDQ#9$2=P@n$JaGRZ&H@F+Pk+>6WFCx{c=v{JN>B) zHAZD|KSrfFe7+=cIR}T6)7;SV61#g_jA7nKRvX9~WQVFe?zHTc8kn!L_a%I~mbW;k z6JcFhSGNJV=`zKyk_?pfp(WHESL3lU?T<LvcTzKUm&5>$<MdA7qhHnkA%@fyd8;Y9 zFfBaoK>S`^AtQ~Y&X2b6*2v7Jg<SFRCI=iDs9u$hZXf;-mGb+E_a3`ldGoHMrg0-{ zc_BlNOEMALnhEiSFP3CN0!RfYlji8e2@tkuJYVbs9rzXHs8a23)5?GPR2h+(uT~=} zA(zvrnV#XfGFJOoSTZ8GUOH-adoeVf(Pg~<YsAMD>1D^<$XYZjkIfudU?c4!MYBz} z%ObmF*74dZNI!mzN-3y4$c6_Lp>Q|r_q-ckU667_M6aT9X{I@o9=30RdG80?wK3XF z*BSQ_R6Q9ld81RlD@LemReZvEmpif`Fl2W$GAy=z3-hFA@(B`H>Q@O{bQ9%6Fp3Pi zpN-4k_i-hLhPo>Hc6l&BnhrgO<;;0!st#+ASx=Mh&VOH;d`5p!=b#-8Hfr4cXfR8g zD8R5Qma3;AQ#DcWR`T1gm3DA{RjcO{U(Jo4mpvl^C$mflcx9A)eA-x7ZjnFsy=lXN z1qDuX9RZj9LXg|hMsty2CsEz%1^+Wo`Zqt_UWL$HHv40;o51j_pTvCm>eXZPUQk}u zMyTr+yfA!vGGT?P=tkmwW3}GqO8;4ibGGYVW&sDgdp$0{OxF4WjCjuzXKs(93YeV8 z4*g9c;9q)BC1&&>P=)ZQH=H|v3QFF0P9LUT_~pKcpt<<Z<fs)K$oskF&^~(f2$iyp zVl@h|Ul~yWc!+5&oK$x3$3l001c*uN&W3RoQ}8+khUx(b^P*$ip<f>@5R`&Sa^`Dr zR_Ho8Z$x<r7(KL?Cv$$b?%7uZaiAjz0mz5eWXwsa<Lt&hx6|co0QPtUb$-<m!^+wU zxy@;sdFA$=aY(scFV>sOgb|>oT@pAMX{vdez12=uQNW|m1&;6Cd-vi*AL)XCy$?_f zf7N+3GxB>Z+I%<*sem+RKDTM0O)B9<E=8e&-Bi|+628qz8mb2mQo6Z~iThHt>ntnP z5A#WN)SBetgGptcCS2Tu*00quMrb5>Qs!woiEHZSp01_APIp5GzimT!LG9gq{{cu( zwjJ$n$vij!b<OP{>j_9dos5S-6~ocJL{<?Hucrff*@&NI9@G>R6nkfO@{lwzkx|^a zuYf+YM-F;cPu}BHVWQhDwV)I95ad<m^xRve-*-N_Q|tyq)}@(^Qse0`CGho@mgeeK zk1z;2Y*uWq4XY3-<3@Dl5x4a=#;={L+smlzJxoFtA~)nSA~qYF*D50sW)_hVYjr2u zJmbScM9TCOf&9G^$hFZGo$j4vcfYD4gBc!}mI*95!2HlP)Hz|Otdg@#N4xe8?H8Zz zNJEGA)|GPQ;2vgvk{!J*7dSGH#rd=G)<JKYpCN(S_@~ddyLqMhP1{bLwm3G_a(5UR zmwcj{zruWOEPoBr_ZGY){bGe`E6!56IP8P_ob&Fk%POa?cso{jn&EKGrg$W;!RZ7f z-PJ14b2vBS^pxxyLckf`sb-MlaO9l5_G*4>fIdR9nRhAXG-1~@wfK&p<BYxa@#*xZ zj6=yj9)rh$H%7}&5}>@^p_NDITqmUwrHI-!UbR(Tv4CsI+WUmp-`|l)`%)*OV6Q-j zw<JdxM@Jz_@un@9e%F1nywq&Nv$i|h!fEAM=ZCn-4)`K_XNQ$X9ekH>&1l{T$=iMX zxY99M!!%3-9S6iaLTqN5T0yvn^6uTwW#Kw870>Ejy>^96YcFiOq{6760*em5^~R=0 z^bOpoD(1Dz*Y51pJ~RT~a$;f$4v!+Qxm!(hDncFIiC@3_@Znu3qKib!pgW($F}_Y< zd_*E$T0?(1H4D$wg&MlEwB<M{Mz%y*U1k-WR8U8=L&Op4Q#D3a?PTc}8Yu9dP4~52 z9GAxc^7CV<7AIX#qT=J2ZW@XAAqLX885f-whsEZQsw?{2r?qA0Lv7Y-2#OOB4F?W6 zv&&I^`58qXD|Fms9$f-;gGG&Z%t_riY;v(L%0(La1cYViz8L58lp{Djuv>=A_P5SF zZ1}!AL1c;EZuKFaa^<8?<t;AheUwvDAaE$(6hkf#yFeB}6Hm;P;KubtAbMRk*6qbh zuRe^3<Bgc(4_936YWR4J-#P0BM&NrgMc^P*+v{r~sjA~xn+>yzcn%NSjuLGGaXzn% zR%<mux3Wbc733DYj=}SJBT}_!Z_-@XnrFXxyKmO>Gp5>C`ffHY1kR@JoA0p0h-5;W z>MT6S_cd47hIQLiGVcm@pEQ_ghoQV!u<WQW-d^}m)!pkk`0>R6Z8U^znYk3f9`fna z2Q{?7g0}A>7w~fHv++IK${2|adew@l>ab127*tf70$dumza5F$2lO%<9Z{>8jop>e z8lx)C@VqA&GxdDehtxk*t(bSjcVaqYaAh^z(up&4ra7Pmll8*DWcz7Qq*y>C@Vr{> znCqyV%GUJTRcb^{ZtNZLo_v2VFlmBT2GcAXic-!~5X)AsdrYUA&s6Pb89wH`HM%uu z@r@E``7p5VcvEk2cn#a6fBUK{uM_ga@<^dfx*MPD>gu)^b^x;c&{DH*aD?wEnlL5E zU3@ZvJ08xwIyu*q{>5E!eqJ(!-ib77@8mwMR&7WP-?Y0{sgX}DZ62}OL&1FW@@}a} zMyprp2cp1>bIS@VP#-w*T94N64wicBe}~4TH#L}V|B`sl+wj?`6KK&wBzJF`n4pcj z;mL!o<B(sAi&|lT`oa*4>yZt^^Y$XR$l2h3wbLs2)dl2;myzNv9zG7e^p1yzCiUx$ zuqW*WTkxST_FPab4z|Syc_}^x?%}i1<zsY}o3o+&c1FGtS@xBelD%(|<kwp6Tq-8- zzlZ0s8mr$OCAB#x=W?AA(yG~AAmIu%l{6U^7Wp#!CgZSeDcn;cy+cE$VEBHFobYMi zvpOH#)ksAH`mZ%d>-7tyr9|WdI=T51$(s3h8zq~To6#|1?^_%BbU8jMn%FHb70fNE z$w}ec?TslK#o(h?$-`Gl``jow)GU^-eK~tDmv~Ea`2ugbRrv9tqtq~35B-g5fw~LQ z*7p0lerda2o*AXz$QYmR;swUx2L8c8gLNs#xEOGt>M9>iiNO@*CG#yjQ5COxBP0R) z4!4{9+bc`V=<zNMNOL}$>5pvLq$C~Unc0n2bb4rEMswR)p&{H-s@x{Xgv}nVtY>I3 z(S}UgjF^`n%ca&iY+<#UxP(B=E?v45!Yl3d*fqw~s;63d{c&iQ_rX5RjoFlf`HzWG zGW$bUBu;xeOg_q2y;w{huj%fPSh|$2-x|_sDP=OOL$aCrTK{5r!s!?T<|TsQYOO(u zg)m30D*MGW`QT}e`sEP`xOAR;<=ch*Qn9QYSWI*RkMrkJ;@yicq^F+fH1GI?7<Gi* z5YZvidzo6?5nJ<WIq-H`TNtMZLani1!Zq6GwSG_xz3TN9$jZS6rJ)Z!ZjpYc;oA<i zi0%x=5-lcCNYIYiN!jS;9J4-pM!ue-<)pbw*1R46+>g3eZ)N<7Th0o->2fi22Jcu- zb<$;sV;AZQvJ~&jE*X2bM>0u8CoXg`1>|3RvrBt^{?1O;eBuKMY=%*5@pQ%!>hIUz z?*>RMz0k2suU}N6S^g}7V`)aa*yq!dYGXC(t6f_p>3*cClBo<5uZ-km0q#onLls@c zSt5fD>gHw3+$%37ADQ%xP;A7FvW2W@aWr;+MkdFyS@x@pI=s4?r~6=6Y~O70?xA}5 zVoe&+ou2P2%^hfrlO8+owORN@W-^Yby|@uRR_1|45;Lc9eM+tgI%dPq;aPqS%Grv2 zSWg^mvOGKFPo%0O-S1{eZ1EZ_5t6lfAG^*5HeQyIgPjjyRkLI@cq9_Vi*V((B*^WJ zVG`JC%pju-xg2x7!o!=`nIyp=z4OK9_d|<kJ3b#?zVU0@-}-Jlx{|j7S1Y(2UCWu% z1Ix9`!3i3{DLf&(8Kx>5MW(s!^8xs>BbWoKOj@S3K^Izm^q!1hPV`2*FB`RYJj(sD zu69%^8WB?|^Rrq41mrv3U!Dt%tc^@Lv^ol$oHGlLz|V=;zl1rrj_%z_@6^^C<tZil zB9*NFE#02)xdsJY6YRF&T%iHQN`r|a$maIYq<+)%3Wh`|{#GD~ZwzK&NqIWbH&=n9 zJZ`Pncq3*uORQ>CHxUA@>3z4~jlsZ%<L3DBs2f8pC$fvS?u11Pi;rLQGmBw}+7owj zUAd_H?2_;h(%rI>E%QOMp>4WM75bB)a$V1j?3JoVu5ag=)z!13_5~b3vmT4i=_gh9 zl{#&mXOS+PQgH|6!zv4cCsUBaDkRrH|D1O%i*v7fmI8GoPNv}lsDKQWqB2KJPxvYS zkWr$WDZ#T|m)fH-z}Dt);Wq20LG@-?`(q~u{@U)?)0U)Hy%kR+7AI#c7kBrH9Vfoh z#FJPO)KoFZm_?SAgUTys^KajVGNvD*kzTI|hHW^KRJUDaO|Uv{dz^~wbhhwPf)D0t z=SB2a?r<y)Za7wJ9^)!yw0sE^lY5vHZtt$MQ`m)YwVouc7KUP}tU*sHs=-WHDlM3m zAY%*`)}QQ`kU`6%#aht=wDh}9#-<)6nMpoBYMidEV|yDymRg3DzHbi16wmfO>$7|j zwB07HDDdnNMJ%&?k?k`LZcnK69X^$lSZFkP)>ceEjcKBLFf%Ayo}jrTLZK)}4(Qe& zinu{le8rwH2K5AT+R`6l((evUr0`VfpbPlt;D=BTT$VBx-@bC)CE$EqijQ2i!`-V$ z?(=a7IrLbKV#9KN35OxKfY{0#j2T_%*<Zd~CZHoSB8#I}cJ-U@ijlL8*%#ptFEJWM z<`Jif_k`fZGQ|Nk?^?A~lUNvfwHYR4Dr^v_%Mll8AFi=Yn-n&DWrI;=-f)yx)isEK zN%Qk+I=v}^FDKv2_(-obmS;>Iy_%@sCQT}xCjTntAWUjZd9XCfRq*Bur?$K01&ynp z###^+Iu{(x$IV>~;XySU^XCW6+7>~TwP<TEk~Ky>uH-@$HT1-|w{hw!86P>7Wcc+% zbf0lLWK}9G;`3uasZ0&Nu0Gn*k<J^Zj;<pwk5E>I(2W<Tt=(yBEwYv>hf+6g@e}00 zjnmDa**3qzp)xvISd81gljp+bh`57IqMfd3vuMtP$FM)+#O<;9(H>e}y<JyyYf0CT zV&MC|w{4_bBKk60GjpFB3M6HV_r3%7NB`sS$=2seyyvxYoF@I!@$Sz*b$SdDi!2)# zfs@#t&Pbdp@x^encdI}=(~)OgIGWq0b`+^|U$x$-(xvB#2G5KYZ;j6BYF2;Z2W3lj zRbk;2_*<C8*GjY#i|4gDx~{Q^$+{0VBK7CdcIXI#G^89`D(OWKo*K1U06lo)2Bm`# z{{3l(OBF6AOW%1s4TT#Thcpm(UT&bL98_V^J6JxFqdC67<tVT4sscMrI;xnmWZ2RV zY+K6Wt}dLa!t)ucXC{^y`_q|ABMSjlFC7&n+OzBeo8(5cWL+0SuC15V`_}{@91=S^ z@o(gY=qPQ{9NQE&H=ejHVjU|`C6TFaSEc%u1plx+)*pLUyKsgCzI7v0Dq*GR8jerR zCpYQ1tn=bQUkBg>OF0eqj~Q%#=cE%FV6j$cwAi~vYT{~i!Ff9P(dNl%Q_HL4>h@hF z!<J^l?C46vhXaJChea3{GT2k%NJFp;U1AO#h+5_?Vhp^ah~VLblR?_tu5F2gSduub zMTmHMv-2;K_VgEDq0J%2DBC?WiTlj#2R`Ez9l-n_K2juOV0pZ0bN*$Dz=RNI(Tfq@ zucNI>@NaLT?4Jc*R_NKH@7mYPSnz-CC5UbO6dp{YyPiR(KuC6dy}xuQZpoTNt}>pv zM5|4z^ZJ=n9)ImyeB6Y1K6w`BrsG_ew*t<)rO&BkQMCDG(I!@^`8pKb9W4Q{w;w*; zi{G4YrSI%;Id`FB;lq+4>8Yt9iMOO71t8gTl8hg7o=d<%m|H7vnH$Xa)OBw^87Q%6 zCg}TOAFuW*WumAYf6CJmd*QQmm5@^Z8$XVOxvjzX6XF+BmA$5nB^!@kcslviOkO0y zc`G3J%tpGq$G+i_&0844EtT@j&`!lv+;Zu5;9D${SQ_Xz=0q!!D7{#KDum*ctsj53 z^WEt4%=R6J@Ua0qW%#`vRXSUPXnM%k2OS@#eF2LENws5(04s^|hA-xdiGwMPj94H^ z@Rg*b&E;>8icEJTTVuJ4MWeFPpJ&8KhWR>cmRLW$EofujVQ0l>4Vxe~xU|j3`~(sf z=;J}wXUE0`(Ih6c#wl3aHB7v$a2j^$+8vp!TZb9h^=oEGiB#;MCS2dD`8zTLpKWZ* zF_SxvgsY<M6-Bzo1>TbxByQy|$-BkPguV7s!m!+SIC`!e2FYba3QNIE@ef%E4mV0k zyFGq{Ou*%cJ45)D)|dYNQnVdgmmjG|2q>V>vF$KTkFKgT$K0RqTSz)ln4d&AAYkIO ztb}{$$5oP8tS^_!6HbEA47=7jb|<dG_gK~D(P93l=GrtG#iHFYL`F36d!_YNR9cjD zENw?5H#t$y?=PU2o2$87Z@Q!Nj7rJsqOny<*5!`J>(f+~oeZDZa@9yoATS0u8-s_` zR<WUcR<ZRZR@74b#hX)mJyzN<33z8THSu7c>_#EXRoj+E^ZC4RwtF$0z|GgQHiK-D zsXVNkIi}-UN*FaH)o?Sl(D7kL*d14BbK2~kWyB;}mJP{TUtXLv5hq>ar$Rx!Lb435 zdslyWTIAuFC9q7hhtxQ}C-C<Xy*v9H5B(mdJ=w6#Qc>eDKM+$rf@*JH=&(6;l{*j| z7JJ!?)e33?Qf=SRaXhFp-Y6(?Jl5=K6oD*?vHC1ND<)q=#*OL^%CV*ewEErTLK`vL z-Zi10O@4oQ;jT2~LV2(zBV8jy(@ieC{{B$3?K?ZE)XvT-Pv_>p^p-riUI|sbj+U$w zE*sYY?>JIjtpFze#_}fwUA@?iiQuMAO^M;na7Fv09n#1#343GtWoDb!m4px&v-Z22 zIMkjj4igTHOb*BnliLR!=S<vO5nO)URBCS#{7jW@&ivLGiZeW`MCp-ub3+M*iUwAW zh^>f_ts>?h$>xb`9}kD|T0c@LYwnoZe?d>Kx@Eka+PyPa(zD_?@r?<(`Y@+EqZ}$Y z=`shwmL+C@R_zAEbx#W1kaIMKwLN^jZEi;HuFEmKRgDl1dWd(GWpQ-!qasPeB$c?n zFt8X}YAX@h{_PS2qn6a<L|mP#JJG#%{fMuz^-5^$ZS%n#<q_l$mT2Y4+QeKPjw@dz zb;R+@P<w9I8b6($gOi3<8D33x3BS}z%zO-!E^>b~-+A(Agd>Myw9NcdS_0dN#o|fA z{N`#)Qjy_+ZIp4m=jo2o=E-P5i&nwah}!Ydc6w&MU}FzGF`PiVF>Y4TjAkgKLFZ)q z^n%;^#6{=jB-w|f$kkz5i)htI2yfX)d<^bx#VB&Rrocik>Tsqm$E)h<i>+|@+?T?8 z5V^U|@7=95WC3N}?AEN$I*4su$8C`u^PQ1Yl}}|SEmu|qm<4w;OTXEUc{;IXfu?>Y z&Ssd1)F`uaC6nkR=0V8hsGO|sV+(`rmdMnCMTv~XN35cY>q+Rzb0__|*G8%o3{Zx; zR>A8{KhN0C*QXRgXx{x*0SF^a!D9B#x_cv+mC=u*M<#WoI8KVG)3H`83uv`EB&&dk zkMnW_ZaMSX9A)wiRu``<ddMLTHmfx-g!_Qw*(w5A#XG)&fCv4kUhyipShCb3zv`K^ zf`j|P^q7-j(oikbNh4RYMu%wJCB~h{eBG?b{5xH-@Uis1MHkt_QQnfp`|TbOMnTzQ z36H2k@d=WLssvq{449X17BxE<+Xd!om#7kSYM82(cSqfeq<39K7fMtfNVb*Ap~HBB zo|tE)kB=QNA#Tw%7vYs}F1;z|J=)<L+Sqv{j6=j3snuD~vIb?>PWL>l<U9Jh#j@PF zvDpa^m7cN-Te(dXMlFu=M0q>uBCVnl_2`Q?=O8OQ65o>>)84mcfDlcQ)tcq)-L4#t z#F6EIviI{D{3?268T|Zm@mx$iaD`=%cw~=aKPKjOv#uM@J^#(ls9Q4lIhDbBDAZzo z1Nwead}n0GpvChLAo4_)zkq1himml&?MI7hJ^s_BVqAlx>H?{s@gvKZ>3X8B#nj<0 z0!OLt`wg||RB{t&z13#KyrL&@xV4{1(L0#eN6Rh4y5`k(-)tGS5++E0YUmb>Jfb66 zLr_33h@MuRtk=V-%*vLFdOFrp&oA(la}+vAGSuxgQ>i@B5h15Q?Rz(SpCy~sfDWnq z!Q&{wU9sC+s`j`$I|$WA49U_O1S~&f>pPqhX|$Xq7GI{))2&r|^k!CJOQe;_?)dh> zfvaM{Ggjhj;}&ms;<()<2|5mYkSqh;q(1=xy4S^HPL{X@-P6n~?dF0v=jh%cvHas$ z-WuG53CmXTTgAJTHD{S6NJp_WV@N?pD{!xzha|<n_R7G#rMhOKuqkrR`{w1Fj2@x0 zEm5ObbnH`^4c{&t;)ESm?Up)^?+WQg?R<f4%AaN!>}ipS9}<+NNgYyC-_nrdaa?`2 z+Zw^>bCbQ9;J*4-0cJ>9joSm~D)*xo35R%{%qKQVM$DznUr%&bTnsOU>`x=x<ydFq z^P!>{=PHWb?d5v&agl`X{2gxIyr%O4y@|QVrkX*vxfvT<rwkDDD5>Mu4~<eXDZ~CM z@a?crv^Z09hTu?hV5xj4K1YkwD#%%ibEG~U>tlxJ;Tz)z;!qddTa;F{o3T-$@MJz# z{nt3Fsd8k`0}Bl2jcoY`j}HVNs;dHL6R%yaJ&P7;<A{DLQs0cZ)NjRbOzPPcu~}aW zO?TR1yS@Dx@jikFX~f`}v|#4zF|l2ow}lPTkDNX3(b3=C51fyOJKR-A80eBrYBbc7 zzseZg=!_x!8K#;#z#N$zZs>RnN>;ZI?7oWwbA>$rTtiO<DIZvCWrA-MJ0l{+wxuHv zsd^^j#Bj;Vy4zJU&0XJ}ux;@=8+|5xc=***zSMC0>vHQH;c3O|c*La`Mj2)$lEKNZ z7$U0C=caS0#dB!KwpkG0jtID4JS~`Imgh?PQZPb*??7QVnolxnZpE%<r9h%saDLiM zW`v$y3mIz@K&zPhdV@#5c)`FW%Hx6IYkkfy{wIBDM#;mf)zjhH9`6n7FJIjIBqY<9 zG8S&hVHdiH`(PvV#4BhljDWZECP6farI}r2=Wp_ukmgf%eSYJXKXbbs${IV5!AJA0 z=>rA@1?bB`QkXeOv9l%}Vs-IB?gZzEw<5V$J-)a7V(+NXB&dyeE?s6ZVeD$Mh!uxx zU8@nUi2jm?(D->PeuX$w-PeG?I;cant3_ZTS%<JVr&=yuV+Y$gv8!YyB1dbkiGjIe zw%X}OpU6+1AuA&uqci81SnbNfL|Q|rVs0<-ekCn%Hpcx{-YoatnZNP^hz~{fWypTL zO;lsi{v^vb%_*zPBDzc3)^l(DJg>^5=lhFvNzozg%!M<<0bb0PW4SyS(qACA6pkm! zbeVK~Ps~?Y?XYPG?+kS3q(@y=Yj!g%EqBgXg%-?qKPaHTHui_uj`HpU{g!J0&MJ4e zfEv0F(ljiVV_e*J^B=|^iUr)+9JQ*Wa+k*|$k!^DtvyC+RW}0|GhmEbP*9S%Gabo% z9rSuLOjEqbr6mNvdTiK6$?CMgM7-Tc@o9&cz1YrG;P8c94@J=pfx`w238SI!NX=35 zt(;M8R$XIZ+QOr0GQ#UN6CJ1f(U73~9s(-T52(tc5DRgfZ(ATFJfo59_p|twh{pzd zugWE`ty)wc7wuC$aO@>b^JLPvf4I96@p#KK#B=b3WXpEN1*h}c-r8J+#_VG&xt%p? zT{og}dUnGMN>XDv%{ZrRk>ZybT@F>#-HpkQ;;V3?hn&TlYq)`zxG1xD@-2nMZC!}l zaof6sIgBPycO_ieBVU)}1`pHwyPJ4uSxkv`w-9ivzPAo6TZhamJEE7vC#AnU1d*#{ z2gBaIRQSQbu|w6><7e}T*3)8GY+d9j#m|V?V*8ot|1;Vig8z+dHuO+Ipir9a{=tx5 zU{oDR%4tMjy&=Gn-5BK`UhyMf3{gmVGJFhRHB^8(LKb<;bF87Kp(l>lNivX>KNWBx zp!f@-IGJ4<hXB{lZ7%CX{}+Uen#%F+NR1oy??{_8%Pk=q#q*QlCW!v5dw}h#++wuE zMCmrKV{WI^y)}TOkD!)`7LVsM4BzIk&<C$}tkY`_kbvbw($ou|_kMaNvJa4o#~aW` zan~x6(DLK`TzXxrkR^U}>{$@aCFT3%+_rNO^PoOpRzh#(+BTt%yBeGNaF!O?SyrXL z^@buW*Coqa2GXF@S2~+<*eD=N_`D~4&dGc<m$^}5<WPywv-e!;gc+Sq(T9a(S*P;c zd%!4*0QrG;T?q$a8aP_JPCGgSPqUd?`ZHayl_t(7pBGninI8U5z2K@59bL7=2r|c{ z#BBXLwl8<{-8!+C5rKR=FQsoCzwM`sRO2bPpma=1%N?Gpq;ZkjmsCmn0v$J~S7Me_ zZ<5|@yDaxHsg4`e9z{FuSmFpZ&pOSSzenjUjLXeWFx;etCMPSmX2T83!@>vs=|;P~ zkr=T4#tx%gSU8b^?R%!|Fba{(1vuS2>-Dw5<179LLbdTM3Z`LQRQ#(JCh#lyuuob1 z)bm_qtchGd^Txo*%c4nqn0+1{OFW8Yeyy2zH3(2xe7#AXwFg%GORDgjONyYx)EN*Z zSO}E@z6RtF;DA%QO3HV?pk~t-Pz*>BFzcKF>aURU4Xx^?Jn{cXnwEb{15~8~z&9Po zlk}*g9hmNB6S37hB&qw9_XYDS=Cduq9G<X;BcW^_+Iaw;%i)*~|5k)UCNM@iGkdzI zI~ZB2m473YV*;pwxmKElFhEbC2mra%TIH7Ekvc9C053z%T(kZX#Up^KR1Oq8sTgP0 zYx=<PF8h&!3_uVk2ixN0&$ma)^(Py3$8%JmxG87>j*{<SA%(@`=!I)OsQ!LuDd@bJ z%D2_Qy16^)*$yg$^#K`(V$BO18kP|j#F7{6u>B3Q%0aNgWql#ImV1_X*c=ZgQ#Afe zdGz=1Q7lFQ8v3-Axolhj(y59q8@ZYd32kG}n#pgw?~OBZPv#Z1hK!J+Ye>9+Lod?< zd{;I8(}q`vc)5OE+{Jc>hKIN9JJl+jX9R6WFx+oQhUW}~lr-36d>9NbayU_pOJKK) z$i*gc94Nbyo{^1wDRrMJTvxG~DvWT{O=@bK)=z(X#@{VRzEE-|53x7Qnqkqs2-1pQ zd18iC=6A$!AvaewL%Y~>p^xq0okp%<x(J)q<w(ty^p)@JYlKeH+yp=aSo_u=%6Txk zi#=h+TFPTVaBJ=uFXt_j#H@9^--24Msox=EsyKPNB4xvb!)3bG0d}hul;N+;0Gfdo zP$d7+*v(|J)_pVK^hm6BZ~F3Zt$Ve<!tweS+_L6OEOEh;Jw21rvOIsiMaLC|5kQTI zA~_)`D)3ez+22Lchg7fC(u0k=&M5Y2pLetNa5WTACrE-i^x3&c-3U;kF>-YE4%gEe zBfyLooFw8yO{CTiFtq@S-a23Xv;mEnxlcXTQF}WrEQCvKtS;X@ivT7c0cx>_IG+H# z-W(9V$m-Rq_AbP3j~LmoWfRm@towZW?#Mcks0<VTPQTLTm|b@(fGZh*qHPwtd1+eZ z%pl{}#{l483YCU;Colt2nlMmo>GuRtN?eR3L*_giJX-{Jz_?cN<UG#F;<dprN{Ida z!Z2kI36e;4kHYe1op%y&E}8o+$#CYUZ`Y~AN+NTR!v1k58pSLP-;b;0_S**XF9jI3 z#Wr@l(WG)DXcdrUc#wU8`fPt)6&;1h!!cM4+ZbH@61Ji7y*G)7BBr~wB)c0<{+!$s zigmz>GVGOxBppaSFC{}HFU?S!YWIFA^D`h$k;ssZGso=({Fjo8y=g0jJajyilwSoL zkD22ZDYq9h5~3X#i^RhgV`qHdj{~|F4v(~kZ=l+I*ely{y?Ui=G*vlE5yh7y2~Nag z_#KC|*=f@PC^8zSY3aThPQT?yNh|ziN`94gJ2d503eopL&i5S2$dTpAy1M=xH95AC zJUgn2kXpwD`R%sOd<&O^Z*3*{q-iLkAO3GFqxG4qIZ(+-XE;d@XDKy_>>80k20zn{ zw#n6&Q&eOYan0Cn*Bxea)8|ix^4WKLzCxm+uTjwYctBD2@vcdYq}U@fYh@+jjWmzr zgW;!XNW6jT-&_h(BG{istM`(|5#1U{jk^ee8Ucv6MGZh@8#q>D$%abuqzY74Xcj(i zG$$D85o^!bvA4C|j!hZ)1}5{a+>vvTsf{SLKWV+%X)VBnaOHe<u&tVH9#P&F%U3eV z)#wcQlntO-O25E&xZ;*o@6GUB(e3lar|($m_F0jE)3`4r`7Ar0{A<T4FXU?f_jw-W z@$fS9;pb$A?Gc?5G&gm7*&Xc#<o&f4gWO2+a-rOzlKGhSGixb@EI2_++8I3Bx^Mv* zx->vJF<cQ%?--#hAnVfE)1a_I%LAbQyywk#SH~?9mC&Q}w93n@h;V{T**p%m7nA)M zO?tV-9o|7LVa|kjQX}JBo+n30nM^y*1<LY~aSfV+PJlO&j%I7^noMla=+vsd_A?vt zGadiaRJdl1UGZF*M_41nx<5WO+Ol?kUUWu^sJxdeGTn6zs#cPbjwEux6mp=*0M>G$ z9HCtAi;qnA^UdH3RfN%Of^kJG9?g%`qHg%+KoHJxB?&-sczhN>osEfF8Z16(#8v6u z6t2Kt;tIDWAWk_1Un-ZiFOEDwG3$Xcj^SsUJXv{9x*=a?AiMck{m%}Gl3>mxz?^1U zPYvx_+8`=~B_R*qq6ilt0}~E+{<V?L#f7`yiS!wCYil46BnUBJVaje2gyy}Z={z#2 zNWOuoG%P8H1-H&<_LV!y(MCsHs^%6jvp|02$C}fVLyj_b>nS0i@}Q7sI<6T@nmn$% ztN0LaolwNb)M?XvcWrnte51Tl$F2>U0>1-2T&+$6L|mJI{6`$rL4n=*?jU{yN{*Ia zO7cv;e9{b&n7qmFvVAR1<k742!q9vo0$zvJvEf=1`%I7EyQfU4$$k$OW5iwkOxF}~ z;{TDu|4}Ld_U0X9V%*+ffv%OFIMH%HHxGoia4)1Onr*NYkUWf5mk4>I<%{T}_@?;9 z9D34+_{B@n6X{JpZ7uYqAhYsi3og@`;41RhQTuzE_z2>dE`4*CA<7-_%1H-PD(ucW zY>H<QO5lCS&BK*FHS(g6P}i1S_>;zM&6G`SDi}s7Hk80q3s7xLV?2QrAjVR7zQ+H? z1^s<|g`T7F1R4RL51t!0YJ@2z_nrz%pr_DE5b^fK(3`9egg>`(vgkWRy>@rY2UM%5 zuHoVck^FQCe@|HG+(cfG-nnyJgA$^Tlu^=2?f~-k=>fb(e?ZcI%Pw#i$+@E2aOxNT zPWJzK-v7bB*Lz|xJ$c-^=cF4-qQyBZ*%^J}f5c~0<z8cQtQqxS9_KWRf&Dk`?dQnr zaZzOjkM1b~T<AKEcgyAA&3XFn_Idx)AvE{H#%7k8YUbsc(wxZlOqkBP|4YS7Kit8; zCjJSnf$MBBUpygaW0U3}dFR`@{HnDF`ouxx(6wq<tHY1)?<t?1S#M>+M7VJ_=XuQk z`sl~!{nx;{5G}>tIQ#Lxz9>RK7U6&U?@zmW`sLxVf9@sKr@&@M;rUR6E(}^_(kRq? zaB%PfYVcW109EIbrCylapQ#{{tyaK<!u0`KuvC}I`)9xaFC)y00WO1~V}GWe|7Z%3 z<gmEyS?^E1!bP!qajbvK)8fpMPkL!A^b#d%06u;qUks?xP-IJImxJpn_u@cKBoz1Z zWvP{En;-qLaj`*h*EP!FKSHS;Qx7UrQAboUSrmIzj|~uL!5qn5&k`W=LY|pffGY;N zvplTy_9_V-N(-QFH_%Ly5iqVmz0<xcpUr#%?`fBURcpx4P%`*ky$agMjU2!$S603N zxZGaXFQ|x`gH0gA|Aq+HDK9Cn)@lBT_En77_c`iav^T*%2tRQA4bi*?N(CZyJv0Eb zmWfZAjwjO{6hCunyw}wN7~-Q&xA@t6y9l4EL$^kQh<?u~;Mx$>wfqAyXBSgV7_|(M zSXh)W3Lm(ExqZM6xLvB{`$Ta0DM4~Fpzd<_*=e{#Db%fSft}#-@3Rxjkm%h5RF~Z5 zTswT$RNfItW4%uEwo5vU9S;>P_bLXv#8Z8I|2J35)GcpNa4HFC*X}6kTtX37Q&J_u zSfTkpl7F#`Le~AmD`J1nU-Lyk?WE8a$-MS)QxV0FPfmLt8o%h^f2KO7%t0!y%TiGC zH%Ang@Dvyg-u3Ggz;d@2b*4pO^@3u(bh@{z(qWuGhGmBuR{6?(?qB$^saxkE^{>yp z)Qk3edDp9+{nCPiKjwV?b-!_xe39Xkb1kLdh!p-2w!gotuLea@P=wU#*;@bC7eKdw zA?9B4>^{M-w}Ey3>#ts@c}-<Hxwrme_xk(MK=rtR3|(d*$CbwafgEKGWWRRunJXuS zyrm4&TF8s>n9gFA<TmG_vP(N5|Dj^Zg{{M!ye9#{0-LSI=?tidG*O}hb+qw7;8JvG zc3dR><2~eDZLal!7$tqi#^OBOWHt?frjJ!nW9-IW*ik45wJ+L@rRDw;nK|3_1@5I~ zWXkpihOGfk_)JDu<7k`GnX3BnmcN)f&K9BvtdKL!Ubs-9Ta>|RaG!??4IK(;{X$Zx zAkZa_^6#gEUyFj`%elBIHMBY3xgf}4;J!*+<`uA{Q$REXmK^?b%GZEUg*m;{#SUYP zh6Kd%(PVVR?&i2C+(wBj<UEvV2{n(ugB@Uc-o`+(YHl1!l5<%E^)n^Nsaj3I)pn9u zz<|A~(Oe+?sO9?ai5$K8%G<DpVVR>U&S5S{Y4qjZalWPUMW8Y(NY6t_mmCxd0{`<> zo<JM{2L7Jl^_FN_(Iu4*W+_#R-B2P06gyiz|DS)Wp|W1wG_W#|slBM~jUwj+=kwcd zmCZ*74o^y~{yaSzqbXrHx|nQh*KxCZns^wXV814ge;#^uX-B@mj}oJX_LKP+il{Q< znAc*W&RcA=B#CIix(EWm2vnVOs(h00=2o|0I|!?#fv62F-g{r)5EOkpAPGwY)+~#~ zNXbo-?yjFwJmm@Y@3=rFEBLy20#ly7iH@qrzFu)GuN*G=#LbK3*FK`T9QPp-b#Qm8 z#D(i)&{U-6BAnYDTl@4pLvQ<)-=N%~cJ!JfxqX{9!SkdN#g3G%ob{YcEk{*`DQ2S0 zMM{DQbQL&S^E?ej5pDs~AQf-{7CmqD4byL^{WS_B)F^TvWp&k|rCl-zJqX`yU!H^k zzI58d=_4y9K9pd`(k8<Ap(l$D@&!I%9T<a{xWswbs#=*2cG@?`H;*nzT?}y{<`>#r z8!Ak}c?o<<c@E35`}dxF2m;n}Qx+6U0)!V$(Bp}=`zMmHF=gRharCb);DQp_7s8~j z%MWQ)vcrz{W&&+Cr?G#Ya*PNe>!&J_BUsTw?OMLA@n4K)BLz97`m`i3XzpZzy8z>p zm(FgHktB@^2_=Pf3dWKO19@@8a*&<c+d;D+`x9UO-XR98!Bm&;#41<1W{l8?ZpMMC zeH_E32L}L_>(?b14WeQnqh({cdaz^w&D!JE1i`xPwMkuY!7>1R^Sfa&vLjH$4wBcJ z`+!aEF?w1IheZeolJa*6@cpzxyzBAExro$PNUTc-);h-5?$hYiLGIakOp?n;d$Dmb zlBA=r`U|}Qg$v%9evz~Av=~adrI*`gx;+@UXqlVJ1N3NtA2fre-ClJN%Mlt^U2|w9 z<%I{vC6_aBZ>DiEUlmGpTp1yFw8jbubjVv?W8X*xff^Jg^<h<)43EQ7f6mL4hK3%` z6XR|LoG{Z*>;PGgJ>U8SBVT3em`1Q}5Hft$47mORI4=iJQ{*YTFQwwj(&LsFP$qPb zQtEbUn79N*1oLs@ojhL|W(_3<8(^)6d6k6s-d2QV*z|s}ct-l1s1JAOHEXe_AS|M2 zUx6i(kno8s9iCZxq0}iM2fpyp`+{N^8Sg#oJT$;R7K&ob1@`X>1y5?N=zF~Pr1_V5 zR)&kk02W`*XV`ORK<)i%`{j$2G~b-`GiDvX1AiZNV*opH>5IQe4<AjUXYBZ7axTN< z3-NR&b(+RY^Fbr{ev;~Mx8r%S&-7*%rS+;?>QSL##`2JBN7ueOR61Un4m$(K-g^?Z z94dZ;+@I_w4$gOaqr^JS8i?o0@jei+=IxvO0B!;p<M_Hvx)TJMK`<l)M7Y$mRr5^M zpjP8mrP2uk{9PV@?eA2K>C;lDdYCFY)|~HrP{PR=t&)c}g@GSD_!8$_q<NGG`UKWF z5blYuf8Y1L$g$mH_|tJvKW&0s6<eNx$M*LGM|f$fXPCOHzbxcaqiVYIO0r{s!pr27 zo-*0Y$AHvt7R87Ff<8mj0_*kY0Qc>j1qjKdH(2#so}wpP)oi?l)GRI!7jKR`O%CHD z^c<&ukyB&Dp7VT!sU52H4ChXXg}fqBR3imJ{uuq_X_01c#^s35`$ePQk+(%eDD{k8 zT%{727@vZJFO+>*RHx!TP_qSNcSU`=*95G!?=p)@<k{}eM&+|pYNZD$Gt*#RH1`gV z!IkPGdOVBNeEd4m_-P#>AH)^*St{RE?c`vr)B@n<d&?}eXw~v#-8IltKxv%K3Xxp_ zRO*cQ2U1l6C>(V(ON=Ri<N34$@ymwxuD<~e%?k@z|ALFg<Vl@*RI^<NjRxIGtVPdY zHp8xaug$q{P-JvHiPm~8`q2vmbv27ycwgHRk%{;~F(08*6m6!KG<G}9q|{dNz8rPW z8!PdPdoP9ji=1Bw9tex<J-aO|EG+8twYnGZAwh5(cPfCJR%E}ZhywI4xTS!z^nREI z`3jKPwxS5w5rcUkGPxm2_`=uy%CDMb6lqVufzzR4wb`|A^}@k5Q7bD%jz)xMvI+(y z<R#>ecHg`z2@QaP%EXLqX>cxI4h2yP>T=?OpFnpZuZy2PSa`9q4g6>&@y9Fr@tt=C zP`@)S>nMVw-&fL~@6beni}3&d`~UK)DJr3?;}CFL^fRErQFIJ^Oo=ddXzfq)n;uvY zl@?;Hzun*Fi^k_D07oN0XCpqcDE)1KlX-+FPP3ydlwFi`c@Qh0sJ_o8SkH_BIMVI` zS={oglE((W7Ai1uf!sT@<G8edL0dc;*!!D7A>g|4Kz6uv9M8bRxwJ&osa8aD;qOBb zof)$A!$7d&#y!G*6CzuG5K0hm*GI9GPSu}p4vPXd`#CghY(QT8zkkhr?TSx0l;C1a zz?8nzXL=KW4yP|Kph>%s^wnqTz<xSQDBX>+UVqvZUS25}fC85R@VlT|=<sHb-8>74 z1M^p^K+lE$=d5(Wtp4d@0b@u2>INFhu;?{iSsbe@zQbeR^3Wgy%<$R}8bH4zB6RAu zdD3C5KfIDHu#7x)I9b0mBKg#PZxESnTdO-|0t|BDppAqS2%^sca^f&>?SrC=)RZOR zX8;}NiMj1k^1Shqt9vgZOs8PGDh<XA4fwIAM<V1yg4vH4{~X0w%4>iu#AgtM0kr`6 zh#q<h;35HB^MlvO9TY_rRWXj#g<RjN=Bg`zE*uo#UJgbP#RlJfd{oh-jAF;TC=G05 z@8Q+{-z5C&*ynNBwwDIlC)|>SZle8G0py7ow^YgGJ7o-hOVlqJ`5`D&K;Wnve!GYN z^o%gVKpx-A)ROKGdCounfC&tP348V59}Ql8F#t>1PD$e*Z~T1#t$~y8AYuL6as2HX zpKbejFfg{n=$N+Oq&dH&;mmjQk^;Le_0sj<AARvY7})uNF=dpT{EIHs1_BMi8~ZK) z|9G^J5EvLv=6rh5KYsn&Wt;+5+EU2W@5AuV=c7piH7mr<8UEWz|K|WAh2#Mb{4B_0 z<ip1<Bzl$A)#CmT`+vO6D-`pc9e3pppAs^xsq&>{1OqKVPw#XLw>Ac&jhq|^kpG8E zhFU#Y0`ji8*}*O8VI?B?rKREGjGB`JL_9ZdCBS8l>P}wx55EVsIQ6Y)Un^tBT;ge6 zC1<oBp)z!L_+A8^%Q8A5iS(;|R&u=KF7zKBDQd>C3_`K(t$A>d;R2d2{4fwLiV|?I zIy&0w-ULY{sTVIQ4yh<EBoKac97GN}!jQ1t^FJ$i{@xKlTVumSQ$Dd1IUdIq3CR-x zz)u#ZRqa-gI_l4dj0)7AOk1ZGTsGD+<27?d=vjE4oz&lZaVCv`4*hH8Q4)Ru^y(^D zD@aCf%K^v{rlNv6V&75CumBBwZhxK@tn~8kRYLWe7lk#OZS;US<9ZaE37!RF9htiK zkJU##Kj_mroBY?1Ba@trY3+v%3WNbzB9Wjy2#Nz8G_L{7ho1m%x(MiIa~}j$99Np4 zA{c=9o>ABHxKuipOCdQq*}T3Q<YMt|>ht38rV`xzm)M<nC3s0#%>L%}iFbBXw<!AR zqp(EOa@8rUpgR!&$4q7mD2${)j%c=>xh@R6dcR1iK2l~>Y*b=YYE))aZd74ZX*9gv zxW4Z3xqk{G2-G~q05Vja1to!3Wy6il^Vv*#Tk^^$Os$N%VuQh;M@ZAEHr3|Z!qWgh zcyF!-D=Of(P@CF+y#jP5LUonvBIB`|;L|8I4F~@#x>^Y*-JcDWqf|<l&Qf~N^`q_C zKQ?3U9oSGZlXv>QHYqdO5?Eq-kt*osMCN^?fHZjy^dJZa?Cw(KmgBR)rdO=<a3>ZW zI0QFhAMZnscpoy|Dtn2OeK?s$iE%I##c3VFY9wpYll<mrx9&6?ux^5ay4!qiszqn) zR{xyvk;s(hjP{6$yx1JeC7A0<{D@6H8#R&Z@c0tSUzkT_2niU1fX6<9=?U5l>AOa% zW+^sKL^5irg5wBZ%|ct<135$h{wFrK`UVJ`Mki3@U!b=F709-S0qSuHka|o5zWI40 zkvC^b??`UyXVUq&;JM}C!q05)SjU?$Ka`@lI?8j3ROKh4IeLE1Dh>b#wn>I*y)e<r zm%dikz>u}K;8pYSDH4UoPxHYEN2VW=@Ysv91(n;*N%lOOK>59>@(rN;XVYUWLqe#e zMqJ%<%R!*vf<1=Ly;+d;0&SGazK($&9;Re#Ak*(lz(@z2CVU(=khY6M3V=wd1UvRw zsrY{ixwa1wKZKB<!@Is|ZBp!jrtCWROz&#omX1$o7rgQD@xwaeu$nNp;t`uKpY$*z zLwq^{?LLO4valo}oH*$bv`S3^PIEK;t~ef+AWFzKlobf!bg#9V6yRm31)0g|DibSt z_gwE;&=e#?HOBT|G;RP;S`H3d`%1Cx^bI{ZtzWVB=#(?bK}xkNj@Rhbn~`eeS8rVE zfWcioeSpFT)6q$O{`{E|RYi~x#y9BBUXj_{<eA&OLx6{O_xkng$#d4@z*?dw`ZfUH zAVYAt%arRPW<bj<6mi`OX7(dp61;-l5qjlU4VqW~MV)wgtz9<Gea{u?`L)tg-I^_{ zyc7$o)F*RdnkEj9-I2T(zs7#N8ZGRA4><$4V4E>GAO(%Mj#WrlJ;<b&-pM~_F5I9D z;}~a_ieLy~)~)@Rm}6;2vgWc}<usR-ll;Rf_~)&Faik_R^9U&7zFL9ncVv8}(0%jC z^%M^`h<=7J{&_jpqLlBhCQZw(uju>#c+&45|3XOrt#W@I8Zr>cUV7y({IA0S_rf8# zBcWCuw|_tH9}oEx0{F+Te_!tFwE(BKMr?=mKYaWMT+jkT_iz5ooq!r3pn10LKWvKq z9~wNn$%ES;m*djof4P`Y<Ng0rH~O{B|FQo6kL@}+IVQDSJOjAmLV?~A&r(dAJ>H$% zjeb=Z-){C){}+FqD*3Iy8#Dvy??VH;IKd!}^0l>0x6T9A2nsk5cCjm~0vj;9O2p@l zpSm=t<{ZCRDCcwBzZY6OsUDC}Mo(Q&aNCr4IXXVPPyn}Wey#V@P@WnAma$IEjkE04 zFP$uO3DprbWNPBQg`73qZ0w_Y{CkVKCi5F(jD>tRM&qASoB#6r6Rv}!%PRBe(O+kC zoy;2*E>Ms9T1Hc`#cnCh(EYVcSFa3vH3Ib@xd%5mep=FA-4{W^A}T$R{MW0&4Zasx zpZMriDk$Nzp$p@*(gD4r#A7YuUrZOkH(%p8|5QIhy=V+AVI{Z)e;eiX4i{(J!leLn z2o+EB!eE|O8X(7X^rjwPU7Q8~U2<dpr>R;$08~l=$1_x0q2F%A3n6l#CQ*I*aA(8Z z2u@t`XU)1ufBwN#z_~9=<2^I#e=qJI$+pe~N~W2E1oKZe?$3wdJ14NrRVmGdf4%O{ zi^-?dfes3=;JFm=4-4k^U#x;<au5srwQ0Xq+mBb&7lO%<jN0G)9~v-^q4p?%wE5Sf zi(v|jyrklrekrzP?_#)=#Prh^ub~PO5aD^x*Iidv=nlGp0$*V26g>L4&OeLd$3g{M zzaK;&dWX+t<l!9jI;IM)1I3RO1w^K?`^ByA?`714L+@?<_yENd16XG`(%=4=HrJEH zO_@sl_O34hv}^wNK^xP{Kb5W(_RRuyb>te?EGQ(4D){li5z37|Eq}=VvtQ{$v{I`s z8eSw>WT;UWZ+gcBLncqAPgT$l(OZuY8jfz9TaVWR&2lTsWxr>-4WRnHf}Gb0N`;?} zekA&_0wC}B=}H3t4?Wv=7$#^A8;-$Lxv(Qo`11muz`KYo!>mFS9_o2Aw4A5JMW^c^ ze>TzonvdjE+0vUiz>!k){FqcMe6;V)z(LL{mtP|)6AFK8Ft=$CY+>f;e5foCS2sBM z;2r8?@&_n~^a-z$)DLmGb1#VFzW;VjaZT=Ujhw2*2>he1Yf+-6RbCxW=7nF2bQvQJ zCuDvc(Vp*rs4wPqB9yf=c)+=)s@wkx%+i}8Xue3oTS3M2M_XRtgyC`7vS?FFYtcVT zx}EyJ+Pm_2D7!YySRz>xd6i}CNt!}3REii&2&L?8$S#x+hO!h{#+JQkkg{Ye%NT7h zV;R|!T?{j1ov~#9&a|ob&F}m3`{(o5Ge0xudCqyxeV_Z>_jRtzw}caQ$dFNjd%e6a z$1QBF^ionXi!zM8<O#H_Fv#NEF}`o*!RooK$%<a;);cR^Tatu^hwb8G3L4hdoulvv z%h&RAIe7&nrM=}M_rYb&VS+V4Kbel2t0-vRBlB&J_zSxTjiDMWpCf$1p;AC~zOSsv z230w7OfUQts+oO+R>^*iNy&XY3``>vHbG^P;06p^hO=32<YSi18m)(wO;031O9S>0 zo{ar<If1(y9Wl&Y)^X3g>bZUDId%@(ztg$qiBAiSj7I1p`WvvAtcG0IH?AW_>Me{} zI@f&pfJNhfPu$SosV<}F7dozMc6tsJV<zD4Cc0^%?zehngVFISo-*3ax0+vYE*2Gj zK@FM4ZlxODnh3{5-?vHyt08<n*H5xd91};(3&gv~*1Z~)YztGzojp)NkW5x3@5G5M z-XmU`5z9KfcNkI43M|=a;Myj#_X_8bGbVUPC9O>i-HB@GbP=k5PGeM;0c%X@z7eyT zp#x;b7^6V&uP$-Jp&<WN>Hg{YzB(GfS?$usdW3D0YylC}majW?>$`5^09App?!L+Q zhm9Dubv(6f-cy=E*u((_0rz=$T7k;^^_$=P_7R9k{UaCo+t>d4pbuobb%&$=5b}e^ zK?2E4L~r#FHJ|wp&r1CWL|$L%6HEEUHu3C$eLTF}zvj^<9Ww*-;r}oEUxPF7{}=v; zxpw@2Y~iAR@vUCNu@OIn{AMdiJtniy{oH=5#eYlGX$yTf6KDbbtdd5+t7c<u5BfOz zlHdGB1Pk>S;K=;v8Mo-~!NXVVjqeuC0}6>f{*{|}Kqdu%AIokvjU@lsTC1;vlqhDu zJliJwtt=KZZa$3rXdyjXb7<B}{~L<yyJ>4!(XLjgtXFC59sO(@@MT#<QpDm%`eurW z<Piy~&bAFa4`xRL2wz4ieQ>F=UwtXEpM})FW62|M%_r(iOMEMuJq~aZh?VT#$Y=;~ zzn>CV;urNF$kyn+$3S>$DPNDS*Icjr+{_vEQ~HzYc)tW9*Z3d#>5=-mac|Wfr;E)d zP=%y!D_3}eMW(O6s@RWVZfBTP3ie%iKLtI<fGBbI_#oxP0-x`0cO5)+GKc2@<Y$yf z^<}d3vr}7El~kfXPu(MESyWhARn&*EkJNWYf5J`RKmV}9>gy~d57t%uBTek>$7K!% zDrKWR%0=rRC0UFnqabB6S_#6P=&M!xP?B;fcLM3P&j-14+D%3;izz&+?EE1<{IxMW z_j@e#wMaUlXOYDf-;>6Sg(|TpqwZIP*H?+yp!M5TTGDUmGi$vvOJ7>3A(z=(H99AW zBC4JlWS=>PGZf9bW4$dZvS4;Tu5X1E)pNjym}Br`iJ6W;1}TX&F2sbmMa}Q@l~-Y# zP~7V+FBo}wi>}tYB{bTrXzP51R{AUba~FkSW--#<dUfIyHR8aGo9l;LGjQ)?b$w}} zFQLrAM&<~&ui5<pIoj1`sePg;SLBp~tQt5RrYP3z(Jdp0!lbR%hbT4Z`%h47<)xR` zCE@Pl$;oUHF|9VRT1iSoldX5fg{irI)=b;GLPOND%m5EWa`A;Qn!AdFS8VwOe;me? zt!_qDLTu3Cak4Ux5V6tc&f*L4s49NRqpZt-(3Flopm71e?c&H5RM_Z*&-syUsQjBw zlp#$ET%3}2@~-5={t*~ccFmUwQwl2$o^X$0i?lS^ra6mz7>LlBw$ZL0JS5s?rj%!< zJgbO0s%Ip5)6fEEDf}YEzD+F3!KJN4<Qsa~U&tjF<Ik3eB*kMLWH3SLkIkC-Q14bQ zM;~mXH`K`&V13pV#kllwp3J;W>1VVEdIb01(`u~k$MyUuwqf;2hRry;L>EPBpLVv~ z*m-SNLgU`2JdQC~9*0PX_&}71Whv=G$msRd6VBo<?WP(pvzAh^#{OTxayk?`{WV5` z>eHqmCX3*^Ma^9z#}#jyjGfyHm3EelBdt~b5`7?R7#gP0bAFDoK=V#Iu$~aT+Rd(= zRHY;8HXkOS%*_k*VAfegUqYkT&n10};>{wCm!1-8$@dZSCP~UxMpcvM_PA1kU*DQV znnJ91WxJMWX;GZ!tXj$Z1|J*rPhDt})@M_PJ_G?PqdUdW6SxKFFyw^wWZZg>QJp|- zWvk@E5Yt8+(8NSIOo_1Ts&vh=kr4$YawZM1oYQuWpP^Q}T=bw73EM1pgkE|{tZn{r zXBx;P^J8YMH!9kb+g;@#v|#TcH_-o0{<;IkaiuEkS46gkG@!R?p#RFO@n6Fj=*Kd( ztba#P9JLTQ*@~4gX6ON+!bl)%V9Dq6{wR&+&W&gK^=e=rZBV<?Q_LRepTo5gC4#G) z8o&bwLvd8Wl0QU5$<#WX@r0V~CPAtyc>hP~HRXT3<;J@PHwOWc9ZYMJI-UTvq$Q+L z_)j?W_tnydTB$Sg);Ia%qj5|}f?$pP1nP&H`>(zc^h|+Tsw?UWZTZ!!Z}c4*3}QJi zCX~aUx(zZh#*kO|z5CJBg$`m$&9*~!L+^G)_*Uw3=7R&4KRS$zre8}eQjcpi|J<sU z*ZeG?&B3BMt6t+1m~Eb*_qg59w^03uA%sq`f6Q=rCh&Eol2sIp>$c3s^WHrD@J#F_ zgL0E=>?5SIXY#opC(9aY!A{WNEb`*qle(sjy8LfL0WAT2$c#He{B1e@`4vF522jH} zE6JN|Aq>C>UA4ox0ZRYlP$UDJU=J)w{#o?2n+@H0|D25_`KAdKJWy!gr0d;UL(LyR z;nbcn&nQxR#sMU%mQHFBS*pg2#QhZShA6-=6{S&Lu`Knt9W|HiW?y-WJXVPcBM-4# zT3%0<%BNCP0KEV;$~6GxPqd=c(k&E60<8QyLKeHc^GeO+0^!X<O=q5-(Ms9*#6AP{ zv2&8b6N&9Hc4)Ucd)2f!?fCt;kodH_(SGA@tUlJ&XFZ>9By2&XVp41`d|A9Q`YKv^ z<x0Sr97Ek*rO%}9Pi4aZ#~Dh0>V9$mq055Bw)N_gCdaTx6iJ^xCRw%E2zE^@CHCzF zq+90Ry;8dmJBJhr>VcVnr9YqBhwX~)0{8?P77}a-?m7|&%Ut)0Rau%9l5rp?lx1AB z^1OE14+sTtb-PhgI)Wd-0#ym~agJ86$d2<b`$yJAn*ckC@1k1~Jz7V~_I69xMB;kL zK|$?aQ|F?l2>zqOK9kN;P20xB()3LKa>LtN`iX-Bgi&QhnVqSR9$n;}um@~~QF;7{ zTJZv_gyyVZ4VQ9v^73oX7Ayi`IBC}6T@5YEM_5)&6%YmE0n@>ik4Zxllv4?XZwXCw z8&jg1>*c-?>`BGj;j1pimCI{;JUyqMy2dX$?dIYVEh4V&S?4EH)mu#%*>~-_JwL(T zuaS8wVK^(zrXEg7k=-ZPP?g#5K^bn8XvHQwLUQ7V7l2wtT}PT$lJ`_(TBFB!0K?XI zgje8}(}J{K;Y)g^22?G*<1LI^w4ZaL^UBeh(dw?mMi}h=UsB4t%UYQ}vc`<8r2X7a zKSXX>K6a5V77!P1#|+oT)@Y4j$w!>m0uB~-77_~<uUc3+<?YGs?v?WPm<aPU_eSa_ zDH^Bp%Di@3_QcOV=nxO%6?&%~Cu4aUp#cufrqgx<P8eKdhk7?G-?-4ah}a=>Cjptm zc-Gvi<vZx(n;naaasUkK(Aq-k?0BE4VkripqM{<2vM98Mk8>nM1q;OLRejOGTO{B$ zvH8A-hj#O>w1vt)Eu#?M;s7T00xnu9AL!a%ZPl+@A}HaaM6y<<TG<E3Ye3h39|mE3 zaQ)#ly?Y}1#b0y`C~>9}rEwm8(v&U_RMwJ55p5kW<y=?wm1H{9O;_^UYjD>u4;SC9 z6*|bf1>sW<o*k3F%IWsDrGKRUNwkE+`!n8wYX`31^LeJ^&{tq&*X}5~EBk(mV&B4r z@vI|1L|3Q=s|Eo%Qk<a#+BTy*Uor1f?)~BR7eSqHjr!Os<DKg>NmR|4NxOF4ozjbE ztI}q2i_0>4&(@U5llJ6zm3)>h?qhg;6ym!FtOo46WA_Rnj}L53KBO9SY}fh?K4g&2 zWC(Nk7>iCLjMR!<HLHuu7Y)3}6;b5usyEmqlA}5#aZ6r$q+klWcq*~<W&Qk;!?liH znF41XIG|v;QlHw&s3U8G+f@W(|HT_m->GiCjBu1U-ti@GG*Ni0CpI+$2-T@4_I`NH zhIVdW(e)%e@pbKSr>RYq_D)yBSzC0MUbauqrvM4D-@r!K=-o9|!Wf<oI)ttg8b%Gt zV=Q`FfWl;aP@_L-@kIBHaZc}eQNeCFq9iMO6khJ#!RA@e$}cmS(lI>eA<?y{=9jpb z^7s%XMm|s90FYCQj=g3`uo`h6Ys-DX1?cLMDGN`@mNOlkodr&@?vs7QoQ{th%OLW& zD};f}T~M)7GN>o%ROR-!u6Cn`j!xiKu2M=UK6N>R7anUgmiX?(bp_uuZ43#vnE_+2 zP3@s~%gLP>oA?+h)4sVFfH|3#rSf4GF`^a0v;|nHa+#Gt7Hi$i2y8Ss>yG+#drMuj zNH9uK6mNe6-+W|oyfUNR?nBi4f_rpsQb)JXh#7NO_^!joK~*!Ul}q!%H*}jv`+b}& zVP`WduR`T|PI(C`VJLrx7TVj)UON5!1?8`esKDQT`<~Me9}*g(w09;-rVdK*t6Qd@ zXI6^HmO7wlO;`pe)bs0WFJ@2~>tq~9Ud*tEdiuUT#anWr8D{X@?A-%LDs*z4^C2<Y zuSBBc1dTrp&-+vWf|SN;o#4?kDV;sM2&iM!ZpRxJ4M$RmhbayB$S~#Q?8>7;ib&6P zf1E>YGz?2R?W@z;5V>S+ZS|hf`T<JH{J`*N2L?0VU7;;NqCB{@*tvx~E7CiWehNSh zVw=RPBoy^VwVlJR^Me`uW7(#G+}%2^TyV}PNgt8Nb!q3~KEs@6vp&-oJ?9!Pl0Ql8 zc>Knkf1+~9GU3T%_jgMkfDV<2S--K=(UNYfZR`HoG4IWAz$m=ybJUhAfNbN2>6tSz zDVAr5AC+&CklTDF7$mJT(_7$L;GDof8i<iri_D*J1HgB7^~`0&V;@S_xprUtpdX>r zpI!5fxHLM}_?4mIhi9FRkp{%=j>~CzE!m^|H@r`u9=yGE5SAI!+aOln+JG%~?KCjH z<g34afxIm#__H6Cvw{+_rZ6D|IE6LA@<SxA?7&PEc=sZRP@mOa&Gb<9cY2z!B5PGg zHd0#Ce*SVOb#cGBCzvujZ^OF=WXh~1IxFFC$(FE4FP}CS&&4@XEJ@a;PS_bk&MUTU zw_r<ZHozv~A%Y3vkmrVUMHjA~zxv?R;S@&qKyTKNzP{4uy<+F^JqAtt9G2RUCpZ&@ z<mN9@J&-b|#${jDvT?-RqrG78k(Mk+WbFL6k@zs=N<%5H(H5~z$Dn3_ztF$ORe{6n zk2#t5r4(wYEBDp*Iw)*_ovIOE<1Af)V<PCMXa`#T6jgUhX(K0U|H*qvpJr$LdKS*i zfxv0Mv6~Glv60tlO45*g0t84Tc%lh8naUl_beeWzd*W%mW}4xLUEe0c3KpZJPRkMW zh^Fh2h1zL8Ou&MN$IPA<It3<vJ2J#vb-mu`sy33wKO9n`Yn9Lu&R-&Y99mwz+>0aO zhDDAeX=owzOdQaS3up=QO>^52PwKz^gFJ3Q8=T>31B3tbH=zACNFSfhQQuF@9A7ey zFW=JG{<F!D{VpjUw)SmZ5sq!SojkM<L3#nspf^vDJFtE<;7?Oc_hg>Rg@FG6Yk~rM diff --git a/interfaces/_docs/stages-ordering.png b/interfaces/_docs/stages-ordering.png deleted file mode 100644 index c4fd8e869a692639b3050a1940bc572309cb3ad6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 12190 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 Gqy8IwjIkO3 diff --git a/interfaces/_docs/stages-overview.png b/interfaces/_docs/stages-overview.png deleted file mode 100644 index 629820b86e3d8a5e7910d3d74f32e6e58182b41e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 16305 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 diff --git a/interfaces/_docs/stages-rpc-methods.png b/interfaces/_docs/stages-rpc-methods.png deleted file mode 100644 index e8f1e7967fb55b851ba58b4f4a3769a6c303c202..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 19284 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 diff --git a/interfaces/build.rs b/interfaces/build.rs deleted file mode 100644 index 0818fb1b17..0000000000 --- a/interfaces/build.rs +++ /dev/null @@ -1,45 +0,0 @@ -fn config() -> prost_build::Config { - let mut config = prost_build::Config::new(); - config.protoc_arg("--experimental_allow_proto3_optional"); - config.bytes(&["."]); - config -} - -fn make_protos(protos: &[&str]) { - tonic_build::configure() - .format(false) - .compile_with_config(config(), &protos, &["."]) - .unwrap(); -} - -fn main() { - let mut protos = vec!["types/types.proto"]; - - if cfg!(feature = "consensus") { - protos.push("consensus_engine/consensus.proto"); - } - - if cfg!(feature = "sentry") { - protos.push("p2psentry/sentry.proto"); - } - - if cfg!(feature = "remotekv") { - protos.push("remote/ethbackend.proto"); - protos.push("remote/kv.proto"); - } - - if cfg!(feature = "snapshotsync") { - protos.push("snapshot_downloader/external_downloader.proto"); - } - - if cfg!(feature = "txpool") { - protos.push("txpool/txpool.proto"); - protos.push("txpool/txpool_control.proto"); - } - - if cfg!(feature = "consensus") { - protos.push("consensus_engine/consensus.proto"); - } - - make_protos(&protos); -} diff --git a/interfaces/consensus_engine/consensus.proto b/interfaces/consensus_engine/consensus.proto deleted file mode 100644 index 2bb7d1703f..0000000000 --- a/interfaces/consensus_engine/consensus.proto +++ /dev/null @@ -1,163 +0,0 @@ -syntax = "proto3"; - -import "google/protobuf/empty.proto"; -import "types/types.proto"; - -package consensus; - -option go_package = "./consensus;consensus"; - -message ChainSpecMessage { - string mechanism = 1; // Name of consensus mechanism, e.g. ethash, clique, aura - bytes mechanism_config = 2; // Configuration of specific consensus mechanism - format is specific to the mechanism - Genesis genesis = 3; // Description of genesis block - repeated Fork forks = 4; // Description of forks (upgrades) -} - -message Genesis { - types.H256 chain_id = 1; // Chain id starting from genesis block and until the first fork - Template template = 2; // Genesis header without values like "uncle hash", "tx hash" and "state root" calculated -} - -message Fork { - string name = 1; // Code name of the fork - uint64 number = 2; // First block number at which rules of the fork activate - types.H256 chain_id = 3; // Chain id starting from this fork until the next fork -} - -message Error { - uint32 code = 1; - string description = 2; -} - -message Result { - bool ok = 1; - optional Error error = 2; -} - -message Template { - types.H256 parent_hash = 1; - types.H160 coinbase = 2; - types.H256 difficulty = 3; - uint64 number = 4; - uint64 gas_limit = 5; - uint64 time = 6; - bytes extra = 7; - uint64 nonce = 8; -} - -message BlockHeader { - Template template = 1; - types.H256 uncle_hash = 2; - types.H256 root_hash = 3; - types.H256 tx_hash = 4; - types.H256 receipt_hash = 5; - bytes bloom = 6; - uint64 gas_used = 7; - types.H256 mix_digest = 8; -} - -message Transaction { -} - -message Block { - BlockHeader header = 1; - repeated BlockHeader uncles = 2; - repeated Transaction transactions = 3; - bytes total_difficulty = 4; -} - -message GetAuthorRequest { - BlockHeader header = 1; -} - -message GetAuthorResponse { - Result result = 1; - types.H160 address = 2; -} - -message VerifyHeaderRequest { - BlockHeader header = 1; - bool seal = 2; -} - -message VerifyHeaderResponse { - types.H256 hash = 1; - Result result = 2; - bytes finaliseCode = 3; // Code (in TEVM to execute at the end of the block to finalise it according to the consensus engine rules) -} - -message HeadersRequest { - types.H256 hash = 1; // Hash of the highest header requested - uint32 amount = 2; // Number of headers requested -} - -message HeadersResponse { - BlockHeader header = 1; -} - -message VerifyUnclesRequest { - Block block = 1; -} - -message VerifyUnclesResponse { - Result result = 1; -} - -message SealBlockRequest { - Result result = 1; - Block block = 2; -} - -message SealBlockResponse { - Result result = 1; - Block block = 2; -} - -message PrepareRequest { - BlockHeader header = 1; -} - -message PrepareResponse { - Result result = 1; -} - -message FinalizeRequest { - BlockHeader header = 1; - repeated BlockHeader uncles = 2; -} - -message FinalizeResponse { - Result result = 1; - types.H256 miner_reward = 2; - repeated types.H256 uncle_rewards = 3; -} - -service ConsensusEngine { - rpc GetAuthor(GetAuthorRequest) returns(GetAuthorResponse); - - rpc ChainSpec(google.protobuf.Empty) returns(ChainSpecMessage); - - // Core requests verifications from the Consensus Engine via this function - rpc VerifyHeaders(stream VerifyHeaderRequest) returns(stream VerifyHeaderResponse); - - // Consensis Engine may ask for extra informaton (more headers) from the core, and these requests are coming through the stream - // returned by the ProvideHeaders function - rpc ProvideHeaders(stream HeadersResponse) returns(stream HeadersRequest); - - rpc VerifyUncles(stream VerifyUnclesRequest) returns(stream VerifyUnclesResponse); - rpc Prepare(stream PrepareRequest) returns(stream PrepareResponse); - rpc Finalize(stream FinalizeRequest) returns(stream FinalizeResponse); - rpc Seal(SealBlockRequest) returns(stream SealBlockResponse); -} - -message StartTestCaseMessage { - string mechanism = 1; // Consensus mechanism used in the test case - bytes config = 2; // Configuration specific to the consensus engine tested -} - -// Test is only run by consensus engine in the testing mode, and allows the test driver to inject the Configuration -// (which includes chain spec) into the Consensus Engine and reset it's state -service Test { - rpc StartTestCase(StartTestCaseMessage) returns(google.protobuf.Empty); -} \ No newline at end of file diff --git a/interfaces/db_tables.toml b/interfaces/db_tables.toml deleted file mode 100644 index a23bf28fc3..0000000000 --- a/interfaces/db_tables.toml +++ /dev/null @@ -1,49 +0,0 @@ -PlainState = { dup_sort = { auto = { from = 60, to = 28 } } } -PlainCodeHash = {} -AccountChangeSet = { dup_sort = {} } -StorageChangeSet = { dup_sort = {} } -HashedAccount = {} -HashedStorage = { dup_sort = { auto = { from = 72, to = 40 } } } -AccountHistory = {} -StorageHistory = {} -Code = {} -HashedCodeHash = {} -IncarnationMap = {} -TEVMCodeStatus = { dup_sort = {} } -TEVMCode = {} -TrieAccount = {} -TrieStorage = {} -DbInfo = {} -SnapshotInfo = {} -BittorrentInfo = {} -HeadersSnapshotInfo = {} -BodiesSnapshotInfo = {} -StateSnapshotInfo = {} -HeaderNumber = {} -CanonicalHeader = {} -Header = {} -HeadersTotalDifficulty = {} -BlockBody = {} -BlockTransaction = {} -Receipt = {} -TransactionLog = {} -LogTopicIndex = {} -LogAddressIndex = {} -CallTraceSet = { dup_sort = {} } -CallFromIndex = {} -CallToIndex = {} -BlockTransactionLookup = {} -BloomBits = {} -Preimage = {} -Config = {} -BloomBitsIndex = {} -SyncStage = {} -SyncStageUnwind = {} -CliqueSeparate = {} -CliqueSnapshot = {} -CliqueLastSnapshot = {} -TxSender = {} -LastBlock = {} -Migration = {} -Sequence = {} -LastHeader = {} diff --git a/interfaces/p2psentry/sentry.proto b/interfaces/p2psentry/sentry.proto deleted file mode 100644 index 551f56d54d..0000000000 --- a/interfaces/p2psentry/sentry.proto +++ /dev/null @@ -1,141 +0,0 @@ -syntax = "proto3"; - -import "google/protobuf/empty.proto"; -import "types/types.proto"; - -package sentry; - -option go_package = "./sentry;sentry"; - -enum MessageId { - // ======= eth 65 protocol =========== - - STATUS_65 = 0; - GET_BLOCK_HEADERS_65 = 1; - BLOCK_HEADERS_65 = 2; - BLOCK_HASHES_65 = 3; - GET_BLOCK_BODIES_65 = 4; - BLOCK_BODIES_65 = 5; - GET_NODE_DATA_65 = 6; - NODE_DATA_65 = 7; - GET_RECEIPTS_65 = 8; - RECEIPTS_65 = 9; - NEW_BLOCK_HASHES_65 = 10; - NEW_BLOCK_65 = 11; - TRANSACTIONS_65 = 12; - NEW_POOLED_TRANSACTION_HASHES_65 = 13; - GET_POOLED_TRANSACTIONS_65 = 14; - POOLED_TRANSACTIONS_65 = 15; - - - // ======= eth 66 protocol =========== - - // eth64 announcement messages (no id) - STATUS_66 = 17; - NEW_BLOCK_HASHES_66 = 18; - NEW_BLOCK_66 = 19; - TRANSACTIONS_66 = 20; - - // eth65 announcement messages (no id) - NEW_POOLED_TRANSACTION_HASHES_66 = 21; - - // eth66 messages with request-id - GET_BLOCK_HEADERS_66 = 22; - GET_BLOCK_BODIES_66 = 23; - GET_NODE_DATA_66 = 24; - GET_RECEIPTS_66 = 25; - GET_POOLED_TRANSACTIONS_66 = 26; - BLOCK_HEADERS_66 = 27; - BLOCK_BODIES_66 = 28; - NODE_DATA_66 = 29; - RECEIPTS_66 = 30; - POOLED_TRANSACTIONS_66 = 31; - - - - // ======= eth 67 protocol =========== - // ... -} - -message OutboundMessageData { - MessageId id = 1; - bytes data = 2; -} - -message SendMessageByMinBlockRequest { - OutboundMessageData data = 1; - uint64 min_block = 2; -} - -message SendMessageByIdRequest { - OutboundMessageData data = 1; - types.H512 peer_id = 2; -} - -message SendMessageToRandomPeersRequest { - OutboundMessageData data = 1; - uint64 max_peers = 2; -} - -message SentPeers {repeated types.H512 peers = 1;} - -enum PenaltyKind {Kick = 0;} - -message PenalizePeerRequest { - types.H512 peer_id = 1; - PenaltyKind penalty = 2; -} - -message PeerMinBlockRequest { - types.H512 peer_id = 1; - uint64 min_block = 2; -} - -message InboundMessage { - MessageId id = 1; - bytes data = 2; - types.H512 peer_id = 3; -} - -message Forks { - types.H256 genesis = 1; - repeated uint64 forks = 2; -} - -message StatusData { - uint64 network_id = 1; - types.H256 total_difficulty = 2; - types.H256 best_hash = 3; - Forks fork_data = 4; - uint64 max_block = 5; -} - -enum Protocol { - ETH65 = 0; - ETH66 = 1; -} - -message SetStatusReply { - Protocol protocol = 1; -} - -message MessagesRequest { - repeated MessageId ids = 1; -} - -message PeerCountRequest {} - -message PeerCountReply { uint64 count = 1; } - -service Sentry { - rpc PenalizePeer(PenalizePeerRequest) returns (google.protobuf.Empty); - rpc PeerMinBlock(PeerMinBlockRequest) returns (google.protobuf.Empty); - rpc SendMessageByMinBlock(SendMessageByMinBlockRequest) returns (SentPeers); - rpc SendMessageById(SendMessageByIdRequest) returns (SentPeers); - rpc SendMessageToRandomPeers(SendMessageToRandomPeersRequest) - returns (SentPeers); - rpc SendMessageToAll(OutboundMessageData) returns (SentPeers); - rpc SetStatus(StatusData) returns (SetStatusReply); - rpc Messages(MessagesRequest) returns (stream InboundMessage); - rpc PeerCount(PeerCountRequest) returns (PeerCountReply); -} diff --git a/interfaces/remote/ethbackend.proto b/interfaces/remote/ethbackend.proto deleted file mode 100644 index 8b9d79f7d2..0000000000 --- a/interfaces/remote/ethbackend.proto +++ /dev/null @@ -1,63 +0,0 @@ -syntax = "proto3"; - -import "google/protobuf/empty.proto"; -import "types/types.proto"; - -package remote; - -option go_package = "./remote;remote"; - -service ETHBACKEND { - rpc Etherbase(EtherbaseRequest) returns (EtherbaseReply); - - rpc NetVersion(NetVersionRequest) returns (NetVersionReply); - - rpc NetPeerCount(NetPeerCountRequest) returns (NetPeerCountReply); - - // Version returns the service version number - rpc Version(google.protobuf.Empty) returns (types.VersionReply); - - // ProtocolVersion returns the Ethereum protocol version number (e.g. 66 for ETH66). - rpc ProtocolVersion(ProtocolVersionRequest) returns (ProtocolVersionReply); - - // ClientVersion returns the Ethereum client version string using node name convention (e.g. TurboGeth/v2021.03.2-alpha/Linux). - rpc ClientVersion(ClientVersionRequest) returns (ClientVersionReply); - - rpc Subscribe(SubscribeRequest) returns (stream SubscribeReply); -} - -enum Event { - HEADER = 0; - PENDING_LOGS = 1; - PENDING_BLOCK = 2; -} - -message EtherbaseRequest {} - -message EtherbaseReply { types.H160 address = 1; } - -message NetVersionRequest {} - -message NetVersionReply { uint64 id = 1; } - -message NetPeerCountRequest {} - -message NetPeerCountReply { uint64 count = 1; } - -message ProtocolVersionRequest {} - -message ProtocolVersionReply { uint64 id = 1; } - -message ClientVersionRequest {} - -message ClientVersionReply { string nodeName = 1; } - -message SubscribeRequest { - Event type = 1; -} - -message SubscribeReply { - Event type = 1; - bytes data = 2; // serialized data -} - diff --git a/interfaces/remote/kv.proto b/interfaces/remote/kv.proto deleted file mode 100644 index 1ee34111a6..0000000000 --- a/interfaces/remote/kv.proto +++ /dev/null @@ -1,88 +0,0 @@ -syntax = "proto3"; - -import "google/protobuf/empty.proto"; -import "types/types.proto"; - -package remote; - -option go_package = "./remote;remote"; - -// Provides methods to access key-value data -service KV { - // Version returns the service version number - rpc Version(google.protobuf.Empty) returns (types.VersionReply); - - // Tx exposes read-only transactions for the key-value store - rpc Tx(stream Cursor) returns (stream Pair); - - rpc ReceiveStateChanges(google.protobuf.Empty) returns (stream StateChange); -} - -enum Op { - FIRST = 0; - FIRST_DUP = 1; - SEEK = 2; - SEEK_BOTH = 3; - CURRENT = 4; - LAST = 6; - LAST_DUP = 7; - NEXT = 8; - NEXT_DUP = 9; - NEXT_NO_DUP = 11; - PREV = 12; - PREV_DUP = 13; - PREV_NO_DUP = 14; - SEEK_EXACT = 15; - SEEK_BOTH_EXACT = 16; - - OPEN = 30; - CLOSE = 31; -} - -message Cursor { - Op op = 1; - string bucketName = 2; - uint32 cursor = 3; - bytes k = 4; - bytes v = 5; -} - -message Pair { - bytes k = 1; - bytes v = 2; - uint32 cursorID = 3; -} - -enum Action { - STORAGE = 0; // Change only in the storage - UPSERT = 1; // Change of balance or nonce (and optionally storage) - CODE = 2; // Change of code (and optionally storage) - UPSERT_CODE = 3; // Change in (balance or nonce) and code (and optinally storage) - DELETE = 4; // Account is deleted -} - -message StorageChange { - types.H256 location = 1; - bytes data = 2; -} - -message AccountChange { - types.H160 address = 1; - uint64 incarnation = 2; - Action action = 3; - bytes data = 4; // nil if there is no UPSERT in action - bytes code = 5; // nil if there is no CODE in action - repeated StorageChange storageChanges = 6; -} - -enum Direction { - FORWARD = 0; - UNWIND = 1; -} - -message StateChange { - Direction direction = 1; - uint64 blockHeight = 2; - types.H256 blockHash = 3; - repeated AccountChange changes = 4; -} \ No newline at end of file diff --git a/interfaces/snapshot_downloader/external_downloader.proto b/interfaces/snapshot_downloader/external_downloader.proto deleted file mode 100644 index ca245a3ede..0000000000 --- a/interfaces/snapshot_downloader/external_downloader.proto +++ /dev/null @@ -1,40 +0,0 @@ -syntax = "proto3"; - -import "google/protobuf/empty.proto"; - -option go_package = "./snapshotsync;snapshotsync"; - -package snapshotsync; - -enum SnapshotType { - headers = 0; - bodies = 1; - state = 2; - receipts = 3; -} - -service Downloader { - rpc Download (DownloadSnapshotRequest) returns (google.protobuf.Empty) {} - rpc Snapshots (SnapshotsRequest) returns (SnapshotsInfoReply) {} -} - -message DownloadSnapshotRequest { - uint64 network_id = 1; - repeated SnapshotType type = 2; -} - -message SnapshotsRequest { - uint64 network_id = 1; -} - -message SnapshotsInfo { - SnapshotType type = 1; - bool gotInfoByte = 2; - int32 readiness = 3; - uint64 snapshotBlock = 4; - string dbpath = 5; -} - -message SnapshotsInfoReply { - repeated SnapshotsInfo info = 1; -} diff --git a/interfaces/src/lib.rs b/interfaces/src/lib.rs deleted file mode 100644 index 9c0e43c207..0000000000 --- a/interfaces/src/lib.rs +++ /dev/null @@ -1,166 +0,0 @@ -pub mod types { - use arrayref::array_ref; - - tonic::include_proto!("types"); - - macro_rules! U { - ($proto:ty, $h:ty, $u:ty) => { - impl From<$u> for $proto { - fn from(value: $u) -> Self { - Self::from(<$h>::from(<[u8; <$h>::len_bytes()]>::from(value))) - } - } - - impl From<$proto> for $u { - fn from(value: $proto) -> Self { - Self::from(<$h>::from(value).0) - } - } - }; - } - - // to PB - impl From<ethereum_types::H128> for H128 { - fn from(value: ethereum_types::H128) -> Self { - Self { - hi: u64::from_be_bytes(*array_ref!(value, 0, 8)), - lo: u64::from_be_bytes(*array_ref!(value, 8, 8)), - } - } - } - - impl From<ethereum_types::H160> for H160 { - fn from(value: ethereum_types::H160) -> Self { - Self { - hi: Some(ethereum_types::H128::from_slice(&value[..16]).into()), - lo: u32::from_be_bytes(*array_ref!(value, 16, 4)), - } - } - } - - impl From<ethereum_types::H256> for H256 { - fn from(value: ethereum_types::H256) -> Self { - Self { - hi: Some(ethereum_types::H128::from_slice(&value[..16]).into()), - lo: Some(ethereum_types::H128::from_slice(&value[16..]).into()), - } - } - } - - impl From<ethereum_types::H512> for H512 { - fn from(value: ethereum_types::H512) -> Self { - Self { - hi: Some(ethereum_types::H256::from_slice(&value[..32]).into()), - lo: Some(ethereum_types::H256::from_slice(&value[32..]).into()), - } - } - } - - // from PB - impl From<H128> for ethereum_types::H128 { - fn from(value: H128) -> Self { - let mut v = [0; Self::len_bytes()]; - v[..8].copy_from_slice(&value.hi.to_be_bytes()); - v[8..].copy_from_slice(&value.lo.to_be_bytes()); - - v.into() - } - } - - impl From<H160> for ethereum_types::H160 { - fn from(value: H160) -> Self { - type H = ethereum_types::H128; - - let mut v = [0; Self::len_bytes()]; - v[..H::len_bytes()] - .copy_from_slice(H::from(value.hi.unwrap_or_default()).as_fixed_bytes()); - v[H::len_bytes()..].copy_from_slice(&value.lo.to_be_bytes()); - - v.into() - } - } - - impl From<H256> for ethereum_types::H256 { - fn from(value: H256) -> Self { - type H = ethereum_types::H128; - - let mut v = [0; Self::len_bytes()]; - v[..H::len_bytes()] - .copy_from_slice(H::from(value.hi.unwrap_or_default()).as_fixed_bytes()); - v[H::len_bytes()..] - .copy_from_slice(H::from(value.lo.unwrap_or_default()).as_fixed_bytes()); - - v.into() - } - } - - impl From<H512> for ethereum_types::H512 { - fn from(value: H512) -> Self { - type H = ethereum_types::H256; - - let mut v = [0; Self::len_bytes()]; - v[..H::len_bytes()] - .copy_from_slice(H::from(value.hi.unwrap_or_default()).as_fixed_bytes()); - v[H::len_bytes()..] - .copy_from_slice(H::from(value.lo.unwrap_or_default()).as_fixed_bytes()); - - v.into() - } - } - - U!(H128, ethereum_types::H128, ethereum_types::U128); - U!(H256, ethereum_types::H256, ethereum_types::U256); - U!(H512, ethereum_types::H512, ethereum_types::U512); -} - -#[cfg(feature = "consensus")] -pub mod consensus { - tonic::include_proto!("consensus"); -} - -#[cfg(feature = "sentry")] -pub mod sentry { - tonic::include_proto!("sentry"); -} - -#[cfg(feature = "remotekv")] -pub mod remotekv { - tonic::include_proto!("remote"); -} - -#[cfg(feature = "snapshotsync")] -pub mod snapshotsync { - tonic::include_proto!("snapshotsync"); -} - -#[cfg(feature = "txpool")] -pub mod txpool { - tonic::include_proto!("txpool"); - tonic::include_proto!("txpool_control"); -} - -#[cfg(feature = "db")] -pub mod db { - use once_cell::sync::Lazy; - use serde::Deserialize; - use std::collections::HashMap; - - #[derive(Deserialize)] - pub struct AutoDupSortConfig { - pub from: usize, - pub to: usize, - } - - #[derive(Deserialize)] - pub struct DupSortConfig { - pub auto: Option<AutoDupSortConfig>, - } - - #[derive(Deserialize)] - pub struct TableInfo { - pub dup_sort: Option<DupSortConfig>, - } - - pub static TABLES: Lazy<HashMap<String, TableInfo>> = - Lazy::new(|| toml::from_str(include_str!("../db_tables.toml")).unwrap()); -} diff --git a/interfaces/testing/testing.proto b/interfaces/testing/testing.proto deleted file mode 100644 index 54c3f547bc..0000000000 --- a/interfaces/testing/testing.proto +++ /dev/null @@ -1,27 +0,0 @@ -syntax = "proto3"; - -import "google/protobuf/empty.proto"; - -package testing; - -option go_package = "./testing;testing"; - -message TestCaseNumber { - uint64 count = 1; -} - -message TestReport { - // End of test signal - bool end = 1; - // Indication whether the report is about success of part of the test, or failure - bool success = 2; - string log = 3; -} - -service TestDriver { - // Returns number of available integration test caes in the test driver - rpc TestCaseCount(google.protobuf.Empty) returns (TestCaseNumber); - // Ask the test driver to start the test case with given number. As test case progresses, the driver sends reports via the stream - // Test drivier also notifies about the end of test case via the stream - rpc StartTestCase(TestCaseNumber) returns (stream TestReport); -} diff --git a/interfaces/turbo-geth-architecture.png b/interfaces/turbo-geth-architecture.png deleted file mode 100644 index 2c79f75f14935d8d8289bc9609ac768ce7fc1e56..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 179413 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≥y$uTJZ7Rzv2PR7cU2c8ij14 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 ZI>h4Df3C)A4+Z~Sx}dI@d(JHIe*v_WqSXKZ diff --git a/interfaces/turbo-geth.drawio b/interfaces/turbo-geth.drawio deleted file mode 100644 index 25efa8b23f..0000000000 --- a/interfaces/turbo-geth.drawio +++ /dev/null @@ -1 +0,0 @@ -<mxfile host="app.diagrams.net" modified="2021-05-31T20:49:24.226Z" agent="5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.88 Safari/537.36" etag="mctbxAzxZBowRkaTvOLr" version="14.6.1" type="device"><diagram id="m-PmoF4Tlt5Ric1QbK7F" name="Architecture">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</diagram></mxfile> \ No newline at end of file diff --git a/interfaces/txpool/README.md b/interfaces/txpool/README.md deleted file mode 100644 index 0ce884239d..0000000000 --- a/interfaces/txpool/README.md +++ /dev/null @@ -1,45 +0,0 @@ -# txpool interface -Transaction pool is supposed to import and track pending transactions. As such, it should conduct at least two checks: -- Transactions must have correct nonce -- Gas fees must be covered - -## State streaming -For transaction checks to function, the pool must also track balance and nonce for sending accounts. - -On import of transactions from unknown sender, transaction pool can request balance and nonce at a particular block. - -To track existing accounts, transaction pool connects to Ethereum client and receives a stream of BlockDiffs. Each of these represents one block, applied or reverted, and contains all the necessary information for transaction pool to track its accounts. - -For applied blocks: -- Block's hash -- Parent block's hash -- New balances and nonces for all accounts changed in this block - -For reverted blocks: -- Reverted block's hash -- New (reverted's parent) hash -- New parent (reverted's grandfather) hash -- List of reverted transactions -- Balances and nonces for all accounts changed in reverted block, at new (reverted's parent) state. - -BlockDiffs must be streamed in the chain's order without any gaps. If BlockDiff's parent does not match current block hash, transaction pool must make sure that it is not left in inconsistent state. One option is to reset the transaction pool, reimport transactions and rerequest state for those senders. - -## Reorg handling -Simple example: - -``` -A - D -- E -- F - \ - - B -- C -``` - -Transaction pool is at block C, canonical chain reorganizes to F. - -We backtrack to common ancestor and apply new chain, block by block. - -Client must send the following BlockDiffs to txpool, in order: -- revert C to B -- revert B to A -- apply D on A -- apply E on D -- apply F on E \ No newline at end of file diff --git a/interfaces/txpool/mining.proto b/interfaces/txpool/mining.proto deleted file mode 100644 index cdb3a3f2e1..0000000000 --- a/interfaces/txpool/mining.proto +++ /dev/null @@ -1,103 +0,0 @@ -syntax = "proto3"; - -import "google/protobuf/empty.proto"; -import "types/types.proto"; - -package txpool; - -option go_package = "./txpool;txpool"; - -message OnPendingBlockRequest {} -message OnPendingBlockReply { - bytes rplBlock = 1; -} - -message OnMinedBlockRequest {} -message OnMinedBlockReply { - bytes rplBlock = 1; -} - -message OnPendingLogsRequest {} -message OnPendingLogsReply { - bytes rplLogs = 1; -} - - -message GetWorkRequest {} - -message GetWorkReply { - string headerHash = 1; // 32 bytes hex encoded current block header pow-hash - string seedHash = 2; // 32 bytes hex encoded seed hash used for DAG - string target = 3; // 32 bytes hex encoded boundary condition ("target"), 2^256/difficulty - string blockNumber = 4; // hex encoded block number -} - -message SubmitWorkRequest { - bytes blockNonce = 1; - bytes powHash = 2; - bytes digest = 3; -} - -message SubmitWorkReply { - bool ok = 1; -} - -message SubmitHashRateRequest { - uint64 rate = 1; - bytes id = 2; -} -message SubmitHashRateReply { - bool ok = 1; -} - -message HashRateRequest {} -message HashRateReply { - uint64 hashRate = 1; -} - -message MiningRequest {} -message MiningReply { - bool enabled = 1; - bool running = 2; -} - -service Mining { - // Version returns the service version number - rpc Version(google.protobuf.Empty) returns (types.VersionReply); - - // subscribe to pending blocks event - rpc OnPendingBlock(OnPendingBlockRequest) returns (stream OnPendingBlockReply); - // subscribe to mined blocks event - rpc OnMinedBlock(OnMinedBlockRequest) returns (stream OnMinedBlockReply); - // subscribe to pending blocks event - rpc OnPendingLogs(OnPendingLogsRequest) returns (stream OnPendingLogsReply); - - - // GetWork returns a work package for external miner. - // - // The work package consists of 3 strings: - // result[0] - 32 bytes hex encoded current block header pow-hash - // result[1] - 32 bytes hex encoded seed hash used for DAG - // result[2] - 32 bytes hex encoded boundary condition ("target"), 2^256/difficulty - // result[3] - hex encoded block number - rpc GetWork(GetWorkRequest) returns (GetWorkReply); - - // SubmitWork can be used by external miner to submit their POW solution. - // It returns an indication if the work was accepted. - // Note either an invalid solution, a stale work a non-existent work will return false. - rpc SubmitWork(SubmitWorkRequest) returns (SubmitWorkReply); - - // SubmitHashRate can be used for remote miners to submit their hash rate. - // This enables the node to report the combined hash rate of all miners - // which submit work through this node. - // - // It accepts the miner hash rate and an identifier which must be unique - // between nodes. - rpc SubmitHashRate(SubmitHashRateRequest) returns (SubmitHashRateReply); - - // HashRate returns the current hashrate for local CPU miner and remote miner. - rpc HashRate(HashRateRequest) returns (HashRateReply); - - // Mining returns an indication if this node is currently mining and it's mining configuration - rpc Mining(MiningRequest) returns (MiningReply); -} diff --git a/interfaces/txpool/txpool.proto b/interfaces/txpool/txpool.proto deleted file mode 100644 index 61bce1b0ce..0000000000 --- a/interfaces/txpool/txpool.proto +++ /dev/null @@ -1,61 +0,0 @@ -syntax = "proto3"; - -import "google/protobuf/empty.proto"; -import "types/types.proto"; - -package txpool; - -option go_package = "./txpool;txpool"; - -message TxHashes { repeated types.H256 hashes = 1; } - -message AddRequest { repeated bytes rlpTxs = 1; } - -enum ImportResult { - SUCCESS = 0; - ALREADY_EXISTS = 1; - FEE_TOO_LOW = 2; - STALE = 3; - INVALID = 4; - INTERNAL_ERROR = 5; -} - -message AddReply { repeated ImportResult imported = 1; repeated string errors = 2; } - -message TransactionsRequest { repeated types.H256 hashes = 1; } -message TransactionsReply { repeated bytes rlpTxs = 1; } - -message OnAddRequest {} -message OnAddReply { - repeated bytes rplTxs = 1; -} - -message AllRequest {} -message AllReply { - enum Type { - PENDING = 0; // All currently processable transactions - QUEUED = 1; // Queued but non-processable transactions - } - message Tx { - Type type = 1; - bytes sender = 2; - bytes rlpTx = 3; - } - repeated Tx txs = 1; -} - -service Txpool { - // Version returns the service version number - rpc Version(google.protobuf.Empty) returns (types.VersionReply); - // preserves incoming order, changes amount, unknown hashes will be omitted - rpc FindUnknown(TxHashes) returns (TxHashes); - // Expecting signed transactions. Preserves incoming order and amount - // Adding txs as local (use P2P to add remote txs) - rpc Add(AddRequest) returns (AddReply); - // preserves incoming order and amount, if some transaction doesn't exists in pool - returns nil in this slot - rpc Transactions(TransactionsRequest) returns (TransactionsReply); - // returns all transactions from tx pool - rpc All(AllRequest) returns (AllReply); - // subscribe to new transactions add event - rpc OnAdd(OnAddRequest) returns (stream OnAddReply); -} diff --git a/interfaces/txpool/txpool_control.proto b/interfaces/txpool/txpool_control.proto deleted file mode 100644 index 0283a8c635..0000000000 --- a/interfaces/txpool/txpool_control.proto +++ /dev/null @@ -1,57 +0,0 @@ -syntax = "proto3"; - -import "google/protobuf/empty.proto"; -import "types/types.proto"; - -package txpool_control; - -option go_package = "./txpool;txpool"; - -message AccountInfoRequest { - types.H256 block_hash = 1; - types.H160 account = 2; -} - -message AccountInfoReply { - types.H256 balance = 1; - uint64 nonce = 2; -} - -message BlockStreamRequest { - oneof start_with { - google.protobuf.Empty latest = 1; - types.H256 block_hash = 2; - } -} - -message AccountInfo { - types.H160 address = 1; - types.H256 balance = 2; - uint64 nonce = 3; -} - -message AppliedBlock { - types.H256 hash = 1; - types.H256 parent_hash = 2; - repeated AccountInfo changed_accounts = 3; -} - -message RevertedBlock { - types.H256 reverted_hash = 1; - repeated bytes reverted_transactions = 2; - types.H256 new_hash = 3; - types.H256 new_parent = 4; - repeated AccountInfo reverted_accounts = 5; -} - -message BlockDiff { - oneof diff { - AppliedBlock applied = 1; - RevertedBlock reverted = 2; - } -} - -service TxpoolControl { - rpc AccountInfo(AccountInfoRequest) returns (AccountInfoReply); - rpc BlockStream(BlockStreamRequest) returns (stream BlockDiff); -} diff --git a/interfaces/types/types.proto b/interfaces/types/types.proto deleted file mode 100644 index 5cd2a094b5..0000000000 --- a/interfaces/types/types.proto +++ /dev/null @@ -1,46 +0,0 @@ -syntax = "proto3"; - -import "google/protobuf/descriptor.proto"; - -package types; - -option go_package = "./types;types"; - -/* Service-level versioning shall use a 3-part version number (M.m.p) following semver rules */ -/* 1. MAJOR version (M): increment when you make incompatible changes */ -/* 2. MINOR version (m): increment when you add functionality in backward compatible manner */ -/* 3. PATCH version (p): increment when you make backward compatible bug fixes */ - -// Extensions of file-level options for service versioning: should *not* be modified -extend google.protobuf.FileOptions { - uint32 service_major_version = 50001; - uint32 service_minor_version = 50002; - uint32 service_patch_version = 50003; -} - -message H128 { - uint64 hi = 1; - uint64 lo = 2; -} - -message H160 { - H128 hi = 1; - uint32 lo = 2; -} - -message H256 { - H128 hi = 1; - H128 lo = 2; -} - -message H512 { - H256 hi = 1; - H256 lo = 2; -} - -// Reply message containing the current service version on the service side -message VersionReply { - uint32 major = 1; - uint32 minor = 2; - uint32 patch = 3; -} diff --git a/turbo/remote/sentry_client.go b/turbo/remote/sentry_client.go index 448f029323..92d0edfc59 100644 --- a/turbo/remote/sentry_client.go +++ b/turbo/remote/sentry_client.go @@ -6,8 +6,8 @@ import ( "sync" "github.com/golang/protobuf/ptypes/empty" + proto_sentry "github.com/ledgerwatch/erigon-lib/gointerfaces/sentry" "github.com/ledgerwatch/erigon/eth/protocols/eth" - proto_sentry "github.com/ledgerwatch/erigon/gointerfaces/sentry" "github.com/ledgerwatch/erigon/log" "google.golang.org/grpc" diff --git a/turbo/shards/state_change_accumulator.go b/turbo/shards/state_change_accumulator.go index 34f8a9b7c3..760e7692c9 100644 --- a/turbo/shards/state_change_accumulator.go +++ b/turbo/shards/state_change_accumulator.go @@ -1,9 +1,9 @@ package shards import ( + "github.com/ledgerwatch/erigon-lib/gointerfaces" + "github.com/ledgerwatch/erigon-lib/gointerfaces/remote" "github.com/ledgerwatch/erigon/common" - "github.com/ledgerwatch/erigon/gointerfaces" - "github.com/ledgerwatch/erigon/gointerfaces/remote" ) // Accumulator collects state changes in a form that can then be delivered to the RPC daemon diff --git a/turbo/stages/mock_sentry.go b/turbo/stages/mock_sentry.go index 107d564d12..ea209ab327 100644 --- a/turbo/stages/mock_sentry.go +++ b/turbo/stages/mock_sentry.go @@ -11,6 +11,9 @@ import ( "github.com/c2h5oh/datasize" "github.com/holiman/uint256" + "github.com/ledgerwatch/erigon-lib/gointerfaces" + proto_sentry "github.com/ledgerwatch/erigon-lib/gointerfaces/sentry" + ptypes "github.com/ledgerwatch/erigon-lib/gointerfaces/types" "github.com/ledgerwatch/erigon/cmd/sentry/download" "github.com/ledgerwatch/erigon/common" "github.com/ledgerwatch/erigon/consensus" @@ -28,9 +31,6 @@ import ( "github.com/ledgerwatch/erigon/ethdb" "github.com/ledgerwatch/erigon/ethdb/kv" "github.com/ledgerwatch/erigon/ethdb/remote/remotedbserver" - "github.com/ledgerwatch/erigon/gointerfaces" - proto_sentry "github.com/ledgerwatch/erigon/gointerfaces/sentry" - ptypes "github.com/ledgerwatch/erigon/gointerfaces/types" "github.com/ledgerwatch/erigon/log" "github.com/ledgerwatch/erigon/params" "github.com/ledgerwatch/erigon/rlp" diff --git a/turbo/stages/sentry_mock_test.go b/turbo/stages/sentry_mock_test.go index 5ee3883c83..65912b316c 100644 --- a/turbo/stages/sentry_mock_test.go +++ b/turbo/stages/sentry_mock_test.go @@ -6,13 +6,13 @@ import ( "testing" "github.com/holiman/uint256" + "github.com/ledgerwatch/erigon-lib/gointerfaces/sentry" "github.com/ledgerwatch/erigon/common" "github.com/ledgerwatch/erigon/common/u256" "github.com/ledgerwatch/erigon/core" "github.com/ledgerwatch/erigon/core/types" "github.com/ledgerwatch/erigon/eth/protocols/eth" "github.com/ledgerwatch/erigon/ethdb/remote/remotedbserver" - "github.com/ledgerwatch/erigon/gointerfaces/sentry" "github.com/ledgerwatch/erigon/log" "github.com/ledgerwatch/erigon/params" "github.com/ledgerwatch/erigon/rlp" diff --git a/turbo/txpool/p2p.go b/turbo/txpool/p2p.go index 3a8aff55c9..4335336df4 100644 --- a/turbo/txpool/p2p.go +++ b/turbo/txpool/p2p.go @@ -11,13 +11,13 @@ import ( "strings" "sync" + "github.com/ledgerwatch/erigon-lib/gointerfaces" + proto_sentry "github.com/ledgerwatch/erigon-lib/gointerfaces/sentry" "github.com/ledgerwatch/erigon/cmd/sentry/download" "github.com/ledgerwatch/erigon/common" "github.com/ledgerwatch/erigon/core" "github.com/ledgerwatch/erigon/eth/fetcher" "github.com/ledgerwatch/erigon/eth/protocols/eth" - "github.com/ledgerwatch/erigon/gointerfaces" - proto_sentry "github.com/ledgerwatch/erigon/gointerfaces/sentry" "github.com/ledgerwatch/erigon/log" "github.com/ledgerwatch/erigon/rlp" "github.com/ledgerwatch/erigon/turbo/remote" -- GitLab