diff --git a/.!2747!lux b/.!2747!lux new file mode 100755 index 00000000..e69de29b diff --git a/.!2748!netrunner b/.!2748!netrunner new file mode 100755 index 00000000..e69de29b diff --git a/.!78059!lux b/.!78059!lux new file mode 100755 index 00000000..e69de29b diff --git a/.!78083!netrunner b/.!78083!netrunner new file mode 100755 index 00000000..e69de29b diff --git a/.github/workflows/chaos-test.yml b/.github/workflows/chaos-test.yml new file mode 100644 index 00000000..7bc78f7d --- /dev/null +++ b/.github/workflows/chaos-test.yml @@ -0,0 +1,94 @@ +name: Chaos tests + +# Runs the netrunner chaos suite against a freshly-built luxd. Gated on +# changes to paths that affect partition / replication / bridge semantics +# so we don't waste runners on docs-only PRs. Build tag `chaos` + env +# `RUN_CHAOS=1` gate the tests at the Go level — without both the tests +# are no-ops, so a passing run with neither set still proves the build +# compiles. +# +# Followup (#54): once the PartitionNetwork RPC + iptables/pfctl +# plumbing lands, this workflow will exercise real network partition +# scenarios. Today it covers the in-memory bft messageFilter primitive +# + the existing PauseNode (node-failure) scenarios. + +on: + push: + branches: [main] + paths: + - 'tests/**' + - 'local/**' + - 'server/**' + - 'rpcpb/**' + - 'go.mod' + - 'go.sum' + - '.github/workflows/chaos-test.yml' + pull_request: + paths: + - 'tests/**' + - 'local/**' + - 'server/**' + - 'rpcpb/**' + - 'go.mod' + - 'go.sum' + - '.github/workflows/chaos-test.yml' + workflow_dispatch: + +permissions: + contents: read + +env: + GOWORK: off + CGO_ENABLED: "0" + RUN_CHAOS: "1" + LUXD_VERSION: "1.22.79" + +jobs: + chaos: + name: Chaos suite + runs-on: ubuntu-latest + timeout-minutes: 30 + steps: + - name: Checkout netrunner + uses: actions/checkout@v4 + + - name: Set up Go + uses: actions/setup-go@v5 + with: + go-version: '1.26.3' + check-latest: true + + - name: Cache Go modules + uses: actions/cache@v4 + with: + path: | + ~/.cache/go-build + ~/go/pkg/mod + key: ${{ runner.os }}-chaos-${{ hashFiles('**/go.sum') }} + restore-keys: | + ${{ runner.os }}-chaos- + + # luxd is fetched from the luxfi/node release artifacts. The chaos + # tests pass LUXD_PATH so netrunner-managed networks point at this + # binary instead of trying to compile one on the fly. + - name: Fetch luxd + run: | + set -e + curl -fsSL -o /tmp/luxd.tgz \ + "https://github.com/luxfi/node/releases/download/v${LUXD_VERSION}/luxd-linux-amd64-v${LUXD_VERSION}.tar.gz" + mkdir -p /tmp/luxd-bin + tar -xzf /tmp/luxd.tgz -C /tmp/luxd-bin --strip-components=1 + /tmp/luxd-bin/luxd --version + echo "LUXD_PATH=/tmp/luxd-bin/luxd" >> "$GITHUB_ENV" + + - name: Run chaos tests + env: + # Tests gated by build tag `chaos` skip themselves unless this + # tag is set; gated by env `RUN_CHAOS=1` to also catch the + # check inside the test bodies. + RUN_CHAOS: "1" + LUXD_PATH: ${{ env.LUXD_PATH }} + run: | + go test -tags chaos -timeout 25m -count=1 ./tests/... \ + -run "TestConsensus_|TestBridge_|TestDEX_" \ + -v diff --git a/examples/local/fivenodenetwork/.!2746!test-5-node b/examples/local/fivenodenetwork/.!2746!test-5-node new file mode 100755 index 00000000..e69de29b diff --git a/go.mod b/go.mod index 6c04fcfd..b9f4164f 100644 --- a/go.mod +++ b/go.mod @@ -26,7 +26,7 @@ require ( github.com/luxfi/metric v1.5.1 github.com/luxfi/node v1.26.2 github.com/luxfi/p2p v1.19.2 - github.com/luxfi/protocol v0.0.3 + github.com/luxfi/proto v0.0.0-proto-rename github.com/luxfi/sdk v1.16.57 github.com/luxfi/utxo v0.3.0 github.com/luxfi/validators v1.0.0 @@ -221,3 +221,7 @@ require ( google.golang.org/genproto/googleapis/rpc v0.0.0-20260401024825-9d38bb4040a9 // indirect gopkg.in/natefinch/lumberjack.v2 v2.2.1 // indirect ) + +// Local-dev overlay for the protocol → proto rename. +// Strip once GitHub admin renames luxfi/protocol → luxfi/proto and a real tag exists. +replace github.com/luxfi/proto => ../protocol diff --git a/local/blockchain.go b/local/blockchain.go index 462b49e5..d1991ca8 100644 --- a/local/blockchain.go +++ b/local/blockchain.go @@ -21,7 +21,7 @@ import ( "github.com/luxfi/keys" "github.com/luxfi/genesis/pkg/genesis" - "github.com/luxfi/protocol/p/reward" + "github.com/luxfi/proto/p/reward" "github.com/luxfi/sdk/wallet/chain/x" "github.com/luxfi/utxo" @@ -40,8 +40,8 @@ import ( "github.com/luxfi/netrunner/network" "github.com/luxfi/netrunner/network/node" "github.com/luxfi/netrunner/utils" - "github.com/luxfi/protocol/p/signer" - "github.com/luxfi/protocol/p/txs" + "github.com/luxfi/proto/p/signer" + "github.com/luxfi/proto/p/txs" "github.com/luxfi/sdk/admin" "github.com/luxfi/sdk/platformvm" pwallet "github.com/luxfi/sdk/wallet/chain/p" diff --git a/local/genesis_config.go b/local/genesis_config.go index 8dbda2f6..e72d83c1 100644 --- a/local/genesis_config.go +++ b/local/genesis_config.go @@ -26,7 +26,7 @@ import ( "github.com/luxfi/netrunner/network" "github.com/luxfi/netrunner/network/node" "github.com/luxfi/netrunner/utils" - "github.com/luxfi/protocol/p/signer" + "github.com/luxfi/proto/p/signer" "github.com/luxfi/address" luxtls "github.com/luxfi/tls" diff --git a/local/network.go b/local/network.go index 2d9a2771..cf77f2a5 100644 --- a/local/network.go +++ b/local/network.go @@ -1304,15 +1304,18 @@ func (ln *localNetwork) buildArgs( } // Flags for Lux + // luxd accepts --bootstrap-ips and --bootstrap-ids as separate flags + // (no combined --bootstrap-nodes). Emit both, paired index-by-index. flags := map[string]string{ - config.NetworkIDKey: fmt.Sprintf("%d", ln.networkID), - config.DataDirKey: dataDir, - config.DBPathKey: dbDir, - config.LogsDirKey: logsDir, - config.PluginDirKey: pluginDir, // Always pass plugin dir for consistency - config.HTTPPortKey: fmt.Sprintf("%d", apiPort), - config.StakingPortKey: fmt.Sprintf("%d", p2pPort), - config.BootstrapNodesKey: ln.bootstraps.IPsArg(), + config.NetworkIDKey: fmt.Sprintf("%d", ln.networkID), + config.DataDirKey: dataDir, + config.DBPathKey: dbDir, + config.LogsDirKey: logsDir, + config.PluginDirKey: pluginDir, // Always pass plugin dir for consistency + config.HTTPPortKey: fmt.Sprintf("%d", apiPort), + config.StakingPortKey: fmt.Sprintf("%d", p2pPort), + config.BootstrapIPsKey: ln.bootstraps.IPsArg(), + config.BootstrapIDsKey: ln.bootstraps.IDsArg(), } // Write staking key/cert etc. to disk so the new node can use them, diff --git a/local/network_test.go.bak b/local/network_test.go.bak deleted file mode 100644 index 3d7a33fb..00000000 --- a/local/network_test.go.bak +++ /dev/null @@ -1,1348 +0,0 @@ -package local - -import ( - "bytes" - "context" - "errors" - "fmt" - "math/big" - "os" - "os/exec" - "path/filepath" - "strings" - "testing" - "time" - - "github.com/luxfi/netrunner/api" - apimocks "github.com/luxfi/netrunner/api/mocks" - "github.com/luxfi/netrunner/local/mocks" - healthmocks "github.com/luxfi/netrunner/local/mocks/health" - "github.com/luxfi/netrunner/network" - "github.com/luxfi/netrunner/network/node" - "github.com/luxfi/netrunner/network/node/status" - "github.com/luxfi/netrunner/utils" - "github.com/luxfi/sdk/node/api/health" - "github.com/luxfi/config" - "github.com/luxfi/ids" - "github.com/luxfi/p2p/message" - "github.com/luxfi/consensus/networking/router" - luxlog "github.com/luxfi/log" - "github.com/luxfi/utils/rpc" - "github.com/stretchr/testify/mock" - "github.com/stretchr/testify/require" -) - -const ( - defaultHealthyTimeout = 5 * time.Second - nodeVersion = "lux/1.9.5 extra" -) - -var ( - _ NodeProcessCreator = &localTestSuccessfulNodeProcessCreator{} - _ NodeProcessCreator = &localTestFailedStartProcessCreator{} - _ NodeProcessCreator = &localTestProcessUndefNodeProcessCreator{} - _ NodeProcessCreator = &localTestFlagCheckProcessCreator{} - _ api.NewAPIClientF = newMockAPISuccessful - _ api.NewAPIClientF = newMockAPIUnhealthy - _ router.InboundHandler = &noOpInboundHandler{} -) - -type localTestSuccessfulNodeProcessCreator struct{} - -func (*localTestSuccessfulNodeProcessCreator) NewNodeProcess(config node.Config, flags ...string) (NodeProcess, error) { - return newMockProcessSuccessful(config, flags...) -} - -func (*localTestSuccessfulNodeProcessCreator) GetNodeVersion(_ node.Config) (string, error) { - return nodeVersion, nil -} - -type localTestFailedStartProcessCreator struct{} - -func (*localTestFailedStartProcessCreator) NewNodeProcess(node.Config, ...string) (NodeProcess, error) { - return nil, errors.New("error on purpose for test") -} - -func (*localTestFailedStartProcessCreator) GetNodeVersion(_ node.Config) (string, error) { - return nodeVersion, nil -} - -type localTestProcessUndefNodeProcessCreator struct{} - -func (*localTestProcessUndefNodeProcessCreator) NewNodeProcess(config node.Config, flags ...string) (NodeProcess, error) { - return newMockProcessUndef(config, flags...) -} - -func (*localTestProcessUndefNodeProcessCreator) GetNodeVersion(_ node.Config) (string, error) { - return nodeVersion, nil -} - -type localTestFlagCheckProcessCreator struct { - expectedFlags map[string]interface{} - require *require.Assertions -} - -func (lt *localTestFlagCheckProcessCreator) NewNodeProcess(config node.Config, flags ...string) (NodeProcess, error) { - lt.require.EqualValues(lt.expectedFlags, config.Flags) - return newMockProcessSuccessful(config, flags...) -} - -func (*localTestFlagCheckProcessCreator) GetNodeVersion(_ node.Config) (string, error) { - return nodeVersion, nil -} - -// Returns an API client where: -// * The Health API's Health method always returns healthy -// * The CChainEthAPI's Close method may be called -// * Only the above 2 methods may be called -// TODO have this method return an API Client that has all -// APIs and methods implemented -func newMockAPISuccessful(string, uint16) api.Client { - healthReply := &health.APIReply{Healthy: true} - healthClient := &healthmocks.Client{} - healthClient.On("Health", mock.Anything, mock.Anything).Return(healthReply, nil) - // ethClient used when removing nodes, to close websocket connection - ethClient := &apimocks.EthClient{} - ethClient.On("Close").Return() - client := &apimocks.Client{} - client.On("HealthAPI").Return(healthClient) - client.On("CChainEthAPI").Return(ethClient) - return client -} - -// Returns an API client where the Health API's Health method always returns unhealthy -func newMockAPIUnhealthy(string, uint16) api.Client { - healthReply := &health.APIReply{Healthy: false} - healthClient := &healthmocks.Client{} - healthClient.On("Health", mock.Anything, mock.Anything).Return(healthReply, nil) - client := &apimocks.Client{} - client.On("HealthAPI").Return(healthClient) - return client -} - -func newMockProcessUndef(node.Config, ...string) (NodeProcess, error) { - return &mocks.NodeProcess{}, nil -} - -// Returns a NodeProcess that always returns nil -func newMockProcessSuccessful(node.Config, ...string) (NodeProcess, error) { - process := &mocks.NodeProcess{} - process.On("Wait").Return(nil) - process.On("Stop", mock.Anything).Return(0) - process.On("Status").Return(status.Running) - return process, nil -} - -type noOpInboundHandler struct{} - -func (*noOpInboundHandler) HandleInbound(context.Context, message.InboundMessage) {} - -// Start a network with no nodes -func TestNewNetworkEmpty(t *testing.T) { - t.Parallel() - require := require.New(t) - networkConfig := testNetworkConfig(t) - networkConfig.NodeConfigs = nil - net, err := newNetwork( - logging.NoLog{}, - newMockAPISuccessful, - &localTestProcessUndefNodeProcessCreator{}, - "", - "", - false, - ) - require.NoError(err) - err = net.loadConfig(context.Background(), networkConfig) - require.NoError(err) - // Assert that GetNodeNames() returns an empty list - names, err := net.GetNodeNames() - require.NoError(err) - require.Len(names, 0) -} - -type localTestOneNodeCreator struct { - require *require.Assertions - networkConfig network.Config - successCreator *localTestSuccessfulNodeProcessCreator -} - -func newLocalTestOneNodeCreator(require *require.Assertions, networkConfig network.Config) *localTestOneNodeCreator { - return &localTestOneNodeCreator{ - require: require, - networkConfig: networkConfig, - successCreator: &localTestSuccessfulNodeProcessCreator{}, - } -} - -// Assert that the node's config is being passed correctly -// to the function that starts the node process. -func (lt *localTestOneNodeCreator) NewNodeProcess(config node.Config, flags ...string) (NodeProcess, error) { - lt.require.True(config.IsBeacon) - expectedConfig := lt.networkConfig.NodeConfigs[0] - lt.require.EqualValues(lt.networkConfig.ChainConfigFiles, config.ChainConfigFiles) - lt.require.EqualValues(expectedConfig.ConfigFile, config.ConfigFile) - lt.require.EqualValues(lt.networkConfig.BinaryPath, config.BinaryPath) - lt.require.EqualValues(expectedConfig.IsBeacon, config.IsBeacon) - lt.require.EqualValues(expectedConfig.Name, config.Name) - lt.require.EqualValues(expectedConfig.StakingCert, config.StakingCert) - lt.require.EqualValues(expectedConfig.StakingKey, config.StakingKey) - lt.require.Len(config.Flags, len(expectedConfig.Flags)) - for k, v := range expectedConfig.Flags { - gotV, ok := config.Flags[k] - lt.require.True(ok) - lt.require.EqualValues(v, gotV) - } - return lt.successCreator.NewNodeProcess(config, flags...) -} - -func (*localTestOneNodeCreator) GetNodeVersion(_ node.Config) (string, error) { - return nodeVersion, nil -} - -// Start a network with one node. -func TestNewNetworkOneNode(t *testing.T) { - t.Parallel() - require := require.New(t) - networkConfig := testNetworkConfig(t) - networkConfig.NodeConfigs = networkConfig.NodeConfigs[:1] - creator := newLocalTestOneNodeCreator(require, networkConfig) - net, err := newNetwork( - logging.NoLog{}, - newMockAPISuccessful, - creator, - "", - "", - false, - ) - require.NoError(err) - err = net.loadConfig(context.Background(), networkConfig) - require.NoError(err) - - // Assert that GetNodeNames() includes only the 1 node's name - names, err := net.GetNodeNames() - require.NoError(err) - require.Contains(names, networkConfig.NodeConfigs[0].Name) - require.Len(names, 1) - - // Assert that the network's genesis was set - require.EqualValues(networkConfig.Genesis, net.genesis) -} - -// Test that NewNetwork returns an error when -// starting a node returns an error -func TestNewNetworkFailToStartNode(t *testing.T) { - t.Parallel() - require := require.New(t) - networkConfig := testNetworkConfig(t) - net, err := newNetwork( - logging.NoLog{}, - newMockAPISuccessful, - &localTestFailedStartProcessCreator{}, - "", - "", - false, - ) - require.NoError(err) - err = net.loadConfig(context.Background(), networkConfig) - require.Error(err) -} - -// Check configs that are expected to be invalid at network creation time -func TestWrongNetworkConfigs(t *testing.T) { - t.Parallel() - refNetworkConfig := testNetworkConfig(t) - tests := map[string]struct { - config network.Config - }{ - "config file unmarshal": { - config: network.Config{ - Genesis: "{\"networkID\": 0}", - NodeConfigs: []node.Config{ - { - BinaryPath: "pepe", - IsBeacon: true, - StakingKey: refNetworkConfig.NodeConfigs[0].StakingKey, - StakingCert: refNetworkConfig.NodeConfigs[0].StakingCert, - ConfigFile: "nonempty", - }, - }, - }, - }, - "wrong network id type in config file": { - config: network.Config{ - Genesis: "{\"networkID\": 0}", - NodeConfigs: []node.Config{ - { - BinaryPath: "pepe", - IsBeacon: true, - StakingKey: refNetworkConfig.NodeConfigs[0].StakingKey, - StakingCert: refNetworkConfig.NodeConfigs[0].StakingCert, - ConfigFile: "{\"network-id\": \"0\"}", - }, - }, - }, - }, - "wrong db dir type in config": { - config: network.Config{ - Genesis: "{\"networkID\": 0}", - NodeConfigs: []node.Config{ - { - BinaryPath: "pepe", - IsBeacon: true, - StakingKey: refNetworkConfig.NodeConfigs[0].StakingKey, - StakingCert: refNetworkConfig.NodeConfigs[0].StakingCert, - ConfigFile: "{\"db-dir\": 0}", - }, - }, - }, - }, - "wrong log dir type in config": { - config: network.Config{ - Genesis: "{\"networkID\": 0}", - NodeConfigs: []node.Config{ - { - BinaryPath: "pepe", - IsBeacon: true, - StakingKey: refNetworkConfig.NodeConfigs[0].StakingKey, - StakingCert: refNetworkConfig.NodeConfigs[0].StakingCert, - ConfigFile: "{\"log-dir\": 0}", - }, - }, - }, - }, - "wrong http port type in config": { - config: network.Config{ - Genesis: "{\"networkID\": 0}", - NodeConfigs: []node.Config{ - { - BinaryPath: "pepe", - IsBeacon: true, - StakingKey: refNetworkConfig.NodeConfigs[0].StakingKey, - StakingCert: refNetworkConfig.NodeConfigs[0].StakingCert, - ConfigFile: "{\"http-port\": \"0\"}", - }, - }, - }, - }, - "wrong staking port type in config": { - config: network.Config{ - Genesis: "{\"networkID\": 0}", - NodeConfigs: []node.Config{ - { - BinaryPath: "pepe", - IsBeacon: true, - StakingKey: refNetworkConfig.NodeConfigs[0].StakingKey, - StakingCert: refNetworkConfig.NodeConfigs[0].StakingCert, - ConfigFile: "{\"staking-port\": \"0\"}", - }, - }, - }, - }, - "network id mismatch": { - config: network.Config{ - Genesis: "{\"networkID\": 0}", - NodeConfigs: []node.Config{ - { - BinaryPath: "pepe", - IsBeacon: true, - StakingKey: refNetworkConfig.NodeConfigs[0].StakingKey, - StakingCert: refNetworkConfig.NodeConfigs[0].StakingCert, - ConfigFile: "{\"network-id\": 1}", - }, - }, - }, - }, - "genesis unmarshall": { - config: network.Config{ - Genesis: "nonempty", - NodeConfigs: []node.Config{ - { - BinaryPath: "pepe", - IsBeacon: true, - StakingKey: refNetworkConfig.NodeConfigs[0].StakingKey, - StakingCert: refNetworkConfig.NodeConfigs[0].StakingCert, - }, - }, - }, - }, - "no network id in genesis": { - config: network.Config{ - Genesis: "{}", - NodeConfigs: []node.Config{ - { - BinaryPath: "pepe", - IsBeacon: true, - StakingKey: refNetworkConfig.NodeConfigs[0].StakingKey, - StakingCert: refNetworkConfig.NodeConfigs[0].StakingCert, - }, - }, - }, - }, - "wrong network id type in genesis": { - config: network.Config{ - Genesis: "{\"networkID\": \"0\"}", - NodeConfigs: []node.Config{ - { - BinaryPath: "pepe", - IsBeacon: true, - StakingKey: refNetworkConfig.NodeConfigs[0].StakingKey, - StakingCert: refNetworkConfig.NodeConfigs[0].StakingCert, - }, - }, - }, - }, - "no Genesis": { - config: network.Config{ - NodeConfigs: []node.Config{ - { - BinaryPath: "pepe", - IsBeacon: true, - StakingKey: refNetworkConfig.NodeConfigs[0].StakingKey, - StakingCert: refNetworkConfig.NodeConfigs[0].StakingCert, - }, - }, - }, - }, - "StakingKey but no StakingCert": { - config: network.Config{ - Genesis: "{\"networkID\": 0}", - NodeConfigs: []node.Config{ - { - BinaryPath: "pepe", - IsBeacon: true, - StakingKey: refNetworkConfig.NodeConfigs[0].StakingKey, - }, - }, - }, - }, - "StakingCert but no StakingKey": { - config: network.Config{ - Genesis: "{\"networkID\": 0}", - NodeConfigs: []node.Config{ - { - BinaryPath: "pepe", - IsBeacon: true, - StakingCert: refNetworkConfig.NodeConfigs[0].StakingCert, - }, - }, - }, - }, - "invalid staking cert/key": { - config: network.Config{ - Genesis: "{\"networkID\": 0}", - NodeConfigs: []node.Config{ - { - BinaryPath: "pepe", - IsBeacon: true, - StakingKey: "nonempty", - StakingCert: "nonempty", - }, - }, - }, - }, - "no beacon node": { - config: network.Config{ - Genesis: "{\"networkID\": 0}", - NodeConfigs: []node.Config{ - { - BinaryPath: "pepe", - StakingKey: refNetworkConfig.NodeConfigs[0].StakingKey, - StakingCert: refNetworkConfig.NodeConfigs[0].StakingCert, - }, - }, - }, - }, - "repeated name": { - config: network.Config{ - Genesis: "{\"networkID\": 0}", - NodeConfigs: []node.Config{ - { - Name: "node1", - BinaryPath: "pepe", - IsBeacon: true, - StakingKey: refNetworkConfig.NodeConfigs[0].StakingKey, - StakingCert: refNetworkConfig.NodeConfigs[0].StakingCert, - }, - { - Name: "node1", - BinaryPath: "pepe", - IsBeacon: true, - StakingKey: refNetworkConfig.NodeConfigs[1].StakingKey, - StakingCert: refNetworkConfig.NodeConfigs[1].StakingCert, - }, - }, - }, - }, - } - require := require.New(t) - for name, tt := range tests { - t.Run(name, func(t *testing.T) { - net, err := newNetwork(logging.NoLog{}, newMockAPISuccessful, &localTestSuccessfulNodeProcessCreator{}, "", "", false) - require.NoError(err) - err = net.loadConfig(context.Background(), tt.config) - require.Error(err) - }) - } -} - -// Assert that the network's Healthy() method returns an -// error when all nodes' Health API return unhealthy -func TestUnhealthyNetwork(t *testing.T) { - t.Parallel() - require := require.New(t) - networkConfig := testNetworkConfig(t) - net, err := newNetwork(logging.NoLog{}, newMockAPIUnhealthy, &localTestSuccessfulNodeProcessCreator{}, "", "", false) - require.NoError(err) - err = net.loadConfig(context.Background(), networkConfig) - require.NoError(err) - require.Error(awaitNetworkHealthy(net, defaultHealthyTimeout)) -} - -// Create a network without giving names to nodes. -// Checks that the generated names are the correct number and unique. -func TestGeneratedNodesNames(t *testing.T) { - require := require.New(t) - networkConfig := testNetworkConfig(t) - for i := range networkConfig.NodeConfigs { - networkConfig.NodeConfigs[i].Name = "" - } - net, err := newNetwork(logging.NoLog{}, newMockAPISuccessful, &localTestSuccessfulNodeProcessCreator{}, "", "", false) - require.NoError(err) - err = net.loadConfig(context.Background(), networkConfig) - require.NoError(err) - nodeNameMap := make(map[string]bool) - nodeNames, err := net.GetNodeNames() - require.NoError(err) - for _, nodeName := range nodeNames { - nodeNameMap[nodeName] = true - } - require.EqualValues(len(nodeNameMap), len(networkConfig.NodeConfigs)) -} - -// TestGenerateDefaultNetwork create a default network with config from NewDefaultConfig and -// check expected number of nodes, node names, and node node ids -func TestGenerateDefaultNetwork(t *testing.T) { - t.Parallel() - require := require.New(t) - binaryPath := "pepito" - networkConfig := NewDefaultConfig(binaryPath) - net, err := newNetwork(logging.NoLog{}, newMockAPISuccessful, &localTestSuccessfulNodeProcessCreator{}, "", "", false) - require.NoError(err) - err = net.loadConfig(context.Background(), networkConfig) - require.NoError(err) - require.NoError(awaitNetworkHealthy(net, defaultHealthyTimeout)) - names, err := net.GetNodeNames() - require.NoError(err) - require.Len(names, 5) - for _, nodeInfo := range []struct { - name string - ID string - }{ - { - "node1", - "NodeID-7Xhw2mDxuDS44j42TCB6U5579esbSt3Lg", - }, - { - "node2", - "NodeID-MFrZFVCXPv5iCn6M9K6XduxGTYp891xXZ", - }, - { - "node3", - "NodeID-NFBbbJ4qCmNaCzeW7sxErhvWqvEQMnYcN", - }, - { - "node4", - "NodeID-GWPcbFJZFfZreETSoWjPimr846mXEKCtu", - }, - { - "node5", - "NodeID-P7oB2McjBGgW2NXXWVYjV8JEDFoW9xDE5", - }, - } { - require.Contains(names, nodeInfo.name) - node, err := net.GetNode(nodeInfo.name) - require.NoError(err) - require.EqualValues(nodeInfo.name, node.GetName()) - expectedID, err := ids.NodeIDFromString(nodeInfo.ID) - require.NoError(err) - require.EqualValues(expectedID, node.GetNodeID()) - } -} - -// TODO add byzantine node to conf -// TestNetworkFromConfig creates/waits/checks/stops a network from config file -// the check verify that all the nodes can be accessed -func TestNetworkFromConfig(t *testing.T) { - t.Parallel() - require := require.New(t) - networkConfig := testNetworkConfig(t) - net, err := newNetwork(logging.NoLog{}, newMockAPISuccessful, &localTestSuccessfulNodeProcessCreator{}, "", "", false) - require.NoError(err) - err = net.loadConfig(context.Background(), networkConfig) - require.NoError(err) - require.NoError(awaitNetworkHealthy(net, defaultHealthyTimeout)) - runningNodes := make(map[string]struct{}) - for _, nodeConfig := range networkConfig.NodeConfigs { - runningNodes[nodeConfig.Name] = struct{}{} - } - checkNetwork(t, net, runningNodes, nil) -} - -// TestNetworkNodeOps creates an empty network, -// adds nodes one by one, then removes nodes one by one. -// Setween all operations, a network check is performed -// to verify that all the running nodes are in the network, -// and all removed nodes are not. -func TestNetworkNodeOps(t *testing.T) { - t.Parallel() - require := require.New(t) - - // Start a new, empty network - emptyNetworkConfig, err := emptyNetworkConfig() - require.NoError(err) - net, err := newNetwork(logging.NoLog{}, newMockAPISuccessful, &localTestSuccessfulNodeProcessCreator{}, "", "", false) - require.NoError(err) - err = net.loadConfig(context.Background(), emptyNetworkConfig) - require.NoError(err) - runningNodes := make(map[string]struct{}) - - // Add nodes to the network one by one - networkConfig := testNetworkConfig(t) - for _, nodeConfig := range networkConfig.NodeConfigs { - _, err := net.AddNode(nodeConfig) - require.NoError(err) - runningNodes[nodeConfig.Name] = struct{}{} - checkNetwork(t, net, runningNodes, nil) - } - // Wait for all nodes to be healthy - require.NoError(awaitNetworkHealthy(net, defaultHealthyTimeout)) - - // Remove nodes one by one - removedNodes := make(map[string]struct{}) - for _, nodeConfig := range networkConfig.NodeConfigs { - _, err := net.GetNode(nodeConfig.Name) - require.NoError(err) - err = net.RemoveNode(context.Background(), nodeConfig.Name) - require.NoError(err) - removedNodes[nodeConfig.Name] = struct{}{} - delete(runningNodes, nodeConfig.Name) - checkNetwork(t, net, runningNodes, removedNodes) - } -} - -// TestNodeNotFound checks all operations fail for an unknown node, -// being it either not created, or created and removed thereafter -func TestNodeNotFound(t *testing.T) { - t.Parallel() - require := require.New(t) - emptyNetworkConfig, err := emptyNetworkConfig() - require.NoError(err) - networkConfig := testNetworkConfig(t) - net, err := newNetwork(logging.NoLog{}, newMockAPISuccessful, &localTestSuccessfulNodeProcessCreator{}, "", "", false) - require.NoError(err) - err = net.loadConfig(context.Background(), emptyNetworkConfig) - require.NoError(err) - _, err = net.AddNode(networkConfig.NodeConfigs[0]) - require.NoError(err) - // get node - _, err = net.GetNode(networkConfig.NodeConfigs[0].Name) - require.NoError(err) - // get non-existent node - _, err = net.GetNode(networkConfig.NodeConfigs[1].Name) - require.Error(err) - // remove non-existent node - err = net.RemoveNode(context.Background(), networkConfig.NodeConfigs[1].Name) - require.Error(err) - // remove node - err = net.RemoveNode(context.Background(), networkConfig.NodeConfigs[0].Name) - require.NoError(err) - // get removed node - _, err = net.GetNode(networkConfig.NodeConfigs[0].Name) - require.Error(err) - // remove already-removed node - err = net.RemoveNode(context.Background(), networkConfig.NodeConfigs[0].Name) - require.Error(err) -} - -// TestStoppedNetwork checks that operations fail for an already stopped network -func TestStoppedNetwork(t *testing.T) { - t.Parallel() - require := require.New(t) - emptyNetworkConfig, err := emptyNetworkConfig() - require.NoError(err) - networkConfig := testNetworkConfig(t) - net, err := newNetwork(logging.NoLog{}, newMockAPISuccessful, &localTestSuccessfulNodeProcessCreator{}, "", "", false) - require.NoError(err) - err = net.loadConfig(context.Background(), emptyNetworkConfig) - require.NoError(err) - _, err = net.AddNode(networkConfig.NodeConfigs[0]) - require.NoError(err) - // first GetNodeNames should return some nodes - _, err = net.GetNodeNames() - require.NoError(err) - err = net.Stop(context.Background()) - require.NoError(err) - // Stop failure - require.EqualValues(net.Stop(context.Background()), network.ErrStopped) - // AddNode failure - _, err = net.AddNode(networkConfig.NodeConfigs[1]) - require.EqualValues(network.ErrStopped, err) - // GetNode failure - _, err = net.GetNode(networkConfig.NodeConfigs[0].Name) - require.EqualValues(err, network.ErrStopped) - // second GetNodeNames should return no nodes - _, err = net.GetNodeNames() - require.EqualValues(network.ErrStopped, err) - // RemoveNode failure - require.EqualValues(network.ErrStopped, net.RemoveNode(context.Background(), networkConfig.NodeConfigs[0].Name)) - // Healthy failure - require.EqualValues(awaitNetworkHealthy(net, defaultHealthyTimeout), network.ErrStopped) - _, err = net.GetAllNodes() - require.EqualValues(err, network.ErrStopped) -} - -func TestGetAllNodes(t *testing.T) { - require := require.New(t) - networkConfig := testNetworkConfig(t) - net, err := newNetwork(logging.NoLog{}, newMockAPISuccessful, &localTestSuccessfulNodeProcessCreator{}, "", "", false) - require.NoError(err) - err = net.loadConfig(context.Background(), networkConfig) - require.NoError(err) - - nodes, err := net.GetAllNodes() - require.NoError(err) - require.Len(nodes, len(net.nodes)) - for name, node := range net.nodes { - require.EqualValues(node, nodes[name]) - } -} - -// TestFlags tests that we can pass flags through the network.Config -// but also via node.Config and that the latter overrides the former -// if same keys exist. -func TestFlags(t *testing.T) { - t.Parallel() - require := require.New(t) - networkConfig := testNetworkConfig(t) - - // submit both network.Config flags and node.Config - networkConfig.Flags = map[string]interface{}{ - "test-network-config-flag": "something", - "common-config-flag": "should not be added", - } - for i := range networkConfig.NodeConfigs { - v := &networkConfig.NodeConfigs[i] - v.Flags = map[string]interface{}{ - "test-node-config-flag": "node", - "test2-node-config-flag": "config", - "common-config-flag": "this should be added", - } - } - expectedFlags := map[string]interface{}{ - "test-network-config-flag": "something", - "common-config-flag": "this should be added", - "test-node-config-flag": "node", - "test2-node-config-flag": "config", - } - - nw, err := newNetwork( - logging.NoLog{}, - newMockAPISuccessful, - &localTestFlagCheckProcessCreator{ - // after creating the network, one flag should have been overridden by the node configs - expectedFlags: expectedFlags, - require: require, - }, - "", - "", - false, - ) - require.NoError(err) - err = nw.loadConfig(context.Background(), networkConfig) - require.NoError(err) - err = nw.Stop(context.Background()) - require.NoError(err) - - // submit only node.Config flags - networkConfig.Flags = nil - flags := map[string]interface{}{ - "test-node-config-flag": "node", - "test2-node-config-flag": "config", - "common-config-flag": "this should be added", - } - for i := range networkConfig.NodeConfigs { - v := &networkConfig.NodeConfigs[i] - v.Flags = flags - } - nw, err = newNetwork( - logging.NoLog{}, - newMockAPISuccessful, - &localTestFlagCheckProcessCreator{ - // after creating the network, only node configs should exist - expectedFlags: flags, - require: require, - }, - "", - "", - false, - ) - require.NoError(err) - err = nw.loadConfig(context.Background(), networkConfig) - require.NoError(err) - err = nw.Stop(context.Background()) - require.NoError(err) - - // submit only network.Config flags - flags = map[string]interface{}{ - "test-network-config-flag": "something", - "common-config-flag": "else", - } - networkConfig.Flags = flags - for i := range networkConfig.NodeConfigs { - v := &networkConfig.NodeConfigs[i] - v.Flags = nil - } - nw, err = newNetwork( - logging.NoLog{}, - newMockAPISuccessful, - &localTestFlagCheckProcessCreator{ - // after creating the network, only flags from the network config should exist - expectedFlags: flags, - require: require, - }, - "", - "", - false, - ) - require.NoError(err) - err = nw.loadConfig(context.Background(), networkConfig) - require.NoError(err) - err = nw.Stop(context.Background()) - require.NoError(err) -} - -// for the TestChildCmdRedirection we need to be able to wait -// until the buffer is written to or else there is a race condition -type lockedBuffer struct { - bytes.Buffer - // [writtenCh] is closed after Write is called - writtenCh chan struct{} -} - -// Write is locked for the lockedBuffer -func (m *lockedBuffer) Write(b []byte) (int, error) { - defer close(m.writtenCh) - return m.Buffer.Write(b) -} - -// TestChildCmdRedirection checks that RedirectStdout set to true on a NodeConfig -// results indeed in the output being prepended and colored. -// For the color check we just measure the length of the required terminal escape values -func TestChildCmdRedirection(t *testing.T) { - t.Parallel() - // we need this to create the actual process we test - buf := &lockedBuffer{ - writtenCh: make(chan struct{}), - } - npc := &nodeProcessCreator{ - log: logging.NoLog{}, - stdout: buf, - stderr: buf, - colorPicker: utils.NewColorPicker(), - } - - // define a bogus output - testOutput := "this is the output" - // we will use `echo` with the testOutput as we will get a measurable result - ctrlCmd := exec.Command("echo", testOutput) - // we would not really need to execute the command, just the output would be enough - // nevertheless let's do it to simulate the actual case - expectedResult, err := ctrlCmd.Output() - if err != nil { - t.Fatal(err) - } - - // this is the "mock" node name we want to see prepended to the output - mockNodeName := "redirect-test-node" - - // now create the node process and check it will be prepended and colored - testConfig := node.Config{ - BinaryPath: "sh", - RedirectStdout: true, - RedirectStderr: true, - Name: mockNodeName, - } - // Sleep for a second after echoing so that we have a chance to read from the stdout pipe - // before it closes when the process exits and Wait() returns. - // See https://pkg.go.dev/os/exec#Cmd.StdoutPipe - proc, err := npc.NewNodeProcess(testConfig, "-c", fmt.Sprintf("echo %s && sleep 1", testOutput)) - if err != nil { - t.Fatal(err) - } - - // lock read access to the buffer - <-buf.writtenCh - result := buf.String() - - // wait for the process to finish. - _ = proc.Stop(context.Background()) - - // now do the checks: - // the new string should contain the node name - if !strings.Contains(result, mockNodeName) { - t.Fatalf("expected subcommand to contain node name %s, but it didn't", mockNodeName) - } - - // and it should have a specific length: - // the actual output + the color terminal escape sequence + node name + [] + color terminal reset escape sequence - expectedLen := len(expectedResult) + len(utils.NewColorPicker().NextColor()) + len(mockNodeName) + 3 + len(logging.Reset) - if len(result) != expectedLen { - t.Fatalf("expected string length to be %d, but it was %d", expectedLen, len(result)) - } -} - -// checkNetwork receives a network, a set of running nodes (started and not removed yet), and -// a set of removed nodes, checking: -// - GetNodeNames retrieves the correct number of running nodes -// - GetNode does not fail for given running nodes -// - GetNode does fail for given stopped nodes -func checkNetwork(t *testing.T, net network.Network, runningNodes map[string]struct{}, removedNodes map[string]struct{}) { - require := require.New(t) - nodeNames, err := net.GetNodeNames() - require.NoError(err) - require.EqualValues(len(nodeNames), len(runningNodes)) - for nodeName := range runningNodes { - _, err := net.GetNode(nodeName) - require.NoError(err) - } - for nodeName := range removedNodes { - _, err := net.GetNode(nodeName) - require.Error(err) - } -} - -// Return a network config that has no nodes -func emptyNetworkConfig() (network.Config, error) { - networkID := uint32(1337) - // Use a dummy genesis - genesis, err := network.NewLuxGenesis( - networkID, - []network.AddrAndBalance{ - { - Addr: ids.GenerateTestShortID(), - Balance: big.NewInt(1), - }, - }, - nil, - []ids.NodeID{ids.GenerateTestNodeID()}, - ) - if err != nil { - return network.Config{}, err - } - return network.Config{ - Genesis: string(genesis), - }, nil -} - -// Returns a config for a three node network, -// where the nodes have randomly generated staking -// keys and certificates. -func testNetworkConfig(t *testing.T) network.Config { - require := require.New(t) - networkConfig, err := NewDefaultConfigNNodes("pepito", 3) - require.NoError(err) - for i := 0; i < 3; i++ { - networkConfig.NodeConfigs[i].Name = fmt.Sprintf("node%d", i) - delete(networkConfig.NodeConfigs[i].Flags, config.HTTPPortKey) - delete(networkConfig.NodeConfigs[i].Flags, config.StakingPortKey) - } - return networkConfig -} - -// Returns nil when all the nodes in [net] are healthy, -// or an error if one doesn't become healthy within -// the timeout. -func awaitNetworkHealthy(net network.Network, timeout time.Duration) error { //nolint - ctx, cancel := context.WithTimeout(context.Background(), timeout) - defer cancel() - return net.Healthy(ctx) -} - -func TestAddNetworkFlags(t *testing.T) { - t.Parallel() - type test struct { - name string - netFlags map[string]interface{} - beforeNodeFlags map[string]interface{} - afterNodeFlags map[string]interface{} - } - tests := []test{ - { - name: "all empty", - netFlags: map[string]interface{}{}, - beforeNodeFlags: map[string]interface{}{}, - afterNodeFlags: map[string]interface{}{}, - }, - { - name: "net flags not empty; node flags empty", - netFlags: map[string]interface{}{"1": 1}, - beforeNodeFlags: map[string]interface{}{}, - afterNodeFlags: map[string]interface{}{"1": 1}, - }, - { - name: "net flags not empty; node flags not empty", - netFlags: map[string]interface{}{"1": 1}, - beforeNodeFlags: map[string]interface{}{"2": 2}, - afterNodeFlags: map[string]interface{}{"1": 1, "2": 2}, - }, - { - name: "net flags empty; node flags not empty", - netFlags: map[string]interface{}{}, - beforeNodeFlags: map[string]interface{}{"2": 2}, - afterNodeFlags: map[string]interface{}{"2": 2}, - }, - } - for _, tt := range tests { - t.Run(tt.name, func(t *testing.T) { - require := require.New(t) - addNetworkFlags(tt.netFlags, tt.beforeNodeFlags) - require.Equal(tt.afterNodeFlags, tt.beforeNodeFlags) - }) - } -} - -func TestSetNodeName(t *testing.T) { - t.Parallel() - require := require.New(t) - - ln := &localNetwork{ - nodes: make(map[string]*localNode), - nextNodeSuffix: 1, - } - - // Case: No name given - config := &node.Config{Name: ""} - err := ln.setNodeName(config) - require.NoError(err) - require.Equal("node1", config.Name) - - // Case: No name given again - config.Name = "" - err = ln.setNodeName(config) - require.NoError(err) - require.Equal("node1", config.Name) - - // Case: name given - config.Name = "hi" - err = ln.setNodeName(config) - require.NoError(err) - require.Equal("hi", config.Name) - - // Case: name already present - config.Name = "hi" - ln.nodes = map[string]*localNode{ - "hi": {}, - } - err = ln.setNodeName(config) - require.Error(err) -} - -func TestGetConfigEntry(t *testing.T) { - t.Parallel() - require := require.New(t) - - // case: key not present - val, err := getConfigEntry( - map[string]interface{}{}, - map[string]interface{}{"2": "2"}, - "1", - "1", - ) - require.NoError(err) - require.Equal("1", val) - - // case: key present - val, err = getConfigEntry( - map[string]interface{}{}, - map[string]interface{}{"1": "hi", "2": "2"}, - "1", - "1", - ) - require.NoError(err) - require.Equal("hi", val) - - // case: key present wrong type - _, err = getConfigEntry( - map[string]interface{}{}, - map[string]interface{}{"1": 1, "2": "2"}, - "1", - "1", - ) - require.Error(err) -} - -func TestGetPort(t *testing.T) { - t.Parallel() - require := require.New(t) - - // Case: port key present in config file - port, err := getPort( - map[string]interface{}{}, - map[string]interface{}{"flag": float64(10013)}, - "flag", - false, - ) - require.NoError(err) - require.Equal(uint16(10013), port) - - // Case: port key present in flags - port, err = getPort( - map[string]interface{}{"flag": 10013}, - map[string]interface{}{}, - "flag", - false, - ) - require.NoError(err) - require.Equal(uint16(10013), port) - - // Case: port key present in config file and flags - port, err = getPort( - map[string]interface{}{"flag": 10013}, - map[string]interface{}{"flag": float64(14)}, - "flag", - false, - ) - require.NoError(err) - require.Equal(uint16(10013), port) - - // Case: port key not present - _, err = getPort( - map[string]interface{}{}, - map[string]interface{}{}, - "flag", - false, - ) - require.NoError(err) -} - -func TestCreateFileAndWrite(t *testing.T) { - t.Parallel() - require := require.New(t) - dir, err := os.MkdirTemp("", "network-runner-test-*") - require.NoError(err) - path := filepath.Join(dir, "path") - contents := []byte("hi") - err = createFileAndWrite(path, contents) - require.NoError(err) - gotBytes, err := os.ReadFile(path) - require.NoError(err) - require.Equal(contents, gotBytes) -} - -func TestWriteFiles(t *testing.T) { - t.Parallel() - stakingKey := "stakingKey" - stakingCert := "stakingCert" - genesis := []byte("genesis") - configFile := "config file" - chainConfigFiles := map[string]string{ - "C": "c-chain config file", - } - tmpDir, err := os.MkdirTemp("", "netrunner-tests-*") - if err != nil { - t.Fatal(err) - } - stakingKeyPath := filepath.Join(tmpDir, stakingKeyFileName) - stakingCertPath := filepath.Join(tmpDir, stakingCertFileName) - stakingSigningKeyPath := filepath.Join(tmpDir, stakingSigningKeyFileName) - genesisPath := filepath.Join(tmpDir, genesisFileName) - configFilePath := filepath.Join(tmpDir, configFileName) - chainConfigDir := filepath.Join(tmpDir, chainConfigSubDir) - subnetConfigDir := filepath.Join(tmpDir, subnetConfigSubDir) - cChainConfigPath := filepath.Join(tmpDir, chainConfigSubDir, "C", configFileName) - - type test struct { - name string - shouldErr bool - genesis []byte - nodeConfig node.Config - expectedFlags map[string]string - } - - tests := []test{ - { - name: "no config files given", - shouldErr: false, - genesis: genesis, - nodeConfig: node.Config{ - StakingKey: stakingKey, - StakingCert: stakingCert, - }, - expectedFlags: map[string]string{ - config.StakingTLSKeyPathKey: stakingKeyPath, - config.StakingCertPathKey: stakingCertPath, - config.StakingSignerKeyPathKey: stakingSigningKeyPath, - config.GenesisFileKey: genesisPath, - config.ChainConfigDirKey: chainConfigDir, - config.SubnetConfigDirKey: subnetConfigDir, - }, - }, - { - name: "config file given but not c-chain config file", - shouldErr: false, - genesis: genesis, - nodeConfig: node.Config{ - StakingKey: stakingKey, - StakingCert: stakingCert, - ConfigFile: configFile, - }, - expectedFlags: map[string]string{ - config.StakingTLSKeyPathKey: stakingKeyPath, - config.StakingCertPathKey: stakingCertPath, - config.StakingSignerKeyPathKey: stakingSigningKeyPath, - config.GenesisFileKey: genesisPath, - config.ChainConfigDirKey: chainConfigDir, - config.SubnetConfigDirKey: subnetConfigDir, - config.ConfigFileKey: configFilePath, - }, - }, - { - name: "config file and c-chain config file given", - shouldErr: false, - genesis: genesis, - nodeConfig: node.Config{ - StakingKey: stakingKey, - StakingCert: stakingCert, - ConfigFile: configFile, - ChainConfigFiles: chainConfigFiles, - }, - expectedFlags: map[string]string{ - config.StakingTLSKeyPathKey: stakingKeyPath, - config.StakingCertPathKey: stakingCertPath, - config.StakingSignerKeyPathKey: stakingSigningKeyPath, - config.GenesisFileKey: genesisPath, - config.ChainConfigDirKey: chainConfigDir, - config.SubnetConfigDirKey: subnetConfigDir, - config.ConfigFileKey: configFilePath, - }, - }, - } - - for _, tt := range tests { - t.Run(tt.name, func(t *testing.T) { - require := require.New(t) - flags, err := writeFiles(0, tt.genesis, tmpDir, &tt.nodeConfig) - if tt.shouldErr { - require.Error(err) - return - } - require.NoError(err) - // Make sure returned flags are right - require.Len(tt.expectedFlags, len(flags)) - for k := range flags { - require.Equal(tt.expectedFlags[k], flags[k]) - } - // Assert files created correctly - gotStakingKey, err := os.ReadFile(stakingKeyPath) - require.NoError(err) - require.Equal([]byte(tt.nodeConfig.StakingKey), gotStakingKey) - gotStakingCert, err := os.ReadFile(stakingCertPath) - require.NoError(err) - require.Equal([]byte(tt.nodeConfig.StakingCert), gotStakingCert) - gotGenesis, err := os.ReadFile(genesisPath) - require.NoError(err) - require.Equal(tt.genesis, gotGenesis) - if len(tt.nodeConfig.ConfigFile) > 0 { - gotConfigFile, err := os.ReadFile(configFilePath) - require.NoError(err) - require.Equal([]byte(configFile), gotConfigFile) - } - if tt.nodeConfig.ChainConfigFiles != nil { - gotCChainConfigFile, err := os.ReadFile(cChainConfigPath) - require.NoError(err) - require.Equal([]byte(chainConfigFiles["C"]), gotCChainConfigFile) - } - }) - } -} - -func TestRemoveBeacon(t *testing.T) { - t.Parallel() - require := require.New(t) - - // create a network with no nodes in it - emptyNetworkConfig, err := emptyNetworkConfig() - require.NoError(err) - net, err := newNetwork(logging.NoLog{}, newMockAPISuccessful, &localTestSuccessfulNodeProcessCreator{}, "", "", false) - require.NoError(err) - err = net.loadConfig(context.Background(), emptyNetworkConfig) - require.NoError(err) - - // a network config for a 3 node staking network, and add the bootstrapper - // to the exesting network - networkConfig := testNetworkConfig(t) - _, err = net.AddNode(networkConfig.NodeConfigs[0]) - require.NoError(err) - - // remove the beacon node from the network - err = net.RemoveNode(context.Background(), networkConfig.NodeConfigs[0].Name) - require.NoError(err) - require.Equal(0, net.bootstraps.Len()) -} - -// Returns an API client where: -// - The Health API's Health method always returns an error after the -// given context is cancelled. -// - The CChainEthAPI's Close method may be called -// - Only the above 2 methods may be called -func newMockAPIHealthyBlocks(string, uint16) api.Client { - healthClient := &healthmocks.Client{} - healthClient.On("Health", mock.MatchedBy(func(_ context.Context) bool { - return true - }), mock.Anything, mock.Anything).Return( - func(ctx context.Context, _ []string, _ ...rpc.Option) *health.APIReply { - <-ctx.Done() - return nil - }, - func(ctx context.Context, _ []string, _ ...rpc.Option) error { - <-ctx.Done() - return ctx.Err() - }, - ) - // ethClient used when removing nodes, to close websocket connection - ethClient := &apimocks.EthClient{} - ethClient.On("Close").Return() - client := &apimocks.Client{} - client.On("HealthAPI").Return(healthClient) - client.On("CChainEthAPI").Return(ethClient) - return client -} - -// Assert that if the network's Stop method is called while -// a call to Healthy is ongoing, Healthy returns immediately. -func TestHealthyDuringNetworkStop(t *testing.T) { - require := require.New(t) - networkConfig := testNetworkConfig(t) - // Calls to a node's Healthy() function blocks until context cancelled - net, err := newNetwork(logging.NoLog{}, newMockAPIHealthyBlocks, &localTestSuccessfulNodeProcessCreator{}, "", "", false) - require.NoError(err) - err = net.loadConfig(context.Background(), networkConfig) - require.NoError(err) - - healthyChan := make(chan error) - go func() { - healthyChan <- net.Healthy(context.Background()) - }() - // Wait to make sure we're actually blocking on Health API call - time.Sleep(500 * time.Millisecond) - err = net.Stop(context.Background()) - require.NoError(err) - select { - case err := <-healthyChan: - require.Error(err) - case <-time.After(1 * time.Second): - // Since [net.Stop] was called, [net.Healthy] should immediately return. - // We assume that it will do so within 1 second. - require.Fail("Healthy should've returned immediately because network closed") - } -} diff --git a/local/node.go.bak b/local/node.go.bak deleted file mode 100644 index 7bf98052..00000000 --- a/local/node.go.bak +++ /dev/null @@ -1,295 +0,0 @@ -package local - -import ( - "context" - "crypto" - "encoding/json" - "fmt" - "net" - "net/netip" - "time" - - "github.com/luxfi/netrunner/api" - "github.com/luxfi/netrunner/network/node" - "github.com/luxfi/netrunner/network/node/status" - "github.com/luxfi/ids" - "github.com/luxfi/p2p/message" - "github.com/luxfi/p2p/peer" - "github.com/luxfi/p2p/throttling" - "github.com/luxfi/sdk/node/consensus/networking/router" - "github.com/luxfi/sdk/node/consensus/networking/tracker" - "github.com/luxfi/sdk/node/consensus/validators" - "github.com/luxfi/staking" - "github.com/luxfi/utils" - "github.com/luxfi/utils/constants" - "github.com/luxfi/crypto/bls" - luxlog "github.com/luxfi/log" - luxmetrics "github.com/luxfi/metrics" - "github.com/luxfi/math/meter" - "github.com/luxfi/utils/resource" - "github.com/luxfi/utils/set" - "github.com/luxfi/version" - "github.com/prometheus/client_golang/prometheus" -) - -var ( - _ getConnFunc = defaultGetConnFunc - _ node.Node = (*localNode)(nil) -) - -type getConnFunc func(context.Context, node.Node) (net.Conn, error) - -const ( - peerMsgQueueBufferSize = 1024 - peerResourceTrackerDuration = 10 * time.Second - peerStartWaitTimeout = 30 * time.Second -) - -// Gives access to basic node info, and to most node apis -type localNode struct { - // Must be unique across all nodes in this network. - name string - // [nodeID] is this node's Lux Node ID. - // Set in network.AddNode - nodeID ids.NodeID - // The ID of the network this node exists in - networkID uint32 - // Allows user to make API calls to this node. - client api.Client - // The process running this node. - process NodeProcess - // The API port - apiPort uint16 - // The P2P (staking) port - p2pPort uint16 - // Returns a connection to this node - getConnFunc getConnFunc - // The data dir of the node - dataDir string - // The db dir of the node - dbDir string - // The logs dir of the node - logsDir string - // The plugin dir of the node - pluginDir string - // The node config - config node.Config - // The node httpHost - httpHost string - // maps from peer ID to peer object - attachedPeers map[string]peer.Peer - // signals that the process is stopped but the information is valid - // and can be resumed - paused bool -} - -func defaultGetConnFunc(ctx context.Context, node node.Node) (net.Conn, error) { - dialer := net.Dialer{} - return dialer.DialContext(ctx, constants.NetworkType, net.JoinHostPort(node.GetURL(), fmt.Sprintf("%d", node.GetP2PPort()))) -} - -// AttachPeer: see Network -func (node *localNode) AttachPeer(ctx context.Context, router router.InboundHandler) (peer.Peer, error) { - tlsCert, err := staking.NewTLSCert() - if err != nil { - return nil, err - } - tlsConfg := peer.TLSConfig(*tlsCert, nil) - clientUpgrader := peer.NewTLSClientUpgrader(tlsConfg, prometheus.NewCounter(prometheus.CounterOpts{})) - conn, err := node.getConnFunc(ctx, node) - if err != nil { - return nil, err - } - mc, err := message.NewCreator( - luxlog.NewNoOpLogger(), - luxmetrics.NewPrometheusMetrics("netrunner", prometheus.NewRegistry()), - constants.DefaultNetworkCompressionType, - 10*time.Second, - ) - if err != nil { - return nil, err - } - - metrics, err := peer.NewMetrics( - prometheus.NewRegistry(), - ) - if err != nil { - return nil, err - } - resourceTracker, err := tracker.NewResourceTracker( - prometheus.NewRegistry(), - resource.NoUsage, - meter.ContinuousFactory{}, - peerResourceTrackerDuration, - ) - if err != nil { - return nil, err - } - signerIP := utils.NewAtomic(netip.AddrPortFrom(netip.IPv6Unspecified(), 0)) - tls := tlsCert.PrivateKey.(crypto.Signer) - // Create a dummy BLS signer for now - blsKey, err := bls.NewSecretKey() - if err != nil { - return nil, err - } - config := &peer.Config{ - Metrics: metrics, - MessageCreator: mc, - Log: luxlog.NewNoOpLogger(), - InboundMsgThrottler: throttling.NewNoInboundThrottler(), - Network: peer.TestNetwork, - Router: router, - VersionCompatibility: version.GetCompatibility(node.networkID), - MySubnets: set.Set[ids.ID]{}, - Beacons: validators.NewManager(), - Validators: validators.NewManager(), - NetworkID: node.networkID, - PingFrequency: constants.DefaultPingFrequency, - PongTimeout: constants.DefaultPingPongTimeout, - MaxClockDifference: time.Minute, - ResourceTracker: resourceTracker, - IPSigner: peer.NewIPSigner(signerIP, tls, blsKey), - } - _, conn, cert, err := clientUpgrader.Upgrade(conn) - if err != nil { - return nil, err - } - - p := peer.Start( - config, - conn, - cert, - ids.NodeIDFromCert(&ids.Certificate{ - Raw: cert.Raw, - PublicKey: cert.PublicKey, - }), - peer.NewBlockingMessageQueue( - config.Metrics, - luxlog.NewNoOpLogger(), - peerMsgQueueBufferSize, - ), - ) - cctx, cancel := context.WithTimeout(ctx, peerStartWaitTimeout) - err = p.AwaitReady(cctx) - cancel() - if err != nil { - return nil, err - } - - node.attachedPeers[p.ID().String()] = p - return p, nil -} - -func (node *localNode) SendOutboundMessage(ctx context.Context, peerID string, content []byte, op uint32) (bool, error) { - attachedPeer, ok := node.attachedPeers[peerID] - if !ok { - return false, fmt.Errorf("peer with ID %s is not attached here", peerID) - } - msg := NewTestMsg(message.Op(op), content, false) - return attachedPeer.Send(ctx, msg), nil -} - -// See node.Node -func (node *localNode) GetName() string { - return node.name -} - -// See node.Node -func (node *localNode) GetNodeID() ids.NodeID { - return node.nodeID -} - -// See node.Node -func (node *localNode) GetAPIClient() api.Client { - return node.client -} - -// See node.Node -func (node *localNode) GetURL() string { - if node.httpHost == "0.0.0.0" || node.httpHost == "." { - return "0.0.0.0" - } - return "127.0.0.1" -} - -// See node.Node -func (node *localNode) GetP2PPort() uint16 { - return node.p2pPort -} - -// See node.Node -func (node *localNode) GetAPIPort() uint16 { - return node.apiPort -} - -func (node *localNode) Status() status.Status { - return node.process.Status() -} - -// See node.Node -func (node *localNode) GetBinaryPath() string { - return node.config.BinaryPath -} - -// See node.Node -func (node *localNode) GetPluginDir() string { - return node.pluginDir -} - -// See node.Node -func (node *localNode) GetDataDir() string { - return node.dataDir -} - -// See node.Node -// TODO rename method so linter doesn't complain. -func (node *localNode) GetDbDir() string { //nolint - return node.dbDir -} - -// See node.Node -func (node *localNode) GetLogsDir() string { - return node.logsDir -} - -// See node.Node -func (node *localNode) GetConfigFile() string { - return node.config.ConfigFile -} - -// See node.Node -func (node *localNode) GetConfig() node.Config { - return node.config -} - -// See node.Node -func (node *localNode) GetFlag(k string) (string, error) { - var v string - if node.config.ConfigFile != "" { - var configFileMap map[string]interface{} - if err := json.Unmarshal([]byte(node.config.ConfigFile), &configFileMap); err != nil { - return "", err - } - vIntf, ok := configFileMap[k] - if ok { - v, ok = vIntf.(string) - if !ok { - return "", fmt.Errorf("unexpected type for %q expected string got %T", k, vIntf) - } - } - } else if node.config.Flags != nil { - vIntf, ok := node.config.Flags[k] - if ok { - v, ok = vIntf.(string) - if !ok { - return "", fmt.Errorf("unexpected type for %q expected string got %T", k, vIntf) - } - } - } - return v, nil -} - -// See node.Node -func (node *localNode) GetPaused() bool { - return node.paused -} diff --git a/local/node_test.go.bak b/local/node_test.go.bak deleted file mode 100644 index 41be7d8e..00000000 --- a/local/node_test.go.bak +++ /dev/null @@ -1,243 +0,0 @@ -package local - -import ( - "bytes" - "context" - "crypto" - "crypto/tls" - "encoding/binary" - "io" - "net" - "net/netip" - "testing" - "time" - - "github.com/luxfi/netrunner/network/node" - "github.com/luxfi/ids" - "github.com/luxfi/p2p/message" - "github.com/luxfi/p2p/peer" - "github.com/luxfi/staking" - "github.com/luxfi/utils/constants" - "github.com/luxfi/utils/ips" - "github.com/luxfi/utils/logging" - "github.com/luxfi/utils/wrappers" - "github.com/luxfi/version" - "github.com/luxfi/metrics" - "github.com/prometheus/client_golang/prometheus" - "github.com/stretchr/testify/require" -) - -const bitmaskCodec = uint32(1 << 31) - -func upgradeConn(myTLSCert *tls.Certificate, conn net.Conn) (ids.NodeID, net.Conn, error) { - tlsConfig := peer.TLSConfig(*myTLSCert, nil) - upgrader := peer.NewTLSServerUpgrader(tlsConfig) - // this will block until the ssh handshake is done - peerID, tlsConn, _, err := upgrader.Upgrade(conn) - return peerID, tlsConn, err -} - -// verifyProtocol reads from the connection and asserts that we read the expected message sequence. -// It also sends the required messages to complete the p2p handshake. -// Sequence: -// 1. Write the version message length to peer -// 2. Write version message to peer -// 3. Write peerlist message length to peer -// 4. Write peerlist message to peer -// If an unexpected error occurs, or we get an unexpected message, sends an error on [errCh]. -// Sends nil on [errCh] if we get the expected message sequence. -func verifyProtocol( - require *require.Assertions, - opSequence []message.Op, - mc message.Creator, - nodeConn net.Conn, - errCh chan error, -) { - // do the TLS handshake - myTLSCert, err := staking.NewTLSCert() - if err != nil { - errCh <- err - return - } - peerID, tlsConn, err := upgradeConn(myTLSCert, nodeConn) - if err != nil { - errCh <- err - return - } - nodeConn = tlsConn - - // send the peer our version and peerlist - - // create the version message - myIP := netip.AddrPortFrom(netip.IPv6Unspecified(), 0) - now := uint64(time.Now().Unix()) - unsignedIP := peer.UnsignedIP{ - AddrPort: myIP, - Timestamp: now, - } - signer := myTLSCert.PrivateKey.(crypto.Signer) - signedIP, err := unsignedIP.Sign(signer) - if err != nil { - errCh <- err - return - } - verMsg, err := mc.Version( - constants.MainnetID, - now, - myIP, - version.CurrentApp.String(), - now, - signedIP.Signature, - []ids.ID{}, - ) - if err != nil { - errCh <- err - return - } - - // create the PeerList message - plMsg, err := mc.PeerList([]ips.ClaimedIPPort{}, true) - if err != nil { - errCh <- err - return - } - - // send the Version message - if err := sendMessage(nodeConn, verMsg.Bytes(), errCh); err != nil { - // if there was an error no need to continue - return - } - // send the PeerList message - if err := sendMessage(nodeConn, plMsg.Bytes(), errCh); err != nil { - // if there was an error no need to continue - return - } - - // at this point we sent all messages expected for handshake, - // now *read* the messages on the other end and check they are in - // the expected sequence - for _, expectedOpMsg := range opSequence { - msgBytes, err := readMessage(nodeConn, errCh) - if err != nil { - // If there was an error no need continue - return - } - msg, err := mc.Parse(msgBytes.Bytes(), peerID, func() {}) - require.NoError(err) - op := msg.Op() - require.Equal(expectedOpMsg, op) - } - // signal we are actually done - errCh <- nil -} - -// readMessage reads from the connection and returns a protocol message in bytes -func readMessage(nodeConn net.Conn, errCh chan error) (*bytes.Buffer, error) { - msgLenBytes := &bytes.Buffer{} - // read the message length - if _, err := io.CopyN(msgLenBytes, nodeConn, wrappers.IntLen); err != nil { - errCh <- err - return nil, err - } - msgLen := binary.BigEndian.Uint32(msgLenBytes.Bytes()) - msgLen &^= bitmaskCodec - msgBytes := &bytes.Buffer{} - // read the message - if _, err := io.CopyN(msgBytes, nodeConn, int64(msgLen)); err != nil { - errCh <- err - return nil, err - } - return msgBytes, nil -} - -// sendMessage sends a protocol message to the node peer -func sendMessage(nodeConn net.Conn, msgBytes []byte, errCh chan error) error { - // buffer for message length - msgLenBytes := make([]byte, wrappers.IntLen) - lenBuf := bytes.NewBuffer(msgLenBytes) - - // write the message length - binary.BigEndian.PutUint32(msgLenBytes, uint32(len(msgBytes))) - // send the message length - if _, err := io.CopyN(nodeConn, lenBuf, wrappers.IntLen); err != nil { - errCh <- err - return err - } - // write the message - msgBuf := bytes.NewBuffer(msgBytes) - // send the message - if _, err := io.CopyN(nodeConn, msgBuf, int64(len(msgBytes))); err != nil { - errCh <- err - return err - } - return nil -} - -// TestAttachPeer tests that we can attach a test peer to a node -// and that the node receives messages sent through the test peer -func TestAttachPeer(t *testing.T) { - require := require.New(t) - - // [nodeConn] is the connection that [node] uses to read from/write to [peer] (defined below) - // Similar for [peerConn]. - nodeConn, peerConn := net.Pipe() - defer func() { - _ = nodeConn.Close() - _ = peerConn.Close() - }() - - node := localNode{ - nodeID: ids.GenerateTestNodeID(), - networkID: constants.MainnetID, - getConnFunc: func(ctx context.Context, n node.Node) (net.Conn, error) { - return peerConn, nil - }, - attachedPeers: map[string]peer.Peer{}, - } - - // For message creation and parsing - mc, err := message.NewCreator( - logging.NoLog{}, - metrics.NewRegistry(), - "", - constants.DefaultNetworkCompressionType, - 10*time.Second, - ) - require.NoError(err) - - // Expect the peer to send these messages in this order. - expectedMessages := []message.Op{ - message.VersionOp, - message.PeerListOp, - message.ChitsOp, - } - - // [p] define below will write to/read from [peerConn] - // Start a goroutine that reads messages from the other end of that - // connection and asserts that we get the expected messages - errCh := make(chan error, 1) - go verifyProtocol(require, expectedMessages, mc, nodeConn, errCh) - - // attach a test peer to [node] - handler := &noOpInboundHandler{} - p, err := node.AttachPeer(context.Background(), handler) - require.NoError(err) - - // we'll use a Chits message for testing. (We could use any message type.) - containerIDs := []ids.ID{ - ids.GenerateTestID(), - ids.GenerateTestID(), - ids.GenerateTestID(), - } - requestID := uint32(42) - chainID := constants.PlatformChainID - // create the Chits message - msg, err := mc.Chits(chainID, requestID, []ids.ID{}, containerIDs) - require.NoError(err) - // send chits to [node] - ok := p.Send(context.Background(), msg) - require.True(ok) - // wait until the go routines are done - // also ensures that [require] calls will be reflected in test results if failed - require.NoError(<-errCh) -} diff --git a/local/wallet_client.go b/local/wallet_client.go index 6a084de6..c3c3e1e3 100644 --- a/local/wallet_client.go +++ b/local/wallet_client.go @@ -6,7 +6,7 @@ package local import ( "context" - "github.com/luxfi/protocol/p/txs" + "github.com/luxfi/proto/p/txs" "github.com/luxfi/sdk/platformvm" pwalletwallet "github.com/luxfi/sdk/wallet/chain/p/wallet" "github.com/luxfi/sdk/wallet/primary/common" diff --git a/rpcpb/rpc.pb.go b/rpcpb/rpc.pb.go index 805e750e..4bc11c84 100644 --- a/rpcpb/rpc.pb.go +++ b/rpcpb/rpc.pb.go @@ -1,6 +1,6 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.35.1 +// protoc-gen-go v1.36.11 // protoc (unknown) // source: rpcpb/rpc.proto @@ -12,6 +12,7 @@ import ( protoimpl "google.golang.org/protobuf/runtime/protoimpl" reflect "reflect" sync "sync" + unsafe "unsafe" ) const ( @@ -22,9 +23,9 @@ const ( ) type PingRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache + state protoimpl.MessageState `protogen:"open.v1"` unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *PingRequest) Reset() { @@ -58,11 +59,10 @@ func (*PingRequest) Descriptor() ([]byte, []int) { } type PingResponse struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache + state protoimpl.MessageState `protogen:"open.v1"` + Pid int32 `protobuf:"varint,1,opt,name=pid,proto3" json:"pid,omitempty"` unknownFields protoimpl.UnknownFields - - Pid int32 `protobuf:"varint,1,opt,name=pid,proto3" json:"pid,omitempty"` + sizeCache protoimpl.SizeCache } func (x *PingResponse) Reset() { @@ -103,11 +103,10 @@ func (x *PingResponse) GetPid() int32 { } type ChainParticipants struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache + state protoimpl.MessageState `protogen:"open.v1"` + NodeNames []string `protobuf:"bytes,1,rep,name=node_names,json=nodeNames,proto3" json:"node_names,omitempty"` unknownFields protoimpl.UnknownFields - - NodeNames []string `protobuf:"bytes,1,rep,name=node_names,json=nodeNames,proto3" json:"node_names,omitempty"` + sizeCache protoimpl.SizeCache } func (x *ChainParticipants) Reset() { @@ -148,22 +147,21 @@ func (x *ChainParticipants) GetNodeNames() []string { } type ClusterInfo struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - NodeNames []string `protobuf:"bytes,1,rep,name=node_names,json=nodeNames,proto3" json:"node_names,omitempty"` - NodeInfos map[string]*NodeInfo `protobuf:"bytes,2,rep,name=node_infos,json=nodeInfos,proto3" json:"node_infos,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` - Pid int32 `protobuf:"varint,3,opt,name=pid,proto3" json:"pid,omitempty"` - RootDataDir string `protobuf:"bytes,4,opt,name=root_data_dir,json=rootDataDir,proto3" json:"root_data_dir,omitempty"` - Healthy bool `protobuf:"varint,5,opt,name=healthy,proto3" json:"healthy,omitempty"` + state protoimpl.MessageState `protogen:"open.v1"` + NodeNames []string `protobuf:"bytes,1,rep,name=node_names,json=nodeNames,proto3" json:"node_names,omitempty"` + NodeInfos map[string]*NodeInfo `protobuf:"bytes,2,rep,name=node_infos,json=nodeInfos,proto3" json:"node_infos,omitempty" protobuf_key:"bytes,1,opt,name=key" protobuf_val:"bytes,2,opt,name=value"` + Pid int32 `protobuf:"varint,3,opt,name=pid,proto3" json:"pid,omitempty"` + RootDataDir string `protobuf:"bytes,4,opt,name=root_data_dir,json=rootDataDir,proto3" json:"root_data_dir,omitempty"` + Healthy bool `protobuf:"varint,5,opt,name=healthy,proto3" json:"healthy,omitempty"` // Maps from the node ID to its attached peer infos. - AttachedPeerInfos map[string]*ListOfAttachedPeerInfo `protobuf:"bytes,6,rep,name=attached_peer_infos,json=attachedPeerInfos,proto3" json:"attached_peer_infos,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` + AttachedPeerInfos map[string]*ListOfAttachedPeerInfo `protobuf:"bytes,6,rep,name=attached_peer_infos,json=attachedPeerInfos,proto3" json:"attached_peer_infos,omitempty" protobuf_key:"bytes,1,opt,name=key" protobuf_val:"bytes,2,opt,name=value"` // Set to "true" once custom blockchains are ready. CustomChainsHealthy bool `protobuf:"varint,7,opt,name=custom_chains_healthy,json=customChainsHealthy,proto3" json:"custom_chains_healthy,omitempty"` // The map of blockchain IDs in "ids.ID" format to its blockchain information. - CustomChains map[string]*CustomChainInfo `protobuf:"bytes,8,rep,name=custom_chains,json=customChains,proto3" json:"custom_chains,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` - Chains map[string]*ChainInfo `protobuf:"bytes,9,rep,name=chains,proto3" json:"chains,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` + CustomChains map[string]*CustomChainInfo `protobuf:"bytes,8,rep,name=custom_chains,json=customChains,proto3" json:"custom_chains,omitempty" protobuf_key:"bytes,1,opt,name=key" protobuf_val:"bytes,2,opt,name=value"` + Chains map[string]*ChainInfo `protobuf:"bytes,9,rep,name=chains,proto3" json:"chains,omitempty" protobuf_key:"bytes,1,opt,name=key" protobuf_val:"bytes,2,opt,name=value"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *ClusterInfo) Reset() { @@ -260,16 +258,15 @@ func (x *ClusterInfo) GetChains() map[string]*ChainInfo { } type ChainInfo struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - + state protoimpl.MessageState `protogen:"open.v1"` // If Chain is an Elastic Chain IsElastic bool `protobuf:"varint,1,opt,name=is_elastic,json=isElastic,proto3" json:"is_elastic,omitempty"` // TXID for the elastic chain transform ElasticChainId string `protobuf:"bytes,2,opt,name=elastic_chain_id,json=elasticChainId,proto3" json:"elastic_chain_id,omitempty"` // node validators of chain ChainParticipants *ChainParticipants `protobuf:"bytes,3,opt,name=chain_participants,json=chainParticipants,proto3" json:"chain_participants,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *ChainInfo) Reset() { @@ -324,10 +321,7 @@ func (x *ChainInfo) GetChainParticipants() *ChainParticipants { } type CustomChainInfo struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - + state protoimpl.MessageState `protogen:"open.v1"` // Blockchain name given to the create blockchain TX // Currently used to keep a record of the VM name, // which is not saved anywhere and can't be recovered from VM ID @@ -339,7 +333,9 @@ type CustomChainInfo struct { PchainId string `protobuf:"bytes,3,opt,name=pchain_id,json=pchainId,proto3" json:"pchain_id,omitempty"` // Create blockchain transaction ID -- blockchain ID> // The blockchain ID is used for RPC endpoints. - BlockchainId string `protobuf:"bytes,4,opt,name=blockchain_id,json=blockchainId,proto3" json:"blockchain_id,omitempty"` + BlockchainId string `protobuf:"bytes,4,opt,name=blockchain_id,json=blockchainId,proto3" json:"blockchain_id,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *CustomChainInfo) Reset() { @@ -401,20 +397,19 @@ func (x *CustomChainInfo) GetBlockchainId() string { } type NodeInfo struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` - ExecPath string `protobuf:"bytes,2,opt,name=exec_path,json=execPath,proto3" json:"exec_path,omitempty"` - Uri string `protobuf:"bytes,3,opt,name=uri,proto3" json:"uri,omitempty"` - Id string `protobuf:"bytes,4,opt,name=id,proto3" json:"id,omitempty"` - LogDir string `protobuf:"bytes,5,opt,name=log_dir,json=logDir,proto3" json:"log_dir,omitempty"` - DbDir string `protobuf:"bytes,6,opt,name=db_dir,json=dbDir,proto3" json:"db_dir,omitempty"` - PluginDir string `protobuf:"bytes,7,opt,name=plugin_dir,json=pluginDir,proto3" json:"plugin_dir,omitempty"` - WhitelistedChains string `protobuf:"bytes,8,opt,name=whitelisted_chains,json=whitelistedChains,proto3" json:"whitelisted_chains,omitempty"` - Config []byte `protobuf:"bytes,9,opt,name=config,proto3" json:"config,omitempty"` - Paused bool `protobuf:"varint,10,opt,name=paused,proto3" json:"paused,omitempty"` + state protoimpl.MessageState `protogen:"open.v1"` + Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` + ExecPath string `protobuf:"bytes,2,opt,name=exec_path,json=execPath,proto3" json:"exec_path,omitempty"` + Uri string `protobuf:"bytes,3,opt,name=uri,proto3" json:"uri,omitempty"` + Id string `protobuf:"bytes,4,opt,name=id,proto3" json:"id,omitempty"` + LogDir string `protobuf:"bytes,5,opt,name=log_dir,json=logDir,proto3" json:"log_dir,omitempty"` + DbDir string `protobuf:"bytes,6,opt,name=db_dir,json=dbDir,proto3" json:"db_dir,omitempty"` + PluginDir string `protobuf:"bytes,7,opt,name=plugin_dir,json=pluginDir,proto3" json:"plugin_dir,omitempty"` + WhitelistedChains string `protobuf:"bytes,8,opt,name=whitelisted_chains,json=whitelistedChains,proto3" json:"whitelisted_chains,omitempty"` + Config []byte `protobuf:"bytes,9,opt,name=config,proto3" json:"config,omitempty"` + Paused bool `protobuf:"varint,10,opt,name=paused,proto3" json:"paused,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *NodeInfo) Reset() { @@ -518,11 +513,10 @@ func (x *NodeInfo) GetPaused() bool { } type AttachedPeerInfo struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache + state protoimpl.MessageState `protogen:"open.v1"` + Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` unknownFields protoimpl.UnknownFields - - Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` + sizeCache protoimpl.SizeCache } func (x *AttachedPeerInfo) Reset() { @@ -563,11 +557,10 @@ func (x *AttachedPeerInfo) GetId() string { } type ListOfAttachedPeerInfo struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache + state protoimpl.MessageState `protogen:"open.v1"` + Peers []*AttachedPeerInfo `protobuf:"bytes,1,rep,name=peers,proto3" json:"peers,omitempty"` unknownFields protoimpl.UnknownFields - - Peers []*AttachedPeerInfo `protobuf:"bytes,1,rep,name=peers,proto3" json:"peers,omitempty"` + sizeCache protoimpl.SizeCache } func (x *ListOfAttachedPeerInfo) Reset() { @@ -608,10 +601,7 @@ func (x *ListOfAttachedPeerInfo) GetPeers() []*AttachedPeerInfo { } type StartRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - + state protoimpl.MessageState `protogen:"open.v1"` // Network identifier - name or ID // Supported values: "mainnet" (1), "testnet" (2), "devnet" (3), "custom" (1337) // or any custom network name @@ -645,15 +635,15 @@ type StartRequest struct { // does not install the custom chain and does not create the chain, // even if the VM binary exists on the local plugins directory. BlockchainSpecs []*BlockchainSpec `protobuf:"bytes,10,rep,name=blockchain_specs,json=blockchainSpecs,proto3" json:"blockchain_specs,omitempty"` - CustomNodeConfigs map[string]string `protobuf:"bytes,11,rep,name=custom_node_configs,json=customNodeConfigs,proto3" json:"custom_node_configs,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` + CustomNodeConfigs map[string]string `protobuf:"bytes,11,rep,name=custom_node_configs,json=customNodeConfigs,proto3" json:"custom_node_configs,omitempty" protobuf_key:"bytes,1,opt,name=key" protobuf_val:"bytes,2,opt,name=value"` // Map of chain name to config file contents. // If specified, will create a file "chainname/config.json" with // the contents provided here. - ChainConfigs map[string]string `protobuf:"bytes,12,rep,name=chain_configs,json=chainConfigs,proto3" json:"chain_configs,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` + ChainConfigs map[string]string `protobuf:"bytes,12,rep,name=chain_configs,json=chainConfigs,proto3" json:"chain_configs,omitempty" protobuf_key:"bytes,1,opt,name=key" protobuf_val:"bytes,2,opt,name=value"` // Map of chain name to upgrade file contents. // If specified, will create a file "chainname/upgrade.json" with // the contents provided here. - UpgradeConfigs map[string]string `protobuf:"bytes,13,rep,name=upgrade_configs,json=upgradeConfigs,proto3" json:"upgrade_configs,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` + UpgradeConfigs map[string]string `protobuf:"bytes,13,rep,name=upgrade_configs,json=upgradeConfigs,proto3" json:"upgrade_configs,omitempty" protobuf_key:"bytes,1,opt,name=key" protobuf_val:"bytes,2,opt,name=value"` // reassign default/custom ports if they are already taken ReassignPortsIfUsed *bool `protobuf:"varint,14,opt,name=reassign_ports_if_used,json=reassignPortsIfUsed,proto3,oneof" json:"reassign_ports_if_used,omitempty"` // use dynamic ports instead of default ones @@ -661,7 +651,9 @@ type StartRequest struct { // Map of chain id to chain config file contents. // If specified, will create a file "chainid.json" under chains config dir with // the contents provided here. - ChainConfigFiles map[string]string `protobuf:"bytes,16,rep,name=chain_config_files,json=chainConfigFiles,proto3" json:"chain_config_files,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` + ChainConfigFiles map[string]string `protobuf:"bytes,16,rep,name=chain_config_files,json=chainConfigFiles,proto3" json:"chain_config_files,omitempty" protobuf_key:"bytes,1,opt,name=key" protobuf_val:"bytes,2,opt,name=value"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *StartRequest) Reset() { @@ -800,9 +792,9 @@ func (x *StartRequest) GetChainConfigFiles() map[string]string { } type RPCVersionRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache + state protoimpl.MessageState `protogen:"open.v1"` unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *RPCVersionRequest) Reset() { @@ -836,11 +828,10 @@ func (*RPCVersionRequest) Descriptor() ([]byte, []int) { } type RPCVersionResponse struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache + state protoimpl.MessageState `protogen:"open.v1"` + Version uint32 `protobuf:"varint,1,opt,name=version,proto3" json:"version,omitempty"` unknownFields protoimpl.UnknownFields - - Version uint32 `protobuf:"varint,1,opt,name=version,proto3" json:"version,omitempty"` + sizeCache protoimpl.SizeCache } func (x *RPCVersionResponse) Reset() { @@ -881,12 +872,11 @@ func (x *RPCVersionResponse) GetVersion() uint32 { } type StartResponse struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache + state protoimpl.MessageState `protogen:"open.v1"` + ClusterInfo *ClusterInfo `protobuf:"bytes,1,opt,name=cluster_info,json=clusterInfo,proto3" json:"cluster_info,omitempty"` + ChainIds []string `protobuf:"bytes,2,rep,name=chain_ids,json=chainIds,proto3" json:"chain_ids,omitempty"` unknownFields protoimpl.UnknownFields - - ClusterInfo *ClusterInfo `protobuf:"bytes,1,opt,name=cluster_info,json=clusterInfo,proto3" json:"cluster_info,omitempty"` - ChainIds []string `protobuf:"bytes,2,rep,name=chain_ids,json=chainIds,proto3" json:"chain_ids,omitempty"` + sizeCache protoimpl.SizeCache } func (x *StartResponse) Reset() { @@ -934,14 +924,13 @@ func (x *StartResponse) GetChainIds() []string { } type ChainSpec struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - + state protoimpl.MessageState `protogen:"open.v1"` // if empty, assumes all nodes should be participants Participants []string `protobuf:"bytes,1,rep,name=participants,proto3" json:"participants,omitempty"` // either file path or file contents ChainConfigFile string `protobuf:"bytes,2,opt,name=chain_config_file,json=chainConfigFile,proto3" json:"chain_config_file,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *ChainSpec) Reset() { @@ -989,25 +978,24 @@ func (x *ChainSpec) GetChainConfigFile() string { } type ElasticChainSpec struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - ChainId string `protobuf:"bytes,1,opt,name=chain_id,json=chainId,proto3" json:"chain_id,omitempty"` - AssetName string `protobuf:"bytes,2,opt,name=asset_name,json=assetName,proto3" json:"asset_name,omitempty"` - AssetSymbol string `protobuf:"bytes,3,opt,name=asset_symbol,json=assetSymbol,proto3" json:"asset_symbol,omitempty"` - InitialSupply uint64 `protobuf:"varint,4,opt,name=initial_supply,json=initialSupply,proto3" json:"initial_supply,omitempty"` - MaxSupply uint64 `protobuf:"varint,5,opt,name=max_supply,json=maxSupply,proto3" json:"max_supply,omitempty"` - MinConsumptionRate uint64 `protobuf:"varint,6,opt,name=min_consumption_rate,json=minConsumptionRate,proto3" json:"min_consumption_rate,omitempty"` - MaxConsumptionRate uint64 `protobuf:"varint,7,opt,name=max_consumption_rate,json=maxConsumptionRate,proto3" json:"max_consumption_rate,omitempty"` - MinValidatorStake uint64 `protobuf:"varint,8,opt,name=min_validator_stake,json=minValidatorStake,proto3" json:"min_validator_stake,omitempty"` - MaxValidatorStake uint64 `protobuf:"varint,9,opt,name=max_validator_stake,json=maxValidatorStake,proto3" json:"max_validator_stake,omitempty"` - MinStakeDuration uint64 `protobuf:"varint,10,opt,name=min_stake_duration,json=minStakeDuration,proto3" json:"min_stake_duration,omitempty"` - MaxStakeDuration uint64 `protobuf:"varint,11,opt,name=max_stake_duration,json=maxStakeDuration,proto3" json:"max_stake_duration,omitempty"` - MinDelegationFee uint32 `protobuf:"varint,12,opt,name=min_delegation_fee,json=minDelegationFee,proto3" json:"min_delegation_fee,omitempty"` - MinDelegatorStake uint64 `protobuf:"varint,13,opt,name=min_delegator_stake,json=minDelegatorStake,proto3" json:"min_delegator_stake,omitempty"` - MaxValidatorWeightFactor uint32 `protobuf:"varint,14,opt,name=max_validator_weight_factor,json=maxValidatorWeightFactor,proto3" json:"max_validator_weight_factor,omitempty"` - UptimeRequirement uint32 `protobuf:"varint,15,opt,name=uptime_requirement,json=uptimeRequirement,proto3" json:"uptime_requirement,omitempty"` + state protoimpl.MessageState `protogen:"open.v1"` + ChainId string `protobuf:"bytes,1,opt,name=chain_id,json=chainId,proto3" json:"chain_id,omitempty"` + AssetName string `protobuf:"bytes,2,opt,name=asset_name,json=assetName,proto3" json:"asset_name,omitempty"` + AssetSymbol string `protobuf:"bytes,3,opt,name=asset_symbol,json=assetSymbol,proto3" json:"asset_symbol,omitempty"` + InitialSupply uint64 `protobuf:"varint,4,opt,name=initial_supply,json=initialSupply,proto3" json:"initial_supply,omitempty"` + MaxSupply uint64 `protobuf:"varint,5,opt,name=max_supply,json=maxSupply,proto3" json:"max_supply,omitempty"` + MinConsumptionRate uint64 `protobuf:"varint,6,opt,name=min_consumption_rate,json=minConsumptionRate,proto3" json:"min_consumption_rate,omitempty"` + MaxConsumptionRate uint64 `protobuf:"varint,7,opt,name=max_consumption_rate,json=maxConsumptionRate,proto3" json:"max_consumption_rate,omitempty"` + MinValidatorStake uint64 `protobuf:"varint,8,opt,name=min_validator_stake,json=minValidatorStake,proto3" json:"min_validator_stake,omitempty"` + MaxValidatorStake uint64 `protobuf:"varint,9,opt,name=max_validator_stake,json=maxValidatorStake,proto3" json:"max_validator_stake,omitempty"` + MinStakeDuration uint64 `protobuf:"varint,10,opt,name=min_stake_duration,json=minStakeDuration,proto3" json:"min_stake_duration,omitempty"` + MaxStakeDuration uint64 `protobuf:"varint,11,opt,name=max_stake_duration,json=maxStakeDuration,proto3" json:"max_stake_duration,omitempty"` + MinDelegationFee uint32 `protobuf:"varint,12,opt,name=min_delegation_fee,json=minDelegationFee,proto3" json:"min_delegation_fee,omitempty"` + MinDelegatorStake uint64 `protobuf:"varint,13,opt,name=min_delegator_stake,json=minDelegatorStake,proto3" json:"min_delegator_stake,omitempty"` + MaxValidatorWeightFactor uint32 `protobuf:"varint,14,opt,name=max_validator_weight_factor,json=maxValidatorWeightFactor,proto3" json:"max_validator_weight_factor,omitempty"` + UptimeRequirement uint32 `protobuf:"varint,15,opt,name=uptime_requirement,json=uptimeRequirement,proto3" json:"uptime_requirement,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *ElasticChainSpec) Reset() { @@ -1146,11 +1134,10 @@ func (x *ElasticChainSpec) GetUptimeRequirement() uint32 { } type TransformElasticChainsRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - ElasticChainSpec []*ElasticChainSpec `protobuf:"bytes,1,rep,name=elastic_chain_spec,json=elasticChainSpec,proto3" json:"elastic_chain_spec,omitempty"` + state protoimpl.MessageState `protogen:"open.v1"` + ElasticChainSpec []*ElasticChainSpec `protobuf:"bytes,1,rep,name=elastic_chain_spec,json=elasticChainSpec,proto3" json:"elastic_chain_spec,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *TransformElasticChainsRequest) Reset() { @@ -1191,13 +1178,12 @@ func (x *TransformElasticChainsRequest) GetElasticChainSpec() []*ElasticChainSpe } type TransformElasticChainsResponse struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache + state protoimpl.MessageState `protogen:"open.v1"` + ClusterInfo *ClusterInfo `protobuf:"bytes,1,opt,name=cluster_info,json=clusterInfo,proto3" json:"cluster_info,omitempty"` + TxIds []string `protobuf:"bytes,2,rep,name=tx_ids,json=txIds,proto3" json:"tx_ids,omitempty"` + AssetIds []string `protobuf:"bytes,3,rep,name=asset_ids,json=assetIds,proto3" json:"asset_ids,omitempty"` unknownFields protoimpl.UnknownFields - - ClusterInfo *ClusterInfo `protobuf:"bytes,1,opt,name=cluster_info,json=clusterInfo,proto3" json:"cluster_info,omitempty"` - TxIds []string `protobuf:"bytes,2,rep,name=tx_ids,json=txIds,proto3" json:"tx_ids,omitempty"` - AssetIds []string `protobuf:"bytes,3,rep,name=asset_ids,json=assetIds,proto3" json:"asset_ids,omitempty"` + sizeCache protoimpl.SizeCache } func (x *TransformElasticChainsResponse) Reset() { @@ -1252,16 +1238,15 @@ func (x *TransformElasticChainsResponse) GetAssetIds() []string { } type PermissionlessValidatorSpec struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - ChainId string `protobuf:"bytes,1,opt,name=chain_id,json=chainId,proto3" json:"chain_id,omitempty"` - NodeName string `protobuf:"bytes,2,opt,name=node_name,json=nodeName,proto3" json:"node_name,omitempty"` - StakedTokenAmount uint64 `protobuf:"varint,3,opt,name=staked_token_amount,json=stakedTokenAmount,proto3" json:"staked_token_amount,omitempty"` - AssetId string `protobuf:"bytes,4,opt,name=asset_id,json=assetId,proto3" json:"asset_id,omitempty"` - StartTime string `protobuf:"bytes,5,opt,name=start_time,json=startTime,proto3" json:"start_time,omitempty"` - StakeDuration uint64 `protobuf:"varint,6,opt,name=stake_duration,json=stakeDuration,proto3" json:"stake_duration,omitempty"` + state protoimpl.MessageState `protogen:"open.v1"` + ChainId string `protobuf:"bytes,1,opt,name=chain_id,json=chainId,proto3" json:"chain_id,omitempty"` + NodeName string `protobuf:"bytes,2,opt,name=node_name,json=nodeName,proto3" json:"node_name,omitempty"` + StakedTokenAmount uint64 `protobuf:"varint,3,opt,name=staked_token_amount,json=stakedTokenAmount,proto3" json:"staked_token_amount,omitempty"` + AssetId string `protobuf:"bytes,4,opt,name=asset_id,json=assetId,proto3" json:"asset_id,omitempty"` + StartTime string `protobuf:"bytes,5,opt,name=start_time,json=startTime,proto3" json:"start_time,omitempty"` + StakeDuration uint64 `protobuf:"varint,6,opt,name=stake_duration,json=stakeDuration,proto3" json:"stake_duration,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *PermissionlessValidatorSpec) Reset() { @@ -1337,11 +1322,10 @@ func (x *PermissionlessValidatorSpec) GetStakeDuration() uint64 { } type AddPermissionlessValidatorRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - + state protoimpl.MessageState `protogen:"open.v1"` ValidatorSpec []*PermissionlessValidatorSpec `protobuf:"bytes,1,rep,name=validator_spec,json=validatorSpec,proto3" json:"validator_spec,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *AddPermissionlessValidatorRequest) Reset() { @@ -1382,11 +1366,10 @@ func (x *AddPermissionlessValidatorRequest) GetValidatorSpec() []*Permissionless } type AddPermissionlessValidatorResponse struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache + state protoimpl.MessageState `protogen:"open.v1"` + ClusterInfo *ClusterInfo `protobuf:"bytes,1,opt,name=cluster_info,json=clusterInfo,proto3" json:"cluster_info,omitempty"` unknownFields protoimpl.UnknownFields - - ClusterInfo *ClusterInfo `protobuf:"bytes,1,opt,name=cluster_info,json=clusterInfo,proto3" json:"cluster_info,omitempty"` + sizeCache protoimpl.SizeCache } func (x *AddPermissionlessValidatorResponse) Reset() { @@ -1427,12 +1410,11 @@ func (x *AddPermissionlessValidatorResponse) GetClusterInfo() *ClusterInfo { } type RemoveChainValidatorSpec struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache + state protoimpl.MessageState `protogen:"open.v1"` + ChainId string `protobuf:"bytes,1,opt,name=chain_id,json=chainId,proto3" json:"chain_id,omitempty"` + NodeNames []string `protobuf:"bytes,2,rep,name=node_names,json=nodeNames,proto3" json:"node_names,omitempty"` unknownFields protoimpl.UnknownFields - - ChainId string `protobuf:"bytes,1,opt,name=chain_id,json=chainId,proto3" json:"chain_id,omitempty"` - NodeNames []string `protobuf:"bytes,2,rep,name=node_names,json=nodeNames,proto3" json:"node_names,omitempty"` + sizeCache protoimpl.SizeCache } func (x *RemoveChainValidatorSpec) Reset() { @@ -1480,11 +1462,10 @@ func (x *RemoveChainValidatorSpec) GetNodeNames() []string { } type RemoveChainValidatorRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - + state protoimpl.MessageState `protogen:"open.v1"` ValidatorSpec []*RemoveChainValidatorSpec `protobuf:"bytes,1,rep,name=validator_spec,json=validatorSpec,proto3" json:"validator_spec,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *RemoveChainValidatorRequest) Reset() { @@ -1525,11 +1506,10 @@ func (x *RemoveChainValidatorRequest) GetValidatorSpec() []*RemoveChainValidator } type RemoveChainValidatorResponse struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache + state protoimpl.MessageState `protogen:"open.v1"` + ClusterInfo *ClusterInfo `protobuf:"bytes,1,opt,name=cluster_info,json=clusterInfo,proto3" json:"cluster_info,omitempty"` unknownFields protoimpl.UnknownFields - - ClusterInfo *ClusterInfo `protobuf:"bytes,1,opt,name=cluster_info,json=clusterInfo,proto3" json:"cluster_info,omitempty"` + sizeCache protoimpl.SizeCache } func (x *RemoveChainValidatorResponse) Reset() { @@ -1570,11 +1550,8 @@ func (x *RemoveChainValidatorResponse) GetClusterInfo() *ClusterInfo { } type BlockchainSpec struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - VmName string `protobuf:"bytes,1,opt,name=vm_name,json=vmName,proto3" json:"vm_name,omitempty"` + state protoimpl.MessageState `protogen:"open.v1"` + VmName string `protobuf:"bytes,1,opt,name=vm_name,json=vmName,proto3" json:"vm_name,omitempty"` // either file path or file contents Genesis string `protobuf:"bytes,2,opt,name=genesis,proto3" json:"genesis,omitempty"` // either a chain_id is given for a previously created chain, @@ -1588,6 +1565,8 @@ type BlockchainSpec struct { BlockchainAlias string `protobuf:"bytes,7,opt,name=blockchain_alias,json=blockchainAlias,proto3" json:"blockchain_alias,omitempty"` // Per node chain config, either file path or file contents PerNodeChainConfig string `protobuf:"bytes,8,opt,name=per_node_chain_config,json=perNodeChainConfig,proto3" json:"per_node_chain_config,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *BlockchainSpec) Reset() { @@ -1677,10 +1656,7 @@ func (x *BlockchainSpec) GetPerNodeChainConfig() string { } type CreateBlockchainsRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - + state protoimpl.MessageState `protogen:"open.v1"` // The list of: // - custom chain's VM name // - genesis file path @@ -1697,6 +1673,8 @@ type CreateBlockchainsRequest struct { // If this field is set to none (by default), the node/network-runner // will return error BlockchainSpecs []*BlockchainSpec `protobuf:"bytes,1,rep,name=blockchain_specs,json=blockchainSpecs,proto3" json:"blockchain_specs,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *CreateBlockchainsRequest) Reset() { @@ -1737,12 +1715,11 @@ func (x *CreateBlockchainsRequest) GetBlockchainSpecs() []*BlockchainSpec { } type CreateBlockchainsResponse struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache + state protoimpl.MessageState `protogen:"open.v1"` + ClusterInfo *ClusterInfo `protobuf:"bytes,1,opt,name=cluster_info,json=clusterInfo,proto3" json:"cluster_info,omitempty"` + ChainIds []string `protobuf:"bytes,2,rep,name=chain_ids,json=chainIds,proto3" json:"chain_ids,omitempty"` unknownFields protoimpl.UnknownFields - - ClusterInfo *ClusterInfo `protobuf:"bytes,1,opt,name=cluster_info,json=clusterInfo,proto3" json:"cluster_info,omitempty"` - ChainIds []string `protobuf:"bytes,2,rep,name=chain_ids,json=chainIds,proto3" json:"chain_ids,omitempty"` + sizeCache protoimpl.SizeCache } func (x *CreateBlockchainsResponse) Reset() { @@ -1790,11 +1767,10 @@ func (x *CreateBlockchainsResponse) GetChainIds() []string { } type CreateChainsRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache + state protoimpl.MessageState `protogen:"open.v1"` + ChainSpecs []*ChainSpec `protobuf:"bytes,1,rep,name=chain_specs,json=chainSpecs,proto3" json:"chain_specs,omitempty"` unknownFields protoimpl.UnknownFields - - ChainSpecs []*ChainSpec `protobuf:"bytes,1,rep,name=chain_specs,json=chainSpecs,proto3" json:"chain_specs,omitempty"` + sizeCache protoimpl.SizeCache } func (x *CreateChainsRequest) Reset() { @@ -1835,12 +1811,11 @@ func (x *CreateChainsRequest) GetChainSpecs() []*ChainSpec { } type CreateChainsResponse struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache + state protoimpl.MessageState `protogen:"open.v1"` + ClusterInfo *ClusterInfo `protobuf:"bytes,1,opt,name=cluster_info,json=clusterInfo,proto3" json:"cluster_info,omitempty"` + ChainIds []string `protobuf:"bytes,2,rep,name=chain_ids,json=chainIds,proto3" json:"chain_ids,omitempty"` unknownFields protoimpl.UnknownFields - - ClusterInfo *ClusterInfo `protobuf:"bytes,1,opt,name=cluster_info,json=clusterInfo,proto3" json:"cluster_info,omitempty"` - ChainIds []string `protobuf:"bytes,2,rep,name=chain_ids,json=chainIds,proto3" json:"chain_ids,omitempty"` + sizeCache protoimpl.SizeCache } func (x *CreateChainsResponse) Reset() { @@ -1888,13 +1863,12 @@ func (x *CreateChainsResponse) GetChainIds() []string { } type HealthRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - + state protoimpl.MessageState `protogen:"open.v1"` // Network name to check health for // If empty, checks overall server health - NetworkName *string `protobuf:"bytes,1,opt,name=network_name,json=networkName,proto3,oneof" json:"network_name,omitempty"` + NetworkName *string `protobuf:"bytes,1,opt,name=network_name,json=networkName,proto3,oneof" json:"network_name,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *HealthRequest) Reset() { @@ -1935,13 +1909,12 @@ func (x *HealthRequest) GetNetworkName() string { } type HealthResponse struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - ClusterInfo *ClusterInfo `protobuf:"bytes,1,opt,name=cluster_info,json=clusterInfo,proto3" json:"cluster_info,omitempty"` + state protoimpl.MessageState `protogen:"open.v1"` + ClusterInfo *ClusterInfo `protobuf:"bytes,1,opt,name=cluster_info,json=clusterInfo,proto3" json:"cluster_info,omitempty"` // Network-specific health information NetworkHealth *NetworkHealth `protobuf:"bytes,2,opt,name=network_health,json=networkHealth,proto3,oneof" json:"network_health,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *HealthResponse) Reset() { @@ -1989,15 +1962,14 @@ func (x *HealthResponse) GetNetworkHealth() *NetworkHealth { } type NetworkHealth struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - NetworkName string `protobuf:"bytes,1,opt,name=network_name,json=networkName,proto3" json:"network_name,omitempty"` - NetworkId uint32 `protobuf:"varint,2,opt,name=network_id,json=networkId,proto3" json:"network_id,omitempty"` - Healthy bool `protobuf:"varint,3,opt,name=healthy,proto3" json:"healthy,omitempty"` - HealthyNodes []string `protobuf:"bytes,4,rep,name=healthy_nodes,json=healthyNodes,proto3" json:"healthy_nodes,omitempty"` - UnhealthyNodes []string `protobuf:"bytes,5,rep,name=unhealthy_nodes,json=unhealthyNodes,proto3" json:"unhealthy_nodes,omitempty"` + state protoimpl.MessageState `protogen:"open.v1"` + NetworkName string `protobuf:"bytes,1,opt,name=network_name,json=networkName,proto3" json:"network_name,omitempty"` + NetworkId uint32 `protobuf:"varint,2,opt,name=network_id,json=networkId,proto3" json:"network_id,omitempty"` + Healthy bool `protobuf:"varint,3,opt,name=healthy,proto3" json:"healthy,omitempty"` + HealthyNodes []string `protobuf:"bytes,4,rep,name=healthy_nodes,json=healthyNodes,proto3" json:"healthy_nodes,omitempty"` + UnhealthyNodes []string `protobuf:"bytes,5,rep,name=unhealthy_nodes,json=unhealthyNodes,proto3" json:"unhealthy_nodes,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *NetworkHealth) Reset() { @@ -2066,9 +2038,9 @@ func (x *NetworkHealth) GetUnhealthyNodes() []string { } type URIsRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache + state protoimpl.MessageState `protogen:"open.v1"` unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *URIsRequest) Reset() { @@ -2102,11 +2074,10 @@ func (*URIsRequest) Descriptor() ([]byte, []int) { } type URIsResponse struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache + state protoimpl.MessageState `protogen:"open.v1"` + Uris []string `protobuf:"bytes,1,rep,name=uris,proto3" json:"uris,omitempty"` unknownFields protoimpl.UnknownFields - - Uris []string `protobuf:"bytes,1,rep,name=uris,proto3" json:"uris,omitempty"` + sizeCache protoimpl.SizeCache } func (x *URIsResponse) Reset() { @@ -2147,13 +2118,12 @@ func (x *URIsResponse) GetUris() []string { } type WaitForHealthyRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - + state protoimpl.MessageState `protogen:"open.v1"` // Network name to wait for // If empty, waits for any network to be healthy - NetworkName *string `protobuf:"bytes,1,opt,name=network_name,json=networkName,proto3,oneof" json:"network_name,omitempty"` + NetworkName *string `protobuf:"bytes,1,opt,name=network_name,json=networkName,proto3,oneof" json:"network_name,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *WaitForHealthyRequest) Reset() { @@ -2194,11 +2164,10 @@ func (x *WaitForHealthyRequest) GetNetworkName() string { } type WaitForHealthyResponse struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache + state protoimpl.MessageState `protogen:"open.v1"` + ClusterInfo *ClusterInfo `protobuf:"bytes,1,opt,name=cluster_info,json=clusterInfo,proto3" json:"cluster_info,omitempty"` unknownFields protoimpl.UnknownFields - - ClusterInfo *ClusterInfo `protobuf:"bytes,1,opt,name=cluster_info,json=clusterInfo,proto3" json:"cluster_info,omitempty"` + sizeCache protoimpl.SizeCache } func (x *WaitForHealthyResponse) Reset() { @@ -2239,13 +2208,12 @@ func (x *WaitForHealthyResponse) GetClusterInfo() *ClusterInfo { } type StatusRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - + state protoimpl.MessageState `protogen:"open.v1"` // Network name to get status for // If empty, returns overall server status - NetworkName *string `protobuf:"bytes,1,opt,name=network_name,json=networkName,proto3,oneof" json:"network_name,omitempty"` + NetworkName *string `protobuf:"bytes,1,opt,name=network_name,json=networkName,proto3,oneof" json:"network_name,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *StatusRequest) Reset() { @@ -2286,13 +2254,12 @@ func (x *StatusRequest) GetNetworkName() string { } type StatusResponse struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - ClusterInfo *ClusterInfo `protobuf:"bytes,1,opt,name=cluster_info,json=clusterInfo,proto3" json:"cluster_info,omitempty"` + state protoimpl.MessageState `protogen:"open.v1"` + ClusterInfo *ClusterInfo `protobuf:"bytes,1,opt,name=cluster_info,json=clusterInfo,proto3" json:"cluster_info,omitempty"` // Network-specific status information NetworkStatus *NetworkStatus `protobuf:"bytes,2,opt,name=network_status,json=networkStatus,proto3,oneof" json:"network_status,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *StatusResponse) Reset() { @@ -2340,16 +2307,15 @@ func (x *StatusResponse) GetNetworkStatus() *NetworkStatus { } type NetworkStatus struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache + state protoimpl.MessageState `protogen:"open.v1"` + NetworkName string `protobuf:"bytes,1,opt,name=network_name,json=networkName,proto3" json:"network_name,omitempty"` + NetworkId uint32 `protobuf:"varint,2,opt,name=network_id,json=networkId,proto3" json:"network_id,omitempty"` + Status string `protobuf:"bytes,3,opt,name=status,proto3" json:"status,omitempty"` // "running", "stopped", "starting", "error" + NumNodes uint32 `protobuf:"varint,4,opt,name=num_nodes,json=numNodes,proto3" json:"num_nodes,omitempty"` + Nodes []*NodeInfo `protobuf:"bytes,5,rep,name=nodes,proto3" json:"nodes,omitempty"` + Chains []*ChainInfo `protobuf:"bytes,6,rep,name=chains,proto3" json:"chains,omitempty"` unknownFields protoimpl.UnknownFields - - NetworkName string `protobuf:"bytes,1,opt,name=network_name,json=networkName,proto3" json:"network_name,omitempty"` - NetworkId uint32 `protobuf:"varint,2,opt,name=network_id,json=networkId,proto3" json:"network_id,omitempty"` - Status string `protobuf:"bytes,3,opt,name=status,proto3" json:"status,omitempty"` // "running", "stopped", "starting", "error" - NumNodes uint32 `protobuf:"varint,4,opt,name=num_nodes,json=numNodes,proto3" json:"num_nodes,omitempty"` - Nodes []*NodeInfo `protobuf:"bytes,5,rep,name=nodes,proto3" json:"nodes,omitempty"` - Chains []*ChainInfo `protobuf:"bytes,6,rep,name=chains,proto3" json:"chains,omitempty"` + sizeCache protoimpl.SizeCache } func (x *NetworkStatus) Reset() { @@ -2425,11 +2391,10 @@ func (x *NetworkStatus) GetChains() []*ChainInfo { } type StreamStatusRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache + state protoimpl.MessageState `protogen:"open.v1"` + PushInterval int64 `protobuf:"varint,1,opt,name=push_interval,json=pushInterval,proto3" json:"push_interval,omitempty"` unknownFields protoimpl.UnknownFields - - PushInterval int64 `protobuf:"varint,1,opt,name=push_interval,json=pushInterval,proto3" json:"push_interval,omitempty"` + sizeCache protoimpl.SizeCache } func (x *StreamStatusRequest) Reset() { @@ -2470,11 +2435,10 @@ func (x *StreamStatusRequest) GetPushInterval() int64 { } type StreamStatusResponse struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache + state protoimpl.MessageState `protogen:"open.v1"` + ClusterInfo *ClusterInfo `protobuf:"bytes,1,opt,name=cluster_info,json=clusterInfo,proto3" json:"cluster_info,omitempty"` unknownFields protoimpl.UnknownFields - - ClusterInfo *ClusterInfo `protobuf:"bytes,1,opt,name=cluster_info,json=clusterInfo,proto3" json:"cluster_info,omitempty"` + sizeCache protoimpl.SizeCache } func (x *StreamStatusResponse) Reset() { @@ -2515,10 +2479,7 @@ func (x *StreamStatusResponse) GetClusterInfo() *ClusterInfo { } type RestartNodeRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - + state protoimpl.MessageState `protogen:"open.v1"` // Must be a valid node name. Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` // Optional fields are set to the previous values if empty. @@ -2527,17 +2488,19 @@ type RestartNodeRequest struct { // Map of chain name to config file contents. // If specified, will create a file "chainname/config.json" with // the contents provided here. - ChainConfigs map[string]string `protobuf:"bytes,4,rep,name=chain_configs,json=chainConfigs,proto3" json:"chain_configs,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` + ChainConfigs map[string]string `protobuf:"bytes,4,rep,name=chain_configs,json=chainConfigs,proto3" json:"chain_configs,omitempty" protobuf_key:"bytes,1,opt,name=key" protobuf_val:"bytes,2,opt,name=value"` // Map of chain name to config file contents. // If specified, will create a file "chainname/upgrade.json" with // the contents provided here. - UpgradeConfigs map[string]string `protobuf:"bytes,5,rep,name=upgrade_configs,json=upgradeConfigs,proto3" json:"upgrade_configs,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` + UpgradeConfigs map[string]string `protobuf:"bytes,5,rep,name=upgrade_configs,json=upgradeConfigs,proto3" json:"upgrade_configs,omitempty" protobuf_key:"bytes,1,opt,name=key" protobuf_val:"bytes,2,opt,name=value"` // Map of chain id to chain config file contents. // If specified, will create a file "chainid.json" under chains config dir with // the contents provided here. - ChainConfigFiles map[string]string `protobuf:"bytes,6,rep,name=chain_config_files,json=chainConfigFiles,proto3" json:"chain_config_files,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` + ChainConfigFiles map[string]string `protobuf:"bytes,6,rep,name=chain_config_files,json=chainConfigFiles,proto3" json:"chain_config_files,omitempty" protobuf_key:"bytes,1,opt,name=key" protobuf_val:"bytes,2,opt,name=value"` // Plugin dir from which to load all custom VM executables. - PluginDir string `protobuf:"bytes,7,opt,name=plugin_dir,json=pluginDir,proto3" json:"plugin_dir,omitempty"` + PluginDir string `protobuf:"bytes,7,opt,name=plugin_dir,json=pluginDir,proto3" json:"plugin_dir,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *RestartNodeRequest) Reset() { @@ -2620,11 +2583,10 @@ func (x *RestartNodeRequest) GetPluginDir() string { } type RestartNodeResponse struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache + state protoimpl.MessageState `protogen:"open.v1"` + ClusterInfo *ClusterInfo `protobuf:"bytes,1,opt,name=cluster_info,json=clusterInfo,proto3" json:"cluster_info,omitempty"` unknownFields protoimpl.UnknownFields - - ClusterInfo *ClusterInfo `protobuf:"bytes,1,opt,name=cluster_info,json=clusterInfo,proto3" json:"cluster_info,omitempty"` + sizeCache protoimpl.SizeCache } func (x *RestartNodeResponse) Reset() { @@ -2665,11 +2627,10 @@ func (x *RestartNodeResponse) GetClusterInfo() *ClusterInfo { } type RemoveNodeRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache + state protoimpl.MessageState `protogen:"open.v1"` + Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` unknownFields protoimpl.UnknownFields - - Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` + sizeCache protoimpl.SizeCache } func (x *RemoveNodeRequest) Reset() { @@ -2710,11 +2671,10 @@ func (x *RemoveNodeRequest) GetName() string { } type RemoveNodeResponse struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache + state protoimpl.MessageState `protogen:"open.v1"` + ClusterInfo *ClusterInfo `protobuf:"bytes,1,opt,name=cluster_info,json=clusterInfo,proto3" json:"cluster_info,omitempty"` unknownFields protoimpl.UnknownFields - - ClusterInfo *ClusterInfo `protobuf:"bytes,1,opt,name=cluster_info,json=clusterInfo,proto3" json:"cluster_info,omitempty"` + sizeCache protoimpl.SizeCache } func (x *RemoveNodeResponse) Reset() { @@ -2755,11 +2715,10 @@ func (x *RemoveNodeResponse) GetClusterInfo() *ClusterInfo { } type PauseNodeRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache + state protoimpl.MessageState `protogen:"open.v1"` + Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` unknownFields protoimpl.UnknownFields - - Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` + sizeCache protoimpl.SizeCache } func (x *PauseNodeRequest) Reset() { @@ -2800,11 +2759,10 @@ func (x *PauseNodeRequest) GetName() string { } type PauseNodeResponse struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache + state protoimpl.MessageState `protogen:"open.v1"` + ClusterInfo *ClusterInfo `protobuf:"bytes,1,opt,name=cluster_info,json=clusterInfo,proto3" json:"cluster_info,omitempty"` unknownFields protoimpl.UnknownFields - - ClusterInfo *ClusterInfo `protobuf:"bytes,1,opt,name=cluster_info,json=clusterInfo,proto3" json:"cluster_info,omitempty"` + sizeCache protoimpl.SizeCache } func (x *PauseNodeResponse) Reset() { @@ -2845,11 +2803,10 @@ func (x *PauseNodeResponse) GetClusterInfo() *ClusterInfo { } type ResumeNodeRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache + state protoimpl.MessageState `protogen:"open.v1"` + Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` unknownFields protoimpl.UnknownFields - - Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` + sizeCache protoimpl.SizeCache } func (x *ResumeNodeRequest) Reset() { @@ -2890,11 +2847,10 @@ func (x *ResumeNodeRequest) GetName() string { } type ResumeNodeResponse struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache + state protoimpl.MessageState `protogen:"open.v1"` + ClusterInfo *ClusterInfo `protobuf:"bytes,1,opt,name=cluster_info,json=clusterInfo,proto3" json:"cluster_info,omitempty"` unknownFields protoimpl.UnknownFields - - ClusterInfo *ClusterInfo `protobuf:"bytes,1,opt,name=cluster_info,json=clusterInfo,proto3" json:"cluster_info,omitempty"` + sizeCache protoimpl.SizeCache } func (x *ResumeNodeResponse) Reset() { @@ -2935,27 +2891,26 @@ func (x *ResumeNodeResponse) GetClusterInfo() *ClusterInfo { } type AddNodeRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` - ExecPath string `protobuf:"bytes,2,opt,name=exec_path,json=execPath,proto3" json:"exec_path,omitempty"` - NodeConfig *string `protobuf:"bytes,3,opt,name=node_config,json=nodeConfig,proto3,oneof" json:"node_config,omitempty"` + state protoimpl.MessageState `protogen:"open.v1"` + Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` + ExecPath string `protobuf:"bytes,2,opt,name=exec_path,json=execPath,proto3" json:"exec_path,omitempty"` + NodeConfig *string `protobuf:"bytes,3,opt,name=node_config,json=nodeConfig,proto3,oneof" json:"node_config,omitempty"` // Map of chain name to config file contents. // If specified, will create a file "chainname/config.json" with // the contents provided here. - ChainConfigs map[string]string `protobuf:"bytes,4,rep,name=chain_configs,json=chainConfigs,proto3" json:"chain_configs,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` + ChainConfigs map[string]string `protobuf:"bytes,4,rep,name=chain_configs,json=chainConfigs,proto3" json:"chain_configs,omitempty" protobuf_key:"bytes,1,opt,name=key" protobuf_val:"bytes,2,opt,name=value"` // Map of chain name to config file contents. // If specified, will create a file "chainname/upgrade.json" with // the contents provided here. - UpgradeConfigs map[string]string `protobuf:"bytes,5,rep,name=upgrade_configs,json=upgradeConfigs,proto3" json:"upgrade_configs,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` + UpgradeConfigs map[string]string `protobuf:"bytes,5,rep,name=upgrade_configs,json=upgradeConfigs,proto3" json:"upgrade_configs,omitempty" protobuf_key:"bytes,1,opt,name=key" protobuf_val:"bytes,2,opt,name=value"` // Map of chain id to chain config file contents. // If specified, will create a file "chainid.json" under chains config dir with // the contents provided here. - ChainConfigFiles map[string]string `protobuf:"bytes,6,rep,name=chain_config_files,json=chainConfigFiles,proto3" json:"chain_config_files,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` + ChainConfigFiles map[string]string `protobuf:"bytes,6,rep,name=chain_config_files,json=chainConfigFiles,proto3" json:"chain_config_files,omitempty" protobuf_key:"bytes,1,opt,name=key" protobuf_val:"bytes,2,opt,name=value"` // Plugin dir from which to load all custom VM executables. - PluginDir string `protobuf:"bytes,7,opt,name=plugin_dir,json=pluginDir,proto3" json:"plugin_dir,omitempty"` + PluginDir string `protobuf:"bytes,7,opt,name=plugin_dir,json=pluginDir,proto3" json:"plugin_dir,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *AddNodeRequest) Reset() { @@ -3038,11 +2993,10 @@ func (x *AddNodeRequest) GetPluginDir() string { } type AddNodeResponse struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache + state protoimpl.MessageState `protogen:"open.v1"` + ClusterInfo *ClusterInfo `protobuf:"bytes,1,opt,name=cluster_info,json=clusterInfo,proto3" json:"cluster_info,omitempty"` unknownFields protoimpl.UnknownFields - - ClusterInfo *ClusterInfo `protobuf:"bytes,1,opt,name=cluster_info,json=clusterInfo,proto3" json:"cluster_info,omitempty"` + sizeCache protoimpl.SizeCache } func (x *AddNodeResponse) Reset() { @@ -3083,9 +3037,9 @@ func (x *AddNodeResponse) GetClusterInfo() *ClusterInfo { } type StopRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache + state protoimpl.MessageState `protogen:"open.v1"` unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *StopRequest) Reset() { @@ -3119,11 +3073,10 @@ func (*StopRequest) Descriptor() ([]byte, []int) { } type StopResponse struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache + state protoimpl.MessageState `protogen:"open.v1"` + ClusterInfo *ClusterInfo `protobuf:"bytes,1,opt,name=cluster_info,json=clusterInfo,proto3" json:"cluster_info,omitempty"` unknownFields protoimpl.UnknownFields - - ClusterInfo *ClusterInfo `protobuf:"bytes,1,opt,name=cluster_info,json=clusterInfo,proto3" json:"cluster_info,omitempty"` + sizeCache protoimpl.SizeCache } func (x *StopResponse) Reset() { @@ -3164,11 +3117,10 @@ func (x *StopResponse) GetClusterInfo() *ClusterInfo { } type AttachPeerRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache + state protoimpl.MessageState `protogen:"open.v1"` + NodeName string `protobuf:"bytes,1,opt,name=node_name,json=nodeName,proto3" json:"node_name,omitempty"` unknownFields protoimpl.UnknownFields - - NodeName string `protobuf:"bytes,1,opt,name=node_name,json=nodeName,proto3" json:"node_name,omitempty"` + sizeCache protoimpl.SizeCache } func (x *AttachPeerRequest) Reset() { @@ -3209,12 +3161,11 @@ func (x *AttachPeerRequest) GetNodeName() string { } type AttachPeerResponse struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - ClusterInfo *ClusterInfo `protobuf:"bytes,1,opt,name=cluster_info,json=clusterInfo,proto3" json:"cluster_info,omitempty"` - AttachedPeerInfo *AttachedPeerInfo `protobuf:"bytes,2,opt,name=attached_peer_info,json=attachedPeerInfo,proto3" json:"attached_peer_info,omitempty"` + state protoimpl.MessageState `protogen:"open.v1"` + ClusterInfo *ClusterInfo `protobuf:"bytes,1,opt,name=cluster_info,json=clusterInfo,proto3" json:"cluster_info,omitempty"` + AttachedPeerInfo *AttachedPeerInfo `protobuf:"bytes,2,opt,name=attached_peer_info,json=attachedPeerInfo,proto3" json:"attached_peer_info,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *AttachPeerResponse) Reset() { @@ -3262,14 +3213,13 @@ func (x *AttachPeerResponse) GetAttachedPeerInfo() *AttachedPeerInfo { } type SendOutboundMessageRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache + state protoimpl.MessageState `protogen:"open.v1"` + NodeName string `protobuf:"bytes,1,opt,name=node_name,json=nodeName,proto3" json:"node_name,omitempty"` + PeerId string `protobuf:"bytes,2,opt,name=peer_id,json=peerId,proto3" json:"peer_id,omitempty"` + Op uint32 `protobuf:"varint,3,opt,name=op,proto3" json:"op,omitempty"` + Bytes []byte `protobuf:"bytes,4,opt,name=bytes,proto3" json:"bytes,omitempty"` unknownFields protoimpl.UnknownFields - - NodeName string `protobuf:"bytes,1,opt,name=node_name,json=nodeName,proto3" json:"node_name,omitempty"` - PeerId string `protobuf:"bytes,2,opt,name=peer_id,json=peerId,proto3" json:"peer_id,omitempty"` - Op uint32 `protobuf:"varint,3,opt,name=op,proto3" json:"op,omitempty"` - Bytes []byte `protobuf:"bytes,4,opt,name=bytes,proto3" json:"bytes,omitempty"` + sizeCache protoimpl.SizeCache } func (x *SendOutboundMessageRequest) Reset() { @@ -3331,11 +3281,10 @@ func (x *SendOutboundMessageRequest) GetBytes() []byte { } type SendOutboundMessageResponse struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache + state protoimpl.MessageState `protogen:"open.v1"` + Sent bool `protobuf:"varint,1,opt,name=sent,proto3" json:"sent,omitempty"` unknownFields protoimpl.UnknownFields - - Sent bool `protobuf:"varint,1,opt,name=sent,proto3" json:"sent,omitempty"` + sizeCache protoimpl.SizeCache } func (x *SendOutboundMessageResponse) Reset() { @@ -3376,12 +3325,11 @@ func (x *SendOutboundMessageResponse) GetSent() bool { } type SaveSnapshotRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache + state protoimpl.MessageState `protogen:"open.v1"` + NetworkName string `protobuf:"bytes,1,opt,name=network_name,json=networkName,proto3" json:"network_name,omitempty"` + SnapshotName string `protobuf:"bytes,2,opt,name=snapshot_name,json=snapshotName,proto3" json:"snapshot_name,omitempty"` unknownFields protoimpl.UnknownFields - - NetworkName string `protobuf:"bytes,1,opt,name=network_name,json=networkName,proto3" json:"network_name,omitempty"` - SnapshotName string `protobuf:"bytes,2,opt,name=snapshot_name,json=snapshotName,proto3" json:"snapshot_name,omitempty"` + sizeCache protoimpl.SizeCache } func (x *SaveSnapshotRequest) Reset() { @@ -3429,11 +3377,10 @@ func (x *SaveSnapshotRequest) GetSnapshotName() string { } type SaveSnapshotResponse struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache + state protoimpl.MessageState `protogen:"open.v1"` + SnapshotPath string `protobuf:"bytes,1,opt,name=snapshot_path,json=snapshotPath,proto3" json:"snapshot_path,omitempty"` unknownFields protoimpl.UnknownFields - - SnapshotPath string `protobuf:"bytes,1,opt,name=snapshot_path,json=snapshotPath,proto3" json:"snapshot_path,omitempty"` + sizeCache protoimpl.SizeCache } func (x *SaveSnapshotResponse) Reset() { @@ -3474,20 +3421,19 @@ func (x *SaveSnapshotResponse) GetSnapshotPath() string { } type LoadSnapshotRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - NetworkName string `protobuf:"bytes,1,opt,name=network_name,json=networkName,proto3" json:"network_name,omitempty"` - SnapshotName string `protobuf:"bytes,2,opt,name=snapshot_name,json=snapshotName,proto3" json:"snapshot_name,omitempty"` - ExecPath *string `protobuf:"bytes,3,opt,name=exec_path,json=execPath,proto3,oneof" json:"exec_path,omitempty"` - PluginDir string `protobuf:"bytes,4,opt,name=plugin_dir,json=pluginDir,proto3" json:"plugin_dir,omitempty"` - RootDataDir *string `protobuf:"bytes,5,opt,name=root_data_dir,json=rootDataDir,proto3,oneof" json:"root_data_dir,omitempty"` - ChainConfigs map[string]string `protobuf:"bytes,6,rep,name=chain_configs,json=chainConfigs,proto3" json:"chain_configs,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` - UpgradeConfigs map[string]string `protobuf:"bytes,7,rep,name=upgrade_configs,json=upgradeConfigs,proto3" json:"upgrade_configs,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` - GlobalNodeConfig *string `protobuf:"bytes,8,opt,name=global_node_config,json=globalNodeConfig,proto3,oneof" json:"global_node_config,omitempty"` - ReassignPortsIfUsed *bool `protobuf:"varint,9,opt,name=reassign_ports_if_used,json=reassignPortsIfUsed,proto3,oneof" json:"reassign_ports_if_used,omitempty"` - ChainConfigFiles map[string]string `protobuf:"bytes,10,rep,name=chain_config_files,json=chainConfigFiles,proto3" json:"chain_config_files,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` + state protoimpl.MessageState `protogen:"open.v1"` + NetworkName string `protobuf:"bytes,1,opt,name=network_name,json=networkName,proto3" json:"network_name,omitempty"` + SnapshotName string `protobuf:"bytes,2,opt,name=snapshot_name,json=snapshotName,proto3" json:"snapshot_name,omitempty"` + ExecPath *string `protobuf:"bytes,3,opt,name=exec_path,json=execPath,proto3,oneof" json:"exec_path,omitempty"` + PluginDir string `protobuf:"bytes,4,opt,name=plugin_dir,json=pluginDir,proto3" json:"plugin_dir,omitempty"` + RootDataDir *string `protobuf:"bytes,5,opt,name=root_data_dir,json=rootDataDir,proto3,oneof" json:"root_data_dir,omitempty"` + ChainConfigs map[string]string `protobuf:"bytes,6,rep,name=chain_configs,json=chainConfigs,proto3" json:"chain_configs,omitempty" protobuf_key:"bytes,1,opt,name=key" protobuf_val:"bytes,2,opt,name=value"` + UpgradeConfigs map[string]string `protobuf:"bytes,7,rep,name=upgrade_configs,json=upgradeConfigs,proto3" json:"upgrade_configs,omitempty" protobuf_key:"bytes,1,opt,name=key" protobuf_val:"bytes,2,opt,name=value"` + GlobalNodeConfig *string `protobuf:"bytes,8,opt,name=global_node_config,json=globalNodeConfig,proto3,oneof" json:"global_node_config,omitempty"` + ReassignPortsIfUsed *bool `protobuf:"varint,9,opt,name=reassign_ports_if_used,json=reassignPortsIfUsed,proto3,oneof" json:"reassign_ports_if_used,omitempty"` + ChainConfigFiles map[string]string `protobuf:"bytes,10,rep,name=chain_config_files,json=chainConfigFiles,proto3" json:"chain_config_files,omitempty" protobuf_key:"bytes,1,opt,name=key" protobuf_val:"bytes,2,opt,name=value"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *LoadSnapshotRequest) Reset() { @@ -3591,11 +3537,10 @@ func (x *LoadSnapshotRequest) GetChainConfigFiles() map[string]string { } type LoadSnapshotResponse struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache + state protoimpl.MessageState `protogen:"open.v1"` + ClusterInfo *ClusterInfo `protobuf:"bytes,1,opt,name=cluster_info,json=clusterInfo,proto3" json:"cluster_info,omitempty"` unknownFields protoimpl.UnknownFields - - ClusterInfo *ClusterInfo `protobuf:"bytes,1,opt,name=cluster_info,json=clusterInfo,proto3" json:"cluster_info,omitempty"` + sizeCache protoimpl.SizeCache } func (x *LoadSnapshotResponse) Reset() { @@ -3636,12 +3581,11 @@ func (x *LoadSnapshotResponse) GetClusterInfo() *ClusterInfo { } type RemoveSnapshotRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache + state protoimpl.MessageState `protogen:"open.v1"` + NetworkName string `protobuf:"bytes,1,opt,name=network_name,json=networkName,proto3" json:"network_name,omitempty"` + SnapshotName string `protobuf:"bytes,2,opt,name=snapshot_name,json=snapshotName,proto3" json:"snapshot_name,omitempty"` unknownFields protoimpl.UnknownFields - - NetworkName string `protobuf:"bytes,1,opt,name=network_name,json=networkName,proto3" json:"network_name,omitempty"` - SnapshotName string `protobuf:"bytes,2,opt,name=snapshot_name,json=snapshotName,proto3" json:"snapshot_name,omitempty"` + sizeCache protoimpl.SizeCache } func (x *RemoveSnapshotRequest) Reset() { @@ -3689,9 +3633,9 @@ func (x *RemoveSnapshotRequest) GetSnapshotName() string { } type RemoveSnapshotResponse struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache + state protoimpl.MessageState `protogen:"open.v1"` unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *RemoveSnapshotResponse) Reset() { @@ -3725,11 +3669,10 @@ func (*RemoveSnapshotResponse) Descriptor() ([]byte, []int) { } type GetSnapshotNamesRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache + state protoimpl.MessageState `protogen:"open.v1"` + NetworkName string `protobuf:"bytes,1,opt,name=network_name,json=networkName,proto3" json:"network_name,omitempty"` unknownFields protoimpl.UnknownFields - - NetworkName string `protobuf:"bytes,1,opt,name=network_name,json=networkName,proto3" json:"network_name,omitempty"` + sizeCache protoimpl.SizeCache } func (x *GetSnapshotNamesRequest) Reset() { @@ -3770,11 +3713,10 @@ func (x *GetSnapshotNamesRequest) GetNetworkName() string { } type GetSnapshotNamesResponse struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache + state protoimpl.MessageState `protogen:"open.v1"` + SnapshotNames []string `protobuf:"bytes,1,rep,name=snapshot_names,json=snapshotNames,proto3" json:"snapshot_names,omitempty"` unknownFields protoimpl.UnknownFields - - SnapshotNames []string `protobuf:"bytes,1,rep,name=snapshot_names,json=snapshotNames,proto3" json:"snapshot_names,omitempty"` + sizeCache protoimpl.SizeCache } func (x *GetSnapshotNamesResponse) Reset() { @@ -3816,844 +3758,377 @@ func (x *GetSnapshotNamesResponse) GetSnapshotNames() []string { var File_rpcpb_rpc_proto protoreflect.FileDescriptor -var file_rpcpb_rpc_proto_rawDesc = []byte{ - 0x0a, 0x0f, 0x72, 0x70, 0x63, 0x70, 0x62, 0x2f, 0x72, 0x70, 0x63, 0x2e, 0x70, 0x72, 0x6f, 0x74, - 0x6f, 0x12, 0x05, 0x72, 0x70, 0x63, 0x70, 0x62, 0x1a, 0x1c, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, - 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x61, 0x6e, 0x6e, 0x6f, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, - 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0x0d, 0x0a, 0x0b, 0x50, 0x69, 0x6e, 0x67, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x20, 0x0a, 0x0c, 0x50, 0x69, 0x6e, 0x67, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x10, 0x0a, 0x03, 0x70, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x05, 0x52, 0x03, 0x70, 0x69, 0x64, 0x22, 0x32, 0x0a, 0x11, 0x43, 0x68, 0x61, 0x69, 0x6e, - 0x50, 0x61, 0x72, 0x74, 0x69, 0x63, 0x69, 0x70, 0x61, 0x6e, 0x74, 0x73, 0x12, 0x1d, 0x0a, 0x0a, - 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, - 0x52, 0x09, 0x6e, 0x6f, 0x64, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x22, 0xaa, 0x06, 0x0a, 0x0b, - 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x1d, 0x0a, 0x0a, 0x6e, - 0x6f, 0x64, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, - 0x09, 0x6e, 0x6f, 0x64, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x12, 0x40, 0x0a, 0x0a, 0x6e, 0x6f, - 0x64, 0x65, 0x5f, 0x69, 0x6e, 0x66, 0x6f, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x21, - 0x2e, 0x72, 0x70, 0x63, 0x70, 0x62, 0x2e, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x49, 0x6e, - 0x66, 0x6f, 0x2e, 0x4e, 0x6f, 0x64, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x73, 0x45, 0x6e, 0x74, 0x72, - 0x79, 0x52, 0x09, 0x6e, 0x6f, 0x64, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x73, 0x12, 0x10, 0x0a, 0x03, - 0x70, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, 0x03, 0x70, 0x69, 0x64, 0x12, 0x22, - 0x0a, 0x0d, 0x72, 0x6f, 0x6f, 0x74, 0x5f, 0x64, 0x61, 0x74, 0x61, 0x5f, 0x64, 0x69, 0x72, 0x18, - 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x72, 0x6f, 0x6f, 0x74, 0x44, 0x61, 0x74, 0x61, 0x44, - 0x69, 0x72, 0x12, 0x18, 0x0a, 0x07, 0x68, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x79, 0x18, 0x05, 0x20, - 0x01, 0x28, 0x08, 0x52, 0x07, 0x68, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x79, 0x12, 0x59, 0x0a, 0x13, - 0x61, 0x74, 0x74, 0x61, 0x63, 0x68, 0x65, 0x64, 0x5f, 0x70, 0x65, 0x65, 0x72, 0x5f, 0x69, 0x6e, - 0x66, 0x6f, 0x73, 0x18, 0x06, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x29, 0x2e, 0x72, 0x70, 0x63, 0x70, - 0x62, 0x2e, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x49, 0x6e, 0x66, 0x6f, 0x2e, 0x41, 0x74, - 0x74, 0x61, 0x63, 0x68, 0x65, 0x64, 0x50, 0x65, 0x65, 0x72, 0x49, 0x6e, 0x66, 0x6f, 0x73, 0x45, - 0x6e, 0x74, 0x72, 0x79, 0x52, 0x11, 0x61, 0x74, 0x74, 0x61, 0x63, 0x68, 0x65, 0x64, 0x50, 0x65, - 0x65, 0x72, 0x49, 0x6e, 0x66, 0x6f, 0x73, 0x12, 0x32, 0x0a, 0x15, 0x63, 0x75, 0x73, 0x74, 0x6f, - 0x6d, 0x5f, 0x63, 0x68, 0x61, 0x69, 0x6e, 0x73, 0x5f, 0x68, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x79, - 0x18, 0x07, 0x20, 0x01, 0x28, 0x08, 0x52, 0x13, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x43, 0x68, - 0x61, 0x69, 0x6e, 0x73, 0x48, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x79, 0x12, 0x49, 0x0a, 0x0d, 0x63, - 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x5f, 0x63, 0x68, 0x61, 0x69, 0x6e, 0x73, 0x18, 0x08, 0x20, 0x03, - 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x72, 0x70, 0x63, 0x70, 0x62, 0x2e, 0x43, 0x6c, 0x75, 0x73, 0x74, - 0x65, 0x72, 0x49, 0x6e, 0x66, 0x6f, 0x2e, 0x43, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x43, 0x68, 0x61, - 0x69, 0x6e, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0c, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, - 0x43, 0x68, 0x61, 0x69, 0x6e, 0x73, 0x12, 0x36, 0x0a, 0x06, 0x63, 0x68, 0x61, 0x69, 0x6e, 0x73, - 0x18, 0x09, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x72, 0x70, 0x63, 0x70, 0x62, 0x2e, 0x43, - 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x49, 0x6e, 0x66, 0x6f, 0x2e, 0x43, 0x68, 0x61, 0x69, 0x6e, - 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x06, 0x63, 0x68, 0x61, 0x69, 0x6e, 0x73, 0x1a, 0x4d, - 0x0a, 0x0e, 0x4e, 0x6f, 0x64, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, - 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, - 0x65, 0x79, 0x12, 0x25, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x0f, 0x2e, 0x72, 0x70, 0x63, 0x70, 0x62, 0x2e, 0x4e, 0x6f, 0x64, 0x65, 0x49, 0x6e, - 0x66, 0x6f, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x63, 0x0a, - 0x16, 0x41, 0x74, 0x74, 0x61, 0x63, 0x68, 0x65, 0x64, 0x50, 0x65, 0x65, 0x72, 0x49, 0x6e, 0x66, - 0x6f, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x33, 0x0a, 0x05, 0x76, 0x61, 0x6c, - 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x72, 0x70, 0x63, 0x70, 0x62, - 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x4f, 0x66, 0x41, 0x74, 0x74, 0x61, 0x63, 0x68, 0x65, 0x64, 0x50, - 0x65, 0x65, 0x72, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, - 0x38, 0x01, 0x1a, 0x57, 0x0a, 0x11, 0x43, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x43, 0x68, 0x61, 0x69, - 0x6e, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x2c, 0x0a, 0x05, 0x76, 0x61, 0x6c, - 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x72, 0x70, 0x63, 0x70, 0x62, - 0x2e, 0x43, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x43, 0x68, 0x61, 0x69, 0x6e, 0x49, 0x6e, 0x66, 0x6f, - 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x4b, 0x0a, 0x0b, 0x43, - 0x68, 0x61, 0x69, 0x6e, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, - 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x26, 0x0a, 0x05, - 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x72, 0x70, - 0x63, 0x70, 0x62, 0x2e, 0x43, 0x68, 0x61, 0x69, 0x6e, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x05, 0x76, - 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x9d, 0x01, 0x0a, 0x09, 0x43, 0x68, 0x61, - 0x69, 0x6e, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x1d, 0x0a, 0x0a, 0x69, 0x73, 0x5f, 0x65, 0x6c, 0x61, - 0x73, 0x74, 0x69, 0x63, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x09, 0x69, 0x73, 0x45, 0x6c, - 0x61, 0x73, 0x74, 0x69, 0x63, 0x12, 0x28, 0x0a, 0x10, 0x65, 0x6c, 0x61, 0x73, 0x74, 0x69, 0x63, - 0x5f, 0x63, 0x68, 0x61, 0x69, 0x6e, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x0e, 0x65, 0x6c, 0x61, 0x73, 0x74, 0x69, 0x63, 0x43, 0x68, 0x61, 0x69, 0x6e, 0x49, 0x64, 0x12, - 0x47, 0x0a, 0x12, 0x63, 0x68, 0x61, 0x69, 0x6e, 0x5f, 0x70, 0x61, 0x72, 0x74, 0x69, 0x63, 0x69, - 0x70, 0x61, 0x6e, 0x74, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x72, 0x70, - 0x63, 0x70, 0x62, 0x2e, 0x43, 0x68, 0x61, 0x69, 0x6e, 0x50, 0x61, 0x72, 0x74, 0x69, 0x63, 0x69, - 0x70, 0x61, 0x6e, 0x74, 0x73, 0x52, 0x11, 0x63, 0x68, 0x61, 0x69, 0x6e, 0x50, 0x61, 0x72, 0x74, - 0x69, 0x63, 0x69, 0x70, 0x61, 0x6e, 0x74, 0x73, 0x22, 0x87, 0x01, 0x0a, 0x0f, 0x43, 0x75, 0x73, - 0x74, 0x6f, 0x6d, 0x43, 0x68, 0x61, 0x69, 0x6e, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x1d, 0x0a, 0x0a, - 0x63, 0x68, 0x61, 0x69, 0x6e, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x09, 0x63, 0x68, 0x61, 0x69, 0x6e, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x13, 0x0a, 0x05, 0x76, - 0x6d, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x76, 0x6d, 0x49, 0x64, - 0x12, 0x1b, 0x0a, 0x09, 0x70, 0x63, 0x68, 0x61, 0x69, 0x6e, 0x5f, 0x69, 0x64, 0x18, 0x03, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x08, 0x70, 0x63, 0x68, 0x61, 0x69, 0x6e, 0x49, 0x64, 0x12, 0x23, 0x0a, - 0x0d, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x63, 0x68, 0x61, 0x69, 0x6e, 0x5f, 0x69, 0x64, 0x18, 0x04, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x63, 0x68, 0x61, 0x69, 0x6e, - 0x49, 0x64, 0x22, 0x8b, 0x02, 0x0a, 0x08, 0x4e, 0x6f, 0x64, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x12, - 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, - 0x61, 0x6d, 0x65, 0x12, 0x1b, 0x0a, 0x09, 0x65, 0x78, 0x65, 0x63, 0x5f, 0x70, 0x61, 0x74, 0x68, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x65, 0x78, 0x65, 0x63, 0x50, 0x61, 0x74, 0x68, - 0x12, 0x10, 0x0a, 0x03, 0x75, 0x72, 0x69, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x75, - 0x72, 0x69, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, - 0x69, 0x64, 0x12, 0x17, 0x0a, 0x07, 0x6c, 0x6f, 0x67, 0x5f, 0x64, 0x69, 0x72, 0x18, 0x05, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x06, 0x6c, 0x6f, 0x67, 0x44, 0x69, 0x72, 0x12, 0x15, 0x0a, 0x06, 0x64, - 0x62, 0x5f, 0x64, 0x69, 0x72, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x64, 0x62, 0x44, - 0x69, 0x72, 0x12, 0x1d, 0x0a, 0x0a, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x5f, 0x64, 0x69, 0x72, - 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x44, 0x69, - 0x72, 0x12, 0x2d, 0x0a, 0x12, 0x77, 0x68, 0x69, 0x74, 0x65, 0x6c, 0x69, 0x73, 0x74, 0x65, 0x64, - 0x5f, 0x63, 0x68, 0x61, 0x69, 0x6e, 0x73, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x11, 0x77, - 0x68, 0x69, 0x74, 0x65, 0x6c, 0x69, 0x73, 0x74, 0x65, 0x64, 0x43, 0x68, 0x61, 0x69, 0x6e, 0x73, - 0x12, 0x16, 0x0a, 0x06, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0c, - 0x52, 0x06, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x16, 0x0a, 0x06, 0x70, 0x61, 0x75, 0x73, - 0x65, 0x64, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x70, 0x61, 0x75, 0x73, 0x65, 0x64, - 0x22, 0x22, 0x0a, 0x10, 0x41, 0x74, 0x74, 0x61, 0x63, 0x68, 0x65, 0x64, 0x50, 0x65, 0x65, 0x72, - 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x02, 0x69, 0x64, 0x22, 0x47, 0x0a, 0x16, 0x4c, 0x69, 0x73, 0x74, 0x4f, 0x66, 0x41, 0x74, - 0x74, 0x61, 0x63, 0x68, 0x65, 0x64, 0x50, 0x65, 0x65, 0x72, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x2d, - 0x0a, 0x05, 0x70, 0x65, 0x65, 0x72, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x17, 0x2e, - 0x72, 0x70, 0x63, 0x70, 0x62, 0x2e, 0x41, 0x74, 0x74, 0x61, 0x63, 0x68, 0x65, 0x64, 0x50, 0x65, - 0x65, 0x72, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x05, 0x70, 0x65, 0x65, 0x72, 0x73, 0x22, 0xbf, 0x09, - 0x0a, 0x0c, 0x53, 0x74, 0x61, 0x72, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x21, - 0x0a, 0x0c, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x4e, 0x61, 0x6d, - 0x65, 0x12, 0x1b, 0x0a, 0x09, 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6e, 0x6f, 0x64, 0x65, 0x54, 0x79, 0x70, 0x65, 0x12, 0x1b, - 0x0a, 0x09, 0x65, 0x78, 0x65, 0x63, 0x5f, 0x70, 0x61, 0x74, 0x68, 0x18, 0x04, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x08, 0x65, 0x78, 0x65, 0x63, 0x50, 0x61, 0x74, 0x68, 0x12, 0x20, 0x0a, 0x09, 0x6e, - 0x75, 0x6d, 0x5f, 0x6e, 0x6f, 0x64, 0x65, 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0d, 0x48, 0x00, - 0x52, 0x08, 0x6e, 0x75, 0x6d, 0x4e, 0x6f, 0x64, 0x65, 0x73, 0x88, 0x01, 0x01, 0x12, 0x32, 0x0a, - 0x12, 0x77, 0x68, 0x69, 0x74, 0x65, 0x6c, 0x69, 0x73, 0x74, 0x65, 0x64, 0x5f, 0x63, 0x68, 0x61, - 0x69, 0x6e, 0x73, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x48, 0x01, 0x52, 0x11, 0x77, 0x68, 0x69, - 0x74, 0x65, 0x6c, 0x69, 0x73, 0x74, 0x65, 0x64, 0x43, 0x68, 0x61, 0x69, 0x6e, 0x73, 0x88, 0x01, - 0x01, 0x12, 0x31, 0x0a, 0x12, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x5f, 0x6e, 0x6f, 0x64, 0x65, - 0x5f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x48, 0x02, 0x52, - 0x10, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x4e, 0x6f, 0x64, 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, - 0x67, 0x88, 0x01, 0x01, 0x12, 0x27, 0x0a, 0x0d, 0x72, 0x6f, 0x6f, 0x74, 0x5f, 0x64, 0x61, 0x74, - 0x61, 0x5f, 0x64, 0x69, 0x72, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x48, 0x03, 0x52, 0x0b, 0x72, - 0x6f, 0x6f, 0x74, 0x44, 0x61, 0x74, 0x61, 0x44, 0x69, 0x72, 0x88, 0x01, 0x01, 0x12, 0x1d, 0x0a, - 0x0a, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x5f, 0x64, 0x69, 0x72, 0x18, 0x09, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x09, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x44, 0x69, 0x72, 0x12, 0x40, 0x0a, 0x10, - 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x63, 0x68, 0x61, 0x69, 0x6e, 0x5f, 0x73, 0x70, 0x65, 0x63, 0x73, - 0x18, 0x0a, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x72, 0x70, 0x63, 0x70, 0x62, 0x2e, 0x42, - 0x6c, 0x6f, 0x63, 0x6b, 0x63, 0x68, 0x61, 0x69, 0x6e, 0x53, 0x70, 0x65, 0x63, 0x52, 0x0f, 0x62, - 0x6c, 0x6f, 0x63, 0x6b, 0x63, 0x68, 0x61, 0x69, 0x6e, 0x53, 0x70, 0x65, 0x63, 0x73, 0x12, 0x5a, - 0x0a, 0x13, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x5f, 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x63, 0x6f, - 0x6e, 0x66, 0x69, 0x67, 0x73, 0x18, 0x0b, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2a, 0x2e, 0x72, 0x70, - 0x63, 0x70, 0x62, 0x2e, 0x53, 0x74, 0x61, 0x72, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x2e, 0x43, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x4e, 0x6f, 0x64, 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, - 0x67, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x11, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x4e, - 0x6f, 0x64, 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x73, 0x12, 0x4a, 0x0a, 0x0d, 0x63, 0x68, - 0x61, 0x69, 0x6e, 0x5f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x73, 0x18, 0x0c, 0x20, 0x03, 0x28, - 0x0b, 0x32, 0x25, 0x2e, 0x72, 0x70, 0x63, 0x70, 0x62, 0x2e, 0x53, 0x74, 0x61, 0x72, 0x74, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x43, 0x68, 0x61, 0x69, 0x6e, 0x43, 0x6f, 0x6e, 0x66, - 0x69, 0x67, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0c, 0x63, 0x68, 0x61, 0x69, 0x6e, 0x43, - 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x73, 0x12, 0x50, 0x0a, 0x0f, 0x75, 0x70, 0x67, 0x72, 0x61, 0x64, - 0x65, 0x5f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x73, 0x18, 0x0d, 0x20, 0x03, 0x28, 0x0b, 0x32, - 0x27, 0x2e, 0x72, 0x70, 0x63, 0x70, 0x62, 0x2e, 0x53, 0x74, 0x61, 0x72, 0x74, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x2e, 0x55, 0x70, 0x67, 0x72, 0x61, 0x64, 0x65, 0x43, 0x6f, 0x6e, 0x66, - 0x69, 0x67, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0e, 0x75, 0x70, 0x67, 0x72, 0x61, 0x64, - 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x73, 0x12, 0x38, 0x0a, 0x16, 0x72, 0x65, 0x61, 0x73, - 0x73, 0x69, 0x67, 0x6e, 0x5f, 0x70, 0x6f, 0x72, 0x74, 0x73, 0x5f, 0x69, 0x66, 0x5f, 0x75, 0x73, - 0x65, 0x64, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x08, 0x48, 0x04, 0x52, 0x13, 0x72, 0x65, 0x61, 0x73, - 0x73, 0x69, 0x67, 0x6e, 0x50, 0x6f, 0x72, 0x74, 0x73, 0x49, 0x66, 0x55, 0x73, 0x65, 0x64, 0x88, - 0x01, 0x01, 0x12, 0x28, 0x0a, 0x0d, 0x64, 0x79, 0x6e, 0x61, 0x6d, 0x69, 0x63, 0x5f, 0x70, 0x6f, - 0x72, 0x74, 0x73, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x08, 0x48, 0x05, 0x52, 0x0c, 0x64, 0x79, 0x6e, - 0x61, 0x6d, 0x69, 0x63, 0x50, 0x6f, 0x72, 0x74, 0x73, 0x88, 0x01, 0x01, 0x12, 0x57, 0x0a, 0x12, - 0x63, 0x68, 0x61, 0x69, 0x6e, 0x5f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x5f, 0x66, 0x69, 0x6c, - 0x65, 0x73, 0x18, 0x10, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x29, 0x2e, 0x72, 0x70, 0x63, 0x70, 0x62, - 0x2e, 0x53, 0x74, 0x61, 0x72, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x43, 0x68, - 0x61, 0x69, 0x6e, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x45, 0x6e, - 0x74, 0x72, 0x79, 0x52, 0x10, 0x63, 0x68, 0x61, 0x69, 0x6e, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, - 0x46, 0x69, 0x6c, 0x65, 0x73, 0x1a, 0x44, 0x0a, 0x16, 0x43, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x4e, - 0x6f, 0x64, 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, - 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, - 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x3f, 0x0a, 0x11, 0x43, - 0x68, 0x61, 0x69, 0x6e, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, - 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, - 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x41, 0x0a, 0x13, - 0x55, 0x70, 0x67, 0x72, 0x61, 0x64, 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x73, 0x45, 0x6e, - 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, - 0x43, 0x0a, 0x15, 0x43, 0x68, 0x61, 0x69, 0x6e, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x46, 0x69, - 0x6c, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, - 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, - 0x3a, 0x02, 0x38, 0x01, 0x42, 0x0c, 0x0a, 0x0a, 0x5f, 0x6e, 0x75, 0x6d, 0x5f, 0x6e, 0x6f, 0x64, - 0x65, 0x73, 0x42, 0x15, 0x0a, 0x13, 0x5f, 0x77, 0x68, 0x69, 0x74, 0x65, 0x6c, 0x69, 0x73, 0x74, - 0x65, 0x64, 0x5f, 0x63, 0x68, 0x61, 0x69, 0x6e, 0x73, 0x42, 0x15, 0x0a, 0x13, 0x5f, 0x67, 0x6c, - 0x6f, 0x62, 0x61, 0x6c, 0x5f, 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, - 0x42, 0x10, 0x0a, 0x0e, 0x5f, 0x72, 0x6f, 0x6f, 0x74, 0x5f, 0x64, 0x61, 0x74, 0x61, 0x5f, 0x64, - 0x69, 0x72, 0x42, 0x19, 0x0a, 0x17, 0x5f, 0x72, 0x65, 0x61, 0x73, 0x73, 0x69, 0x67, 0x6e, 0x5f, - 0x70, 0x6f, 0x72, 0x74, 0x73, 0x5f, 0x69, 0x66, 0x5f, 0x75, 0x73, 0x65, 0x64, 0x42, 0x10, 0x0a, - 0x0e, 0x5f, 0x64, 0x79, 0x6e, 0x61, 0x6d, 0x69, 0x63, 0x5f, 0x70, 0x6f, 0x72, 0x74, 0x73, 0x22, - 0x13, 0x0a, 0x11, 0x52, 0x50, 0x43, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x22, 0x2e, 0x0a, 0x12, 0x52, 0x50, 0x43, 0x56, 0x65, 0x72, 0x73, 0x69, - 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x76, 0x65, - 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x07, 0x76, 0x65, 0x72, - 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x63, 0x0a, 0x0d, 0x53, 0x74, 0x61, 0x72, 0x74, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x35, 0x0a, 0x0c, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, - 0x5f, 0x69, 0x6e, 0x66, 0x6f, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x72, 0x70, - 0x63, 0x70, 0x62, 0x2e, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x49, 0x6e, 0x66, 0x6f, 0x52, - 0x0b, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x1b, 0x0a, 0x09, - 0x63, 0x68, 0x61, 0x69, 0x6e, 0x5f, 0x69, 0x64, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, - 0x08, 0x63, 0x68, 0x61, 0x69, 0x6e, 0x49, 0x64, 0x73, 0x22, 0x5b, 0x0a, 0x09, 0x43, 0x68, 0x61, - 0x69, 0x6e, 0x53, 0x70, 0x65, 0x63, 0x12, 0x22, 0x0a, 0x0c, 0x70, 0x61, 0x72, 0x74, 0x69, 0x63, - 0x69, 0x70, 0x61, 0x6e, 0x74, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0c, 0x70, 0x61, - 0x72, 0x74, 0x69, 0x63, 0x69, 0x70, 0x61, 0x6e, 0x74, 0x73, 0x12, 0x2a, 0x0a, 0x11, 0x63, 0x68, - 0x61, 0x69, 0x6e, 0x5f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x5f, 0x66, 0x69, 0x6c, 0x65, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x63, 0x68, 0x61, 0x69, 0x6e, 0x43, 0x6f, 0x6e, 0x66, - 0x69, 0x67, 0x46, 0x69, 0x6c, 0x65, 0x22, 0xa1, 0x05, 0x0a, 0x10, 0x45, 0x6c, 0x61, 0x73, 0x74, - 0x69, 0x63, 0x43, 0x68, 0x61, 0x69, 0x6e, 0x53, 0x70, 0x65, 0x63, 0x12, 0x19, 0x0a, 0x08, 0x63, - 0x68, 0x61, 0x69, 0x6e, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x63, - 0x68, 0x61, 0x69, 0x6e, 0x49, 0x64, 0x12, 0x1d, 0x0a, 0x0a, 0x61, 0x73, 0x73, 0x65, 0x74, 0x5f, - 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x61, 0x73, 0x73, 0x65, - 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x21, 0x0a, 0x0c, 0x61, 0x73, 0x73, 0x65, 0x74, 0x5f, 0x73, - 0x79, 0x6d, 0x62, 0x6f, 0x6c, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x61, 0x73, 0x73, - 0x65, 0x74, 0x53, 0x79, 0x6d, 0x62, 0x6f, 0x6c, 0x12, 0x25, 0x0a, 0x0e, 0x69, 0x6e, 0x69, 0x74, - 0x69, 0x61, 0x6c, 0x5f, 0x73, 0x75, 0x70, 0x70, 0x6c, 0x79, 0x18, 0x04, 0x20, 0x01, 0x28, 0x04, - 0x52, 0x0d, 0x69, 0x6e, 0x69, 0x74, 0x69, 0x61, 0x6c, 0x53, 0x75, 0x70, 0x70, 0x6c, 0x79, 0x12, - 0x1d, 0x0a, 0x0a, 0x6d, 0x61, 0x78, 0x5f, 0x73, 0x75, 0x70, 0x70, 0x6c, 0x79, 0x18, 0x05, 0x20, - 0x01, 0x28, 0x04, 0x52, 0x09, 0x6d, 0x61, 0x78, 0x53, 0x75, 0x70, 0x70, 0x6c, 0x79, 0x12, 0x30, - 0x0a, 0x14, 0x6d, 0x69, 0x6e, 0x5f, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6d, 0x70, 0x74, 0x69, 0x6f, - 0x6e, 0x5f, 0x72, 0x61, 0x74, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x04, 0x52, 0x12, 0x6d, 0x69, - 0x6e, 0x43, 0x6f, 0x6e, 0x73, 0x75, 0x6d, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x61, 0x74, 0x65, - 0x12, 0x30, 0x0a, 0x14, 0x6d, 0x61, 0x78, 0x5f, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6d, 0x70, 0x74, - 0x69, 0x6f, 0x6e, 0x5f, 0x72, 0x61, 0x74, 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, 0x04, 0x52, 0x12, - 0x6d, 0x61, 0x78, 0x43, 0x6f, 0x6e, 0x73, 0x75, 0x6d, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x61, - 0x74, 0x65, 0x12, 0x2e, 0x0a, 0x13, 0x6d, 0x69, 0x6e, 0x5f, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, - 0x74, 0x6f, 0x72, 0x5f, 0x73, 0x74, 0x61, 0x6b, 0x65, 0x18, 0x08, 0x20, 0x01, 0x28, 0x04, 0x52, - 0x11, 0x6d, 0x69, 0x6e, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x6f, 0x72, 0x53, 0x74, 0x61, - 0x6b, 0x65, 0x12, 0x2e, 0x0a, 0x13, 0x6d, 0x61, 0x78, 0x5f, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, - 0x74, 0x6f, 0x72, 0x5f, 0x73, 0x74, 0x61, 0x6b, 0x65, 0x18, 0x09, 0x20, 0x01, 0x28, 0x04, 0x52, - 0x11, 0x6d, 0x61, 0x78, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x6f, 0x72, 0x53, 0x74, 0x61, - 0x6b, 0x65, 0x12, 0x2c, 0x0a, 0x12, 0x6d, 0x69, 0x6e, 0x5f, 0x73, 0x74, 0x61, 0x6b, 0x65, 0x5f, - 0x64, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x04, 0x52, 0x10, - 0x6d, 0x69, 0x6e, 0x53, 0x74, 0x61, 0x6b, 0x65, 0x44, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, - 0x12, 0x2c, 0x0a, 0x12, 0x6d, 0x61, 0x78, 0x5f, 0x73, 0x74, 0x61, 0x6b, 0x65, 0x5f, 0x64, 0x75, - 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x04, 0x52, 0x10, 0x6d, 0x61, - 0x78, 0x53, 0x74, 0x61, 0x6b, 0x65, 0x44, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x2c, - 0x0a, 0x12, 0x6d, 0x69, 0x6e, 0x5f, 0x64, 0x65, 0x6c, 0x65, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, - 0x5f, 0x66, 0x65, 0x65, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x10, 0x6d, 0x69, 0x6e, 0x44, - 0x65, 0x6c, 0x65, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x46, 0x65, 0x65, 0x12, 0x2e, 0x0a, 0x13, - 0x6d, 0x69, 0x6e, 0x5f, 0x64, 0x65, 0x6c, 0x65, 0x67, 0x61, 0x74, 0x6f, 0x72, 0x5f, 0x73, 0x74, - 0x61, 0x6b, 0x65, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x04, 0x52, 0x11, 0x6d, 0x69, 0x6e, 0x44, 0x65, - 0x6c, 0x65, 0x67, 0x61, 0x74, 0x6f, 0x72, 0x53, 0x74, 0x61, 0x6b, 0x65, 0x12, 0x3d, 0x0a, 0x1b, - 0x6d, 0x61, 0x78, 0x5f, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x6f, 0x72, 0x5f, 0x77, 0x65, - 0x69, 0x67, 0x68, 0x74, 0x5f, 0x66, 0x61, 0x63, 0x74, 0x6f, 0x72, 0x18, 0x0e, 0x20, 0x01, 0x28, - 0x0d, 0x52, 0x18, 0x6d, 0x61, 0x78, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x6f, 0x72, 0x57, - 0x65, 0x69, 0x67, 0x68, 0x74, 0x46, 0x61, 0x63, 0x74, 0x6f, 0x72, 0x12, 0x2d, 0x0a, 0x12, 0x75, - 0x70, 0x74, 0x69, 0x6d, 0x65, 0x5f, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x6d, 0x65, 0x6e, - 0x74, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x11, 0x75, 0x70, 0x74, 0x69, 0x6d, 0x65, 0x52, - 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x22, 0x66, 0x0a, 0x1d, 0x54, 0x72, - 0x61, 0x6e, 0x73, 0x66, 0x6f, 0x72, 0x6d, 0x45, 0x6c, 0x61, 0x73, 0x74, 0x69, 0x63, 0x43, 0x68, - 0x61, 0x69, 0x6e, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x45, 0x0a, 0x12, 0x65, - 0x6c, 0x61, 0x73, 0x74, 0x69, 0x63, 0x5f, 0x63, 0x68, 0x61, 0x69, 0x6e, 0x5f, 0x73, 0x70, 0x65, - 0x63, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x72, 0x70, 0x63, 0x70, 0x62, 0x2e, - 0x45, 0x6c, 0x61, 0x73, 0x74, 0x69, 0x63, 0x43, 0x68, 0x61, 0x69, 0x6e, 0x53, 0x70, 0x65, 0x63, - 0x52, 0x10, 0x65, 0x6c, 0x61, 0x73, 0x74, 0x69, 0x63, 0x43, 0x68, 0x61, 0x69, 0x6e, 0x53, 0x70, - 0x65, 0x63, 0x22, 0x8b, 0x01, 0x0a, 0x1e, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x6f, 0x72, 0x6d, - 0x45, 0x6c, 0x61, 0x73, 0x74, 0x69, 0x63, 0x43, 0x68, 0x61, 0x69, 0x6e, 0x73, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x35, 0x0a, 0x0c, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, - 0x5f, 0x69, 0x6e, 0x66, 0x6f, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x72, 0x70, - 0x63, 0x70, 0x62, 0x2e, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x49, 0x6e, 0x66, 0x6f, 0x52, - 0x0b, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x15, 0x0a, 0x06, - 0x74, 0x78, 0x5f, 0x69, 0x64, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x05, 0x74, 0x78, - 0x49, 0x64, 0x73, 0x12, 0x1b, 0x0a, 0x09, 0x61, 0x73, 0x73, 0x65, 0x74, 0x5f, 0x69, 0x64, 0x73, - 0x18, 0x03, 0x20, 0x03, 0x28, 0x09, 0x52, 0x08, 0x61, 0x73, 0x73, 0x65, 0x74, 0x49, 0x64, 0x73, - 0x22, 0xe6, 0x01, 0x0a, 0x1b, 0x50, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x6c, - 0x65, 0x73, 0x73, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x6f, 0x72, 0x53, 0x70, 0x65, 0x63, - 0x12, 0x19, 0x0a, 0x08, 0x63, 0x68, 0x61, 0x69, 0x6e, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x07, 0x63, 0x68, 0x61, 0x69, 0x6e, 0x49, 0x64, 0x12, 0x1b, 0x0a, 0x09, 0x6e, - 0x6f, 0x64, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, - 0x6e, 0x6f, 0x64, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x2e, 0x0a, 0x13, 0x73, 0x74, 0x61, 0x6b, - 0x65, 0x64, 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x5f, 0x61, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x18, - 0x03, 0x20, 0x01, 0x28, 0x04, 0x52, 0x11, 0x73, 0x74, 0x61, 0x6b, 0x65, 0x64, 0x54, 0x6f, 0x6b, - 0x65, 0x6e, 0x41, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x19, 0x0a, 0x08, 0x61, 0x73, 0x73, 0x65, - 0x74, 0x5f, 0x69, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x61, 0x73, 0x73, 0x65, - 0x74, 0x49, 0x64, 0x12, 0x1d, 0x0a, 0x0a, 0x73, 0x74, 0x61, 0x72, 0x74, 0x5f, 0x74, 0x69, 0x6d, - 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x73, 0x74, 0x61, 0x72, 0x74, 0x54, 0x69, - 0x6d, 0x65, 0x12, 0x25, 0x0a, 0x0e, 0x73, 0x74, 0x61, 0x6b, 0x65, 0x5f, 0x64, 0x75, 0x72, 0x61, - 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x06, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0d, 0x73, 0x74, 0x61, 0x6b, - 0x65, 0x44, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x6e, 0x0a, 0x21, 0x41, 0x64, 0x64, - 0x50, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x6c, 0x65, 0x73, 0x73, 0x56, 0x61, - 0x6c, 0x69, 0x64, 0x61, 0x74, 0x6f, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x49, - 0x0a, 0x0e, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x6f, 0x72, 0x5f, 0x73, 0x70, 0x65, 0x63, - 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x72, 0x70, 0x63, 0x70, 0x62, 0x2e, 0x50, - 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x6c, 0x65, 0x73, 0x73, 0x56, 0x61, 0x6c, - 0x69, 0x64, 0x61, 0x74, 0x6f, 0x72, 0x53, 0x70, 0x65, 0x63, 0x52, 0x0d, 0x76, 0x61, 0x6c, 0x69, - 0x64, 0x61, 0x74, 0x6f, 0x72, 0x53, 0x70, 0x65, 0x63, 0x22, 0x5b, 0x0a, 0x22, 0x41, 0x64, 0x64, - 0x50, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x6c, 0x65, 0x73, 0x73, 0x56, 0x61, - 0x6c, 0x69, 0x64, 0x61, 0x74, 0x6f, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, - 0x35, 0x0a, 0x0c, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x69, 0x6e, 0x66, 0x6f, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x72, 0x70, 0x63, 0x70, 0x62, 0x2e, 0x43, 0x6c, - 0x75, 0x73, 0x74, 0x65, 0x72, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x0b, 0x63, 0x6c, 0x75, 0x73, 0x74, - 0x65, 0x72, 0x49, 0x6e, 0x66, 0x6f, 0x22, 0x54, 0x0a, 0x18, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, - 0x43, 0x68, 0x61, 0x69, 0x6e, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x6f, 0x72, 0x53, 0x70, - 0x65, 0x63, 0x12, 0x19, 0x0a, 0x08, 0x63, 0x68, 0x61, 0x69, 0x6e, 0x5f, 0x69, 0x64, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x63, 0x68, 0x61, 0x69, 0x6e, 0x49, 0x64, 0x12, 0x1d, 0x0a, - 0x0a, 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, - 0x09, 0x52, 0x09, 0x6e, 0x6f, 0x64, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x22, 0x65, 0x0a, 0x1b, - 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x43, 0x68, 0x61, 0x69, 0x6e, 0x56, 0x61, 0x6c, 0x69, 0x64, - 0x61, 0x74, 0x6f, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x46, 0x0a, 0x0e, 0x76, - 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x6f, 0x72, 0x5f, 0x73, 0x70, 0x65, 0x63, 0x18, 0x01, 0x20, - 0x03, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x72, 0x70, 0x63, 0x70, 0x62, 0x2e, 0x52, 0x65, 0x6d, 0x6f, - 0x76, 0x65, 0x43, 0x68, 0x61, 0x69, 0x6e, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x6f, 0x72, - 0x53, 0x70, 0x65, 0x63, 0x52, 0x0d, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x6f, 0x72, 0x53, - 0x70, 0x65, 0x63, 0x22, 0x55, 0x0a, 0x1c, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x43, 0x68, 0x61, - 0x69, 0x6e, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x6f, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x12, 0x35, 0x0a, 0x0c, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x69, - 0x6e, 0x66, 0x6f, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x72, 0x70, 0x63, 0x70, - 0x62, 0x2e, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x0b, 0x63, - 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x49, 0x6e, 0x66, 0x6f, 0x22, 0xdf, 0x02, 0x0a, 0x0e, 0x42, - 0x6c, 0x6f, 0x63, 0x6b, 0x63, 0x68, 0x61, 0x69, 0x6e, 0x53, 0x70, 0x65, 0x63, 0x12, 0x17, 0x0a, - 0x07, 0x76, 0x6d, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, - 0x76, 0x6d, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x67, 0x65, 0x6e, 0x65, 0x73, 0x69, - 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x67, 0x65, 0x6e, 0x65, 0x73, 0x69, 0x73, - 0x12, 0x1e, 0x0a, 0x08, 0x63, 0x68, 0x61, 0x69, 0x6e, 0x5f, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, - 0x28, 0x09, 0x48, 0x00, 0x52, 0x07, 0x63, 0x68, 0x61, 0x69, 0x6e, 0x49, 0x64, 0x88, 0x01, 0x01, - 0x12, 0x34, 0x0a, 0x0a, 0x63, 0x68, 0x61, 0x69, 0x6e, 0x5f, 0x73, 0x70, 0x65, 0x63, 0x18, 0x04, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x72, 0x70, 0x63, 0x70, 0x62, 0x2e, 0x43, 0x68, 0x61, - 0x69, 0x6e, 0x53, 0x70, 0x65, 0x63, 0x48, 0x01, 0x52, 0x09, 0x63, 0x68, 0x61, 0x69, 0x6e, 0x53, - 0x70, 0x65, 0x63, 0x88, 0x01, 0x01, 0x12, 0x21, 0x0a, 0x0c, 0x63, 0x68, 0x61, 0x69, 0x6e, 0x5f, - 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x63, 0x68, - 0x61, 0x69, 0x6e, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x27, 0x0a, 0x0f, 0x6e, 0x65, 0x74, - 0x77, 0x6f, 0x72, 0x6b, 0x5f, 0x75, 0x70, 0x67, 0x72, 0x61, 0x64, 0x65, 0x18, 0x06, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x0e, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x55, 0x70, 0x67, 0x72, 0x61, - 0x64, 0x65, 0x12, 0x29, 0x0a, 0x10, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x63, 0x68, 0x61, 0x69, 0x6e, - 0x5f, 0x61, 0x6c, 0x69, 0x61, 0x73, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x62, 0x6c, - 0x6f, 0x63, 0x6b, 0x63, 0x68, 0x61, 0x69, 0x6e, 0x41, 0x6c, 0x69, 0x61, 0x73, 0x12, 0x31, 0x0a, - 0x15, 0x70, 0x65, 0x72, 0x5f, 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x63, 0x68, 0x61, 0x69, 0x6e, 0x5f, - 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x12, 0x70, 0x65, - 0x72, 0x4e, 0x6f, 0x64, 0x65, 0x43, 0x68, 0x61, 0x69, 0x6e, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, - 0x42, 0x0b, 0x0a, 0x09, 0x5f, 0x63, 0x68, 0x61, 0x69, 0x6e, 0x5f, 0x69, 0x64, 0x42, 0x0d, 0x0a, - 0x0b, 0x5f, 0x63, 0x68, 0x61, 0x69, 0x6e, 0x5f, 0x73, 0x70, 0x65, 0x63, 0x22, 0x5c, 0x0a, 0x18, - 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x63, 0x68, 0x61, 0x69, 0x6e, - 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x40, 0x0a, 0x10, 0x62, 0x6c, 0x6f, 0x63, - 0x6b, 0x63, 0x68, 0x61, 0x69, 0x6e, 0x5f, 0x73, 0x70, 0x65, 0x63, 0x73, 0x18, 0x01, 0x20, 0x03, - 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x72, 0x70, 0x63, 0x70, 0x62, 0x2e, 0x42, 0x6c, 0x6f, 0x63, 0x6b, - 0x63, 0x68, 0x61, 0x69, 0x6e, 0x53, 0x70, 0x65, 0x63, 0x52, 0x0f, 0x62, 0x6c, 0x6f, 0x63, 0x6b, - 0x63, 0x68, 0x61, 0x69, 0x6e, 0x53, 0x70, 0x65, 0x63, 0x73, 0x22, 0x6f, 0x0a, 0x19, 0x43, 0x72, - 0x65, 0x61, 0x74, 0x65, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x63, 0x68, 0x61, 0x69, 0x6e, 0x73, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x35, 0x0a, 0x0c, 0x63, 0x6c, 0x75, 0x73, 0x74, - 0x65, 0x72, 0x5f, 0x69, 0x6e, 0x66, 0x6f, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, - 0x72, 0x70, 0x63, 0x70, 0x62, 0x2e, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x49, 0x6e, 0x66, - 0x6f, 0x52, 0x0b, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x1b, - 0x0a, 0x09, 0x63, 0x68, 0x61, 0x69, 0x6e, 0x5f, 0x69, 0x64, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, - 0x09, 0x52, 0x08, 0x63, 0x68, 0x61, 0x69, 0x6e, 0x49, 0x64, 0x73, 0x22, 0x48, 0x0a, 0x13, 0x43, - 0x72, 0x65, 0x61, 0x74, 0x65, 0x43, 0x68, 0x61, 0x69, 0x6e, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x12, 0x31, 0x0a, 0x0b, 0x63, 0x68, 0x61, 0x69, 0x6e, 0x5f, 0x73, 0x70, 0x65, 0x63, - 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x72, 0x70, 0x63, 0x70, 0x62, 0x2e, - 0x43, 0x68, 0x61, 0x69, 0x6e, 0x53, 0x70, 0x65, 0x63, 0x52, 0x0a, 0x63, 0x68, 0x61, 0x69, 0x6e, - 0x53, 0x70, 0x65, 0x63, 0x73, 0x22, 0x6a, 0x0a, 0x14, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x43, - 0x68, 0x61, 0x69, 0x6e, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x35, 0x0a, - 0x0c, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x69, 0x6e, 0x66, 0x6f, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x72, 0x70, 0x63, 0x70, 0x62, 0x2e, 0x43, 0x6c, 0x75, 0x73, - 0x74, 0x65, 0x72, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x0b, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, - 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x1b, 0x0a, 0x09, 0x63, 0x68, 0x61, 0x69, 0x6e, 0x5f, 0x69, 0x64, - 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x08, 0x63, 0x68, 0x61, 0x69, 0x6e, 0x49, 0x64, - 0x73, 0x22, 0x48, 0x0a, 0x0d, 0x48, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x12, 0x26, 0x0a, 0x0c, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x5f, 0x6e, 0x61, - 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x0b, 0x6e, 0x65, 0x74, 0x77, - 0x6f, 0x72, 0x6b, 0x4e, 0x61, 0x6d, 0x65, 0x88, 0x01, 0x01, 0x42, 0x0f, 0x0a, 0x0d, 0x5f, 0x6e, - 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x9c, 0x01, 0x0a, 0x0e, - 0x48, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x35, - 0x0a, 0x0c, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x69, 0x6e, 0x66, 0x6f, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x72, 0x70, 0x63, 0x70, 0x62, 0x2e, 0x43, 0x6c, 0x75, - 0x73, 0x74, 0x65, 0x72, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x0b, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, - 0x72, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x40, 0x0a, 0x0e, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, - 0x5f, 0x68, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, - 0x72, 0x70, 0x63, 0x70, 0x62, 0x2e, 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x48, 0x65, 0x61, - 0x6c, 0x74, 0x68, 0x48, 0x00, 0x52, 0x0d, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x48, 0x65, - 0x61, 0x6c, 0x74, 0x68, 0x88, 0x01, 0x01, 0x42, 0x11, 0x0a, 0x0f, 0x5f, 0x6e, 0x65, 0x74, 0x77, - 0x6f, 0x72, 0x6b, 0x5f, 0x68, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x22, 0xb9, 0x01, 0x0a, 0x0d, 0x4e, - 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x48, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x12, 0x21, 0x0a, 0x0c, - 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x0b, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x4e, 0x61, 0x6d, 0x65, 0x12, - 0x1d, 0x0a, 0x0a, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x0d, 0x52, 0x09, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x49, 0x64, 0x12, 0x18, - 0x0a, 0x07, 0x68, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x79, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, - 0x07, 0x68, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x79, 0x12, 0x23, 0x0a, 0x0d, 0x68, 0x65, 0x61, 0x6c, - 0x74, 0x68, 0x79, 0x5f, 0x6e, 0x6f, 0x64, 0x65, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x09, 0x52, - 0x0c, 0x68, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x79, 0x4e, 0x6f, 0x64, 0x65, 0x73, 0x12, 0x27, 0x0a, - 0x0f, 0x75, 0x6e, 0x68, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x79, 0x5f, 0x6e, 0x6f, 0x64, 0x65, 0x73, - 0x18, 0x05, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0e, 0x75, 0x6e, 0x68, 0x65, 0x61, 0x6c, 0x74, 0x68, - 0x79, 0x4e, 0x6f, 0x64, 0x65, 0x73, 0x22, 0x0d, 0x0a, 0x0b, 0x55, 0x52, 0x49, 0x73, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x22, 0x0a, 0x0c, 0x55, 0x52, 0x49, 0x73, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x75, 0x72, 0x69, 0x73, 0x18, 0x01, 0x20, - 0x03, 0x28, 0x09, 0x52, 0x04, 0x75, 0x72, 0x69, 0x73, 0x22, 0x50, 0x0a, 0x15, 0x57, 0x61, 0x69, - 0x74, 0x46, 0x6f, 0x72, 0x48, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x12, 0x26, 0x0a, 0x0c, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x5f, 0x6e, 0x61, - 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x0b, 0x6e, 0x65, 0x74, 0x77, - 0x6f, 0x72, 0x6b, 0x4e, 0x61, 0x6d, 0x65, 0x88, 0x01, 0x01, 0x42, 0x0f, 0x0a, 0x0d, 0x5f, 0x6e, - 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x4f, 0x0a, 0x16, 0x57, - 0x61, 0x69, 0x74, 0x46, 0x6f, 0x72, 0x48, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x79, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x35, 0x0a, 0x0c, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, - 0x5f, 0x69, 0x6e, 0x66, 0x6f, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x72, 0x70, - 0x63, 0x70, 0x62, 0x2e, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x49, 0x6e, 0x66, 0x6f, 0x52, - 0x0b, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x49, 0x6e, 0x66, 0x6f, 0x22, 0x48, 0x0a, 0x0d, - 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x26, 0x0a, - 0x0c, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x0b, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x4e, 0x61, - 0x6d, 0x65, 0x88, 0x01, 0x01, 0x42, 0x0f, 0x0a, 0x0d, 0x5f, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, - 0x6b, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x9c, 0x01, 0x0a, 0x0e, 0x53, 0x74, 0x61, 0x74, 0x75, - 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x35, 0x0a, 0x0c, 0x63, 0x6c, 0x75, - 0x73, 0x74, 0x65, 0x72, 0x5f, 0x69, 0x6e, 0x66, 0x6f, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x12, 0x2e, 0x72, 0x70, 0x63, 0x70, 0x62, 0x2e, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x49, - 0x6e, 0x66, 0x6f, 0x52, 0x0b, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x49, 0x6e, 0x66, 0x6f, - 0x12, 0x40, 0x0a, 0x0e, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x5f, 0x73, 0x74, 0x61, 0x74, - 0x75, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x72, 0x70, 0x63, 0x70, 0x62, - 0x2e, 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x48, 0x00, - 0x52, 0x0d, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x88, - 0x01, 0x01, 0x42, 0x11, 0x0a, 0x0f, 0x5f, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x5f, 0x73, - 0x74, 0x61, 0x74, 0x75, 0x73, 0x22, 0xd7, 0x01, 0x0a, 0x0d, 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, - 0x6b, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x21, 0x0a, 0x0c, 0x6e, 0x65, 0x74, 0x77, 0x6f, - 0x72, 0x6b, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x6e, - 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x1d, 0x0a, 0x0a, 0x6e, 0x65, - 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x09, - 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x49, 0x64, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x74, 0x61, - 0x74, 0x75, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, - 0x73, 0x12, 0x1b, 0x0a, 0x09, 0x6e, 0x75, 0x6d, 0x5f, 0x6e, 0x6f, 0x64, 0x65, 0x73, 0x18, 0x04, - 0x20, 0x01, 0x28, 0x0d, 0x52, 0x08, 0x6e, 0x75, 0x6d, 0x4e, 0x6f, 0x64, 0x65, 0x73, 0x12, 0x25, - 0x0a, 0x05, 0x6e, 0x6f, 0x64, 0x65, 0x73, 0x18, 0x05, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x0f, 0x2e, - 0x72, 0x70, 0x63, 0x70, 0x62, 0x2e, 0x4e, 0x6f, 0x64, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x05, - 0x6e, 0x6f, 0x64, 0x65, 0x73, 0x12, 0x28, 0x0a, 0x06, 0x63, 0x68, 0x61, 0x69, 0x6e, 0x73, 0x18, - 0x06, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x72, 0x70, 0x63, 0x70, 0x62, 0x2e, 0x43, 0x68, - 0x61, 0x69, 0x6e, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x06, 0x63, 0x68, 0x61, 0x69, 0x6e, 0x73, 0x22, - 0x3a, 0x0a, 0x13, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x23, 0x0a, 0x0d, 0x70, 0x75, 0x73, 0x68, 0x5f, 0x69, - 0x6e, 0x74, 0x65, 0x72, 0x76, 0x61, 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0c, 0x70, - 0x75, 0x73, 0x68, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x76, 0x61, 0x6c, 0x22, 0x4d, 0x0a, 0x14, 0x53, - 0x74, 0x72, 0x65, 0x61, 0x6d, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x12, 0x35, 0x0a, 0x0c, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x69, - 0x6e, 0x66, 0x6f, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x72, 0x70, 0x63, 0x70, - 0x62, 0x2e, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x0b, 0x63, - 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x49, 0x6e, 0x66, 0x6f, 0x22, 0x94, 0x05, 0x0a, 0x12, 0x52, - 0x65, 0x73, 0x74, 0x61, 0x72, 0x74, 0x4e, 0x6f, 0x64, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x20, 0x0a, 0x09, 0x65, 0x78, 0x65, 0x63, 0x5f, 0x70, 0x61, - 0x74, 0x68, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x08, 0x65, 0x78, 0x65, 0x63, - 0x50, 0x61, 0x74, 0x68, 0x88, 0x01, 0x01, 0x12, 0x32, 0x0a, 0x12, 0x77, 0x68, 0x69, 0x74, 0x65, - 0x6c, 0x69, 0x73, 0x74, 0x65, 0x64, 0x5f, 0x63, 0x68, 0x61, 0x69, 0x6e, 0x73, 0x18, 0x03, 0x20, - 0x01, 0x28, 0x09, 0x48, 0x01, 0x52, 0x11, 0x77, 0x68, 0x69, 0x74, 0x65, 0x6c, 0x69, 0x73, 0x74, - 0x65, 0x64, 0x43, 0x68, 0x61, 0x69, 0x6e, 0x73, 0x88, 0x01, 0x01, 0x12, 0x50, 0x0a, 0x0d, 0x63, - 0x68, 0x61, 0x69, 0x6e, 0x5f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x73, 0x18, 0x04, 0x20, 0x03, - 0x28, 0x0b, 0x32, 0x2b, 0x2e, 0x72, 0x70, 0x63, 0x70, 0x62, 0x2e, 0x52, 0x65, 0x73, 0x74, 0x61, - 0x72, 0x74, 0x4e, 0x6f, 0x64, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x43, 0x68, - 0x61, 0x69, 0x6e, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, - 0x0c, 0x63, 0x68, 0x61, 0x69, 0x6e, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x73, 0x12, 0x56, 0x0a, - 0x0f, 0x75, 0x70, 0x67, 0x72, 0x61, 0x64, 0x65, 0x5f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x73, - 0x18, 0x05, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2d, 0x2e, 0x72, 0x70, 0x63, 0x70, 0x62, 0x2e, 0x52, - 0x65, 0x73, 0x74, 0x61, 0x72, 0x74, 0x4e, 0x6f, 0x64, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x2e, 0x55, 0x70, 0x67, 0x72, 0x61, 0x64, 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x73, - 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0e, 0x75, 0x70, 0x67, 0x72, 0x61, 0x64, 0x65, 0x43, 0x6f, - 0x6e, 0x66, 0x69, 0x67, 0x73, 0x12, 0x5d, 0x0a, 0x12, 0x63, 0x68, 0x61, 0x69, 0x6e, 0x5f, 0x63, - 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x5f, 0x66, 0x69, 0x6c, 0x65, 0x73, 0x18, 0x06, 0x20, 0x03, 0x28, - 0x0b, 0x32, 0x2f, 0x2e, 0x72, 0x70, 0x63, 0x70, 0x62, 0x2e, 0x52, 0x65, 0x73, 0x74, 0x61, 0x72, - 0x74, 0x4e, 0x6f, 0x64, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x43, 0x68, 0x61, - 0x69, 0x6e, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x45, 0x6e, 0x74, - 0x72, 0x79, 0x52, 0x10, 0x63, 0x68, 0x61, 0x69, 0x6e, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x46, - 0x69, 0x6c, 0x65, 0x73, 0x12, 0x1d, 0x0a, 0x0a, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x5f, 0x64, - 0x69, 0x72, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, - 0x44, 0x69, 0x72, 0x1a, 0x3f, 0x0a, 0x11, 0x43, 0x68, 0x61, 0x69, 0x6e, 0x43, 0x6f, 0x6e, 0x66, - 0x69, 0x67, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, - 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, - 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x41, 0x0a, 0x13, 0x55, 0x70, 0x67, 0x72, 0x61, 0x64, 0x65, 0x43, - 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, - 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, - 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, - 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x43, 0x0a, 0x15, 0x43, 0x68, 0x61, 0x69, 0x6e, - 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, - 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, - 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x42, 0x0c, 0x0a, 0x0a, - 0x5f, 0x65, 0x78, 0x65, 0x63, 0x5f, 0x70, 0x61, 0x74, 0x68, 0x42, 0x15, 0x0a, 0x13, 0x5f, 0x77, - 0x68, 0x69, 0x74, 0x65, 0x6c, 0x69, 0x73, 0x74, 0x65, 0x64, 0x5f, 0x63, 0x68, 0x61, 0x69, 0x6e, - 0x73, 0x22, 0x4c, 0x0a, 0x13, 0x52, 0x65, 0x73, 0x74, 0x61, 0x72, 0x74, 0x4e, 0x6f, 0x64, 0x65, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x35, 0x0a, 0x0c, 0x63, 0x6c, 0x75, 0x73, - 0x74, 0x65, 0x72, 0x5f, 0x69, 0x6e, 0x66, 0x6f, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, - 0x2e, 0x72, 0x70, 0x63, 0x70, 0x62, 0x2e, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x49, 0x6e, - 0x66, 0x6f, 0x52, 0x0b, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x49, 0x6e, 0x66, 0x6f, 0x22, - 0x27, 0x0a, 0x11, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x4e, 0x6f, 0x64, 0x65, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x4b, 0x0a, 0x12, 0x52, 0x65, 0x6d, 0x6f, - 0x76, 0x65, 0x4e, 0x6f, 0x64, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x35, - 0x0a, 0x0c, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x69, 0x6e, 0x66, 0x6f, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x72, 0x70, 0x63, 0x70, 0x62, 0x2e, 0x43, 0x6c, 0x75, - 0x73, 0x74, 0x65, 0x72, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x0b, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, - 0x72, 0x49, 0x6e, 0x66, 0x6f, 0x22, 0x26, 0x0a, 0x10, 0x50, 0x61, 0x75, 0x73, 0x65, 0x4e, 0x6f, - 0x64, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, - 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x4a, 0x0a, - 0x11, 0x50, 0x61, 0x75, 0x73, 0x65, 0x4e, 0x6f, 0x64, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x12, 0x35, 0x0a, 0x0c, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x69, 0x6e, - 0x66, 0x6f, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x72, 0x70, 0x63, 0x70, 0x62, - 0x2e, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x0b, 0x63, 0x6c, - 0x75, 0x73, 0x74, 0x65, 0x72, 0x49, 0x6e, 0x66, 0x6f, 0x22, 0x27, 0x0a, 0x11, 0x52, 0x65, 0x73, - 0x75, 0x6d, 0x65, 0x4e, 0x6f, 0x64, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x12, - 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, - 0x6d, 0x65, 0x22, 0x4b, 0x0a, 0x12, 0x52, 0x65, 0x73, 0x75, 0x6d, 0x65, 0x4e, 0x6f, 0x64, 0x65, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x35, 0x0a, 0x0c, 0x63, 0x6c, 0x75, 0x73, - 0x74, 0x65, 0x72, 0x5f, 0x69, 0x6e, 0x66, 0x6f, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, - 0x2e, 0x72, 0x70, 0x63, 0x70, 0x62, 0x2e, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x49, 0x6e, - 0x66, 0x6f, 0x52, 0x0b, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x49, 0x6e, 0x66, 0x6f, 0x22, - 0xdc, 0x04, 0x0a, 0x0e, 0x41, 0x64, 0x64, 0x4e, 0x6f, 0x64, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x1b, 0x0a, 0x09, 0x65, 0x78, 0x65, 0x63, 0x5f, 0x70, - 0x61, 0x74, 0x68, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x65, 0x78, 0x65, 0x63, 0x50, - 0x61, 0x74, 0x68, 0x12, 0x24, 0x0a, 0x0b, 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x63, 0x6f, 0x6e, 0x66, - 0x69, 0x67, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x0a, 0x6e, 0x6f, 0x64, 0x65, - 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x88, 0x01, 0x01, 0x12, 0x4c, 0x0a, 0x0d, 0x63, 0x68, 0x61, - 0x69, 0x6e, 0x5f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, - 0x32, 0x27, 0x2e, 0x72, 0x70, 0x63, 0x70, 0x62, 0x2e, 0x41, 0x64, 0x64, 0x4e, 0x6f, 0x64, 0x65, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x43, 0x68, 0x61, 0x69, 0x6e, 0x43, 0x6f, 0x6e, - 0x66, 0x69, 0x67, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0c, 0x63, 0x68, 0x61, 0x69, 0x6e, - 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x73, 0x12, 0x52, 0x0a, 0x0f, 0x75, 0x70, 0x67, 0x72, 0x61, - 0x64, 0x65, 0x5f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x73, 0x18, 0x05, 0x20, 0x03, 0x28, 0x0b, - 0x32, 0x29, 0x2e, 0x72, 0x70, 0x63, 0x70, 0x62, 0x2e, 0x41, 0x64, 0x64, 0x4e, 0x6f, 0x64, 0x65, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x55, 0x70, 0x67, 0x72, 0x61, 0x64, 0x65, 0x43, - 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0e, 0x75, 0x70, 0x67, - 0x72, 0x61, 0x64, 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x73, 0x12, 0x59, 0x0a, 0x12, 0x63, - 0x68, 0x61, 0x69, 0x6e, 0x5f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x5f, 0x66, 0x69, 0x6c, 0x65, - 0x73, 0x18, 0x06, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2b, 0x2e, 0x72, 0x70, 0x63, 0x70, 0x62, 0x2e, - 0x41, 0x64, 0x64, 0x4e, 0x6f, 0x64, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x43, - 0x68, 0x61, 0x69, 0x6e, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x45, - 0x6e, 0x74, 0x72, 0x79, 0x52, 0x10, 0x63, 0x68, 0x61, 0x69, 0x6e, 0x43, 0x6f, 0x6e, 0x66, 0x69, - 0x67, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x12, 0x1d, 0x0a, 0x0a, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, - 0x5f, 0x64, 0x69, 0x72, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x70, 0x6c, 0x75, 0x67, - 0x69, 0x6e, 0x44, 0x69, 0x72, 0x1a, 0x3f, 0x0a, 0x11, 0x43, 0x68, 0x61, 0x69, 0x6e, 0x43, 0x6f, - 0x6e, 0x66, 0x69, 0x67, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, - 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, - 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, - 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x41, 0x0a, 0x13, 0x55, 0x70, 0x67, 0x72, 0x61, 0x64, - 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, - 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, - 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, - 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x43, 0x0a, 0x15, 0x43, 0x68, 0x61, - 0x69, 0x6e, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x45, 0x6e, 0x74, - 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x42, 0x0e, - 0x0a, 0x0c, 0x5f, 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x22, 0x48, - 0x0a, 0x0f, 0x41, 0x64, 0x64, 0x4e, 0x6f, 0x64, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x12, 0x35, 0x0a, 0x0c, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x69, 0x6e, 0x66, - 0x6f, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x72, 0x70, 0x63, 0x70, 0x62, 0x2e, - 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x0b, 0x63, 0x6c, 0x75, - 0x73, 0x74, 0x65, 0x72, 0x49, 0x6e, 0x66, 0x6f, 0x22, 0x0d, 0x0a, 0x0b, 0x53, 0x74, 0x6f, 0x70, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x45, 0x0a, 0x0c, 0x53, 0x74, 0x6f, 0x70, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x35, 0x0a, 0x0c, 0x63, 0x6c, 0x75, 0x73, 0x74, - 0x65, 0x72, 0x5f, 0x69, 0x6e, 0x66, 0x6f, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, - 0x72, 0x70, 0x63, 0x70, 0x62, 0x2e, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x49, 0x6e, 0x66, - 0x6f, 0x52, 0x0b, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x49, 0x6e, 0x66, 0x6f, 0x22, 0x30, - 0x0a, 0x11, 0x41, 0x74, 0x74, 0x61, 0x63, 0x68, 0x50, 0x65, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x12, 0x1b, 0x0a, 0x09, 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6e, 0x6f, 0x64, 0x65, 0x4e, 0x61, 0x6d, 0x65, - 0x22, 0x92, 0x01, 0x0a, 0x12, 0x41, 0x74, 0x74, 0x61, 0x63, 0x68, 0x50, 0x65, 0x65, 0x72, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x35, 0x0a, 0x0c, 0x63, 0x6c, 0x75, 0x73, 0x74, - 0x65, 0x72, 0x5f, 0x69, 0x6e, 0x66, 0x6f, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, - 0x72, 0x70, 0x63, 0x70, 0x62, 0x2e, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x49, 0x6e, 0x66, - 0x6f, 0x52, 0x0b, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x45, - 0x0a, 0x12, 0x61, 0x74, 0x74, 0x61, 0x63, 0x68, 0x65, 0x64, 0x5f, 0x70, 0x65, 0x65, 0x72, 0x5f, - 0x69, 0x6e, 0x66, 0x6f, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x72, 0x70, 0x63, - 0x70, 0x62, 0x2e, 0x41, 0x74, 0x74, 0x61, 0x63, 0x68, 0x65, 0x64, 0x50, 0x65, 0x65, 0x72, 0x49, - 0x6e, 0x66, 0x6f, 0x52, 0x10, 0x61, 0x74, 0x74, 0x61, 0x63, 0x68, 0x65, 0x64, 0x50, 0x65, 0x65, - 0x72, 0x49, 0x6e, 0x66, 0x6f, 0x22, 0x78, 0x0a, 0x1a, 0x53, 0x65, 0x6e, 0x64, 0x4f, 0x75, 0x74, - 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x12, 0x1b, 0x0a, 0x09, 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6e, 0x6f, 0x64, 0x65, 0x4e, 0x61, 0x6d, 0x65, - 0x12, 0x17, 0x0a, 0x07, 0x70, 0x65, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x06, 0x70, 0x65, 0x65, 0x72, 0x49, 0x64, 0x12, 0x0e, 0x0a, 0x02, 0x6f, 0x70, 0x18, - 0x03, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x02, 0x6f, 0x70, 0x12, 0x14, 0x0a, 0x05, 0x62, 0x79, 0x74, - 0x65, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x05, 0x62, 0x79, 0x74, 0x65, 0x73, 0x22, - 0x31, 0x0a, 0x1b, 0x53, 0x65, 0x6e, 0x64, 0x4f, 0x75, 0x74, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x4d, - 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x12, - 0x0a, 0x04, 0x73, 0x65, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x04, 0x73, 0x65, - 0x6e, 0x74, 0x22, 0x5d, 0x0a, 0x13, 0x53, 0x61, 0x76, 0x65, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, - 0x6f, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x21, 0x0a, 0x0c, 0x6e, 0x65, 0x74, - 0x77, 0x6f, 0x72, 0x6b, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x0b, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x23, 0x0a, 0x0d, - 0x73, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x0c, 0x73, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x4e, 0x61, 0x6d, - 0x65, 0x22, 0x3b, 0x0a, 0x14, 0x53, 0x61, 0x76, 0x65, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, - 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x23, 0x0a, 0x0d, 0x73, 0x6e, 0x61, - 0x70, 0x73, 0x68, 0x6f, 0x74, 0x5f, 0x70, 0x61, 0x74, 0x68, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x0c, 0x73, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x50, 0x61, 0x74, 0x68, 0x22, 0xdb, - 0x06, 0x0a, 0x13, 0x4c, 0x6f, 0x61, 0x64, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x21, 0x0a, 0x0c, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, - 0x6b, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x6e, 0x65, - 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x23, 0x0a, 0x0d, 0x73, 0x6e, 0x61, - 0x70, 0x73, 0x68, 0x6f, 0x74, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x0c, 0x73, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x20, - 0x0a, 0x09, 0x65, 0x78, 0x65, 0x63, 0x5f, 0x70, 0x61, 0x74, 0x68, 0x18, 0x03, 0x20, 0x01, 0x28, - 0x09, 0x48, 0x00, 0x52, 0x08, 0x65, 0x78, 0x65, 0x63, 0x50, 0x61, 0x74, 0x68, 0x88, 0x01, 0x01, - 0x12, 0x1d, 0x0a, 0x0a, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x5f, 0x64, 0x69, 0x72, 0x18, 0x04, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x44, 0x69, 0x72, 0x12, - 0x27, 0x0a, 0x0d, 0x72, 0x6f, 0x6f, 0x74, 0x5f, 0x64, 0x61, 0x74, 0x61, 0x5f, 0x64, 0x69, 0x72, - 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x48, 0x01, 0x52, 0x0b, 0x72, 0x6f, 0x6f, 0x74, 0x44, 0x61, - 0x74, 0x61, 0x44, 0x69, 0x72, 0x88, 0x01, 0x01, 0x12, 0x51, 0x0a, 0x0d, 0x63, 0x68, 0x61, 0x69, - 0x6e, 0x5f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x73, 0x18, 0x06, 0x20, 0x03, 0x28, 0x0b, 0x32, - 0x2c, 0x2e, 0x72, 0x70, 0x63, 0x70, 0x62, 0x2e, 0x4c, 0x6f, 0x61, 0x64, 0x53, 0x6e, 0x61, 0x70, - 0x73, 0x68, 0x6f, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x43, 0x68, 0x61, 0x69, - 0x6e, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0c, 0x63, - 0x68, 0x61, 0x69, 0x6e, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x73, 0x12, 0x57, 0x0a, 0x0f, 0x75, - 0x70, 0x67, 0x72, 0x61, 0x64, 0x65, 0x5f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x73, 0x18, 0x07, - 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2e, 0x2e, 0x72, 0x70, 0x63, 0x70, 0x62, 0x2e, 0x4c, 0x6f, 0x61, - 0x64, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x2e, 0x55, 0x70, 0x67, 0x72, 0x61, 0x64, 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x73, 0x45, - 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0e, 0x75, 0x70, 0x67, 0x72, 0x61, 0x64, 0x65, 0x43, 0x6f, 0x6e, - 0x66, 0x69, 0x67, 0x73, 0x12, 0x31, 0x0a, 0x12, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x5f, 0x6e, - 0x6f, 0x64, 0x65, 0x5f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, - 0x48, 0x02, 0x52, 0x10, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x4e, 0x6f, 0x64, 0x65, 0x43, 0x6f, - 0x6e, 0x66, 0x69, 0x67, 0x88, 0x01, 0x01, 0x12, 0x38, 0x0a, 0x16, 0x72, 0x65, 0x61, 0x73, 0x73, - 0x69, 0x67, 0x6e, 0x5f, 0x70, 0x6f, 0x72, 0x74, 0x73, 0x5f, 0x69, 0x66, 0x5f, 0x75, 0x73, 0x65, - 0x64, 0x18, 0x09, 0x20, 0x01, 0x28, 0x08, 0x48, 0x03, 0x52, 0x13, 0x72, 0x65, 0x61, 0x73, 0x73, - 0x69, 0x67, 0x6e, 0x50, 0x6f, 0x72, 0x74, 0x73, 0x49, 0x66, 0x55, 0x73, 0x65, 0x64, 0x88, 0x01, - 0x01, 0x12, 0x5e, 0x0a, 0x12, 0x63, 0x68, 0x61, 0x69, 0x6e, 0x5f, 0x63, 0x6f, 0x6e, 0x66, 0x69, - 0x67, 0x5f, 0x66, 0x69, 0x6c, 0x65, 0x73, 0x18, 0x0a, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x30, 0x2e, - 0x72, 0x70, 0x63, 0x70, 0x62, 0x2e, 0x4c, 0x6f, 0x61, 0x64, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, - 0x6f, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x43, 0x68, 0x61, 0x69, 0x6e, 0x43, - 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, - 0x10, 0x63, 0x68, 0x61, 0x69, 0x6e, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x46, 0x69, 0x6c, 0x65, - 0x73, 0x1a, 0x3f, 0x0a, 0x11, 0x43, 0x68, 0x61, 0x69, 0x6e, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, - 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, - 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, - 0x38, 0x01, 0x1a, 0x41, 0x0a, 0x13, 0x55, 0x70, 0x67, 0x72, 0x61, 0x64, 0x65, 0x43, 0x6f, 0x6e, - 0x66, 0x69, 0x67, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, - 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, - 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x43, 0x0a, 0x15, 0x43, 0x68, 0x61, 0x69, 0x6e, 0x43, 0x6f, - 0x6e, 0x66, 0x69, 0x67, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, - 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, - 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x42, 0x0c, 0x0a, 0x0a, 0x5f, 0x65, - 0x78, 0x65, 0x63, 0x5f, 0x70, 0x61, 0x74, 0x68, 0x42, 0x10, 0x0a, 0x0e, 0x5f, 0x72, 0x6f, 0x6f, - 0x74, 0x5f, 0x64, 0x61, 0x74, 0x61, 0x5f, 0x64, 0x69, 0x72, 0x42, 0x15, 0x0a, 0x13, 0x5f, 0x67, - 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x5f, 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x63, 0x6f, 0x6e, 0x66, 0x69, - 0x67, 0x42, 0x19, 0x0a, 0x17, 0x5f, 0x72, 0x65, 0x61, 0x73, 0x73, 0x69, 0x67, 0x6e, 0x5f, 0x70, - 0x6f, 0x72, 0x74, 0x73, 0x5f, 0x69, 0x66, 0x5f, 0x75, 0x73, 0x65, 0x64, 0x22, 0x4d, 0x0a, 0x14, - 0x4c, 0x6f, 0x61, 0x64, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x35, 0x0a, 0x0c, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, - 0x69, 0x6e, 0x66, 0x6f, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x72, 0x70, 0x63, - 0x70, 0x62, 0x2e, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x0b, - 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x49, 0x6e, 0x66, 0x6f, 0x22, 0x5f, 0x0a, 0x15, 0x52, - 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x12, 0x21, 0x0a, 0x0c, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x5f, - 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x6e, 0x65, 0x74, 0x77, - 0x6f, 0x72, 0x6b, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x23, 0x0a, 0x0d, 0x73, 0x6e, 0x61, 0x70, 0x73, - 0x68, 0x6f, 0x74, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, - 0x73, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x22, 0x18, 0x0a, 0x16, - 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x3c, 0x0a, 0x17, 0x47, 0x65, 0x74, 0x53, 0x6e, 0x61, - 0x70, 0x73, 0x68, 0x6f, 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x12, 0x21, 0x0a, 0x0c, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x5f, 0x6e, 0x61, 0x6d, - 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, - 0x4e, 0x61, 0x6d, 0x65, 0x22, 0x41, 0x0a, 0x18, 0x47, 0x65, 0x74, 0x53, 0x6e, 0x61, 0x70, 0x73, - 0x68, 0x6f, 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x12, 0x25, 0x0a, 0x0e, 0x73, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x5f, 0x6e, 0x61, 0x6d, - 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0d, 0x73, 0x6e, 0x61, 0x70, 0x73, 0x68, - 0x6f, 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x32, 0x53, 0x0a, 0x0b, 0x50, 0x69, 0x6e, 0x67, 0x53, - 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x44, 0x0a, 0x04, 0x50, 0x69, 0x6e, 0x67, 0x12, 0x12, - 0x2e, 0x72, 0x70, 0x63, 0x70, 0x62, 0x2e, 0x50, 0x69, 0x6e, 0x67, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x1a, 0x13, 0x2e, 0x72, 0x70, 0x63, 0x70, 0x62, 0x2e, 0x50, 0x69, 0x6e, 0x67, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x13, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0d, 0x3a, - 0x01, 0x2a, 0x22, 0x08, 0x2f, 0x76, 0x31, 0x2f, 0x70, 0x69, 0x6e, 0x67, 0x32, 0xdb, 0x15, 0x0a, - 0x0e, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, - 0x64, 0x0a, 0x0a, 0x52, 0x50, 0x43, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x18, 0x2e, - 0x72, 0x70, 0x63, 0x70, 0x62, 0x2e, 0x52, 0x50, 0x43, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x19, 0x2e, 0x72, 0x70, 0x63, 0x70, 0x62, 0x2e, - 0x52, 0x50, 0x43, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x22, 0x21, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x1b, 0x3a, 0x01, 0x2a, 0x22, 0x16, 0x2f, - 0x76, 0x31, 0x2f, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2f, 0x72, 0x70, 0x63, 0x76, 0x65, - 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x50, 0x0a, 0x05, 0x53, 0x74, 0x61, 0x72, 0x74, 0x12, 0x13, - 0x2e, 0x72, 0x70, 0x63, 0x70, 0x62, 0x2e, 0x53, 0x74, 0x61, 0x72, 0x74, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x1a, 0x14, 0x2e, 0x72, 0x70, 0x63, 0x70, 0x62, 0x2e, 0x53, 0x74, 0x61, 0x72, - 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x1c, 0x82, 0xd3, 0xe4, 0x93, 0x02, - 0x16, 0x3a, 0x01, 0x2a, 0x22, 0x11, 0x2f, 0x76, 0x31, 0x2f, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, - 0x6c, 0x2f, 0x73, 0x74, 0x61, 0x72, 0x74, 0x12, 0x80, 0x01, 0x0a, 0x11, 0x43, 0x72, 0x65, 0x61, - 0x74, 0x65, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x63, 0x68, 0x61, 0x69, 0x6e, 0x73, 0x12, 0x1f, 0x2e, - 0x72, 0x70, 0x63, 0x70, 0x62, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x42, 0x6c, 0x6f, 0x63, - 0x6b, 0x63, 0x68, 0x61, 0x69, 0x6e, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x20, - 0x2e, 0x72, 0x70, 0x63, 0x70, 0x62, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x42, 0x6c, 0x6f, - 0x63, 0x6b, 0x63, 0x68, 0x61, 0x69, 0x6e, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x22, 0x28, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x22, 0x3a, 0x01, 0x2a, 0x22, 0x1d, 0x2f, 0x76, 0x31, - 0x2f, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2f, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x62, - 0x6c, 0x6f, 0x63, 0x6b, 0x63, 0x68, 0x61, 0x69, 0x6e, 0x73, 0x12, 0x94, 0x01, 0x0a, 0x16, 0x54, - 0x72, 0x61, 0x6e, 0x73, 0x66, 0x6f, 0x72, 0x6d, 0x45, 0x6c, 0x61, 0x73, 0x74, 0x69, 0x63, 0x43, - 0x68, 0x61, 0x69, 0x6e, 0x73, 0x12, 0x24, 0x2e, 0x72, 0x70, 0x63, 0x70, 0x62, 0x2e, 0x54, 0x72, - 0x61, 0x6e, 0x73, 0x66, 0x6f, 0x72, 0x6d, 0x45, 0x6c, 0x61, 0x73, 0x74, 0x69, 0x63, 0x43, 0x68, - 0x61, 0x69, 0x6e, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x25, 0x2e, 0x72, 0x70, - 0x63, 0x70, 0x62, 0x2e, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x6f, 0x72, 0x6d, 0x45, 0x6c, 0x61, - 0x73, 0x74, 0x69, 0x63, 0x43, 0x68, 0x61, 0x69, 0x6e, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x22, 0x2d, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x27, 0x3a, 0x01, 0x2a, 0x22, 0x22, 0x2f, - 0x76, 0x31, 0x2f, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2f, 0x74, 0x72, 0x61, 0x6e, 0x73, - 0x66, 0x6f, 0x72, 0x6d, 0x65, 0x6c, 0x61, 0x73, 0x74, 0x69, 0x63, 0x63, 0x68, 0x61, 0x69, 0x6e, - 0x73, 0x12, 0xa4, 0x01, 0x0a, 0x1a, 0x41, 0x64, 0x64, 0x50, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, - 0x69, 0x6f, 0x6e, 0x6c, 0x65, 0x73, 0x73, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x6f, 0x72, - 0x12, 0x28, 0x2e, 0x72, 0x70, 0x63, 0x70, 0x62, 0x2e, 0x41, 0x64, 0x64, 0x50, 0x65, 0x72, 0x6d, - 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x6c, 0x65, 0x73, 0x73, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, - 0x74, 0x6f, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x29, 0x2e, 0x72, 0x70, 0x63, - 0x70, 0x62, 0x2e, 0x41, 0x64, 0x64, 0x50, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, - 0x6c, 0x65, 0x73, 0x73, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x6f, 0x72, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x31, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x2b, 0x3a, 0x01, 0x2a, - 0x22, 0x26, 0x2f, 0x76, 0x31, 0x2f, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2f, 0x61, 0x64, - 0x64, 0x70, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x6c, 0x65, 0x73, 0x73, 0x76, - 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x6f, 0x72, 0x12, 0x8c, 0x01, 0x0a, 0x14, 0x52, 0x65, 0x6d, - 0x6f, 0x76, 0x65, 0x43, 0x68, 0x61, 0x69, 0x6e, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x6f, - 0x72, 0x12, 0x22, 0x2e, 0x72, 0x70, 0x63, 0x70, 0x62, 0x2e, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, - 0x43, 0x68, 0x61, 0x69, 0x6e, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x6f, 0x72, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x23, 0x2e, 0x72, 0x70, 0x63, 0x70, 0x62, 0x2e, 0x52, 0x65, - 0x6d, 0x6f, 0x76, 0x65, 0x43, 0x68, 0x61, 0x69, 0x6e, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, - 0x6f, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x2b, 0x82, 0xd3, 0xe4, 0x93, - 0x02, 0x25, 0x3a, 0x01, 0x2a, 0x22, 0x20, 0x2f, 0x76, 0x31, 0x2f, 0x63, 0x6f, 0x6e, 0x74, 0x72, - 0x6f, 0x6c, 0x2f, 0x72, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x63, 0x68, 0x61, 0x69, 0x6e, 0x76, 0x61, - 0x6c, 0x69, 0x64, 0x61, 0x74, 0x6f, 0x72, 0x12, 0x6c, 0x0a, 0x0c, 0x43, 0x72, 0x65, 0x61, 0x74, - 0x65, 0x43, 0x68, 0x61, 0x69, 0x6e, 0x73, 0x12, 0x1a, 0x2e, 0x72, 0x70, 0x63, 0x70, 0x62, 0x2e, - 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x43, 0x68, 0x61, 0x69, 0x6e, 0x73, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x1a, 0x1b, 0x2e, 0x72, 0x70, 0x63, 0x70, 0x62, 0x2e, 0x43, 0x72, 0x65, 0x61, - 0x74, 0x65, 0x43, 0x68, 0x61, 0x69, 0x6e, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x22, 0x23, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x1d, 0x3a, 0x01, 0x2a, 0x22, 0x18, 0x2f, 0x76, 0x31, - 0x2f, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2f, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x63, - 0x68, 0x61, 0x69, 0x6e, 0x73, 0x12, 0x54, 0x0a, 0x06, 0x48, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x12, - 0x14, 0x2e, 0x72, 0x70, 0x63, 0x70, 0x62, 0x2e, 0x48, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x15, 0x2e, 0x72, 0x70, 0x63, 0x70, 0x62, 0x2e, 0x48, 0x65, - 0x61, 0x6c, 0x74, 0x68, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x1d, 0x82, 0xd3, - 0xe4, 0x93, 0x02, 0x17, 0x3a, 0x01, 0x2a, 0x22, 0x12, 0x2f, 0x76, 0x31, 0x2f, 0x63, 0x6f, 0x6e, - 0x74, 0x72, 0x6f, 0x6c, 0x2f, 0x68, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x12, 0x4c, 0x0a, 0x04, 0x55, - 0x52, 0x49, 0x73, 0x12, 0x12, 0x2e, 0x72, 0x70, 0x63, 0x70, 0x62, 0x2e, 0x55, 0x52, 0x49, 0x73, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x13, 0x2e, 0x72, 0x70, 0x63, 0x70, 0x62, 0x2e, - 0x55, 0x52, 0x49, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x1b, 0x82, 0xd3, - 0xe4, 0x93, 0x02, 0x15, 0x3a, 0x01, 0x2a, 0x22, 0x10, 0x2f, 0x76, 0x31, 0x2f, 0x63, 0x6f, 0x6e, - 0x74, 0x72, 0x6f, 0x6c, 0x2f, 0x75, 0x72, 0x69, 0x73, 0x12, 0x74, 0x0a, 0x0e, 0x57, 0x61, 0x69, - 0x74, 0x46, 0x6f, 0x72, 0x48, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x79, 0x12, 0x1c, 0x2e, 0x72, 0x70, - 0x63, 0x70, 0x62, 0x2e, 0x57, 0x61, 0x69, 0x74, 0x46, 0x6f, 0x72, 0x48, 0x65, 0x61, 0x6c, 0x74, - 0x68, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1d, 0x2e, 0x72, 0x70, 0x63, 0x70, - 0x62, 0x2e, 0x57, 0x61, 0x69, 0x74, 0x46, 0x6f, 0x72, 0x48, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x79, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x25, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x1f, - 0x3a, 0x01, 0x2a, 0x22, 0x1a, 0x2f, 0x76, 0x31, 0x2f, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, - 0x2f, 0x77, 0x61, 0x69, 0x74, 0x66, 0x6f, 0x72, 0x68, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x79, 0x12, - 0x54, 0x0a, 0x06, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x14, 0x2e, 0x72, 0x70, 0x63, 0x70, - 0x62, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, - 0x15, 0x2e, 0x72, 0x70, 0x63, 0x70, 0x62, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x1d, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x17, 0x3a, 0x01, - 0x2a, 0x22, 0x12, 0x2f, 0x76, 0x31, 0x2f, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2f, 0x73, - 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x6e, 0x0a, 0x0c, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x53, - 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x1a, 0x2e, 0x72, 0x70, 0x63, 0x70, 0x62, 0x2e, 0x53, 0x74, - 0x72, 0x65, 0x61, 0x6d, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x1a, 0x1b, 0x2e, 0x72, 0x70, 0x63, 0x70, 0x62, 0x2e, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, - 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x23, - 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x1d, 0x3a, 0x01, 0x2a, 0x22, 0x18, 0x2f, 0x76, 0x31, 0x2f, 0x63, - 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2f, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x73, 0x74, 0x61, - 0x74, 0x75, 0x73, 0x30, 0x01, 0x12, 0x64, 0x0a, 0x0a, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x4e, - 0x6f, 0x64, 0x65, 0x12, 0x18, 0x2e, 0x72, 0x70, 0x63, 0x70, 0x62, 0x2e, 0x52, 0x65, 0x6d, 0x6f, - 0x76, 0x65, 0x4e, 0x6f, 0x64, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x19, 0x2e, - 0x72, 0x70, 0x63, 0x70, 0x62, 0x2e, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x4e, 0x6f, 0x64, 0x65, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x21, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x1b, - 0x3a, 0x01, 0x2a, 0x22, 0x16, 0x2f, 0x76, 0x31, 0x2f, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, - 0x2f, 0x72, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x6e, 0x6f, 0x64, 0x65, 0x12, 0x58, 0x0a, 0x07, 0x41, - 0x64, 0x64, 0x4e, 0x6f, 0x64, 0x65, 0x12, 0x15, 0x2e, 0x72, 0x70, 0x63, 0x70, 0x62, 0x2e, 0x41, - 0x64, 0x64, 0x4e, 0x6f, 0x64, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, - 0x72, 0x70, 0x63, 0x70, 0x62, 0x2e, 0x41, 0x64, 0x64, 0x4e, 0x6f, 0x64, 0x65, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x1e, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x18, 0x3a, 0x01, 0x2a, - 0x22, 0x13, 0x2f, 0x76, 0x31, 0x2f, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2f, 0x61, 0x64, - 0x64, 0x6e, 0x6f, 0x64, 0x65, 0x12, 0x68, 0x0a, 0x0b, 0x52, 0x65, 0x73, 0x74, 0x61, 0x72, 0x74, - 0x4e, 0x6f, 0x64, 0x65, 0x12, 0x19, 0x2e, 0x72, 0x70, 0x63, 0x70, 0x62, 0x2e, 0x52, 0x65, 0x73, - 0x74, 0x61, 0x72, 0x74, 0x4e, 0x6f, 0x64, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, - 0x1a, 0x2e, 0x72, 0x70, 0x63, 0x70, 0x62, 0x2e, 0x52, 0x65, 0x73, 0x74, 0x61, 0x72, 0x74, 0x4e, - 0x6f, 0x64, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x22, 0x82, 0xd3, 0xe4, - 0x93, 0x02, 0x1c, 0x3a, 0x01, 0x2a, 0x22, 0x17, 0x2f, 0x76, 0x31, 0x2f, 0x63, 0x6f, 0x6e, 0x74, - 0x72, 0x6f, 0x6c, 0x2f, 0x72, 0x65, 0x73, 0x74, 0x61, 0x72, 0x74, 0x6e, 0x6f, 0x64, 0x65, 0x12, - 0x60, 0x0a, 0x09, 0x50, 0x61, 0x75, 0x73, 0x65, 0x4e, 0x6f, 0x64, 0x65, 0x12, 0x17, 0x2e, 0x72, - 0x70, 0x63, 0x70, 0x62, 0x2e, 0x50, 0x61, 0x75, 0x73, 0x65, 0x4e, 0x6f, 0x64, 0x65, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x18, 0x2e, 0x72, 0x70, 0x63, 0x70, 0x62, 0x2e, 0x50, 0x61, - 0x75, 0x73, 0x65, 0x4e, 0x6f, 0x64, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, - 0x20, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x1a, 0x3a, 0x01, 0x2a, 0x22, 0x15, 0x2f, 0x76, 0x31, 0x2f, - 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2f, 0x70, 0x61, 0x75, 0x73, 0x65, 0x6e, 0x6f, 0x64, - 0x65, 0x12, 0x64, 0x0a, 0x0a, 0x52, 0x65, 0x73, 0x75, 0x6d, 0x65, 0x4e, 0x6f, 0x64, 0x65, 0x12, - 0x18, 0x2e, 0x72, 0x70, 0x63, 0x70, 0x62, 0x2e, 0x52, 0x65, 0x73, 0x75, 0x6d, 0x65, 0x4e, 0x6f, - 0x64, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x19, 0x2e, 0x72, 0x70, 0x63, 0x70, - 0x62, 0x2e, 0x52, 0x65, 0x73, 0x75, 0x6d, 0x65, 0x4e, 0x6f, 0x64, 0x65, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x21, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x1b, 0x3a, 0x01, 0x2a, 0x22, - 0x16, 0x2f, 0x76, 0x31, 0x2f, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2f, 0x72, 0x65, 0x73, - 0x75, 0x6d, 0x65, 0x6e, 0x6f, 0x64, 0x65, 0x12, 0x4c, 0x0a, 0x04, 0x53, 0x74, 0x6f, 0x70, 0x12, - 0x12, 0x2e, 0x72, 0x70, 0x63, 0x70, 0x62, 0x2e, 0x53, 0x74, 0x6f, 0x70, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x1a, 0x13, 0x2e, 0x72, 0x70, 0x63, 0x70, 0x62, 0x2e, 0x53, 0x74, 0x6f, 0x70, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x1b, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x15, - 0x3a, 0x01, 0x2a, 0x22, 0x10, 0x2f, 0x76, 0x31, 0x2f, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, - 0x2f, 0x73, 0x74, 0x6f, 0x70, 0x12, 0x64, 0x0a, 0x0a, 0x41, 0x74, 0x74, 0x61, 0x63, 0x68, 0x50, - 0x65, 0x65, 0x72, 0x12, 0x18, 0x2e, 0x72, 0x70, 0x63, 0x70, 0x62, 0x2e, 0x41, 0x74, 0x74, 0x61, - 0x63, 0x68, 0x50, 0x65, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x19, 0x2e, - 0x72, 0x70, 0x63, 0x70, 0x62, 0x2e, 0x41, 0x74, 0x74, 0x61, 0x63, 0x68, 0x50, 0x65, 0x65, 0x72, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x21, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x1b, - 0x3a, 0x01, 0x2a, 0x22, 0x16, 0x2f, 0x76, 0x31, 0x2f, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, - 0x2f, 0x61, 0x74, 0x74, 0x61, 0x63, 0x68, 0x70, 0x65, 0x65, 0x72, 0x12, 0x88, 0x01, 0x0a, 0x13, - 0x53, 0x65, 0x6e, 0x64, 0x4f, 0x75, 0x74, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x4d, 0x65, 0x73, 0x73, - 0x61, 0x67, 0x65, 0x12, 0x21, 0x2e, 0x72, 0x70, 0x63, 0x70, 0x62, 0x2e, 0x53, 0x65, 0x6e, 0x64, - 0x4f, 0x75, 0x74, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x22, 0x2e, 0x72, 0x70, 0x63, 0x70, 0x62, 0x2e, 0x53, - 0x65, 0x6e, 0x64, 0x4f, 0x75, 0x74, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x4d, 0x65, 0x73, 0x73, 0x61, - 0x67, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x2a, 0x82, 0xd3, 0xe4, 0x93, - 0x02, 0x24, 0x3a, 0x01, 0x2a, 0x22, 0x1f, 0x2f, 0x76, 0x31, 0x2f, 0x63, 0x6f, 0x6e, 0x74, 0x72, - 0x6f, 0x6c, 0x2f, 0x73, 0x65, 0x6e, 0x64, 0x6f, 0x75, 0x74, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x6d, - 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x6c, 0x0a, 0x0c, 0x53, 0x61, 0x76, 0x65, 0x53, 0x6e, - 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x12, 0x1a, 0x2e, 0x72, 0x70, 0x63, 0x70, 0x62, 0x2e, 0x53, - 0x61, 0x76, 0x65, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x1a, 0x1b, 0x2e, 0x72, 0x70, 0x63, 0x70, 0x62, 0x2e, 0x53, 0x61, 0x76, 0x65, 0x53, - 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, - 0x23, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x1d, 0x3a, 0x01, 0x2a, 0x22, 0x18, 0x2f, 0x76, 0x31, 0x2f, - 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2f, 0x73, 0x61, 0x76, 0x65, 0x73, 0x6e, 0x61, 0x70, - 0x73, 0x68, 0x6f, 0x74, 0x12, 0x72, 0x0a, 0x0f, 0x53, 0x61, 0x76, 0x65, 0x48, 0x6f, 0x74, 0x53, - 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x12, 0x1a, 0x2e, 0x72, 0x70, 0x63, 0x70, 0x62, 0x2e, - 0x53, 0x61, 0x76, 0x65, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x1a, 0x1b, 0x2e, 0x72, 0x70, 0x63, 0x70, 0x62, 0x2e, 0x53, 0x61, 0x76, 0x65, - 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x22, 0x26, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x20, 0x3a, 0x01, 0x2a, 0x22, 0x1b, 0x2f, 0x76, 0x31, - 0x2f, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2f, 0x73, 0x61, 0x76, 0x65, 0x68, 0x6f, 0x74, - 0x73, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x12, 0x6c, 0x0a, 0x0c, 0x4c, 0x6f, 0x61, 0x64, - 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x12, 0x1a, 0x2e, 0x72, 0x70, 0x63, 0x70, 0x62, - 0x2e, 0x4c, 0x6f, 0x61, 0x64, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1b, 0x2e, 0x72, 0x70, 0x63, 0x70, 0x62, 0x2e, 0x4c, 0x6f, 0x61, - 0x64, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x22, 0x23, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x1d, 0x3a, 0x01, 0x2a, 0x22, 0x18, 0x2f, 0x76, - 0x31, 0x2f, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2f, 0x6c, 0x6f, 0x61, 0x64, 0x73, 0x6e, - 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x12, 0x74, 0x0a, 0x0e, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, - 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x12, 0x1c, 0x2e, 0x72, 0x70, 0x63, 0x70, 0x62, - 0x2e, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1d, 0x2e, 0x72, 0x70, 0x63, 0x70, 0x62, 0x2e, 0x52, - 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x25, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x1f, 0x3a, 0x01, 0x2a, - 0x22, 0x1a, 0x2f, 0x76, 0x31, 0x2f, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2f, 0x72, 0x65, - 0x6d, 0x6f, 0x76, 0x65, 0x73, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x12, 0x7c, 0x0a, 0x10, - 0x47, 0x65, 0x74, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x73, - 0x12, 0x1e, 0x2e, 0x72, 0x70, 0x63, 0x70, 0x62, 0x2e, 0x47, 0x65, 0x74, 0x53, 0x6e, 0x61, 0x70, - 0x73, 0x68, 0x6f, 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x1a, 0x1f, 0x2e, 0x72, 0x70, 0x63, 0x70, 0x62, 0x2e, 0x47, 0x65, 0x74, 0x53, 0x6e, 0x61, 0x70, - 0x73, 0x68, 0x6f, 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x22, 0x27, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x21, 0x3a, 0x01, 0x2a, 0x22, 0x1c, 0x2f, 0x76, - 0x31, 0x2f, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2f, 0x67, 0x65, 0x74, 0x73, 0x6e, 0x61, - 0x70, 0x73, 0x68, 0x6f, 0x74, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x42, 0x22, 0x5a, 0x20, 0x67, 0x69, - 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x6c, 0x75, 0x78, 0x66, 0x69, 0x2f, 0x6e, - 0x65, 0x74, 0x72, 0x75, 0x6e, 0x6e, 0x65, 0x72, 0x3b, 0x72, 0x70, 0x63, 0x70, 0x62, 0x62, 0x06, - 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, -} +const file_rpcpb_rpc_proto_rawDesc = "" + + "\n" + + "\x0frpcpb/rpc.proto\x12\x05rpcpb\x1a\x1cgoogle/api/annotations.proto\"\r\n" + + "\vPingRequest\" \n" + + "\fPingResponse\x12\x10\n" + + "\x03pid\x18\x01 \x01(\x05R\x03pid\"2\n" + + "\x11ChainParticipants\x12\x1d\n" + + "\n" + + "node_names\x18\x01 \x03(\tR\tnodeNames\"\xaa\x06\n" + + "\vClusterInfo\x12\x1d\n" + + "\n" + + "node_names\x18\x01 \x03(\tR\tnodeNames\x12@\n" + + "\n" + + "node_infos\x18\x02 \x03(\v2!.rpcpb.ClusterInfo.NodeInfosEntryR\tnodeInfos\x12\x10\n" + + "\x03pid\x18\x03 \x01(\x05R\x03pid\x12\"\n" + + "\rroot_data_dir\x18\x04 \x01(\tR\vrootDataDir\x12\x18\n" + + "\ahealthy\x18\x05 \x01(\bR\ahealthy\x12Y\n" + + "\x13attached_peer_infos\x18\x06 \x03(\v2).rpcpb.ClusterInfo.AttachedPeerInfosEntryR\x11attachedPeerInfos\x122\n" + + "\x15custom_chains_healthy\x18\a \x01(\bR\x13customChainsHealthy\x12I\n" + + "\rcustom_chains\x18\b \x03(\v2$.rpcpb.ClusterInfo.CustomChainsEntryR\fcustomChains\x126\n" + + "\x06chains\x18\t \x03(\v2\x1e.rpcpb.ClusterInfo.ChainsEntryR\x06chains\x1aM\n" + + "\x0eNodeInfosEntry\x12\x10\n" + + "\x03key\x18\x01 \x01(\tR\x03key\x12%\n" + + "\x05value\x18\x02 \x01(\v2\x0f.rpcpb.NodeInfoR\x05value:\x028\x01\x1ac\n" + + "\x16AttachedPeerInfosEntry\x12\x10\n" + + "\x03key\x18\x01 \x01(\tR\x03key\x123\n" + + "\x05value\x18\x02 \x01(\v2\x1d.rpcpb.ListOfAttachedPeerInfoR\x05value:\x028\x01\x1aW\n" + + "\x11CustomChainsEntry\x12\x10\n" + + "\x03key\x18\x01 \x01(\tR\x03key\x12,\n" + + "\x05value\x18\x02 \x01(\v2\x16.rpcpb.CustomChainInfoR\x05value:\x028\x01\x1aK\n" + + "\vChainsEntry\x12\x10\n" + + "\x03key\x18\x01 \x01(\tR\x03key\x12&\n" + + "\x05value\x18\x02 \x01(\v2\x10.rpcpb.ChainInfoR\x05value:\x028\x01\"\x9d\x01\n" + + "\tChainInfo\x12\x1d\n" + + "\n" + + "is_elastic\x18\x01 \x01(\bR\tisElastic\x12(\n" + + "\x10elastic_chain_id\x18\x02 \x01(\tR\x0eelasticChainId\x12G\n" + + "\x12chain_participants\x18\x03 \x01(\v2\x18.rpcpb.ChainParticipantsR\x11chainParticipants\"\x87\x01\n" + + "\x0fCustomChainInfo\x12\x1d\n" + + "\n" + + "chain_name\x18\x01 \x01(\tR\tchainName\x12\x13\n" + + "\x05vm_id\x18\x02 \x01(\tR\x04vmId\x12\x1b\n" + + "\tpchain_id\x18\x03 \x01(\tR\bpchainId\x12#\n" + + "\rblockchain_id\x18\x04 \x01(\tR\fblockchainId\"\x8b\x02\n" + + "\bNodeInfo\x12\x12\n" + + "\x04name\x18\x01 \x01(\tR\x04name\x12\x1b\n" + + "\texec_path\x18\x02 \x01(\tR\bexecPath\x12\x10\n" + + "\x03uri\x18\x03 \x01(\tR\x03uri\x12\x0e\n" + + "\x02id\x18\x04 \x01(\tR\x02id\x12\x17\n" + + "\alog_dir\x18\x05 \x01(\tR\x06logDir\x12\x15\n" + + "\x06db_dir\x18\x06 \x01(\tR\x05dbDir\x12\x1d\n" + + "\n" + + "plugin_dir\x18\a \x01(\tR\tpluginDir\x12-\n" + + "\x12whitelisted_chains\x18\b \x01(\tR\x11whitelistedChains\x12\x16\n" + + "\x06config\x18\t \x01(\fR\x06config\x12\x16\n" + + "\x06paused\x18\n" + + " \x01(\bR\x06paused\"\"\n" + + "\x10AttachedPeerInfo\x12\x0e\n" + + "\x02id\x18\x01 \x01(\tR\x02id\"G\n" + + "\x16ListOfAttachedPeerInfo\x12-\n" + + "\x05peers\x18\x01 \x03(\v2\x17.rpcpb.AttachedPeerInfoR\x05peers\"\xbf\t\n" + + "\fStartRequest\x12!\n" + + "\fnetwork_name\x18\x01 \x01(\tR\vnetworkName\x12\x1b\n" + + "\tnode_type\x18\x02 \x01(\tR\bnodeType\x12\x1b\n" + + "\texec_path\x18\x04 \x01(\tR\bexecPath\x12 \n" + + "\tnum_nodes\x18\x05 \x01(\rH\x00R\bnumNodes\x88\x01\x01\x122\n" + + "\x12whitelisted_chains\x18\x06 \x01(\tH\x01R\x11whitelistedChains\x88\x01\x01\x121\n" + + "\x12global_node_config\x18\a \x01(\tH\x02R\x10globalNodeConfig\x88\x01\x01\x12'\n" + + "\rroot_data_dir\x18\b \x01(\tH\x03R\vrootDataDir\x88\x01\x01\x12\x1d\n" + + "\n" + + "plugin_dir\x18\t \x01(\tR\tpluginDir\x12@\n" + + "\x10blockchain_specs\x18\n" + + " \x03(\v2\x15.rpcpb.BlockchainSpecR\x0fblockchainSpecs\x12Z\n" + + "\x13custom_node_configs\x18\v \x03(\v2*.rpcpb.StartRequest.CustomNodeConfigsEntryR\x11customNodeConfigs\x12J\n" + + "\rchain_configs\x18\f \x03(\v2%.rpcpb.StartRequest.ChainConfigsEntryR\fchainConfigs\x12P\n" + + "\x0fupgrade_configs\x18\r \x03(\v2'.rpcpb.StartRequest.UpgradeConfigsEntryR\x0eupgradeConfigs\x128\n" + + "\x16reassign_ports_if_used\x18\x0e \x01(\bH\x04R\x13reassignPortsIfUsed\x88\x01\x01\x12(\n" + + "\rdynamic_ports\x18\x0f \x01(\bH\x05R\fdynamicPorts\x88\x01\x01\x12W\n" + + "\x12chain_config_files\x18\x10 \x03(\v2).rpcpb.StartRequest.ChainConfigFilesEntryR\x10chainConfigFiles\x1aD\n" + + "\x16CustomNodeConfigsEntry\x12\x10\n" + + "\x03key\x18\x01 \x01(\tR\x03key\x12\x14\n" + + "\x05value\x18\x02 \x01(\tR\x05value:\x028\x01\x1a?\n" + + "\x11ChainConfigsEntry\x12\x10\n" + + "\x03key\x18\x01 \x01(\tR\x03key\x12\x14\n" + + "\x05value\x18\x02 \x01(\tR\x05value:\x028\x01\x1aA\n" + + "\x13UpgradeConfigsEntry\x12\x10\n" + + "\x03key\x18\x01 \x01(\tR\x03key\x12\x14\n" + + "\x05value\x18\x02 \x01(\tR\x05value:\x028\x01\x1aC\n" + + "\x15ChainConfigFilesEntry\x12\x10\n" + + "\x03key\x18\x01 \x01(\tR\x03key\x12\x14\n" + + "\x05value\x18\x02 \x01(\tR\x05value:\x028\x01B\f\n" + + "\n" + + "_num_nodesB\x15\n" + + "\x13_whitelisted_chainsB\x15\n" + + "\x13_global_node_configB\x10\n" + + "\x0e_root_data_dirB\x19\n" + + "\x17_reassign_ports_if_usedB\x10\n" + + "\x0e_dynamic_ports\"\x13\n" + + "\x11RPCVersionRequest\".\n" + + "\x12RPCVersionResponse\x12\x18\n" + + "\aversion\x18\x01 \x01(\rR\aversion\"c\n" + + "\rStartResponse\x125\n" + + "\fcluster_info\x18\x01 \x01(\v2\x12.rpcpb.ClusterInfoR\vclusterInfo\x12\x1b\n" + + "\tchain_ids\x18\x02 \x03(\tR\bchainIds\"[\n" + + "\tChainSpec\x12\"\n" + + "\fparticipants\x18\x01 \x03(\tR\fparticipants\x12*\n" + + "\x11chain_config_file\x18\x02 \x01(\tR\x0fchainConfigFile\"\xa1\x05\n" + + "\x10ElasticChainSpec\x12\x19\n" + + "\bchain_id\x18\x01 \x01(\tR\achainId\x12\x1d\n" + + "\n" + + "asset_name\x18\x02 \x01(\tR\tassetName\x12!\n" + + "\fasset_symbol\x18\x03 \x01(\tR\vassetSymbol\x12%\n" + + "\x0einitial_supply\x18\x04 \x01(\x04R\rinitialSupply\x12\x1d\n" + + "\n" + + "max_supply\x18\x05 \x01(\x04R\tmaxSupply\x120\n" + + "\x14min_consumption_rate\x18\x06 \x01(\x04R\x12minConsumptionRate\x120\n" + + "\x14max_consumption_rate\x18\a \x01(\x04R\x12maxConsumptionRate\x12.\n" + + "\x13min_validator_stake\x18\b \x01(\x04R\x11minValidatorStake\x12.\n" + + "\x13max_validator_stake\x18\t \x01(\x04R\x11maxValidatorStake\x12,\n" + + "\x12min_stake_duration\x18\n" + + " \x01(\x04R\x10minStakeDuration\x12,\n" + + "\x12max_stake_duration\x18\v \x01(\x04R\x10maxStakeDuration\x12,\n" + + "\x12min_delegation_fee\x18\f \x01(\rR\x10minDelegationFee\x12.\n" + + "\x13min_delegator_stake\x18\r \x01(\x04R\x11minDelegatorStake\x12=\n" + + "\x1bmax_validator_weight_factor\x18\x0e \x01(\rR\x18maxValidatorWeightFactor\x12-\n" + + "\x12uptime_requirement\x18\x0f \x01(\rR\x11uptimeRequirement\"f\n" + + "\x1dTransformElasticChainsRequest\x12E\n" + + "\x12elastic_chain_spec\x18\x01 \x03(\v2\x17.rpcpb.ElasticChainSpecR\x10elasticChainSpec\"\x8b\x01\n" + + "\x1eTransformElasticChainsResponse\x125\n" + + "\fcluster_info\x18\x01 \x01(\v2\x12.rpcpb.ClusterInfoR\vclusterInfo\x12\x15\n" + + "\x06tx_ids\x18\x02 \x03(\tR\x05txIds\x12\x1b\n" + + "\tasset_ids\x18\x03 \x03(\tR\bassetIds\"\xe6\x01\n" + + "\x1bPermissionlessValidatorSpec\x12\x19\n" + + "\bchain_id\x18\x01 \x01(\tR\achainId\x12\x1b\n" + + "\tnode_name\x18\x02 \x01(\tR\bnodeName\x12.\n" + + "\x13staked_token_amount\x18\x03 \x01(\x04R\x11stakedTokenAmount\x12\x19\n" + + "\basset_id\x18\x04 \x01(\tR\aassetId\x12\x1d\n" + + "\n" + + "start_time\x18\x05 \x01(\tR\tstartTime\x12%\n" + + "\x0estake_duration\x18\x06 \x01(\x04R\rstakeDuration\"n\n" + + "!AddPermissionlessValidatorRequest\x12I\n" + + "\x0evalidator_spec\x18\x01 \x03(\v2\".rpcpb.PermissionlessValidatorSpecR\rvalidatorSpec\"[\n" + + "\"AddPermissionlessValidatorResponse\x125\n" + + "\fcluster_info\x18\x01 \x01(\v2\x12.rpcpb.ClusterInfoR\vclusterInfo\"T\n" + + "\x18RemoveChainValidatorSpec\x12\x19\n" + + "\bchain_id\x18\x01 \x01(\tR\achainId\x12\x1d\n" + + "\n" + + "node_names\x18\x02 \x03(\tR\tnodeNames\"e\n" + + "\x1bRemoveChainValidatorRequest\x12F\n" + + "\x0evalidator_spec\x18\x01 \x03(\v2\x1f.rpcpb.RemoveChainValidatorSpecR\rvalidatorSpec\"U\n" + + "\x1cRemoveChainValidatorResponse\x125\n" + + "\fcluster_info\x18\x01 \x01(\v2\x12.rpcpb.ClusterInfoR\vclusterInfo\"\xdf\x02\n" + + "\x0eBlockchainSpec\x12\x17\n" + + "\avm_name\x18\x01 \x01(\tR\x06vmName\x12\x18\n" + + "\agenesis\x18\x02 \x01(\tR\agenesis\x12\x1e\n" + + "\bchain_id\x18\x03 \x01(\tH\x00R\achainId\x88\x01\x01\x124\n" + + "\n" + + "chain_spec\x18\x04 \x01(\v2\x10.rpcpb.ChainSpecH\x01R\tchainSpec\x88\x01\x01\x12!\n" + + "\fchain_config\x18\x05 \x01(\tR\vchainConfig\x12'\n" + + "\x0fnetwork_upgrade\x18\x06 \x01(\tR\x0enetworkUpgrade\x12)\n" + + "\x10blockchain_alias\x18\a \x01(\tR\x0fblockchainAlias\x121\n" + + "\x15per_node_chain_config\x18\b \x01(\tR\x12perNodeChainConfigB\v\n" + + "\t_chain_idB\r\n" + + "\v_chain_spec\"\\\n" + + "\x18CreateBlockchainsRequest\x12@\n" + + "\x10blockchain_specs\x18\x01 \x03(\v2\x15.rpcpb.BlockchainSpecR\x0fblockchainSpecs\"o\n" + + "\x19CreateBlockchainsResponse\x125\n" + + "\fcluster_info\x18\x01 \x01(\v2\x12.rpcpb.ClusterInfoR\vclusterInfo\x12\x1b\n" + + "\tchain_ids\x18\x02 \x03(\tR\bchainIds\"H\n" + + "\x13CreateChainsRequest\x121\n" + + "\vchain_specs\x18\x01 \x03(\v2\x10.rpcpb.ChainSpecR\n" + + "chainSpecs\"j\n" + + "\x14CreateChainsResponse\x125\n" + + "\fcluster_info\x18\x01 \x01(\v2\x12.rpcpb.ClusterInfoR\vclusterInfo\x12\x1b\n" + + "\tchain_ids\x18\x02 \x03(\tR\bchainIds\"H\n" + + "\rHealthRequest\x12&\n" + + "\fnetwork_name\x18\x01 \x01(\tH\x00R\vnetworkName\x88\x01\x01B\x0f\n" + + "\r_network_name\"\x9c\x01\n" + + "\x0eHealthResponse\x125\n" + + "\fcluster_info\x18\x01 \x01(\v2\x12.rpcpb.ClusterInfoR\vclusterInfo\x12@\n" + + "\x0enetwork_health\x18\x02 \x01(\v2\x14.rpcpb.NetworkHealthH\x00R\rnetworkHealth\x88\x01\x01B\x11\n" + + "\x0f_network_health\"\xb9\x01\n" + + "\rNetworkHealth\x12!\n" + + "\fnetwork_name\x18\x01 \x01(\tR\vnetworkName\x12\x1d\n" + + "\n" + + "network_id\x18\x02 \x01(\rR\tnetworkId\x12\x18\n" + + "\ahealthy\x18\x03 \x01(\bR\ahealthy\x12#\n" + + "\rhealthy_nodes\x18\x04 \x03(\tR\fhealthyNodes\x12'\n" + + "\x0funhealthy_nodes\x18\x05 \x03(\tR\x0eunhealthyNodes\"\r\n" + + "\vURIsRequest\"\"\n" + + "\fURIsResponse\x12\x12\n" + + "\x04uris\x18\x01 \x03(\tR\x04uris\"P\n" + + "\x15WaitForHealthyRequest\x12&\n" + + "\fnetwork_name\x18\x01 \x01(\tH\x00R\vnetworkName\x88\x01\x01B\x0f\n" + + "\r_network_name\"O\n" + + "\x16WaitForHealthyResponse\x125\n" + + "\fcluster_info\x18\x01 \x01(\v2\x12.rpcpb.ClusterInfoR\vclusterInfo\"H\n" + + "\rStatusRequest\x12&\n" + + "\fnetwork_name\x18\x01 \x01(\tH\x00R\vnetworkName\x88\x01\x01B\x0f\n" + + "\r_network_name\"\x9c\x01\n" + + "\x0eStatusResponse\x125\n" + + "\fcluster_info\x18\x01 \x01(\v2\x12.rpcpb.ClusterInfoR\vclusterInfo\x12@\n" + + "\x0enetwork_status\x18\x02 \x01(\v2\x14.rpcpb.NetworkStatusH\x00R\rnetworkStatus\x88\x01\x01B\x11\n" + + "\x0f_network_status\"\xd7\x01\n" + + "\rNetworkStatus\x12!\n" + + "\fnetwork_name\x18\x01 \x01(\tR\vnetworkName\x12\x1d\n" + + "\n" + + "network_id\x18\x02 \x01(\rR\tnetworkId\x12\x16\n" + + "\x06status\x18\x03 \x01(\tR\x06status\x12\x1b\n" + + "\tnum_nodes\x18\x04 \x01(\rR\bnumNodes\x12%\n" + + "\x05nodes\x18\x05 \x03(\v2\x0f.rpcpb.NodeInfoR\x05nodes\x12(\n" + + "\x06chains\x18\x06 \x03(\v2\x10.rpcpb.ChainInfoR\x06chains\":\n" + + "\x13StreamStatusRequest\x12#\n" + + "\rpush_interval\x18\x01 \x01(\x03R\fpushInterval\"M\n" + + "\x14StreamStatusResponse\x125\n" + + "\fcluster_info\x18\x01 \x01(\v2\x12.rpcpb.ClusterInfoR\vclusterInfo\"\x94\x05\n" + + "\x12RestartNodeRequest\x12\x12\n" + + "\x04name\x18\x01 \x01(\tR\x04name\x12 \n" + + "\texec_path\x18\x02 \x01(\tH\x00R\bexecPath\x88\x01\x01\x122\n" + + "\x12whitelisted_chains\x18\x03 \x01(\tH\x01R\x11whitelistedChains\x88\x01\x01\x12P\n" + + "\rchain_configs\x18\x04 \x03(\v2+.rpcpb.RestartNodeRequest.ChainConfigsEntryR\fchainConfigs\x12V\n" + + "\x0fupgrade_configs\x18\x05 \x03(\v2-.rpcpb.RestartNodeRequest.UpgradeConfigsEntryR\x0eupgradeConfigs\x12]\n" + + "\x12chain_config_files\x18\x06 \x03(\v2/.rpcpb.RestartNodeRequest.ChainConfigFilesEntryR\x10chainConfigFiles\x12\x1d\n" + + "\n" + + "plugin_dir\x18\a \x01(\tR\tpluginDir\x1a?\n" + + "\x11ChainConfigsEntry\x12\x10\n" + + "\x03key\x18\x01 \x01(\tR\x03key\x12\x14\n" + + "\x05value\x18\x02 \x01(\tR\x05value:\x028\x01\x1aA\n" + + "\x13UpgradeConfigsEntry\x12\x10\n" + + "\x03key\x18\x01 \x01(\tR\x03key\x12\x14\n" + + "\x05value\x18\x02 \x01(\tR\x05value:\x028\x01\x1aC\n" + + "\x15ChainConfigFilesEntry\x12\x10\n" + + "\x03key\x18\x01 \x01(\tR\x03key\x12\x14\n" + + "\x05value\x18\x02 \x01(\tR\x05value:\x028\x01B\f\n" + + "\n" + + "_exec_pathB\x15\n" + + "\x13_whitelisted_chains\"L\n" + + "\x13RestartNodeResponse\x125\n" + + "\fcluster_info\x18\x01 \x01(\v2\x12.rpcpb.ClusterInfoR\vclusterInfo\"'\n" + + "\x11RemoveNodeRequest\x12\x12\n" + + "\x04name\x18\x01 \x01(\tR\x04name\"K\n" + + "\x12RemoveNodeResponse\x125\n" + + "\fcluster_info\x18\x01 \x01(\v2\x12.rpcpb.ClusterInfoR\vclusterInfo\"&\n" + + "\x10PauseNodeRequest\x12\x12\n" + + "\x04name\x18\x01 \x01(\tR\x04name\"J\n" + + "\x11PauseNodeResponse\x125\n" + + "\fcluster_info\x18\x01 \x01(\v2\x12.rpcpb.ClusterInfoR\vclusterInfo\"'\n" + + "\x11ResumeNodeRequest\x12\x12\n" + + "\x04name\x18\x01 \x01(\tR\x04name\"K\n" + + "\x12ResumeNodeResponse\x125\n" + + "\fcluster_info\x18\x01 \x01(\v2\x12.rpcpb.ClusterInfoR\vclusterInfo\"\xdc\x04\n" + + "\x0eAddNodeRequest\x12\x12\n" + + "\x04name\x18\x01 \x01(\tR\x04name\x12\x1b\n" + + "\texec_path\x18\x02 \x01(\tR\bexecPath\x12$\n" + + "\vnode_config\x18\x03 \x01(\tH\x00R\n" + + "nodeConfig\x88\x01\x01\x12L\n" + + "\rchain_configs\x18\x04 \x03(\v2'.rpcpb.AddNodeRequest.ChainConfigsEntryR\fchainConfigs\x12R\n" + + "\x0fupgrade_configs\x18\x05 \x03(\v2).rpcpb.AddNodeRequest.UpgradeConfigsEntryR\x0eupgradeConfigs\x12Y\n" + + "\x12chain_config_files\x18\x06 \x03(\v2+.rpcpb.AddNodeRequest.ChainConfigFilesEntryR\x10chainConfigFiles\x12\x1d\n" + + "\n" + + "plugin_dir\x18\a \x01(\tR\tpluginDir\x1a?\n" + + "\x11ChainConfigsEntry\x12\x10\n" + + "\x03key\x18\x01 \x01(\tR\x03key\x12\x14\n" + + "\x05value\x18\x02 \x01(\tR\x05value:\x028\x01\x1aA\n" + + "\x13UpgradeConfigsEntry\x12\x10\n" + + "\x03key\x18\x01 \x01(\tR\x03key\x12\x14\n" + + "\x05value\x18\x02 \x01(\tR\x05value:\x028\x01\x1aC\n" + + "\x15ChainConfigFilesEntry\x12\x10\n" + + "\x03key\x18\x01 \x01(\tR\x03key\x12\x14\n" + + "\x05value\x18\x02 \x01(\tR\x05value:\x028\x01B\x0e\n" + + "\f_node_config\"H\n" + + "\x0fAddNodeResponse\x125\n" + + "\fcluster_info\x18\x01 \x01(\v2\x12.rpcpb.ClusterInfoR\vclusterInfo\"\r\n" + + "\vStopRequest\"E\n" + + "\fStopResponse\x125\n" + + "\fcluster_info\x18\x01 \x01(\v2\x12.rpcpb.ClusterInfoR\vclusterInfo\"0\n" + + "\x11AttachPeerRequest\x12\x1b\n" + + "\tnode_name\x18\x01 \x01(\tR\bnodeName\"\x92\x01\n" + + "\x12AttachPeerResponse\x125\n" + + "\fcluster_info\x18\x01 \x01(\v2\x12.rpcpb.ClusterInfoR\vclusterInfo\x12E\n" + + "\x12attached_peer_info\x18\x02 \x01(\v2\x17.rpcpb.AttachedPeerInfoR\x10attachedPeerInfo\"x\n" + + "\x1aSendOutboundMessageRequest\x12\x1b\n" + + "\tnode_name\x18\x01 \x01(\tR\bnodeName\x12\x17\n" + + "\apeer_id\x18\x02 \x01(\tR\x06peerId\x12\x0e\n" + + "\x02op\x18\x03 \x01(\rR\x02op\x12\x14\n" + + "\x05bytes\x18\x04 \x01(\fR\x05bytes\"1\n" + + "\x1bSendOutboundMessageResponse\x12\x12\n" + + "\x04sent\x18\x01 \x01(\bR\x04sent\"]\n" + + "\x13SaveSnapshotRequest\x12!\n" + + "\fnetwork_name\x18\x01 \x01(\tR\vnetworkName\x12#\n" + + "\rsnapshot_name\x18\x02 \x01(\tR\fsnapshotName\";\n" + + "\x14SaveSnapshotResponse\x12#\n" + + "\rsnapshot_path\x18\x01 \x01(\tR\fsnapshotPath\"\xdb\x06\n" + + "\x13LoadSnapshotRequest\x12!\n" + + "\fnetwork_name\x18\x01 \x01(\tR\vnetworkName\x12#\n" + + "\rsnapshot_name\x18\x02 \x01(\tR\fsnapshotName\x12 \n" + + "\texec_path\x18\x03 \x01(\tH\x00R\bexecPath\x88\x01\x01\x12\x1d\n" + + "\n" + + "plugin_dir\x18\x04 \x01(\tR\tpluginDir\x12'\n" + + "\rroot_data_dir\x18\x05 \x01(\tH\x01R\vrootDataDir\x88\x01\x01\x12Q\n" + + "\rchain_configs\x18\x06 \x03(\v2,.rpcpb.LoadSnapshotRequest.ChainConfigsEntryR\fchainConfigs\x12W\n" + + "\x0fupgrade_configs\x18\a \x03(\v2..rpcpb.LoadSnapshotRequest.UpgradeConfigsEntryR\x0eupgradeConfigs\x121\n" + + "\x12global_node_config\x18\b \x01(\tH\x02R\x10globalNodeConfig\x88\x01\x01\x128\n" + + "\x16reassign_ports_if_used\x18\t \x01(\bH\x03R\x13reassignPortsIfUsed\x88\x01\x01\x12^\n" + + "\x12chain_config_files\x18\n" + + " \x03(\v20.rpcpb.LoadSnapshotRequest.ChainConfigFilesEntryR\x10chainConfigFiles\x1a?\n" + + "\x11ChainConfigsEntry\x12\x10\n" + + "\x03key\x18\x01 \x01(\tR\x03key\x12\x14\n" + + "\x05value\x18\x02 \x01(\tR\x05value:\x028\x01\x1aA\n" + + "\x13UpgradeConfigsEntry\x12\x10\n" + + "\x03key\x18\x01 \x01(\tR\x03key\x12\x14\n" + + "\x05value\x18\x02 \x01(\tR\x05value:\x028\x01\x1aC\n" + + "\x15ChainConfigFilesEntry\x12\x10\n" + + "\x03key\x18\x01 \x01(\tR\x03key\x12\x14\n" + + "\x05value\x18\x02 \x01(\tR\x05value:\x028\x01B\f\n" + + "\n" + + "_exec_pathB\x10\n" + + "\x0e_root_data_dirB\x15\n" + + "\x13_global_node_configB\x19\n" + + "\x17_reassign_ports_if_used\"M\n" + + "\x14LoadSnapshotResponse\x125\n" + + "\fcluster_info\x18\x01 \x01(\v2\x12.rpcpb.ClusterInfoR\vclusterInfo\"_\n" + + "\x15RemoveSnapshotRequest\x12!\n" + + "\fnetwork_name\x18\x01 \x01(\tR\vnetworkName\x12#\n" + + "\rsnapshot_name\x18\x02 \x01(\tR\fsnapshotName\"\x18\n" + + "\x16RemoveSnapshotResponse\"<\n" + + "\x17GetSnapshotNamesRequest\x12!\n" + + "\fnetwork_name\x18\x01 \x01(\tR\vnetworkName\"A\n" + + "\x18GetSnapshotNamesResponse\x12%\n" + + "\x0esnapshot_names\x18\x01 \x03(\tR\rsnapshotNames2S\n" + + "\vPingService\x12D\n" + + "\x04Ping\x12\x12.rpcpb.PingRequest\x1a\x13.rpcpb.PingResponse\"\x13\x82\xd3\xe4\x93\x02\r:\x01*\"\b/v1/ping2\xdb\x15\n" + + "\x0eControlService\x12d\n" + + "\n" + + "RPCVersion\x12\x18.rpcpb.RPCVersionRequest\x1a\x19.rpcpb.RPCVersionResponse\"!\x82\xd3\xe4\x93\x02\x1b:\x01*\"\x16/v1/control/rpcversion\x12P\n" + + "\x05Start\x12\x13.rpcpb.StartRequest\x1a\x14.rpcpb.StartResponse\"\x1c\x82\xd3\xe4\x93\x02\x16:\x01*\"\x11/v1/control/start\x12\x80\x01\n" + + "\x11CreateBlockchains\x12\x1f.rpcpb.CreateBlockchainsRequest\x1a .rpcpb.CreateBlockchainsResponse\"(\x82\xd3\xe4\x93\x02\":\x01*\"\x1d/v1/control/createblockchains\x12\x94\x01\n" + + "\x16TransformElasticChains\x12$.rpcpb.TransformElasticChainsRequest\x1a%.rpcpb.TransformElasticChainsResponse\"-\x82\xd3\xe4\x93\x02':\x01*\"\"/v1/control/transformelasticchains\x12\xa4\x01\n" + + "\x1aAddPermissionlessValidator\x12(.rpcpb.AddPermissionlessValidatorRequest\x1a).rpcpb.AddPermissionlessValidatorResponse\"1\x82\xd3\xe4\x93\x02+:\x01*\"&/v1/control/addpermissionlessvalidator\x12\x8c\x01\n" + + "\x14RemoveChainValidator\x12\".rpcpb.RemoveChainValidatorRequest\x1a#.rpcpb.RemoveChainValidatorResponse\"+\x82\xd3\xe4\x93\x02%:\x01*\" /v1/control/removechainvalidator\x12l\n" + + "\fCreateChains\x12\x1a.rpcpb.CreateChainsRequest\x1a\x1b.rpcpb.CreateChainsResponse\"#\x82\xd3\xe4\x93\x02\x1d:\x01*\"\x18/v1/control/createchains\x12T\n" + + "\x06Health\x12\x14.rpcpb.HealthRequest\x1a\x15.rpcpb.HealthResponse\"\x1d\x82\xd3\xe4\x93\x02\x17:\x01*\"\x12/v1/control/health\x12L\n" + + "\x04URIs\x12\x12.rpcpb.URIsRequest\x1a\x13.rpcpb.URIsResponse\"\x1b\x82\xd3\xe4\x93\x02\x15:\x01*\"\x10/v1/control/uris\x12t\n" + + "\x0eWaitForHealthy\x12\x1c.rpcpb.WaitForHealthyRequest\x1a\x1d.rpcpb.WaitForHealthyResponse\"%\x82\xd3\xe4\x93\x02\x1f:\x01*\"\x1a/v1/control/waitforhealthy\x12T\n" + + "\x06Status\x12\x14.rpcpb.StatusRequest\x1a\x15.rpcpb.StatusResponse\"\x1d\x82\xd3\xe4\x93\x02\x17:\x01*\"\x12/v1/control/status\x12n\n" + + "\fStreamStatus\x12\x1a.rpcpb.StreamStatusRequest\x1a\x1b.rpcpb.StreamStatusResponse\"#\x82\xd3\xe4\x93\x02\x1d:\x01*\"\x18/v1/control/streamstatus0\x01\x12d\n" + + "\n" + + "RemoveNode\x12\x18.rpcpb.RemoveNodeRequest\x1a\x19.rpcpb.RemoveNodeResponse\"!\x82\xd3\xe4\x93\x02\x1b:\x01*\"\x16/v1/control/removenode\x12X\n" + + "\aAddNode\x12\x15.rpcpb.AddNodeRequest\x1a\x16.rpcpb.AddNodeResponse\"\x1e\x82\xd3\xe4\x93\x02\x18:\x01*\"\x13/v1/control/addnode\x12h\n" + + "\vRestartNode\x12\x19.rpcpb.RestartNodeRequest\x1a\x1a.rpcpb.RestartNodeResponse\"\"\x82\xd3\xe4\x93\x02\x1c:\x01*\"\x17/v1/control/restartnode\x12`\n" + + "\tPauseNode\x12\x17.rpcpb.PauseNodeRequest\x1a\x18.rpcpb.PauseNodeResponse\" \x82\xd3\xe4\x93\x02\x1a:\x01*\"\x15/v1/control/pausenode\x12d\n" + + "\n" + + "ResumeNode\x12\x18.rpcpb.ResumeNodeRequest\x1a\x19.rpcpb.ResumeNodeResponse\"!\x82\xd3\xe4\x93\x02\x1b:\x01*\"\x16/v1/control/resumenode\x12L\n" + + "\x04Stop\x12\x12.rpcpb.StopRequest\x1a\x13.rpcpb.StopResponse\"\x1b\x82\xd3\xe4\x93\x02\x15:\x01*\"\x10/v1/control/stop\x12d\n" + + "\n" + + "AttachPeer\x12\x18.rpcpb.AttachPeerRequest\x1a\x19.rpcpb.AttachPeerResponse\"!\x82\xd3\xe4\x93\x02\x1b:\x01*\"\x16/v1/control/attachpeer\x12\x88\x01\n" + + "\x13SendOutboundMessage\x12!.rpcpb.SendOutboundMessageRequest\x1a\".rpcpb.SendOutboundMessageResponse\"*\x82\xd3\xe4\x93\x02$:\x01*\"\x1f/v1/control/sendoutboundmessage\x12l\n" + + "\fSaveSnapshot\x12\x1a.rpcpb.SaveSnapshotRequest\x1a\x1b.rpcpb.SaveSnapshotResponse\"#\x82\xd3\xe4\x93\x02\x1d:\x01*\"\x18/v1/control/savesnapshot\x12r\n" + + "\x0fSaveHotSnapshot\x12\x1a.rpcpb.SaveSnapshotRequest\x1a\x1b.rpcpb.SaveSnapshotResponse\"&\x82\xd3\xe4\x93\x02 :\x01*\"\x1b/v1/control/savehotsnapshot\x12l\n" + + "\fLoadSnapshot\x12\x1a.rpcpb.LoadSnapshotRequest\x1a\x1b.rpcpb.LoadSnapshotResponse\"#\x82\xd3\xe4\x93\x02\x1d:\x01*\"\x18/v1/control/loadsnapshot\x12t\n" + + "\x0eRemoveSnapshot\x12\x1c.rpcpb.RemoveSnapshotRequest\x1a\x1d.rpcpb.RemoveSnapshotResponse\"%\x82\xd3\xe4\x93\x02\x1f:\x01*\"\x1a/v1/control/removesnapshot\x12|\n" + + "\x10GetSnapshotNames\x12\x1e.rpcpb.GetSnapshotNamesRequest\x1a\x1f.rpcpb.GetSnapshotNamesResponse\"'\x82\xd3\xe4\x93\x02!:\x01*\"\x1c/v1/control/getsnapshotnamesB\"Z github.com/luxfi/netrunner;rpcpbb\x06proto3" var ( file_rpcpb_rpc_proto_rawDescOnce sync.Once - file_rpcpb_rpc_proto_rawDescData = file_rpcpb_rpc_proto_rawDesc + file_rpcpb_rpc_proto_rawDescData []byte ) func file_rpcpb_rpc_proto_rawDescGZIP() []byte { file_rpcpb_rpc_proto_rawDescOnce.Do(func() { - file_rpcpb_rpc_proto_rawDescData = protoimpl.X.CompressGZIP(file_rpcpb_rpc_proto_rawDescData) + file_rpcpb_rpc_proto_rawDescData = protoimpl.X.CompressGZIP(unsafe.Slice(unsafe.StringData(file_rpcpb_rpc_proto_rawDesc), len(file_rpcpb_rpc_proto_rawDesc))) }) return file_rpcpb_rpc_proto_rawDescData } @@ -4874,7 +4349,7 @@ func file_rpcpb_rpc_proto_init() { out := protoimpl.TypeBuilder{ File: protoimpl.DescBuilder{ GoPackagePath: reflect.TypeOf(x{}).PkgPath(), - RawDescriptor: file_rpcpb_rpc_proto_rawDesc, + RawDescriptor: unsafe.Slice(unsafe.StringData(file_rpcpb_rpc_proto_rawDesc), len(file_rpcpb_rpc_proto_rawDesc)), NumEnums: 0, NumMessages: 81, NumExtensions: 0, @@ -4885,7 +4360,6 @@ func file_rpcpb_rpc_proto_init() { MessageInfos: file_rpcpb_rpc_proto_msgTypes, }.Build() File_rpcpb_rpc_proto = out.File - file_rpcpb_rpc_proto_rawDesc = nil file_rpcpb_rpc_proto_goTypes = nil file_rpcpb_rpc_proto_depIdxs = nil } diff --git a/rpcpb/rpc_grpc.pb.go b/rpcpb/rpc_grpc.pb.go index f9ad55ef..9355c478 100644 --- a/rpcpb/rpc_grpc.pb.go +++ b/rpcpb/rpc_grpc.pb.go @@ -1,6 +1,6 @@ // Code generated by protoc-gen-go-grpc. DO NOT EDIT. // versions: -// - protoc-gen-go-grpc v1.3.0 +// - protoc-gen-go-grpc v1.6.2 // - protoc (unknown) // source: rpcpb/rpc.proto @@ -15,8 +15,8 @@ import ( // 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 +// Requires gRPC-Go v1.64.0 or later. +const _ = grpc.SupportPackageIsVersion9 const ( PingService_Ping_FullMethodName = "/rpcpb.PingService/Ping" @@ -38,8 +38,9 @@ func NewPingServiceClient(cc grpc.ClientConnInterface) PingServiceClient { } func (c *pingServiceClient) Ping(ctx context.Context, in *PingRequest, opts ...grpc.CallOption) (*PingResponse, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) out := new(PingResponse) - err := c.cc.Invoke(ctx, PingService_Ping_FullMethodName, in, out, opts...) + err := c.cc.Invoke(ctx, PingService_Ping_FullMethodName, in, out, cOpts...) if err != nil { return nil, err } @@ -48,20 +49,24 @@ func (c *pingServiceClient) Ping(ctx context.Context, in *PingRequest, opts ...g // PingServiceServer is the server API for PingService service. // All implementations must embed UnimplementedPingServiceServer -// for forward compatibility +// for forward compatibility. type PingServiceServer interface { Ping(context.Context, *PingRequest) (*PingResponse, error) mustEmbedUnimplementedPingServiceServer() } -// UnimplementedPingServiceServer must be embedded to have forward compatible implementations. -type UnimplementedPingServiceServer struct { -} +// UnimplementedPingServiceServer must be embedded to have +// forward compatible implementations. +// +// NOTE: this should be embedded by value instead of pointer to avoid a nil +// pointer dereference when methods are called. +type UnimplementedPingServiceServer struct{} func (UnimplementedPingServiceServer) Ping(context.Context, *PingRequest) (*PingResponse, error) { - return nil, status.Errorf(codes.Unimplemented, "method Ping not implemented") + return nil, status.Error(codes.Unimplemented, "method Ping not implemented") } func (UnimplementedPingServiceServer) mustEmbedUnimplementedPingServiceServer() {} +func (UnimplementedPingServiceServer) testEmbeddedByValue() {} // UnsafePingServiceServer may be embedded to opt out of forward compatibility for this service. // Use of this interface is not recommended, as added methods to PingServiceServer will @@ -71,6 +76,13 @@ type UnsafePingServiceServer interface { } func RegisterPingServiceServer(s grpc.ServiceRegistrar, srv PingServiceServer) { + // If the following call panics, it indicates UnimplementedPingServiceServer was + // embedded by pointer and is nil. This will cause panics if an + // unimplemented method is ever invoked, so we test this at initialization + // time to prevent it from happening at runtime later due to I/O. + if t, ok := srv.(interface{ testEmbeddedByValue() }); ok { + t.testEmbeddedByValue() + } s.RegisterService(&PingService_ServiceDesc, srv) } @@ -151,7 +163,7 @@ type ControlServiceClient interface { URIs(ctx context.Context, in *URIsRequest, opts ...grpc.CallOption) (*URIsResponse, error) WaitForHealthy(ctx context.Context, in *WaitForHealthyRequest, opts ...grpc.CallOption) (*WaitForHealthyResponse, error) Status(ctx context.Context, in *StatusRequest, opts ...grpc.CallOption) (*StatusResponse, error) - StreamStatus(ctx context.Context, in *StreamStatusRequest, opts ...grpc.CallOption) (ControlService_StreamStatusClient, error) + StreamStatus(ctx context.Context, in *StreamStatusRequest, opts ...grpc.CallOption) (grpc.ServerStreamingClient[StreamStatusResponse], error) RemoveNode(ctx context.Context, in *RemoveNodeRequest, opts ...grpc.CallOption) (*RemoveNodeResponse, error) AddNode(ctx context.Context, in *AddNodeRequest, opts ...grpc.CallOption) (*AddNodeResponse, error) RestartNode(ctx context.Context, in *RestartNodeRequest, opts ...grpc.CallOption) (*RestartNodeResponse, error) @@ -178,8 +190,9 @@ func NewControlServiceClient(cc grpc.ClientConnInterface) ControlServiceClient { } func (c *controlServiceClient) RPCVersion(ctx context.Context, in *RPCVersionRequest, opts ...grpc.CallOption) (*RPCVersionResponse, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) out := new(RPCVersionResponse) - err := c.cc.Invoke(ctx, ControlService_RPCVersion_FullMethodName, in, out, opts...) + err := c.cc.Invoke(ctx, ControlService_RPCVersion_FullMethodName, in, out, cOpts...) if err != nil { return nil, err } @@ -187,8 +200,9 @@ func (c *controlServiceClient) RPCVersion(ctx context.Context, in *RPCVersionReq } func (c *controlServiceClient) Start(ctx context.Context, in *StartRequest, opts ...grpc.CallOption) (*StartResponse, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) out := new(StartResponse) - err := c.cc.Invoke(ctx, ControlService_Start_FullMethodName, in, out, opts...) + err := c.cc.Invoke(ctx, ControlService_Start_FullMethodName, in, out, cOpts...) if err != nil { return nil, err } @@ -196,8 +210,9 @@ func (c *controlServiceClient) Start(ctx context.Context, in *StartRequest, opts } func (c *controlServiceClient) CreateBlockchains(ctx context.Context, in *CreateBlockchainsRequest, opts ...grpc.CallOption) (*CreateBlockchainsResponse, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) out := new(CreateBlockchainsResponse) - err := c.cc.Invoke(ctx, ControlService_CreateBlockchains_FullMethodName, in, out, opts...) + err := c.cc.Invoke(ctx, ControlService_CreateBlockchains_FullMethodName, in, out, cOpts...) if err != nil { return nil, err } @@ -205,8 +220,9 @@ func (c *controlServiceClient) CreateBlockchains(ctx context.Context, in *Create } func (c *controlServiceClient) TransformElasticChains(ctx context.Context, in *TransformElasticChainsRequest, opts ...grpc.CallOption) (*TransformElasticChainsResponse, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) out := new(TransformElasticChainsResponse) - err := c.cc.Invoke(ctx, ControlService_TransformElasticChains_FullMethodName, in, out, opts...) + err := c.cc.Invoke(ctx, ControlService_TransformElasticChains_FullMethodName, in, out, cOpts...) if err != nil { return nil, err } @@ -214,8 +230,9 @@ func (c *controlServiceClient) TransformElasticChains(ctx context.Context, in *T } func (c *controlServiceClient) AddPermissionlessValidator(ctx context.Context, in *AddPermissionlessValidatorRequest, opts ...grpc.CallOption) (*AddPermissionlessValidatorResponse, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) out := new(AddPermissionlessValidatorResponse) - err := c.cc.Invoke(ctx, ControlService_AddPermissionlessValidator_FullMethodName, in, out, opts...) + err := c.cc.Invoke(ctx, ControlService_AddPermissionlessValidator_FullMethodName, in, out, cOpts...) if err != nil { return nil, err } @@ -223,8 +240,9 @@ func (c *controlServiceClient) AddPermissionlessValidator(ctx context.Context, i } func (c *controlServiceClient) RemoveChainValidator(ctx context.Context, in *RemoveChainValidatorRequest, opts ...grpc.CallOption) (*RemoveChainValidatorResponse, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) out := new(RemoveChainValidatorResponse) - err := c.cc.Invoke(ctx, ControlService_RemoveChainValidator_FullMethodName, in, out, opts...) + err := c.cc.Invoke(ctx, ControlService_RemoveChainValidator_FullMethodName, in, out, cOpts...) if err != nil { return nil, err } @@ -232,8 +250,9 @@ func (c *controlServiceClient) RemoveChainValidator(ctx context.Context, in *Rem } func (c *controlServiceClient) CreateChains(ctx context.Context, in *CreateChainsRequest, opts ...grpc.CallOption) (*CreateChainsResponse, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) out := new(CreateChainsResponse) - err := c.cc.Invoke(ctx, ControlService_CreateChains_FullMethodName, in, out, opts...) + err := c.cc.Invoke(ctx, ControlService_CreateChains_FullMethodName, in, out, cOpts...) if err != nil { return nil, err } @@ -241,8 +260,9 @@ func (c *controlServiceClient) CreateChains(ctx context.Context, in *CreateChain } func (c *controlServiceClient) Health(ctx context.Context, in *HealthRequest, opts ...grpc.CallOption) (*HealthResponse, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) out := new(HealthResponse) - err := c.cc.Invoke(ctx, ControlService_Health_FullMethodName, in, out, opts...) + err := c.cc.Invoke(ctx, ControlService_Health_FullMethodName, in, out, cOpts...) if err != nil { return nil, err } @@ -250,8 +270,9 @@ func (c *controlServiceClient) Health(ctx context.Context, in *HealthRequest, op } func (c *controlServiceClient) URIs(ctx context.Context, in *URIsRequest, opts ...grpc.CallOption) (*URIsResponse, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) out := new(URIsResponse) - err := c.cc.Invoke(ctx, ControlService_URIs_FullMethodName, in, out, opts...) + err := c.cc.Invoke(ctx, ControlService_URIs_FullMethodName, in, out, cOpts...) if err != nil { return nil, err } @@ -259,8 +280,9 @@ func (c *controlServiceClient) URIs(ctx context.Context, in *URIsRequest, opts . } func (c *controlServiceClient) WaitForHealthy(ctx context.Context, in *WaitForHealthyRequest, opts ...grpc.CallOption) (*WaitForHealthyResponse, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) out := new(WaitForHealthyResponse) - err := c.cc.Invoke(ctx, ControlService_WaitForHealthy_FullMethodName, in, out, opts...) + err := c.cc.Invoke(ctx, ControlService_WaitForHealthy_FullMethodName, in, out, cOpts...) if err != nil { return nil, err } @@ -268,20 +290,22 @@ func (c *controlServiceClient) WaitForHealthy(ctx context.Context, in *WaitForHe } func (c *controlServiceClient) Status(ctx context.Context, in *StatusRequest, opts ...grpc.CallOption) (*StatusResponse, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) out := new(StatusResponse) - err := c.cc.Invoke(ctx, ControlService_Status_FullMethodName, in, out, opts...) + err := c.cc.Invoke(ctx, ControlService_Status_FullMethodName, in, out, cOpts...) if err != nil { return nil, err } return out, nil } -func (c *controlServiceClient) StreamStatus(ctx context.Context, in *StreamStatusRequest, opts ...grpc.CallOption) (ControlService_StreamStatusClient, error) { - stream, err := c.cc.NewStream(ctx, &ControlService_ServiceDesc.Streams[0], ControlService_StreamStatus_FullMethodName, opts...) +func (c *controlServiceClient) StreamStatus(ctx context.Context, in *StreamStatusRequest, opts ...grpc.CallOption) (grpc.ServerStreamingClient[StreamStatusResponse], error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) + stream, err := c.cc.NewStream(ctx, &ControlService_ServiceDesc.Streams[0], ControlService_StreamStatus_FullMethodName, cOpts...) if err != nil { return nil, err } - x := &controlServiceStreamStatusClient{stream} + x := &grpc.GenericClientStream[StreamStatusRequest, StreamStatusResponse]{ClientStream: stream} if err := x.ClientStream.SendMsg(in); err != nil { return nil, err } @@ -291,26 +315,13 @@ func (c *controlServiceClient) StreamStatus(ctx context.Context, in *StreamStatu return x, nil } -type ControlService_StreamStatusClient interface { - Recv() (*StreamStatusResponse, error) - grpc.ClientStream -} - -type controlServiceStreamStatusClient struct { - grpc.ClientStream -} - -func (x *controlServiceStreamStatusClient) Recv() (*StreamStatusResponse, error) { - m := new(StreamStatusResponse) - if err := x.ClientStream.RecvMsg(m); err != nil { - return nil, err - } - return m, nil -} +// This type alias is provided for backwards compatibility with existing code that references the prior non-generic stream type by name. +type ControlService_StreamStatusClient = grpc.ServerStreamingClient[StreamStatusResponse] func (c *controlServiceClient) RemoveNode(ctx context.Context, in *RemoveNodeRequest, opts ...grpc.CallOption) (*RemoveNodeResponse, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) out := new(RemoveNodeResponse) - err := c.cc.Invoke(ctx, ControlService_RemoveNode_FullMethodName, in, out, opts...) + err := c.cc.Invoke(ctx, ControlService_RemoveNode_FullMethodName, in, out, cOpts...) if err != nil { return nil, err } @@ -318,8 +329,9 @@ func (c *controlServiceClient) RemoveNode(ctx context.Context, in *RemoveNodeReq } func (c *controlServiceClient) AddNode(ctx context.Context, in *AddNodeRequest, opts ...grpc.CallOption) (*AddNodeResponse, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) out := new(AddNodeResponse) - err := c.cc.Invoke(ctx, ControlService_AddNode_FullMethodName, in, out, opts...) + err := c.cc.Invoke(ctx, ControlService_AddNode_FullMethodName, in, out, cOpts...) if err != nil { return nil, err } @@ -327,8 +339,9 @@ func (c *controlServiceClient) AddNode(ctx context.Context, in *AddNodeRequest, } func (c *controlServiceClient) RestartNode(ctx context.Context, in *RestartNodeRequest, opts ...grpc.CallOption) (*RestartNodeResponse, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) out := new(RestartNodeResponse) - err := c.cc.Invoke(ctx, ControlService_RestartNode_FullMethodName, in, out, opts...) + err := c.cc.Invoke(ctx, ControlService_RestartNode_FullMethodName, in, out, cOpts...) if err != nil { return nil, err } @@ -336,8 +349,9 @@ func (c *controlServiceClient) RestartNode(ctx context.Context, in *RestartNodeR } func (c *controlServiceClient) PauseNode(ctx context.Context, in *PauseNodeRequest, opts ...grpc.CallOption) (*PauseNodeResponse, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) out := new(PauseNodeResponse) - err := c.cc.Invoke(ctx, ControlService_PauseNode_FullMethodName, in, out, opts...) + err := c.cc.Invoke(ctx, ControlService_PauseNode_FullMethodName, in, out, cOpts...) if err != nil { return nil, err } @@ -345,8 +359,9 @@ func (c *controlServiceClient) PauseNode(ctx context.Context, in *PauseNodeReque } func (c *controlServiceClient) ResumeNode(ctx context.Context, in *ResumeNodeRequest, opts ...grpc.CallOption) (*ResumeNodeResponse, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) out := new(ResumeNodeResponse) - err := c.cc.Invoke(ctx, ControlService_ResumeNode_FullMethodName, in, out, opts...) + err := c.cc.Invoke(ctx, ControlService_ResumeNode_FullMethodName, in, out, cOpts...) if err != nil { return nil, err } @@ -354,8 +369,9 @@ func (c *controlServiceClient) ResumeNode(ctx context.Context, in *ResumeNodeReq } func (c *controlServiceClient) Stop(ctx context.Context, in *StopRequest, opts ...grpc.CallOption) (*StopResponse, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) out := new(StopResponse) - err := c.cc.Invoke(ctx, ControlService_Stop_FullMethodName, in, out, opts...) + err := c.cc.Invoke(ctx, ControlService_Stop_FullMethodName, in, out, cOpts...) if err != nil { return nil, err } @@ -363,8 +379,9 @@ func (c *controlServiceClient) Stop(ctx context.Context, in *StopRequest, opts . } func (c *controlServiceClient) AttachPeer(ctx context.Context, in *AttachPeerRequest, opts ...grpc.CallOption) (*AttachPeerResponse, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) out := new(AttachPeerResponse) - err := c.cc.Invoke(ctx, ControlService_AttachPeer_FullMethodName, in, out, opts...) + err := c.cc.Invoke(ctx, ControlService_AttachPeer_FullMethodName, in, out, cOpts...) if err != nil { return nil, err } @@ -372,8 +389,9 @@ func (c *controlServiceClient) AttachPeer(ctx context.Context, in *AttachPeerReq } func (c *controlServiceClient) SendOutboundMessage(ctx context.Context, in *SendOutboundMessageRequest, opts ...grpc.CallOption) (*SendOutboundMessageResponse, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) out := new(SendOutboundMessageResponse) - err := c.cc.Invoke(ctx, ControlService_SendOutboundMessage_FullMethodName, in, out, opts...) + err := c.cc.Invoke(ctx, ControlService_SendOutboundMessage_FullMethodName, in, out, cOpts...) if err != nil { return nil, err } @@ -381,8 +399,9 @@ func (c *controlServiceClient) SendOutboundMessage(ctx context.Context, in *Send } func (c *controlServiceClient) SaveSnapshot(ctx context.Context, in *SaveSnapshotRequest, opts ...grpc.CallOption) (*SaveSnapshotResponse, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) out := new(SaveSnapshotResponse) - err := c.cc.Invoke(ctx, ControlService_SaveSnapshot_FullMethodName, in, out, opts...) + err := c.cc.Invoke(ctx, ControlService_SaveSnapshot_FullMethodName, in, out, cOpts...) if err != nil { return nil, err } @@ -390,8 +409,9 @@ func (c *controlServiceClient) SaveSnapshot(ctx context.Context, in *SaveSnapsho } func (c *controlServiceClient) SaveHotSnapshot(ctx context.Context, in *SaveSnapshotRequest, opts ...grpc.CallOption) (*SaveSnapshotResponse, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) out := new(SaveSnapshotResponse) - err := c.cc.Invoke(ctx, ControlService_SaveHotSnapshot_FullMethodName, in, out, opts...) + err := c.cc.Invoke(ctx, ControlService_SaveHotSnapshot_FullMethodName, in, out, cOpts...) if err != nil { return nil, err } @@ -399,8 +419,9 @@ func (c *controlServiceClient) SaveHotSnapshot(ctx context.Context, in *SaveSnap } func (c *controlServiceClient) LoadSnapshot(ctx context.Context, in *LoadSnapshotRequest, opts ...grpc.CallOption) (*LoadSnapshotResponse, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) out := new(LoadSnapshotResponse) - err := c.cc.Invoke(ctx, ControlService_LoadSnapshot_FullMethodName, in, out, opts...) + err := c.cc.Invoke(ctx, ControlService_LoadSnapshot_FullMethodName, in, out, cOpts...) if err != nil { return nil, err } @@ -408,8 +429,9 @@ func (c *controlServiceClient) LoadSnapshot(ctx context.Context, in *LoadSnapsho } func (c *controlServiceClient) RemoveSnapshot(ctx context.Context, in *RemoveSnapshotRequest, opts ...grpc.CallOption) (*RemoveSnapshotResponse, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) out := new(RemoveSnapshotResponse) - err := c.cc.Invoke(ctx, ControlService_RemoveSnapshot_FullMethodName, in, out, opts...) + err := c.cc.Invoke(ctx, ControlService_RemoveSnapshot_FullMethodName, in, out, cOpts...) if err != nil { return nil, err } @@ -417,8 +439,9 @@ func (c *controlServiceClient) RemoveSnapshot(ctx context.Context, in *RemoveSna } func (c *controlServiceClient) GetSnapshotNames(ctx context.Context, in *GetSnapshotNamesRequest, opts ...grpc.CallOption) (*GetSnapshotNamesResponse, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) out := new(GetSnapshotNamesResponse) - err := c.cc.Invoke(ctx, ControlService_GetSnapshotNames_FullMethodName, in, out, opts...) + err := c.cc.Invoke(ctx, ControlService_GetSnapshotNames_FullMethodName, in, out, cOpts...) if err != nil { return nil, err } @@ -427,7 +450,7 @@ func (c *controlServiceClient) GetSnapshotNames(ctx context.Context, in *GetSnap // ControlServiceServer is the server API for ControlService service. // All implementations must embed UnimplementedControlServiceServer -// for forward compatibility +// for forward compatibility. type ControlServiceServer interface { RPCVersion(context.Context, *RPCVersionRequest) (*RPCVersionResponse, error) Start(context.Context, *StartRequest) (*StartResponse, error) @@ -440,7 +463,7 @@ type ControlServiceServer interface { URIs(context.Context, *URIsRequest) (*URIsResponse, error) WaitForHealthy(context.Context, *WaitForHealthyRequest) (*WaitForHealthyResponse, error) Status(context.Context, *StatusRequest) (*StatusResponse, error) - StreamStatus(*StreamStatusRequest, ControlService_StreamStatusServer) error + StreamStatus(*StreamStatusRequest, grpc.ServerStreamingServer[StreamStatusResponse]) error RemoveNode(context.Context, *RemoveNodeRequest) (*RemoveNodeResponse, error) AddNode(context.Context, *AddNodeRequest) (*AddNodeResponse, error) RestartNode(context.Context, *RestartNodeRequest) (*RestartNodeResponse, error) @@ -459,86 +482,90 @@ type ControlServiceServer interface { mustEmbedUnimplementedControlServiceServer() } -// UnimplementedControlServiceServer must be embedded to have forward compatible implementations. -type UnimplementedControlServiceServer struct { -} +// UnimplementedControlServiceServer must be embedded to have +// forward compatible implementations. +// +// NOTE: this should be embedded by value instead of pointer to avoid a nil +// pointer dereference when methods are called. +type UnimplementedControlServiceServer struct{} func (UnimplementedControlServiceServer) RPCVersion(context.Context, *RPCVersionRequest) (*RPCVersionResponse, error) { - return nil, status.Errorf(codes.Unimplemented, "method RPCVersion not implemented") + return nil, status.Error(codes.Unimplemented, "method RPCVersion not implemented") } func (UnimplementedControlServiceServer) Start(context.Context, *StartRequest) (*StartResponse, error) { - return nil, status.Errorf(codes.Unimplemented, "method Start not implemented") + return nil, status.Error(codes.Unimplemented, "method Start not implemented") } func (UnimplementedControlServiceServer) CreateBlockchains(context.Context, *CreateBlockchainsRequest) (*CreateBlockchainsResponse, error) { - return nil, status.Errorf(codes.Unimplemented, "method CreateBlockchains not implemented") + return nil, status.Error(codes.Unimplemented, "method CreateBlockchains not implemented") } func (UnimplementedControlServiceServer) TransformElasticChains(context.Context, *TransformElasticChainsRequest) (*TransformElasticChainsResponse, error) { - return nil, status.Errorf(codes.Unimplemented, "method TransformElasticChains not implemented") + return nil, status.Error(codes.Unimplemented, "method TransformElasticChains not implemented") } func (UnimplementedControlServiceServer) AddPermissionlessValidator(context.Context, *AddPermissionlessValidatorRequest) (*AddPermissionlessValidatorResponse, error) { - return nil, status.Errorf(codes.Unimplemented, "method AddPermissionlessValidator not implemented") + return nil, status.Error(codes.Unimplemented, "method AddPermissionlessValidator not implemented") } func (UnimplementedControlServiceServer) RemoveChainValidator(context.Context, *RemoveChainValidatorRequest) (*RemoveChainValidatorResponse, error) { - return nil, status.Errorf(codes.Unimplemented, "method RemoveChainValidator not implemented") + return nil, status.Error(codes.Unimplemented, "method RemoveChainValidator not implemented") } func (UnimplementedControlServiceServer) CreateChains(context.Context, *CreateChainsRequest) (*CreateChainsResponse, error) { - return nil, status.Errorf(codes.Unimplemented, "method CreateChains not implemented") + return nil, status.Error(codes.Unimplemented, "method CreateChains not implemented") } func (UnimplementedControlServiceServer) Health(context.Context, *HealthRequest) (*HealthResponse, error) { - return nil, status.Errorf(codes.Unimplemented, "method Health not implemented") + return nil, status.Error(codes.Unimplemented, "method Health not implemented") } func (UnimplementedControlServiceServer) URIs(context.Context, *URIsRequest) (*URIsResponse, error) { - return nil, status.Errorf(codes.Unimplemented, "method URIs not implemented") + return nil, status.Error(codes.Unimplemented, "method URIs not implemented") } func (UnimplementedControlServiceServer) WaitForHealthy(context.Context, *WaitForHealthyRequest) (*WaitForHealthyResponse, error) { - return nil, status.Errorf(codes.Unimplemented, "method WaitForHealthy not implemented") + return nil, status.Error(codes.Unimplemented, "method WaitForHealthy not implemented") } func (UnimplementedControlServiceServer) Status(context.Context, *StatusRequest) (*StatusResponse, error) { - return nil, status.Errorf(codes.Unimplemented, "method Status not implemented") + return nil, status.Error(codes.Unimplemented, "method Status not implemented") } -func (UnimplementedControlServiceServer) StreamStatus(*StreamStatusRequest, ControlService_StreamStatusServer) error { - return status.Errorf(codes.Unimplemented, "method StreamStatus not implemented") +func (UnimplementedControlServiceServer) StreamStatus(*StreamStatusRequest, grpc.ServerStreamingServer[StreamStatusResponse]) error { + return status.Error(codes.Unimplemented, "method StreamStatus not implemented") } func (UnimplementedControlServiceServer) RemoveNode(context.Context, *RemoveNodeRequest) (*RemoveNodeResponse, error) { - return nil, status.Errorf(codes.Unimplemented, "method RemoveNode not implemented") + return nil, status.Error(codes.Unimplemented, "method RemoveNode not implemented") } func (UnimplementedControlServiceServer) AddNode(context.Context, *AddNodeRequest) (*AddNodeResponse, error) { - return nil, status.Errorf(codes.Unimplemented, "method AddNode not implemented") + return nil, status.Error(codes.Unimplemented, "method AddNode not implemented") } func (UnimplementedControlServiceServer) RestartNode(context.Context, *RestartNodeRequest) (*RestartNodeResponse, error) { - return nil, status.Errorf(codes.Unimplemented, "method RestartNode not implemented") + return nil, status.Error(codes.Unimplemented, "method RestartNode not implemented") } func (UnimplementedControlServiceServer) PauseNode(context.Context, *PauseNodeRequest) (*PauseNodeResponse, error) { - return nil, status.Errorf(codes.Unimplemented, "method PauseNode not implemented") + return nil, status.Error(codes.Unimplemented, "method PauseNode not implemented") } func (UnimplementedControlServiceServer) ResumeNode(context.Context, *ResumeNodeRequest) (*ResumeNodeResponse, error) { - return nil, status.Errorf(codes.Unimplemented, "method ResumeNode not implemented") + return nil, status.Error(codes.Unimplemented, "method ResumeNode not implemented") } func (UnimplementedControlServiceServer) Stop(context.Context, *StopRequest) (*StopResponse, error) { - return nil, status.Errorf(codes.Unimplemented, "method Stop not implemented") + return nil, status.Error(codes.Unimplemented, "method Stop not implemented") } func (UnimplementedControlServiceServer) AttachPeer(context.Context, *AttachPeerRequest) (*AttachPeerResponse, error) { - return nil, status.Errorf(codes.Unimplemented, "method AttachPeer not implemented") + return nil, status.Error(codes.Unimplemented, "method AttachPeer not implemented") } func (UnimplementedControlServiceServer) SendOutboundMessage(context.Context, *SendOutboundMessageRequest) (*SendOutboundMessageResponse, error) { - return nil, status.Errorf(codes.Unimplemented, "method SendOutboundMessage not implemented") + return nil, status.Error(codes.Unimplemented, "method SendOutboundMessage not implemented") } func (UnimplementedControlServiceServer) SaveSnapshot(context.Context, *SaveSnapshotRequest) (*SaveSnapshotResponse, error) { - return nil, status.Errorf(codes.Unimplemented, "method SaveSnapshot not implemented") + return nil, status.Error(codes.Unimplemented, "method SaveSnapshot not implemented") } func (UnimplementedControlServiceServer) SaveHotSnapshot(context.Context, *SaveSnapshotRequest) (*SaveSnapshotResponse, error) { - return nil, status.Errorf(codes.Unimplemented, "method SaveHotSnapshot not implemented") + return nil, status.Error(codes.Unimplemented, "method SaveHotSnapshot not implemented") } func (UnimplementedControlServiceServer) LoadSnapshot(context.Context, *LoadSnapshotRequest) (*LoadSnapshotResponse, error) { - return nil, status.Errorf(codes.Unimplemented, "method LoadSnapshot not implemented") + return nil, status.Error(codes.Unimplemented, "method LoadSnapshot not implemented") } func (UnimplementedControlServiceServer) RemoveSnapshot(context.Context, *RemoveSnapshotRequest) (*RemoveSnapshotResponse, error) { - return nil, status.Errorf(codes.Unimplemented, "method RemoveSnapshot not implemented") + return nil, status.Error(codes.Unimplemented, "method RemoveSnapshot not implemented") } func (UnimplementedControlServiceServer) GetSnapshotNames(context.Context, *GetSnapshotNamesRequest) (*GetSnapshotNamesResponse, error) { - return nil, status.Errorf(codes.Unimplemented, "method GetSnapshotNames not implemented") + return nil, status.Error(codes.Unimplemented, "method GetSnapshotNames not implemented") } func (UnimplementedControlServiceServer) mustEmbedUnimplementedControlServiceServer() {} +func (UnimplementedControlServiceServer) testEmbeddedByValue() {} // UnsafeControlServiceServer may be embedded to opt out of forward compatibility for this service. // Use of this interface is not recommended, as added methods to ControlServiceServer will @@ -548,6 +575,13 @@ type UnsafeControlServiceServer interface { } func RegisterControlServiceServer(s grpc.ServiceRegistrar, srv ControlServiceServer) { + // If the following call panics, it indicates UnimplementedControlServiceServer was + // embedded by pointer and is nil. This will cause panics if an + // unimplemented method is ever invoked, so we test this at initialization + // time to prevent it from happening at runtime later due to I/O. + if t, ok := srv.(interface{ testEmbeddedByValue() }); ok { + t.testEmbeddedByValue() + } s.RegisterService(&ControlService_ServiceDesc, srv) } @@ -754,21 +788,11 @@ func _ControlService_StreamStatus_Handler(srv interface{}, stream grpc.ServerStr if err := stream.RecvMsg(m); err != nil { return err } - return srv.(ControlServiceServer).StreamStatus(m, &controlServiceStreamStatusServer{stream}) + return srv.(ControlServiceServer).StreamStatus(m, &grpc.GenericServerStream[StreamStatusRequest, StreamStatusResponse]{ServerStream: stream}) } -type ControlService_StreamStatusServer interface { - Send(*StreamStatusResponse) error - grpc.ServerStream -} - -type controlServiceStreamStatusServer struct { - grpc.ServerStream -} - -func (x *controlServiceStreamStatusServer) Send(m *StreamStatusResponse) error { - return x.ServerStream.SendMsg(m) -} +// This type alias is provided for backwards compatibility with existing code that references the prior non-generic stream type by name. +type ControlService_StreamStatusServer = grpc.ServerStreamingServer[StreamStatusResponse] func _ControlService_RemoveNode_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { in := new(RemoveNodeRequest) diff --git a/tests/e2e/e2e_test.go.bak b/tests/e2e/e2e_test.go.bak deleted file mode 100644 index 302587a3..00000000 --- a/tests/e2e/e2e_test.go.bak +++ /dev/null @@ -1,1129 +0,0 @@ -// Copyright (C) 2021-2025, Lux Industries Inc. All rights reserved. -// See the file LICENSE for licensing terms. - -// e2e implements the e2e tests. -package e2e_test - -import ( - "context" - "flag" - "os" - "path/filepath" - "sort" - "strings" - "testing" - "time" - - "github.com/luxfi/sdk/node/api/admin" - "github.com/luxfi/p2p/message" - luxd_constants "github.com/luxfi/utils/constants" - "github.com/luxfi/sdk/node/vms/platformvm" - "github.com/prometheus/client_golang/prometheus" - "golang.org/x/exp/maps" - - "github.com/luxfi/netrunner/client" - "github.com/luxfi/netrunner/rpcpb" - "github.com/luxfi/netrunner/server" - "github.com/luxfi/netrunner/utils" - "github.com/luxfi/netrunner/utils/constants" - "github.com/luxfi/netrunner/ux" - "github.com/luxfi/ids" - "github.com/luxfi/utils/logging" - "github.com/luxfi/metrics" - ginkgo "github.com/onsi/ginkgo/v2" - "github.com/onsi/gomega" -) - -func TestE2e(t *testing.T) { - if os.Getenv("RUN_E2E") == "" { - t.Skip("Environment variable RUN_E2E not set; skipping E2E tests") - } - gomega.RegisterFailHandler(ginkgo.Fail) - ginkgo.RunSpecs(t, "network-runner-example e2e test suites") -} - -const clientRootDirPrefix = "client" - -var ( - logLevel string - logDir string - gRPCEp string - gRPCGatewayEp string - execPath1 string - execPath2 string - subnetEvmPath string - genesisPath string - genesisContents string - - newNodeName = "test-add-node" - newNodeName2 = "test-add-node2" - newNode2NodeID = "" - pausedNodeURI = "" - pausedNodeName = "node1" - createdSubnetID = "" - elasticAssetID = "" - newSubnetID = "" - customNodeConfigs = map[string]string{ - "node1": `{"api-admin-enabled":true}`, - "node2": `{"api-admin-enabled":true}`, - "node3": `{"api-admin-enabled":true}`, - "node4": `{"api-admin-enabled":false}`, - "node5": `{"api-admin-enabled":false}`, - "node6": `{"api-admin-enabled":false}`, - "node7": `{"api-admin-enabled":false}`, - } - numNodes = uint32(5) - subnetParticipants = []string{"node1", "node2", "node3"} - newParticipantNode = "new_participant_node" - subnetParticipants2 = []string{"node1", "node2", newParticipantNode} - existingNodes = []string{"node1", "node2", "node3", "node4", "node5"} - disjointNewSubnetParticipants = [][]string{ - {"new_node1", "new_node2"}, - {"new_node3", "new_node4"}, - } - testElasticSubnetConfig = rpcpb.ElasticSubnetSpec{ - SubnetId: "", - AssetName: "BLIZZARD", - AssetSymbol: "BRRR", - InitialSupply: 240000000, - MaxSupply: 720000000, - MinConsumptionRate: 100000, - MaxConsumptionRate: 120000, - MinValidatorStake: 2000, - MaxValidatorStake: 3000000, - MinStakeDuration: 14 * 24, - MaxStakeDuration: 365 * 24, - MinDelegationFee: 20000, - MinDelegatorStake: 25, - MaxValidatorWeightFactor: 5, - UptimeRequirement: 0.8 * 1_000_000, - } - - testValidatorConfig = rpcpb.PermissionlessValidatorSpec{ - StakedTokenAmount: 2000, - StartTime: time.Now().Add(1 * time.Hour).UTC().Format(server.TimeParseLayout), - StakeDuration: 336, - } -) - -func init() { - flag.StringVar( - &logLevel, - "log-level", - logging.Info.String(), - "log level", - ) - flag.StringVar( - &logDir, - "log-dir", - "", - "log directory", - ) - flag.StringVar( - &gRPCEp, - "grpc-endpoint", - "0.0.0.0:8080", - "gRPC server endpoint", - ) - flag.StringVar( - &gRPCGatewayEp, - "grpc-gateway-endpoint", - "0.0.0.0:8081", - "gRPC gateway endpoint", - ) - flag.StringVar( - &execPath1, - "node-path-1", - "", - "node executable path (to upgrade from)", - ) - flag.StringVar( - &execPath2, - "node-path-2", - "", - "node executable path (to upgrade to)", - ) - flag.StringVar( - &subnetEvmPath, - "subnet-evm-path", - "", - "path to subnet-evm binary", - ) -} - -var ( - cli client.Client - log logging.Logger -) - -var _ = ginkgo.BeforeSuite(func() { - var err error - if logDir == "" { - anrRootDir := filepath.Join(os.TempDir(), constants.RootDirPrefix) - err = os.MkdirAll(anrRootDir, os.ModePerm) - gomega.Ω(err).Should(gomega.BeNil()) - clientRootDir := filepath.Join(anrRootDir, clientRootDirPrefix) - logDir, err = utils.MkDirWithTimestamp(clientRootDir) - gomega.Ω(err).Should(gomega.BeNil()) - } - lvl, err := logging.ToLevel(logLevel) - gomega.Ω(err).Should(gomega.BeNil()) - logFactory := logging.NewFactory(logging.Config{ - RotatingWriterConfig: logging.RotatingWriterConfig{ - Directory: logDir, - }, - DisplayLevel: lvl, - LogLevel: lvl, - }) - log, err = logFactory.Make(constants.LogNameTest) - gomega.Ω(err).Should(gomega.BeNil()) - - cli, err = client.New(client.Config{ - Endpoint: gRPCEp, - DialTimeout: 10 * time.Second, - }, log) - gomega.Ω(err).Should(gomega.BeNil()) - - genesisPath = "tests/e2e/subnet-evm-genesis.json" - genesisByteContents, err := os.ReadFile(genesisPath) - gomega.Ω(err).Should(gomega.BeNil()) - genesisContents = string(genesisByteContents) -}) - -var _ = ginkgo.AfterSuite(func() { - ux.Print(log, logging.Red.Wrap("shutting down cluster")) - ctx, cancel := context.WithTimeout(context.Background(), 15*time.Second) - _, err := cli.Stop(ctx) - cancel() - gomega.Ω(err).Should(gomega.BeNil()) - - ux.Print(log, logging.Red.Wrap("shutting down client")) - err = cli.Close() - gomega.Ω(err).Should(gomega.BeNil()) -}) - -var _ = ginkgo.Describe("[Start/Remove/Restart/Add/Stop]", func() { - ginkgo.It("can create blockhains", func() { - existingSubnetID := "" - createdBlockchainID := "" - createdBlockchainID2 := "" - ginkgo.By("start with blockchain specs", func() { - ux.Print(log, logging.Green.Wrap("sending 'start' with the valid binary path: %s"), execPath1) - ctx, cancel := context.WithTimeout(context.Background(), 2*time.Minute) - resp, err := cli.Start(ctx, execPath1, - client.WithPluginDir(filepath.Join(filepath.Dir(execPath1), "plugins")), - client.WithBlockchainSpecs([]*rpcpb.BlockchainSpec{ - { - VmName: "subnetevm", - Genesis: genesisPath, // test genesis path usage - }, - }), - ) - cancel() - gomega.Ω(err).Should(gomega.BeNil()) - gomega.Ω(len(resp.ChainIds)).Should(gomega.Equal(1)) - createdBlockchainID = resp.ChainIds[0] - ux.Print(log, logging.Green.Wrap("successfully started, node-names: %s"), resp.ClusterInfo.NodeNames) - }) - - ginkgo.By("can create a blockchain with a new subnet id", func() { - ux.Print(log, logging.Blue.Wrap("can create a blockchain in a new subnet")) - ctx, cancel := context.WithTimeout(context.Background(), 2*time.Minute) - resp, err := cli.CreateBlockchains(ctx, - []*rpcpb.BlockchainSpec{ - { - VmName: "subnetevm", - Genesis: genesisPath, // test genesis path usage - }, - }, - ) - cancel() - gomega.Ω(err).Should(gomega.BeNil()) - gomega.Ω(len(resp.ChainIds)).Should(gomega.Equal(1)) - }) - - ginkgo.By("get subnet ID", func() { - cctx, ccancel := context.WithTimeout(context.Background(), 15*time.Second) - status, err := cli.Status(cctx) - ccancel() - gomega.Ω(err).Should(gomega.BeNil()) - customChains := status.ClusterInfo.GetCustomChains() - _, ok := customChains[createdBlockchainID] - gomega.Ω(ok).Should(gomega.Equal(true)) - existingSubnetID = customChains[createdBlockchainID].SubnetId - gomega.Ω(existingSubnetID).Should(gomega.Not(gomega.BeNil())) - }) - - ginkgo.By("verify the subnet also has all existing nodes as participants", func() { - ctx, cancel := context.WithTimeout(context.Background(), 15*time.Second) - defer cancel() - status, err := cli.Status(ctx) - gomega.Ω(err).Should(gomega.BeNil()) - subnetIDs := maps.Keys(status.ClusterInfo.Subnets) - sort.Strings(subnetIDs) - createdSubnetIDString := subnetIDs[0] - subnetHasCorrectParticipants := utils.VerifySubnetHasCorrectParticipants(log, existingNodes, status.ClusterInfo, createdSubnetIDString) - gomega.Ω(subnetHasCorrectParticipants).Should(gomega.Equal(true)) - }) - - ginkgo.By("can create a blockchain with an existing subnet id", func() { - ux.Print(log, logging.Blue.Wrap("can create a blockchain in an existing subnet")) - ctx, cancel := context.WithTimeout(context.Background(), 2*time.Minute) - resp, err := cli.CreateBlockchains(ctx, - []*rpcpb.BlockchainSpec{ - { - VmName: "subnetevm", - Genesis: genesisContents, - SubnetId: &existingSubnetID, - }, - }, - ) - cancel() - gomega.Ω(err).Should(gomega.BeNil()) - gomega.Ω(len(resp.ChainIds)).Should(gomega.Equal(1)) - }) - - ginkgo.By("can save snapshot", func() { - ctx, cancel := context.WithTimeout(context.Background(), 15*time.Second) - _, err := cli.SaveSnapshot(ctx, "test") - cancel() - gomega.Ω(err).Should(gomega.BeNil()) - }) - - ginkgo.By("can load snapshot", func() { - ctx, cancel := context.WithTimeout(context.Background(), 2*time.Minute) - _, err := cli.LoadSnapshot(ctx, "test") - cancel() - gomega.Ω(err).Should(gomega.BeNil()) - }) - - // need to remove the snapshot otherwise it fails later in the 2nd part of snapshot tests - // (testing for no snapshots) - ginkgo.By("can remove snapshot", func() { - ctx, cancel := context.WithTimeout(context.Background(), 15*time.Second) - _, err := cli.RemoveSnapshot(ctx, "test") - cancel() - gomega.Ω(err).Should(gomega.BeNil()) - }) - - ginkgo.By("can create a blockchain with an existing subnet id loaded from snapshot", func() { - ux.Print(log, logging.Blue.Wrap("can create a blockchain in an existing subnet")) - ctx, cancel := context.WithTimeout(context.Background(), 2*time.Minute) - _, err := cli.CreateBlockchains(ctx, - []*rpcpb.BlockchainSpec{ - { - VmName: "subnetevm", - Genesis: genesisContents, - SubnetId: &existingSubnetID, - }, - }, - ) - cancel() - gomega.Ω(err).Should(gomega.BeNil()) - }) - - ginkgo.By("can create a blockchain with new subnet id with some of existing participating nodes", func() { - ux.Print(log, logging.Blue.Wrap("can create a blockchain with new subnet id with some of existing participating nodes")) - ctx, cancel := context.WithTimeout(context.Background(), 2*time.Minute) - resp, err := cli.CreateBlockchains(ctx, - []*rpcpb.BlockchainSpec{ - { - VmName: "subnetevm", - Genesis: genesisContents, - SubnetSpec: &rpcpb.SubnetSpec{Participants: subnetParticipants}, - }, - }, - ) - cancel() - gomega.Ω(err).Should(gomega.BeNil()) - gomega.Ω(len(resp.ChainIds)).Should(gomega.Equal(1)) - createdBlockchainID = resp.ChainIds[0] - }) - - ginkgo.By("verify subnet has correct participants", func() { - ctx, cancel := context.WithTimeout(context.Background(), 15*time.Second) - defer cancel() - - status, err := cli.Status(ctx) - gomega.Ω(err).Should(gomega.BeNil()) - customChains := status.ClusterInfo.GetCustomChains() - createdSubnetIDString := customChains[createdBlockchainID].SubnetId - subnetHasCorrectParticipants := utils.VerifySubnetHasCorrectParticipants(log, subnetParticipants, status.ClusterInfo, createdSubnetIDString) - gomega.Ω(subnetHasCorrectParticipants).Should(gomega.Equal(true)) - // verify that no new nodes is added to cluster - gomega.Ω(len(status.ClusterInfo.NodeNames)).Should(gomega.Equal(5)) - }) - - ginkgo.By("can create a blockchain with new subnet id with some of existing participating nodes and a new node", func() { - ux.Print(log, logging.Blue.Wrap("can create a blockchain new subnet id with some of existing participating nodes and a new node")) - ctx, cancel := context.WithTimeout(context.Background(), 2*time.Minute) - resp, err := cli.CreateBlockchains(ctx, - []*rpcpb.BlockchainSpec{ - { - VmName: "subnetevm", - Genesis: genesisContents, - SubnetSpec: &rpcpb.SubnetSpec{Participants: subnetParticipants2}, - }, - }, - ) - cancel() - gomega.Ω(err).Should(gomega.BeNil()) - // verify that a new node is added to cluster - gomega.Ω(len(resp.ClusterInfo.NodeNames)).Should(gomega.Equal(6)) - _, ok := resp.ClusterInfo.NodeInfos[newParticipantNode] - gomega.Ω(ok).Should(gomega.Equal(true)) - gomega.Ω(len(resp.ChainIds)).Should(gomega.Equal(1)) - createdBlockchainID = resp.ChainIds[0] - }) - - ginkgo.By("verify the newer subnet also has correct participants", func() { - ctx, cancel := context.WithTimeout(context.Background(), 15*time.Second) - defer cancel() - status, err := cli.Status(ctx) - gomega.Ω(err).Should(gomega.BeNil()) - customChains := status.ClusterInfo.GetCustomChains() - createdSubnetIDString := customChains[createdBlockchainID].SubnetId - subnetHasCorrectParticipants := utils.VerifySubnetHasCorrectParticipants(log, subnetParticipants2, status.ClusterInfo, createdSubnetIDString) - gomega.Ω(subnetHasCorrectParticipants).Should(gomega.Equal(true)) - }) - - ginkgo.By("can create two blockchains at a time", func() { - ctx, cancel := context.WithTimeout(context.Background(), 2*time.Minute) - resp, err := cli.CreateBlockchains(ctx, - []*rpcpb.BlockchainSpec{ - { - VmName: "subnetevm", - Genesis: genesisContents, - SubnetId: &existingSubnetID, - }, - { - VmName: "subnetevm", - Genesis: genesisContents, - SubnetId: &existingSubnetID, - }, - }, - ) - cancel() - gomega.Ω(err).Should(gomega.BeNil()) - gomega.Ω(len(resp.ChainIds)).Should(gomega.Equal(2)) - }) - - ginkgo.By("can create two blockchains in two new disjoint subnets with bls validators", func() { - // get prev status - ctx, cancel := context.WithTimeout(context.Background(), 15*time.Second) - prevStatus, err := cli.Status(ctx) - gomega.Ω(err).Should(gomega.BeNil()) - cancel() - // create blockchains - ctx, cancel = context.WithTimeout(context.Background(), 3*time.Minute) - resp, err := cli.CreateBlockchains(ctx, - []*rpcpb.BlockchainSpec{ - { - VmName: "subnetevm", - Genesis: genesisContents, - SubnetSpec: &rpcpb.SubnetSpec{Participants: disjointNewSubnetParticipants[0]}, - }, - { - VmName: "subnetevm", - Genesis: genesisContents, - SubnetSpec: &rpcpb.SubnetSpec{Participants: disjointNewSubnetParticipants[1]}, - }, - }, - ) - cancel() - gomega.Ω(err).Should(gomega.BeNil()) - // check new nodes - allNewParticipants := append(disjointNewSubnetParticipants[0], disjointNewSubnetParticipants[1]...) - expectedLen := len(prevStatus.ClusterInfo.NodeNames) + len(allNewParticipants) - gomega.Ω(len(resp.ClusterInfo.NodeNames)).Should(gomega.Equal(expectedLen)) - for _, nodeName := range allNewParticipants { - _, ok := resp.ClusterInfo.NodeInfos[nodeName] - gomega.Ω(ok).Should(gomega.Equal(true)) - } - gomega.Ω(len(resp.ChainIds)).Should(gomega.Equal(2)) - createdBlockchainID = resp.ChainIds[0] - createdBlockchainID2 = resp.ChainIds[1] - }) - - ginkgo.By("verify the new subnets also has correct participants", func() { - ctx, cancel := context.WithTimeout(context.Background(), 15*time.Second) - defer cancel() - status, err := cli.Status(ctx) - gomega.Ω(err).Should(gomega.BeNil()) - customChains := status.ClusterInfo.GetCustomChains() - createdSubnetIDString := customChains[createdBlockchainID].SubnetId - subnetHasCorrectParticipants := utils.VerifySubnetHasCorrectParticipants(log, disjointNewSubnetParticipants[0], status.ClusterInfo, createdSubnetIDString) - gomega.Ω(subnetHasCorrectParticipants).Should(gomega.Equal(true)) - createdSubnetID2String := customChains[createdBlockchainID2].SubnetId - subnet2HasCorrectParticipants := utils.VerifySubnetHasCorrectParticipants(log, disjointNewSubnetParticipants[1], status.ClusterInfo, createdSubnetID2String) - gomega.Ω(subnet2HasCorrectParticipants).Should(gomega.Equal(true)) - }) - - ginkgo.By("verify that new validators have BLS Keys", func() { - ctx, cancel := context.WithTimeout(context.Background(), 15*time.Second) - clientURIs, err := cli.URIs(ctx) - gomega.Ω(err).Should(gomega.BeNil()) - var clientURI string - for _, uri := range clientURIs { - clientURI = uri - break - } - platformCli := platformvm.NewClient(clientURI) - vdrs, err := platformCli.GetCurrentValidators(ctx, ids.Empty, nil) - gomega.Ω(err).Should(gomega.BeNil()) - status, err := cli.Status(ctx) - gomega.Ω(err).Should(gomega.BeNil()) - allNewParticipants := append(disjointNewSubnetParticipants[0], disjointNewSubnetParticipants[1]...) - for _, nodeName := range allNewParticipants { - nodeInfo, ok := status.ClusterInfo.NodeInfos[nodeName] - gomega.Ω(ok).Should(gomega.Equal(true)) - found := false - for _, v := range vdrs { - if v.NodeID.String() == nodeInfo.Id { - gomega.Ω(v.Signer).Should(gomega.Not(gomega.BeNil())) - found = true - } - } - gomega.Ω(found).Should(gomega.Equal(true)) - } - cancel() - }) - - ginkgo.By("stop the network", func() { - ctx, cancel := context.WithTimeout(context.Background(), 30*time.Second) - _, err := cli.Stop(ctx) - cancel() - gomega.Ω(err).Should(gomega.BeNil()) - }) - }) - - ginkgo.It("can start", func() { - ginkgo.By("start request with invalid exec path should fail", func() { - ctx, cancel := context.WithTimeout(context.Background(), 2*time.Minute) - _, err := cli.Start(ctx, "") - cancel() - gomega.Ω(err.Error()).Should(gomega.ContainSubstring(utils.ErrInvalidExecPath.Error())) - }) - - ginkgo.By("start request with invalid exec path should fail", func() { - ctx, cancel := context.WithTimeout(context.Background(), 2*time.Minute) - _, err := cli.Start(ctx, "invalid") - cancel() - gomega.Ω(err.Error()).Should(gomega.ContainSubstring(utils.ErrNotExists.Error())) - }) - - ginkgo.By("start request with invalid custom VM path should fail", func() { - ctx, cancel := context.WithTimeout(context.Background(), 2*time.Minute) - _, err := cli.Start(ctx, execPath1, - client.WithPluginDir(os.TempDir()), - client.WithBlockchainSpecs([]*rpcpb.BlockchainSpec{ - { - VmName: "invalid", - }, - }), - ) - cancel() - gomega.Ω(err.Error()).Should(gomega.ContainSubstring(utils.ErrNotExistsPlugin.Error())) - }) - - ginkgo.By("start request with invalid custom VM name format should fail", func() { - f, err := os.CreateTemp(os.TempDir(), strings.Repeat("a", 33)) - gomega.Ω(err).Should(gomega.BeNil()) - filePath := f.Name() - gomega.Ω(f.Close()).Should(gomega.BeNil()) - - ctx, cancel := context.WithTimeout(context.Background(), 2*time.Minute) - _, err = cli.Start(ctx, execPath1, - client.WithPluginDir(filepath.Dir(filePath)), - client.WithBlockchainSpecs([]*rpcpb.BlockchainSpec{ - { - VmName: filepath.Base(filePath), - }, - }), - ) - cancel() - gomega.Ω(err.Error()).Should(gomega.ContainSubstring(server.ErrInvalidVMName.Error())) - - os.RemoveAll(filePath) - }) - - ginkgo.By("calling start API with the valid binary path", func() { - ux.Print(log, logging.Green.Wrap("sending 'start' with the valid binary path: %s"), execPath1) - ctx, cancel := context.WithTimeout(context.Background(), 2*time.Minute) - resp, err := cli.Start(ctx, execPath1) - cancel() - gomega.Ω(err).Should(gomega.BeNil()) - ux.Print(log, logging.Green.Wrap("successfully started, node-names: %s"), resp.ClusterInfo.NodeNames) - }) - }) - - ginkgo.It("can wait for health", func() { - ctx, cancel := context.WithTimeout(context.Background(), 2*time.Minute) - _, err := cli.Health(ctx) - cancel() - gomega.Ω(err).Should(gomega.BeNil()) - }) - - ginkgo.It("can get URIs", func() { - ctx, cancel := context.WithTimeout(context.Background(), 15*time.Second) - uris, err := cli.URIs(ctx) - cancel() - gomega.Ω(err).Should(gomega.BeNil()) - ux.Print(log, logging.Blue.Wrap("URIs: %s"), uris) - }) - - ginkgo.It("can fetch status", func() { - ctx, cancel := context.WithTimeout(context.Background(), 15*time.Second) - resp, err := cli.Status(ctx) - cancel() - gomega.Ω(err).Should(gomega.BeNil()) - // get paused node URI for pause node test later - _, ok := resp.ClusterInfo.NodeInfos[pausedNodeName] - gomega.Ω(ok).Should(gomega.Equal(true)) - pausedNodeURI = resp.ClusterInfo.NodeInfos[pausedNodeName].Uri - }) - - ginkgo.It("can poll status", func() { - ctx, cancel := context.WithTimeout(context.Background(), 15*time.Second) - defer cancel() - ch, err := cli.StreamStatus(ctx, 5*time.Second) - gomega.Ω(err).Should(gomega.BeNil()) - for info := range ch { - ux.Print(log, logging.Green.Wrap("fetched info, node-names: %s"), info.NodeNames) - if info.Healthy { - break - } - } - }) - - ginkgo.It("can remove", func() { - ginkgo.By("calling remove API with the first binary", func() { - ctx, cancel := context.WithTimeout(context.Background(), 15*time.Second) - resp, err := cli.RemoveNode(ctx, "node5") - cancel() - gomega.Ω(err).Should(gomega.BeNil()) - ux.Print(log, logging.Green.Wrap("successfully removed, node-names: %s"), resp.ClusterInfo.NodeNames) - }) - }) - - ginkgo.It("can restart", func() { - ginkgo.By("calling restart API with the second binary", func() { - ctx, cancel := context.WithTimeout(context.Background(), 15*time.Second) - resp, err := cli.RestartNode(ctx, "node4", client.WithExecPath(execPath2)) - cancel() - gomega.Ω(err).Should(gomega.BeNil()) - ux.Print(log, logging.Green.Wrap("successfully restarted, node-names: %s"), resp.ClusterInfo.NodeNames) - }) - }) - - ginkgo.It("can attach a peer", func() { - ginkgo.By("calling attach peer API", func() { - ctx, cancel := context.WithTimeout(context.Background(), 15*time.Second) - resp, err := cli.AttachPeer(ctx, "node1") - cancel() - gomega.Ω(err).Should(gomega.BeNil()) - - v, ok := resp.ClusterInfo.AttachedPeerInfos["node1"] - gomega.Ω(ok).Should(gomega.BeTrue()) - ux.Print(log, logging.Green.Wrap("successfully attached peer, peers: %+v"), v.Peers) - - mc, err := message.NewCreator( - logging.NoLog{}, - metrics.NewRegistry(), - "", - luxd_constants.DefaultNetworkCompressionType, - 10*time.Second, - ) - gomega.Ω(err).Should(gomega.BeNil()) - - containerIDs := []ids.ID{ - ids.GenerateTestID(), - ids.GenerateTestID(), - ids.GenerateTestID(), - } - requestID := uint32(42) - chainID := luxd_constants.PlatformChainID - msg, err := mc.Chits(chainID, requestID, []ids.ID{}, containerIDs) - gomega.Ω(err).Should(gomega.BeNil()) - - ctx, cancel = context.WithTimeout(context.Background(), 15*time.Second) - sresp, err := cli.SendOutboundMessage(ctx, "node1", v.Peers[0].Id, uint32(msg.Op()), msg.Bytes()) - cancel() - gomega.Ω(err).Should(gomega.BeNil()) - gomega.Ω(sresp.Sent).Should(gomega.BeTrue()) - }) - }) - - ginkgo.It("can add a node", func() { - ginkgo.By("calling AddNode", func() { - ux.Print(log, logging.Green.Wrap("calling 'add-node' with the valid binary path: %s"), execPath1) - ctx, cancel := context.WithTimeout(context.Background(), 15*time.Second) - resp, err := cli.AddNode(ctx, newNodeName, execPath1) - cancel() - gomega.Ω(err).Should(gomega.BeNil()) - ux.Print(log, logging.Green.Wrap("successfully started, node-names: %s"), resp.ClusterInfo.NodeNames) - }) - - ginkgo.By("calling AddNode with existing node name, should fail", func() { - ux.Print(log, logging.Green.Wrap("calling 'add-node' with the valid binary path: %s"), execPath1) - ctx, cancel := context.WithTimeout(context.Background(), 15*time.Second) - resp, err := cli.AddNode(ctx, newNodeName, execPath1) - cancel() - gomega.Ω(err.Error()).Should(gomega.ContainSubstring("repeated node name")) - gomega.Ω(resp).Should(gomega.BeNil()) - ux.Print(log, logging.Green.Wrap("'add-node' failed as expected")) - }) - }) - - ginkgo.It("can start with custom config", func() { - ginkgo.By("stopping network first", func() { - ux.Print(log, logging.Red.Wrap("shutting down cluster")) - ctx, cancel := context.WithTimeout(context.Background(), 15*time.Second) - _, err := cli.Stop(ctx) - cancel() - gomega.Ω(err).Should(gomega.BeNil()) - - ux.Print(log, logging.Red.Wrap("shutting down client")) - gomega.Ω(err).Should(gomega.BeNil()) - }) - ginkgo.By("calling start API with custom config", func() { - ux.Print(log, logging.Green.Wrap("sending 'start' with the valid binary path: %s"), execPath1) - opts := []client.OpOption{ - client.WithNumNodes(numNodes), - client.WithCustomNodeConfigs(customNodeConfigs), - } - ctx, cancel := context.WithTimeout(context.Background(), 2*time.Minute) - resp, err := cli.Start(ctx, execPath1, opts...) - cancel() - gomega.Ω(err).Should(gomega.BeNil()) - ux.Print(log, logging.Green.Wrap("successfully started, node-names: %s"), resp.ClusterInfo.NodeNames) - }) - ginkgo.By("can wait for health", func() { - ctx, cancel := context.WithTimeout(context.Background(), 2*time.Minute) - _, err := cli.Health(ctx) - cancel() - gomega.Ω(err).Should(gomega.BeNil()) - }) - ginkgo.By("overrides num-nodes", func() { - ux.Print(log, logging.Green.Wrap("checking that given num-nodes %d have been overridden by custom configs: %d"), numNodes, len(customNodeConfigs)) - ctx, cancel := context.WithTimeout(context.Background(), 15*time.Second) - uris, err := cli.URIs(ctx) - cancel() - gomega.Ω(err).Should(gomega.BeNil()) - gomega.Ω(uris).Should(gomega.HaveLen(len(customNodeConfigs))) - ux.Print(log, logging.Green.Wrap("expected number of nodes up: %d"), len(customNodeConfigs)) - - ux.Print(log, logging.Green.Wrap("checking correct admin APIs are enabled resp. disabled")) - // we have 7 nodes, 3 have the admin API enabled, the other 4 disabled - // therefore we expect exactly 4 calls to fail and exactly 3 to succeed. - ctx, cancel = context.WithTimeout(context.Background(), 15*time.Second) - errCnt := 0 - for i := 0; i < len(uris); i++ { - cli := admin.NewClient(uris[i]) - err := cli.LockProfile(ctx) - if err != nil { - errCnt++ - } - } - cancel() - gomega.Ω(errCnt).Should(gomega.Equal(4)) - }) - }) - - ginkgo.It("start with default network, for subsequent steps", func() { - ginkgo.By("stopping network first", func() { - ctx, cancel := context.WithTimeout(context.Background(), 15*time.Second) - _, err := cli.Stop(ctx) - cancel() - gomega.Ω(err).Should(gomega.BeNil()) - }) - ginkgo.By("starting", func() { - ctx, cancel := context.WithTimeout(context.Background(), 2*time.Minute) - _, err := cli.Start(ctx, execPath1) - cancel() - gomega.Ω(err).Should(gomega.BeNil()) - }) - ginkgo.By("wait for health", func() { - ctx, cancel := context.WithTimeout(context.Background(), 2*time.Minute) - _, err := cli.Health(ctx) - cancel() - gomega.Ω(err).Should(gomega.BeNil()) - }) - }) - ginkgo.It("can pause a node", func() { - ginkgo.By("calling PauseNode", func() { - ux.Print(log, logging.Green.Wrap("calling 'pause-node'")) - ctx, cancel := context.WithTimeout(context.Background(), 15*time.Second) - resp, err := cli.PauseNode(ctx, pausedNodeName) - cancel() - gomega.Ω(err).Should(gomega.BeNil()) - ux.Print(log, logging.Green.Wrap("successfully paused, node-names: %s"), resp.ClusterInfo.NodeNames) - }) - ginkgo.By("can wait for health", func() { - ctx, cancel := context.WithTimeout(context.Background(), 2*time.Minute) - _, err := cli.Health(ctx) - cancel() - gomega.Ω(err).Should(gomega.BeNil()) - }) - ginkgo.By("API Call using paused node URI will fail", func() { - ctx, cancel := context.WithTimeout(context.Background(), 2*time.Minute) - defer cancel() - platformCli := platformvm.NewClient(pausedNodeURI) - _, err := platformCli.GetCurrentValidators(ctx, ids.Empty, nil) - gomega.Ω(err).Should(gomega.HaveOccurred()) - }) - ginkgo.By("calling resumeNode API", func() { - ctx, cancel := context.WithTimeout(context.Background(), 15*time.Second) - resp, err := cli.ResumeNode(ctx, pausedNodeName) - cancel() - gomega.Ω(err).Should(gomega.BeNil()) - ux.Print(log, logging.Green.Wrap("successfully resumed %s, cluster node-names: %s"), "node1", resp.ClusterInfo.NodeNames) - }) - ginkgo.By("can wait for health", func() { - ctx, cancel := context.WithTimeout(context.Background(), 2*time.Minute) - _, err := cli.Health(ctx) - cancel() - gomega.Ω(err).Should(gomega.BeNil()) - }) - ginkgo.By("API Call using resumed node URI", func() { - ctx, cancel := context.WithTimeout(context.Background(), 2*time.Minute) - defer cancel() - platformCli := platformvm.NewClient(pausedNodeURI) - _, err := platformCli.GetCurrentValidators(ctx, ids.Empty, nil) - gomega.Ω(err).Should(gomega.BeNil()) - }) - }) - - ginkgo.It("can add primary validator with BLS Keys", func() { - ginkgo.By("calling AddNode", func() { - ux.Print(log, logging.Green.Wrap("calling 'add-node' with the valid binary path: %s"), execPath1) - ctx, cancel := context.WithTimeout(context.Background(), 15*time.Second) - resp, err := cli.AddNode(ctx, newNodeName2, execPath1) - cancel() - gomega.Ω(err).Should(gomega.BeNil()) - for nodeName, nodeInfo := range resp.ClusterInfo.NodeInfos { - if nodeName == newNodeName2 { - newNode2NodeID = nodeInfo.Id - } - } - ux.Print(log, logging.Green.Wrap("successfully started, node-names: %s"), resp.ClusterInfo.NodeNames) - }) - ginkgo.By("can wait for health", func() { - ctx, cancel := context.WithTimeout(context.Background(), 2*time.Minute) - _, err := cli.Health(ctx) - cancel() - gomega.Ω(err).Should(gomega.BeNil()) - }) - ginkgo.By("add 1 subnet", func() { - ctx, cancel := context.WithTimeout(context.Background(), 2*time.Minute) - resp, err := cli.CreateSubnets(ctx, []*rpcpb.SubnetSpec{{}}) - cancel() - gomega.Ω(err).Should(gomega.BeNil()) - gomega.Ω(len(resp.SubnetIds)).Should(gomega.Equal(1)) - }) - ginkgo.By("verify that new validator has BLS Keys", func() { - ctx, cancel := context.WithTimeout(context.Background(), 15*time.Second) - clientURIs, err := cli.URIs(ctx) - gomega.Ω(err).Should(gomega.BeNil()) - var clientURI string - for _, uri := range clientURIs { - clientURI = uri - break - } - platformCli := platformvm.NewClient(clientURI) - vdrs, err := platformCli.GetCurrentValidators(ctx, ids.Empty, nil) - - gomega.Ω(err).Should(gomega.BeNil()) - for _, v := range vdrs { - if v.NodeID.String() == newNode2NodeID { - gomega.Ω(v.Signer).Should(gomega.Not(gomega.BeNil())) - } - } - cancel() - gomega.Ω(err).Should(gomega.BeNil()) - }) - }) - - ginkgo.It("subnet creation", func() { - ginkgo.By("add 1 subnet", func() { - ctx, cancel := context.WithTimeout(context.Background(), 2*time.Minute) - _, err := cli.CreateSubnets(ctx, []*rpcpb.SubnetSpec{{}}) - cancel() - gomega.Ω(err).Should(gomega.BeNil()) - }) - ginkgo.By("check subnet number is 2", func() { - ctx, cancel := context.WithTimeout(context.Background(), 15*time.Second) - status, err := cli.Status(ctx) - cancel() - gomega.Ω(err).Should(gomega.BeNil()) - numSubnets := len(status.ClusterInfo.Subnets) - gomega.Ω(numSubnets).Should(gomega.Equal(2)) - }) - ginkgo.By("add 1 subnet with participants", func() { - ctx, cancel := context.WithTimeout(context.Background(), 2*time.Minute) - response, err := cli.CreateSubnets(ctx, []*rpcpb.SubnetSpec{{Participants: subnetParticipants}}) - cancel() - gomega.Ω(err).Should(gomega.BeNil()) - gomega.Ω(len(response.SubnetIds)).Should(gomega.Equal(1)) - newSubnetID = response.SubnetIds[0] - }) - ginkgo.By("verify subnet has correct participants", func() { - ctx, cancel := context.WithTimeout(context.Background(), 15*time.Second) - defer cancel() - status, err := cli.Status(ctx) - gomega.Ω(err).Should(gomega.BeNil()) - subnetHasCorrectParticipants := utils.VerifySubnetHasCorrectParticipants(log, subnetParticipants, status.ClusterInfo, newSubnetID) - gomega.Ω(subnetHasCorrectParticipants).Should(gomega.Equal(true)) - }) - ginkgo.By("add 1 subnet with node not currently added", func() { - ctx, cancel := context.WithTimeout(context.Background(), 2*time.Minute) - response, err := cli.CreateSubnets(ctx, []*rpcpb.SubnetSpec{{Participants: subnetParticipants2}}) - cancel() - gomega.Ω(err).Should(gomega.BeNil()) - // verify that a new node is added to cluster - gomega.Ω(len(response.ClusterInfo.NodeNames)).Should(gomega.Equal(7)) - _, ok := response.ClusterInfo.NodeInfos[newParticipantNode] - gomega.Ω(ok).Should(gomega.Equal(true)) - gomega.Ω(len(response.SubnetIds)).Should(gomega.Equal(1)) - newSubnetID = response.SubnetIds[0] - }) - ginkgo.By("calling AddNode with existing node name, should fail", func() { - ux.Print(log, logging.Green.Wrap("calling 'add-node' with the valid binary path: %s"), execPath1) - ctx, cancel := context.WithTimeout(context.Background(), 15*time.Second) - resp, err := cli.AddNode(ctx, newParticipantNode, execPath1) - cancel() - gomega.Ω(err.Error()).Should(gomega.ContainSubstring("repeated node name")) - gomega.Ω(resp).Should(gomega.BeNil()) - ux.Print(log, logging.Green.Wrap("'add-node' failed as expected")) - }) - ginkgo.By("verify the newer subnet also has correct participants", func() { - ctx, cancel := context.WithTimeout(context.Background(), 15*time.Second) - defer cancel() - status, err := cli.Status(ctx) - gomega.Ω(err).Should(gomega.BeNil()) - subnetHasCorrectParticipants := utils.VerifySubnetHasCorrectParticipants(log, subnetParticipants2, status.ClusterInfo, newSubnetID) - gomega.Ω(subnetHasCorrectParticipants).Should(gomega.Equal(true)) - }) - }) - - ginkgo.It("can remove subnet validator", func() { - ginkgo.By("removing a subnet validator", func() { - ctx, cancel := context.WithTimeout(context.Background(), 2*time.Minute) - defer cancel() - testRemoveSubnetValidatorConfig := rpcpb.RemoveSubnetValidatorSpec{ - NodeNames: []string{"node2"}, - SubnetId: newSubnetID, - } - _, err := cli.RemoveSubnetValidator(ctx, []*rpcpb.RemoveSubnetValidatorSpec{&testRemoveSubnetValidatorConfig}) - gomega.Ω(err).Should(gomega.BeNil()) - }) - ginkgo.By("verify there are only two validators left for subnet", func() { - ctx, cancel := context.WithTimeout(context.Background(), 2*time.Minute) - defer cancel() - clientURIs, err := cli.URIs(ctx) - gomega.Ω(err).Should(gomega.BeNil()) - var clientURI string - for _, uri := range clientURIs { - clientURI = uri - break - } - subnetID, err := ids.FromString(newSubnetID) - gomega.Ω(err).Should(gomega.BeNil()) - platformCli := platformvm.NewClient(clientURI) - vdrs, err := platformCli.GetCurrentValidators(ctx, subnetID, nil) - gomega.Ω(err).Should(gomega.BeNil()) - gomega.Ω(len(vdrs)).Should(gomega.Equal(2)) - }) - }) - - ginkgo.It("transform subnet to elastic subnets", func() { - var elasticSubnetID string - ginkgo.By("add 1 subnet", func() { - ctx, cancel := context.WithTimeout(context.Background(), 2*time.Minute) - resp, err := cli.CreateSubnets(ctx, []*rpcpb.SubnetSpec{{}}) - cancel() - gomega.Ω(err).Should(gomega.BeNil()) - gomega.Ω(len(resp.SubnetIds)).Should(gomega.Equal(1)) - gomega.Ω(len(resp.ClusterInfo.Subnets)).Should(gomega.Equal(5)) - createdSubnetID = resp.SubnetIds[0] - }) - ginkgo.By("check expected non elastic status", func() { - ctx, cancel := context.WithTimeout(context.Background(), 15*time.Second) - status, err := cli.Status(ctx) - cancel() - gomega.Ω(err).Should(gomega.BeNil()) - subnetInfo := status.ClusterInfo.Subnets[createdSubnetID] - gomega.Ω(subnetInfo.IsElastic).Should(gomega.Equal(false)) - gomega.Ω(subnetInfo.ElasticSubnetId).Should(gomega.Equal(ids.Empty.String())) - }) - ginkgo.By("transform 1 subnet to elastic subnet", func() { - ctx, cancel := context.WithTimeout(context.Background(), 2*time.Minute) - defer cancel() - testElasticSubnetConfig.SubnetId = createdSubnetID - response, err := cli.TransformElasticSubnets(ctx, []*rpcpb.ElasticSubnetSpec{&testElasticSubnetConfig}) - gomega.Ω(err).Should(gomega.BeNil()) - gomega.Ω(len(response.TxIds)).Should(gomega.Equal(1)) - gomega.Ω(len(response.AssetIds)).Should(gomega.Equal(1)) - elasticAssetID = response.AssetIds[0] - }) - ginkgo.By("check expected elastic status", func() { - ctx, cancel := context.WithTimeout(context.Background(), 15*time.Second) - status, err := cli.Status(ctx) - cancel() - gomega.Ω(err).Should(gomega.BeNil()) - subnetInfo := status.ClusterInfo.Subnets[createdSubnetID] - gomega.Ω(subnetInfo.IsElastic).Should(gomega.Equal(true)) - gomega.Ω(subnetInfo.ElasticSubnetId).ShouldNot(gomega.Equal(ids.Empty.String())) - elasticSubnetID = subnetInfo.ElasticSubnetId - }) - ginkgo.By("transforming a subnet with same subnetID to elastic subnet will fail", func() { - ctx, cancel := context.WithTimeout(context.Background(), 2*time.Minute) - defer cancel() - testElasticSubnetConfig.SubnetId = createdSubnetID - _, err := cli.TransformElasticSubnets(ctx, []*rpcpb.ElasticSubnetSpec{&testElasticSubnetConfig}) - gomega.Ω(err).Should(gomega.HaveOccurred()) - }) - ginkgo.By("save snapshot with elastic info", func() { - ctx, cancel := context.WithTimeout(context.Background(), 15*time.Second) - _, err := cli.SaveSnapshot(ctx, "elastic_snapshot") - cancel() - gomega.Ω(err).Should(gomega.BeNil()) - }) - ginkgo.By("load snapshot with elastic info", func() { - ctx, cancel := context.WithTimeout(context.Background(), 2*time.Minute) - _, err := cli.LoadSnapshot(ctx, "elastic_snapshot") - cancel() - gomega.Ω(err).Should(gomega.BeNil()) - }) - ginkgo.By("check expected elastic status", func() { - ctx, cancel := context.WithTimeout(context.Background(), 15*time.Second) - status, err := cli.Status(ctx) - cancel() - gomega.Ω(err).Should(gomega.BeNil()) - subnetInfo := status.ClusterInfo.Subnets[createdSubnetID] - gomega.Ω(subnetInfo.IsElastic).Should(gomega.Equal(true)) - gomega.Ω(subnetInfo.ElasticSubnetId).Should(gomega.Equal(elasticSubnetID)) - }) - ginkgo.By("remove snapshot with elastic info", func() { - ctx, cancel := context.WithTimeout(context.Background(), 15*time.Second) - _, err := cli.RemoveSnapshot(ctx, "elastic_snapshot") - cancel() - gomega.Ω(err).Should(gomega.BeNil()) - }) - }) - - ginkgo.It("add permissionless validator to elastic subnets", func() { - ginkgo.By("adding a permissionless validator to elastic subnet", func() { - ctx, cancel := context.WithTimeout(context.Background(), 2*time.Minute) - defer cancel() - testValidatorConfig.SubnetId = createdSubnetID - testValidatorConfig.AssetId = elasticAssetID - testValidatorConfig.NodeName = "permissionlessNode" - _, err := cli.AddPermissionlessValidator(ctx, []*rpcpb.PermissionlessValidatorSpec{&testValidatorConfig}) - gomega.Ω(err).Should(gomega.BeNil()) - }) - }) - - ginkgo.It("snapshots + blockchain creation", func() { - var originalUris []string - var originalSubnets []string - ginkgo.By("get original URIs", func() { - ctx, cancel := context.WithTimeout(context.Background(), 15*time.Second) - var err error - originalUris, err = cli.URIs(ctx) - cancel() - gomega.Ω(err).Should(gomega.BeNil()) - gomega.Ω(len(originalUris)).Should(gomega.Equal(8)) - }) - ginkgo.By("get original subnets", func() { - ctx, cancel := context.WithTimeout(context.Background(), 15*time.Second) - status, err := cli.Status(ctx) - cancel() - gomega.Ω(err).Should(gomega.BeNil()) - numSubnets := len(status.ClusterInfo.Subnets) - gomega.Ω(numSubnets).Should(gomega.Equal(5)) - originalSubnets = maps.Keys(status.ClusterInfo.Subnets) - }) - ginkgo.By("check there are no snapshots", func() { - ctx, cancel := context.WithTimeout(context.Background(), 15*time.Second) - snapshotNames, err := cli.GetSnapshotNames(ctx) - cancel() - gomega.Ω(err).Should(gomega.BeNil()) - gomega.Ω(snapshotNames).Should(gomega.Equal([]string(nil))) - }) - ginkgo.By("can save snapshot", func() { - ctx, cancel := context.WithTimeout(context.Background(), 15*time.Second) - _, err := cli.SaveSnapshot(ctx, "pepe") - cancel() - gomega.Ω(err).Should(gomega.BeNil()) - }) - ginkgo.By("wait fail for stopped network", func() { - ctx, cancel := context.WithTimeout(context.Background(), 2*time.Minute) - _, err := cli.Health(ctx) - cancel() - gomega.Ω(err.Error()).Should(gomega.ContainSubstring(server.ErrNotBootstrapped.Error())) - }) - ginkgo.By("load fail for unknown snapshot", func() { - ctx, cancel := context.WithTimeout(context.Background(), 2*time.Minute) - _, err := cli.LoadSnapshot(ctx, "papa") - cancel() - gomega.Ω(err.Error()).Should(gomega.ContainSubstring("snapshot not found")) - }) - ginkgo.By("can load snapshot", func() { - ctx, cancel := context.WithTimeout(context.Background(), 2*time.Minute) - _, err := cli.LoadSnapshot(ctx, "pepe") - cancel() - gomega.Ω(err).Should(gomega.BeNil()) - }) - ginkgo.By("check URIs", func() { - ctx, cancel := context.WithTimeout(context.Background(), 15*time.Second) - var err error - uris, err := cli.URIs(ctx) - cancel() - gomega.Ω(err).Should(gomega.BeNil()) - gomega.Ω(uris).Should(gomega.Equal(originalUris)) - }) - ginkgo.By("check subnets", func() { - ctx, cancel := context.WithTimeout(context.Background(), 15*time.Second) - status, err := cli.Status(ctx) - cancel() - gomega.Ω(err).Should(gomega.BeNil()) - subnetIDs := maps.Keys(status.ClusterInfo.Subnets) - sort.Strings(subnetIDs) - sort.Strings(originalSubnets) - gomega.Ω(subnetIDs).Should(gomega.Equal(originalSubnets)) - }) - ginkgo.By("save fail for already saved snapshot", func() { - ctx, cancel := context.WithTimeout(context.Background(), 15*time.Second) - _, err := cli.SaveSnapshot(ctx, "pepe") - cancel() - gomega.Ω(err.Error()).Should(gomega.ContainSubstring("snapshot \"pepe\" already exists")) - }) - ginkgo.By("check there is a snapshot", func() { - ctx, cancel := context.WithTimeout(context.Background(), 15*time.Second) - snapshotNames, err := cli.GetSnapshotNames(ctx) - cancel() - gomega.Ω(err).Should(gomega.BeNil()) - gomega.Ω(snapshotNames).Should(gomega.Equal([]string{"pepe"})) - }) - ginkgo.By("can remove snapshot", func() { - ctx, cancel := context.WithTimeout(context.Background(), 15*time.Second) - _, err := cli.RemoveSnapshot(ctx, "pepe") - cancel() - gomega.Ω(err).Should(gomega.BeNil()) - }) - ginkgo.By("check there are no snapshots", func() { - ctx, cancel := context.WithTimeout(context.Background(), 15*time.Second) - snapshotNames, err := cli.GetSnapshotNames(ctx) - cancel() - gomega.Ω(err).Should(gomega.BeNil()) - gomega.Ω(snapshotNames).Should(gomega.Equal([]string(nil))) - }) - ginkgo.By("remove fail for unknown snapshot", func() { - ctx, cancel := context.WithTimeout(context.Background(), 15*time.Second) - _, err := cli.RemoveSnapshot(ctx, "pepe") - cancel() - gomega.Ω(err.Error()).Should(gomega.ContainSubstring("snapshot not found")) - }) - }) -}) diff --git a/zapwire/types/types.go b/zapwire/types/types.go index 8698be15..9665f6fc 100644 --- a/zapwire/types/types.go +++ b/zapwire/types/types.go @@ -594,7 +594,7 @@ func (a *AttachPeerResponse) Decode(rd *zap.Reader) error { } // SendOutboundMessageRequest matches rpcpb.SendOutboundMessageRequest. -// The proto field is named `bytes` (the AVM/p2p message body); we use +// The proto field is named `bytes` (the XVM/p2p message body); we use // MsgBody to avoid collision with the Go builtin. type SendOutboundMessageRequest struct { NodeName string