From aed7f767bb399d36a1db1922d9c028663297e052 Mon Sep 17 00:00:00 2001 From: Dmitrii Golubev Date: Wed, 8 Jun 2022 14:28:32 +0200 Subject: [PATCH] backport: merge result of tendermint/master with v0.8-dev (#376) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * update abci cli test output (#8070) * consensus: fix TestInvalidState race and reporting (#8071) * proxy: collapse triforcated abci.Client (#8067) * build(deps): Bump actions/checkout from 2.4.0 to 3 (#8076) Bumps [actions/checkout](https://github.com/actions/checkout) from 2.4.0 to 3.
Release notes

Sourced from actions/checkout's releases.

v3.0.0

  • Update default runtime to node16
Changelog

Sourced from actions/checkout's changelog.

Changelog

v2.3.1

v2.3.0

v2.2.0

v2.1.1

  • Changes to support GHES (here and here)

v2.1.0

v2.0.0

v2 (beta)

  • Improved fetch performance
    • The default behavior now fetches only the SHA being checked-out
  • Script authenticated git commands
    • Persists with.token in the local git config
    • Enables your scripts to run authenticated git commands
    • Post-job cleanup removes the token
    • Coming soon: Opt out by setting with.persist-credentials to false
  • Creates a local branch
    • No longer detached HEAD when checking out a branch
    • A local branch is created with the corresponding upstream branch set
  • Improved layout

... (truncated)

Commits

[![Dependabot compatibility score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=actions/checkout&package-manager=github_actions&previous-version=2.4.0&new-version=3)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores) Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`. [//]: # (dependabot-automerge-start) [//]: # (dependabot-automerge-end) ---
Dependabot commands and options
You can trigger Dependabot actions by commenting on this PR: - `@dependabot rebase` will rebase this PR - `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it - `@dependabot merge` will merge this PR after your CI passes on it - `@dependabot squash and merge` will squash and merge this PR after your CI passes on it - `@dependabot cancel merge` will cancel a previously requested merge and block automerging - `@dependabot reopen` will reopen this PR if it is closed - `@dependabot close` will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually - `@dependabot ignore this major version` will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this minor version` will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this dependency` will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
* build(deps): Bump docker/login-action from 1.13.0 to 1.14.1 (#8075) Bumps [docker/login-action](https://github.com/docker/login-action) from 1.13.0 to 1.14.1.
Release notes

Sourced from docker/login-action's releases.

v1.14.1

  • Revert to Node 12 as default runtime to fix issue for GHE users (#160)

v1.14.0

  • Update to node 16 (#158)
  • Bump @​aws-sdk/client-ecr from 3.45.0 to 3.53.0 (#157)
  • Bump @​aws-sdk/client-ecr-public from 3.45.0 to 3.53.0 (#156)
Commits

[![Dependabot compatibility score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=docker/login-action&package-manager=github_actions&previous-version=1.13.0&new-version=1.14.1)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores) Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`. [//]: # (dependabot-automerge-start) [//]: # (dependabot-automerge-end) ---
Dependabot commands and options
You can trigger Dependabot actions by commenting on this PR: - `@dependabot rebase` will rebase this PR - `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it - `@dependabot merge` will merge this PR after your CI passes on it - `@dependabot squash and merge` will squash and merge this PR after your CI passes on it - `@dependabot cancel merge` will cancel a previously requested merge and block automerging - `@dependabot reopen` will reopen this PR if it is closed - `@dependabot close` will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually - `@dependabot ignore this major version` will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this minor version` will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this dependency` will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
* build(deps): Bump golangci/golangci-lint-action from 2.5.2 to 3.1.0 (#8074) Bumps [golangci/golangci-lint-action](https://github.com/golangci/golangci-lint-action) from 2.5.2 to 3.1.0.
Release notes

Sourced from golangci/golangci-lint-action's releases.

v3.1.0

What's Changed

New features

CI

Dependabot

Misc

New Contributors

Full Changelog: https://github.com/golangci/golangci-lint-action/compare/v3...v3.1.0

v3.0.0

What's Changed

New Contributors

Full Changelog: https://github.com/golangci/golangci-lint-action/compare/v2...v3.0.0

Commits

[![Dependabot compatibility score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=golangci/golangci-lint-action&package-manager=github_actions&previous-version=2.5.2&new-version=3.1.0)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores) Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`. [//]: # (dependabot-automerge-start) [//]: # (dependabot-automerge-end) ---
Dependabot commands and options
You can trigger Dependabot actions by commenting on this PR: - `@dependabot rebase` will rebase this PR - `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it - `@dependabot merge` will merge this PR after your CI passes on it - `@dependabot squash and merge` will squash and merge this PR after your CI passes on it - `@dependabot cancel merge` will cancel a previously requested merge and block automerging - `@dependabot reopen` will reopen this PR if it is closed - `@dependabot close` will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually - `@dependabot ignore this major version` will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this minor version` will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this dependency` will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
* Fix govet errors for %w use in test errors. (#8083) The %w syntax is a fmt.Errorf thing, not supported by the testing package. * evidence: manage and initialize state objects more clearly in the pool (#8080) * statesync: avoid leaking a thread during tests (#8085) * statesync: avoid leaking a thread during tests * fix * Fix YAML front matter. (#8086) Fixes #8052 again. Ideally we would have some way of detecting that this happens before merging, but the way we build docs right now is kind of complicated. * abci++ spec: reorganizing basic concepts, adding outline for easy navigation (#8048) * reorganizing basic concepts, adding outline to navigate easy * Update spec/abci++/README.md Co-authored-by: Sergio Mena * Update spec/abci++/abci++_basic_concepts_002_draft.md Co-authored-by: Sergio Mena * Update spec/abci++/abci++_basic_concepts_002_draft.md Co-authored-by: Sergio Mena * Update spec/abci++/abci++_basic_concepts_002_draft.md Co-authored-by: Sergio Mena * Update spec/abci++/abci++_basic_concepts_002_draft.md Co-authored-by: Sergio Mena * Update spec/abci++/abci++_basic_concepts_002_draft.md Co-authored-by: Sergio Mena * Update spec/abci++/abci++_basic_concepts_002_draft.md Co-authored-by: Sergio Mena * Update spec/abci++/abci++_basic_concepts_002_draft.md Co-authored-by: Sergio Mena * Update spec/abci++/abci++_basic_concepts_002_draft.md Co-authored-by: Sergio Mena * Update spec/abci++/abci++_basic_concepts_002_draft.md Co-authored-by: M. J. Fromberger * Update spec/abci++/abci++_basic_concepts_002_draft.md Co-authored-by: M. J. Fromberger * Update spec/abci++/abci++_basic_concepts_002_draft.md Co-authored-by: M. J. Fromberger * address problem with snapshot list data type * Update spec/abci++/abci++_basic_concepts_002_draft.md Co-authored-by: M. J. Fromberger * Update spec/abci++/abci++_basic_concepts_002_draft.md Co-authored-by: M. J. Fromberger * Update spec/abci++/abci++_basic_concepts_002_draft.md Co-authored-by: M. J. Fromberger * Update spec/abci++/abci++_basic_concepts_002_draft.md Co-authored-by: William Banfield <4561443+williambanfield@users.noreply.github.com> * Update spec/abci++/abci++_basic_concepts_002_draft.md Co-authored-by: M. J. Fromberger * clarify handling events in same-execution model * remove outdated text about vote extension singing * clarification apphash state-sync Co-authored-by: Sergio Mena Co-authored-by: M. J. Fromberger Co-authored-by: William Banfield <4561443+williambanfield@users.noreply.github.com> * node: pass eventbus at construction time (#8084) * node: pass eventbus at construction time * remove cruft * cmd: make reset more safe (#8081) * add safe reset * undo change * remove unsafe * Update cmd/tendermint/commands/reset_priv_validator.go Co-authored-by: Thane Thomson * Update cmd/tendermint/commands/reset_priv_validator.go Co-authored-by: M. J. Fromberger * remove export comment Co-authored-by: Thane Thomson Co-authored-by: M. J. Fromberger * Update pending changelog for #8081. (#8093) * service: add NopService and use for PexReactor (#8100) * build(deps): Bump google.golang.org/grpc from 1.44.0 to 1.45.0 (#8104) Bumps [google.golang.org/grpc](https://github.com/grpc/grpc-go) from 1.44.0 to 1.45.0.
Release notes

Sourced from google.golang.org/grpc's releases.

Release 1.45.0

Bug Fixes

  • xds/clusterresolver: pass cluster name to DNS child policy to be used in creds handshake (#5119)
  • reflection: support dynamic messages (#5180)

Performance Improvements

Behavior Changes

  • server: convert context errors returned by service handlers to status with the correct status code (Canceled or DeadlineExceeded), instead of Unknown (#5156)

New Features

  • reflection: add NewServer(ServerOptions) for creating a reflection server with advanced customizations (#5197)
  • xds: support federation (#5128)
  • xds/resource: accept Self as LDS's RDS config source and CDS's EDS config source (#5152)
  • xds/bootstrap: add plugin system for credentials specified in bootstrap file (#5136)
Commits
  • a82cc96 Change version to 1.45.0 (#5202)
  • 011544f authz: add additional logs to sdk authz (#5094)
  • 18564ff reflection: improve server implementation (#5197)
  • ec717ca xds: minor cleanup in xdsclient bootstrap code (#5195)
  • ebc30b8 reflection: use protobuf/reflect instead of go reflection, fix dynamic messag...
  • 46009ac transport: Add an Unwrap method to ConnectionError (#5148)
  • 75fd024 remove sdk term from grpc authz (#5191)
  • a354b1e channelz: rename NewChannelzStorage to NewChannelzStorageForTesting (#5190)
  • 0e05549 Format directory/file references (#5184)
  • c44f627 cleanup: replace grpc.WithInsecure with insecure.NewCredentials (#5177)
  • Additional commits viewable in compare view

[![Dependabot compatibility score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=google.golang.org/grpc&package-manager=go_modules&previous-version=1.44.0&new-version=1.45.0)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores) Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`. [//]: # (dependabot-automerge-start) [//]: # (dependabot-automerge-end) ---
Dependabot commands and options
You can trigger Dependabot actions by commenting on this PR: - `@dependabot rebase` will rebase this PR - `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it - `@dependabot merge` will merge this PR after your CI passes on it - `@dependabot squash and merge` will squash and merge this PR after your CI passes on it - `@dependabot cancel merge` will cancel a previously requested merge and block automerging - `@dependabot reopen` will reopen this PR if it is closed - `@dependabot close` will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually - `@dependabot ignore this major version` will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this minor version` will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this dependency` will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
* p2p+flowrate: rate control refactor (#7828) Adding `CurrentTransferRate ` in the flowrate package because only the status of the transfer rate has been used. * build(deps): Bump github.com/spf13/cobra from 1.3.0 to 1.4.0 (#8109) Bumps [github.com/spf13/cobra](https://github.com/spf13/cobra) from 1.3.0 to 1.4.0.
Release notes

Sourced from github.com/spf13/cobra's releases.

v1.4.0

Winter 2022 Release ❄️

Another season, another release!

Goodbye viper! 🐍 🚀

The core Cobra library no longer requires Viper and all of its indirect dependencies. This means that Cobra's dependency tree has been drastically thinned! The Viper dependency was included because of the cobra CLI generation tool. This tool has migrated to spf13/cobra-cli.

It's pretty unlikely you were importing and using the bootstrapping CLI tool as part of your application (after all, it's just a tool to get going with core cobra).

But if you were, replace occurrences of

"github.com/spf13/cobra/cobra"

with

"github.com/spf13/cobra-cli"

And in your go.mod, you'll want to also include this dependency:

github.com/spf13/cobra-cli v1.3.0

Again, the maintainers do not anticipate this being a breaking change to users of the core cobra library, so minimal work should be required for users to integrate with this new release. Moreover, this means the dependency tree for your application using Cobra should no longer require dependencies that were inherited from Viper. Huzzah! 🥳

If you'd like to read more

Documentation 📝

Other 💭

Shoutout to our awesome contributors helping to make this cobra release possible!! @​spf13 @​marckhouzam @​johnSchnake @​jpmcb @​liggitt @​umarcor @​hiljusti @​marians @​shyim @​htroisi

Changelog

Sourced from github.com/spf13/cobra's changelog.

Cobra Changelog

v1.1.3

  • Fix: release-branch.cobra1.1 only: Revert "Deprecate Go < 1.14" to maintain backward compatibility

v1.1.2

Notable Changes

  • Bump license year to 2021 in golden files (#1309) @​Bowbaq
  • Enhance PowerShell completion with custom comp (#1208) @​Luap99
  • Update gopkg.in/yaml.v2 to v2.4.0: The previous breaking change in yaml.v2 v2.3.0 has been reverted, see go-yaml/yaml#670
  • Documentation readability improvements (#1228 etc.) @​zaataylor etc.
  • Use golangci-lint: Repair warnings and errors resulting from linting (#1044) @​umarcor

v1.1.1

  • Fix: yaml.v2 2.3.0 contained a unintended breaking change. This release reverts to yaml.v2 v2.2.8 which has recent critical CVE fixes, but does not have the breaking changes. See spf13/cobra#1259 for context.
  • Fix: correct internal formatting for go-md2man v2 (which caused man page generation to be broken). See spf13/cobra#1049 for context.

v1.1.0

Notable Changes

  • Extend Go completions and revamp zsh comp (#1070)
  • Fix man page doc generation - no auto generated tag when cmd.DisableAutoGenTag = true (#1104) @​jpmcb
  • Add completion for help command (#1136)
  • Complete subcommands when TraverseChildren is set (#1171)
  • Fix stderr printing functions (#894)
  • fix: fish output redirection (#1247)

v1.0.0

Announcing v1.0.0 of Cobra. 🎉

Notable Changes

... (truncated)

Commits

[![Dependabot compatibility score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=github.com/spf13/cobra&package-manager=go_modules&previous-version=1.3.0&new-version=1.4.0)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores) Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`. [//]: # (dependabot-automerge-start) [//]: # (dependabot-automerge-end) ---
Dependabot commands and options
You can trigger Dependabot actions by commenting on this PR: - `@dependabot rebase` will rebase this PR - `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it - `@dependabot merge` will merge this PR after your CI passes on it - `@dependabot squash and merge` will squash and merge this PR after your CI passes on it - `@dependabot cancel merge` will cancel a previously requested merge and block automerging - `@dependabot reopen` will reopen this PR if it is closed - `@dependabot close` will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually - `@dependabot ignore this major version` will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this minor version` will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this dependency` will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
* p2p: update polling interval calculation for PEX requests (#8106) The PEX reactor has a simple feedback control mechanism to decide how often to poll peers for peer address updates. The idea is to poll more frequently when knowledge of the network is less, and decrease frequency as knowledge grows. This change solves two problems: 1. It is possible in some cases we may poll a peer "too often" and get dropped by that peer for spamming. 2. The first successful peer update with any content resets the polling timer to a very long time (10m), meaning if we are unlucky in getting an incomplete reply while the network is small, we may not try again for a very long time. This may contribute to difficulties bootstrapping sync. The main change here is to only update the interval when new information is added to the system, and not (as before) whenever a request is sent out to a peer. The rate computation is essentially the same as before, although the code has been a bit simplified, and I consolidated some of the error handling so that we don't have to check in multiple places for the same conditions. Related changes: - Improve error diagnostics for too-soon and overflow conditions. - Clean up state handling in the poll interval computation. - Pin the minimum interval avert a chance of PEX spamming a peer. * p2p: remove unnecessary panic handling in PEX reactor (#8110) The message handling in this reactor is all under control of the reactor itself, and does not call out to callbacks or other externally-supplied code. It doesn't need to check for panics. - Remove an irrelevant channel ID check. - Remove an unnecessary panic recovery wrapper. * proto: update proto generation to use buf (#7975) * Hard-code go_package option for .proto files Signed-off-by: Thane Thomson * Automatically relocate generated ABCI types after proto-gen Signed-off-by: Thane Thomson * Skip building gogoproto (i.e. only build our types) Signed-off-by: Thane Thomson * Remove unnecessary proto generation scripts Signed-off-by: Thane Thomson * Upgrade buf config from v1beta1 to v1 Signed-off-by: Thane Thomson * Add simple proto generation script Signed-off-by: Thane Thomson * Replace buf-based protobuf generation with simple protoc-based approach Signed-off-by: Thane Thomson * Remove custom buf-based Docker image generation config and Dockerfile Signed-off-by: Thane Thomson * Adopt Cosmos SDK's approach to Protobuf linting and breakage checking in CI Signed-off-by: Thane Thomson * Suppress command echo when running proto checks Signed-off-by: Thane Thomson * Fix proto-check workflow YAML indentation Signed-off-by: Thane Thomson * Restore proto-format target Signed-off-by: Thane Thomson * Replace custom BASH script with make equivalent Signed-off-by: Thane Thomson * Remove proto linting/breaking changes CI checks after discussion today Signed-off-by: Thane Thomson * Remove dangling reference to CI workflow that no longer exists Signed-off-by: Thane Thomson * Update contributing guidelines relating to protos Signed-off-by: Thane Thomson * Use buf instead for generating protos Signed-off-by: Thane Thomson * Remove unused buf config for gogoprotobuf Signed-off-by: Thane Thomson * Add reminder for if we migrate fully to buf Signed-off-by: Thane Thomson * Restore protopackage script for #8065 Signed-off-by: Thane Thomson * Fix permissions on protopackage script Signed-off-by: Thane Thomson * Update contributing guidelines to show building of protos using buf Signed-off-by: Thane Thomson * Fix breaking changes check and add disclaimer Signed-off-by: Thane Thomson * Expand on contributing guidelines for clarity Signed-off-by: Thane Thomson * Re-remove old proto workflows Signed-off-by: Thane Thomson * Add buf-based proto linting workflow in CI Signed-off-by: Thane Thomson * Superficially reorder proto targets Signed-off-by: Thane Thomson * Fix proto lints Signed-off-by: Thane Thomson * Fix GA workflow YAML indentation Signed-off-by: Thane Thomson * Temporarily use forked version of mlc Use forked version of markdown-link-check until https://github.com/gaurav-nelson/github-action-markdown-link-check/pull/126 lands. Signed-off-by: Thane Thomson * Temporarily disable markdown link checker Signed-off-by: Thane Thomson * Remove gogo protos - superseded by version from buf registry Signed-off-by: Thane Thomson * consensus: ensure the node terminates on consensus failure (#8111) Updates #8077. The panic handler for consensus currently attempts to effect a clean shutdown, but this can leave a failed node running in an unknown state for an arbitrary amount of time after the failure. Since a panic at this point means consensus is already irrecoverably broken, we should not allow the node to continue executing. After making a best effort to shut down the writeahead log, re-panic to ensure the node will terminate before any further state transitions are processed. Even with this change, it is possible some transitions may occur while the cleanup is happening. It might be preferable to abort unconditionally without any attempt at cleanup. Related changes: - Clean up the creation of WAL directories. - Filter WAL close errors at rethrow. * Update abci++_basic_concepts_002_draft.md (#8114) Minor Typo (nice doc!) * minor typo in docs (#8116) * readme: add vocdoni (#8117) Add Vocdoni under applications section on the README. * rfc: RFC 015 ABCI++ Tx Mutation (#8033) This pull requests adds an RFC to discuss the proposed mechanism for transaction replacement detailed in the ABCI++ specification. * node: cleanup evidence db (#8119) * libs/log: remove Must constructor (#8120) * libs/log: remove Must constructor * Update test/e2e/node/main.go Co-authored-by: M. J. Fromberger * use stdlog Co-authored-by: M. J. Fromberger * cleanup: remove commented code (#8123) * autofile: reduce minor panic and docs changes (#8122) * autofile: reduce minor panic and docs changes * fix lint * ADR: Protocol Buffers Management (#8029) * First draft of protobuf management ADR Signed-off-by: Thane Thomson * Pre-emptively add ADR to "Accepted" section in README Signed-off-by: Thane Thomson * Add missing prototool link Signed-off-by: Thane Thomson * Elaborate on positive consequences of decision Signed-off-by: Thane Thomson * Add clang-format GA to detailed design Signed-off-by: Thane Thomson * Fix broken link Signed-off-by: Thane Thomson * Add notes on automated docs generation Signed-off-by: Thane Thomson * Rewording and restructuring for clarity Signed-off-by: Thane Thomson * Grammatical fixes and elaborations Signed-off-by: Thane Thomson * Revise wording for clarity Signed-off-by: Thane Thomson * Address comments Signed-off-by: Thane Thomson * Update ADR to reflect current consensus on Buf Signed-off-by: Thane Thomson * Minor grammar fix Signed-off-by: Thane Thomson Co-authored-by: M. J. Fromberger * abci++: synchronize PrepareProposal with the newest version of the spec (#8094) This change implements the logic for the PrepareProposal ABCI++ method call. The main logic for creating and issuing the PrepareProposal request lives in execution.go and is tested in a set of new tests in execution_test.go. This change also updates the mempool mock to use a mockery generated version and removes much of the plumbing for the no longer used ABCIResponses. * abci++: remove app_signed_updates (#8128) * state: avoid panics for marshaling errors (#8125) * build(deps): Bump github.com/stretchr/testify from 1.7.0 to 1.7.1 (#8131) Bumps [github.com/stretchr/testify](https://github.com/stretchr/testify) from 1.7.0 to 1.7.1.
Commits
  • 083ff1c Fixed didPanic to now detect panic(nil).
  • 1e36bfe Use cross Go version compatible build tag syntax
  • e798dc2 Add docs on 1.17 build tags
  • 83198c2 assert: guard CanConvert call in backward compatible wrapper
  • 087b655 assert: allow comparing time.Time
  • 7bcf74e fix msgAndArgs forwarding
  • c29de71 add tests for correct msgAndArgs forwarding
  • f87e2b2 Update builds
  • ab6dc32 fix linting errors in /assert package
  • edff5a0 fix funtion name
  • Additional commits viewable in compare view

[![Dependabot compatibility score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=github.com/stretchr/testify&package-manager=go_modules&previous-version=1.7.0&new-version=1.7.1)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores) Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`. [//]: # (dependabot-automerge-start) [//]: # (dependabot-automerge-end) ---
Dependabot commands and options
You can trigger Dependabot actions by commenting on this PR: - `@dependabot rebase` will rebase this PR - `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it - `@dependabot merge` will merge this PR after your CI passes on it - `@dependabot squash and merge` will squash and merge this PR after your CI passes on it - `@dependabot cancel merge` will cancel a previously requested merge and block automerging - `@dependabot reopen` will reopen this PR if it is closed - `@dependabot close` will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually - `@dependabot ignore this major version` will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this minor version` will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this dependency` will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
* libs/clist: remove unused surface area (#8134) * libs/events: remove unneccessary unsubscription code (#8135) The events switch code is largely vestigal and is responsible for wiring between the consensus state machine and the consensus reactor. While there might have been a need, historicallly to managed these subscriptions at runtime, it's nolonger used: subscriptions are registered during startup, and then the switch shuts down at at the end. Eventually the EventSwitch should be replaced by a much smaller implementation of an eventloop in the consensus state machine, but cutting down on the scope of the event switch will help clarify the requirements from the consensus side. * blocksync: drop redundant shutdown mechanisms (#8136) * mempool: test harness should expose application (#8143) This is minor, but I was trying to write a test and realized that the application reference in the harness isn't actually used, which is quite confusing. * types: update synchrony params to match checked in proto (#8142) The `.proto` file do not have the `nullable = false` annotation present on the `SynchronyParams` durations. This pull request updates the `SynchronyParams` to match the checked in proto files. Note, this does not make the code buildable against the latest protos. This pull request was achieved by checking out all files _not relevant_ to the `SynchronyParams` and removing the new `TimeoutParams` from the the `params.proto` file. Future updates will add these back. This pull request also adds a `nil` check to the `pbParams.Synchrony` field in `ConsensusParamsFromProto`. Old versions of Tendermint will not have the `Synchrony` parameters filled in so this code would panic on startup. We will fill in the empty fields with defaults, but per https://github.com/tendermint/tendermint/blob/master/docs/rfc/rfc-009-consensus-parameter-upgrades.md#only-update-hashedparams-on-hash-breaking-releases we will keep out of the hash during this release. * docs: PBTS synchrony issues runbook (#8129) closes: #7756 # What does this pull request change? This pull request adds a new runbook for operators enountering errors related to the new Proposer-Based Timestamps algorithm. The goal of this runbook is to give operators a set of clear steps that they can follow if they are having issues producing blocks because of clock synchronization problems. This pull request also renames the `*PrevoteDelay` metrics to drop the term `MessageDelay`. These metrics provide a combined view of `message_delay` + `synchrony` so the name may be confusing. # Questions to reviewers * Are there ways to make the set of steps clearer or are there any pieces that seem confusing? * consensus: avoid extra close channel (#8144) Saw this in a test panic, doesn't seem neccessary. * Docs: abci++ typo (#8147) * p2p: adjust max non-persistent peer score (#8137) Guarantee persistent peers have the highest connecting priority. The peerStore.Ranked returns an arbitrary order of peers with the same scores. * blocksync: remove intermediate channel (#8140) Based on local testing, I'm now convinced that this is ok, and also I think the fact that the new p2p layer has more caching and queue. * events: remove service aspects of event switch (#8146) * consensus: avoid persistent kvstore in tests (#8148) * consensus: avoid race in accessing channel (#8149) * autofile: remove vestigal close mechanism (#8150) * types: minor cleanup of un or minimally used types (#8154) * state: panic on ResponsePrepareProposal validation error (#8145) * state: panic on ResponsePrepareProposal validation error * lint++ Co-authored-by: Sam Kleinman Co-authored-by: mergify[bot] <37929162+mergify[bot]@users.noreply.github.com> * mempool: reduce size of test (#8152) This is failing intermittently, but it's a really simple test, and I suspect that we're just running into thread scheduling issues on CI nodes. I don't think making the test smaller reduces the utility of this test. * testing: logger cleanup (#8153) This contains two major changes: - Remove the legacy test logging method, and just explicitly call the noop logger. This is just to make the test logging behavior more coherent and clear. - Move the logging in the light package from the testing.T logger to the noop logger. It's really the case that we very rarely need/want to consider test logs unless we're doing reproductions and running a narrow set of tests. In most cases, I (for one) prefer to run in verbose mode so I can watch progress of tests, but I basically never need to consider logs. If I do want to see logs, then I can edit in the testing.T logger locally (which is what you have to do today, anyway.) * consensus: skip channel close during shutdown (#8155) I see this panic in tests occasionally, and I don't think there's any need to close this channel: - it's only sent to in one place which has a select case with a default clause, so there's no chance of deadlocks. - the only place we recieve from it thas a timeout. * consensus: change lock handling in reactor and handleMsg for RoundState (forward-port #7994 #7992) (#8139) Related to #8157 * node: always sync with the application at startup (#8159) * build(deps): Bump gaurav-nelson/github-action-markdown-link-check from 1.0.13 to 1.0.14 (#8166) Bumps [gaurav-nelson/github-action-markdown-link-check](https://github.com/gaurav-nelson/github-action-markdown-link-check) from 1.0.13 to 1.0.14.
Release notes

Sourced from gaurav-nelson/github-action-markdown-link-check's releases.

1.0.14

Changes

Thank you @​thanethomson @​edumco

Commits

[![Dependabot compatibility score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=gaurav-nelson/github-action-markdown-link-check&package-manager=github_actions&previous-version=1.0.13&new-version=1.0.14)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores) Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`. [//]: # (dependabot-automerge-start) [//]: # (dependabot-automerge-end) ---
Dependabot commands and options
You can trigger Dependabot actions by commenting on this PR: - `@dependabot rebase` will rebase this PR - `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it - `@dependabot merge` will merge this PR after your CI passes on it - `@dependabot squash and merge` will squash and merge this PR after your CI passes on it - `@dependabot cancel merge` will cancel a previously requested merge and block automerging - `@dependabot reopen` will reopen this PR if it is closed - `@dependabot close` will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually - `@dependabot ignore this major version` will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this minor version` will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this dependency` will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
* build(deps): Bump docker/build-push-action from 2.9.0 to 2.10.0 (#8167) Bumps [docker/build-push-action](https://github.com/docker/build-push-action) from 2.9.0 to 2.10.0.
Release notes

Sourced from docker/build-push-action's releases.

v2.10.0

  • Add imageid output and use metadata to set digest output (#569)
  • Add build-contexts input (#563)
  • Enhance outputs display (#559)
Commits
  • ac9327e Merge pull request #563 from crazy-max/new-inputs
  • 7c41daf build-contexts input
  • e115266 Merge pull request #569 from crazy-max/imageid-digest
  • 50fa005 add imageid output and use metadata to set digest output
  • 309fb91 Merge pull request #568 from docker/dependabot/github_actions/actions/checkout-3
  • db68526 Bump actions/checkout from 2 to 3
  • fe02965 Merge pull request #559 from crazy-max/outputs
  • 5af8693 Enhance outputs display
  • See full diff in compare view

[![Dependabot compatibility score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=docker/build-push-action&package-manager=github_actions&previous-version=2.9.0&new-version=2.10.0)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores) Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`. [//]: # (dependabot-automerge-start) [//]: # (dependabot-automerge-end) ---
Dependabot commands and options
You can trigger Dependabot actions by commenting on this PR: - `@dependabot rebase` will rebase this PR - `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it - `@dependabot merge` will merge this PR after your CI passes on it - `@dependabot squash and merge` will squash and merge this PR after your CI passes on it - `@dependabot cancel merge` will cancel a previously requested merge and block automerging - `@dependabot reopen` will reopen this PR if it is closed - `@dependabot close` will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually - `@dependabot ignore this major version` will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this minor version` will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this dependency` will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
* consensus: reduce size of test fixtures and logging rate (#8172) We can reduce the size of test fixtures (which will improve test reliability) without impacting these tests' primary role (which is correctness.) Also reducing these test logging will make the tests easier to read, which whill be a good quality of life improvement for devs. * state: propogate error from state store (#8171) * state: propogate error from state store * fix lint * ABCI++: Update new protos to use enum instead of bool (#8158) closes: #8039 This pull request updates the new ABCI++ protos to use `enum`s in place of `bool`s. `enums` may be preferred over `bool` because an `enum` can be udpated to include new statuses in the future, whereas a `bool` cannot and is fixed as just `true` or `false` over the whole lifecycle of the API. * rollback: cleanup second node during test (#8175) * build(deps): Bump github.com/golangci/golangci-lint from 1.44.2 to 1.45.0 (#8169) Bumps [github.com/golangci/golangci-lint](https://github.com/golangci/golangci-lint) from 1.44.2 to 1.45.0.
Release notes

Sourced from github.com/golangci/golangci-lint's releases.

v1.45.0

Changelog

  • ea1df6f1 Default to YAML when config file has no extension (#2618)
  • 93a0015c build(deps): bump actions/checkout from 2 to 3 (#2643)
  • 176ef3f7 build(deps): bump actions/setup-node from 2 to 3 (#2628)
  • adc0d8ec build(deps): bump github.com/ashanbrown/makezero from 1.1.0 to 1.1.1 (#2621)
  • 8f9bc4a7 build(deps): bump github.com/daixiang0/gci from 0.3.1 to 0.3.2 (#2640)
  • 6fc688ae build(deps): bump github.com/securego/gosec/v2 from 2.9.6 to 2.10.0 (#2624)
  • da08d2bd build(deps): bump github.com/shirou/gopsutil/v3 from 3.22.1 to 3.22.2 (#2641)
  • 873a27e7 build(deps): bump github.com/sivchari/containedctx from 1.0.1 to 1.0.2 (#2623)
  • ec952367 build(deps): bump github.com/spf13/cobra from 1.3.0 to 1.4.0 (#2646)
  • 0e7233eb build(deps): bump github.com/tomarrell/wrapcheck/v2 from 2.4.0 to 2.5.0 (#2603)
  • 0bcc0a3b build(deps): bump golangci/golangci-lint-action from 2.5.2 to 3.1.0 (#2627)
  • 5ffadacb build(deps): bump mvdan.cc/gofumpt from 0.2.1 to 0.3.0 (#2622)
  • d5ebd7eb build(deps): bump node-fetch in /.github/contributors (#2616)
  • 5ddb5e7a bump github.com/daixiang0/gci to v0.3.1 (#2596)
  • 56d77e2b bump github.com/denis-tingaikin/go-header from 0.4.2 to 0.4.3 (#2614)
  • 2f689958 errcheck: add an option to remove default exclusions (#2607)
  • 1f4c1ed9 fix: completion for fish-shell
  • 0c0804c6 go1.18 support (#2438)
  • 42ca6449 gofumpt: add module-path setting (#2644)
  • 30c6166b revive: fix default values (#2611)
Changelog

Sourced from github.com/golangci/golangci-lint's changelog.

v1.45.0

  1. updated linters:
    • cobra: from 1.3.0 to 1.4.0
    • containedctx: from 1.0.1 to 1.0.2
    • errcheck: add an option to remove default exclusions
    • gci: from 0.3.1 to 0.3.2
    • go-header: from 0.4.2 to 0.4.3
    • gofumpt: add module-path setting
    • gofumpt: from 0.2.1 to 0.3.0
    • gopsutil: from 3.22.1 to 3.22.2
    • gosec: from 2.9.6 to 2.10.0
    • makezero: from 1.1.0 to 1.1.1
    • revive: fix default values
    • wrapcheck: from 2.4.0 to 2.5.0
  2. documentation:
    • docs: add "back to the top" button
    • docs: add forbidigo example that uses comments
    • docs: improve linters page
  3. misc:
    • go1.18 support 🎉
    • Add an option to manage the targeted version of Go
    • Default to YAML when config file has no extension
Commits
  • 1f4c1ed fix: completion for fish-shell
  • 0c0804c go1.18 support (#2438)
  • ec95236 build(deps): bump github.com/spf13/cobra from 1.3.0 to 1.4.0 (#2646)
  • 42ca644 gofumpt: add module-path setting (#2644)
  • 93a0015 build(deps): bump actions/checkout from 2 to 3 (#2643)
  • d7b28ca build(deps): bump normalize-url from 4.5.0 to 4.5.1 in /docs (#2642)
  • da08d2b build(deps): bump github.com/shirou/gopsutil/v3 from 3.22.1 to 3.22.2 (#2641)
  • 8f9bc4a build(deps): bump github.com/daixiang0/gci from 0.3.1 to 0.3.2 (#2640)
  • 41646f2 build(deps): bump gatsby-plugin-manifest from 4.7.0 to 4.9.0 in /docs (#2635)
  • fdd7218 build(deps): bump @​emotion/react from 11.7.1 to 11.8.1 in /docs (#2634)
  • Additional commits viewable in compare view

[![Dependabot compatibility score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=github.com/golangci/golangci-lint&package-manager=go_modules&previous-version=1.44.2&new-version=1.45.0)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores) Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`. [//]: # (dependabot-automerge-start) [//]: # (dependabot-automerge-end) ---
Dependabot commands and options
You can trigger Dependabot actions by commenting on this PR: - `@dependabot rebase` will rebase this PR - `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it - `@dependabot merge` will merge this PR after your CI passes on it - `@dependabot squash and merge` will squash and merge this PR after your CI passes on it - `@dependabot cancel merge` will cancel a previously requested merge and block automerging - `@dependabot reopen` will reopen this PR if it is closed - `@dependabot close` will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually - `@dependabot ignore this major version` will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this minor version` will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this dependency` will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
* abci++: remove CheckTx call from PrepareProposal flow (#8176) * types: add TimeoutParams into ConsensusParams structs (#8177) * consensus: avoid panic during shutdown (#8170) * consensus: cleanup tempfile explictly (#8184) * consensus: add leaktest check to replay tests (#8185) * consensus: update state machine to use the new consensus params (#8181) * build(deps): Bump github.com/golangci/golangci-lint from 1.45.0 to 1.45.2 (#8192) Bumps [github.com/golangci/golangci-lint](https://github.com/golangci/golangci-lint) from 1.45.0 to 1.45.2.
Release notes

Sourced from github.com/golangci/golangci-lint's releases.

v1.45.2

Changelog

  • 8bdc4d3f fix: help command (#2681)

v1.45.1

Changelog

  • da0a6b3b build(deps): bump actions/cache from 2.1.7 to 3 (#2674)
  • e187dd8a build(deps): bump github.com/hashicorp/go-version from 1.2.1 to 1.4.0 (#2659)
  • ec8d6894 build(deps): bump github.com/stretchr/testify from 1.7.0 to 1.7.1 (#2660)
  • 243ec6f0 bump varnamelen to v0.6.1 (#2656)
  • 8f7f44d1 depguard: reduce requirements (#2672)
  • 7bbbe77e feat: automatic Go version detection (#2669)
  • f0554415 fix: disable structcheck with go1.18 (#2666)
  • 93feed1d fix: update base images (#2661)
Changelog

Sourced from github.com/golangci/golangci-lint's changelog.

v1.45.2

  1. misc:
    • fix: help command

v1.45.1

  1. updated linters:
    • interfacer: inactivate with go1.18
    • govet: inactivate unsupported analyzers (go1.18)
    • depguard: reduce requirements
    • structcheck: inactivate with go1.18
    • varnamelen: bump from v0.6.0 to v0.6.1
  2. misc:
    • Automatic Go version detection 🎉 (go1.18)
    • docker: update base images (go1.18)
Commits

[![Dependabot compatibility score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=github.com/golangci/golangci-lint&package-manager=go_modules&previous-version=1.45.0&new-version=1.45.2)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores) Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`. [//]: # (dependabot-automerge-start) [//]: # (dependabot-automerge-end) ---
Dependabot commands and options
You can trigger Dependabot actions by commenting on this PR: - `@dependabot rebase` will rebase this PR - `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it - `@dependabot merge` will merge this PR after your CI passes on it - `@dependabot squash and merge` will squash and merge this PR after your CI passes on it - `@dependabot cancel merge` will cancel a previously requested merge and block automerging - `@dependabot reopen` will reopen this PR if it is closed - `@dependabot close` will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually - `@dependabot ignore this major version` will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this minor version` will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this dependency` will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
* build(deps): Bump minimist from 1.2.5 to 1.2.6 in /docs (#8196) Bumps [minimist](https://github.com/substack/minimist) from 1.2.5 to 1.2.6. - [Release notes](https://github.com/substack/minimist/releases) - [Commits](https://github.com/substack/minimist/compare/1.2.5...1.2.6) --- updated-dependencies: - dependency-name: minimist dependency-type: indirect ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * build(deps): Bump bufbuild/buf-setup-action from 1.1.0 to 1.3.0 (#8199) * build(deps): Bump github.com/adlio/schema from 1.2.3 to 1.3.0 (#8201) Bumps [github.com/adlio/schema](https://github.com/adlio/schema) from 1.2.3 to 1.3.0.
Release notes

Sourced from github.com/adlio/schema's releases.

1.3.0

What's Changed

New Contributors

Full Changelog: https://github.com/adlio/schema/compare/v1.2.3...v1.3.0

Commits

[![Dependabot compatibility score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=github.com/adlio/schema&package-manager=go_modules&previous-version=1.2.3&new-version=1.3.0)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores) Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`. [//]: # (dependabot-automerge-start) [//]: # (dependabot-automerge-end) ---
Dependabot commands and options
You can trigger Dependabot actions by commenting on this PR: - `@dependabot rebase` will rebase this PR - `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it - `@dependabot merge` will merge this PR after your CI passes on it - `@dependabot squash and merge` will squash and merge this PR after your CI passes on it - `@dependabot cancel merge` will cancel a previously requested merge and block automerging - `@dependabot reopen` will reopen this PR if it is closed - `@dependabot close` will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually - `@dependabot ignore this major version` will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this minor version` will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this dependency` will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
* Update ABCI++ spec with decisions taken in the bi-weekly meeting (#8191) * Clarify 0-length vote extensions in the spec, according to #8174 * Update spec so that Tendermnit can propose more txs than the size limit in * Addressed Manu's comment * Reworded size limit following Manu's suggestion * consensus: timeout params in toml used as overrides (#8186) Replaces the set of timeout parameters in the config.toml file with unsafe-*override versions of the corresponding ConsensusParams.Timeout field. These fields can be used for the duration of v0.36 to override the consensus param in case of emergency. Adds a set to the ./internal/consensus/State type for correctly calculating the value of each timeout based on the set of overrides specified. * timeout parameters take the default if not set (#8189) * Fix empty tendermint version in Docker (#8161) * Fix Dockerfile and scripts * Fix docker scripts * Remove unused scripts * Retrigger checks Co-authored-by: Simon Kirillov Co-authored-by: William Banfield <4561443+williambanfield@users.noreply.github.com> * migration: remove stale seen commits (#8205) * Re-enable markdown link checker. (#8212) The upstream fix for link syntax has landed. - Uncomment the workflow and bump the version. - Add a config file to encourage retries. * Fix broken Markdown links (#8214) - Remove pointless Makefile and package documentation. - Fix broken links. * config: default indexer configuration to null (#8222) After this change, new nodes will not have indexing enabled by default. Test configurations will still use "kv". * Update pending changelog and upgrading notes. * Fix indexer config for the test app. * Update config template and enable indexing for e2e tests. * Document steps for updating the timeout parameters. (#8217) closes: #8182 This pull request adds documentation to the `UPGRADING.md` file as well as a set of deprecation checks for the old timeout parameters in the `config.toml` file. It additionally documents the parameters in the `genesis.md`. * build(deps): Bump github.com/vektra/mockery/v2 from 2.10.0 to 2.10.1 (#8226) Bumps [github.com/vektra/mockery/v2](https://github.com/vektra/mockery) from 2.10.0 to 2.10.1.
Release notes

Sourced from github.com/vektra/mockery/v2's releases.

v2.10.1

Changelog

  • fa0080c Fix config.GetSemverInfo() for Go 1.18
  • 4e181be Load packages with dependencies for Go 1.18
  • 232f954 Merge pull request #435 from emmanuel099/master
  • b11695e Merge pull request #436 from emmanuel099/test_with_3.18
  • e0e183b Test with Go 1.18
  • adda07f Update README.md
  • 5f5570d Update README.md
  • 4fc5912 Update README.md
  • fa2d82d Update README.md
Commits

[![Dependabot compatibility score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=github.com/vektra/mockery/v2&package-manager=go_modules&previous-version=2.10.0&new-version=2.10.1)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores) Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`. [//]: # (dependabot-automerge-start) [//]: # (dependabot-automerge-end) ---
Dependabot commands and options
You can trigger Dependabot actions by commenting on this PR: - `@dependabot rebase` will rebase this PR - `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it - `@dependabot merge` will merge this PR after your CI passes on it - `@dependabot squash and merge` will squash and merge this PR after your CI passes on it - `@dependabot cancel merge` will cancel a previously requested merge and block automerging - `@dependabot reopen` will reopen this PR if it is closed - `@dependabot close` will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually - `@dependabot ignore this major version` will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this minor version` will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this dependency` will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
* state: avoid premature genericism (#8224) * lint: bump linter version in ci (#8234) * light: remove untracked close channel (#8228) * e2e: Fix hashing for app + Fix logic of TestApp_Hash (#8229) * Fix hashing of e2e App * Fix TestApp_Hash * CaMeL * Update test/e2e/app/state.go Co-authored-by: M. J. Fromberger * for-->Eventually + if-->require * Update test/e2e/tests/app_test.go Co-authored-by: Sam Kleinman * fix lint Co-authored-by: M. J. Fromberger Co-authored-by: Sam Kleinman * abci++: correct max-size check to only operate on added and unmodified (#8242) * build(deps): Bump bufbuild/buf-setup-action from 1.3.0 to 1.3.1 (#8245) * Remove `ModifiedTxStatus` from the spec and the code (#8210) * Outstanding abci-gen changes to 'pb.go' files * Removed modified_tx_status from spec and protobufs * Fix sed for OSX * Regenerated abci protobufs with 'abci-proto-gen' * Code changes. UTs e2e tests passing * Recovered UT: TestPrepareProposalModifiedTxStatusFalse * Adapted UT * Fixed UT * Revert "Fix sed for OSX" This reverts commit e576708c618f0ef732498f4d348503b823b6c9e8. * Update internal/state/execution_test.go Co-authored-by: William Banfield <4561443+williambanfield@users.noreply.github.com> * Update abci/example/kvstore/kvstore.go Co-authored-by: M. J. Fromberger * Update internal/state/execution_test.go Co-authored-by: William Banfield <4561443+williambanfield@users.noreply.github.com> * Update spec/abci++/abci++_tmint_expected_behavior_002_draft.md Co-authored-by: William Banfield <4561443+williambanfield@users.noreply.github.com> * Addressed some comments * Added one test that tests error at the ABCI client + Fixed some mock calls * Addressed remaining comments * Update abci/example/kvstore/kvstore.go Co-authored-by: William Banfield <4561443+williambanfield@users.noreply.github.com> * Update abci/example/kvstore/kvstore.go Co-authored-by: William Banfield <4561443+williambanfield@users.noreply.github.com> * Update abci/example/kvstore/kvstore.go Co-authored-by: William Banfield <4561443+williambanfield@users.noreply.github.com> * Update spec/abci++/abci++_tmint_expected_behavior_002_draft.md Co-authored-by: William Banfield <4561443+williambanfield@users.noreply.github.com> * Addressed William's latest comments * Adressed Michael's comment * Fixed UT * Some md fixes * More md fixes * gofmt Co-authored-by: William Banfield <4561443+williambanfield@users.noreply.github.com> Co-authored-by: M. J. Fromberger * build(deps): Bump github.com/vektra/mockery/v2 from 2.10.1 to 2.10.2 (#8246) Bumps [github.com/vektra/mockery/v2](https://github.com/vektra/mockery) from 2.10.1 to 2.10.2.
Release notes

Sourced from github.com/vektra/mockery/v2's releases.

v2.10.2

Changelog

  • 8384e25 Merge pull request #443 from OrlovEvgeny/fix-build-go-version
  • 408740d fix: golang build version
Commits

[![Dependabot compatibility score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=github.com/vektra/mockery/v2&package-manager=go_modules&previous-version=2.10.1&new-version=2.10.2)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores) Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`. [//]: # (dependabot-automerge-start) [//]: # (dependabot-automerge-end) ---
Dependabot commands and options
You can trigger Dependabot actions by commenting on this PR: - `@dependabot rebase` will rebase this PR - `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it - `@dependabot merge` will merge this PR after your CI passes on it - `@dependabot squash and merge` will squash and merge this PR after your CI passes on it - `@dependabot cancel merge` will cancel a previously requested merge and block automerging - `@dependabot reopen` will reopen this PR if it is closed - `@dependabot close` will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually - `@dependabot ignore this major version` will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this minor version` will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this dependency` will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
* statesync: merge channel processing (#8240) * node: remove channel and peer update initialization from construction (#8238) * build(deps): Bump github.com/vektra/mockery/v2 from 2.10.2 to 2.10.4 (#8250) Bumps [github.com/vektra/mockery/v2](https://github.com/vektra/mockery) from 2.10.2 to 2.10.4.
Release notes

Sourced from github.com/vektra/mockery/v2's releases.

v2.10.4

Changelog

  • c943e69 Merge pull request #441 from cfstras/fix/support-more-env-keys
  • ed87cf6 fix: allow configuring flags with "-" as Env var
  • 17abd96 fix: unused config field Tags
  • 53114cf test: add test for env var configurations

v2.10.3

Changelog

  • ee25bcf Add/update mocks
  • 4703d1a Merge pull request #444 from vektra/remove_need_deps
  • ba1f213 Remove packages.NeedDeps
  • ed38b20 Update go.sum
Commits
  • c943e69 Merge pull request #441 from cfstras/fix/support-more-env-keys
  • 4703d1a Merge pull request #444 from vektra/remove_need_deps
  • ed38b20 Update go.sum
  • ee25bcf Add/update mocks
  • ba1f213 Remove packages.NeedDeps
  • 17abd96 fix: unused config field Tags
  • 53114cf test: add test for env var configurations
  • ed87cf6 fix: allow configuring flags with "-" as Env var
  • See full diff in compare view

[![Dependabot compatibility score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=github.com/vektra/mockery/v2&package-manager=go_modules&previous-version=2.10.2&new-version=2.10.4)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores) Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`. [//]: # (dependabot-automerge-start) [//]: # (dependabot-automerge-end) ---
Dependabot commands and options
You can trigger Dependabot actions by commenting on this PR: - `@dependabot rebase` will rebase this PR - `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it - `@dependabot merge` will merge this PR after your CI passes on it - `@dependabot squash and merge` will squash and merge this PR after your CI passes on it - `@dependabot cancel merge` will cancel a previously requested merge and block automerging - `@dependabot reopen` will reopen this PR if it is closed - `@dependabot close` will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually - `@dependabot ignore this major version` will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this minor version` will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this dependency` will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
* build(deps): Bump github.com/BurntSushi/toml from 1.0.0 to 1.1.0 (#8251) Bumps [github.com/BurntSushi/toml](https://github.com/BurntSushi/toml) from 1.0.0 to 1.1.0.
Release notes

Sourced from github.com/BurntSushi/toml's releases.

v1.1.0

Just a few bugfixes:

  • Skip fields with toml:"-" even when they're unsupported types. Previously something like this would fail to encode due to func being an unsupported type:

    struct {
        Str  string `toml:"str"
        Func func() `toml:"-"`
    }
    
  • Multiline strings can't end with \. This is valid:

    # Valid
    key = """ foo \
    """
    

    Invalid

    key = """ foo \ """

  • Don't quote values in TOMLMarshaler. Previously they would always include quoting (e.g. "value"), while the entire point of this interface is to bypass that.

Commits
  • 891d261 Don't error out if a multiline string ends with an incomplete UTF-8 sequence
  • ef65e34 Don't run Unmarshal() through Decode()
  • 573cad4 Merge pull request #347 from zhsj/fix-32
  • f3633f4 Fix test on 32 bit arch
  • 551f4a5 Merge pull request #344 from lucasbutn/hotfix-341-marshaler-shouldnot-writequ...
  • dec5825 Removed write quote in marshal to allow write other types than strings
  • 2249a9c Multiline strings can't end with ""
  • 51b22f2 Fix README
  • 01e5516 Skip fields with toml:"-", even when they're unsupported types
  • 87b9f05 Fix tests for older Go versions
  • See full diff in compare view

[![Dependabot compatibility score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=github.com/BurntSushi/toml&package-manager=go_modules&previous-version=1.0.0&new-version=1.1.0)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores) Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`. [//]: # (dependabot-automerge-start) [//]: # (dependabot-automerge-end) ---
Dependabot commands and options
You can trigger Dependabot actions by commenting on this PR: - `@dependabot rebase` will rebase this PR - `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it - `@dependabot merge` will merge this PR after your CI passes on it - `@dependabot squash and merge` will squash and merge this PR after your CI passes on it - `@dependabot cancel merge` will cancel a previously requested merge and block automerging - `@dependabot reopen` will reopen this PR if it is closed - `@dependabot close` will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually - `@dependabot ignore this major version` will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this minor version` will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this dependency` will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
* consensus: remove string indented function (#8257) * p2p: inject nodeinfo into router (#8261) * node: reorder service construction (#8262) * Forward-port changelogs from v0.34.17 and v0.34.18 to master. (#8265) * Forward-port changelogs from v0.34.17 and v0.34.18 to master. * Fix broken markdown links. * statesync: tweak test performance (#8267) * Fix more broken Markdown links. (#8271) * consensus: avoid panics during handshake (#8266) There's no case where we recieve an error during handshake and don't just return/continue, and it's at a point during startup where not much is going on in the process, so having some classes of errors return errors and some return panics is confusing and doesn't protect anything. * node: move handshake out of constructor (#8264) * statesync+blocksync: move event publications into the sync operations (#8274) * scmigrate: ensure target key is correctly renamed (#8276) Prior to v0.35, the keys for seen-commit records included the applicable height. In v0.35 and beyond, we only keep the record for the latest height, and its key does not include the height. Update the seen-commit migration to ensure that the record we retain after migration is correctly renamed to omit the height from its key. Update the test cases to check for this condition after migrating. * Forward-port changelog for v0.34.19 to master. (#8279) * build(deps): Bump github.com/lib/pq from 1.10.4 to 1.10.5 (#8283) Bumps [github.com/lib/pq](https://github.com/lib/pq) from 1.10.4 to 1.10.5.
Commits

[![Dependabot compatibility score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=github.com/lib/pq&package-manager=go_modules&previous-version=1.10.4&new-version=1.10.5)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores) Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`. [//]: # (dependabot-automerge-start) [//]: # (dependabot-automerge-end) ---
Dependabot commands and options
You can trigger Dependabot actions by commenting on this PR: - `@dependabot rebase` will rebase this PR - `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it - `@dependabot merge` will merge this PR after your CI passes on it - `@dependabot squash and merge` will squash and merge this PR after your CI passes on it - `@dependabot cancel merge` will cancel a previously requested merge and block automerging - `@dependabot reopen` will reopen this PR if it is closed - `@dependabot close` will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually - `@dependabot ignore this major version` will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this minor version` will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this dependency` will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
* node+statesync: normalize initialization (#8275) * rpc: add more nil checks in the status end point (#8287) * consensus: add nil check to gossip routine (#8288) * switch to consensus change startup ordering (#8290) * Forward-port v0.35.3 changelog to master. (#8291) * Fix release notes to match the prevailing style. (#8292) * Add a tool to update old config files to the latest version (#8281) * keymigrate: fix decoding of block-hash row keys (#8294) * test/fuzz: update oss-fuzz build script to match reality (#8296) p2p/pex and p2p/addrbook were deleted in 03ad7d6f20d9fd8fe83d31db168f433480552e94, secret_connection was renamed to secretconnection in dd97ac6e1c8810a115e53a61c9a91dd40275b3fe. * Fix a spelling error (#8297) * build: use go install instead of go get. (#8299) * confix: clean up and document transformations (#8301) Right now the confix tool works up to v0.35. This change is preparation for extending the tool to handle additional changes in v0.36. Mostly this is adding documentation. The one functional change is to fix the name of the moved "fast-sync" parameter, which was renamed "enable". - Document the origin of each transformation step. - Update fast-sync target name. * build(deps): Bump codecov/codecov-action from 2.1.0 to 3.0.0 (#8306) Bumps [codecov/codecov-action](https://github.com/codecov/codecov-action) from 2.1.0 to 3.0.0.
Release notes

Sourced from codecov/codecov-action's releases.

v3.0.0

Breaking Changes

  • #689 Bump to node16 and small fixes

Features

  • #688 Incorporate gcov arguments for the Codecov uploader

Dependencies

  • #548 build(deps-dev): bump jest-junit from 12.2.0 to 13.0.0
  • #603 [Snyk] Upgrade @​actions/core from 1.5.0 to 1.6.0
  • #628 build(deps): bump node-fetch from 2.6.1 to 3.1.1
  • #634 build(deps): bump node-fetch from 3.1.1 to 3.2.0
  • #636 build(deps): bump openpgp from 5.0.1 to 5.1.0
  • #652 build(deps-dev): bump @​vercel/ncc from 0.30.0 to 0.33.3
  • #653 build(deps-dev): bump @​types/node from 16.11.21 to 17.0.18
  • #659 build(deps-dev): bump @​types/jest from 27.4.0 to 27.4.1
  • #667 build(deps): bump actions/checkout from 2 to 3
  • #673 build(deps): bump node-fetch from 3.2.0 to 3.2.3
  • #683 build(deps): bump minimist from 1.2.5 to 1.2.6
  • #685 build(deps): bump @​actions/github from 5.0.0 to 5.0.1
  • #681 build(deps-dev): bump @​types/node from 17.0.18 to 17.0.23
  • #682 build(deps-dev): bump typescript from 4.5.5 to 4.6.3
  • #676 build(deps): bump @​actions/exec from 1.1.0 to 1.1.1
  • #675 build(deps): bump openpgp from 5.1.0 to 5.2.1
Changelog

Sourced from codecov/codecov-action's changelog.

3.0.0

Breaking Changes

  • #689 Bump to node16 and small fixes

Features

  • #688 Incorporate gcov arguments for the Codecov uploader

Dependencies

  • #548 build(deps-dev): bump jest-junit from 12.2.0 to 13.0.0
  • #603 [Snyk] Upgrade @​actions/core from 1.5.0 to 1.6.0
  • #628 build(deps): bump node-fetch from 2.6.1 to 3.1.1
  • #634 build(deps): bump node-fetch from 3.1.1 to 3.2.0
  • #636 build(deps): bump openpgp from 5.0.1 to 5.1.0
  • #652 build(deps-dev): bump @​vercel/ncc from 0.30.0 to 0.33.3
  • #653 build(deps-dev): bump @​types/node from 16.11.21 to 17.0.18
  • #659 build(deps-dev): bump @​types/jest from 27.4.0 to 27.4.1
  • #667 build(deps): bump actions/checkout from 2 to 3
  • #673 build(deps): bump node-fetch from 3.2.0 to 3.2.3
  • #683 build(deps): bump minimist from 1.2.5 to 1.2.6
  • #685 build(deps): bump @​actions/github from 5.0.0 to 5.0.1
  • #681 build(deps-dev): bump @​types/node from 17.0.18 to 17.0.23
  • #682 build(deps-dev): bump typescript from 4.5.5 to 4.6.3
  • #676 build(deps): bump @​actions/exec from 1.1.0 to 1.1.1
  • #675 build(deps): bump openpgp from 5.1.0 to 5.2.1
Commits
  • e3c5604 Merge pull request #689 from codecov/feat/gcov
  • 174efc5 Update package-lock.json
  • 6243a75 bump to 3.0.0
  • 0d6466f Bump to node16
  • d4729ee fetch.default
  • 351baf6 fix: bash
  • d8cf680 Merge pull request #675 from codecov/dependabot/npm_and_yarn/openpgp-5.2.1
  • b775e90 Merge pull request #676 from codecov/dependabot/npm_and_yarn/actions/exec-1.1.1
  • 2ebc2f0 Merge pull request #682 from codecov/dependabot/npm_and_yarn/typescript-4.6.3
  • 8e2ef2b Merge pull request #681 from codecov/dependabot/npm_and_yarn/types/node-17.0.23
  • Additional commits viewable in compare view

[![Dependabot compatibility score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=codecov/codecov-action&package-manager=github_actions&previous-version=2.1.0&new-version=3.0.0)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores) Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`. [//]: # (dependabot-automerge-start) [//]: # (dependabot-automerge-end) ---
Dependabot commands and options
You can trigger Dependabot actions by commenting on this PR: - `@dependabot rebase` will rebase this PR - `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it - `@dependabot merge` will merge this PR after your CI passes on it - `@dependabot squash and merge` will squash and merge this PR after your CI passes on it - `@dependabot cancel merge` will cancel a previously requested merge and block automerging - `@dependabot reopen` will reopen this PR if it is closed - `@dependabot close` will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually - `@dependabot ignore this major version` will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this minor version` will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this dependency` will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
* build(deps): Bump actions/setup-go from 2 to 3 (#8305) Bumps [actions/setup-go](https://github.com/actions/setup-go) from 2 to 3.
Release notes

Sourced from actions/setup-go's releases.

v3.0.0

What's Changed

Breaking Changes

With the update to Node 16, all scripts will now be run with Node 16 rather than Node 12.

This new major release removes the stable input, so there is no need to specify additional input to use pre-release versions. This release also corrects the pre-release versions syntax to satisfy the SemVer notation (1.18.0-beta1 -> 1.18.0-beta.1, 1.18.0-rc1 -> 1.18.0-rc.1).

steps:
  - uses: actions/checkout@v2
  - uses: actions/setup-go@v3
    with:
      go-version: '1.18.0-rc.1'
  - run: go version

Add check-latest input

In scope of this release we add the check-latest input. If check-latest is set to true, the action first checks if the cached version is the latest one. If the locally cached version is not the most up-to-date, a Go version will then be downloaded from go-versions repository. By default check-latest is set to false. Example of usage:

steps:
  - uses: actions/checkout@v2
  - uses: actions/setup-go@v2
    with:
      go-version: '1.16'
      check-latest: true
  - run: go version

Moreover, we updated @actions/core from 1.2.6 to 1.6.0

v2.1.5

In scope of this release we updated matchers.json to improve the problem matcher pattern. For more information please refer to this pull request

v2.1.4

What's Changed

New Contributors

Full Changelog: https://github.com/actions/setup-go/compare/v2.1.3...v2.1.4

v2.1.3

  • Updated communication with runner to use environment files rather then workflow commands

v2.1.2

This release includes vendored licenses for this action's npm dependencies.

... (truncated)

Commits

[![Dependabot compatibility score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=actions/setup-go&package-manager=github_actions&previous-version=2&new-version=3)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores) Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`. [//]: # (dependabot-automerge-start) [//]: # (dependabot-automerge-end) ---
Dependabot commands and options
You can trigger Dependabot actions by commenting on this PR: - `@dependabot rebase` will rebase this PR - `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it - `@dependabot merge` will merge this PR after your CI passes on it - `@dependabot squash and merge` will squash and merge this PR after your CI passes on it - `@dependabot cancel merge` will cancel a previously requested merge and block automerging - `@dependabot reopen` will reopen this PR if it is closed - `@dependabot close` will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually - `@dependabot ignore this major version` will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this minor version` will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this dependency` will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
* build(deps): Bump actions/stale from 4 to 5 (#8304) Bumps [actions/stale](https://github.com/actions/stale) from 4 to 5.
Release notes

Sourced from actions/stale's releases.

v5.0.0

Features

v4.1.0

Features

Changelog

Sourced from actions/stale's changelog.

Changelog

Commits
  • 3cc1237 Merge pull request #670 from actions/thboop/node16upgrade
  • 76e9fbc update node version
  • 6467b96 Update default runtime to node16
  • 8af6051 build(deps-dev): bump jest-circus from 27.2.0 to 27.4.6 (#665)
  • 7a7efca Fix per issue operation count (#662)
  • 04a1828 build(deps-dev): bump ts-jest from 27.0.5 to 27.1.2 (#641)
  • 65ca395 build(deps-dev): bump eslint-plugin-jest from 24.4.2 to 25.3.2 (#639)
  • eee276c build(deps-dev): bump prettier from 2.4.1 to 2.5.1 (#628)
  • 6c2f9f3 Merge pull request #640 from dmitry-shibanov/v-dmshib/fix-check-dist
  • 37323f1 fix check-dist.yml
  • Additional commits viewable in compare view

[![Dependabot compatibility score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=actions/stale&package-manager=github_actions&previous-version=4&new-version=5)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores) Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`. [//]: # (dependabot-automerge-start) [//]: # (dependabot-automerge-end) ---
Dependabot commands and options
You can trigger Dependabot actions by commenting on this PR: - `@dependabot rebase` will rebase this PR - `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it - `@dependabot merge` will merge this PR after your CI passes on it - `@dependabot squash and merge` will squash and merge this PR after your CI passes on it - `@dependabot cancel merge` will cancel a previously requested merge and block automerging - `@dependabot reopen` will reopen this PR if it is closed - `@dependabot close` will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually - `@dependabot ignore this major version` will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this minor version` will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this dependency` will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
* build(deps): Bump actions/download-artifact from 2 to 3 (#8302) Bumps [actions/download-artifact](https://github.com/actions/download-artifact) from 2 to 3.
Release notes

Sourced from actions/download-artifact's releases.

v3.0.0

What's Changed

Breaking Changes

With the update to Node 16, all scripts will now be run with Node 16 rather than Node 12.

v2.1.0 Download Artifact

  • Improved output & logging
  • Fixed issue where downloading all artifacts could cause display percentages to be over 100%
  • Various small bug fixes & improvements

v2.0.10

  • Retry on HTTP 500 responses from the service

v2.0.9

  • Fixes to proxy related issues

v2.0.8

  • Improvements to retryability if an error is encountered during artifact download

v2.0.7 download-artifact

  • Improved download retry-ability if a partial download is encountered

v2.0.6

Update actions/core NPM package that is used internally

v2.0.5

  • Add Third Party License Information

v2.0.4

  • Use the latest version of the @actions/artifact NPM package

v2.0.3

  • Misc improvements

v2.0.2

  • Support for tilde expansion

v2.0.1

  • Download path output
  • Improved logging
Commits

[![Dependabot compatibility score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=actions/download-artifact&package-manager=github_actions&previous-version=2&new-version=3)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores) Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`. [//]: # (dependabot-automerge-start) [//]: # (dependabot-automerge-end) ---
Dependabot commands and options
You can trigger Dependabot actions by commenting on this PR: - `@dependabot rebase` will rebase this PR - `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it - `@dependabot merge` will merge this PR after your CI passes on it - `@dependabot squash and merge` will squash and merge this PR after your CI passes on it - `@dependabot cancel merge` will cancel a previously requested merge and block automerging - `@dependabot reopen` will reopen this PR if it is closed - `@dependabot close` will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually - `@dependabot ignore this major version` will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this minor version` will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this dependency` will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
* build(deps): Bump actions/upload-artifact from 2 to 3 (#8303) Bumps [actions/upload-artifact](https://github.com/actions/upload-artifact) from 2 to 3.
Release notes

Sourced from actions/upload-artifact's releases.

v3.0.0

What's Changed

  • Update default runtime to node16 (#293)
  • Update package-lock.json file version to 2 (#302)

Breaking Changes

With the update to Node 16, all scripts will now be run with Node 16 rather than Node 12.

v2.3.1

Fix for empty fails on Windows failing on upload #281

v2.3.0 Upload Artifact

  • Optimizations for faster uploads of larger files that are already compressed
  • Significantly improved logging when there are chunked uploads
  • Clarifications in logs around the upload size and prohibited characters that aren't allowed in the artifact name or any uploaded files
  • Various other small bugfixes & optimizations

v2.2.4

  • Retry on HTTP 500 responses from the service

v2.2.3

  • Fixes for proxy related issues

v2.2.2

  • Improved retryability and error handling

v2.2.1

  • Update used actions/core package to the latest version

v2.2.0

  • Support for artifact retention

v2.1.4

  • Add Third Party License Information

v2.1.3

  • Use updated version of the @action/artifact NPM package

v2.1.2

  • Increase upload chunk size from 4MB to 8MB
  • Detect case insensitive file uploads

v2.1.1

  • Fix for certain symlinks not correctly being identified as directories before starting uploads

v2.1.0

  • Support for uploading artifacts with multiple paths
  • Support for using exclude paths
  • Updates to dependencies

... (truncated)

Commits

[![Dependabot compatibility score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=actions/upload-artifact&package-manager=github_actions&previous-version=2&new-version=3)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores) Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`. [//]: # (dependabot-automerge-start) [//]: # (dependabot-automerge-end) ---
Dependabot commands and options
You can trigger Dependabot actions by commenting on this PR: - `@dependabot rebase` will rebase this PR - `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it - `@dependabot merge` will merge this PR after your CI passes on it - `@dependabot squash and merge` will squash and merge this PR after your CI passes on it - `@dependabot cancel merge` will cancel a previously requested merge and block automerging - `@dependabot reopen` will reopen this PR if it is closed - `@dependabot close` will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually - `@dependabot ignore this major version` will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this minor version` will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this dependency` will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
* build(deps): Bump github.com/creachadair/tomledit from 0.0.11 to 0.0.13 (#8307) Bumps [github.com/creachadair/tomledit](https://github.com/creachadair/tomledit) from 0.0.11 to 0.0.13.
Commits
  • baee445 Release v0.0.13.
  • 8dfcc1b Exercise insertion before comments.
  • 97f4e85 When inserting a key, push it before block comments.
  • 029089e Release v0.0.12.
  • d226405 Test finding the global table.
  • 34b7aad Let FindTable return the global table with an empty name.
  • See full diff in compare view

[![Dependabot compatibility score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=github.com/creachadair/tomledit&package-manager=go_modules&previous-version=0.0.11&new-version=0.0.13)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores) Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`. [//]: # (dependabot-automerge-start) [//]: # (dependabot-automerge-end) ---
Dependabot commands and options
You can trigger Dependabot actions by commenting on this PR: - `@dependabot rebase` will rebase this PR - `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it - `@dependabot merge` will merge this PR after your CI passes on it - `@dependabot squash and merge` will squash and merge this PR after your CI passes on it - `@dependabot cancel merge` will cancel a previously requested merge and block automerging - `@dependabot reopen` will reopen this PR if it is closed - `@dependabot close` will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually - `@dependabot ignore this major version` will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this minor version` will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this dependency` will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
* cli: add graceful catches to SIGINT (#8308) * Update outdated doc comment (#8309) SetEventBus was deleted, same with the NopEventBus * Add configuration diff tool. (#8298) * Add diff outputs as testdata. * Normalize all samples to kebabs. * abci++: only include meaningful header fields in data passed-through to application (#8216) closes: #7950 * Add configuration updates for Tendermint v0.36. (#8310) * v36: remove [fastsync] and [blocksync] config sections * v36: remove [blocksync], consolidate rename * v36: remove gRPC options from [rpc] * v36: add top-level mode setting * v36: remove deprecated per-node consensus timeouts * v36: remove vestigial mempool.wal-dir setting * v36: add queue-type setting * v36: add p2p connection limits * v36: add or update statsync.fetchers * v36: add statesync.use-p2p setting * events: remove unused event code (#8313) * service: minor cleanup of comments (#8314) * state: remove unused weighted time (#8315) * Remove resolved TODO comments. (#8325) Resolved by merge of #8300. * rpc: avoid leaking threads (#8328) * pubsub: [minor] remove unused stub method (#8316) OnReset was removed from the service interface and we missed deleting this. * Only run the markdown linter if markdown was touched. (#8337) * Update RFC ToC for RFC-015. (#8338) * confix: remove mempool.version in v0.36 (#8334) * Work around markdown-link-check issues. (#8339) Work around two issues causing the markdown link check to fail in CI. 1. https://github.com/actions/checkout/pull/760. A git permissions issue, apparently triggered by a combination of a git change and the behaviour of actions/checkout. 2. https://github.com/gaurav-nelson/github-action-markdown-link-check/pull/129. Merging an updated version of the underlying package that fixes a bug in the handling of local #anchors. The workaround is a temporary patched fork of the link-checker action. This should be removed once the upstream issues are addressed. * cli: simplify resetting commands (#8312) * confix: convert tx-index.indexer from string to array (#8342) The format of this config value was changed in v0.35. - Move plan to its own file (for ease of reading). - Convert indexer string to an array if not already done. * build(deps): Bump github.com/vektra/mockery/v2 from 2.10.4 to 2.10.6 (#8346) Bumps [github.com/vektra/mockery/v2](https://github.com/vektra/mockery) from 2.10.4 to 2.10.6.
Release notes

Sourced from github.com/vektra/mockery/v2's releases.

v2.10.6

Changelog

  • df6e689 Add PR/issue templates
  • e8bf201 Add golang-1.18 note
  • 54589be Merge pull request #445 from bigbluedisco/fix/bump-golang-org-x-tools
  • aa25af0 fix: bump golang.org/x/tools to v0.1.10 to fix some go 1.18 issues
Commits
  • 54589be Merge pull request #445 from bigbluedisco/fix/bump-golang-org-x-tools
  • aa25af0 fix: bump golang.org/x/tools to v0.1.10 to fix some go 1.18 issues
  • e8bf201 Add golang-1.18 note
  • df6e689 Add PR/issue templates
  • See full diff in compare view

[![Dependabot compatibility score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=github.com/vektra/mockery/v2&package-manager=go_modules&previous-version=2.10.4&new-version=2.10.6)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores) Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`. [//]: # (dependabot-automerge-start) [//]: # (dependabot-automerge-end) ---
Dependabot commands and options
You can trigger Dependabot actions by commenting on this PR: - `@dependabot rebase` will rebase this PR - `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it - `@dependabot merge` will merge this PR after your CI passes on it - `@dependabot squash and merge` will squash and merge this PR after your CI passes on it - `@dependabot cancel merge` will cancel a previously requested merge and block automerging - `@dependabot reopen` will reopen this PR if it is closed - `@dependabot close` will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually - `@dependabot ignore this major version` will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this minor version` will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this dependency` will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
* build(deps): Bump github.com/spf13/viper from 1.10.1 to 1.11.0 (#8344) Bumps [github.com/spf13/viper](https://github.com/spf13/viper) from 1.10.1 to 1.11.0.
Release notes

Sourced from github.com/spf13/viper's releases.

v1.11.0

What's Changed

Exciting New Features 🎉

Enhancements 🚀

Bug Fixes 🐛

Breaking Changes 🛠

Dependency Updates ⬆️

New Contributors

Full Changelog: https://github.com/spf13/viper/compare/v1.10.1...v1.11.0

Commits
  • 6986c0a chore: update crypt
  • 65293ec add release note configuration
  • 6804da7 chore!: drop Go 1.14 support
  • 5b21ca1 fix: deprecated config
  • 55fac10 chore: fix lint
  • e0bf4ac chore: add go 1.18 builds
  • 973c265 build(deps): bump github.com/pelletier/go-toml/v2
  • 129e4f9 build(deps): bump github.com/pelletier/go-toml/v2
  • 9a8603d build(deps): bump actions/setup-go from 2 to 3
  • dc76f3c build(deps): bump github.com/spf13/afero from 1.8.1 to 1.8.2
  • Additional commits viewable in compare view

[![Dependabot compatibility score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=github.com/spf13/viper&package-manager=go_modules&previous-version=1.10.1&new-version=1.11.0)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores) Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`. [//]: # (dependabot-automerge-start) [//]: # (dependabot-automerge-end) ---
Dependabot commands and options
You can trigger Dependabot actions by commenting on this PR: - `@dependabot rebase` will rebase this PR - `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it - `@dependabot merge` will merge this PR after your CI passes on it - `@dependabot squash and merge` will squash and merge this PR after your CI passes on it - `@dependabot cancel merge` will cancel a previously requested merge and block automerging - `@dependabot reopen` will reopen this PR if it is closed - `@dependabot close` will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually - `@dependabot ignore this major version` will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this minor version` will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this dependency` will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
* keymigrate: fix conversion of transaction hash keys (#8352) * keymigrate: fix conversion of transaction hash keys In the legacy database format, keys were generally stored with a string prefix to partition the key space. Transaction hashes, however, were not prefixed: The hash of a transaction was the entire key for its record. When the key migration script scans its input, it checks the format of each key to determine whether it has already been converted, so that it is safe to run the script over an already-converted database. After checking for known prefixes, the migration script used two heuristics to distinguish ABCI events and transaction hashes: For ABCI events, whose keys used the form "name/value/height/index", it checked for the right number of separators. For hashes, it checked that the length is exactly 32 bytes (the length of a SHA-256 digest) AND that the value does not contain a "/". This last check is problematic: Any hash containing the byte 0x2f (the code point for "/") would be incorrectly filtered out from conversion. This leads to some transaction hashes not being converted. To fix this problem, this changes how the script recognizes keys: 1. Use a more rigorous syntactic check to filter out ABCI metadata. 2. Use only the length to identify hashes among what remains. This change is still not a complete fix: It is possible, though unlikely, that a valid hash could happen to look exactly like an ABCI metadata key. However, the chance of that happening is vastly smaller than the chance of generating a hash that contains at least one "/" byte. Similarly, it is possible that an already-converted key of some other type could be mistaken for a hash (not a converted hash, ironically, but another type of the right length). Again, we can't do anything about that. * Update pending changelog for #8352. (#8354) I forgot to add this before merging. 🙁 * Add a script to check documentation for ToC entries. (#8356) This script verifies that each document in the docs and architecture directory has a corresponding table-of-contents entry in its README file. It can be run manually from the command line. - Hook up this script to run in CI (optional workflow). - Update ADR ToC to include missing entries this script found. * build(deps): Bump async from 2.6.3 to 2.6.4 in /docs (#8357) Bumps [async](https://github.com/caolan/async) from 2.6.3 to 2.6.4. - [Release notes](https://github.com/caolan/async/releases) - [Changelog](https://github.com/caolan/async/blob/v2.6.4/CHANGELOG.md) - [Commits](https://github.com/caolan/async/compare/v2.6.3...v2.6.4) --- updated-dependencies: - dependency-name: async dependency-type: indirect ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * build(deps): Bump github.com/creachadair/atomicfile from 0.2.4 to 0.2.5 (#8365) Bumps [github.com/creachadair/atomicfile](https://github.com/creachadair/atomicfile) from 0.2.4 to 0.2.5.
Commits
  • b8ff50e Release v0.2.5.
  • 95084ab Update actions/setup-go to v3.
  • 10d28f6 Update actions/checkout to v3.
  • 5f1989d Use a more explanatory temp file prefix.
  • 7819ee5 Add Go 1.18 to the CI workflow.
  • c30fad6 Drop old Go versions from CI.
  • ebcfa6b acat: use WriteData to simplify the code
  • See full diff in compare view

[![Dependabot compatibility score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=github.com/creachadair/atomicfile&package-manager=go_modules&previous-version=0.2.4&new-version=0.2.5)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores) Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`. [//]: # (dependabot-automerge-start) [//]: # (dependabot-automerge-end) ---
Dependabot commands and options
You can trigger Dependabot actions by commenting on this PR: - `@dependabot rebase` will rebase this PR - `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it - `@dependabot merge` will merge this PR after your CI passes on it - `@dependabot squash and merge` will squash and merge this PR after your CI passes on it - `@dependabot cancel merge` will cancel a previously requested merge and block automerging - `@dependabot reopen` will reopen this PR if it is closed - `@dependabot close` will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually - `@dependabot ignore this major version` will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this minor version` will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this dependency` will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
* Forward port changelog from v0.35.4 to master. (#8364) * p2p: fix setting in con-tracker (#8370) * eventbus: publish without contexts (#8369) * cleanup: unused parameters (#8372) * cleanup: pin get-diff-action uses to major version only, not minor/patch (#8368) * abci++: Sync implementation and spec for vote extensions (#8141) * Refactor so building and linting works This is the first step towards implementing vote extensions: generating the relevant proto stubs and getting the build and linter to pass. Signed-off-by: Thane Thomson * Fix typo Signed-off-by: Thane Thomson * Better describe method given vote extensions Signed-off-by: Thane Thomson * Fix types tests Signed-off-by: Thane Thomson * Move CanonicalVoteExtension to canonical types proto defs Signed-off-by: Thane Thomson * Regenerate protos including latest PBTS synchrony params update Signed-off-by: Thane Thomson * Inject vote extensions into proposal Signed-off-by: Thane Thomson * Thread vote extensions through code and fix tests Signed-off-by: Thane Thomson * Remove extraneous empty value initialization Signed-off-by: Thane Thomson * Fix lint Signed-off-by: Thane Thomson * Fix missing VerifyVoteExtension request data Signed-off-by: Thane Thomson * Explicitly ensure length > 0 to sign vote extension Signed-off-by: Thane Thomson * Explicitly ensure length > 0 to sign vote extension Signed-off-by: Thane Thomson * Remove extraneous comment Signed-off-by: Thane Thomson * Update privval/file.go Co-authored-by: M. J. Fromberger * Update types/vote_test.go Co-authored-by: M. J. Fromberger * Format Signed-off-by: Thane Thomson * Fix ABCI proto generation scripts for Linux Signed-off-by: Thane Thomson * Sync intermediate and goal protos Signed-off-by: Thane Thomson * Update internal/consensus/common_test.go Co-authored-by: Sergio Mena * Use dummy value with clearer meaning Signed-off-by: Thane Thomson * Rewrite loop for clarity Signed-off-by: Thane Thomson * Panic on ABCI++ method call failure Signed-off-by: Thane Thomson * Add strong correctness guarantees when constructing extended commit info for ABCI++ Signed-off-by: Thane Thomson * Add strong guarantee in extendedCommitInfo that the number of votes corresponds Signed-off-by: Thane Thomson * Make extendedCommitInfo function more robust At first extendedCommitInfo expected votes to be in the same order as their corresponding validators in the supplied CommitInfo struct, but this proved to be rather difficult since when a validator set's loaded from state it's first sorted by voting power and then by address. Instead of sorting the votes in the same way, this approach simply maps votes to their corresponding validator's address prior to constructing the extended commit info. This way it's easy to look up the corresponding vote and we don't need to care about vote order. Signed-off-by: Thane Thomson * Remove extraneous validator address assignment Signed-off-by: Thane Thomson * Sign over canonical vote extension Signed-off-by: Thane Thomson * Validate vote extension signature against canonical vote extension Signed-off-by: Thane Thomson * Update privval tests for more meaningful dummy value Signed-off-by: Thane Thomson * Add vote extension capability to E2E test app Signed-off-by: Thane Thomson * Disable lint for weak RNG usage for test app Signed-off-by: Thane Thomson * Use parseVoteExtension instead of custom parsing in PrepareProposal Signed-off-by: Thane Thomson * Only include extension if we have received txs It's unclear at this point why this is necessary to ensure that the application's local app_hash matches that committed in the previous block. Signed-off-by: Thane Thomson * Require app_hash from app to match that from last block Signed-off-by: Thane Thomson * Add contrived (possibly flaky) test to check that vote extensions code works Signed-off-by: Thane Thomson * Remove workaround for problem now solved by #8229 Signed-off-by: Thane Thomson * add tests for vote extension cases * Fix spelling mistake to appease linter Signed-off-by: Thane Thomson * Collapse redundant if statement Signed-off-by: Thane Thomson * Formatting Signed-off-by: Thane Thomson * Always expect an extension signature, regardless of whether an extension is present Signed-off-by: Thane Thomson * Votes constructed from commits cannot include extensions or signatures Signed-off-by: Thane Thomson * Pass through vote extension in test helpers Signed-off-by: Thane Thomson * Temporarily disable vote extension signature requirement Signed-off-by: Thane Thomson * Expand on vote equality test errors for clarity Signed-off-by: Thane Thomson * Expand on vote matching error messages in testing Signed-off-by: Thane Thomson * Allow for selective subscription by vote type This is an attempt to fix the intermittently failing `TestPrepareProposalReceivesVoteExtensions` test in the internal consensus package. Occasionally we get prevote messages via the subscription channel, and we're not interested in those. This change allows us to specify what types of votes we're interested in (i.e. precommits) and discard the rest. Signed-off-by: Thane Thomson * Read lock consensus state mutex in test helper to avoid data race Signed-off-by: Thane Thomson * Revert BlockIDFlag parameter in node test Signed-off-by: Thane Thomson * Perform additional check in ProcessProposal for special txs generated by vote extensions Signed-off-by: Thane Thomson * e2e: check that our added tx does not cause all txs to exceed req.MaxTxBytes Signed-off-by: Thane Thomson * Only set vote extension signatures when signing is successful Signed-off-by: Thane Thomson * Remove channel capacity constraint in test helper to avoid missing messages Signed-off-by: Thane Thomson * Add TODO to always require extension signatures in vote validation Signed-off-by: Thane Thomson * e2e: reject vote extensions if the request height does not match what we expect Signed-off-by: Thane Thomson * types: remove extraneous call to voteWithoutExtension in test Signed-off-by: Thane Thomson * Remove unnecessary address parameter from CanonicalVoteExtension Signed-off-by: Thane Thomson * privval: change test vote type to precommit since we use an extension Signed-off-by: Thane Thomson * privval: update signing logic to cater for vote extensions Signed-off-by: Thane Thomson * proto: update field descriptions for vote message Signed-off-by: Thane Thomson * proto: update field description for vote extension sig in vote message Signed-off-by: Thane Thomson * proto/types: use fixed-length 64-bit integers for rounds in CanonicalVoteExtension Signed-off-by: Thane Thomson * consensus: fix flaky TestPrepareProposalReceivesVoteExtensions Signed-off-by: Thane Thomson * consensus: remove previously added test helper functionality Signed-off-by: Thane Thomson * e2e: add error logs when we get an unexpected height in ExtendVote or VerifyVoteExtension requests Signed-off-by: Thane Thomson * node_test: get validator addresses from privvals Signed-off-by: Thane Thomson * privval/file_test: optimize filepv creation in tests Signed-off-by: Thane Thomson * privval: add test to check that vote extensions are always signed Signed-off-by: Thane Thomson * Add a script to check documentation for ToC entries. (#8356) This script verifies that each document in the docs and architecture directory has a corresponding table-of-contents entry in its README file. It can be run manually from the command line. - Hook up this script to run in CI (optional workflow). - Update ADR ToC to include missing entries this script found. * build(deps): Bump async from 2.6.3 to 2.6.4 in /docs (#8357) Bumps [async](https://github.com/caolan/async) from 2.6.3 to 2.6.4. - [Release notes](https://github.com/caolan/async/releases) - [Changelog](https://github.com/caolan/async/blob/v2.6.4/CHANGELOG.md) - [Commits](https://github.com/caolan/async/compare/v2.6.3...v2.6.4) --- updated-dependencies: - dependency-name: async dependency-type: indirect ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * privval/file_test: reset vote ext sig before signing Signed-off-by: Thane Thomson Co-authored-by: M. J. Fromberger Co-authored-by: Sergio Mena Co-authored-by: William Banfield Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * build(deps): Bump github.com/vektra/mockery/v2 from 2.10.6 to 2.11.0 (#8374) Bumps [github.com/vektra/mockery/v2](https://github.com/vektra/mockery) from 2.10.6 to 2.11.0.
Release notes

Sourced from github.com/vektra/mockery/v2's releases.

v2.11.0

Changelog

  • a0d98e4 Add constructor to the generated mocks
  • 09de88a Fix Makefile (don't call "clean" during "all")
  • eddf049 Fix import
  • b4d8eef Fix panic in tests
  • a328a65 Merge branch 'master' into add-constructor-for-mocks
  • 32dd223 Merge pull request #406 from grongor/add-constructor-for-mocks
  • 9489caf TMP-PLS-CHECK-AND-FIXUP fix rebase errors
Commits
  • 32dd223 Merge pull request #406 from grongor/add-constructor-for-mocks
  • eddf049 Fix import
  • a328a65 Merge branch 'master' into add-constructor-for-mocks
  • b4d8eef Fix panic in tests
  • 9489caf TMP-PLS-CHECK-AND-FIXUP fix rebase errors
  • 09de88a Fix Makefile (don't call "clean" during "all")
  • a0d98e4 Add constructor to the generated mocks
  • See full diff in compare view

[![Dependabot compatibility score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=github.com/vektra/mockery/v2&package-manager=go_modules&previous-version=2.10.6&new-version=2.11.0)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores) Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`. [//]: # (dependabot-automerge-start) [//]: # (dependabot-automerge-end) ---
Dependabot commands and options
You can trigger Dependabot actions by commenting on this PR: - `@dependabot rebase` will rebase this PR - `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it - `@dependabot merge` will merge this PR after your CI passes on it - `@dependabot squash and merge` will squash and merge this PR after your CI passes on it - `@dependabot cancel merge` will cancel a previously requested merge and block automerging - `@dependabot reopen` will reopen this PR if it is closed - `@dependabot close` will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually - `@dependabot ignore this major version` will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this minor version` will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this dependency` will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
* node: use signals rather than ephemeral contexts (#8376) * node: cleanup setup for indexer and evidence components (#8378) * test/fuzz: convert to Go 1.18 native fuzzing (#8359) * rpc: reformat method signatures and use a context (#8377) I was digging around over here, and thought it'd be good to cleanup/standardize the line formating on a few of these methods. Also found a few cases where we could use contexts better so did a little bit of cleanup there too! * Add confix testdata for Tendermint v0.30. (#8380) Some additional testdata I grabbed while writing up the draft of RFC 019. * abci: avoid having untracked requests in the channel (#8382) It seems to me that by adding requests to the clients tracker (the `reqSent` linked list), then there's no need to actually drain the channel, becuase we will mark all of these requests as done/errored (which propogates to users, as users never get future objects any more), and then the GC can reap all of the request objects and the channel accordingly. * test/fuzz/tests: remove debug logging statement (#8385) * Add config samples from TM v26, v27, v28, v29. (#8384) * abci: streamline grpc application construction (#8383) In my mind this is "don't make grpc any weirder than it has to be." We definitely don't need to export this type: if you're using gRPC for ABCI you *probably* don't want to also depend on the huge swath of the code that The ideal case is you generate the proto yourself, standup a gRPC service on your own (presumably because your application has other gRPC services that you want to expose,) and then your application doesn't need to interact with the types package at all. This is definitely the case for anyone who uses gRPC and doesn't use Go (which is likely the predominant use case.) If you're using Go, and want to use tendermint's service runner for running your gRPC service, you can, but at this point (as before,) you're already importing the `types` package (and you were before,) I've just eliminated an intermediate type that you shouldn't need to think about. Reviewers: I think the change is pretty rote, but the logic/user-story above would definitely be better for being validated by someone other than me. :) * RFC 019: Configuration File Versioning (#8379) This RFC discusses issues in how we migrate configuration data across Tendermint versions, and some options for how to improve the experience for node operators in the future. * build(deps): Bump github.com/creachadair/tomledit from 0.0.16 to 0.0.18 (#8392) Bumps [github.com/creachadair/tomledit](https://github.com/creachadair/tomledit) from 0.0.16 to 0.0.18.
Commits
  • 5802e26 Release v0.0.18
  • 3c9daf1 document that we don't validate
  • da8c938 Remove non-applicable test cases.
  • ac4210b parser: ensure unclosed arrays are not treated as empty
  • f98f82f parser: ensure array separators are present
  • ea1671e scanner: clean up some issues in escape and space handling
  • 8168589 scanner: filter bad commas in numeric literals
  • 83189e2 scanner: fix some issues in multiline string recognition
  • bdc8e22 scanner: allow space separators in date-time strings
  • 1ab2c8d Add compliance tests.
  • Additional commits viewable in compare view

[![Dependabot compatibility score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=github.com/creachadair/tomledit&package-manager=go_modules&previous-version=0.0.16&new-version=0.0.18)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores) Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`. [//]: # (dependabot-automerge-start) [//]: # (dependabot-automerge-end) ---
Dependabot commands and options
You can trigger Dependabot actions by commenting on this PR: - `@dependabot rebase` will rebase this PR - `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it - `@dependabot merge` will merge this PR after your CI passes on it - `@dependabot squash and merge` will squash and merge this PR after your CI passes on it - `@dependabot cancel merge` will cancel a previously requested merge and block automerging - `@dependabot reopen` will reopen this PR if it is closed - `@dependabot close` will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually - `@dependabot ignore this major version` will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this minor version` will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this dependency` will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
* build(deps): Bump github.com/vektra/mockery/v2 from 2.11.0 to 2.12.0 (#8393) * abci: application type should take contexts (#8388) * abci: Application should return errors errors and nilable response objects (#8396) * Make encoding of HexBytes values more robust. (#8398) The HexBytes wrapper type handles decoding byte strings from JSON. In the RPC API, hashes are encoded as hex digits rather than the standard base64. Simplify the implementation of this wrapper using the TextMarshaler interface, which the encoding/json package uses for values (like these) that are meant to be wrapped in JSON strings. In addition, allow HexBytes values to be decoded from either hex OR base64 input. This preserves all existing use, but will allow us to remove some reflection special cases in the RPC decoder plumbing. Update tests to correctly tolerate empty/nil. * abci: remove redundant methods in client (#8401) * Remove obsolete build tagged patch for net.Pipe. (#8399) The p2p/conn library was using a build patch to work around an old issue with the net.Conn type that has not existed since Go 1.10. Remove the workaround and update usage to use the standard net.Pipe directly. * abci: remove unneccessary implementations (#8403) * abci: interface should take pointers to arguments (#8404) * build(deps): Bump bufbuild/buf-setup-action from 1.3.1 to 1.4.0 (#8405) Bumps [bufbuild/buf-setup-action](https://github.com/bufbuild/buf-setup-action) from 1.3.1 to 1.4.0.
Release notes

Sourced from bufbuild/buf-setup-action's releases.

v1.4.0

  • Set the default buf version to v1.4.0
Commits

[![Dependabot compatibility score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=bufbuild/buf-setup-action&package-manager=github_actions&previous-version=1.3.1&new-version=1.4.0)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores) Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`. [//]: # (dependabot-automerge-start) [//]: # (dependabot-automerge-end) ---
Dependabot commands and options
You can trigger Dependabot actions by commenting on this PR: - `@dependabot rebase` will rebase this PR - `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it - `@dependabot merge` will merge this PR after your CI passes on it - `@dependabot squash and merge` will squash and merge this PR after your CI passes on it - `@dependabot cancel merge` will cancel a previously requested merge and block automerging - `@dependabot reopen` will reopen this PR if it is closed - `@dependabot close` will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually - `@dependabot ignore this major version` will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this minor version` will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this dependency` will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
* build(deps): Bump codecov/codecov-action from 3.0.0 to 3.1.0 (#8406) Bumps [codecov/codecov-action](https://github.com/codecov/codecov-action) from 3.0.0 to 3.1.0.
Release notes

Sourced from codecov/codecov-action's releases.

v3.1.0

3.1.0

Features

  • #699 Incorporate xcode arguments for the Codecov uploader

Dependencies

  • #694 build(deps-dev): bump @​vercel/ncc from 0.33.3 to 0.33.4
  • #696 build(deps-dev): bump @​types/node from 17.0.23 to 17.0.25
  • #698 build(deps-dev): bump jest-junit from 13.0.0 to 13.2.0
Changelog

Sourced from codecov/codecov-action's changelog.

3.1.0

Features

  • #699 Incorporate xcode arguments for the Codecov uploader

Dependencies

  • #694 build(deps-dev): bump @​vercel/ncc from 0.33.3 to 0.33.4
  • #696 build(deps-dev): bump @​types/node from 17.0.23 to 17.0.25
  • #698 build(deps-dev): bump jest-junit from 13.0.0 to 13.2.0
Commits
  • 81cd2dc Merge pull request #699 from codecov/feat-xcode
  • a03184e feat: add xcode support
  • 6a6a9ae Merge pull request #694 from codecov/dependabot/npm_and_yarn/vercel/ncc-0.33.4
  • 92a872a Merge pull request #696 from codecov/dependabot/npm_and_yarn/types/node-17.0.25
  • 43a9c18 Merge pull request #698 from codecov/dependabot/npm_and_yarn/jest-junit-13.2.0
  • 13ce822 Merge pull request #690 from codecov/ci-v3
  • 4d6dbaa build(deps-dev): bump jest-junit from 13.0.0 to 13.2.0
  • 98f0f19 build(deps-dev): bump @​types/node from 17.0.23 to 17.0.25
  • d3021d9 build(deps-dev): bump @​vercel/ncc from 0.33.3 to 0.33.4
  • 2c83f35 Update makefile to v3
  • See full diff in compare view

[![Dependabot compatibility score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=codecov/codecov-action&package-manager=github_actions&previous-version=3.0.0&new-version=3.1.0)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores) Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`. [//]: # (dependabot-automerge-start) [//]: # (dependabot-automerge-end) ---
Dependabot commands and options
You can trigger Dependabot actions by commenting on this PR: - `@dependabot rebase` will rebase this PR - `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it - `@dependabot merge` will merge this PR after your CI passes on it - `@dependabot squash and merge` will squash and merge this PR after your CI passes on it - `@dependabot cancel merge` will cancel a previously requested merge and block automerging - `@dependabot reopen` will reopen this PR if it is closed - `@dependabot close` will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually - `@dependabot ignore this major version` will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this minor version` will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this dependency` will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
* build(deps): Bump google.golang.org/grpc from 1.45.0 to 1.46.0 (#8408) Bumps [google.golang.org/grpc](https://github.com/grpc/grpc-go) from 1.45.0 to 1.46.0.
Release notes

Sourced from google.golang.org/grpc's releases.

Release 1.46.0

New Features

  • server: Support setting TCP_USER_TIMEOUT on grpc.Server connections using keepalive.ServerParameters.Time (#5219)
  • client: perform graceful switching of LB policies in the ClientConn by default (#5285)
  • all: improve logging by including channelz identifier in log messages (#5192)

API Changes

  • grpc: delete WithBalancerName() API, deprecated over 4 years ago in #1697 (#5232)
  • balancer: change BuildOptions.ChannelzParentID to an opaque identifier instead of int (#5192)
    • Note: the balancer package is labeled as EXPERIMENTAL, and we don't believe users were using this field.

Behavior Changes

  • client: change connectivity state to TransientFailure in pick_first LB policy when all addresses are removed (#5274)
    • This is a minor change that brings grpc-go's behavior in line with the intended behavior and how C and Java behave.
  • metadata: add client-side validation of HTTP-invalid metadata before attempting to send (#4886)

Bug Fixes

  • metadata: make a copy of the value slices in FromContext() functions so that modifications won't be made to the original copy (#5267)
  • client: handle invalid service configs by applying the default, if applicable (#5238)
  • xds: the xds client will now apply a 1 second backoff before recreating ADS or LRS streams (#5280)

Dependencies

Commits
  • e8d06c5 Change version to 1.46.0 (#5296)
  • efbd542 gcp/observability: correctly test this module in presubmit tests (#5300) (#5307)
  • 4467a29 gcp/observability: implement logging via binarylog (#5196)
  • 18fdf54 cmd/protoc-gen-go-grpc: allow hooks to modify client structs and service hand...
  • 337b815 interop: build client without timeout; add logs to help debug failures (#5294)
  • e583b19 xds: Add RLS in xDS e2e test (#5281)
  • 0066bf6 grpc: perform graceful switching of LB policies in the ClientConn by defaul...
  • 3cccf6a xdsclient: always backoff between new streams even after successful stream (#...
  • 4e78093 xds: ignore routes with unsupported cluster specifiers (#5269)
  • 99aae34 cluster manager: Add Graceful Switch functionality to Cluster Manager (#5265)
  • Additional commits viewable in compare view

[![Dependabot compatibility score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=google.golang.org/grpc&package-manager=go_modules&previous-version=1.45.0&new-version=1.46.0)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores) Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`. [//]: # (dependabot-automerge-start) [//]: # (dependabot-automerge-end) ---
Dependabot commands and options
You can trigger Dependabot actions by commenting on this PR: - `@dependabot rebase` will rebase this PR - `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it - `@dependabot merge` will merge this PR after your CI passes on it - `@dependabot squash and merge` will squash and merge this PR after your CI passes on it - `@dependabot cancel merge` will cancel a previously requested merge and block automerging - `@dependabot reopen` will reopen this PR if it is closed - `@dependabot close` will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually - `@dependabot ignore this major version` will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this minor version` will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this dependency` will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
* config: minor template infrastructure (#8411) * crypto: remove unused code (#8412) * abci++: Remove intermediate protos (#8414) * Sync protos with their intermediates Signed-off-by: Thane Thomson * Remove intermediate protos and their supporting scripts Signed-off-by: Thane Thomson * make proto-gen Signed-off-by: Thane Thomson * build(deps): Bump github.com/vektra/mockery/v2 from 2.12.0 to 2.12.1 (#8417) Bumps [github.com/vektra/mockery/v2](https://github.com/vektra/mockery) from 2.12.0 to 2.12.1.
Release notes

Sourced from github.com/vektra/mockery/v2's releases.

v2.12.1

Changelog

  • facf60b Add extra test cases for increasing code coverage.
  • 2e1360a Collapse if statements and rename interface in the fixtures.
  • 8bdc90d Fix test on go1.18.
  • fe03b57 Fix tests.
  • b8c62f7 Fix: avoid package name collision with inPackage (#291)
  • c9dc740 Merge pull request #422 from i-sevostyanov/fix-package-collision
  • 58a7f18 Merge pull request #452 from grongor/refactor-first-letter-helper
  • 749b2d6 Refactor mock name generation
Commits
  • c9dc740 Merge pull request #422 from i-sevostyanov/fix-package-collision
  • facf60b Add extra test cases for increasing code coverage.
  • 8bdc90d Fix test on go1.18.
  • fe03b57 Fix tests.
  • 2e1360a Collapse if statements and rename interface in the fixtures.
  • b8c62f7 Fix: avoid package name collision with inPackage (#291)
  • 58a7f18 Merge pull request #452 from grongor/refactor-first-letter-helper
  • 749b2d6 Refactor mock name generation
  • See full diff in compare view

[![Dependabot compatibility score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=github.com/vektra/mockery/v2&package-manager=go_modules&previous-version=2.12.0&new-version=2.12.1)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores) Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`. [//]: # (dependabot-automerge-start) [//]: # (dependabot-automerge-end) ---
Dependabot commands and options
You can trigger Dependabot actions by commenting on this PR: - `@dependabot rebase` will rebase this PR - `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it - `@dependabot merge` will merge this PR after your CI passes on it - `@dependabot squash and merge` will squash and merge this PR after your CI passes on it - `@dependabot cancel merge` will cancel a previously requested merge and block automerging - `@dependabot reopen` will reopen this PR if it is closed - `@dependabot close` will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually - `@dependabot ignore this major version` will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this minor version` will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this dependency` will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
* build(deps): Bump github.com/google/go-cmp from 0.5.7 to 0.5.8 (#8422) Bumps [github.com/google/go-cmp](https://github.com/google/go-cmp) from 0.5.7 to 0.5.8.
Release notes

Sourced from github.com/google/go-cmp's releases.

v0.5.8

Reporter changes:

  • (#293) Fix printing of types in reporter output for interface and pointer types
  • (#294) Use string formatting for slice of bytes in more circumstances

Dependency changes:

  • (#292) Update minimum supported version to go1.13 and remove xerrors dependency
Commits

[![Dependabot compatibility score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=github.com/google/go-cmp&package-manager=go_modules&previous-version=0.5.7&new-version=0.5.8)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores) Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`. [//]: # (dependabot-automerge-start) [//]: # (dependabot-automerge-end) ---
Dependabot commands and options
You can trigger Dependabot actions by commenting on this PR: - `@dependabot rebase` will rebase this PR - `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it - `@dependabot merge` will merge this PR after your CI passes on it - `@dependabot squash and merge` will squash and merge this PR after your CI passes on it - `@dependabot cancel merge` will cancel a previously requested merge and block automerging - `@dependabot reopen` will reopen this PR if it is closed - `@dependabot close` will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually - `@dependabot ignore this major version` will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this minor version` will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this dependency` will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
* fuzz: don't panic on expected errors (#8423) In the conversion to Go 1.18 fuzzing in e4991fd862c8300254417360feb2d66c5861aa54, a `return 0` was converted to a panic. A `return 0` is a hint to the fuzzer, not a failing testcase. While here, clean up the test by folding setup code into it. * Unify RPC method signatures and parameter decoding (#8397) Pass all parameters from JSON-RPC requests to their corresponding handlers using struct types instead of positional parameters. This allows us to control encoding of arguments using only the standard library, and to eliminate the remaining special-purpose JSON encoding hooks in the server. To support existing use, the server still allows arguments to be encoded in JSON as either an array or an object. Related changes: - Rework the RPCFunc constructor to reduce reflection during RPC call service. - Add request parameter wrappers for each RPC service method. - Update the RPC Environment methods to use these types. - Update the interfaces and shims derived from Environment to the new signatures. - Update and extend test cases. * p2p: remove support for multiple transports and endpoints (#8420) * node: start rpc service after reactors (#8426) * p2p: use nodeinfo less often (#8427) * Use patched link-checker for periodic checks. (#8430) In #8339 we pointed the markdown link checker action to a patched version that has the up-to-date version of the underlying check tool. In doing so, I missed the periodic cron job that runs the same workflow. Update it to use the patched version also. * abci++: Vote extension cleanup (#8402) * Split vote verification/validation based on vote extensions Some parts of the code need vote extensions to be verified and validated (mostly in consensus), and other parts of the code don't because its possible that, in some cases (as per RFC 017), we won't have vote extensions. This explicitly facilitates that split. Signed-off-by: Thane Thomson * Only sign extensions in precommits, not prevotes Signed-off-by: Thane Thomson * Update privval/file.go Co-authored-by: M. J. Fromberger * Apply suggestions from code review Co-authored-by: M. J. Fromberger * Temporarily disable extension requirement again for E2E testing Signed-off-by: Thane Thomson * Reorganize comment for clarity Signed-off-by: Thane Thomson * Leave vote validation and pre-call nil check up to caller of VoteToProto Signed-off-by: Thane Thomson * Split complex vote validation test into multiple tests Signed-off-by: Thane Thomson * Universally enforce no vote extensions on any vote type but precommits Signed-off-by: Thane Thomson * Make error messages more generic Signed-off-by: Thane Thomson * Verify with vote extensions when constructing a VoteSet Signed-off-by: Thane Thomson * Expand comment for clarity Signed-off-by: Thane Thomson * Add extension check for prevotes prior to signing votes Signed-off-by: Thane Thomson * Fix supporting test code to only inject extensions into precommits Signed-off-by: Thane Thomson * Separate vote malleation from signing in vote tests for clarity Signed-off-by: Thane Thomson * Add extension signature length check and corresponding test Signed-off-by: Thane Thomson * Perform basic vote validation in CommitToVoteSet Signed-off-by: Thane Thomson Co-authored-by: M. J. Fromberger * rpc: fix byte string decoding for URL parameters (#8431) In #8397 I tried to remove all the cases where we needed to keep track of the target type of parameters for JSON encoding, but there is one case still left: When decoding parameters from URL query terms, there is no way to tell whether or not we need base64 encoding without knowing whether the underlying type of the target is string or []byte. To fix this, keep track of parameters that are []byte valued when RPCFunc is compiling its argument map, and use that when parsing URL query terms. Update the tests accordingly. * crypto: cleanup tmhash package (#8434) * build(deps): Bump github.com/creachadair/tomledit from 0.0.18 to 0.0.19 (#8440) Bumps [github.com/creachadair/tomledit](https://github.com/creachadair/tomledit) from 0.0.18 to 0.0.19.
Commits
  • 0692e41 Release v0.0.19
  • d1160a4 Update default permissions.
  • 56f28f4 Move transform tests to that package.
  • 3b8b380 Add permissions to CI workflow.
  • 409951b Add a quotation test case.
  • f35c8be parser: include line numbers in headings, mappings, and values
  • 26acca1 Regularize location formatting in diagnostics.
  • 3394f59 Add more parser test cases.
  • 5ce10cc Rename test file.
  • 29f3eb3 Allow compliance tests to be skipped with -short.
  • See full diff in compare view

[![Dependabot compatibility score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=github.com/creachadair/tomledit&package-manager=go_modules&previous-version=0.0.18&new-version=0.0.19)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores) Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`. [//]: # (dependabot-automerge-start) [//]: # (dependabot-automerge-end) ---
Dependabot commands and options
You can trigger Dependabot actions by commenting on this PR: - `@dependabot rebase` will rebase this PR - `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it - `@dependabot merge` will merge this PR after your CI passes on it - `@dependabot squash and merge` will squash and merge this PR after your CI passes on it - `@dependabot cancel merge` will cancel a previously requested merge and block automerging - `@dependabot reopen` will reopen this PR if it is closed - `@dependabot close` will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually - `@dependabot ignore this major version` will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this minor version` will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this dependency` will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
* build(deps): Bump github.com/btcsuite/btcd from 0.22.0-beta to 0.22.1 (#8439) Bumps [github.com/btcsuite/btcd](https://github.com/btcsuite/btcd) from 0.22.0-beta to 0.22.1.
Changelog

Sourced from github.com/btcsuite/btcd's changelog.

============================================================================ User visible changes for btcd A full-node bitcoin implementation written in Go

Changes in 0.22.1 (Wed Apr 27 2022)

  • Notable developer-related package changes:
    • Update to use chaincfg/chainhash module and remove conflicting package
  • Contributors (alphabetical order):
    • Dave Collins

Changes in 0.22.0 (Tue Jun 01 2021)

  • Protocol and network-related changes:
    • Add support for witness tx and block in notfound msg (#1625)
    • Add support for receiving sendaddrv2 messages from a peer (#1670)
    • Fix bug in peer package causing last block height to go backwards (#1606)
    • Add chain parameters for connecting to the public Signet network (#1692, #1718)
  • Crypto changes:
    • Fix bug causing panic due to bad R and S signature components in btcec.RecoverCompact (#1691)
    • Set the name (secp256k1) in the CurveParams of the S256 curve (#1565)
  • Notable developer-related package changes:
    • Remove unknown block version warning in the blockchain package, due to false positives triggered by AsicBoost (#1463)
    • Add chaincfg.RegisterHDKeyID function to populate HD key ID pairs (#1617)
    • Add new method mining.AddWitnessCommitment to add the witness commitment as an OP_RETURN output within the coinbase transaction. (#1716)
  • RPC changes:
    • Support Batch JSON-RPC in rpcclient and server (#1583)
    • Add rpcclient method to invoke getdescriptorinfo JSON-RPC command (#1578)
    • Update the rpcserver handler for validateaddress JSON-RPC command to have parity with the bitcoind 0.20.0 interface (#1613)
    • Add rpcclient method to invoke getblockfilter JSON-RPC command (#1579)
    • Add signmessagewithprivkey JSON-RPC command in rpcserver (#1585)
    • Add rpcclient method to invoke importmulti JSON-RPC command (#1579)
    • Add watchOnly argument in rpcclient method to invoke listtransactions JSON-RPC command (#1628)
    • Update btcjson.ListTransactionsResult for compatibility with Bitcoin Core 0.20.0 (#1626)
    • Support nullable optional JSON-RPC parameters (#1594)
    • Add rpcclient and server method to invoke getnodeaddresses JSON-RPC

... (truncated)

Commits
  • 2f508b3 Update CHANGES file for 0.22.1 release.
  • ff92d88 btcd: bump version to v0.22.1.
  • cf5c461 main: Switch to chaincfg/chainhash module.
  • See full diff in compare view

[![Dependabot compatibility score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=github.com/btcsuite/btcd&package-manager=go_modules&previous-version=0.22.0-beta&new-version=0.22.1)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores) Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`. [//]: # (dependabot-automerge-start) [//]: # (dependabot-automerge-end) ---
Dependabot commands and options
You can trigger Dependabot actions by commenting on this PR: - `@dependabot rebase` will rebase this PR - `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it - `@dependabot merge` will merge this PR after your CI passes on it - `@dependabot squash and merge` will squash and merge this PR after your CI passes on it - `@dependabot cancel merge` will cancel a previously requested merge and block automerging - `@dependabot reopen` will reopen this PR if it is closed - `@dependabot close` will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually - `@dependabot ignore this major version` will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this minor version` will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this dependency` will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
* consensus: reduce size of validator set changes test (#8442) * privval/grpc: normalize signature (#8441) * p2p: avoid using p2p.Channel internals (#8444) * blocksync: Honor contexts supplied to BlockPool (#8447) * Lift condition into for loop Signed-off-by: Thane Thomson * Honor contexts in BlockPool Signed-off-by: Thane Thomson * Only stop timers when necessary Signed-off-by: Thane Thomson * Optimize timers Signed-off-by: Thane Thomson * Simplify request interval definition Signed-off-by: Thane Thomson * Remove extraneous timer stop Signed-off-by: Thane Thomson * Convert switch into if Signed-off-by: Thane Thomson * Eliminate timers Signed-off-by: Thane Thomson * PBTS: system model made more precise (#8096) * PBTS model: precision, accuracy, and delay defs * PBTS model: consensus properties reviewed * PBTS model: reinforcing alignment with UTC * PBTS model: precision parameter embodies accuracy * PBTS model: discussion about accuracy shortened * PBTS model: proposal time monotonocity rephrased * PBTS model: precision, accuracy, and delay defs * PBTS model: consensus properties reviewed * PBTS model: reinforcing alignment with UTC * PBTS model: precision parameter embodies accuracy * PBTS model: discussion about accuracy shortened * PBTS model: proposal time monotonocity rephrased * PBTS model: Safety Invariants subsection * PBTS model: MSGDELAY description shortened * PBTS model: timely proposals definition refined * PBTS model: some formatting changes * PBTS model: timely predicate definition * PBTS model: timely proof-of-lock re-defined * PBTS model: derived proof-of-lock requirements * The property needs to be properly demonstrated. * Apply suggestions from William Co-authored-by: William Banfield <4561443+williambanfield@users.noreply.github.com> * PBTS model: reference to arXiv algorithm on timely * PBTS model: typos fixed * PBTS model: derived POL "demonstration" * PBTS model: fix formatting, r' renamed to vr * PBTS model: minor fixes * PBTS model: derived POL proof ammended * PBTS safety: consensus validity with time inequalty * PBTS: renamed receiveTime to proposalReceptionTime * PBTS safety: short intro, some links * PBTS model: safety refactored again * PBTS model: liveness condition stated * PBTS liveness: minor change * Update spec/consensus/proposer-based-timestamp/pbts-sysmodel_002_draft.md Co-authored-by: William Banfield <4561443+williambanfield@users.noreply.github.com> * Update spec/consensus/proposer-based-timestamp/pbts-sysmodel_002_draft.md Co-authored-by: William Banfield <4561443+williambanfield@users.noreply.github.com> * Update spec/consensus/proposer-based-timestamp/pbts-sysmodel_002_draft.md * Update spec/consensus/proposer-based-timestamp/pbts-sysmodel_002_draft.md Co-authored-by: Josef Widder <44643235+josef-widder@users.noreply.github.com> * Update spec/consensus/proposer-based-timestamp/pbts-sysmodel_002_draft.md Co-authored-by: Josef Widder <44643235+josef-widder@users.noreply.github.com> * Update spec/consensus/proposer-based-timestamp/pbts-sysmodel_002_draft.md Co-authored-by: Josef Widder <44643235+josef-widder@users.noreply.github.com> * PBTS sysmodel: formmatting typo fixed Co-authored-by: William Banfield <4561443+williambanfield@users.noreply.github.com> Co-authored-by: Josef Widder <44643235+josef-widder@users.noreply.github.com> * build(deps): Bump docker/setup-buildx-action from 1.6.0 to 1.7.0 (#8451) Bumps [docker/setup-buildx-action](https://github.com/docker/setup-buildx-action) from 1.6.0 to 1.7.0.
Release notes

Sourced from docker/setup-buildx-action's releases.

v1.7.0

  • Standalone mode by @​crazy-max in (#119)
  • Update dev dependencies and workflow by @​crazy-max (#114 #130)
  • Bump tmpl from 1.0.4 to 1.0.5 (#108)
  • Bump ansi-regex from 5.0.0 to 5.0.1 (#109)
  • Bump @​actions/core from 1.5.0 to 1.6.0 (#110)
  • Bump actions/checkout from 2 to 3 (#126)
  • Bump @​actions/tool-cache from 1.7.1 to 1.7.2 (#128)
  • Bump @​actions/exec from 1.1.0 to 1.1.1 (#129)
  • Bump minimist from 1.2.5 to 1.2.6 (#132)
  • Bump codecov/codecov-action from 2 to 3 (#133)
  • Bump semver from 7.3.5 to 7.3.7 (#136)
Commits
  • f211e3e Merge pull request #136 from docker/dependabot/npm_and_yarn/semver-7.3.7
  • b23216e Update generated content
  • be7e600 Bump semver from 7.3.5 to 7.3.7
  • 7117987 Merge pull request #119 from crazy-max/standalone
  • 17ebdd4 ci: add jobs to check standalone behavior
  • 3472856 support standalone mode and display version
  • 74283ca Merge pull request #133 from docker/dependabot/github_actions/codecov/codecov...
  • 5b77ad4 Bump codecov/codecov-action from 2 to 3
  • 2a6fbda Merge pull request #132 from docker/dependabot/npm_and_yarn/minimist-1.2.6
  • 03815bd Bump minimist from 1.2.5 to 1.2.6
  • Additional commits viewable in compare view

[![Dependabot compatibility score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=docker/setup-buildx-action&package-manager=github_actions&previous-version=1.6.0&new-version=1.7.0)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores) Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`. [//]: # (dependabot-automerge-start) [//]: # (dependabot-automerge-end) ---
Dependabot commands and options
You can trigger Dependabot actions by commenting on this PR: - `@dependabot rebase` will rebase this PR - `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it - `@dependabot merge` will merge this PR after your CI passes on it - `@dependabot squash and merge` will squash and merge this PR after your CI passes on it - `@dependabot cancel merge` will cancel a previously requested merge and block automerging - `@dependabot reopen` will reopen this PR if it is closed - `@dependabot close` will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually - `@dependabot ignore this major version` will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this minor version` will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this dependency` will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
* fix: first part of modification after merge * fix: eliminate compile level issues * fix: unit tests in abci/example/kvstore * fix: unit tests in dash/quorum package * fix: deadlock at types.MockPV * fix: blocksync package * fix: evidence package * fix: made some fixes/improvements * fix: change a payload hash of a message vote * fix: remove using a mutex in processPeerUpdate to fix a deadlock * fix: remove double incrementing * fix: some modifications for fixing unit tests * fix: modify TestVoteString * fix: some fixes / improvements * fix: some fixes / improvements * fix: override genesis time for pbst tests * fix: pbst tests * fix: disable checking duplicate votes * fix: use the current time always when making proposal block * fix: consensus state tests * fix: consensus state tests * fix: consensus state tests * fix: the tests inside state package * fix: node tests * fix: add custom marshalling/unmarshalling for coretypes.ResultValidators * fix: add checking on nil in Vote.MarshalZerologObject * fix: light client tests * fix: rpc tests * fix: remove duplicate test TestApp_Height * fix: add mutex for transport_mconn.go * fix: add required option "create-proof-block-range" in a config testdata * chore: remove printing debug stacktrace for a duplicate vote * fix: type error in generateDuplicateVoteEvidence * fix: use thread safe way for interacting with consensus state * chore: remove redundant mock cons_sync_reactor.go * fix: use a normal time ticker for some consensus unit tests * fix: e2e tests * fix: lint issues * fix: abci-cli * fix: detected data race * chore: remove github CI docs-toc.yml workflow * chore: refactor e2e initialization * test(cmd): use correct home path in TestRootConfig * refactor(node): Simplify priv validator initialization code * fix(node): proTxHash not correctly initialized * chore(node): fix whitespace and comments * refactor: add some modifications by RP feedback * fix: proto lint * fix: reuse setValSetUpdate to update validator index and validator-set-updates item in a storage Co-authored-by: William Banfield <4561443+williambanfield@users.noreply.github.com> Co-authored-by: Sam Kleinman Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: M. J. Fromberger Co-authored-by: Manuel Bravo Co-authored-by: Sergio Mena Co-authored-by: Marko Co-authored-by: Thane Thomson Co-authored-by: JayT106 Co-authored-by: frog power 4000 Co-authored-by: Jordi Pinyana Co-authored-by: M. J. Fromberger Co-authored-by: mergify[bot] <37929162+mergify[bot]@users.noreply.github.com> Co-authored-by: Simon Kirillov Co-authored-by: Simon Kirillov Co-authored-by: elias-orijtech <103319121+elias-orijtech@users.noreply.github.com> Co-authored-by: Chill Validation <92176880+chillyvee@users.noreply.github.com> Co-authored-by: John Adler Co-authored-by: Callum Waters Co-authored-by: Ismail Khoffi Co-authored-by: William Banfield Co-authored-by: Daniel Co-authored-by: Josef Widder <44643235+josef-widder@users.noreply.github.com> Co-authored-by: Lukasz Klimek <842586+lklimek@users.noreply.github.com> --- .github/ISSUE_TEMPLATE/proposal.md | 37 + .github/dependabot.yml | 5 +- .github/workflows/build.yml | 15 +- .github/workflows/docker.yml | 4 +- .github/workflows/e2e-manual.yml | 12 +- .github/workflows/e2e-nightly-34x.yml | 8 +- .github/workflows/e2e-nightly-35x.yml | 75 + .github/workflows/e2e-nightly-master.yml | 17 +- .github/workflows/e2e.yml | 6 +- .github/workflows/fuzz-nightly.yml | 29 +- .github/workflows/jepsen.yml | 4 +- .github/workflows/linkchecker.yml | 4 +- .github/workflows/lint.yml | 22 +- .github/workflows/linter.yml | 4 +- .github/workflows/markdown-links.yml | 23 + .github/workflows/proto-docker.yml | 51 - .github/workflows/proto-lint.yml | 21 + .github/workflows/proto.yml | 23 - .github/workflows/release.yml | 8 +- .github/workflows/stale.yml | 2 +- .github/workflows/tests.yml | 22 +- .gitignore | 8 + .markdownlint.yml | 11 + .md-link-check.json | 6 + CHANGELOG_PENDING.md | 61 + CODE_OF_CONDUCT.md | 2 +- CONTRIBUTING.md | 172 +- DOCKER/.gitignore | 1 - DOCKER/Dockerfile.build_c-amazonlinux | 27 - DOCKER/Dockerfile.testing | 16 - DOCKER/Makefile | 13 - DOCKER/README.md | 2 +- DOCKER/build.sh | 20 - DOCKER/push.sh | 22 - Makefile | 55 +- README.md | 61 +- RELEASES.md | 207 + SECURITY.md | 4 +- UPGRADING.md | 179 +- abci/README.md | 2 +- abci/client/client.go | 129 +- abci/client/creators.go | 35 - abci/client/doc.go | 17 +- abci/client/grpc_client.go | 470 +- abci/client/local_client.go | 339 +- abci/client/mocks/client.go | 576 +- abci/client/socket_client.go | 450 +- abci/client/socket_client_test.go | 127 - abci/cmd/abci-cli/abci-cli.go | 341 +- abci/example/counter/counter.go | 81 +- abci/example/example_test.go | 160 +- abci/example/kvstore/README.md | 2 +- abci/example/kvstore/helpers.go | 7 +- abci/example/kvstore/kvstore.go | 399 +- abci/example/kvstore/kvstore_test.go | 285 +- abci/example/kvstore/persistent_kvstore.go | 233 +- abci/server/grpc_server.go | 62 +- abci/server/server.go | 7 +- abci/server/socket_server.go | 319 +- abci/tests/client_server_test.go | 25 +- abci/tests/server/client.go | 48 +- abci/tests/test_cli/ex1.abci | 4 +- abci/tests/test_cli/ex1.abci.out | 18 +- abci/tests/test_cli/ex2.abci | 6 +- abci/tests/test_cli/ex2.abci.out | 10 +- abci/types/application.go | 191 +- abci/types/client.go | 1 - abci/types/messages.go | 122 +- abci/types/messages_test.go | 20 +- abci/types/mocks/application.go | 349 + abci/types/{result.go => types.go} | 74 + abci/types/types.pb.go | 19209 ++++++++++------ abci/types/types_test.go | 74 + abci/version/version.go | 9 - buf.gen.yaml | 18 +- buf.work.yaml | 3 + cmd/priv_val_server/main.go | 30 +- cmd/tenderdash/commands/completion.go | 46 + cmd/tenderdash/commands/debug/debug.go | 34 +- cmd/tenderdash/commands/debug/dump.go | 140 +- cmd/tenderdash/commands/debug/io.go | 3 +- cmd/tenderdash/commands/debug/kill.go | 155 +- cmd/tenderdash/commands/debug/util.go | 18 +- cmd/tenderdash/commands/gen_node_key.go | 4 +- cmd/tenderdash/commands/gen_validator.go | 47 +- cmd/tenderdash/commands/init.go | 85 +- cmd/tenderdash/commands/inspect.go | 70 +- cmd/tenderdash/commands/key_migrate.go | 16 +- cmd/tenderdash/commands/light.go | 332 +- cmd/tenderdash/commands/probe_upnp.go | 32 - cmd/tenderdash/commands/reindex_event.go | 153 +- cmd/tenderdash/commands/reindex_event_test.go | 47 +- cmd/tenderdash/commands/replay.go | 37 +- cmd/tenderdash/commands/reset.go | 179 + .../commands/reset_priv_validator.go | 94 - cmd/tenderdash/commands/reset_test.go | 62 + cmd/tenderdash/commands/rollback.go | 33 +- cmd/tenderdash/commands/root.go | 87 +- cmd/tenderdash/commands/root_test.go | 156 +- cmd/tenderdash/commands/run_node.go | 105 +- cmd/tenderdash/commands/show_node_id.go | 28 +- cmd/tenderdash/commands/show_validator.go | 110 +- cmd/tenderdash/commands/testnet.go | 419 +- cmd/tenderdash/main.go | 66 +- config/config.go | 482 +- config/config_test.go | 110 +- config/db.go | 4 +- config/toml.go | 268 +- config/toml_test.go | 26 +- crypto/README.md | 2 +- crypto/bls12381/bls12381.go | 27 +- crypto/crypto.go | 85 +- crypto/crypto_test.go | 17 + crypto/ed25519/bench_test.go | 1 + crypto/ed25519/ed25519.go | 26 +- crypto/ed25519/ed25519_test.go | 2 +- crypto/encoding/codec.go | 10 +- crypto/example_test.go | 28 - crypto/hash.go | 11 - crypto/merkle/hash.go | 8 +- crypto/merkle/proof.go | 18 +- crypto/merkle/proof_key_path_test.go | 4 +- crypto/merkle/proof_test.go | 28 +- crypto/merkle/proof_value.go | 11 +- crypto/merkle/rfc6962_test.go | 10 +- crypto/merkle/tree_test.go | 8 +- crypto/random.go | 17 +- crypto/secp256k1/secp256k1.go | 66 +- crypto/secp256k1/secp256k1_test.go | 2 +- crypto/tmhash/hash.go | 65 - crypto/tmhash/hash_test.go | 48 - crypto/version.go | 3 - crypto/xchacha20poly1305/vector_test.go | 122 - crypto/xchacha20poly1305/xchachapoly.go | 259 - crypto/xchacha20poly1305/xchachapoly_test.go | 113 - crypto/xsalsa20symmetric/symmetric.go | 54 - crypto/xsalsa20symmetric/symmetric_test.go | 40 - {dashcore/rpc => dash/core}/client.go | 18 +- {dashcore/rpc => dash/core}/mock.go | 14 +- dash/llmq/llmq.go | 3 +- dash/quorum/mock/dash_dialer.go | 2 +- dash/quorum/selectpeers/dip6.go | 2 +- dash/quorum/selectpeers/sortable_validator.go | 4 +- .../selectpeers/sorted_validator_list.go | 2 +- dash/quorum/validator_conn_executor.go | 112 +- dash/quorum/validator_conn_executor_test.go | 194 +- docs/DOCS_README.md | 6 +- docs/README.md | 2 +- docs/app-dev/abci-cli.md | 50 +- docs/app-dev/app-architecture.md | 2 +- docs/app-dev/getting-started.md | 50 +- docs/app-dev/indexing-transactions.md | 2 +- docs/app-dev/readme.md | 5 +- docs/architecture/adr-073-libp2p.md | 235 + docs/architecture/adr-074-timeout-params.md | 203 + docs/architecture/adr-075-rpc-subscription.md | 684 + .../architecture/adr-076-combine-spec-repo.md | 112 + docs/architecture/adr-077-block-retention.md | 109 + docs/architecture/adr-078-nonzero-genesis.md | 82 + .../adr-079-ed25519-verification.md | 57 + docs/architecture/adr-080-reverse-sync.md | 203 + docs/architecture/adr-081-protobuf-mgmt.md | 201 + docs/introduction/architecture.md | 2 +- docs/introduction/what-is-tendermint.md | 18 +- docs/networks/README.md | 16 - docs/nodes/README.md | 2 +- docs/nodes/configuration.md | 309 +- docs/nodes/logging.md | 4 +- docs/nodes/metrics.md | 1 + docs/nodes/remote-signer.md | 2 +- docs/nodes/validators.md | 6 +- docs/package-lock.json | 48 +- docs/pre.sh | 1 + docs/presubmit.sh | 39 + docs/rfc/images/abci++.png | Bin 0 -> 2792638 bytes docs/rfc/images/abci.png | Bin 0 -> 2644284 bytes docs/rfc/rfc-006-event-subscription.md | 204 + docs/rfc/rfc-007-deterministic-proto-bytes.md | 140 + docs/rfc/rfc-008-do-not-panic.md | 139 + .../rfc-009-consensus-parameter-upgrades.md | 128 + docs/rfc/rfc-010-p2p-light-client.rst | 145 + docs/rfc/rfc-011-delete-gas.md | 162 + docs/rfc/rfc-012-custom-indexing.md | 352 + docs/rfc/rfc-013-abci++.md | 253 + docs/rfc/rfc-014-semantic-versioning.md | 94 + docs/rfc/rfc-015-abci++-tx-mutation.md | 261 + docs/rfc/rfc-019-config-version.md | 400 + docs/roadmap/roadmap.md | 32 +- docs/tendermint-core/README.md | 5 +- docs/tendermint-core/block-structure.md | 2 +- .../block-sync/img/block-retention.png | Bin 0 -> 53718 bytes docs/tendermint-core/consensus/README.md | 2 +- .../consensus/proposer-based-timestamps.md | 95 + docs/tendermint-core/light-client.md | 4 +- docs/tendermint-core/rpc.md | 2 +- docs/tendermint-core/subscription.md | 54 +- docs/tendermint-core/using-tendermint.md | 4 +- docs/tools/README.md | 9 +- .../proposer-based-timestamps-runbook.md | 216 + docs/{networks => tools}/docker-compose.md | 0 docs/tools/remote-signer-validation.md | 156 - .../terraform-and-ansible.md | 2 +- docs/tutorials/go-built-in.md | 99 +- docs/tutorials/go.md | 50 +- docs/tutorials/readme.md | 2 +- go.mod | 127 +- go.sum | 228 +- internal/blocksync/doc.go | 11 +- internal/blocksync/{v0 => }/pool.go | 158 +- internal/blocksync/{v0 => }/pool_test.go | 58 +- internal/blocksync/{v0 => }/reactor.go | 502 +- internal/blocksync/{v0 => }/reactor_test.go | 160 +- .../blocksync/v2/internal/behavior/doc.go | 42 - .../v2/internal/behavior/peer_behaviour.go | 47 - .../v2/internal/behavior/reporter.go | 87 - .../v2/internal/behavior/reporter_test.go | 205 - internal/blocksync/v2/io.go | 187 - internal/blocksync/v2/metrics.go | 125 - internal/blocksync/v2/processor.go | 194 - internal/blocksync/v2/processor_context.go | 117 - internal/blocksync/v2/processor_test.go | 305 - internal/blocksync/v2/reactor.go | 650 - internal/blocksync/v2/reactor_test.go | 540 - internal/blocksync/v2/routine.go | 166 - internal/blocksync/v2/routine_test.go | 163 - internal/blocksync/v2/scheduler.go | 711 - internal/blocksync/v2/scheduler_test.go | 2253 -- internal/blocksync/v2/types.go | 65 - internal/consensus/README.md | 3 - internal/consensus/byzantine_test.go | 461 +- internal/consensus/common_test.go | 915 +- internal/consensus/core_chainlock_test.go | 146 +- internal/consensus/invalid_test.go | 95 +- internal/consensus/mempool_test.go | 223 +- internal/consensus/metrics.go | 61 +- internal/consensus/mocks/cons_sync_reactor.go | 28 - internal/consensus/mocks/fast_sync_reactor.go | 1 + internal/consensus/msgs.go | 80 +- internal/consensus/msgs_test.go | 14 +- internal/consensus/pbts_test.go | 506 + internal/consensus/peer_state.go | 49 +- internal/consensus/peer_state_test.go | 101 + internal/consensus/reactor.go | 941 +- internal/consensus/reactor_test.go | 476 +- internal/consensus/replay.go | 229 +- internal/consensus/replay_file.go | 191 +- internal/consensus/replay_stubs.go | 49 +- internal/consensus/replay_test.go | 1071 +- internal/consensus/state.go | 1433 +- internal/consensus/state_test.go | 2849 ++- internal/consensus/ticker.go | 43 +- internal/consensus/types/height_vote_set.go | 12 +- .../consensus/types/height_vote_set_test.go | 56 +- .../consensus/types/peer_round_state_test.go | 1 + internal/consensus/types/round_state.go | 28 +- internal/consensus/wal.go | 77 +- internal/consensus/wal_generator.go | 140 +- internal/consensus/wal_test.go | 170 +- internal/eventbus/event_bus.go | 200 + internal/eventbus/event_bus_test.go | 559 + internal/eventlog/cursor/cursor.go | 100 + internal/eventlog/cursor/cursor_test.go | 141 + internal/eventlog/eventlog.go | 217 + internal/eventlog/eventlog_test.go | 222 + internal/eventlog/item.go | 78 + internal/eventlog/metrics.go | 39 + internal/eventlog/prune.go | 111 + internal/evidence/doc.go | 2 +- internal/evidence/metrics.go | 47 + internal/evidence/mocks/block_store.go | 13 + internal/evidence/pool.go | 110 +- internal/evidence/pool_test.go | 230 +- internal/evidence/reactor.go | 250 +- internal/evidence/reactor_test.go | 173 +- internal/evidence/verify.go | 5 +- internal/evidence/verify_test.go | 67 +- internal/inspect/inspect.go | 52 +- internal/inspect/inspect_test.go | 85 +- internal/inspect/rpc/rpc.go | 59 +- internal/jsontypes/jsontypes.go | 121 + internal/jsontypes/jsontypes_test.go | 188 + {libs => internal/libs}/async/async.go | 0 {libs => internal/libs}/async/async_test.go | 0 internal/libs/autofile/autofile.go | 128 +- internal/libs/autofile/autofile_test.go | 32 +- internal/libs/autofile/cmd/logjack.go | 81 +- internal/libs/autofile/group.go | 113 +- internal/libs/autofile/group_test.go | 84 +- internal/libs/clist/bench_test.go | 2 +- internal/libs/clist/clist.go | 120 +- internal/libs/clist/clist_test.go | 34 +- internal/libs/fail/fail.go | 40 - internal/libs/flowrate/README.md | 10 - internal/libs/flowrate/flowrate.go | 47 +- internal/libs/flowrate/io.go | 133 - internal/libs/flowrate/io_test.go | 197 - internal/libs/flowrate/util.go | 13 +- internal/libs/protoio/io_test.go | 13 +- internal/libs/protoio/writer_test.go | 17 +- internal/libs/queue/queue.go | 232 + internal/libs/queue/queue_test.go | 194 + internal/libs/sync/closer.go | 31 - internal/libs/sync/closer_test.go | 28 - internal/libs/sync/deadlock.go | 18 - internal/libs/sync/sync.go | 16 - internal/libs/tempfile/tempfile.go | 5 +- internal/libs/tempfile/tempfile_test.go | 23 +- internal/libs/timer/throttle_timer.go | 12 +- internal/libs/timer/throttle_timer_test.go | 5 +- internal/mempool/cache.go | 4 +- internal/mempool/ids.go | 28 +- internal/mempool/ids_test.go | 70 +- internal/mempool/mempool.go | 904 +- internal/mempool/mempool_bench_test.go | 50 + internal/mempool/{v1 => }/mempool_test.go | 250 +- internal/mempool/mock/mempool.go | 45 - internal/mempool/mocks/mempool.go | 184 + internal/mempool/{v1 => }/priority_queue.go | 7 +- .../mempool/{v1 => }/priority_queue_test.go | 2 +- internal/mempool/{v1 => }/reactor.go | 251 +- internal/mempool/reactor_test.go | 422 + internal/mempool/tx.go | 276 + internal/mempool/{v1 => }/tx_test.go | 3 +- internal/mempool/types.go | 146 + internal/mempool/v0/bench_test.go | 107 - internal/mempool/v0/cache_test.go | 83 - internal/mempool/v0/clist_mempool.go | 698 - internal/mempool/v0/clist_mempool_test.go | 687 - internal/mempool/v0/doc.go | 23 - internal/mempool/v0/reactor.go | 402 - internal/mempool/v0/reactor_test.go | 392 - internal/mempool/v1/mempool.go | 887 - internal/mempool/v1/mempool_bench_test.go | 32 - internal/mempool/v1/reactor_test.go | 146 - internal/mempool/v1/tx.go | 281 - internal/p2p/README.md | 2 +- internal/p2p/address.go | 8 +- internal/p2p/address_test.go | 41 +- internal/p2p/base_reactor.go | 74 - internal/p2p/channel.go | 212 + internal/p2p/channel_test.go | 221 + internal/p2p/conn/conn_go110.go | 16 - internal/p2p/conn/conn_notgo110.go | 33 - internal/p2p/conn/connection.go | 355 +- internal/p2p/conn/connection_test.go | 344 +- internal/p2p/conn/secret_connection.go | 8 +- internal/p2p/conn/secret_connection_test.go | 20 +- internal/p2p/conn_set.go | 82 - internal/p2p/conn_tracker.go | 3 +- internal/p2p/conn_tracker_test.go | 11 + internal/p2p/errors.go | 10 +- internal/p2p/metrics_test.go | 1 + internal/p2p/mock/peer.go | 70 - internal/p2p/mock/reactor.go | 25 - internal/p2p/mocks/connection.go | 96 +- internal/p2p/mocks/peer.go | 334 - internal/p2p/mocks/transport.go | 71 +- internal/p2p/netaddress.go | 11 - internal/p2p/p2p_test.go | 10 +- internal/p2p/p2ptest/network.go | 146 +- internal/p2p/p2ptest/require.go | 129 +- internal/p2p/p2ptest/util.go | 1 + internal/p2p/peer.go | 383 - internal/p2p/peer_set.go | 149 - internal/p2p/peer_set_test.go | 189 - internal/p2p/peer_test.go | 239 - internal/p2p/peermanager.go | 115 +- internal/p2p/peermanager_scoring_test.go | 35 +- internal/p2p/peermanager_test.go | 226 +- internal/p2p/pex/addrbook.go | 948 - internal/p2p/pex/addrbook_test.go | 777 - internal/p2p/pex/bench_test.go | 24 - internal/p2p/pex/doc.go | 9 +- internal/p2p/pex/errors.go | 89 - internal/p2p/pex/file.go | 83 - internal/p2p/pex/known_address.go | 141 - internal/p2p/pex/params.go | 55 - internal/p2p/pex/pex_reactor.go | 886 - internal/p2p/pex/pex_reactor_test.go | 682 - internal/p2p/pex/reactor.go | 499 +- internal/p2p/pex/reactor_test.go | 480 +- internal/p2p/pqueue.go | 77 +- internal/p2p/pqueue_test.go | 16 +- internal/p2p/queue.go | 30 +- internal/p2p/router.go | 426 +- internal/p2p/router_filter_test.go | 6 +- internal/p2p/router_init_test.go | 29 +- internal/p2p/router_test.go | 465 +- internal/p2p/shim.go | 341 - internal/p2p/shim_test.go | 210 - internal/p2p/switch.go | 1064 - internal/p2p/switch_test.go | 937 - internal/p2p/test_util.go | 296 - internal/p2p/transport.go | 62 +- internal/p2p/transport_mconn.go | 189 +- internal/p2p/transport_mconn_test.go | 79 +- internal/p2p/transport_memory.go | 152 +- internal/p2p/transport_memory_test.go | 3 +- internal/p2p/transport_test.go | 260 +- internal/p2p/trust/config.go | 55 - internal/p2p/trust/metric.go | 412 - internal/p2p/trust/metric_test.go | 118 - internal/p2p/trust/store.go | 220 - internal/p2p/trust/store_test.go | 163 - internal/p2p/trust/ticker.go | 62 - internal/p2p/types.go | 2 +- internal/p2p/upnp/probe.go | 111 - internal/p2p/upnp/upnp.go | 404 - internal/p2p/wdrr_queue.go | 287 - internal/p2p/wdrr_queue_test.go | 208 - internal/proxy/app_conn.go | 250 - internal/proxy/app_conn_test.go | 186 - internal/proxy/client.go | 197 +- internal/proxy/client_test.go | 235 + internal/proxy/mocks/app_conn_consensus.go | 135 +- internal/proxy/mocks/app_conn_mempool.go | 61 +- internal/proxy/mocks/app_conn_query.go | 12 +- internal/proxy/mocks/app_conn_snapshot.go | 16 +- internal/proxy/multi_app_conn.go | 202 - internal/proxy/multi_app_conn_test.go | 94 - internal/pubsub/example_test.go | 34 + internal/pubsub/pubsub.go | 421 + internal/pubsub/pubsub_test.go | 482 + {libs => internal}/pubsub/query/bench_test.go | 7 +- {libs => internal}/pubsub/query/query.go | 27 +- {libs => internal}/pubsub/query/query_test.go | 18 +- {libs => internal}/pubsub/query/syntax/doc.go | 0 .../pubsub/query/syntax/parser.go | 0 .../pubsub/query/syntax/scanner.go | 0 .../pubsub/query/syntax/syntax_test.go | 2 +- internal/pubsub/subindex.go | 117 + internal/pubsub/subscription.go | 90 + internal/rpc/core/abci.go | 26 +- internal/rpc/core/blocks.go | 91 +- internal/rpc/core/blocks_test.go | 28 +- internal/rpc/core/consensus.go | 99 +- internal/rpc/core/dev.go | 5 +- internal/rpc/core/env.go | 204 +- internal/rpc/core/events.go | 256 +- internal/rpc/core/evidence.go | 18 +- internal/rpc/core/health.go | 5 +- internal/rpc/core/mempool.go | 193 +- internal/rpc/core/net.go | 131 +- internal/rpc/core/net_test.go | 89 - internal/rpc/core/routes.go | 141 +- internal/rpc/core/status.go | 32 +- internal/rpc/core/tx.go | 56 +- internal/state/errors.go | 8 +- internal/state/execution.go | 543 +- internal/state/execution_test.go | 749 +- internal/state/export_test.go | 31 - internal/state/helpers_test.go | 226 +- internal/state/indexer/block/kv/kv.go | 32 +- internal/state/indexer/block/kv/kv_test.go | 56 +- internal/state/indexer/block/kv/util.go | 3 +- internal/state/indexer/block/null/null.go | 2 +- internal/state/indexer/eventsink.go | 2 +- internal/state/indexer/indexer.go | 24 +- internal/state/indexer/indexer_service.go | 178 +- .../state/indexer/indexer_service_test.go | 71 +- internal/state/indexer/mocks/event_sink.go | 14 +- internal/state/indexer/query_range.go | 2 +- internal/state/indexer/sink/kv/kv.go | 14 +- internal/state/indexer/sink/kv/kv_test.go | 58 +- internal/state/indexer/sink/null/null.go | 2 +- internal/state/indexer/sink/null/null_test.go | 16 +- internal/state/indexer/sink/psql/psql.go | 10 +- internal/state/indexer/sink/psql/psql_test.go | 66 +- internal/state/indexer/tx/kv/kv.go | 8 +- internal/state/indexer/tx/kv/kv_bench_test.go | 10 +- internal/state/indexer/tx/kv/kv_test.go | 18 +- internal/state/indexer/tx/null/null.go | 2 +- internal/state/mocks/block_store.go | 12 + internal/state/mocks/event_sink.go | 3 +- internal/state/mocks/evidence_pool.go | 41 +- internal/state/mocks/store.go | 12 + internal/state/rollback_test.go | 2 + internal/state/services.go | 16 +- internal/state/state.go | 55 +- internal/state/state_test.go | 317 +- internal/state/store.go | 49 +- internal/state/store_test.go | 54 +- internal/state/test/factory/block.go | 56 +- internal/state/time.go | 46 - internal/state/time_test.go | 57 - internal/state/tx_filter.go | 81 +- internal/state/tx_filter_test.go | 2 +- internal/state/validation.go | 13 +- internal/state/validation_test.go | 239 +- internal/statesync/block_queue.go | 2 +- internal/statesync/block_queue_test.go | 46 +- internal/statesync/chunks.go | 11 +- internal/statesync/chunks_test.go | 11 +- internal/statesync/dispatcher.go | 56 +- internal/statesync/dispatcher_test.go | 92 +- internal/statesync/mocks/state_provider.go | 12 + internal/statesync/reactor.go | 616 +- internal/statesync/reactor_test.go | 343 +- internal/statesync/snapshots.go | 4 +- internal/statesync/stateprovider.go | 37 +- internal/statesync/syncer.go | 101 +- internal/statesync/syncer_test.go | 246 +- internal/store/store.go | 8 +- internal/store/store_test.go | 151 +- internal/test/factory/block.go | 26 +- internal/test/factory/commit.go | 45 +- internal/test/factory/factory_test.go | 6 +- internal/test/factory/genesis.go | 12 +- internal/test/factory/p2p.go | 21 +- internal/test/factory/params.go | 22 + internal/test/factory/tx.go | 13 +- internal/test/factory/vote.go | 8 +- libs/bits/bit_array.go | 51 +- libs/bits/bit_array_test.go | 32 +- libs/bytes/bytes.go | 58 +- libs/bytes/bytes_test.go | 6 +- libs/cli/helper.go | 112 +- libs/cli/setup.go | 106 +- libs/cli/setup_test.go | 114 +- libs/cmap/cmap.go | 91 - libs/cmap/cmap_test.go | 113 - libs/events/Makefile | 9 - libs/events/README.md | 193 - libs/events/event_cache.go | 37 - libs/events/event_cache_test.go | 41 - libs/events/events.go | 163 +- libs/events/events_test.go | 499 +- libs/json/decoder.go | 278 - libs/json/decoder_test.go | 151 - libs/json/doc.go | 99 - libs/json/encoder.go | 254 - libs/json/encoder_test.go | 104 - libs/json/helpers_test.go | 91 - libs/json/structs.go | 88 - libs/json/types.go | 109 - libs/log/default.go | 50 +- libs/log/default_test.go | 6 +- libs/log/nop.go | 3 +- libs/log/testing.go | 62 +- libs/math/safemath.go | 39 +- libs/os/os.go | 27 - libs/os/os_test.go | 89 +- libs/pubsub/example_test.go | 42 - libs/pubsub/pubsub.go | 527 - libs/pubsub/pubsub_test.go | 573 - libs/pubsub/subscription.go | 112 - libs/rand/random.go | 43 - libs/service/service.go | 251 +- libs/service/service_test.go | 148 +- libs/strings/string.go | 50 +- libs/strings/string_test.go | 64 +- libs/sync/atomic_bool.go | 33 - libs/sync/atomic_bool_test.go | 27 - libs/time/mocks/source.go | 40 + libs/time/time.go | 14 + light/client.go | 102 +- light/client_benchmark_test.go | 32 +- light/client_test.go | 1053 +- light/doc.go | 4 +- light/example_test.go | 63 +- light/helpers_test.go | 67 +- light/light_test.go | 104 +- light/provider/errors.go | 10 +- light/provider/http/http.go | 11 +- light/provider/http/http_test.go | 36 +- light/provider/mocks/provider.go | 26 + light/provider/provider.go | 4 + light/proxy/proxy.go | 25 +- light/proxy/routes.go | 316 +- light/rpc/client.go | 118 +- light/rpc/mocks/light_client.go | 28 + light/setup.go | 4 +- light/store/db/db.go | 4 +- light/store/db/db_test.go | 44 +- networks/local/README.md | 2 +- node/node.go | 1403 +- node/node_test.go | 484 +- node/public.go | 31 +- node/seed.go | 162 + node/setup.go | 850 +- privval/dash_core_mock_signer_server.go | 2 +- privval/dash_core_signer_client.go | 62 +- privval/file.go | 297 +- privval/file_test.go | 360 +- privval/grpc/client.go | 3 +- privval/grpc/client_test.go | 60 +- privval/grpc/server.go | 12 +- privval/grpc/server_test.go | 37 +- privval/grpc/util.go | 14 +- privval/msgs_test.go | 35 +- privval/retry_signer_client.go | 14 +- privval/rpc_signer_connection.go | 1 - privval/secret_connection.go | 43 +- privval/signer_client.go | 60 +- privval/signer_client_test.go | 618 +- privval/signer_dialer_endpoint.go | 26 +- privval/signer_endpoint.go | 15 +- privval/signer_listener_endpoint.go | 46 +- privval/signer_listener_endpoint_test.go | 82 +- privval/signer_server.go | 34 +- privval/socket_dialers_test.go | 18 +- privval/socket_listeners_test.go | 18 +- privval/utils.go | 9 - proto/README.md | 21 + proto/buf.lock | 7 + buf.yaml => proto/buf.yaml | 17 +- proto/tendermint/abci/types.proto | 257 +- proto/tendermint/blocksync/types.pb.go | 3 +- proto/tendermint/blocksync/types.proto | 6 +- proto/tendermint/consensus/types.pb.go | 9 +- proto/tendermint/consensus/types.proto | 27 +- proto/tendermint/crypto/crypto.go | 8 + proto/tendermint/p2p/pex.go | 8 - proto/tendermint/p2p/pex.pb.go | 826 +- proto/tendermint/p2p/pex.proto | 23 +- proto/tendermint/p2p/types.proto | 8 +- proto/tendermint/privval/service.proto | 2 +- proto/tendermint/rpc/grpc/types.proto | 32 - proto/tendermint/state/types.pb.go | 259 +- proto/tendermint/state/types.proto | 4 +- proto/tendermint/statesync/message_test.go | 44 +- proto/tendermint/statesync/types.proto | 9 +- proto/tendermint/types/canonical.pb.go | 345 +- proto/tendermint/types/canonical.proto | 9 + proto/tendermint/types/evidence.pb.go | 3 +- proto/tendermint/types/evidence.proto | 7 +- proto/tendermint/types/params.pb.go | 1143 +- proto/tendermint/types/params.proto | 64 +- proto/tendermint/types/types.pb.go | 310 +- proto/tendermint/types/types.proto | 76 +- proto/tendermint/version/types.pb.go | 6 +- proto/tendermint/version/types.proto | 6 +- rpc/client/event_test.go | 199 +- rpc/client/eventstream/eventstream.go | 193 + rpc/client/eventstream/eventstream_test.go | 274 + rpc/client/evidence_test.go | 104 +- rpc/client/examples_test.go | 131 +- rpc/client/helpers.go | 138 +- rpc/client/helpers_test.go | 48 +- rpc/client/http/http.go | 314 +- rpc/client/http/ws.go | 111 +- rpc/client/interface.go | 63 +- rpc/client/local/local.go | 244 +- rpc/client/main_test.go | 25 +- rpc/client/mock/abci.go | 69 +- rpc/client/mock/abci_test.go | 167 +- rpc/client/mock/client.go | 66 +- rpc/client/mock/status_test.go | 55 +- rpc/client/mocks/abci_client.go | 171 + rpc/client/mocks/client.go | 87 +- rpc/client/mocks/events_client.go | 50 + rpc/client/mocks/evidence_client.go | 52 + rpc/client/mocks/history_client.go | 96 + rpc/client/mocks/mempool_client.go | 112 + rpc/client/mocks/network_client.go | 142 + rpc/client/mocks/remote_client.go | 87 +- rpc/client/mocks/sign_client.go | 260 + rpc/client/mocks/status_client.go | 50 + rpc/client/mocks/subscription_client.go | 85 + rpc/client/rpc_test.go | 1427 +- rpc/coretypes/requests.go | 190 + rpc/coretypes/responses.go | 255 +- rpc/coretypes/responses_test.go | 1 + rpc/grpc/api.go | 41 - rpc/grpc/client_server.go | 44 - rpc/grpc/grpc_test.go | 46 - rpc/grpc/types.pb.go | 924 - rpc/jsonrpc/client/args_test.go | 39 - rpc/jsonrpc/client/decode.go | 112 +- rpc/jsonrpc/client/encode.go | 46 - rpc/jsonrpc/client/http_json_client.go | 99 +- rpc/jsonrpc/client/http_json_client_test.go | 10 +- rpc/jsonrpc/client/http_uri_client.go | 85 - rpc/jsonrpc/client/integration_test.go | 42 +- rpc/jsonrpc/client/ws_client.go | 181 +- rpc/jsonrpc/client/ws_client_test.go | 163 +- rpc/jsonrpc/doc.go | 2 +- rpc/jsonrpc/jsonrpc_test.go | 330 +- rpc/jsonrpc/server/http_json_handler.go | 260 +- rpc/jsonrpc/server/http_json_handler_test.go | 86 +- rpc/jsonrpc/server/http_server.go | 309 +- rpc/jsonrpc/server/http_server_test.go | 106 +- rpc/jsonrpc/server/http_uri_handler.go | 269 +- rpc/jsonrpc/server/parse_test.go | 227 +- rpc/jsonrpc/server/rpc_func.go | 271 +- rpc/jsonrpc/server/ws_handler.go | 192 +- rpc/jsonrpc/server/ws_handler_test.go | 37 +- rpc/jsonrpc/test/main.go | 31 +- rpc/jsonrpc/types/types.go | 404 +- rpc/jsonrpc/types/types_test.go | 74 +- rpc/openapi/openapi.yaml | 226 +- rpc/test/helpers.go | 74 +- scripts/authors.sh | 20 +- scripts/confix/condiff/condiff.go | 152 + scripts/confix/confix.go | 163 + scripts/confix/confix_test.go | 99 + scripts/confix/plan.go | 225 + scripts/confix/testdata/README.md | 52 + scripts/confix/testdata/baseline.txt | 73 + .../confix/testdata/diff-26-27.txt | 0 scripts/confix/testdata/diff-27-28.txt | 3 + .../confix/testdata/diff-28-29.txt | 0 .../confix/testdata/diff-29-30.txt | 0 scripts/confix/testdata/diff-30-31.txt | 7 + scripts/confix/testdata/diff-31-32.txt | 5 + scripts/confix/testdata/diff-32-33.txt | 6 + scripts/confix/testdata/diff-33-34.txt | 20 + scripts/confix/testdata/diff-34-35.txt | 31 + scripts/confix/testdata/diff-35-36.txt | 27 + scripts/confix/testdata/non-config.toml | 6 + scripts/confix/testdata/v26-config.toml | 249 + scripts/confix/testdata/v27-config.toml | 249 + scripts/confix/testdata/v28-config.toml | 252 + scripts/confix/testdata/v29-config.toml | 252 + scripts/confix/testdata/v30-config.toml | 252 + scripts/confix/testdata/v31-config.toml | 292 + scripts/confix/testdata/v32-config.toml | 319 + scripts/confix/testdata/v33-config.toml | 335 + scripts/confix/testdata/v34-config.toml | 430 + scripts/confix/testdata/v35-config.toml | 529 + scripts/confix/testdata/v36-config.toml | 481 + scripts/estream/estream.go | 81 + scripts/json2wal/main.go | 14 +- scripts/keymigrate/migrate.go | 248 +- scripts/keymigrate/migrate_test.go | 37 +- scripts/linkpatch/linkpatch.go | 205 + scripts/protocgen.sh | 9 - scripts/scmigrate/migrate.go | 197 + scripts/scmigrate/migrate_test.go | 174 + scripts/wal2json/main.go | 10 +- spec/README.md | 81 + spec/abci++/README.md | 43 + .../abci++_app_requirements_002_draft.md | 165 + .../abci++/abci++_basic_concepts_002_draft.md | 404 + spec/abci++/abci++_methods_002_draft.md | 909 + ...bci++_tmint_expected_behavior_002_draft.md | 218 + spec/abci++/v0.md | 156 + spec/abci++/v1.md | 162 + spec/abci++/v2.md | 180 + spec/abci++/v3.md | 201 + spec/abci++/v4.md | 199 + spec/abci/README.md | 27 + spec/abci/abci.md | 757 + spec/abci/apps.md | 685 + spec/abci/client-server.md | 113 + spec/consensus/bft-time.md | 55 + spec/consensus/consensus-paper/IEEEtran.bst | 2417 ++ spec/consensus/consensus-paper/IEEEtran.cls | 4733 ++++ spec/consensus/consensus-paper/README.md | 24 + .../consensus-paper/algorithmicplus.sty | 195 + spec/consensus/consensus-paper/conclusion.tex | 16 + spec/consensus/consensus-paper/consensus.tex | 397 + .../consensus/consensus-paper/definitions.tex | 126 + spec/consensus/consensus-paper/homodel.sty | 32 + spec/consensus/consensus-paper/intro.tex | 138 + spec/consensus/consensus-paper/latex8.bst | 1124 + spec/consensus/consensus-paper/latex8.sty | 168 + spec/consensus/consensus-paper/lit.bib | 1659 ++ spec/consensus/consensus-paper/paper.tex | 153 + spec/consensus/consensus-paper/proof.tex | 280 + spec/consensus/consensus-paper/rounddiag.sty | 62 + spec/consensus/consensus-paper/technote.sty | 118 + spec/consensus/consensus.md | 352 + spec/consensus/creating-proposal.md | 43 + spec/consensus/evidence.md | 199 + spec/consensus/light-client/README.md | 9 + spec/consensus/light-client/accountability.md | 3 + .../light-client/assets/light-node-image.png | Bin 0 -> 122270 bytes spec/consensus/light-client/detection.md | 3 + spec/consensus/light-client/verification.md | 3 + .../proposer-based-timestamp/README.md | 157 + .../pbts-algorithm_002_draft.md | 148 + .../pbts-sysmodel_002_draft.md | 357 + .../proposer-based-timestamp/tla/Apalache.tla | 109 + .../proposer-based-timestamp/tla/MC_PBT.tla | 77 + .../tla/TendermintPBT_001_draft.tla | 597 + .../tla/TendermintPBT_002_draft.tla | 885 + .../proposer-based-timestamp/tla/typedefs.tla | 39 + .../v1/pbts-algorithm_001_draft.md | 162 + .../v1/pbts-sysmodel_001_draft.md | 194 + .../v1/pbts_001_draft.md | 267 + spec/consensus/proposer-selection.md | 323 + spec/consensus/readme.md | 32 + spec/consensus/signing.md | 229 + spec/consensus/wal.md | 32 + spec/core/data_structures.md | 478 + spec/core/encoding.md | 300 + spec/core/genesis.md | 35 + spec/core/readme.md | 13 + spec/core/state.md | 121 + spec/ivy-proofs/Dockerfile | 37 + spec/ivy-proofs/README.md | 33 + spec/ivy-proofs/abstract_tendermint.ivy | 178 + spec/ivy-proofs/accountable_safety_1.ivy | 143 + spec/ivy-proofs/accountable_safety_2.ivy | 52 + spec/ivy-proofs/check_proofs.sh | 39 + spec/ivy-proofs/classic_safety.ivy | 85 + spec/ivy-proofs/count_lines.sh | 13 + spec/ivy-proofs/docker-compose.yml | 7 + spec/ivy-proofs/domain_model.ivy | 143 + spec/ivy-proofs/network_shim.ivy | 133 + spec/ivy-proofs/output/.gitignore | 4 + spec/ivy-proofs/tendermint.ivy | 420 + spec/ivy-proofs/tendermint_test.ivy | 127 + spec/light-client/README.md | 206 + .../accountability/001indinv-apalache.csv | 13 + spec/light-client/accountability/MC_n4_f1.tla | 46 + spec/light-client/accountability/MC_n4_f2.tla | 46 + .../accountability/MC_n4_f2_amnesia.tla | 62 + spec/light-client/accountability/MC_n4_f3.tla | 46 + spec/light-client/accountability/MC_n5_f1.tla | 46 + spec/light-client/accountability/MC_n5_f2.tla | 46 + spec/light-client/accountability/MC_n6_f1.tla | 46 + spec/light-client/accountability/README.md | 308 + spec/light-client/accountability/Synopsis.md | 105 + .../TendermintAccDebug_004_draft.tla | 101 + .../TendermintAccInv_004_draft.tla | 376 + .../TendermintAccTrace_004_draft.tla | 37 + .../TendermintAcc_004_draft.tla | 596 + .../results/001indinv-apalache-mem-log.svg | 1063 + .../results/001indinv-apalache-mem.svg | 1141 + .../results/001indinv-apalache-ncells.svg | 1015 + .../results/001indinv-apalache-nclauses.svg | 1133 + .../results/001indinv-apalache-report.md | 61 + .../results/001indinv-apalache-time-log.svg | 1134 + .../results/001indinv-apalache-time.svg | 957 + .../results/001indinv-apalache-unstable.csv | 13 + spec/light-client/accountability/run.sh | 9 + spec/light-client/accountability/typedefs.tla | 36 + spec/light-client/assets/light-node-image.png | Bin 0 -> 122270 bytes .../attacks/Blockchain_003_draft.tla | 166 + .../attacks/Isolation_001_draft.tla | 159 + .../attacks/LCVerificationApi_003_draft.tla | 192 + spec/light-client/attacks/MC_5_3.tla | 18 + .../attacks/isolate-attackers_001_draft.md | 222 + .../attacks/isolate-attackers_002_reviewed.md | 225 + .../attacks/notes-on-evidence-handling.md | 219 + .../detection/004bmc-apalache-ok.csv | 10 + .../detection/005bmc-apalache-error.csv | 4 + .../detection/Blockchain_003_draft.tla | 164 + .../detection/LCD_MC3_3_faulty.tla | 27 + .../detection/LCD_MC3_4_faulty.tla | 27 + .../detection/LCD_MC4_4_faulty.tla | 27 + .../detection/LCD_MC5_5_faulty.tla | 27 + .../detection/LCDetector_003_draft.tla | 373 + .../detection/LCVerificationApi_003_draft.tla | 192 + spec/light-client/detection/README.md | 75 + .../detection/detection_001_reviewed.md | 790 + .../detection/detection_003_reviewed.md | 841 + spec/light-client/detection/discussions.md | 178 + .../light-client/detection/draft-functions.md | 289 + .../detection/req-ibc-detection.md | 347 + spec/light-client/experiments.png | Bin 0 -> 83681 bytes .../supervisor/supervisor_001_draft.md | 639 + .../supervisor/supervisor_001_draft.tla | 71 + .../supervisor/supervisor_002_draft.md | 131 + .../verification/001bmc-apalache.csv | 49 + .../verification/002bmc-apalache-ok.csv | 55 + .../verification/003bmc-apalache-error.csv | 45 + .../verification/004bmc-apalache-ok.csv | 10 + .../verification/005bmc-apalache-error.csv | 4 + .../verification/Blockchain_002_draft.tla | 171 + .../verification/Blockchain_003_draft.tla | 164 + .../verification/Blockchain_A_1.tla | 171 + .../LCVerificationApi_003_draft.tla | 192 + .../verification/Lightclient_002_draft.tla | 465 + .../verification/Lightclient_003_draft.tla | 493 + .../verification/Lightclient_A_1.tla | 440 + .../verification/MC4_3_correct.tla | 26 + .../verification/MC4_3_faulty.tla | 26 + .../verification/MC4_4_correct.tla | 26 + .../verification/MC4_4_correct_drifted.tla | 26 + .../verification/MC4_4_faulty.tla | 26 + .../verification/MC4_4_faulty_drifted.tla | 26 + .../verification/MC4_5_correct.tla | 26 + .../verification/MC4_5_faulty.tla | 26 + .../verification/MC4_6_faulty.tla | 26 + .../verification/MC4_7_faulty.tla | 26 + .../verification/MC5_5_correct.tla | 26 + .../MC5_5_correct_peer_two_thirds_faulty.tla | 26 + .../verification/MC5_5_faulty.tla | 26 + .../MC5_5_faulty_peer_two_thirds_faulty.tla | 26 + .../verification/MC5_7_faulty.tla | 26 + .../verification/MC7_5_faulty.tla | 26 + .../verification/MC7_7_faulty.tla | 26 + spec/light-client/verification/README.md | 577 + .../verification_001_published.md | 1180 + .../verification/verification_002_draft.md | 1063 + .../verification/verification_003_draft.md | 76 + spec/p2p/config.md | 49 + spec/p2p/connection.md | 111 + spec/p2p/messages/README.md | 19 + spec/p2p/messages/block-sync.md | 68 + spec/p2p/messages/consensus.md | 149 + spec/p2p/messages/evidence.md | 23 + spec/p2p/messages/mempool.md | 33 + spec/p2p/messages/pex.md | 47 + spec/p2p/messages/state-sync.md | 134 + spec/p2p/node.md | 65 + spec/p2p/peer.md | 130 + spec/p2p/readme.md | 6 + spec/rpc/README.md | 1382 ++ test/Makefile | 2 + test/app/grpc_client.go | 42 - test/app/kvstore_test.sh | 4 +- test/app/test.sh | 28 +- test/docker/Dockerfile | 2 +- test/docker/config-template.toml | 3 + test/e2e/README.md | 2 +- test/e2e/app/app.go | 323 +- test/e2e/app/snapshots.go | 11 +- test/e2e/app/state.go | 12 +- test/e2e/generator/generate.go | 66 +- test/e2e/generator/generate_test.go | 55 +- test/e2e/generator/main.go | 55 +- test/e2e/networks/ci.toml | 12 +- test/e2e/node/main.go | 160 +- test/e2e/pkg/manifest.go | 7 - test/e2e/pkg/mockcoreserver/server_test.go | 8 +- test/e2e/pkg/testnet.go | 11 +- test/e2e/runner/benchmark.go | 8 +- test/e2e/runner/cleanup.go | 11 +- test/e2e/runner/evidence.go | 68 +- test/e2e/runner/load.go | 3 +- test/e2e/runner/main.go | 74 +- test/e2e/runner/perturb.go | 9 +- test/e2e/runner/rpc.go | 14 +- test/e2e/runner/setup.go | 45 +- test/e2e/runner/start.go | 18 +- test/e2e/runner/test.go | 2 - test/e2e/runner/wait.go | 7 +- test/e2e/tests/app_test.go | 54 +- test/e2e/tests/block_test.go | 10 +- test/e2e/tests/e2e_test.go | 10 +- test/e2e/tests/evidence_test.go | 10 +- test/e2e/tests/net_test.go | 3 +- test/e2e/tests/validator_test.go | 31 +- test/fuzz/Makefile | 52 - test/fuzz/README.md | 62 +- test/fuzz/mempool/v0/checktx.go | 37 - test/fuzz/mempool/v0/fuzz_test.go | 33 - test/fuzz/mempool/v0/testdata/cases/empty | 0 test/fuzz/mempool/v1/checktx.go | 37 - test/fuzz/mempool/v1/fuzz_test.go | 33 - test/fuzz/mempool/v1/testdata/cases/empty | 0 test/fuzz/oss-fuzz-build.sh | 26 +- test/fuzz/p2p/addrbook/fuzz.go | 35 - test/fuzz/p2p/addrbook/fuzz_test.go | 33 - test/fuzz/p2p/addrbook/init-corpus/main.go | 59 - test/fuzz/p2p/addrbook/testdata/cases/empty | 0 test/fuzz/p2p/pex/fuzz_test.go | 33 - test/fuzz/p2p/pex/init-corpus/main.go | 84 - test/fuzz/p2p/pex/reactor_receive.go | 95 - test/fuzz/p2p/pex/testdata/addrbook1 | 1705 -- test/fuzz/p2p/secretconnection/fuzz_test.go | 33 - .../p2p/secretconnection/init-corpus/main.go | 48 - test/fuzz/rpc/jsonrpc/server/fuzz_test.go | 33 - test/fuzz/rpc/jsonrpc/server/handler.go | 63 - .../1184f5b8d4b6dd08709cf1513f26744167065e0d | 1 - .../1184f5b8d4b6dd08709cf1513f26744167065e0d | 1 - .../bbcffb1cdb2cea50fd3dd8c1524905551d0b2e79 | 1 - ...d-fuzz_rpc_jsonrpc_server-4738572803506176 | 1 - ...d-fuzz_rpc_jsonrpc_server-4738572803506176 | 1 - test/fuzz/tests/mempool_test.go | 33 + .../p2p_secretconnection_test.go} | 20 +- test/fuzz/tests/rpc_jsonrpc_server_test.go | 72 + ...cb7440674e67a9e2cc0a4531863076254ada059863 | 2 + ...9a43e0f9fd5c94bba343ce7bb6724d4ebafe311ed4 | 2 + ...a91bcef18e6f24cf368bb4bd248c7a7101ef8e178d | 2 + ...9bad652d355431f5824327271aca6f648e8cd4e786 | 2 + ...9b235928fc1c8c4adbb4635913c204c4724cf47d20 | 2 + ...c8907cb66557347cb9b45709b17da861997d7cabea | 2 + ...b97caa73657b4a78d48e5fd6fc3b1590d24799e803 | 2 + ...c18a7ec4eb3c9e1384af92cfa14cf50951535b6c85 | 2 + ...a91bcef18e6f24cf368bb4bd248c7a7101ef8e178d | 2 + ...0b1d027f749960376c338e14a81e0396ffc6e6d6bd | 2 + ...ea46edb8b7cf7368e90da0cb35888a1452f4d114a2 | 2 + ...5b430076844ebd0b3c4f30f5263b94a3d50f00bce6 | 2 + ...e64b33c804d994cce06781e8c39481411793a8a73f | 2 + ...a91bcef18e6f24cf368bb4bd248c7a7101ef8e178d | 2 + third_party/proto/gogoproto/gogo.proto | 147 - tools/proto/Dockerfile | 27 - tools/tm-signer-harness/Dockerfile | 4 - tools/tm-signer-harness/Makefile | 21 - tools/tm-signer-harness/README.md | 5 - .../internal/test_harness.go | 443 - .../internal/test_harness_test.go | 256 - tools/tm-signer-harness/internal/utils.go | 25 - tools/tm-signer-harness/main.go | 203 - types/block.go | 163 +- types/block_meta.go | 12 +- types/block_meta_test.go | 10 +- types/block_test.go | 386 +- types/canonical.go | 14 +- types/canonical_test.go | 4 +- types/core_chainlock.go | 4 +- types/errors_p2p.go | 33 - types/event_bus.go | 330 - types/event_bus_test.go | 515 - types/events.go | 162 +- types/events_test.go | 16 + types/evidence.go | 183 +- types/evidence_test.go | 129 +- types/genesis.go | 135 +- types/genesis_test.go | 39 +- types/keys.go | 6 - types/light.go | 16 + types/light_test.go | 26 +- types/netaddress.go | 61 - types/netaddress_test.go | 83 +- types/node_id.go | 3 +- types/node_info.go | 102 +- types/node_info_test.go | 127 +- types/node_key.go | 51 +- types/node_key_test.go | 4 +- types/params.go | 241 +- types/params_test.go | 344 +- types/part_set.go | 8 +- types/part_set_test.go | 6 +- types/priv_validator.go | 35 +- types/proposal.go | 84 +- types/proposal_test.go | 168 +- types/protobuf.go | 8 +- types/protobuf_test.go | 11 +- types/results.go | 54 - types/results_test.go | 54 - types/signable.go | 18 - types/stateid.go | 12 +- types/test_util.go | 78 +- types/tx.go | 226 +- types/tx_test.go | 187 +- types/validation.go | 7 +- types/validation_test.go | 9 +- types/validator.go | 50 +- types/validator_address.go | 6 +- types/validator_set.go | 14 +- types/validator_set_test.go | 118 +- types/validator_test.go | 9 +- types/vote.go | 240 +- types/vote_set.go | 63 +- types/vote_set_test.go | 174 +- types/vote_test.go | 356 +- version/version.go | 4 +- 1043 files changed, 107885 insertions(+), 66177 deletions(-) create mode 100644 .github/ISSUE_TEMPLATE/proposal.md create mode 100644 .github/workflows/e2e-nightly-35x.yml create mode 100644 .github/workflows/markdown-links.yml delete mode 100644 .github/workflows/proto-docker.yml create mode 100644 .github/workflows/proto-lint.yml delete mode 100644 .github/workflows/proto.yml create mode 100644 .markdownlint.yml create mode 100644 .md-link-check.json delete mode 100644 DOCKER/.gitignore delete mode 100644 DOCKER/Dockerfile.build_c-amazonlinux delete mode 100644 DOCKER/Dockerfile.testing delete mode 100644 DOCKER/Makefile delete mode 100755 DOCKER/build.sh delete mode 100755 DOCKER/push.sh create mode 100644 RELEASES.md delete mode 100644 abci/client/creators.go delete mode 100644 abci/client/socket_client_test.go delete mode 100644 abci/types/client.go create mode 100644 abci/types/mocks/application.go rename abci/types/{result.go => types.go} (59%) create mode 100644 abci/types/types_test.go delete mode 100644 abci/version/version.go create mode 100644 buf.work.yaml create mode 100644 cmd/tenderdash/commands/completion.go delete mode 100644 cmd/tenderdash/commands/probe_upnp.go create mode 100644 cmd/tenderdash/commands/reset.go delete mode 100644 cmd/tenderdash/commands/reset_priv_validator.go create mode 100644 cmd/tenderdash/commands/reset_test.go create mode 100644 crypto/crypto_test.go delete mode 100644 crypto/example_test.go delete mode 100644 crypto/hash.go delete mode 100644 crypto/tmhash/hash.go delete mode 100644 crypto/tmhash/hash_test.go delete mode 100644 crypto/version.go delete mode 100644 crypto/xchacha20poly1305/vector_test.go delete mode 100644 crypto/xchacha20poly1305/xchachapoly.go delete mode 100644 crypto/xchacha20poly1305/xchachapoly_test.go delete mode 100644 crypto/xsalsa20symmetric/symmetric.go delete mode 100644 crypto/xsalsa20symmetric/symmetric_test.go rename {dashcore/rpc => dash/core}/client.go (92%) rename {dashcore/rpc => dash/core}/mock.go (92%) create mode 100644 docs/architecture/adr-073-libp2p.md create mode 100644 docs/architecture/adr-074-timeout-params.md create mode 100644 docs/architecture/adr-075-rpc-subscription.md create mode 100644 docs/architecture/adr-076-combine-spec-repo.md create mode 100644 docs/architecture/adr-077-block-retention.md create mode 100644 docs/architecture/adr-078-nonzero-genesis.md create mode 100644 docs/architecture/adr-079-ed25519-verification.md create mode 100644 docs/architecture/adr-080-reverse-sync.md create mode 100644 docs/architecture/adr-081-protobuf-mgmt.md delete mode 100644 docs/networks/README.md create mode 100755 docs/presubmit.sh create mode 100644 docs/rfc/images/abci++.png create mode 100644 docs/rfc/images/abci.png create mode 100644 docs/rfc/rfc-006-event-subscription.md create mode 100644 docs/rfc/rfc-007-deterministic-proto-bytes.md create mode 100644 docs/rfc/rfc-008-do-not-panic.md create mode 100644 docs/rfc/rfc-009-consensus-parameter-upgrades.md create mode 100644 docs/rfc/rfc-010-p2p-light-client.rst create mode 100644 docs/rfc/rfc-011-delete-gas.md create mode 100644 docs/rfc/rfc-012-custom-indexing.md create mode 100644 docs/rfc/rfc-013-abci++.md create mode 100644 docs/rfc/rfc-014-semantic-versioning.md create mode 100644 docs/rfc/rfc-015-abci++-tx-mutation.md create mode 100644 docs/rfc/rfc-019-config-version.md create mode 100644 docs/tendermint-core/block-sync/img/block-retention.png create mode 100644 docs/tendermint-core/consensus/proposer-based-timestamps.md create mode 100644 docs/tools/debugging/proposer-based-timestamps-runbook.md rename docs/{networks => tools}/docker-compose.md (100%) delete mode 100644 docs/tools/remote-signer-validation.md rename docs/{networks => tools}/terraform-and-ansible.md (99%) rename internal/blocksync/{v0 => }/pool.go (84%) rename internal/blocksync/{v0 => }/pool_test.go (85%) rename internal/blocksync/{v0 => }/reactor.go (56%) rename internal/blocksync/{v0 => }/reactor_test.go (66%) delete mode 100644 internal/blocksync/v2/internal/behavior/doc.go delete mode 100644 internal/blocksync/v2/internal/behavior/peer_behaviour.go delete mode 100644 internal/blocksync/v2/internal/behavior/reporter.go delete mode 100644 internal/blocksync/v2/internal/behavior/reporter_test.go delete mode 100644 internal/blocksync/v2/io.go delete mode 100644 internal/blocksync/v2/metrics.go delete mode 100644 internal/blocksync/v2/processor.go delete mode 100644 internal/blocksync/v2/processor_context.go delete mode 100644 internal/blocksync/v2/processor_test.go delete mode 100644 internal/blocksync/v2/reactor.go delete mode 100644 internal/blocksync/v2/reactor_test.go delete mode 100644 internal/blocksync/v2/routine.go delete mode 100644 internal/blocksync/v2/routine_test.go delete mode 100644 internal/blocksync/v2/scheduler.go delete mode 100644 internal/blocksync/v2/scheduler_test.go delete mode 100644 internal/blocksync/v2/types.go delete mode 100644 internal/consensus/README.md delete mode 100644 internal/consensus/mocks/cons_sync_reactor.go create mode 100644 internal/consensus/pbts_test.go create mode 100644 internal/consensus/peer_state_test.go create mode 100644 internal/eventbus/event_bus.go create mode 100644 internal/eventbus/event_bus_test.go create mode 100644 internal/eventlog/cursor/cursor.go create mode 100644 internal/eventlog/cursor/cursor_test.go create mode 100644 internal/eventlog/eventlog.go create mode 100644 internal/eventlog/eventlog_test.go create mode 100644 internal/eventlog/item.go create mode 100644 internal/eventlog/metrics.go create mode 100644 internal/eventlog/prune.go create mode 100644 internal/evidence/metrics.go create mode 100644 internal/jsontypes/jsontypes.go create mode 100644 internal/jsontypes/jsontypes_test.go rename {libs => internal/libs}/async/async.go (100%) rename {libs => internal/libs}/async/async_test.go (100%) delete mode 100644 internal/libs/fail/fail.go delete mode 100644 internal/libs/flowrate/README.md delete mode 100644 internal/libs/flowrate/io.go delete mode 100644 internal/libs/flowrate/io_test.go create mode 100644 internal/libs/queue/queue.go create mode 100644 internal/libs/queue/queue_test.go delete mode 100644 internal/libs/sync/closer.go delete mode 100644 internal/libs/sync/closer_test.go delete mode 100644 internal/libs/sync/deadlock.go delete mode 100644 internal/libs/sync/sync.go create mode 100644 internal/mempool/mempool_bench_test.go rename internal/mempool/{v1 => }/mempool_test.go (61%) delete mode 100644 internal/mempool/mock/mempool.go create mode 100644 internal/mempool/mocks/mempool.go rename internal/mempool/{v1 => }/priority_queue.go (97%) rename internal/mempool/{v1 => }/priority_queue_test.go (99%) rename internal/mempool/{v1 => }/reactor.go (56%) create mode 100644 internal/mempool/reactor_test.go rename internal/mempool/{v1 => }/tx_test.go (99%) create mode 100644 internal/mempool/types.go delete mode 100644 internal/mempool/v0/bench_test.go delete mode 100644 internal/mempool/v0/cache_test.go delete mode 100644 internal/mempool/v0/clist_mempool.go delete mode 100644 internal/mempool/v0/clist_mempool_test.go delete mode 100644 internal/mempool/v0/doc.go delete mode 100644 internal/mempool/v0/reactor.go delete mode 100644 internal/mempool/v0/reactor_test.go delete mode 100644 internal/mempool/v1/mempool.go delete mode 100644 internal/mempool/v1/mempool_bench_test.go delete mode 100644 internal/mempool/v1/reactor_test.go delete mode 100644 internal/mempool/v1/tx.go delete mode 100644 internal/p2p/base_reactor.go create mode 100644 internal/p2p/channel.go create mode 100644 internal/p2p/channel_test.go delete mode 100644 internal/p2p/conn/conn_go110.go delete mode 100644 internal/p2p/conn/conn_notgo110.go delete mode 100644 internal/p2p/conn_set.go delete mode 100644 internal/p2p/mock/peer.go delete mode 100644 internal/p2p/mock/reactor.go delete mode 100644 internal/p2p/mocks/peer.go delete mode 100644 internal/p2p/netaddress.go delete mode 100644 internal/p2p/peer.go delete mode 100644 internal/p2p/peer_set.go delete mode 100644 internal/p2p/peer_set_test.go delete mode 100644 internal/p2p/peer_test.go delete mode 100644 internal/p2p/pex/addrbook.go delete mode 100644 internal/p2p/pex/addrbook_test.go delete mode 100644 internal/p2p/pex/bench_test.go delete mode 100644 internal/p2p/pex/errors.go delete mode 100644 internal/p2p/pex/file.go delete mode 100644 internal/p2p/pex/known_address.go delete mode 100644 internal/p2p/pex/params.go delete mode 100644 internal/p2p/pex/pex_reactor.go delete mode 100644 internal/p2p/pex/pex_reactor_test.go delete mode 100644 internal/p2p/shim.go delete mode 100644 internal/p2p/shim_test.go delete mode 100644 internal/p2p/switch.go delete mode 100644 internal/p2p/switch_test.go delete mode 100644 internal/p2p/test_util.go delete mode 100644 internal/p2p/trust/config.go delete mode 100644 internal/p2p/trust/metric.go delete mode 100644 internal/p2p/trust/metric_test.go delete mode 100644 internal/p2p/trust/store.go delete mode 100644 internal/p2p/trust/store_test.go delete mode 100644 internal/p2p/trust/ticker.go delete mode 100644 internal/p2p/upnp/probe.go delete mode 100644 internal/p2p/upnp/upnp.go delete mode 100644 internal/p2p/wdrr_queue.go delete mode 100644 internal/p2p/wdrr_queue_test.go delete mode 100644 internal/proxy/app_conn.go delete mode 100644 internal/proxy/app_conn_test.go create mode 100644 internal/proxy/client_test.go delete mode 100644 internal/proxy/multi_app_conn.go delete mode 100644 internal/proxy/multi_app_conn_test.go create mode 100644 internal/pubsub/example_test.go create mode 100644 internal/pubsub/pubsub.go create mode 100644 internal/pubsub/pubsub_test.go rename {libs => internal}/pubsub/query/bench_test.go (85%) rename {libs => internal}/pubsub/query/query.go (94%) rename {libs => internal}/pubsub/query/query_test.go (94%) rename {libs => internal}/pubsub/query/syntax/doc.go (100%) rename {libs => internal}/pubsub/query/syntax/parser.go (100%) rename {libs => internal}/pubsub/query/syntax/scanner.go (100%) rename {libs => internal}/pubsub/query/syntax/syntax_test.go (98%) create mode 100644 internal/pubsub/subindex.go create mode 100644 internal/pubsub/subscription.go delete mode 100644 internal/rpc/core/net_test.go delete mode 100644 internal/state/time.go delete mode 100644 internal/state/time_test.go create mode 100644 internal/test/factory/params.go delete mode 100644 libs/cmap/cmap.go delete mode 100644 libs/cmap/cmap_test.go delete mode 100644 libs/events/Makefile delete mode 100644 libs/events/README.md delete mode 100644 libs/events/event_cache.go delete mode 100644 libs/events/event_cache_test.go delete mode 100644 libs/json/decoder.go delete mode 100644 libs/json/decoder_test.go delete mode 100644 libs/json/doc.go delete mode 100644 libs/json/encoder.go delete mode 100644 libs/json/encoder_test.go delete mode 100644 libs/json/helpers_test.go delete mode 100644 libs/json/structs.go delete mode 100644 libs/json/types.go delete mode 100644 libs/pubsub/example_test.go delete mode 100644 libs/pubsub/pubsub.go delete mode 100644 libs/pubsub/pubsub_test.go delete mode 100644 libs/pubsub/subscription.go delete mode 100644 libs/sync/atomic_bool.go delete mode 100644 libs/sync/atomic_bool_test.go create mode 100644 libs/time/mocks/source.go create mode 100644 node/seed.go delete mode 100644 privval/rpc_signer_connection.go create mode 100644 proto/README.md create mode 100644 proto/buf.lock rename buf.yaml => proto/buf.yaml (50%) create mode 100644 proto/tendermint/crypto/crypto.go delete mode 100644 proto/tendermint/rpc/grpc/types.proto create mode 100644 rpc/client/eventstream/eventstream.go create mode 100644 rpc/client/eventstream/eventstream_test.go create mode 100644 rpc/client/mocks/abci_client.go create mode 100644 rpc/client/mocks/events_client.go create mode 100644 rpc/client/mocks/evidence_client.go create mode 100644 rpc/client/mocks/history_client.go create mode 100644 rpc/client/mocks/mempool_client.go create mode 100644 rpc/client/mocks/network_client.go create mode 100644 rpc/client/mocks/sign_client.go create mode 100644 rpc/client/mocks/status_client.go create mode 100644 rpc/client/mocks/subscription_client.go create mode 100644 rpc/coretypes/requests.go delete mode 100644 rpc/grpc/api.go delete mode 100644 rpc/grpc/client_server.go delete mode 100644 rpc/grpc/grpc_test.go delete mode 100644 rpc/grpc/types.pb.go delete mode 100644 rpc/jsonrpc/client/args_test.go delete mode 100644 rpc/jsonrpc/client/encode.go delete mode 100644 rpc/jsonrpc/client/http_uri_client.go create mode 100644 scripts/confix/condiff/condiff.go create mode 100644 scripts/confix/confix.go create mode 100644 scripts/confix/confix_test.go create mode 100644 scripts/confix/plan.go create mode 100644 scripts/confix/testdata/README.md create mode 100644 scripts/confix/testdata/baseline.txt rename test/fuzz/rpc/jsonrpc/server/testdata/cases/empty => scripts/confix/testdata/diff-26-27.txt (100%) create mode 100644 scripts/confix/testdata/diff-27-28.txt rename test/fuzz/p2p/secretconnection/testdata/cases/empty => scripts/confix/testdata/diff-28-29.txt (100%) rename test/fuzz/p2p/pex/testdata/cases/empty => scripts/confix/testdata/diff-29-30.txt (100%) create mode 100644 scripts/confix/testdata/diff-30-31.txt create mode 100644 scripts/confix/testdata/diff-31-32.txt create mode 100644 scripts/confix/testdata/diff-32-33.txt create mode 100644 scripts/confix/testdata/diff-33-34.txt create mode 100644 scripts/confix/testdata/diff-34-35.txt create mode 100644 scripts/confix/testdata/diff-35-36.txt create mode 100644 scripts/confix/testdata/non-config.toml create mode 100644 scripts/confix/testdata/v26-config.toml create mode 100644 scripts/confix/testdata/v27-config.toml create mode 100644 scripts/confix/testdata/v28-config.toml create mode 100644 scripts/confix/testdata/v29-config.toml create mode 100644 scripts/confix/testdata/v30-config.toml create mode 100644 scripts/confix/testdata/v31-config.toml create mode 100644 scripts/confix/testdata/v32-config.toml create mode 100644 scripts/confix/testdata/v33-config.toml create mode 100644 scripts/confix/testdata/v34-config.toml create mode 100644 scripts/confix/testdata/v35-config.toml create mode 100644 scripts/confix/testdata/v36-config.toml create mode 100644 scripts/estream/estream.go create mode 100644 scripts/linkpatch/linkpatch.go delete mode 100755 scripts/protocgen.sh create mode 100644 scripts/scmigrate/migrate.go create mode 100644 scripts/scmigrate/migrate_test.go create mode 100644 spec/README.md create mode 100644 spec/abci++/README.md create mode 100644 spec/abci++/abci++_app_requirements_002_draft.md create mode 100644 spec/abci++/abci++_basic_concepts_002_draft.md create mode 100644 spec/abci++/abci++_methods_002_draft.md create mode 100644 spec/abci++/abci++_tmint_expected_behavior_002_draft.md create mode 100644 spec/abci++/v0.md create mode 100644 spec/abci++/v1.md create mode 100644 spec/abci++/v2.md create mode 100644 spec/abci++/v3.md create mode 100644 spec/abci++/v4.md create mode 100644 spec/abci/README.md create mode 100644 spec/abci/abci.md create mode 100644 spec/abci/apps.md create mode 100644 spec/abci/client-server.md create mode 100644 spec/consensus/bft-time.md create mode 100644 spec/consensus/consensus-paper/IEEEtran.bst create mode 100644 spec/consensus/consensus-paper/IEEEtran.cls create mode 100644 spec/consensus/consensus-paper/README.md create mode 100644 spec/consensus/consensus-paper/algorithmicplus.sty create mode 100644 spec/consensus/consensus-paper/conclusion.tex create mode 100644 spec/consensus/consensus-paper/consensus.tex create mode 100644 spec/consensus/consensus-paper/definitions.tex create mode 100644 spec/consensus/consensus-paper/homodel.sty create mode 100644 spec/consensus/consensus-paper/intro.tex create mode 100644 spec/consensus/consensus-paper/latex8.bst create mode 100644 spec/consensus/consensus-paper/latex8.sty create mode 100644 spec/consensus/consensus-paper/lit.bib create mode 100644 spec/consensus/consensus-paper/paper.tex create mode 100644 spec/consensus/consensus-paper/proof.tex create mode 100644 spec/consensus/consensus-paper/rounddiag.sty create mode 100644 spec/consensus/consensus-paper/technote.sty create mode 100644 spec/consensus/consensus.md create mode 100644 spec/consensus/creating-proposal.md create mode 100644 spec/consensus/evidence.md create mode 100644 spec/consensus/light-client/README.md create mode 100644 spec/consensus/light-client/accountability.md create mode 100644 spec/consensus/light-client/assets/light-node-image.png create mode 100644 spec/consensus/light-client/detection.md create mode 100644 spec/consensus/light-client/verification.md create mode 100644 spec/consensus/proposer-based-timestamp/README.md create mode 100644 spec/consensus/proposer-based-timestamp/pbts-algorithm_002_draft.md create mode 100644 spec/consensus/proposer-based-timestamp/pbts-sysmodel_002_draft.md create mode 100644 spec/consensus/proposer-based-timestamp/tla/Apalache.tla create mode 100644 spec/consensus/proposer-based-timestamp/tla/MC_PBT.tla create mode 100644 spec/consensus/proposer-based-timestamp/tla/TendermintPBT_001_draft.tla create mode 100644 spec/consensus/proposer-based-timestamp/tla/TendermintPBT_002_draft.tla create mode 100644 spec/consensus/proposer-based-timestamp/tla/typedefs.tla create mode 100644 spec/consensus/proposer-based-timestamp/v1/pbts-algorithm_001_draft.md create mode 100644 spec/consensus/proposer-based-timestamp/v1/pbts-sysmodel_001_draft.md create mode 100644 spec/consensus/proposer-based-timestamp/v1/pbts_001_draft.md create mode 100644 spec/consensus/proposer-selection.md create mode 100644 spec/consensus/readme.md create mode 100644 spec/consensus/signing.md create mode 100644 spec/consensus/wal.md create mode 100644 spec/core/data_structures.md create mode 100644 spec/core/encoding.md create mode 100644 spec/core/genesis.md create mode 100644 spec/core/readme.md create mode 100644 spec/core/state.md create mode 100644 spec/ivy-proofs/Dockerfile create mode 100644 spec/ivy-proofs/README.md create mode 100644 spec/ivy-proofs/abstract_tendermint.ivy create mode 100644 spec/ivy-proofs/accountable_safety_1.ivy create mode 100644 spec/ivy-proofs/accountable_safety_2.ivy create mode 100755 spec/ivy-proofs/check_proofs.sh create mode 100644 spec/ivy-proofs/classic_safety.ivy create mode 100755 spec/ivy-proofs/count_lines.sh create mode 100644 spec/ivy-proofs/docker-compose.yml create mode 100644 spec/ivy-proofs/domain_model.ivy create mode 100644 spec/ivy-proofs/network_shim.ivy create mode 100644 spec/ivy-proofs/output/.gitignore create mode 100644 spec/ivy-proofs/tendermint.ivy create mode 100644 spec/ivy-proofs/tendermint_test.ivy create mode 100644 spec/light-client/README.md create mode 100644 spec/light-client/accountability/001indinv-apalache.csv create mode 100644 spec/light-client/accountability/MC_n4_f1.tla create mode 100644 spec/light-client/accountability/MC_n4_f2.tla create mode 100644 spec/light-client/accountability/MC_n4_f2_amnesia.tla create mode 100644 spec/light-client/accountability/MC_n4_f3.tla create mode 100644 spec/light-client/accountability/MC_n5_f1.tla create mode 100644 spec/light-client/accountability/MC_n5_f2.tla create mode 100644 spec/light-client/accountability/MC_n6_f1.tla create mode 100644 spec/light-client/accountability/README.md create mode 100644 spec/light-client/accountability/Synopsis.md create mode 100644 spec/light-client/accountability/TendermintAccDebug_004_draft.tla create mode 100644 spec/light-client/accountability/TendermintAccInv_004_draft.tla create mode 100644 spec/light-client/accountability/TendermintAccTrace_004_draft.tla create mode 100644 spec/light-client/accountability/TendermintAcc_004_draft.tla create mode 100644 spec/light-client/accountability/results/001indinv-apalache-mem-log.svg create mode 100644 spec/light-client/accountability/results/001indinv-apalache-mem.svg create mode 100644 spec/light-client/accountability/results/001indinv-apalache-ncells.svg create mode 100644 spec/light-client/accountability/results/001indinv-apalache-nclauses.svg create mode 100644 spec/light-client/accountability/results/001indinv-apalache-report.md create mode 100644 spec/light-client/accountability/results/001indinv-apalache-time-log.svg create mode 100644 spec/light-client/accountability/results/001indinv-apalache-time.svg create mode 100644 spec/light-client/accountability/results/001indinv-apalache-unstable.csv create mode 100755 spec/light-client/accountability/run.sh create mode 100644 spec/light-client/accountability/typedefs.tla create mode 100644 spec/light-client/assets/light-node-image.png create mode 100644 spec/light-client/attacks/Blockchain_003_draft.tla create mode 100644 spec/light-client/attacks/Isolation_001_draft.tla create mode 100644 spec/light-client/attacks/LCVerificationApi_003_draft.tla create mode 100644 spec/light-client/attacks/MC_5_3.tla create mode 100644 spec/light-client/attacks/isolate-attackers_001_draft.md create mode 100644 spec/light-client/attacks/isolate-attackers_002_reviewed.md create mode 100644 spec/light-client/attacks/notes-on-evidence-handling.md create mode 100644 spec/light-client/detection/004bmc-apalache-ok.csv create mode 100644 spec/light-client/detection/005bmc-apalache-error.csv create mode 100644 spec/light-client/detection/Blockchain_003_draft.tla create mode 100644 spec/light-client/detection/LCD_MC3_3_faulty.tla create mode 100644 spec/light-client/detection/LCD_MC3_4_faulty.tla create mode 100644 spec/light-client/detection/LCD_MC4_4_faulty.tla create mode 100644 spec/light-client/detection/LCD_MC5_5_faulty.tla create mode 100644 spec/light-client/detection/LCDetector_003_draft.tla create mode 100644 spec/light-client/detection/LCVerificationApi_003_draft.tla create mode 100644 spec/light-client/detection/README.md create mode 100644 spec/light-client/detection/detection_001_reviewed.md create mode 100644 spec/light-client/detection/detection_003_reviewed.md create mode 100644 spec/light-client/detection/discussions.md create mode 100644 spec/light-client/detection/draft-functions.md create mode 100644 spec/light-client/detection/req-ibc-detection.md create mode 100644 spec/light-client/experiments.png create mode 100644 spec/light-client/supervisor/supervisor_001_draft.md create mode 100644 spec/light-client/supervisor/supervisor_001_draft.tla create mode 100644 spec/light-client/supervisor/supervisor_002_draft.md create mode 100644 spec/light-client/verification/001bmc-apalache.csv create mode 100644 spec/light-client/verification/002bmc-apalache-ok.csv create mode 100644 spec/light-client/verification/003bmc-apalache-error.csv create mode 100644 spec/light-client/verification/004bmc-apalache-ok.csv create mode 100644 spec/light-client/verification/005bmc-apalache-error.csv create mode 100644 spec/light-client/verification/Blockchain_002_draft.tla create mode 100644 spec/light-client/verification/Blockchain_003_draft.tla create mode 100644 spec/light-client/verification/Blockchain_A_1.tla create mode 100644 spec/light-client/verification/LCVerificationApi_003_draft.tla create mode 100644 spec/light-client/verification/Lightclient_002_draft.tla create mode 100644 spec/light-client/verification/Lightclient_003_draft.tla create mode 100644 spec/light-client/verification/Lightclient_A_1.tla create mode 100644 spec/light-client/verification/MC4_3_correct.tla create mode 100644 spec/light-client/verification/MC4_3_faulty.tla create mode 100644 spec/light-client/verification/MC4_4_correct.tla create mode 100644 spec/light-client/verification/MC4_4_correct_drifted.tla create mode 100644 spec/light-client/verification/MC4_4_faulty.tla create mode 100644 spec/light-client/verification/MC4_4_faulty_drifted.tla create mode 100644 spec/light-client/verification/MC4_5_correct.tla create mode 100644 spec/light-client/verification/MC4_5_faulty.tla create mode 100644 spec/light-client/verification/MC4_6_faulty.tla create mode 100644 spec/light-client/verification/MC4_7_faulty.tla create mode 100644 spec/light-client/verification/MC5_5_correct.tla create mode 100644 spec/light-client/verification/MC5_5_correct_peer_two_thirds_faulty.tla create mode 100644 spec/light-client/verification/MC5_5_faulty.tla create mode 100644 spec/light-client/verification/MC5_5_faulty_peer_two_thirds_faulty.tla create mode 100644 spec/light-client/verification/MC5_7_faulty.tla create mode 100644 spec/light-client/verification/MC7_5_faulty.tla create mode 100644 spec/light-client/verification/MC7_7_faulty.tla create mode 100644 spec/light-client/verification/README.md create mode 100644 spec/light-client/verification/verification_001_published.md create mode 100644 spec/light-client/verification/verification_002_draft.md create mode 100644 spec/light-client/verification/verification_003_draft.md create mode 100644 spec/p2p/config.md create mode 100644 spec/p2p/connection.md create mode 100644 spec/p2p/messages/README.md create mode 100644 spec/p2p/messages/block-sync.md create mode 100644 spec/p2p/messages/consensus.md create mode 100644 spec/p2p/messages/evidence.md create mode 100644 spec/p2p/messages/mempool.md create mode 100644 spec/p2p/messages/pex.md create mode 100644 spec/p2p/messages/state-sync.md create mode 100644 spec/p2p/node.md create mode 100644 spec/p2p/peer.md create mode 100644 spec/p2p/readme.md create mode 100644 spec/rpc/README.md delete mode 100644 test/app/grpc_client.go delete mode 100644 test/fuzz/Makefile delete mode 100644 test/fuzz/mempool/v0/checktx.go delete mode 100644 test/fuzz/mempool/v0/fuzz_test.go delete mode 100644 test/fuzz/mempool/v0/testdata/cases/empty delete mode 100644 test/fuzz/mempool/v1/checktx.go delete mode 100644 test/fuzz/mempool/v1/fuzz_test.go delete mode 100644 test/fuzz/mempool/v1/testdata/cases/empty delete mode 100644 test/fuzz/p2p/addrbook/fuzz.go delete mode 100644 test/fuzz/p2p/addrbook/fuzz_test.go delete mode 100644 test/fuzz/p2p/addrbook/init-corpus/main.go delete mode 100644 test/fuzz/p2p/addrbook/testdata/cases/empty delete mode 100644 test/fuzz/p2p/pex/fuzz_test.go delete mode 100644 test/fuzz/p2p/pex/init-corpus/main.go delete mode 100644 test/fuzz/p2p/pex/reactor_receive.go delete mode 100644 test/fuzz/p2p/pex/testdata/addrbook1 delete mode 100644 test/fuzz/p2p/secretconnection/fuzz_test.go delete mode 100644 test/fuzz/p2p/secretconnection/init-corpus/main.go delete mode 100644 test/fuzz/rpc/jsonrpc/server/fuzz_test.go delete mode 100644 test/fuzz/rpc/jsonrpc/server/handler.go delete mode 100644 test/fuzz/rpc/jsonrpc/server/testdata/1184f5b8d4b6dd08709cf1513f26744167065e0d delete mode 100644 test/fuzz/rpc/jsonrpc/server/testdata/cases/1184f5b8d4b6dd08709cf1513f26744167065e0d delete mode 100644 test/fuzz/rpc/jsonrpc/server/testdata/cases/bbcffb1cdb2cea50fd3dd8c1524905551d0b2e79 delete mode 100644 test/fuzz/rpc/jsonrpc/server/testdata/cases/clusterfuzz-testcase-minimized-fuzz_rpc_jsonrpc_server-4738572803506176 delete mode 100644 test/fuzz/rpc/jsonrpc/server/testdata/clusterfuzz-testcase-minimized-fuzz_rpc_jsonrpc_server-4738572803506176 create mode 100644 test/fuzz/tests/mempool_test.go rename test/fuzz/{p2p/secretconnection/read_write.go => tests/p2p_secretconnection_test.go} (92%) create mode 100644 test/fuzz/tests/rpc_jsonrpc_server_test.go create mode 100644 test/fuzz/tests/testdata/fuzz/FuzzMempool/1daffc1033a0bfc7f0c2bccb7440674e67a9e2cc0a4531863076254ada059863 create mode 100644 test/fuzz/tests/testdata/fuzz/FuzzMempool/582528ddfad69eb57775199a43e0f9fd5c94bba343ce7bb6724d4ebafe311ed4 create mode 100644 test/fuzz/tests/testdata/fuzz/FuzzMempool/d40a98862ed393eb712e47a91bcef18e6f24cf368bb4bd248c7a7101ef8e178d create mode 100644 test/fuzz/tests/testdata/fuzz/FuzzP2PSecretConnection/0f1a3d10e4d642e42a3ccd9bad652d355431f5824327271aca6f648e8cd4e786 create mode 100644 test/fuzz/tests/testdata/fuzz/FuzzP2PSecretConnection/172c521d1c5e7a5cce55e39b235928fc1c8c4adbb4635913c204c4724cf47d20 create mode 100644 test/fuzz/tests/testdata/fuzz/FuzzP2PSecretConnection/a9481542b8154bfe8fe868c8907cb66557347cb9b45709b17da861997d7cabea create mode 100644 test/fuzz/tests/testdata/fuzz/FuzzP2PSecretConnection/ba3758980fe724f83bdf1cb97caa73657b4a78d48e5fd6fc3b1590d24799e803 create mode 100644 test/fuzz/tests/testdata/fuzz/FuzzP2PSecretConnection/c22ff3cdf5145a03ecc6a2c18a7ec4eb3c9e1384af92cfa14cf50951535b6c85 create mode 100644 test/fuzz/tests/testdata/fuzz/FuzzP2PSecretConnection/d40a98862ed393eb712e47a91bcef18e6f24cf368bb4bd248c7a7101ef8e178d create mode 100644 test/fuzz/tests/testdata/fuzz/FuzzP2PSecretConnection/dc7304b2cddeadd08647d30b1d027f749960376c338e14a81e0396ffc6e6d6bd create mode 100644 test/fuzz/tests/testdata/fuzz/FuzzRPCJSONRPCServer/058ae08103537df220789dea46edb8b7cf7368e90da0cb35888a1452f4d114a2 create mode 100644 test/fuzz/tests/testdata/fuzz/FuzzRPCJSONRPCServer/2ab633cb322fca9e76fc965b430076844ebd0b3c4f30f5263b94a3d50f00bce6 create mode 100644 test/fuzz/tests/testdata/fuzz/FuzzRPCJSONRPCServer/aadb440fa55da05c1185e3e64b33c804d994cce06781e8c39481411793a8a73f create mode 100644 test/fuzz/tests/testdata/fuzz/FuzzRPCJSONRPCServer/d40a98862ed393eb712e47a91bcef18e6f24cf368bb4bd248c7a7101ef8e178d delete mode 100644 third_party/proto/gogoproto/gogo.proto delete mode 100644 tools/proto/Dockerfile delete mode 100644 tools/tm-signer-harness/Dockerfile delete mode 100644 tools/tm-signer-harness/Makefile delete mode 100644 tools/tm-signer-harness/README.md delete mode 100644 tools/tm-signer-harness/internal/test_harness.go delete mode 100644 tools/tm-signer-harness/internal/test_harness_test.go delete mode 100644 tools/tm-signer-harness/internal/utils.go delete mode 100644 tools/tm-signer-harness/main.go delete mode 100644 types/errors_p2p.go delete mode 100644 types/event_bus.go delete mode 100644 types/event_bus_test.go delete mode 100644 types/keys.go delete mode 100644 types/results.go delete mode 100644 types/results_test.go diff --git a/.github/ISSUE_TEMPLATE/proposal.md b/.github/ISSUE_TEMPLATE/proposal.md new file mode 100644 index 0000000000..45f0bff42f --- /dev/null +++ b/.github/ISSUE_TEMPLATE/proposal.md @@ -0,0 +1,37 @@ +--- +name: Protocol Change Proposal +about: Create a proposal to request a change to the protocol + +--- + + + +# Protocol Change Proposal + +## Summary + + + +## Problem Definition + + + +## Proposal + + + +____ + +#### For Admin Use + +- [ ] Not duplicate issue +- [ ] Appropriate labels applied +- [ ] Appropriate contributors tagged +- [ ] Contributor assigned/self-assigned diff --git a/.github/dependabot.yml b/.github/dependabot.yml index 9960106ffd..4bd765afd2 100644 --- a/.github/dependabot.yml +++ b/.github/dependabot.yml @@ -3,8 +3,7 @@ updates: - package-ecosystem: github-actions directory: "/" schedule: - interval: daily - time: "11:00" + interval: weekly open-pull-requests-limit: 10 # - package-ecosystem: npm # directory: "/docs" @@ -18,7 +17,7 @@ updates: directory: "/" schedule: interval: daily - time: "11:00" + target-branch: "v0.35.x" open-pull-requests-limit: 10 reviewers: - shotonoff diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index de908193c6..ebc0f58ee2 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -1,4 +1,3 @@ ---- name: Build # Tests runs different tests (test_abci_apps, test_abci_cli, test_apps) # This workflow runs on every push to master or release branch and every pull requests @@ -43,7 +42,7 @@ jobs: arch: ${{ matrix.goarch }} - name: install-gcc run: sudo apt-get update -qq && sudo apt-get install -qq --yes gcc-10-arm-linux-gnueabi g++-10-arm-linux-gnueabi - if: "matrix.goarch == 'arm'" + if: "matrix.goarch == 'arm'" - name: install run: | GOOS=${{ matrix.goos }} GOARCH=${{ matrix.goarch }} make build-binary @@ -55,11 +54,11 @@ jobs: needs: build timeout-minutes: 5 steps: - - uses: actions/setup-go@v2 + - uses: actions/setup-go@v3 with: go-version: "1.17" - - uses: actions/checkout@v2.4.0 - - uses: technote-space/get-diff-action@v5 + - uses: actions/checkout@v3 + - uses: technote-space/get-diff-action@v6 with: PATTERNS: | **/**.go @@ -80,11 +79,11 @@ jobs: needs: build timeout-minutes: 5 steps: - - uses: actions/setup-go@v2 + - uses: actions/setup-go@v3 with: go-version: "1.17" - - uses: actions/checkout@v2.4.0 - - uses: technote-space/get-diff-action@v5 + - uses: actions/checkout@v3 + - uses: technote-space/get-diff-action@v6 with: PATTERNS: | **/**.go diff --git a/.github/workflows/docker.yml b/.github/workflows/docker.yml index c8ff2e1b35..65f07c43ab 100644 --- a/.github/workflows/docker.yml +++ b/.github/workflows/docker.yml @@ -19,7 +19,7 @@ jobs: platforms: all - name: Set up Docker Build - uses: docker/setup-buildx-action@v1.6.0 + uses: docker/setup-buildx-action@v1.7.0 - name: Login to DockerHub if: ${{ github.event_name != 'pull_request' }} @@ -50,7 +50,7 @@ jobs: suffix=${{ steps.suffix.outputs.result }} - name: Publish to Docker Hub - uses: docker/build-push-action@v2.9.0 + uses: docker/build-push-action@v2.10.0 with: context: . file: ./DOCKER/Dockerfile diff --git a/.github/workflows/e2e-manual.yml b/.github/workflows/e2e-manual.yml index acff89af10..bab3fcf62d 100644 --- a/.github/workflows/e2e-manual.yml +++ b/.github/workflows/e2e-manual.yml @@ -1,4 +1,5 @@ -# Manually run randomly generated E2E testnets (as nightly). +# Runs randomly generated E2E testnets nightly on master +# manually run e2e tests name: e2e-manual on: workflow_dispatch: @@ -10,16 +11,15 @@ jobs: strategy: fail-fast: false matrix: - p2p: ['legacy', 'new', 'hybrid'] group: ['00', '01', '02', '03'] runs-on: ubuntu-latest timeout-minutes: 60 steps: - - uses: actions/setup-go@v2 + - uses: actions/setup-go@v3 with: go-version: '1.17' - - uses: actions/checkout@v2.4.0 + - uses: actions/checkout@v3 - name: Build working-directory: test/e2e @@ -29,8 +29,8 @@ jobs: - name: Generate testnets working-directory: test/e2e # When changing -g, also change the matrix groups above - run: ./build/generator -g 4 -d networks/nightly/${{ matrix.p2p }} -p ${{ matrix.p2p }} + run: ./build/generator -g 4 -d networks/nightly/ - name: Run ${{ matrix.p2p }} p2p testnets working-directory: test/e2e - run: ./run-multiple.sh networks/nightly/${{ matrix.p2p }}/*-group${{ matrix.group }}-*.toml + run: ./run-multiple.sh networks/nightly/*-group${{ matrix.group }}-*.toml diff --git a/.github/workflows/e2e-nightly-34x.yml b/.github/workflows/e2e-nightly-34x.yml index 0160718359..ec92cb112b 100644 --- a/.github/workflows/e2e-nightly-34x.yml +++ b/.github/workflows/e2e-nightly-34x.yml @@ -6,7 +6,7 @@ name: e2e-nightly-34x on: - workflow_dispatch: # allow running workflow manually, in theory + workflow_dispatch: # allow running workflow manually, in theory schedule: - cron: '0 2 * * *' @@ -21,11 +21,11 @@ jobs: runs-on: ubuntu-latest timeout-minutes: 60 steps: - - uses: actions/setup-go@v2 + - uses: actions/setup-go@v3 with: go-version: '1.17' - - uses: actions/checkout@v2.3.4 + - uses: actions/checkout@v3 with: ref: 'v0.34.x' @@ -59,7 +59,7 @@ jobs: SLACK_MESSAGE: Nightly E2E tests failed on v0.34.x SLACK_FOOTER: '' - e2e-nightly-success: # may turn this off once they seem to pass consistently + e2e-nightly-success: # may turn this off once they seem to pass consistently needs: e2e-nightly-test if: ${{ success() }} runs-on: ubuntu-latest diff --git a/.github/workflows/e2e-nightly-35x.yml b/.github/workflows/e2e-nightly-35x.yml new file mode 100644 index 0000000000..c397ead9c0 --- /dev/null +++ b/.github/workflows/e2e-nightly-35x.yml @@ -0,0 +1,75 @@ +# Runs randomly generated E2E testnets nightly on v0.35.x. + +# !! If you change something in this file, you probably want +# to update the e2e-nightly-master workflow as well! + +name: e2e-nightly-35x +on: + schedule: + - cron: '0 2 * * *' + +jobs: + e2e-nightly-test: + # Run parallel jobs for the listed testnet groups (must match the + # ./build/generator -g flag) + strategy: + fail-fast: false + matrix: + p2p: ['legacy', 'new', 'hybrid'] + group: ['00', '01', '02', '03'] + runs-on: ubuntu-latest + timeout-minutes: 60 + steps: + - uses: actions/setup-go@v3 + with: + go-version: '1.17' + + - uses: actions/checkout@v3 + with: + ref: 'v0.35.x' + + - name: Build + working-directory: test/e2e + # Run make jobs in parallel, since we can't run steps in parallel. + run: make -j2 docker generator runner tests + + - name: Generate testnets + working-directory: test/e2e + # When changing -g, also change the matrix groups above + run: ./build/generator -g 4 -d networks/nightly/${{ matrix.p2p }} -p ${{ matrix.p2p }} + + - name: Run ${{ matrix.p2p }} p2p testnets in group ${{ matrix.group }} + working-directory: test/e2e + run: ./run-multiple.sh networks/nightly/${{ matrix.p2p }}/*-group${{ matrix.group }}-*.toml + + e2e-nightly-fail-2: + needs: e2e-nightly-test + if: ${{ failure() }} + runs-on: ubuntu-latest + steps: + - name: Notify Slack on failure + uses: rtCamp/action-slack-notify@12e36fc18b0689399306c2e0b3e0f2978b7f1ee7 + env: + SLACK_WEBHOOK: ${{ secrets.SLACK_WEBHOOK }} + SLACK_CHANNEL: tendermint-internal + SLACK_USERNAME: Nightly E2E Tests + SLACK_ICON_EMOJI: ':skull:' + SLACK_COLOR: danger + SLACK_MESSAGE: Nightly E2E tests failed on v0.35.x + SLACK_FOOTER: '' + + e2e-nightly-success: # may turn this off once they seem to pass consistently + needs: e2e-nightly-test + if: ${{ success() }} + runs-on: ubuntu-latest + steps: + - name: Notify Slack on success + uses: rtCamp/action-slack-notify@12e36fc18b0689399306c2e0b3e0f2978b7f1ee7 + env: + SLACK_WEBHOOK: ${{ secrets.SLACK_WEBHOOK }} + SLACK_CHANNEL: tendermint-internal + SLACK_USERNAME: Nightly E2E Tests + SLACK_ICON_EMOJI: ':white_check_mark:' + SLACK_COLOR: good + SLACK_MESSAGE: Nightly E2E tests passed on v0.35.x + SLACK_FOOTER: '' diff --git a/.github/workflows/e2e-nightly-master.yml b/.github/workflows/e2e-nightly-master.yml index 30479bf8de..58ffa81c17 100644 --- a/.github/workflows/e2e-nightly-master.yml +++ b/.github/workflows/e2e-nightly-master.yml @@ -5,27 +5,26 @@ name: e2e-nightly-master on: - workflow_dispatch: # allow running workflow manually + workflow_dispatch: # allow running workflow manually schedule: - cron: '0 2 * * *' jobs: - e2e-nightly-test-2: + e2e-nightly-test: # Run parallel jobs for the listed testnet groups (must match the # ./build/generator -g flag) strategy: fail-fast: false matrix: - p2p: ['legacy', 'new', 'hybrid'] group: ['00', '01', '02', '03'] runs-on: ubuntu-latest timeout-minutes: 60 steps: - - uses: actions/setup-go@v2 + - uses: actions/setup-go@v3 with: go-version: '1.17' - - uses: actions/checkout@v2.3.4 + - uses: actions/checkout@v3 - name: Build working-directory: test/e2e @@ -35,14 +34,14 @@ jobs: - name: Generate testnets working-directory: test/e2e # When changing -g, also change the matrix groups above - run: ./build/generator -g 4 -d networks/nightly/${{ matrix.p2p }} -p ${{ matrix.p2p }} + run: ./build/generator -g 4 -d networks/nightly/ - - name: Run ${{ matrix.p2p }} p2p testnets in group ${{ matrix.group }} + - name: Run ${{ matrix.p2p }} p2p testnets working-directory: test/e2e - run: ./run-multiple.sh networks/nightly/${{ matrix.p2p }}/*-group${{ matrix.group }}-*.toml + run: ./run-multiple.sh networks/nightly/*-group${{ matrix.group }}-*.toml e2e-nightly-fail-2: - needs: e2e-nightly-test-2 + needs: e2e-nightly-test if: ${{ failure() }} runs-on: ubuntu-latest steps: diff --git a/.github/workflows/e2e.yml b/.github/workflows/e2e.yml index a44473e647..de13a03302 100644 --- a/.github/workflows/e2e.yml +++ b/.github/workflows/e2e.yml @@ -20,13 +20,13 @@ jobs: env: FULLNODE_PUBKEY_KEEP: false steps: - - uses: actions/setup-go@v2 + - uses: actions/setup-go@v3 with: go-version: '1.17' - - uses: actions/checkout@v2.3.4 + - uses: actions/checkout@v3 with: submodules: true - - uses: technote-space/get-diff-action@v5 + - uses: technote-space/get-diff-action@v6 with: PATTERNS: | **/**.go diff --git a/.github/workflows/fuzz-nightly.yml b/.github/workflows/fuzz-nightly.yml index 57a0962084..0fcab9ae5b 100644 --- a/.github/workflows/fuzz-nightly.yml +++ b/.github/workflows/fuzz-nightly.yml @@ -13,34 +13,19 @@ jobs: fuzz-nightly-test: runs-on: ubuntu-latest steps: - - uses: actions/setup-go@v2 + - uses: actions/setup-go@v3 with: go-version: '1.17' - - uses: actions/checkout@v2.3.4 + - uses: actions/checkout@v3 - name: Install go-fuzz working-directory: test/fuzz - run: go get -u github.com/dvyukov/go-fuzz/go-fuzz github.com/dvyukov/go-fuzz/go-fuzz-build + run: go install github.com/dvyukov/go-fuzz/go-fuzz@latest github.com/dvyukov/go-fuzz/go-fuzz-build@latest - - name: Fuzz mempool-v1 + - name: Fuzz mempool working-directory: test/fuzz - run: timeout -s SIGINT --preserve-status 10m make fuzz-mempool-v1 - continue-on-error: true - - - name: Fuzz mempool-v0 - working-directory: test/fuzz - run: timeout -s SIGINT --preserve-status 10m make fuzz-mempool-v0 - continue-on-error: true - - - name: Fuzz p2p-addrbook - working-directory: test/fuzz - run: timeout -s SIGINT --preserve-status 10m make fuzz-p2p-addrbook - continue-on-error: true - - - name: Fuzz p2p-pex - working-directory: test/fuzz - run: timeout -s SIGINT --preserve-status 10m make fuzz-p2p-pex + run: timeout -s SIGINT --preserve-status 10m make fuzz-mempool continue-on-error: true - name: Fuzz p2p-sc @@ -54,14 +39,14 @@ jobs: continue-on-error: true - name: Archive crashers - uses: actions/upload-artifact@v2 + uses: actions/upload-artifact@v3 with: name: crashers path: test/fuzz/**/crashers retention-days: 3 - name: Archive suppressions - uses: actions/upload-artifact@v2 + uses: actions/upload-artifact@v3 with: name: suppressions path: test/fuzz/**/suppressions diff --git a/.github/workflows/jepsen.yml b/.github/workflows/jepsen.yml index 0e358af6e4..04e599564a 100644 --- a/.github/workflows/jepsen.yml +++ b/.github/workflows/jepsen.yml @@ -46,7 +46,7 @@ jobs: runs-on: ubuntu-latest steps: - name: Checkout the Jepsen repository - uses: actions/checkout@v2.3.4 + uses: actions/checkout@v3 with: repository: 'tendermint/jepsen' @@ -58,7 +58,7 @@ jobs: run: docker exec -i jepsen-control bash -c 'source /root/.bashrc; cd /jepsen/tendermint; lein run test --nemesis ${{ github.event.inputs.nemesis }} --workload ${{ github.event.inputs.workload }} --concurrency ${{ github.event.inputs.concurrency }} --tendermint-url ${{ github.event.inputs.tendermintUrl }} --merkleeyes-url ${{ github.event.inputs.merkleeyesUrl }} --time-limit ${{ github.event.inputs.timeLimit }} ${{ github.event.inputs.dupOrSuperByzValidators }}' - name: Archive results - uses: actions/upload-artifact@v2 + uses: actions/upload-artifact@v3 with: name: results path: tendermint/store/latest diff --git a/.github/workflows/linkchecker.yml b/.github/workflows/linkchecker.yml index 6633c2c441..e2ba808617 100644 --- a/.github/workflows/linkchecker.yml +++ b/.github/workflows/linkchecker.yml @@ -6,7 +6,7 @@ jobs: markdown-link-check: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v2.3.4 - - uses: gaurav-nelson/github-action-markdown-link-check@1.0.13 + - uses: actions/checkout@v3 + - uses: creachadair/github-action-markdown-link-check@master with: folder-path: "docs" diff --git a/.github/workflows/lint.yml b/.github/workflows/lint.yml index 3f99b9f808..cfe8dde29b 100644 --- a/.github/workflows/lint.yml +++ b/.github/workflows/lint.yml @@ -1,7 +1,11 @@ -name: Lint -# Lint runs golangci-lint over the entire Tendermint repository -# This workflow is run on every pull request and push to master -# The `golangci` job will pass without running if no *.{go, mod, sum} files have been modified. +name: Golang Linter +# Lint runs golangci-lint over the entire Tendermint repository. +# +# This workflow is run on every pull request and push to master. +# +# The `golangci` job will pass without running if no *.{go, mod, sum} +# files have been modified. + on: pull_request: push: @@ -13,13 +17,13 @@ jobs: runs-on: ubuntu-latest timeout-minutes: 8 steps: - - uses: actions/checkout@v2.4.0 + - uses: actions/checkout@v3 with: submodules: true - - uses: actions/setup-go@v2 + - uses: actions/setup-go@v3 with: go-version: '^1.17' - - uses: technote-space/get-diff-action@v5 + - uses: technote-space/get-diff-action@v6 with: PATTERNS: | **/**.go @@ -32,7 +36,9 @@ jobs: - uses: golangci/golangci-lint-action@v3.1.0 with: - # Required: the version of golangci-lint is required and must be specified without patch version: we always use the latest patch version. + # Required: the version of golangci-lint is required and + # must be specified without patch version: we always use the + # latest patch version. version: v1.45 args: --timeout 10m github-token: ${{ secrets.github_token }} diff --git a/.github/workflows/linter.yml b/.github/workflows/linter.yml index 628b1af69e..badae8c1f8 100644 --- a/.github/workflows/linter.yml +++ b/.github/workflows/linter.yml @@ -1,4 +1,4 @@ -name: Lint +name: Markdown Linter on: push: branches: @@ -19,7 +19,7 @@ jobs: runs-on: ubuntu-latest steps: - name: Checkout Code - uses: actions/checkout@v2.4.0 + uses: actions/checkout@v3 - name: Lint Code Base uses: docker://github/super-linter:v4 env: diff --git a/.github/workflows/markdown-links.yml b/.github/workflows/markdown-links.yml new file mode 100644 index 0000000000..7af7e3ce90 --- /dev/null +++ b/.github/workflows/markdown-links.yml @@ -0,0 +1,23 @@ +name: Check Markdown links + +on: + push: + branches: + - master + pull_request: + branches: [master] + +jobs: + markdown-link-check: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v3 + - uses: technote-space/get-diff-action@v6 + with: + PATTERNS: | + **/**.md + - uses: creachadair/github-action-markdown-link-check@master + with: + check-modified-files-only: 'yes' + config-file: '.md-link-check.json' + if: env.GIT_DIFF diff --git a/.github/workflows/proto-docker.yml b/.github/workflows/proto-docker.yml deleted file mode 100644 index 340a1b78b2..0000000000 --- a/.github/workflows/proto-docker.yml +++ /dev/null @@ -1,51 +0,0 @@ -name: Build & Push TM Proto Builder -on: - pull_request: - paths: - - "tools/proto/*" - push: - branches: - - master - paths: - - "tools/proto/*" - schedule: - # run this job once a month to recieve any go or buf updates - - cron: "* * 1 * *" - -jobs: - build: - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v2.3.4 - - name: Prepare - id: prep - run: | - DOCKER_IMAGE=tendermintdev/docker-build-proto - VERSION=noop - if [[ $GITHUB_REF == refs/tags/* ]]; then - VERSION=${GITHUB_REF#refs/tags/} - elif [[ $GITHUB_REF == refs/heads/* ]]; then - VERSION=$(echo ${GITHUB_REF#refs/heads/} | sed -r 's#/+#-#g') - if [ "${{ github.event.repository.default_branch }}" = "$VERSION" ]; then - VERSION=latest - fi - fi - TAGS="${DOCKER_IMAGE}:${VERSION}" - echo ::set-output name=tags::${TAGS} - - - name: Set up Docker Buildx - uses: docker/setup-buildx-action@v1.6.0 - - - name: Login to DockerHub - uses: docker/login-action@v1.14.1 - with: - username: ${{ secrets.DOCKERHUB_USERNAME }} - password: ${{ secrets.DOCKERHUB_TOKEN }} - - - name: Publish to Docker Hub - uses: docker/build-push-action@v2.9.0 - with: - context: ./tools/proto - file: ./tools/proto/Dockerfile - push: ${{ github.event_name != 'pull_request' }} - tags: ${{ steps.prep.outputs.tags }} diff --git a/.github/workflows/proto-lint.yml b/.github/workflows/proto-lint.yml new file mode 100644 index 0000000000..b1fbeab9df --- /dev/null +++ b/.github/workflows/proto-lint.yml @@ -0,0 +1,21 @@ +name: Protobuf Lint +on: + pull_request: + paths: + - 'proto/**' + push: + branches: + - master + paths: + - 'proto/**' + +jobs: + lint: + runs-on: ubuntu-latest + timeout-minutes: 5 + steps: + - uses: actions/checkout@v3 + - uses: bufbuild/buf-setup-action@v1.4.0 + - uses: bufbuild/buf-lint-action@v1 + with: + input: 'proto' diff --git a/.github/workflows/proto.yml b/.github/workflows/proto.yml deleted file mode 100644 index 2eeb3dfd55..0000000000 --- a/.github/workflows/proto.yml +++ /dev/null @@ -1,23 +0,0 @@ -name: Protobuf -# Protobuf runs buf (https://buf.build/) lint and check-breakage -# This workflow is only run when a .proto file has been modified -on: - workflow_dispatch: # allow running workflow manually - pull_request: - paths: - - "**.proto" -jobs: - proto-lint: - runs-on: ubuntu-latest - timeout-minutes: 4 - steps: - - uses: actions/checkout@v2.3.4 - - name: lint - run: make proto-lint - proto-breakage: - runs-on: ubuntu-latest - timeout-minutes: 4 - steps: - - uses: actions/checkout@v2.3.4 - - name: check-breakage - run: "make BASE_BRANCH='${{ github.base_ref }}' proto-check-breaking-ci" diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 2939c567b0..fdd466fd57 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -8,11 +8,11 @@ jobs: runs-on: ubuntu-latest steps: - name: Checkout - uses: actions/checkout@v2.3.4 + uses: actions/checkout@v3 with: fetch-depth: 0 - - uses: actions/setup-go@v2 + - uses: actions/setup-go@v3 with: go-version: '1.17' @@ -23,11 +23,13 @@ jobs: version: latest args: build --skip-validate # skip validate skips initial sanity checks in order to be able to fully run + - run: echo https://github.com/tendermint/tendermint/blob/${GITHUB_REF#refs/tags/}/CHANGELOG.md#${GITHUB_REF#refs/tags/} > ../release_notes.md + - name: Release uses: goreleaser/goreleaser-action@v2 if: startsWith(github.ref, 'refs/tags/') with: version: latest - args: release --rm-dist + args: release --rm-dist --release-notes=../release_notes.md env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} diff --git a/.github/workflows/stale.yml b/.github/workflows/stale.yml index 1109f09c1c..4089abfbc3 100644 --- a/.github/workflows/stale.yml +++ b/.github/workflows/stale.yml @@ -7,7 +7,7 @@ jobs: stale: runs-on: ubuntu-latest steps: - - uses: actions/stale@v4 + - uses: actions/stale@v5 with: repo-token: ${{ secrets.GITHUB_TOKEN }} stale-pr-message: "This pull request has been automatically marked as stale because it has not had diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml index d389ddbf8e..2fcde2c30a 100644 --- a/.github/workflows/tests.yml +++ b/.github/workflows/tests.yml @@ -16,11 +16,11 @@ jobs: matrix: part: ["00", "01", "02", "03", "04", "05"] steps: - - uses: actions/setup-go@v2 + - uses: actions/setup-go@v3 with: go-version: "1.17" - - uses: actions/checkout@v2.3.4 - - uses: technote-space/get-diff-action@v5 + - uses: actions/checkout@v3 + - uses: technote-space/get-diff-action@v6 with: PATTERNS: | **/**.go @@ -35,7 +35,7 @@ jobs: run: | make test-group-${{ matrix.part }} NUM_SPLIT=6 if: env.GIT_DIFF - - uses: actions/upload-artifact@v2 + - uses: actions/upload-artifact@v3 with: name: "${{ github.sha }}-${{ matrix.part }}-coverage" path: ./build/${{ matrix.part }}.profile.out @@ -44,8 +44,8 @@ jobs: runs-on: ubuntu-latest needs: tests steps: - - uses: actions/checkout@v2.4.0 - - uses: technote-space/get-diff-action@v5 + - uses: actions/checkout@v3 + - uses: technote-space/get-diff-action@v6 with: PATTERNS: | **/**.go @@ -53,26 +53,26 @@ jobs: go.mod go.sum Makefile - - uses: actions/download-artifact@v2 + - uses: actions/download-artifact@v3 with: name: "${{ github.sha }}-00-coverage" if: env.GIT_DIFF - - uses: actions/download-artifact@v2 + - uses: actions/download-artifact@v3 with: name: "${{ github.sha }}-01-coverage" if: env.GIT_DIFF - - uses: actions/download-artifact@v2 + - uses: actions/download-artifact@v3 with: name: "${{ github.sha }}-02-coverage" if: env.GIT_DIFF - - uses: actions/download-artifact@v2 + - uses: actions/download-artifact@v3 with: name: "${{ github.sha }}-03-coverage" if: env.GIT_DIFF - run: | cat ./*profile.out | grep -v "mode: set" >> coverage.txt if: env.GIT_DIFF - - uses: codecov/codecov-action@v2.1.0 + - uses: codecov/codecov-action@v3.1.0 with: file: ./coverage.txt if: env.GIT_DIFF diff --git a/.gitignore b/.gitignore index 1846a354cc..7cfe62dece 100644 --- a/.gitignore +++ b/.gitignore @@ -55,3 +55,11 @@ test/fuzz/**/corpus test/fuzz/**/crashers test/fuzz/**/suppressions test/fuzz/**/*.zip +proto/spec/**/*.pb.go +*.aux +*.bbl +*.blg +*.log +*.pdf +*.gz +*.dvi diff --git a/.markdownlint.yml b/.markdownlint.yml new file mode 100644 index 0000000000..80e3be4edb --- /dev/null +++ b/.markdownlint.yml @@ -0,0 +1,11 @@ +default: true +MD001: false +MD007: {indent: 4} +MD013: false +MD024: {siblings_only: true} +MD025: false +MD033: false +MD036: false +MD010: false +MD012: false +MD028: false diff --git a/.md-link-check.json b/.md-link-check.json new file mode 100644 index 0000000000..6f47fa2c94 --- /dev/null +++ b/.md-link-check.json @@ -0,0 +1,6 @@ +{ + "retryOn429": true, + "retryCount": 5, + "fallbackRetryDelay": "30s", + "aliveStatusCodes": [200, 206, 503] +} diff --git a/CHANGELOG_PENDING.md b/CHANGELOG_PENDING.md index 7a51fb59ce..442cca2165 100644 --- a/CHANGELOG_PENDING.md +++ b/CHANGELOG_PENDING.md @@ -12,16 +12,77 @@ Special thanks to external contributors on this release: - CLI/RPC/Config + - [rpc] \#7121 Remove the deprecated gRPC interface to the RPC service. (@creachadair) + - [blocksync] \#7159 Remove support for disabling blocksync in any circumstance. (@tychoish) + - [mempool] \#7171 Remove legacy mempool implementation. (@tychoish) + - [rpc] \#7575 Rework how RPC responses are written back via HTTP. (@creachadair) + - [rpc] \#7713 Remove unused options for websocket clients. (@creachadair) + - [config] \#7930 Add new event subscription options and defaults. (@creachadair) + - [rpc] \#7982 Add new Events interface and deprecate Subscribe. (@creachadair) + - [cli] \#8081 make the reset command safe to use by intoducing `reset-state` command. Fixed by \#8259. (@marbar3778, @cmwaters) + - [config] \#8222 default indexer configuration to null. (@creachadair) + - Apps + - [tendermint/spec] \#7804 Migrate spec from [spec repo](https://github.com/tendermint/spec). + - [abci] \#7984 Remove the locks preventing concurrent use of ABCI applications by Tendermint. (@tychoish) + - P2P Protocol + - [p2p] \#7035 Remove legacy P2P routing implementation and associated configuration options. (@tychoish) + - [p2p] \#7265 Peer manager reduces peer score for each failed dial attempts for peers that have not successfully dialed. (@tychoish) + - [p2p] [\#7594](https://github.com/tendermint/tendermint/pull/7594) always advertise self, to enable mutual address discovery. (@altergui) + - Go API + - [rpc] \#7474 Remove the "URI" RPC client. (@creachadair) + - [libs/pubsub] \#7451 Internalize the pubsub packages. (@creachadair) + - [libs/sync] \#7450 Internalize and remove the library. (@creachadair) + - [libs/async] \#7449 Move library to internal. (@creachadair) + - [pubsub] \#7231 Remove unbuffered subscriptions and rework the Subscription interface. (@creachadair) + - [eventbus] \#7231 Move the EventBus type to the internal/eventbus package. (@creachadair) + - [blocksync] \#7046 Remove v2 implementation of the blocksync service and recactor, which was disabled in the previous release. (@tychoish) + - [p2p] \#7064 Remove WDRR queue implementation. (@tychoish) + - [config] \#7169 `WriteConfigFile` now returns an error. (@tychoish) + - [libs/service] \#7288 Remove SetLogger method on `service.Service` interface. (@tychoish) + - [abci/client] \#7607 Simplify client interface (removes most "async" methods). (@creachadair) + - [libs/json] \#7673 Remove the libs/json (tmjson) library. (@creachadair) + - [crypto] \#8412 \#8432 Remove `crypto/tmhash` package in favor of small functions in `crypto` package and cleanup of unused functions. (@tychoish) + - Blockchain Protocol ### FEATURES +- [rpc] [\#7270](https://github.com/tendermint/tendermint/pull/7270) Add `header` and `header_by_hash` RPC Client queries. (@fedekunze) +- [rpc] [\#7701] Add `ApplicationInfo` to `status` rpc call which contains the application version. (@jonasbostoen) +- [cli] [#7033](https://github.com/tendermint/tendermint/pull/7033) Add a `rollback` command to rollback to the previous tendermint state in the event of non-determinstic app hash or reverting an upgrade. +- [mempool, rpc] \#7041 Add removeTx operation to the RPC layer. (@tychoish) +- [consensus] \#7354 add a new `synchrony` field to the `ConsensusParameter` struct for controlling the parameters of the proposer-based timestamp algorithm. (@williambanfield) +- [consensus] \#7376 Update the proposal logic per the Propose-based timestamps specification so that the proposer will wait for the previous block time to occur before proposing the next block. (@williambanfield) +- [consensus] \#7391 Use the proposed block timestamp as the proposal timestamp. Update the block validation logic to ensure that the proposed block's timestamp matches the timestamp in the proposal message. (@williambanfield) +- [consensus] \#7415 Update proposal validation logic to Prevote nil if a proposal does not meet the conditions for Timelyness per the proposer-based timestamp specification. (@anca) +- [consensus] \#7382 Update block validation to no longer require the block timestamp to be the median of the timestamps of the previous commit. (@anca) +- [consensus] \#7711 Use the proposer timestamp for the first height instead of the genesis time. Chains will still start consensus at the genesis time. (@anca) +- [cli] \#8281 Add a tool to update old config files to the latest version. (@creachadair) + ### IMPROVEMENTS +- [internal/protoio] \#7325 Optimized `MarshalDelimited` by inlining the common case and using a `sync.Pool` in the worst case. (@odeke-em) +- [consensus] \#6969 remove logic to 'unlock' a locked block. +- [evidence] \#7700 Evidence messages contain single Evidence instead of EvidenceList (@jmalicevic) +- [evidence] \#7802 Evidence pool emits events when evidence is validated and updates a metric when the number of evidence in the evidence pool changes. (@jmalicevic) +- [pubsub] \#7319 Performance improvements for the event query API (@creachadair) +- [node] \#7521 Define concrete type for seed node implementation (@spacech1mp) +- [rpc] \#7612 paginate mempool /unconfirmed_txs rpc endpoint (@spacech1mp) +- [light] [\#7536](https://github.com/tendermint/tendermint/pull/7536) rpc /status call returns info about the light client (@jmalicevic) +- [types] \#7765 Replace EvidenceData with EvidenceList to avoid unnecessary nesting of evidence fields within a block. (@jmalicevic) + ### BUG FIXES + +- fix: assignment copies lock value in `BitArray.UnmarshalJSON()` (@lklimek) +- [light] \#7640 Light Client: fix absence proof verification (@ashcherbakov) +- [light] \#7641 Light Client: fix querying against the latest height (@ashcherbakov) +- [cli] [#7837](https://github.com/tendermint/tendermint/pull/7837) fix app hash in state rollback. (@yihuang) +- [cli] \#8276 scmigrate: ensure target key is correctly renamed. (@creachadair) +- [cli] \#8294 keymigrate: ensure block hash keys are correctly translated. (@creachadair) +- [cli] \#8352 keymigrate: ensure transaction hash keys are correctly translated. (@creachadair) diff --git a/CODE_OF_CONDUCT.md b/CODE_OF_CONDUCT.md index 8c5a992032..ec1477adcc 100644 --- a/CODE_OF_CONDUCT.md +++ b/CODE_OF_CONDUCT.md @@ -20,7 +20,7 @@ This code of conduct applies to all projects run by the Tendermint/COSMOS team a * Please keep unstructured critique to a minimum. If you have solid ideas you want to experiment with, make a fork and see how it works. -* We will exclude you from interaction if you insult, demean or harass anyone. That is not welcome behaviour. We interpret the term “harassment” as including the definition in the [Citizen Code of Conduct](http://citizencodeofconduct.org/); if you have any lack of clarity about what might be included in that concept, please read their definition. In particular, we don’t tolerate behavior that excludes people in socially marginalized groups. +* We will exclude you from interaction if you insult, demean or harass anyone. That is not welcome behaviour. We interpret the term “harassment” as including the definition in the [Citizen Code of Conduct](https://github.com/stumpsyn/policies/blob/master/citizen_code_of_conduct.md); if you have any lack of clarity about what might be included in that concept, please read their definition. In particular, we don’t tolerate behavior that excludes people in socially marginalized groups. * Private harassment is also unacceptable. No matter who you are, if you feel you have been or are being harassed or made uncomfortable by a community member, please contact one of the channel admins or the person mentioned above immediately. Whether you’re a regular contributor or a newcomer, we care about making this community a safe place for you and we’ve got your back. diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 33b8cf6a78..bfa56bea64 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -105,11 +105,33 @@ specify exactly the dependency you want to update, eg. ## Protobuf -We use [Protocol Buffers](https://developers.google.com/protocol-buffers) along with [gogoproto](https://github.com/gogo/protobuf) to generate code for use across Tendermint Core. +We use [Protocol Buffers](https://developers.google.com/protocol-buffers) along +with [`gogoproto`](https://github.com/gogo/protobuf) to generate code for use +across Tendermint Core. -For linting, checking breaking changes and generating proto stubs, we use [buf](https://buf.build/). If you would like to run linting and check if the changes you have made are breaking then you will need to have docker running locally. Then the linting cmd will be `make proto-lint` and the breaking changes check will be `make proto-check-breaking`. +To generate proto stubs, lint, and check protos for breaking changes, you will +need to install [buf](https://buf.build/) and `gogoproto`. Then, from the root +of the repository, run: -We use [Docker](https://www.docker.com/) to generate the protobuf stubs. To generate the stubs yourself, make sure docker is running then run `make proto-gen`. +```bash +# Lint all of the .proto files in proto/tendermint +make proto-lint + +# Check if any of your local changes (prior to committing to the Git repository) +# are breaking +make proto-check-breaking + +# Generate Go code from the .proto files in proto/tendermint +make proto-gen +``` + +To automatically format `.proto` files, you will need +[`clang-format`](https://clang.llvm.org/docs/ClangFormat.html) installed. Once +installed, you can run: + +```bash +make proto-format +``` ### Visual Studio Code @@ -227,150 +249,6 @@ Fixes #nnnn Each PR should have one commit once it lands on `master`; this can be accomplished by using the "squash and merge" button on Github. Be sure to edit your commit message, though! -### Release procedure - -#### A note about backport branches -Tendermint's `master` branch is under active development. -Releases are specified using tags and are built from long-lived "backport" branches. -Each release "line" (e.g. 0.34 or 0.33) has its own long-lived backport branch, -and the backport branches have names like `v0.34.x` or `v0.33.x` -(literally, `x`; it is not a placeholder in this case). - -As non-breaking changes land on `master`, they should also be backported (cherry-picked) -to these backport branches. - -We use Mergify's [backport feature](https://mergify.io/features/backports) to automatically backport -to the needed branch. There should be a label for any backport branch that you'll be targeting. -To notify the bot to backport a pull request, mark the pull request with -the label `S:backport-to-`. -Once the original pull request is merged, the bot will try to cherry-pick the pull request -to the backport branch. If the bot fails to backport, it will open a pull request. -The author of the original pull request is responsible for solving the conflicts and -merging the pull request. - -#### Creating a backport branch - -If this is the first release candidate for a major release, you get to have the honor of creating -the backport branch! - -Note that, after creating the backport branch, you'll also need to update the tags on `master` -so that `go mod` is able to order the branches correctly. You should tag `master` with a "dev" tag -that is "greater than" the backport branches tags. See #6072 for more context. - -In the following example, we'll assume that we're making a backport branch for -the 0.35.x line. - -1. Start on `master` -2. Create the backport branch: - `git checkout -b v0.35.x` -3. Go back to master and tag it as the dev branch for the _next_ major release and push it back up: - `git tag -a v0.36.0-dev; git push v0.36.0-dev` -4. Create a new workflow to run the e2e nightlies for this backport branch. - (See https://github.com/tendermint/tendermint/blob/master/.github/workflows/e2e-nightly-34x.yml - for an example.) - -#### Release candidates - -Before creating an official release, especially a major release, we may want to create a -release candidate (RC) for our friends and partners to test out. We use git tags to -create RCs, and we build them off of backport branches. - -Tags for RCs should follow the "standard" release naming conventions, with `-rcX` at the end -(for example, `v0.35.0-rc0`). - -(Note that branches and tags _cannot_ have the same names, so it's important that these branches -have distinct names from the tags/release names.) - -If this is the first RC for a major release, you'll have to make a new backport branch (see above). -Otherwise: - -1. Start from the backport branch (e.g. `v0.35.x`). -1. Run the integration tests and the e2e nightlies - (which can be triggered from the Github UI; - e.g., https://github.com/tendermint/tendermint/actions/workflows/e2e-nightly-34x.yml). -1. Prepare the changelog: - - Move the changes included in `CHANGELOG_PENDING.md` into `CHANGELOG.md`. - - Run `python ./scripts/linkify_changelog.py CHANGELOG.md` to add links for - all PRs - - Ensure that UPGRADING.md is up-to-date and includes notes on any breaking changes - or other upgrading flows. - - Bump TMVersionDefault version in `version.go` - - Bump P2P and block protocol versions in `version.go`, if necessary - - Bump ABCI protocol version in `version.go`, if necessary -1. Open a PR with these changes against the backport branch. -1. Once these changes have landed on the backport branch, be sure to pull them back down locally. -2. Once you have the changes locally, create the new tag, specifying a name and a tag "message": - `git tag -a v0.35.0-rc0 -m "Release Candidate v0.35.0-rc0` -3. Push the tag back up to origin: - `git push origin v0.35.0-rc0` - Now the tag should be available on the repo's releases page. -4. Future RCs will continue to be built off of this branch. - -Note that this process should only be used for "true" RCs-- -release candidates that, if successful, will be the next release. -For more experimental "RCs," create a new, short-lived branch and tag that instead. - -#### Major release - -This major release process assumes that this release was preceded by release candidates. -If there were no release candidates, begin by creating a backport branch, as described above. - -1. Start on the backport branch (e.g. `v0.35.x`) -2. Run integration tests and the e2e nightlies. -3. Prepare the release: - - "Squash" changes from the changelog entries for the RCs into a single entry, - and add all changes included in `CHANGELOG_PENDING.md`. - (Squashing includes both combining all entries, as well as removing or simplifying - any intra-RC changes. It may also help to alphabetize the entries by package name.) - - Run `python ./scripts/linkify_changelog.py CHANGELOG.md` to add links for - all PRs - - Ensure that UPGRADING.md is up-to-date and includes notes on any breaking changes - or other upgrading flows. - - Bump TMVersionDefault version in `version.go` - - Bump P2P and block protocol versions in `version.go`, if necessary - - Bump ABCI protocol version in `version.go`, if necessary -4. Open a PR with these changes against the backport branch. -5. Once these changes are on the backport branch, push a tag with prepared release details. - This will trigger the actual release `v0.35.0`. - - `git tag -a v0.35.0 -m 'Release v0.35.0'` - - `git push origin v0.35.0` -7. Make sure that `master` is updated with the latest `CHANGELOG.md`, `CHANGELOG_PENDING.md`, and `UPGRADING.md`. -8. Add the release to the documentation site generator config (see - [DOCS_README.md](./docs/DOCS_README.md) for more details). In summary: - - Start on branch `master`. - - Add a new line at the bottom of [`docs/versions`](./docs/versions) to - ensure the newest release is the default for the landing page. - - Add a new entry to `themeConfig.versions` in - [`docs/.vuepress/config.js`](./docs/.vuepress/config.js) to include the - release in the dropdown versions menu. - -#### Minor release (point releases) - -Minor releases are done differently from major releases: They are built off of long-lived backport branches, rather than from master. -As non-breaking changes land on `master`, they should also be backported (cherry-picked) to these backport branches. - -Minor releases don't have release candidates by default, although any tricky changes may merit a release candidate. - -To create a minor release: - -1. Checkout the long-lived backport branch: `git checkout v0.35.x` -2. Run integration tests (`make test_integrations`) and the nightlies. -3. Check out a new branch and prepare the release: - - Copy `CHANGELOG_PENDING.md` to top of `CHANGELOG.md` - - Run `python ./scripts/linkify_changelog.py CHANGELOG.md` to add links for all issues - - Run `bash ./scripts/authors.sh` to get a list of authors since the latest release, and add the GitHub aliases of external contributors to the top of the CHANGELOG. To lookup an alias from an email, try `bash ./scripts/authors.sh ` - - Reset the `CHANGELOG_PENDING.md` - - Bump the ABCI version number, if necessary. - (Note that ABCI follows semver, and that ABCI versions are the only versions - which can change during minor releases, and only field additions are valid minor changes.) -4. Open a PR with these changes that will land them back on `v0.35.x` -5. Once this change has landed on the backport branch, make sure to pull it locally, then push a tag. - - `git tag -a v0.35.1 -m 'Release v0.35.1'` - - `git push origin v0.35.1` -6. Create a pull request back to master with the CHANGELOG & version changes from the latest release. - - Remove all `R:minor` labels from the pull requests that were included in the release. - - Do not merge the backport branch into master. - ## Testing ### Unit tests diff --git a/DOCKER/.gitignore b/DOCKER/.gitignore deleted file mode 100644 index 9059c68485..0000000000 --- a/DOCKER/.gitignore +++ /dev/null @@ -1 +0,0 @@ -tendermint diff --git a/DOCKER/Dockerfile.build_c-amazonlinux b/DOCKER/Dockerfile.build_c-amazonlinux deleted file mode 100644 index 6ec9d539c6..0000000000 --- a/DOCKER/Dockerfile.build_c-amazonlinux +++ /dev/null @@ -1,27 +0,0 @@ -FROM amazonlinux:2 - -RUN yum -y update && \ - yum -y install wget - -RUN wget http://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm && \ - rpm -ivh epel-release-latest-7.noarch.rpm - -RUN yum -y groupinstall "Development Tools" -RUN yum -y install leveldb-devel which - -ENV GOVERSION=1.16.5 - -RUN cd /tmp && \ - wget https://dl.google.com/go/go${GOVERSION}.linux-amd64.tar.gz && \ - tar -C /usr/local -xf go${GOVERSION}.linux-amd64.tar.gz && \ - mkdir -p /go/src && \ - mkdir -p /go/bin - -ENV PATH=$PATH:/usr/local/go/bin:/go/bin -ENV GOBIN=/go/bin -ENV GOPATH=/go/src - -RUN mkdir -p /tenderdash -WORKDIR /tenderdash - -CMD ["/usr/bin/make", "build", "TENDERMINT_BUILD_OPTIONS=cleveldb"] diff --git a/DOCKER/Dockerfile.testing b/DOCKER/Dockerfile.testing deleted file mode 100644 index 7f86ee1800..0000000000 --- a/DOCKER/Dockerfile.testing +++ /dev/null @@ -1,16 +0,0 @@ -FROM golang:latest - -# Grab deps (jq, hexdump, xxd, killall) -RUN apt-get update && \ - apt-get install -y --no-install-recommends \ - jq bsdmainutils vim-common psmisc netcat - -# Add testing deps for curl -RUN echo 'deb http://httpredir.debian.org/debian testing main non-free contrib' >> /etc/apt/sources.list && \ - apt-get update && \ - apt-get install -y --no-install-recommends curl - -VOLUME /go - -EXPOSE 26656 -EXPOSE 26657 diff --git a/DOCKER/Makefile b/DOCKER/Makefile deleted file mode 100644 index 082e52225e..0000000000 --- a/DOCKER/Makefile +++ /dev/null @@ -1,13 +0,0 @@ -build: - @sh -c "'$(CURDIR)/build.sh'" - -push: - @sh -c "'$(CURDIR)/push.sh'" - -build_testing: - docker build --tag dashpay/tenderdash:testing -f ./Dockerfile.testing .. - -build_amazonlinux_buildimage: - docker build -t "dashpay/tenderdash:build_c-amazonlinux" -f Dockerfile.build_c-amazonlinux .. - -.PHONY: build push build_testing build_amazonlinux_buildimage diff --git a/DOCKER/README.md b/DOCKER/README.md index b670a06d4e..671b646ad0 100644 --- a/DOCKER/README.md +++ b/DOCKER/README.md @@ -8,7 +8,7 @@ Official releases can be found [here](https://github.com/tendermint/tendermint/r The Dockerfile for tendermint is not expected to change in the near future. The master file used for all builds can be found [here](https://raw.githubusercontent.com/tendermint/tendermint/master/DOCKER/Dockerfile). -Respective versioned files can be found (replace the Xs with the version number). +Respective versioned files can be found at `https://raw.githubusercontent.com/tendermint/tendermint/vX.XX.XX/DOCKER/Dockerfile` (replace the Xs with the version number). ## Quick reference diff --git a/DOCKER/build.sh b/DOCKER/build.sh deleted file mode 100755 index 193deb3383..0000000000 --- a/DOCKER/build.sh +++ /dev/null @@ -1,20 +0,0 @@ -#!/usr/bin/env bash -set -e - -# Get the tag from the version, or try to figure it out. -if [ -z "$TAG" ]; then - TAG=$(awk -F\" '/TMCoreSemVer =/ { print $2; exit }' < ../version/version.go) -fi -if [ -z "$TAG" ]; then - echo "Please specify a tag." - exit 1 -fi - -TAG_NO_PATCH=${TAG%.*} - -read -p "==> Build 3 docker images with the following tags (latest, $TAG, $TAG_NO_PATCH)? y/n" -n 1 -r -echo -if [[ $REPLY =~ ^[Yy]$ ]] -then - docker build -t "dashpay/tenderdash" -t "dashpay/tenderdash:$TAG" -t "dashpay/tenderdash:$TAG_NO_PATCH" .. -fi diff --git a/DOCKER/push.sh b/DOCKER/push.sh deleted file mode 100755 index 5456967a7a..0000000000 --- a/DOCKER/push.sh +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env bash -set -e - -# Get the tag from the version, or try to figure it out. -if [ -z "$TAG" ]; then - TAG=$(awk -F\" '/TMCoreSemVer =/ { print $2; exit }' < ../version/version.go) -fi -if [ -z "$TAG" ]; then - echo "Please specify a tag." - exit 1 -fi - -TAG_NO_PATCH=${TAG%.*} - -read -p "==> Push 3 docker images with the following tags (latest, $TAG, $TAG_NO_PATCH)? y/n" -n 1 -r -echo -if [[ $REPLY =~ ^[Yy]$ ]] -then - docker push "dashpay/tenderdash:latest" - docker push "dashpay/tenderdash:$TAG" - docker push "dashpay/tenderdash:$TAG_NO_PATCH" -fi diff --git a/Makefile b/Makefile index 4c8f774b04..537c8d2491 100644 --- a/Makefile +++ b/Makefile @@ -109,34 +109,47 @@ $(BUILDDIR)/: ### Protobuf ### ############################################################################### -proto-all: proto-gen proto-lint proto-check-breaking -.PHONY: proto-all +check-proto-deps: +ifeq (,$(shell which buf)) + $(error "buf is required for Protobuf building, linting and breakage checking. See https://docs.buf.build/installation for installation instructions.") +endif +ifeq (,$(shell which protoc-gen-gogofaster)) + $(error "gogofaster plugin for protoc is required. Run 'go install github.com/gogo/protobuf/protoc-gen-gogofaster@latest' to install") +endif +.PHONY: check-proto-deps -proto-gen: - @echo "Generating Go packages for .proto files" - @$(DOCKER_PROTO) sh ./scripts/protocgen.sh +check-proto-format-deps: +ifeq (,$(shell which clang-format)) + $(error "clang-format is required for Protobuf formatting. See instructions for your platform on how to install it.") +endif +.PHONY: check-proto-format-deps + +proto-gen: check-proto-deps + @echo "Generating Protobuf files" + @buf generate + @mv ./proto/tendermint/abci/types.pb.go ./abci/types/ .PHONY: proto-gen -proto-lint: - @echo "Running lint checks for .proto files" - @$(DOCKER_PROTO) buf lint --error-format=json +# These targets are provided for convenience and are intended for local +# execution only. +proto-lint: check-proto-deps + @echo "Linting Protobuf files" + @buf lint .PHONY: proto-lint -proto-format: - @echo "Formatting .proto files" - @$(DOCKER_PROTO) find ./ -not -path "./third_party/*" -name '*.proto' -exec clang-format -i {} \; +proto-format: check-proto-format-deps + @echo "Formatting Protobuf files" + @find . -name '*.proto' -path "./proto/*" -exec clang-format -i {} \; .PHONY: proto-format -proto-check-breaking: - @echo "Checking for breaking changes in .proto files" - @$(DOCKER_PROTO) buf breaking --against .git#branch=$(BASE_BRANCH) +proto-check-breaking: check-proto-deps + @echo "Checking for breaking changes in Protobuf files against local branch" + @echo "Note: This is only useful if your changes have not yet been committed." + @echo " Otherwise read up on buf's \"breaking\" command usage:" + @echo " https://docs.buf.build/breaking/usage" + @buf breaking --against ".git" .PHONY: proto-check-breaking -proto-check-breaking-ci: - @echo "Checking for breaking changes in .proto files" - $(DOCKER_PROTO) buf breaking --against $(HTTPS_GIT)#branch=$(BASE_BRANCH) -.PHONY: proto-check-breaking-ci - ############################################################################### ### Build ABCI ### ############################################################################### @@ -192,7 +205,7 @@ go.sum: go.mod draw_deps: @# requires brew install graphviz or apt-get install graphviz - go get github.com/RobotsAndPencils/goviz + go install github.com/RobotsAndPencils/goviz@latest @goviz -i ${REPO_NAME}/cmd/tendermint -d 3 | dot -Tpng -o dependency-graph.png .PHONY: draw_deps @@ -359,4 +372,4 @@ $(BUILDDIR)/packages.txt:$(GO_TEST_FILES) $(BUILDDIR) split-test-packages:$(BUILDDIR)/packages.txt split -d -n l/$(NUM_SPLIT) $< $<. test-group-%:split-test-packages - cat $(BUILDDIR)/packages.txt.$* | xargs go test -mod=readonly -timeout=15m -race -coverprofile=$(BUILDDIR)/$*.profile.out + cat $(BUILDDIR)/packages.txt.$* | xargs go test -mod=readonly -timeout=5m -race -coverprofile=$(BUILDDIR)/$*.profile.out diff --git a/README.md b/README.md index 711f4dc3d2..b3b166f0f4 100644 --- a/README.md +++ b/README.md @@ -3,7 +3,7 @@ ![banner](docs/tendermint-core-image.jpg) [Byzantine-Fault Tolerant](https://en.wikipedia.org/wiki/Byzantine_fault_tolerance) -[State Machines](https://en.wikipedia.org/wiki/State_machine_replication). +[State Machine Replication](https://en.wikipedia.org/wiki/State_machine_replication). Or [Blockchain](), for short. [![version](https://img.shields.io/github/tag/tendermint/tendermint.svg)](https://github.com/dashevo/tenderdash/releases/latest) @@ -20,10 +20,14 @@ Or [Blockchain](), for shor Tendermint Core is a Byzantine Fault Tolerant (BFT) middleware that takes a state transition machine - written in any programming language - and securely replicates it on many machines. -For protocol details, see [the specification](https://github.com/tendermint/spec). +For protocol details, refer to the [Tendermint Specification](./spec/README.md). For detailed analysis of the consensus protocol, including safety and liveness proofs, -see our recent paper, "[The latest gossip on BFT consensus](https://arxiv.org/abs/1807.04938)". +read our paper, "[The latest gossip on BFT consensus](https://arxiv.org/abs/1807.04938)". + +## Documentation + +Complete documentation can be found on the [website](https://docs.tendermint.com/). ## Releases @@ -33,11 +37,14 @@ Tendermint has been in the production of private and public environments, most n See below for more details about [versioning](#versioning). In any case, if you intend to run Tendermint in production, we're happy to help. You can -contact us [over email](mailto:hello@interchain.berlin) or [join the chat](https://discord.gg/cosmosnetwork). +contact us [over email](mailto:hello@interchain.io) or [join the chat](https://discord.gg/cosmosnetwork). + +More on how releases are conducted can be found [here](./RELEASES.md). ## Security -To report a security vulnerability, see our [bug bounty program](https://hackerone.com/cosmos). +To report a security vulnerability, see our [bug bounty +program](https://hackerone.com/cosmos). For examples of the kinds of bugs we're looking for, see [our security policy](SECURITY.md). We also maintain a dedicated mailing list for security updates. We will only ever use this mailing list @@ -50,22 +57,17 @@ to notify you of vulnerabilities and fixes in Tendermint Core. You can subscribe | Requirement | Notes | |-------------|------------------| -| Go version | Go1.16 or higher | - -## Documentation - -Complete documentation can be found on the [website](https://docs.tendermint.com/master/). +| Go version | Go1.17 or higher | ### Install -See the [install instructions](/docs/introduction/install.md). +See the [install instructions](./docs/introduction/install.md). ### Quick Start -- [Single node](/docs/introduction/quick-start.md) -- [Local cluster using docker-compose](/docs/tools/docker-compose.md) -- [Remote cluster using Terraform and Ansible](/docs/tools/terraform-and-ansible.md) -- [Join the Cosmos testnet](https://cosmos.network/testnet) +- [Single node](./docs/introduction/quick-start.md) +- [Local cluster using docker-compose](./docs/tools/docker-compose.md) +- [Remote cluster using Terraform and Ansible](./docs/tools/terraform-and-ansible.md) ## Contributing @@ -73,9 +75,9 @@ Please abide by the [Code of Conduct](CODE_OF_CONDUCT.md) in all interactions. Before contributing to the project, please take a look at the [contributing guidelines](CONTRIBUTING.md) and the [style guide](STYLE_GUIDE.md). You may also find it helpful to read the -[specifications](https://github.com/tendermint/spec), watch the [Developer Sessions](/docs/DEV_SESSIONS.md), +[specifications](./spec/README.md), and familiarize yourself with our -[Architectural Decision Records](https://github.com/tendermint/tendermint/tree/master/docs/architecture). +[Architectural Decision Records (ADRs)](./docs/architecture/README.md) and [Request For Comments (RFCs)](./docs/rfc/README.md). ## Versioning @@ -111,24 +113,23 @@ in [UPGRADING.md](./UPGRADING.md). ## Resources -### Tendermint Core - -For details about the blockchain data structures and the p2p protocols, see the -[Tendermint specification](https://docs.tendermint.com/master/spec/). +### Roadmap -For details on using the software, see the [documentation](/docs/) which is also -hosted at: +We keep a public up-to-date version of our roadmap [here](./docs/roadmap/roadmap.md) -### Tools +### Libraries -Benchmarking is provided by [`tm-load-test`](https://github.com/informalsystems/tm-load-test). -Additional tooling can be found in [/docs/tools](/docs/tools). +- [Cosmos SDK](http://github.com/cosmos/cosmos-sdk); A framework for building applications in Golang +- [Tendermint in Rust](https://github.com/informalsystems/tendermint-rs) +- [ABCI Tower](https://github.com/penumbra-zone/tower-abci) ### Applications -- [Cosmos SDK](http://github.com/cosmos/cosmos-sdk); a cryptocurrency application framework -- [Ethermint](http://github.com/cosmos/ethermint); Ethereum on Tendermint -- [Many more](https://tendermint.com/ecosystem) +- [Cosmos Hub](https://hub.cosmos.network/) +- [Terra](https://www.terra.money/) +- [Celestia](https://celestia.org/) +- [Anoma](https://anoma.network/) +- [Vocdoni](https://docs.vocdoni.io/) ### Research @@ -144,7 +145,7 @@ Tenderdash is maintained by [Dash Core Group](https://www.dash.org/dcg/). If you'd like to work full-time on Tenderdash, [see our Jobs page](https://www.dash.org/dcg/jobs/). Tendermint Core is maintained by [Interchain GmbH](https://interchain.berlin). -If you'd like to work full-time on Tendermint Core, [we're hiring](https://interchain-gmbh.breezy.hr/p/682fb7e8a6f601-software-engineer-tendermint-core)! +If you'd like to work full-time on Tendermint Core, [we're hiring](https://interchain-gmbh.breezy.hr/)! Funding for Tendermint Core development comes primarily from the [Interchain Foundation](https://interchain.io), a Swiss non-profit. The Tendermint trademark is owned by [Tendermint Inc.](https://tendermint.com), the for-profit entity diff --git a/RELEASES.md b/RELEASES.md new file mode 100644 index 0000000000..f3bfd20d5c --- /dev/null +++ b/RELEASES.md @@ -0,0 +1,207 @@ +# Releases + +Tendermint uses [semantic versioning](https://semver.org/) with each release following +a `vX.Y.Z` format. The `master` branch is used for active development and thus it's +advisable not to build against it. + +The latest changes are always initially merged into `master`. +Releases are specified using tags and are built from long-lived "backport" branches +that are cut from `master` when the release process begins. +Each release "line" (e.g. 0.34 or 0.33) has its own long-lived backport branch, +and the backport branches have names like `v0.34.x` or `v0.33.x` +(literally, `x`; it is not a placeholder in this case). Tendermint only +maintains the last two releases at a time (the oldest release is predominantly +just security patches). + +## Backporting + +As non-breaking changes land on `master`, they should also be backported +to these backport branches. + +We use Mergify's [backport feature](https://mergify.io/features/backports) to automatically backport +to the needed branch. There should be a label for any backport branch that you'll be targeting. +To notify the bot to backport a pull request, mark the pull request with the label corresponding +to the correct backport branch. For example, to backport to v0.35.x, add the label `S:backport-to-v0.35.x`. +Once the original pull request is merged, the bot will try to cherry-pick the pull request +to the backport branch. If the bot fails to backport, it will open a pull request. +The author of the original pull request is responsible for solving the conflicts and +merging the pull request. + +### Creating a backport branch + +If this is the first release candidate for a major release, you get to have the +honor of creating the backport branch! + +Note that, after creating the backport branch, you'll also need to update the +tags on `master` so that `go mod` is able to order the branches correctly. You +should tag `master` with a "dev" tag that is "greater than" the backport +branches tags. See [#6072](https://github.com/tendermint/tendermint/pull/6072) +for more context. + +In the following example, we'll assume that we're making a backport branch for +the 0.35.x line. + +1. Start on `master` + +2. Create and push the backport branch: + ```sh + git checkout -b v0.35.x + git push origin v0.35.x + ``` + +3. Create a PR to update the documentation directory for the backport branch. + + We only maintain RFC and ADR documents on master, to avoid confusion. + In addition, we rewrite Markdown URLs pointing to master to point to the + backport branch, so that generated documentation will link to the correct + versions of files elsewhere in the repository. For context on the latter, + see https://github.com/tendermint/tendermint/issues/7675. + + To prepare the PR: + ```sh + # Remove the RFC and ADR documents from the backport. + # We only maintain these on master to avoid confusion. + git rm -r docs/rfc docs/architecture + + # Update absolute links to point to the backport. + go run ./scripts/linkpatch -recur -target v0.35.x -skip-path docs/DOCS_README.md,docs/README.md docs + + # Create and push the PR. + git checkout -b update-docs-v035x + git commit -m "Update docs for v0.35.x backport branch." docs + git push -u origin update-docs-v035x + ``` + + Be sure to merge this PR before making other changes on the newly-created + backport branch. + +After doing these steps, go back to `master` and do the following: + +1. Tag `master` as the dev branch for the _next_ major release and push it up to GitHub. + For example: + ```sh + git tag -a v0.36.0-dev -m "Development base for Tendermint v0.36." + git push origin v0.36.0-dev + ``` + +2. Create a new workflow to run e2e nightlies for the new backport branch. + (See [e2e-nightly-master.yml][e2e] for an example.) + +3. Add a new section to the Mergify config (`.github/mergify.yml`) to enable the + backport bot to work on this branch, and add a corresponding `S:backport-to-v0.35.x` + [label](https://github.com/tendermint/tendermint/labels) so the bot can be triggered. + +4. Add a new section to the Dependabot config (`.github/dependabot.yml`) to + enable automatic update of Go dependencies on this branch. Copy and edit one + of the existing branch configurations to set the correct `target-branch`. + +[e2e]: https://github.com/tendermint/tendermint/blob/master/.github/workflows/e2e-nightly-master.yml + +## Release candidates + +Before creating an official release, especially a major release, we may want to create a +release candidate (RC) for our friends and partners to test out. We use git tags to +create RCs, and we build them off of backport branches. + +Tags for RCs should follow the "standard" release naming conventions, with `-rcX` at the end +(for example, `v0.35.0-rc0`). + +(Note that branches and tags _cannot_ have the same names, so it's important that these branches +have distinct names from the tags/release names.) + +If this is the first RC for a major release, you'll have to make a new backport branch (see above). +Otherwise: + +1. Start from the backport branch (e.g. `v0.35.x`). +2. Run the integration tests and the e2e nightlies + (which can be triggered from the Github UI; + e.g., https://github.com/tendermint/tendermint/actions/workflows/e2e-nightly-34x.yml). +3. Prepare the changelog: + - Move the changes included in `CHANGELOG_PENDING.md` into `CHANGELOG.md`. Each RC should have + it's own changelog section. These will be squashed when the final candidate is released. + - Run `python ./scripts/linkify_changelog.py CHANGELOG.md` to add links for + all PRs + - Ensure that `UPGRADING.md` is up-to-date and includes notes on any breaking changes + or other upgrading flows. + - Bump TMVersionDefault version in `version.go` + - Bump P2P and block protocol versions in `version.go`, if necessary. + Check the changelog for breaking changes in these components. + - Bump ABCI protocol version in `version.go`, if necessary +4. Open a PR with these changes against the backport branch. +5. Once these changes have landed on the backport branch, be sure to pull them back down locally. +6. Once you have the changes locally, create the new tag, specifying a name and a tag "message": + `git tag -a v0.35.0-rc0 -m "Release Candidate v0.35.0-rc0` +7. Push the tag back up to origin: + `git push origin v0.35.0-rc0` + Now the tag should be available on the repo's releases page. +8. Future RCs will continue to be built off of this branch. + +Note that this process should only be used for "true" RCs-- +release candidates that, if successful, will be the next release. +For more experimental "RCs," create a new, short-lived branch and tag that instead. + +## Major release + +This major release process assumes that this release was preceded by release candidates. +If there were no release candidates, begin by creating a backport branch, as described above. + +1. Start on the backport branch (e.g. `v0.35.x`) +2. Run integration tests (`make test_integrations`) and the e2e nightlies. +3. Prepare the release: + - "Squash" changes from the changelog entries for the RCs into a single entry, + and add all changes included in `CHANGELOG_PENDING.md`. + (Squashing includes both combining all entries, as well as removing or simplifying + any intra-RC changes. It may also help to alphabetize the entries by package name.) + - Run `python ./scripts/linkify_changelog.py CHANGELOG.md` to add links for + all PRs + - Ensure that `UPGRADING.md` is up-to-date and includes notes on any breaking changes + or other upgrading flows. + - Bump TMVersionDefault version in `version.go` + - Bump P2P and block protocol versions in `version.go`, if necessary + - Bump ABCI protocol version in `version.go`, if necessary +4. Open a PR with these changes against the backport branch. +5. Once these changes are on the backport branch, push a tag with prepared release details. + This will trigger the actual release `v0.35.0`. + - `git tag -a v0.35.0 -m 'Release v0.35.0'` + - `git push origin v0.35.0` +6. Make sure that `master` is updated with the latest `CHANGELOG.md`, `CHANGELOG_PENDING.md`, and `UPGRADING.md`. +7. Add the release to the documentation site generator config (see + [DOCS_README.md](./docs/DOCS_README.md) for more details). In summary: + - Start on branch `master`. + - Add a new line at the bottom of [`docs/versions`](./docs/versions) to + ensure the newest release is the default for the landing page. + - Add a new entry to `themeConfig.versions` in + [`docs/.vuepress/config.js`](./docs/.vuepress/config.js) to include the + release in the dropdown versions menu. + - Commit these changes to `master` and backport them into the backport + branch for this release. + +## Minor release (point releases) + +Minor releases are done differently from major releases: They are built off of +long-lived backport branches, rather than from master. As non-breaking changes +land on `master`, they should also be backported into these backport branches. + +Minor releases don't have release candidates by default, although any tricky +changes may merit a release candidate. + +To create a minor release: + +1. Checkout the long-lived backport branch: `git checkout v0.35.x` +2. Run integration tests (`make test_integrations`) and the nightlies. +3. Check out a new branch and prepare the release: + - Copy `CHANGELOG_PENDING.md` to top of `CHANGELOG.md` + - Run `python ./scripts/linkify_changelog.py CHANGELOG.md` to add links for all issues + - Run `bash ./scripts/authors.sh` to get a list of authors since the latest release, and add the GitHub aliases of external contributors to the top of the CHANGELOG. To lookup an alias from an email, try `bash ./scripts/authors.sh ` + - Reset the `CHANGELOG_PENDING.md` + - Bump the TMDefaultVersion in `version.go` + - Bump the ABCI version number, if necessary. + (Note that ABCI follows semver, and that ABCI versions are the only versions + which can change during minor releases, and only field additions are valid minor changes.) +4. Open a PR with these changes that will land them back on `v0.35.x` +5. Once this change has landed on the backport branch, make sure to pull it locally, then push a tag. + - `git tag -a v0.35.1 -m 'Release v0.35.1'` + - `git push origin v0.35.1` +6. Create a pull request back to master with the CHANGELOG & version changes from the latest release. + - Remove all `R:minor` labels from the pull requests that were included in the release. + - Do not merge the backport branch into master. diff --git a/SECURITY.md b/SECURITY.md index 57d13e565a..133e993c41 100644 --- a/SECURITY.md +++ b/SECURITY.md @@ -4,7 +4,7 @@ As part of our [Coordinated Vulnerability Disclosure Policy](https://tendermint.com/security), we operate a [bug -bounty](https://hackerone.com/tendermint). +bounty](https://hackerone.com/cosmos). See the policy for more details on submissions and rewards, and see "Example Vulnerabilities" (below) for examples of the kinds of bugs we're most interested in. ### Guidelines @@ -86,7 +86,7 @@ If you are running older versions of Tendermint Core, we encourage you to upgrad ## Scope -The full scope of our bug bounty program is outlined on our [Hacker One program page](https://hackerone.com/tendermint). Please also note that, in the interest of the safety of our users and staff, a few things are explicitly excluded from scope: +The full scope of our bug bounty program is outlined on our [Hacker One program page](https://hackerone.com/cosmos). Please also note that, in the interest of the safety of our users and staff, a few things are explicitly excluded from scope: * Any third-party services * Findings from physical testing, such as office access diff --git a/UPGRADING.md b/UPGRADING.md index 8972ca6beb..28e44e58c0 100644 --- a/UPGRADING.md +++ b/UPGRADING.md @@ -2,6 +2,170 @@ This guide provides instructions for upgrading to specific versions of Tendermint Core. +## v0.36 + +### ABCI Changes + +#### ABCI++ + +Coming soon... + +#### ABCI Mutex + +In previous versions of ABCI, Tendermint was prevented from making +concurrent calls to ABCI implementations by virtue of mutexes in the +implementation of Tendermint's ABCI infrastructure. These mutexes have +been removed from the current implementation and applications will now +be responsible for managing their own concurrency control. + +To replicate the prior semantics, ensure that ABCI applications have a +single mutex that protects all ABCI method calls from concurrent +access. You can relax these requirements if your application can +provide safe concurrent access via other means. This safety is an +application concern so be very sure to test the application thoroughly +using realistic workloads and the race detector to ensure your +applications remains correct. + +### Config Changes + +- We have added a new, experimental tool to help operators migrate + configuration files created by previous versions of Tendermint. + To try this tool, run: + + ```shell + # Install the tool. + go install github.com/tendermint/tendermint/scripts/confix@latest + + # Run the tool with the old configuration file as input. + # Replace the -config argument with your path. + confix -config ~/.tendermint/config/config.toml -out updated.toml + ``` + + This tool should be able to update configurations from v0.34 and v0.35. We + plan to extend it to handle older configuration files in the future. For now, + it will report an error (without making any changes) if it does not recognize + the version that created the file. + +- The default configuration for a newly-created node now disables indexing for + ABCI event metadata. Existing node configurations that already have indexing + turned on are not affected. Operators who wish to enable indexing for a new + node, however, must now edit the `config.toml` explicitly. + +### RPC Changes + +Tendermint v0.36 adds a new RPC event subscription API. The existing event +subscription API based on websockets is now deprecated. It will continue to +work throughout the v0.36 release, but the `subscribe`, `unsubscribe`, and +`unsubscribe_all` methods, along with websocket support, will be removed in +Tendermint v0.37. Callers currently using these features should migrate as +soon as is practical to the new API. + +To enable the new API, node operators set a new `event-log-window-size` +parameter in the `[rpc]` section of the `config.toml` file. This defines a +duration of time during which the node will log all events published to the +event bus for use by RPC consumers. + +Consumers use the new `events` JSON-RPC method to poll for events matching +their query in the log. Unlike the streaming API, events are not discarded if +the caller is slow, loses its connection, or crashes. As long as the client +recovers before its events expire from the log window, it will be able to +replay and catch up after recovering. Also unlike the streaming API, the client +can tell if it has truly missed events because they have expired from the log. + +The `events` method is a normal JSON-RPC method, and does not require any +non-standard response processing (in contrast with the old `subscribe`). +Clients can modify their query at any time, and no longer need to coordinate +subscribe and unsubscribe calls to handle multiple queries. + +The Go client implementations in the Tendermint Core repository have all been +updated to add a new `Events` method, including the light client proxy. + +A new `rpc/client/eventstream` package has also been added to make it easier +for users to update existing use of the streaming API to use the polling API +The `eventstream` package handles polling and delivers matching events to a +callback. + +For more detailed information, see [ADR 075](https://tinyurl.com/adr075) which +defines and describes the new API in detail. + +### Timeout Parameter Changes + +Tendermint v0.36 updates how the Tendermint consensus timing parameters are +configured. These parameters, `timeout-propose`, `timeout-propose-delta`, +`timeout-prevote`, `timeout-prevote-delta`, `timeout-precommit`, +`timeout-precommit-delta`, `timeout-commit`, and `skip-timeout-commit`, were +previously configured in `config.toml`. These timing parameters have moved and +are no longer configured in the `config.toml` file. These parameters have been +migrated into the `ConsensusParameters`. Nodes with these parameters set in the +local configuration file will see a warning logged on startup indicating that +these parameters are no longer used. + +These parameters have also been pared-down. There are no longer separate +parameters for both the `prevote` and `precommit` phases of Tendermint. The +separate `timeout-prevote` and `timeout-precommit` parameters have been merged +into a single `timeout-vote` parameter that configures both of these similar +phases of the consensus protocol. + +A set of reasonable defaults have been put in place for these new parameters +that will take effect when the node starts up in version v0.36. New chains +created using v0.36 and beyond will be able to configure these parameters in the +chain's `genesis.json` file. Chains that upgrade to v0.36 from a previous +compatible version of Tendermint will begin running with the default values. +Upgrading applications that wish to use different values from the defaults for +these parameters may do so by setting the `ConsensusParams.Timeout` field of the +`FinalizeBlock` `ABCI` response. + +As a safety measure in case of unusual timing issues during the upgrade to +v0.36, an operator may override the consensus timeout values for a single node. +Note, however, that these overrides will be removed in Tendermint v0.37. See +[configuration](https://github.com/tendermint/tendermint/blob/master/docs/nodes/configuration.md) +for more information about these overrides. + +For more discussion of this, see [ADR 074](https://tinyurl.com/adr074), which +lays out the reasoning for the changes as well as [RFC +009](https://tinyurl.com/rfc009) for a discussion of the complexities of +upgrading consensus parameters. + +### CLI Changes + +The functionality around resetting a node has been extended to make it safer. The +`unsafe-reset-all` command has been replaced by a `reset` command with four +subcommands: `blockchain`, `peers`, `unsafe-signer` and `unsafe-all`. + +- `tendermint reset blockchain`: Clears a node of all blocks, consensus state, evidence, + and indexed transactions. NOTE: This command does not reset application state. + If you need to rollback the last application state (to recover from application + nondeterminism), see instead the `tendermint rollback` command. +- `tendermint reset peers`: Clears the peer store, which persists information on peers used + by the networking layer. This can be used to get rid of stale addresses or to switch + to a predefined set of static peers. +- `tendermint reset unsafe-signer`: Resets the watermark level of the PrivVal File signer + allowing it to sign votes from the genesis height. This should only be used in testing as + it can lead to the node double signing. +- `tendermint reset unsafe-all`: A summation of the other three commands. This will delete + the entire `data` directory which may include application data as well. + +### Go API Changes + +#### `crypto` Package Cleanup + +The `github.com/tendermint/tendermint/crypto/tmhash` package was removed +to improve clarity. Users are encouraged to use the standard library +`crypto/sha256` package directly. However, as a convenience, some constants +and one function have moved to the Tendermint `crypto` package: + +- The `crypto.Checksum` function returns the sha256 checksum of a + byteslice. This is a wrapper around `sha256.Sum265` from the + standard libary, but provided as a function to ease type + requirements (the library function returns a `[32]byte` rather than + a `[]byte`). +- `tmhash.TruncatedSize` is now `crypto.AddressSize` which was + previously an alias for the same value. +- `tmhash.Size` and `tmhash.BlockSize` are now `crypto.HashSize` and + `crypto.HashSize`. +- `tmhash.SumTruncated` is now available via `crypto.AddressHash` or by + `crypto.Checksum(<...>)[:crypto.AddressSize]` + ## v0.35 ### ABCI Changes @@ -116,11 +280,13 @@ the full RPC interface provided as direct function calls. Import the the node service as in the following: ```go - node := node.NewDefault() //construct the node object - // start and set up the node service +logger := log.NewNopLogger() + +// Construct and start up a node with default settings. +node := node.NewDefault(logger) - client := local.New(node.(local.NodeService)) - // use client object to interact with the node +// Construct a local (in-memory) RPC client to the node. +client := local.New(logger, node.(local.NodeService)) ``` ### gRPC Support @@ -217,7 +383,7 @@ Note also that Tendermint 0.34 also requires Go 1.16 or higher. were added to support the new State Sync feature. Previously, syncing a new node to a preexisting network could take days; but with State Sync, new nodes are able to join a network in a matter of seconds. - Read [the spec](https://docs.tendermint.com/master/spec/abci/apps.html#state-sync) + Read [the spec](https://github.com/tendermint/tendermint/blob/master/spec/abci/apps.md) if you want to learn more about State Sync, or if you'd like your application to use it. (If you don't want to support State Sync in your application, you can just implement these new ABCI methods as no-ops, leaving them empty.) @@ -342,7 +508,6 @@ The `bech32` package has moved to the Cosmos SDK: ### CLI The `tendermint lite` command has been renamed to `tendermint light` and has a slightly different API. -See [the docs](https://docs.tendermint.com/master/tendermint-core/light-client-protocol.html#http-proxy) for details. ### Light Client @@ -617,7 +782,7 @@ the compilation tag: Use `cleveldb` tag instead of `gcc` to compile Tendermint with CLevelDB or use `make build_c` / `make install_c` (full instructions can be found at -) + 0 { msg = args[0] } - res, err := client.EchoSync(ctx, msg) + res, err := client.Echo(cmd.Context(), msg) if err != nil { return err } + printResponse(cmd, args, response{ Data: []byte(res.Message), }) + return nil } @@ -465,7 +490,7 @@ func cmdInfo(cmd *cobra.Command, args []string) error { if len(args) == 1 { version = args[0] } - res, err := client.InfoSync(ctx, types.RequestInfo{Version: version}) + res, err := client.Info(cmd.Context(), &types.RequestInfo{Version: version}) if err != nil { return err } @@ -478,28 +503,34 @@ func cmdInfo(cmd *cobra.Command, args []string) error { const codeBad uint32 = 10 // Append a new tx to application -func cmdDeliverTx(cmd *cobra.Command, args []string) error { +func cmdFinalizeBlock(cmd *cobra.Command, args []string) error { if len(args) == 0 { printResponse(cmd, args, response{ Code: codeBad, - Log: "want the tx", + Log: "Must provide at least one transaction", }) return nil } - txBytes, err := stringOrHexToBytes(args[0]) - if err != nil { - return err + txs := make([][]byte, len(args)) + for i, arg := range args { + txBytes, err := stringOrHexToBytes(arg) + if err != nil { + return err + } + txs[i] = txBytes } - res, err := client.DeliverTxSync(ctx, types.RequestDeliverTx{Tx: txBytes}) + res, err := client.FinalizeBlock(cmd.Context(), &types.RequestFinalizeBlock{Txs: txs}) if err != nil { return err } - printResponse(cmd, args, response{ - Code: res.Code, - Data: res.Data, - Info: res.Info, - Log: res.Log, - }) + for _, tx := range res.TxResults { + printResponse(cmd, args, response{ + Code: tx.Code, + Data: tx.Data, + Info: tx.Info, + Log: tx.Log, + }) + } return nil } @@ -516,7 +547,7 @@ func cmdCheckTx(cmd *cobra.Command, args []string) error { if err != nil { return err } - res, err := client.CheckTxSync(ctx, types.RequestCheckTx{Tx: txBytes}) + res, err := client.CheckTx(cmd.Context(), &types.RequestCheckTx{Tx: txBytes}) if err != nil { return err } @@ -531,7 +562,7 @@ func cmdCheckTx(cmd *cobra.Command, args []string) error { // Get application Merkle root hash func cmdCommit(cmd *cobra.Command, args []string) error { - res, err := client.CommitSync(ctx) + res, err := client.Commit(cmd.Context()) if err != nil { return err } @@ -556,7 +587,7 @@ func cmdQuery(cmd *cobra.Command, args []string) error { return err } - resQuery, err := client.QuerySync(ctx, types.RequestQuery{ + resQuery, err := client.Query(cmd.Context(), &types.RequestQuery{ Data: queryBytes, Path: flagPath, Height: int64(flagHeight), @@ -579,38 +610,34 @@ func cmdQuery(cmd *cobra.Command, args []string) error { return nil } -func cmdKVStore(cmd *cobra.Command, args []string) error { - logger := log.MustNewDefaultLogger(log.LogFormatPlain, log.LogLevelInfo, false) +func makeKVStoreCmd(logger log.Logger) func(*cobra.Command, []string) error { + return func(cmd *cobra.Command, args []string) error { + // Create the application - in memory or persisted to disk + var app types.Application + if flagPersist == "" { + app = kvstore.NewApplication() + } else { + app = kvstore.NewPersistentKVStoreApplication(logger, flagPersist) + } - // Create the application - in memory or persisted to disk - var app types.Application - if flagPersist == "" { - app = kvstore.NewApplication() - } else { - app = kvstore.NewPersistentKVStoreApplication(flagPersist) - app.(*kvstore.PersistentKVStoreApplication).SetLogger(logger.With("module", "kvstore")) - } + // Start the listener + srv, err := server.NewServer(logger.With("module", "abci-server"), flagAddress, flagAbci, app) + if err != nil { + return err + } - // Start the listener - srv, err := server.NewServer(flagAddress, flagAbci, app) - if err != nil { - return err - } - srv.SetLogger(logger.With("module", "abci-server")) - if err := srv.Start(); err != nil { - return err - } + ctx, cancel := signal.NotifyContext(cmd.Context(), syscall.SIGTERM) + defer cancel() - // Stop upon receiving SIGTERM or CTRL-C. - tmos.TrapSignal(logger, func() { - // Cleanup - if err := srv.Stop(); err != nil { - logger.Error("Error while stopping server", "err", err) + if err := srv.Start(ctx); err != nil { + return err } - }) - // Run forever. - select {} + // Run forever. + <-ctx.Done() + return nil + } + } //-------------------------------------------------------------------------------- @@ -618,7 +645,7 @@ func cmdKVStore(cmd *cobra.Command, args []string) error { func printResponse(cmd *cobra.Command, args []string, rsp response) { if flagVerbose { - fmt.Println(">", cmd.Use, strings.Join(args, " ")) + fmt.Println(">", strings.Join(append([]string{cmd.Use}, args...), " ")) } // Always print the status code. diff --git a/abci/example/counter/counter.go b/abci/example/counter/counter.go index e1675eaf8e..4bb6f5b404 100644 --- a/abci/example/counter/counter.go +++ b/abci/example/counter/counter.go @@ -1,6 +1,7 @@ package counter import ( + "context" "encoding/binary" "fmt" @@ -25,80 +26,82 @@ func NewApplication(serial bool) *Application { return &Application{serial: serial, CoreChainLockStep: 1} } -func (app *Application) Info(req types.RequestInfo) types.ResponseInfo { - return types.ResponseInfo{Data: fmt.Sprintf("{\"hashes\":%v,\"txs\":%v}", app.hashCount, app.txCount)} +func (app *Application) Info(_ context.Context, _ *types.RequestInfo) (*types.ResponseInfo, error) { + return &types.ResponseInfo{Data: fmt.Sprintf("{\"hashes\":%v,\"txs\":%v}", app.hashCount, app.txCount)}, nil } -func (app *Application) DeliverTx(req types.RequestDeliverTx) types.ResponseDeliverTx { +func (app *Application) CheckTx(_ context.Context, req *types.RequestCheckTx) (*types.ResponseCheckTx, error) { if app.serial { if len(req.Tx) > 8 { - return types.ResponseDeliverTx{ + return &types.ResponseCheckTx{ Code: code.CodeTypeEncodingError, - Log: fmt.Sprintf("Max tx size is 8 bytes, got %d", len(req.Tx))} - } - tx8 := make([]byte, 8) - copy(tx8[len(tx8)-len(req.Tx):], req.Tx) - txValue := binary.BigEndian.Uint64(tx8) - if txValue != uint64(app.txCount) { - return types.ResponseDeliverTx{ - Code: code.CodeTypeBadNonce, - Log: fmt.Sprintf("Invalid nonce. Expected %v, got %v", app.txCount, txValue)} - } - } - app.txCount++ - return types.ResponseDeliverTx{Code: code.CodeTypeOK} -} - -func (app *Application) CheckTx(req types.RequestCheckTx) types.ResponseCheckTx { - if app.serial { - if len(req.Tx) > 8 { - return types.ResponseCheckTx{ - Code: code.CodeTypeEncodingError, - Log: fmt.Sprintf("Max tx size is 8 bytes, got %d", len(req.Tx))} + Log: fmt.Sprintf("Max tx size is 8 bytes, got %d", len(req.Tx)), + }, nil } tx8 := make([]byte, 8) copy(tx8[len(tx8)-len(req.Tx):], req.Tx) txValue := binary.BigEndian.Uint64(tx8) if txValue < uint64(app.txCount) { - return types.ResponseCheckTx{ + return &types.ResponseCheckTx{ Code: code.CodeTypeBadNonce, - Log: fmt.Sprintf("Invalid nonce. Expected >= %v, got %v", app.txCount, txValue)} + Log: fmt.Sprintf("Invalid nonce. Expected >= %v, got %v", app.txCount, txValue), + }, nil } } - return types.ResponseCheckTx{Code: code.CodeTypeOK} + return &types.ResponseCheckTx{Code: code.CodeTypeOK}, nil } -func (app *Application) Commit() (resp types.ResponseCommit) { +func (app *Application) Commit(_ context.Context) (*types.ResponseCommit, error) { app.hashCount++ if app.txCount == 0 { - return types.ResponseCommit{} + return &types.ResponseCommit{}, nil } hash := make([]byte, 24) endHash := make([]byte, 8) binary.BigEndian.PutUint64(endHash, uint64(app.txCount)) hash = append(hash, endHash...) - return types.ResponseCommit{Data: hash} + return &types.ResponseCommit{Data: hash}, nil } -func (app *Application) Query(reqQuery types.RequestQuery) types.ResponseQuery { +func (app *Application) Query(_ context.Context, reqQuery *types.RequestQuery) (*types.ResponseQuery, error) { switch reqQuery.Path { case "verify-chainlock": - return types.ResponseQuery{Code: 0} + return &types.ResponseQuery{Code: 0}, nil case "hash": - return types.ResponseQuery{Value: []byte(fmt.Sprintf("%v", app.hashCount))} + return &types.ResponseQuery{Value: []byte(fmt.Sprintf("%v", app.hashCount))}, nil case "tx": - return types.ResponseQuery{Value: []byte(fmt.Sprintf("%v", app.txCount))} + return &types.ResponseQuery{Value: []byte(fmt.Sprintf("%v", app.txCount))}, nil default: - return types.ResponseQuery{Log: fmt.Sprintf("Invalid query path. Expected hash or tx, got %v", reqQuery.Path)} + return &types.ResponseQuery{Log: fmt.Sprintf("Invalid query path. Expected hash or tx, got %v", reqQuery.Path)}, nil } } -func (app *Application) EndBlock(reqEndBlock types.RequestEndBlock) types.ResponseEndBlock { - var resp types.ResponseEndBlock +func (app *Application) FinalizeBlock(_ context.Context, req *types.RequestFinalizeBlock) (*types.ResponseFinalizeBlock, error) { + var resp types.ResponseFinalizeBlock + for _, tx := range req.Txs { + if app.serial { + if len(tx) > 8 { + resp.TxResults = append(resp.TxResults, &types.ExecTxResult{ + Code: code.CodeTypeEncodingError, + Log: fmt.Sprintf("Max tx size is 8 bytes, got %d", len(tx)), + }) + } + tx8 := make([]byte, 8) + copy(tx8[len(tx8)-len(tx):], tx) + txValue := binary.BigEndian.Uint64(tx8) + if txValue != uint64(app.txCount) { + resp.TxResults = append(resp.TxResults, &types.ExecTxResult{ + Code: code.CodeTypeBadNonce, + Log: fmt.Sprintf("Invalid nonce. Expected %v, got %v", app.txCount, txValue), + }) + } + } + app.txCount++ + } if app.HasCoreChainLocks { app.CurrentCoreChainLockHeight = app.CurrentCoreChainLockHeight + uint32(app.CoreChainLockStep) coreChainLock := tmtypes.NewMockChainLock(app.CurrentCoreChainLockHeight) resp.NextCoreChainLockUpdate = coreChainLock.ToProto() } - return resp + return &resp, nil } diff --git a/abci/example/example_test.go b/abci/example/example_test.go index 8b8691e371..066d4071d7 100644 --- a/abci/example/example_test.go +++ b/abci/example/example_test.go @@ -6,7 +6,6 @@ import ( "math/rand" "net" "os" - "reflect" "testing" "time" @@ -30,95 +29,69 @@ func init() { } func TestKVStore(t *testing.T) { - fmt.Println("### Testing KVStore") - testStream(t, kvstore.NewApplication()) + ctx, cancel := context.WithCancel(context.Background()) + defer cancel() + logger := log.NewNopLogger() + + t.Log("### Testing KVStore") + testBulk(ctx, t, logger, kvstore.NewApplication()) } func TestBaseApp(t *testing.T) { - fmt.Println("### Testing BaseApp") - testStream(t, types.NewBaseApplication()) + ctx, cancel := context.WithCancel(context.Background()) + defer cancel() + logger := log.NewNopLogger() + + t.Log("### Testing BaseApp") + testBulk(ctx, t, logger, types.NewBaseApplication()) } func TestGRPC(t *testing.T) { - fmt.Println("### Testing GRPC") - testGRPCSync(t, types.NewGRPCApplication(types.NewBaseApplication())) + ctx, cancel := context.WithCancel(context.Background()) + defer cancel() + + logger := log.NewNopLogger() + + t.Log("### Testing GRPC") + testGRPCSync(ctx, t, logger, types.NewBaseApplication()) } -func testStream(t *testing.T, app types.Application) { - const numDeliverTxs = 20000 +func testBulk(ctx context.Context, t *testing.T, logger log.Logger, app types.Application) { + t.Helper() + + const numDeliverTxs = 700000 socketFile := fmt.Sprintf("test-%08x.sock", rand.Int31n(1<<30)) defer os.Remove(socketFile) socket := fmt.Sprintf("unix://%v", socketFile) - // Start the listener - server := abciserver.NewSocketServer(socket, app) - server.SetLogger(log.TestingLogger().With("module", "abci-server")) - err := server.Start() + server := abciserver.NewSocketServer(logger.With("module", "abci-server"), socket, app) + t.Cleanup(server.Wait) + err := server.Start(ctx) require.NoError(t, err) - t.Cleanup(func() { - if err := server.Stop(); err != nil { - t.Error(err) - } - }) // Connect to the socket - client := abciclient.NewSocketClient(socket, false) - client.SetLogger(log.TestingLogger().With("module", "abci-client")) - err = client.Start() - require.NoError(t, err) - t.Cleanup(func() { - if err := client.Stop(); err != nil { - t.Error(err) - } - }) - - done := make(chan struct{}) - counter := 0 - client.SetResponseCallback(func(req *types.Request, res *types.Response) { - // Process response - switch r := res.Value.(type) { - case *types.Response_DeliverTx: - counter++ - if r.DeliverTx.Code != code.CodeTypeOK { - t.Error("DeliverTx failed with ret_code", r.DeliverTx.Code) - } - if counter > numDeliverTxs { - t.Fatalf("Too many DeliverTx responses. Got %d, expected %d", counter, numDeliverTxs) - } - if counter == numDeliverTxs { - go func() { - time.Sleep(time.Second * 1) // Wait for a bit to allow counter overflow - close(done) - }() - return - } - case *types.Response_Flush: - // ignore - default: - t.Error("Unexpected response type", reflect.TypeOf(res.Value)) - } - }) + client := abciclient.NewSocketClient(logger.With("module", "abci-client"), socket, false) + t.Cleanup(client.Wait) - ctx := context.Background() + err = client.Start(ctx) + require.NoError(t, err) - // Write requests + // Construct request + rfb := &types.RequestFinalizeBlock{Txs: make([][]byte, numDeliverTxs)} for counter := 0; counter < numDeliverTxs; counter++ { - // Send request - _, err = client.DeliverTxAsync(ctx, types.RequestDeliverTx{Tx: []byte("test")}) - require.NoError(t, err) - - // Sometimes send flush messages - if counter%128 == 0 { - err = client.FlushSync(context.Background()) - require.NoError(t, err) - } + rfb.Txs[counter] = []byte("test") + } + // Send bulk request + res, err := client.FinalizeBlock(ctx, rfb) + require.NoError(t, err) + require.Equal(t, numDeliverTxs, len(res.TxResults), "Number of txs doesn't match") + for _, tx := range res.TxResults { + require.Equal(t, tx.Code, code.CodeTypeOK, "Tx failed") } // Send final flush message - _, err = client.FlushAsync(ctx) + err = client.Flush(ctx) require.NoError(t, err) - - <-done } //------------------------- @@ -128,33 +101,25 @@ func dialerFunc(ctx context.Context, addr string) (net.Conn, error) { return tmnet.Connect(addr) } -func testGRPCSync(t *testing.T, app types.ABCIApplicationServer) { - numDeliverTxs := 2000 +func testGRPCSync(ctx context.Context, t *testing.T, logger log.Logger, app types.Application) { + t.Helper() + numDeliverTxs := 680000 socketFile := fmt.Sprintf("/tmp/test-%08x.sock", rand.Int31n(1<<30)) defer os.Remove(socketFile) socket := fmt.Sprintf("unix://%v", socketFile) // Start the listener - server := abciserver.NewGRPCServer(socket, app) - server.SetLogger(log.TestingLogger().With("module", "abci-server")) - if err := server.Start(); err != nil { - t.Fatalf("Error starting GRPC server: %v", err.Error()) - } + server := abciserver.NewGRPCServer(logger.With("module", "abci-server"), socket, app) - t.Cleanup(func() { - if err := server.Stop(); err != nil { - t.Error(err) - } - }) + require.NoError(t, server.Start(ctx)) + t.Cleanup(server.Wait) // Connect to the socket conn, err := grpc.Dial(socket, grpc.WithTransportCredentials(insecure.NewCredentials()), grpc.WithContextDialer(dialerFunc), ) - if err != nil { - t.Fatalf("Error dialing GRPC server: %v", err.Error()) - } + require.NoError(t, err, "Error dialing GRPC server") t.Cleanup(func() { if err := conn.Close(); err != nil { @@ -164,26 +129,17 @@ func testGRPCSync(t *testing.T, app types.ABCIApplicationServer) { client := types.NewABCIApplicationClient(conn) - // Write requests + // Construct request + rfb := types.RequestFinalizeBlock{Txs: make([][]byte, numDeliverTxs)} for counter := 0; counter < numDeliverTxs; counter++ { - // Send request - response, err := client.DeliverTx(context.Background(), &types.RequestDeliverTx{Tx: []byte("test")}) - if err != nil { - t.Fatalf("Error in GRPC DeliverTx: %v", err.Error()) - } - counter++ - if response.Code != code.CodeTypeOK { - t.Error("DeliverTx failed with ret_code", response.Code) - } - if counter > numDeliverTxs { - t.Fatal("Too many DeliverTx responses") - } - t.Log("response", counter) - if counter == numDeliverTxs { - go func() { - time.Sleep(time.Second * 1) // Wait for a bit to allow counter overflow - }() - } + rfb.Txs[counter] = []byte("test") + } + // Send request + response, err := client.FinalizeBlock(ctx, &rfb) + require.NoError(t, err, "Error in GRPC FinalizeBlock") + require.Equal(t, numDeliverTxs, len(response.TxResults), "Number of txs returned via GRPC doesn't match") + for _, tx := range response.TxResults { + require.Equal(t, tx.Code, code.CodeTypeOK, "Tx failed") } } diff --git a/abci/example/kvstore/README.md b/abci/example/kvstore/README.md index fee6e35dca..5eed47050d 100644 --- a/abci/example/kvstore/README.md +++ b/abci/example/kvstore/README.md @@ -12,7 +12,7 @@ The app has no replay protection (other than what the mempool provides). ## PersistentKVStoreApplication The PersistentKVStoreApplication wraps the KVStoreApplication -and provides two additional features: +and provides three additional features: 1) persistence of state across app restarts (using Tendermint's ABCI-Handshake mechanism) 2) validator set changes diff --git a/abci/example/kvstore/helpers.go b/abci/example/kvstore/helpers.go index b70b541ea7..ae60f5d202 100644 --- a/abci/example/kvstore/helpers.go +++ b/abci/example/kvstore/helpers.go @@ -1,6 +1,8 @@ package kvstore import ( + "context" + "github.com/tendermint/tendermint/abci/types" "github.com/tendermint/tendermint/crypto" "github.com/tendermint/tendermint/dash/llmq" @@ -26,11 +28,12 @@ func RandValidatorSetUpdate(cnt int) types.ValidatorSetUpdate { // InitKVStore initializes the kvstore app with some data, // which allows tests to pass and is fine as long as you // don't make any tx that modify the validator state -func InitKVStore(app *PersistentKVStoreApplication) { +func InitKVStore(ctx context.Context, app *PersistentKVStoreApplication) error { val := RandValidatorSetUpdate(1) - app.InitChain(types.RequestInitChain{ + _, err := app.InitChain(ctx, &types.RequestInitChain{ ValidatorSet: &val, }) + return err } func randNodeAddrs(n int) []string { diff --git a/abci/example/kvstore/kvstore.go b/abci/example/kvstore/kvstore.go index e2f7f34d28..c1ea46108c 100644 --- a/abci/example/kvstore/kvstore.go +++ b/abci/example/kvstore/kvstore.go @@ -2,17 +2,27 @@ package kvstore import ( "bytes" + "context" + "encoding/base64" "encoding/binary" "encoding/json" "fmt" + "strings" + "sync" + "github.com/gogo/protobuf/proto" dbm "github.com/tendermint/tm-db" "github.com/tendermint/tendermint/abci/example/code" "github.com/tendermint/tendermint/abci/types" + "github.com/tendermint/tendermint/crypto" + "github.com/tendermint/tendermint/internal/libs/protoio" + "github.com/tendermint/tendermint/libs/log" "github.com/tendermint/tendermint/version" ) +const ValidatorSetUpdatePrefix string = "vsu:" + var ( stateKey = []byte("stateKey") kvPairPrefixKey = []byte("kvPairKey:") @@ -65,35 +75,72 @@ var _ types.Application = (*Application)(nil) type Application struct { types.BaseApplication - + mu sync.Mutex state State RetainBlocks int64 // blocks to retain after commit (via ResponseCommit.RetainHeight) + logger log.Logger + + // validator set update + valUpdatesRepo *repository + valSetUpdate types.ValidatorSetUpdate + valsIndex map[string]*types.ValidatorUpdate } func NewApplication() *Application { - state := loadState(dbm.NewMemDB()) - return &Application{state: state} + db := dbm.NewMemDB() + return &Application{ + logger: log.NewNopLogger(), + state: loadState(db), + valsIndex: make(map[string]*types.ValidatorUpdate), + valUpdatesRepo: &repository{db}, + } +} + +func (app *Application) InitChain(_ context.Context, req *types.RequestInitChain) (*types.ResponseInitChain, error) { + app.mu.Lock() + defer app.mu.Unlock() + err := app.setValSetUpdate(req.ValidatorSet) + if err != nil { + return nil, err + } + return &types.ResponseInitChain{}, nil } -func (app *Application) Info(req types.RequestInfo) (resInfo types.ResponseInfo) { - return types.ResponseInfo{ +func (app *Application) Info(_ context.Context, req *types.RequestInfo) (*types.ResponseInfo, error) { + app.mu.Lock() + defer app.mu.Unlock() + return &types.ResponseInfo{ Data: fmt.Sprintf("{\"size\":%v}", app.state.Size), Version: version.ABCIVersion, AppVersion: ProtocolVersion, LastBlockHeight: app.state.Height, LastBlockAppHash: app.state.AppHash, - } + }, nil } -// tx is either "key=value" or just arbitrary bytes -func (app *Application) DeliverTx(req types.RequestDeliverTx) types.ResponseDeliverTx { - var key, value string +// tx is either "val:pubkey!power" or "key=value" or just arbitrary bytes +func (app *Application) handleTx(tx []byte) *types.ExecTxResult { + if isValidatorSetUpdateTx(tx) { + err := app.execValidatorSetTx(tx) + if err != nil { + return &types.ExecTxResult{ + Code: code.CodeTypeUnknownError, + Log: err.Error(), + } + } + return &types.ExecTxResult{Code: code.CodeTypeOK} + } + + if isPrepareTx(tx) { + return app.execPrepareTx(tx) + } - parts := bytes.Split(req.Tx, []byte("=")) + var key, value string + parts := bytes.Split(tx, []byte("=")) if len(parts) == 2 { key, value = string(parts[0]), string(parts[1]) } else { - key, value = string(req.Tx), string(req.Tx) + key, value = string(tx), string(tx) } err := app.state.db.Set(prefixKey([]byte(key)), []byte(value)) @@ -114,14 +161,56 @@ func (app *Application) DeliverTx(req types.RequestDeliverTx) types.ResponseDeli }, } - return types.ResponseDeliverTx{Code: code.CodeTypeOK, Events: events} + return &types.ExecTxResult{Code: code.CodeTypeOK, Events: events} } -func (app *Application) CheckTx(req types.RequestCheckTx) types.ResponseCheckTx { - return types.ResponseCheckTx{Code: code.CodeTypeOK, GasWanted: 1} +func (app *Application) Close() error { + app.mu.Lock() + defer app.mu.Unlock() + + return app.state.db.Close() } -func (app *Application) Commit() types.ResponseCommit { +func (app *Application) FinalizeBlock(_ context.Context, req *types.RequestFinalizeBlock) (*types.ResponseFinalizeBlock, error) { + app.mu.Lock() + defer app.mu.Unlock() + + // reset valset changes + app.valSetUpdate = types.ValidatorSetUpdate{} + app.valSetUpdate.ValidatorUpdates = make([]types.ValidatorUpdate, 0) + + // Punish validators who committed equivocation. + for _, ev := range req.ByzantineValidators { + // TODO it seems this code is not needed to keep here + if ev.Type == types.MisbehaviorType_DUPLICATE_VOTE { + proTxHash := crypto.ProTxHash(ev.Validator.ProTxHash) + v, ok := app.valsIndex[proTxHash.String()] + if !ok { + return nil, fmt.Errorf("wanted to punish val %q but can't find it", proTxHash.ShortString()) + } + v.Power = ev.Validator.Power - 1 + } + } + + respTxs := make([]*types.ExecTxResult, len(req.Txs)) + for i, tx := range req.Txs { + respTxs[i] = app.handleTx(tx) + } + + return &types.ResponseFinalizeBlock{ + TxResults: respTxs, + ValidatorSetUpdate: proto.Clone(&app.valSetUpdate).(*types.ValidatorSetUpdate), + }, nil +} + +func (*Application) CheckTx(_ context.Context, req *types.RequestCheckTx) (*types.ResponseCheckTx, error) { + return &types.ResponseCheckTx{Code: code.CodeTypeOK, GasWanted: 1}, nil +} + +func (app *Application) Commit(_ context.Context) (*types.ResponseCommit, error) { + app.mu.Lock() + defer app.mu.Unlock() + // Using a memdb - just return the big endian size of the db appHash := make([]byte, 32) binary.PutVarint(appHash, app.state.Size) @@ -129,52 +218,276 @@ func (app *Application) Commit() types.ResponseCommit { app.state.Height++ saveState(app.state) - resp := types.ResponseCommit{Data: appHash} + resp := &types.ResponseCommit{Data: appHash} if app.RetainBlocks > 0 && app.state.Height >= app.RetainBlocks { resp.RetainHeight = app.state.Height - app.RetainBlocks + 1 } - return resp + return resp, nil } -// Returns an associated value or nil if missing. -func (app *Application) Query(reqQuery types.RequestQuery) (resQuery types.ResponseQuery) { +// Query returns an associated value or nil if missing. +func (app *Application) Query(_ context.Context, reqQuery *types.RequestQuery) (*types.ResponseQuery, error) { + app.mu.Lock() + defer app.mu.Unlock() + switch reqQuery.Path { + case "/vsu": + vsu, err := app.valUpdatesRepo.get() + if err != nil { + return &types.ResponseQuery{ + Code: code.CodeTypeUnknownError, + Log: err.Error(), + }, nil + } + data, err := encodeMsg(vsu) + if err != nil { + return &types.ResponseQuery{ + Code: code.CodeTypeEncodingError, + Log: err.Error(), + }, nil + } + return &types.ResponseQuery{ + Key: reqQuery.Data, + Value: data, + }, nil case "/verify-chainlock": - resQuery.Code = 0 - - return resQuery - default: - if reqQuery.Prove { - value, err := app.state.db.Get(prefixKey(reqQuery.Data)) - if err != nil { - panic(err) - } - if value == nil { - resQuery.Log = "does not exist" - } else { - resQuery.Log = "exists" - } - resQuery.Index = -1 // TODO make Proof return index - resQuery.Key = reqQuery.Data - resQuery.Value = value - resQuery.Height = app.state.Height - - return + return &types.ResponseQuery{ + Code: 0, + }, nil + case "/val": + vu, err := app.valUpdatesRepo.findBy(reqQuery.Data) + if err != nil { + return &types.ResponseQuery{ + Code: code.CodeTypeUnknownError, + Log: err.Error(), + }, nil + } + value, err := encodeMsg(vu) + if err != nil { + return &types.ResponseQuery{ + Code: code.CodeTypeEncodingError, + Log: err.Error(), + }, nil } + return &types.ResponseQuery{ + Key: reqQuery.Data, + Value: value, + }, nil + } - resQuery.Key = reqQuery.Data + if reqQuery.Prove { value, err := app.state.db.Get(prefixKey(reqQuery.Data)) if err != nil { panic(err) } + + resQuery := types.ResponseQuery{ + Index: -1, + Key: reqQuery.Data, + Value: value, + Height: app.state.Height, + } + if value == nil { resQuery.Log = "does not exist" } else { resQuery.Log = "exists" } - resQuery.Value = value - resQuery.Height = app.state.Height - return resQuery + return &resQuery, nil } + + value, err := app.state.db.Get(prefixKey(reqQuery.Data)) + if err != nil { + panic(err) + } + + resQuery := types.ResponseQuery{ + Key: reqQuery.Data, + Value: value, + Height: app.state.Height, + } + + if value == nil { + resQuery.Log = "does not exist" + } else { + resQuery.Log = "exists" + } + + return &resQuery, nil +} + +func (app *Application) PrepareProposal(_ context.Context, req *types.RequestPrepareProposal) (*types.ResponsePrepareProposal, error) { + app.mu.Lock() + defer app.mu.Unlock() + + return &types.ResponsePrepareProposal{ + TxRecords: app.substPrepareTx(req.Txs, req.MaxTxBytes), + }, nil +} + +func (*Application) ProcessProposal(_ context.Context, req *types.RequestProcessProposal) (*types.ResponseProcessProposal, error) { + for _, tx := range req.Txs { + if len(tx) == 0 { + return &types.ResponseProcessProposal{Status: types.ResponseProcessProposal_REJECT}, nil + } + } + return &types.ResponseProcessProposal{Status: types.ResponseProcessProposal_ACCEPT}, nil +} + +//--------------------------------------------- +// update validators + +func (app *Application) ValidatorSet() (*types.ValidatorSetUpdate, error) { + return app.valUpdatesRepo.get() +} + +func (app *Application) execValidatorSetTx(tx []byte) error { + vsu, err := UnmarshalValidatorSetUpdate(tx) + if err != nil { + return err + } + err = app.setValSetUpdate(vsu) + if err != nil { + return err + } + app.valSetUpdate = *vsu + return nil +} + +// MarshalValidatorSetUpdate encodes validator-set-update into protobuf, encode into base64 and add "vsu:" prefix +func MarshalValidatorSetUpdate(vsu *types.ValidatorSetUpdate) ([]byte, error) { + pbData, err := proto.Marshal(vsu) + if err != nil { + return nil, err + } + return []byte(ValidatorSetUpdatePrefix + base64.StdEncoding.EncodeToString(pbData)), nil +} + +// UnmarshalValidatorSetUpdate removes "vsu:" prefix and unmarshal a string into validator-set-update +func UnmarshalValidatorSetUpdate(data []byte) (*types.ValidatorSetUpdate, error) { + l := len(ValidatorSetUpdatePrefix) + data, err := base64.StdEncoding.DecodeString(string(data[l:])) + if err != nil { + return nil, err + } + vsu := new(types.ValidatorSetUpdate) + err = proto.Unmarshal(data, vsu) + return vsu, err +} + +type repository struct { + db dbm.DB +} + +func (r *repository) set(vsu *types.ValidatorSetUpdate) error { + data, err := proto.Marshal(vsu) + if err != nil { + return err + } + return r.db.Set([]byte(ValidatorSetUpdatePrefix), data) +} + +func (r *repository) get() (*types.ValidatorSetUpdate, error) { + data, err := r.db.Get([]byte(ValidatorSetUpdatePrefix)) + if err != nil { + return nil, err + } + vsu := new(types.ValidatorSetUpdate) + err = proto.Unmarshal(data, vsu) + if err != nil { + return nil, err + } + return vsu, nil +} + +func (r *repository) findBy(proTxHash crypto.ProTxHash) (*types.ValidatorUpdate, error) { + vsu, err := r.get() + if err != nil { + return nil, err + } + for _, vu := range vsu.ValidatorUpdates { + if bytes.Equal(vu.ProTxHash, proTxHash) { + return &vu, nil + } + } + return nil, err +} + +func isValidatorSetUpdateTx(tx []byte) bool { + return strings.HasPrefix(string(tx), ValidatorSetUpdatePrefix) +} + +func encodeMsg(data proto.Message) ([]byte, error) { + buf := bytes.NewBufferString("") + w := protoio.NewDelimitedWriter(buf) + _, err := w.WriteMsg(data) + if err != nil { + return nil, err + } + return buf.Bytes(), nil +} + +// ----------------------------- +// prepare proposal machinery + +const PreparePrefix = "prepare" + +func isPrepareTx(tx []byte) bool { + return bytes.HasPrefix(tx, []byte(PreparePrefix)) +} + +// execPrepareTx is noop. tx data is considered as placeholder +// and is substitute at the PrepareProposal. +func (app *Application) execPrepareTx(tx []byte) *types.ExecTxResult { + // noop + return &types.ExecTxResult{} +} + +// substPrepareTx substitutes all the transactions prefixed with 'prepare' in the +// proposal for transactions with the prefix stripped. +// It marks all of the original transactions as 'REMOVED' so that +// Tendermint will remove them from its mempool. +func (app *Application) substPrepareTx(blockData [][]byte, maxTxBytes int64) []*types.TxRecord { + trs := make([]*types.TxRecord, 0, len(blockData)) + var removed []*types.TxRecord + var totalBytes int64 + for _, tx := range blockData { + txMod := tx + action := types.TxRecord_UNMODIFIED + if isPrepareTx(tx) { + removed = append(removed, &types.TxRecord{ + Tx: tx, + Action: types.TxRecord_REMOVED, + }) + txMod = bytes.TrimPrefix(tx, []byte(PreparePrefix)) + action = types.TxRecord_ADDED + } + totalBytes += int64(len(txMod)) + if totalBytes > maxTxBytes { + break + } + trs = append(trs, &types.TxRecord{ + Tx: txMod, + Action: action, + }) + } + + return append(trs, removed...) +} + +func (app *Application) setValSetUpdate(valSetUpdate *types.ValidatorSetUpdate) error { + err := app.valUpdatesRepo.set(valSetUpdate) + if err != nil { + return err + } + app.valsIndex = make(map[string]*types.ValidatorUpdate) + for i, v := range valSetUpdate.ValidatorUpdates { + app.valsIndex[proTxHashString(v.ProTxHash)] = &valSetUpdate.ValidatorUpdates[i] + } + return nil +} + +func proTxHashString(proTxHash crypto.ProTxHash) string { + return proTxHash.String() } diff --git a/abci/example/kvstore/kvstore_test.go b/abci/example/kvstore/kvstore_test.go index a06c8a7912..922e3b25d4 100644 --- a/abci/example/kvstore/kvstore_test.go +++ b/abci/example/kvstore/kvstore_test.go @@ -4,10 +4,10 @@ import ( "bytes" "context" "fmt" - "io/ioutil" "sort" "testing" + "github.com/fortytw2/leaktest" "github.com/stretchr/testify/require" abciclient "github.com/tendermint/tendermint/abci/client" @@ -16,7 +16,6 @@ import ( "github.com/tendermint/tendermint/abci/types" "github.com/tendermint/tendermint/libs/log" "github.com/tendermint/tendermint/libs/service" - tmproto "github.com/tendermint/tendermint/proto/tendermint/types" ) const ( @@ -24,38 +23,44 @@ const ( testValue = "def" ) -var ctx = context.Background() - -func testKVStore(t *testing.T, app types.Application, tx []byte, key, value string) { - req := types.RequestDeliverTx{Tx: tx} - ar := app.DeliverTx(req) - require.False(t, ar.IsErr(), ar) +func testKVStore(ctx context.Context, t *testing.T, app types.Application, tx []byte, key, value string) { + req := &types.RequestFinalizeBlock{Txs: [][]byte{tx}} + ar, err := app.FinalizeBlock(ctx, req) + require.NoError(t, err) + require.Equal(t, 1, len(ar.TxResults)) + require.False(t, ar.TxResults[0].IsErr()) // repeating tx doesn't raise error - ar = app.DeliverTx(req) - require.False(t, ar.IsErr(), ar) + ar, err = app.FinalizeBlock(ctx, req) + require.NoError(t, err) + require.Equal(t, 1, len(ar.TxResults)) + require.False(t, ar.TxResults[0].IsErr()) // commit - app.Commit() + _, err = app.Commit(ctx) + require.NoError(t, err) - info := app.Info(types.RequestInfo{}) + info, err := app.Info(ctx, &types.RequestInfo{}) + require.NoError(t, err) require.NotZero(t, info.LastBlockHeight) // make sure query is fine - resQuery := app.Query(types.RequestQuery{ + resQuery, err := app.Query(ctx, &types.RequestQuery{ Path: "/store", Data: []byte(key), }) + require.NoError(t, err) require.Equal(t, code.CodeTypeOK, resQuery.Code) require.Equal(t, key, string(resQuery.Key)) require.Equal(t, value, string(resQuery.Value)) require.EqualValues(t, info.LastBlockHeight, resQuery.Height) // make sure proof is fine - resQuery = app.Query(types.RequestQuery{ + resQuery, err = app.Query(ctx, &types.RequestQuery{ Path: "/store", Data: []byte(key), Prove: true, }) + require.NoError(t, err) require.EqualValues(t, code.CodeTypeOK, resQuery.Code) require.Equal(t, key, string(resQuery.Key)) require.Equal(t, value, string(resQuery.Value)) @@ -63,43 +68,55 @@ func testKVStore(t *testing.T, app types.Application, tx []byte, key, value stri } func TestKVStoreKV(t *testing.T) { + ctx, cancel := context.WithCancel(context.Background()) + defer cancel() + kvstore := NewApplication() key := testKey value := key tx := []byte(key) - testKVStore(t, kvstore, tx, key, value) + testKVStore(ctx, t, kvstore, tx, key, value) value = testValue tx = []byte(key + "=" + value) - testKVStore(t, kvstore, tx, key, value) + testKVStore(ctx, t, kvstore, tx, key, value) } func TestPersistentKVStoreKV(t *testing.T) { - dir, err := ioutil.TempDir("/tmp", "abci-kvstore-test") // TODO - if err != nil { - t.Fatal(err) - } - kvstore := NewPersistentKVStoreApplication(dir) + ctx, cancel := context.WithCancel(context.Background()) + defer cancel() + + dir := t.TempDir() + logger := log.NewNopLogger() + + kvstore := NewPersistentKVStoreApplication(logger, dir) key := testKey value := key tx := []byte(key) - testKVStore(t, kvstore, tx, key, value) + testKVStore(ctx, t, kvstore, tx, key, value) value = testValue tx = []byte(key + "=" + value) - testKVStore(t, kvstore, tx, key, value) + testKVStore(ctx, t, kvstore, tx, key, value) } func TestPersistentKVStoreInfo(t *testing.T) { - dir, err := ioutil.TempDir("/tmp", "abci-kvstore-test") // TODO - if err != nil { + ctx, cancel := context.WithCancel(context.Background()) + defer cancel() + dir := t.TempDir() + logger := log.NewNopLogger() + + kvstore := NewPersistentKVStoreApplication(logger, dir) + if err := InitKVStore(ctx, kvstore); err != nil { t.Fatal(err) } - kvstore := NewPersistentKVStoreApplication(dir) - InitKVStore(kvstore) height := int64(0) - resInfo := kvstore.Info(types.RequestInfo{}) + resInfo, err := kvstore.Info(ctx, &types.RequestInfo{}) + if err != nil { + t.Fatal(err) + } + if resInfo.LastBlockHeight != height { t.Fatalf("expected height of %d, got %d", height, resInfo.LastBlockHeight) } @@ -107,14 +124,19 @@ func TestPersistentKVStoreInfo(t *testing.T) { // make and apply block height = int64(1) hash := []byte("foo") - header := tmproto.Header{ - Height: height, + if _, err := kvstore.FinalizeBlock(ctx, &types.RequestFinalizeBlock{Hash: hash, Height: height}); err != nil { + t.Fatal(err) } - kvstore.BeginBlock(types.RequestBeginBlock{Hash: hash, Header: header}) - kvstore.EndBlock(types.RequestEndBlock{Height: header.Height}) - kvstore.Commit() - resInfo = kvstore.Info(types.RequestInfo{}) + if _, err := kvstore.Commit(ctx); err != nil { + t.Fatal(err) + + } + + resInfo, err = kvstore.Info(ctx, &types.RequestInfo{}) + if err != nil { + t.Fatal(err) + } if resInfo.LastBlockHeight != height { t.Fatalf("expected height of %d, got %d", height, resInfo.LastBlockHeight) } @@ -123,11 +145,10 @@ func TestPersistentKVStoreInfo(t *testing.T) { // add a validator, remove a validator, update a validator func TestValUpdates(t *testing.T) { - dir, err := ioutil.TempDir("/tmp", "abci-kvstore-test") // TODO - if err != nil { - t.Fatal(err) - } - kvstore := NewPersistentKVStoreApplication(dir) + ctx, cancel := context.WithCancel(context.Background()) + defer cancel() + + kvstore := NewApplication() // init with some validators total := 10 @@ -136,26 +157,30 @@ func TestValUpdates(t *testing.T) { initVals := RandValidatorSetUpdate(nInit) // initialize with the first nInit - kvstore.InitChain(types.RequestInitChain{ + _, err := kvstore.InitChain(ctx, &types.RequestInitChain{ ValidatorSet: &initVals, }) + if err != nil { + t.Fatal(err) + } kvVals, err := kvstore.ValidatorSet() require.NoError(t, err) - valSetEqualTest(t, *kvVals, initVals) + valSetEqualTest(t, kvVals, &initVals) tx, err := MarshalValidatorSetUpdate(&fullVals) require.NoError(t, err) // change the validator set to the full validator set - makeApplyBlock(t, kvstore, 1, fullVals, tx) + makeApplyBlock(ctx, t, kvstore, 1, fullVals, tx) kvVals, err = kvstore.ValidatorSet() require.NoError(t, err) - valSetEqualTest(t, *kvVals, fullVals) + valSetEqualTest(t, kvVals, &fullVals) } func makeApplyBlock( + ctx context.Context, t *testing.T, kvstore types.Application, heightInt int, @@ -164,24 +189,23 @@ func makeApplyBlock( // make and apply block height := int64(heightInt) hash := []byte("foo") - header := tmproto.Header{ + resFinalizeBlock, err := kvstore.FinalizeBlock(ctx, &types.RequestFinalizeBlock{ + Hash: hash, Height: height, - } - - kvstore.BeginBlock(types.RequestBeginBlock{Hash: hash, Header: header}) - for i, tx := range txs { - r := kvstore.DeliverTx(types.RequestDeliverTx{Tx: tx}) - require.False(t, r.IsErr(), "i=%d, tx=%s, err=%s", i, tx, r.String()) - } - resEndBlock := kvstore.EndBlock(types.RequestEndBlock{Height: header.Height}) - kvstore.Commit() + Txs: txs, + }) + require.NoError(t, err) - valSetEqualTest(t, diff, *resEndBlock.ValidatorSetUpdate) + _, err = kvstore.Commit(ctx) + require.NoError(t, err) + valSetEqualTest(t, &diff, resFinalizeBlock.ValidatorSetUpdate) } // order doesn't matter func valsEqualTest(t *testing.T, vals1, vals2 []types.ValidatorUpdate) { + t.Helper() + require.Equal(t, len(vals1), len(vals2), "vals dont match in len. got %d, expected %d", len(vals2), len(vals1)) sort.Sort(types.ValidatorUpdates(vals1)) sort.Sort(types.ValidatorUpdates(vals2)) @@ -189,153 +213,162 @@ func valsEqualTest(t *testing.T, vals1, vals2 []types.ValidatorUpdate) { v2 := vals2[i] if !v1.PubKey.Equal(v2.PubKey) || v1.Power != v2.Power { - t.Fatalf("vals dont match at index %d. got %X/%d , expected %X/%d", i, *v2.PubKey, v2.Power, *v1.PubKey, v1.Power) + t.Fatalf("vals dont match at index %d. got %X/%d , expected %X/%d", i, v2.PubKey, v2.Power, v1.PubKey, v1.Power) } } } -func valSetEqualTest(t *testing.T, vals1, vals2 types.ValidatorSetUpdate) { +func valSetEqualTest(t *testing.T, vals1, vals2 *types.ValidatorSetUpdate) { + t.Helper() + valsEqualTest(t, vals1.ValidatorUpdates, vals2.ValidatorUpdates) - if !vals1.ThresholdPublicKey.Equal(vals2.ThresholdPublicKey) { - t.Fatalf("val set threshold public key did not match. got %X, expected %X", - vals1.ThresholdPublicKey, vals2.ThresholdPublicKey) - } - if !bytes.Equal(vals1.QuorumHash, vals2.QuorumHash) { - t.Fatalf("val set quorum hash did not match. got %X, expected %X", - vals1.QuorumHash, vals2.QuorumHash) - } + require.True(t, + vals1.ThresholdPublicKey.Equal(vals2.ThresholdPublicKey), + "val set threshold public key did not match. got %X, expected %X", + vals1.ThresholdPublicKey, vals2.ThresholdPublicKey, + ) + require.True(t, + bytes.Equal(vals1.QuorumHash, vals2.QuorumHash), + "val set quorum hash did not match. got %X, expected %X", + vals1.QuorumHash, vals2.QuorumHash, + ) } -func makeSocketClientServer(app types.Application, name string) (abciclient.Client, service.Service, error) { +func makeSocketClientServer( + ctx context.Context, + t *testing.T, + logger log.Logger, + app types.Application, + name string, +) (abciclient.Client, service.Service, error) { + t.Helper() + + ctx, cancel := context.WithCancel(ctx) + t.Cleanup(cancel) + t.Cleanup(leaktest.Check(t)) + // Start the listener socket := fmt.Sprintf("unix://%s.sock", name) - logger := log.TestingLogger() - server := abciserver.NewSocketServer(socket, app) - server.SetLogger(logger.With("module", "abci-server")) - if err := server.Start(); err != nil { + server := abciserver.NewSocketServer(logger.With("module", "abci-server"), socket, app) + if err := server.Start(ctx); err != nil { + cancel() return nil, nil, err } // Connect to the socket - client := abciclient.NewSocketClient(socket, false) - client.SetLogger(logger.With("module", "abci-client")) - if err := client.Start(); err != nil { - if err = server.Stop(); err != nil { - return nil, nil, err - } + client := abciclient.NewSocketClient(logger.With("module", "abci-client"), socket, false) + if err := client.Start(ctx); err != nil { + cancel() return nil, nil, err } return client, server, nil } -func makeGRPCClientServer(app types.Application, name string) (abciclient.Client, service.Service, error) { +func makeGRPCClientServer( + ctx context.Context, + t *testing.T, + logger log.Logger, + app types.Application, + name string, +) (abciclient.Client, service.Service, error) { + ctx, cancel := context.WithCancel(ctx) + t.Cleanup(cancel) + t.Cleanup(leaktest.Check(t)) + // Start the listener socket := fmt.Sprintf("unix://%s.sock", name) - logger := log.TestingLogger() - gapp := types.NewGRPCApplication(app) - server := abciserver.NewGRPCServer(socket, gapp) - server.SetLogger(logger.With("module", "abci-server")) - if err := server.Start(); err != nil { + server := abciserver.NewGRPCServer(logger.With("module", "abci-server"), socket, app) + + if err := server.Start(ctx); err != nil { + cancel() return nil, nil, err } - client := abciclient.NewGRPCClient(socket, true) - client.SetLogger(logger.With("module", "abci-client")) - if err := client.Start(); err != nil { - if err := server.Stop(); err != nil { - return nil, nil, err - } + client := abciclient.NewGRPCClient(logger.With("module", "abci-client"), socket, true) + + if err := client.Start(ctx); err != nil { + cancel() return nil, nil, err } return client, server, nil } func TestClientServer(t *testing.T) { + ctx, cancel := context.WithCancel(context.Background()) + defer cancel() + logger := log.NewNopLogger() + // set up socket app kvstore := NewApplication() - client, server, err := makeSocketClientServer(kvstore, "kvstore-socket") + client, server, err := makeSocketClientServer(ctx, t, logger, kvstore, "kvstore-socket") require.NoError(t, err) - t.Cleanup(func() { - if err := server.Stop(); err != nil { - t.Error(err) - } - }) - t.Cleanup(func() { - if err := client.Stop(); err != nil { - t.Error(err) - } - }) + t.Cleanup(func() { cancel(); server.Wait() }) + t.Cleanup(func() { cancel(); client.Wait() }) - runClientTests(t, client) + runClientTests(ctx, t, client) // set up grpc app kvstore = NewApplication() - gclient, gserver, err := makeGRPCClientServer(kvstore, "/tmp/kvstore-grpc") + gclient, gserver, err := makeGRPCClientServer(ctx, t, logger, kvstore, "/tmp/kvstore-grpc") require.NoError(t, err) - t.Cleanup(func() { - if err := gserver.Stop(); err != nil { - t.Error(err) - } - }) - t.Cleanup(func() { - if err := gclient.Stop(); err != nil { - t.Error(err) - } - }) + t.Cleanup(func() { cancel(); gserver.Wait() }) + t.Cleanup(func() { cancel(); gclient.Wait() }) - runClientTests(t, gclient) + runClientTests(ctx, t, gclient) } -func runClientTests(t *testing.T, client abciclient.Client) { +func runClientTests(ctx context.Context, t *testing.T, client abciclient.Client) { // run some tests.... key := testKey value := key tx := []byte(key) - testClient(t, client, tx, key, value) + testClient(ctx, t, client, tx, key, value) value = testValue tx = []byte(key + "=" + value) - testClient(t, client, tx, key, value) + testClient(ctx, t, client, tx, key, value) } -func testClient(t *testing.T, app abciclient.Client, tx []byte, key, value string) { - ar, err := app.DeliverTxSync(ctx, types.RequestDeliverTx{Tx: tx}) +func testClient(ctx context.Context, t *testing.T, app abciclient.Client, tx []byte, key, value string) { + ar, err := app.FinalizeBlock(ctx, &types.RequestFinalizeBlock{Txs: [][]byte{tx}}) require.NoError(t, err) - require.False(t, ar.IsErr(), ar) - // repeating tx doesn't raise error - ar, err = app.DeliverTxSync(ctx, types.RequestDeliverTx{Tx: tx}) + require.Equal(t, 1, len(ar.TxResults)) + require.False(t, ar.TxResults[0].IsErr()) + // repeating FinalizeBlock doesn't raise error + ar, err = app.FinalizeBlock(ctx, &types.RequestFinalizeBlock{Txs: [][]byte{tx}}) require.NoError(t, err) - require.False(t, ar.IsErr(), ar) + require.Equal(t, 1, len(ar.TxResults)) + require.False(t, ar.TxResults[0].IsErr()) // commit - _, err = app.CommitSync(ctx) + _, err = app.Commit(ctx) require.NoError(t, err) - info, err := app.InfoSync(ctx, types.RequestInfo{}) + info, err := app.Info(ctx, &types.RequestInfo{}) require.NoError(t, err) require.NotZero(t, info.LastBlockHeight) // make sure query is fine - resQuery, err := app.QuerySync(ctx, types.RequestQuery{ + resQuery, err := app.Query(ctx, &types.RequestQuery{ Path: "/store", Data: []byte(key), }) - require.Nil(t, err) + require.NoError(t, err) require.Equal(t, code.CodeTypeOK, resQuery.Code) require.Equal(t, key, string(resQuery.Key)) require.Equal(t, value, string(resQuery.Value)) require.EqualValues(t, info.LastBlockHeight, resQuery.Height) // make sure proof is fine - resQuery, err = app.QuerySync(ctx, types.RequestQuery{ + resQuery, err = app.Query(ctx, &types.RequestQuery{ Path: "/store", Data: []byte(key), Prove: true, }) - require.Nil(t, err) + require.NoError(t, err) require.Equal(t, code.CodeTypeOK, resQuery.Code) require.Equal(t, key, string(resQuery.Key)) require.Equal(t, value, string(resQuery.Value)) diff --git a/abci/example/kvstore/persistent_kvstore.go b/abci/example/kvstore/persistent_kvstore.go index 7e418beb47..f3d39d49a0 100644 --- a/abci/example/kvstore/persistent_kvstore.go +++ b/abci/example/kvstore/persistent_kvstore.go @@ -1,245 +1,42 @@ package kvstore import ( - "bytes" - "encoding/base64" - "strings" + "context" - "github.com/gogo/protobuf/proto" dbm "github.com/tendermint/tm-db" - "github.com/tendermint/tendermint/abci/example/code" "github.com/tendermint/tendermint/abci/types" - "github.com/tendermint/tendermint/internal/libs/protoio" - "github.com/tendermint/tendermint/internal/libs/sync" "github.com/tendermint/tendermint/libs/log" ) -const ValidatorSetUpdatePrefix string = "vsu:" - //----------------------------------------- var _ types.Application = (*PersistentKVStoreApplication)(nil) type PersistentKVStoreApplication struct { - mtx sync.Mutex - app *Application - logger log.Logger - - valUpdatesRepo *repository - ValidatorSetUpdates types.ValidatorSetUpdate + *Application } -func NewPersistentKVStoreApplication(dbDir string) *PersistentKVStoreApplication { - const name = "kvstore" - db, err := dbm.NewGoLevelDB(name, dbDir) +func NewPersistentKVStoreApplication(logger log.Logger, dbDir string) *PersistentKVStoreApplication { + db, err := dbm.NewGoLevelDB("kvstore", dbDir) if err != nil { panic(err) } - return &PersistentKVStoreApplication{ - app: &Application{state: loadState(db)}, - logger: log.NewNopLogger(), - - valUpdatesRepo: &repository{db: db}, - } -} - -func (app *PersistentKVStoreApplication) Close() error { - return app.app.state.db.Close() -} - -func (app *PersistentKVStoreApplication) SetLogger(l log.Logger) { - app.logger = l -} - -func (app *PersistentKVStoreApplication) Info(req types.RequestInfo) types.ResponseInfo { - res := app.app.Info(req) - res.LastBlockHeight = app.app.state.Height - res.LastBlockAppHash = app.app.state.AppHash - return res -} - -// DeliverTx will deliver a tx which is either "val:proTxHash!pubkey!power" or "key=value" or just arbitrary bytes -func (app *PersistentKVStoreApplication) DeliverTx(req types.RequestDeliverTx) types.ResponseDeliverTx { - app.mtx.Lock() - defer app.mtx.Unlock() - if isValidatorSetUpdateTx(req.Tx) { - err := app.execValidatorSetTx(req.Tx) - if err != nil { - return types.ResponseDeliverTx{ - Code: code.CodeTypeUnknownError, - Log: err.Error(), - } - } - return types.ResponseDeliverTx{Code: code.CodeTypeOK} - } - return app.app.DeliverTx(req) -} - -func (app *PersistentKVStoreApplication) CheckTx(req types.RequestCheckTx) types.ResponseCheckTx { - return app.app.CheckTx(req) -} -// Commit makes a commit in application's state -func (app *PersistentKVStoreApplication) Commit() types.ResponseCommit { - return app.app.Commit() -} - -// Query when path=/val and data={validator address}, returns the validator update (types.ValidatorUpdate) varint encoded. -// For any other path, returns an associated value or nil if missing. -func (app *PersistentKVStoreApplication) Query(reqQuery types.RequestQuery) (resQuery types.ResponseQuery) { - switch reqQuery.Path { - case "/vsu": - vsu, err := app.valUpdatesRepo.get() - if err != nil { - return types.ResponseQuery{ - Code: code.CodeTypeUnknownError, - Log: err.Error(), - } - } - data, err := encodeMsg(vsu) - if err != nil { - return types.ResponseQuery{ - Code: code.CodeTypeEncodingError, - Log: err.Error(), - } - } - resQuery.Key = reqQuery.Data - resQuery.Value = data - return - case "/verify-chainlock": - resQuery.Code = 0 - return resQuery - default: - return app.app.Query(reqQuery) - } -} - -// InitChain saves the validators in the merkle tree -func (app *PersistentKVStoreApplication) InitChain(req types.RequestInitChain) types.ResponseInitChain { - err := app.valUpdatesRepo.set(req.ValidatorSet) - if err != nil { - app.logger.Error("error updating validators", "err", err) - return types.ResponseInitChain{} - } - return types.ResponseInitChain{} -} - -// BeginBlock tracks the block hash and header information -func (app *PersistentKVStoreApplication) BeginBlock(req types.RequestBeginBlock) types.ResponseBeginBlock { - app.mtx.Lock() - defer app.mtx.Unlock() - - // reset valset changes - app.ValidatorSetUpdates.ValidatorUpdates = make([]types.ValidatorUpdate, 0) - - return types.ResponseBeginBlock{} -} - -// EndBlock updates the validator set -func (app *PersistentKVStoreApplication) EndBlock(_ types.RequestEndBlock) types.ResponseEndBlock { - app.mtx.Lock() - defer app.mtx.Unlock() - c := proto.Clone(&app.ValidatorSetUpdates).(*types.ValidatorSetUpdate) - return types.ResponseEndBlock{ValidatorSetUpdate: c} -} - -func (app *PersistentKVStoreApplication) ListSnapshots( - req types.RequestListSnapshots) types.ResponseListSnapshots { - return types.ResponseListSnapshots{} -} - -func (app *PersistentKVStoreApplication) LoadSnapshotChunk( - req types.RequestLoadSnapshotChunk) types.ResponseLoadSnapshotChunk { - return types.ResponseLoadSnapshotChunk{} -} - -func (app *PersistentKVStoreApplication) OfferSnapshot( - req types.RequestOfferSnapshot) types.ResponseOfferSnapshot { - return types.ResponseOfferSnapshot{Result: types.ResponseOfferSnapshot_ABORT} -} - -func (app *PersistentKVStoreApplication) ApplySnapshotChunk( - req types.RequestApplySnapshotChunk) types.ResponseApplySnapshotChunk { - return types.ResponseApplySnapshotChunk{Result: types.ResponseApplySnapshotChunk_ABORT} -} - -//--------------------------------------------- -// update validators - -func (app *PersistentKVStoreApplication) ValidatorSet() (*types.ValidatorSetUpdate, error) { - return app.valUpdatesRepo.get() -} - -func (app *PersistentKVStoreApplication) execValidatorSetTx(tx []byte) error { - vsu, err := UnmarshalValidatorSetUpdate(tx) - if err != nil { - return err - } - err = app.valUpdatesRepo.set(vsu) - if err != nil { - return err - } - app.ValidatorSetUpdates = *vsu - return nil -} - -// MarshalValidatorSetUpdate encodes validator-set-update into protobuf, encode into base64 and add "vsu:" prefix -func MarshalValidatorSetUpdate(vsu *types.ValidatorSetUpdate) ([]byte, error) { - pbData, err := proto.Marshal(vsu) - if err != nil { - return nil, err - } - return []byte(ValidatorSetUpdatePrefix + base64.StdEncoding.EncodeToString(pbData)), nil -} - -// UnmarshalValidatorSetUpdate removes "vsu:" prefix and unmarshal a string into validator-set-update -func UnmarshalValidatorSetUpdate(data []byte) (*types.ValidatorSetUpdate, error) { - l := len(ValidatorSetUpdatePrefix) - data, err := base64.StdEncoding.DecodeString(string(data[l:])) - if err != nil { - return nil, err - } - vsu := new(types.ValidatorSetUpdate) - err = proto.Unmarshal(data, vsu) - return vsu, err -} - -type repository struct { - db dbm.DB -} - -func (r *repository) set(vsu *types.ValidatorSetUpdate) error { - data, err := proto.Marshal(vsu) - if err != nil { - return err - } - return r.db.Set([]byte(ValidatorSetUpdatePrefix), data) -} - -func (r *repository) get() (*types.ValidatorSetUpdate, error) { - data, err := r.db.Get([]byte(ValidatorSetUpdatePrefix)) - if err != nil { - return nil, err - } - vsu := new(types.ValidatorSetUpdate) - err = proto.Unmarshal(data, vsu) - if err != nil { - return nil, err + return &PersistentKVStoreApplication{ + Application: &Application{ + state: loadState(db), + logger: logger, + valsIndex: make(map[string]*types.ValidatorUpdate), + valUpdatesRepo: &repository{db}, + }, } - return vsu, nil } -func isValidatorSetUpdateTx(tx []byte) bool { - return strings.HasPrefix(string(tx), ValidatorSetUpdatePrefix) +func (app *PersistentKVStoreApplication) OfferSnapshot(_ context.Context, req *types.RequestOfferSnapshot) (*types.ResponseOfferSnapshot, error) { + return &types.ResponseOfferSnapshot{Result: types.ResponseOfferSnapshot_ABORT}, nil } -func encodeMsg(data proto.Message) ([]byte, error) { - buf := bytes.NewBufferString("") - w := protoio.NewDelimitedWriter(buf) - _, err := w.WriteMsg(data) - if err != nil { - return nil, err - } - return buf.Bytes(), nil +func (app *PersistentKVStoreApplication) ApplySnapshotChunk(_ context.Context, req *types.RequestApplySnapshotChunk) (*types.ResponseApplySnapshotChunk, error) { + return &types.ResponseApplySnapshotChunk{Result: types.ResponseApplySnapshotChunk_ABORT}, nil } diff --git a/abci/server/grpc_server.go b/abci/server/grpc_server.go index 503f0b64f1..0dfee8169d 100644 --- a/abci/server/grpc_server.go +++ b/abci/server/grpc_server.go @@ -1,61 +1,83 @@ package server import ( + "context" "net" "google.golang.org/grpc" "github.com/tendermint/tendermint/abci/types" + "github.com/tendermint/tendermint/libs/log" tmnet "github.com/tendermint/tendermint/libs/net" "github.com/tendermint/tendermint/libs/service" ) type GRPCServer struct { service.BaseService + logger log.Logger - proto string - addr string - listener net.Listener - server *grpc.Server + proto string + addr string + server *grpc.Server - app types.ABCIApplicationServer + app types.Application } // NewGRPCServer returns a new gRPC ABCI server -func NewGRPCServer(protoAddr string, app types.ABCIApplicationServer) service.Service { +func NewGRPCServer(logger log.Logger, protoAddr string, app types.Application) service.Service { proto, addr := tmnet.ProtocolAndAddress(protoAddr) s := &GRPCServer{ - proto: proto, - addr: addr, - listener: nil, - app: app, + logger: logger, + proto: proto, + addr: addr, + app: app, } - s.BaseService = *service.NewBaseService(nil, "ABCIServer", s) + s.BaseService = *service.NewBaseService(logger, "ABCIServer", s) return s } // OnStart starts the gRPC service. -func (s *GRPCServer) OnStart() error { - +func (s *GRPCServer) OnStart(ctx context.Context) error { ln, err := net.Listen(s.proto, s.addr) if err != nil { return err } - s.listener = ln s.server = grpc.NewServer() - types.RegisterABCIApplicationServer(s.server, s.app) + types.RegisterABCIApplicationServer(s.server, &gRPCApplication{Application: s.app}) - s.Logger.Info("Listening", "proto", s.proto, "addr", s.addr) + s.logger.Info("Listening", "proto", s.proto, "addr", s.addr) go func() { - if err := s.server.Serve(s.listener); err != nil { - s.Logger.Error("Error serving gRPC server", "err", err) + go func() { + <-ctx.Done() + s.server.GracefulStop() + }() + + if err := s.server.Serve(ln); err != nil { + s.logger.Error("error serving gRPC server", "err", err) } }() return nil } // OnStop stops the gRPC server. -func (s *GRPCServer) OnStop() { - s.server.Stop() +func (s *GRPCServer) OnStop() { s.server.Stop() } + +//------------------------------------------------------- + +// gRPCApplication is a gRPC shim for Application +type gRPCApplication struct { + types.Application +} + +func (app *gRPCApplication) Echo(_ context.Context, req *types.RequestEcho) (*types.ResponseEcho, error) { + return &types.ResponseEcho{Message: req.Message}, nil +} + +func (app *gRPCApplication) Flush(_ context.Context, req *types.RequestFlush) (*types.ResponseFlush, error) { + return &types.ResponseFlush{}, nil +} + +func (app *gRPCApplication) Commit(ctx context.Context, req *types.RequestCommit) (*types.ResponseCommit, error) { + return app.Application.Commit(ctx) } diff --git a/abci/server/server.go b/abci/server/server.go index 6dd13ad020..0e0173ca65 100644 --- a/abci/server/server.go +++ b/abci/server/server.go @@ -12,17 +12,18 @@ import ( "fmt" "github.com/tendermint/tendermint/abci/types" + "github.com/tendermint/tendermint/libs/log" "github.com/tendermint/tendermint/libs/service" ) -func NewServer(protoAddr, transport string, app types.Application) (service.Service, error) { +func NewServer(logger log.Logger, protoAddr, transport string, app types.Application) (service.Service, error) { var s service.Service var err error switch transport { case "socket": - s = NewSocketServer(protoAddr, app) + s = NewSocketServer(logger, protoAddr, app) case "grpc": - s = NewGRPCServer(protoAddr, types.NewGRPCApplication(app)) + s = NewGRPCServer(logger, protoAddr, app) default: err = fmt.Errorf("unknown server type %s", transport) } diff --git a/abci/server/socket_server.go b/abci/server/socket_server.go index 85539645bf..570ecfb4e7 100644 --- a/abci/server/socket_server.go +++ b/abci/server/socket_server.go @@ -2,15 +2,16 @@ package server import ( "bufio" + "context" + "errors" "fmt" "io" "net" - "os" "runtime" + "sync" "github.com/tendermint/tendermint/abci/types" - tmsync "github.com/tendermint/tendermint/internal/libs/sync" - tmlog "github.com/tendermint/tendermint/libs/log" + "github.com/tendermint/tendermint/libs/log" tmnet "github.com/tendermint/tendermint/libs/net" "github.com/tendermint/tendermint/libs/service" ) @@ -19,236 +20,298 @@ import ( type SocketServer struct { service.BaseService - isLoggerSet bool + logger log.Logger proto string addr string listener net.Listener - connsMtx tmsync.Mutex - conns map[int]net.Conn + connsMtx sync.Mutex + connsClose map[int]func() nextConnID int - appMtx tmsync.Mutex - app types.Application + app types.Application } -func NewSocketServer(protoAddr string, app types.Application) service.Service { +func NewSocketServer(logger log.Logger, protoAddr string, app types.Application) service.Service { proto, addr := tmnet.ProtocolAndAddress(protoAddr) s := &SocketServer{ - proto: proto, - addr: addr, - listener: nil, - app: app, - conns: make(map[int]net.Conn), + logger: logger, + proto: proto, + addr: addr, + listener: nil, + app: app, + connsClose: make(map[int]func()), } - s.BaseService = *service.NewBaseService(nil, "ABCIServer", s) + s.BaseService = *service.NewBaseService(logger, "ABCIServer", s) return s } -func (s *SocketServer) SetLogger(l tmlog.Logger) { - s.BaseService.SetLogger(l) - s.isLoggerSet = true -} - -func (s *SocketServer) OnStart() error { +func (s *SocketServer) OnStart(ctx context.Context) error { ln, err := net.Listen(s.proto, s.addr) if err != nil { return err } s.listener = ln - go s.acceptConnectionsRoutine() + go s.acceptConnectionsRoutine(ctx) return nil } func (s *SocketServer) OnStop() { if err := s.listener.Close(); err != nil { - s.Logger.Error("Error closing listener", "err", err) + s.logger.Error("error closing listener", "err", err) } s.connsMtx.Lock() defer s.connsMtx.Unlock() - for id, conn := range s.conns { - delete(s.conns, id) - if err := conn.Close(); err != nil { - s.Logger.Error("Error closing connection", "id", id, "conn", conn, "err", err) - } + + for _, closer := range s.connsClose { + closer() } } -func (s *SocketServer) addConn(conn net.Conn) int { +func (s *SocketServer) addConn(closer func()) int { s.connsMtx.Lock() defer s.connsMtx.Unlock() connID := s.nextConnID s.nextConnID++ - s.conns[connID] = conn - + s.connsClose[connID] = closer return connID } // deletes conn even if close errs -func (s *SocketServer) rmConn(connID int) error { +func (s *SocketServer) rmConn(connID int) { s.connsMtx.Lock() defer s.connsMtx.Unlock() - - conn, ok := s.conns[connID] - if !ok { - return fmt.Errorf("connection %d does not exist", connID) + if closer, ok := s.connsClose[connID]; ok { + closer() + delete(s.connsClose, connID) } - - delete(s.conns, connID) - return conn.Close() } -func (s *SocketServer) acceptConnectionsRoutine() { +func (s *SocketServer) acceptConnectionsRoutine(ctx context.Context) { for { + if ctx.Err() != nil { + return + } + // Accept a connection - s.Logger.Info("Waiting for new connection...") + s.logger.Info("Waiting for new connection...") conn, err := s.listener.Accept() if err != nil { if !s.IsRunning() { return // Ignore error from listener closing. } - s.Logger.Error("Failed to accept connection", "err", err) + s.logger.Error("Failed to accept connection", "err", err) continue } - s.Logger.Info("Accepted a new connection") + cctx, ccancel := context.WithCancel(ctx) + connID := s.addConn(ccancel) - connID := s.addConn(conn) + s.logger.Info("Accepted a new connection", "id", connID) - closeConn := make(chan error, 2) // Push to signal connection closed responses := make(chan *types.Response, 1000) // A channel to buffer responses + once := &sync.Once{} + closer := func(err error) { + ccancel() + once.Do(func() { + if cerr := conn.Close(); err != nil { + s.logger.Error("error closing connection", + "id", connID, + "close_err", cerr, + "err", err) + } + s.rmConn(connID) + + switch { + case errors.Is(err, context.Canceled): + s.logger.Error("Connection terminated", + "id", connID, + "err", err) + case errors.Is(err, context.DeadlineExceeded): + s.logger.Error("Connection encountered timeout", + "id", connID, + "err", err) + case errors.Is(err, io.EOF): + s.logger.Error("Connection was closed by client", + "id", connID) + case err != nil: + s.logger.Error("Connection error", + "id", connID, + "err", err) + default: + s.logger.Error("Connection was closed", + "id", connID) + } + }) + } + // Read requests from conn and deal with them - go s.handleRequests(closeConn, conn, responses) + go s.handleRequests(cctx, closer, conn, responses) // Pull responses from 'responses' and write them to conn. - go s.handleResponses(closeConn, conn, responses) - - // Wait until signal to close connection - go s.waitForClose(closeConn, connID) - } -} - -func (s *SocketServer) waitForClose(closeConn chan error, connID int) { - err := <-closeConn - switch { - case err == io.EOF: - s.Logger.Error("Connection was closed by client") - case err != nil: - s.Logger.Error("Connection error", "err", err) - default: - // never happens - s.Logger.Error("Connection was closed") - } - - // Close the connection - if err := s.rmConn(connID); err != nil { - s.Logger.Error("Error closing connection", "err", err) + go s.handleResponses(cctx, closer, conn, responses) } } // Read requests from conn and deal with them -func (s *SocketServer) handleRequests(closeConn chan error, conn io.Reader, responses chan<- *types.Response) { - var count int +func (s *SocketServer) handleRequests(ctx context.Context, closer func(error), conn io.Reader, responses chan<- *types.Response) { var bufReader = bufio.NewReader(conn) defer func() { // make sure to recover from any app-related panics to allow proper socket cleanup - r := recover() - if r != nil { + if r := recover(); r != nil { const size = 64 << 10 buf := make([]byte, size) buf = buf[:runtime.Stack(buf, false)] - err := fmt.Errorf("recovered from panic: %v\n%s", r, buf) - if !s.isLoggerSet { - fmt.Fprintln(os.Stderr, err) - } - closeConn <- err - s.appMtx.Unlock() + closer(fmt.Errorf("recovered from panic: %v\n%s", r, buf)) } }() for { + req := &types.Request{} + if err := types.ReadMessage(bufReader, req); err != nil { + closer(fmt.Errorf("error reading message: %w", err)) + return + } - var req = &types.Request{} - err := types.ReadMessage(bufReader, req) + resp, err := s.processRequest(ctx, req) if err != nil { - if err == io.EOF { - closeConn <- err - } else { - closeConn <- fmt.Errorf("error reading message: %w", err) - } + closer(err) return } - s.appMtx.Lock() - count++ - s.handleRequest(req, responses) - s.appMtx.Unlock() + + select { + case <-ctx.Done(): + closer(ctx.Err()) + return + case responses <- resp: + } } } -func (s *SocketServer) handleRequest(req *types.Request, responses chan<- *types.Response) { +func (s *SocketServer) processRequest(ctx context.Context, req *types.Request) (*types.Response, error) { switch r := req.Value.(type) { case *types.Request_Echo: - responses <- types.ToResponseEcho(r.Echo.Message) + return types.ToResponseEcho(r.Echo.Message), nil case *types.Request_Flush: - responses <- types.ToResponseFlush() + return types.ToResponseFlush(), nil case *types.Request_Info: - res := s.app.Info(*r.Info) - responses <- types.ToResponseInfo(res) - case *types.Request_DeliverTx: - res := s.app.DeliverTx(*r.DeliverTx) - responses <- types.ToResponseDeliverTx(res) + res, err := s.app.Info(ctx, r.Info) + if err != nil { + return nil, err + } + + return types.ToResponseInfo(res), nil case *types.Request_CheckTx: - res := s.app.CheckTx(*r.CheckTx) - responses <- types.ToResponseCheckTx(res) + res, err := s.app.CheckTx(ctx, r.CheckTx) + if err != nil { + return nil, err + } + return types.ToResponseCheckTx(res), nil case *types.Request_Commit: - res := s.app.Commit() - responses <- types.ToResponseCommit(res) + res, err := s.app.Commit(ctx) + if err != nil { + return nil, err + } + return types.ToResponseCommit(res), nil case *types.Request_Query: - res := s.app.Query(*r.Query) - responses <- types.ToResponseQuery(res) + res, err := s.app.Query(ctx, r.Query) + if err != nil { + return nil, err + } + return types.ToResponseQuery(res), nil case *types.Request_InitChain: - res := s.app.InitChain(*r.InitChain) - responses <- types.ToResponseInitChain(res) - case *types.Request_BeginBlock: - res := s.app.BeginBlock(*r.BeginBlock) - responses <- types.ToResponseBeginBlock(res) - case *types.Request_EndBlock: - res := s.app.EndBlock(*r.EndBlock) - responses <- types.ToResponseEndBlock(res) + res, err := s.app.InitChain(ctx, r.InitChain) + if err != nil { + return nil, err + } + return types.ToResponseInitChain(res), nil case *types.Request_ListSnapshots: - res := s.app.ListSnapshots(*r.ListSnapshots) - responses <- types.ToResponseListSnapshots(res) + res, err := s.app.ListSnapshots(ctx, r.ListSnapshots) + if err != nil { + return nil, err + } + return types.ToResponseListSnapshots(res), nil case *types.Request_OfferSnapshot: - res := s.app.OfferSnapshot(*r.OfferSnapshot) - responses <- types.ToResponseOfferSnapshot(res) + res, err := s.app.OfferSnapshot(ctx, r.OfferSnapshot) + if err != nil { + return nil, err + } + return types.ToResponseOfferSnapshot(res), nil + case *types.Request_PrepareProposal: + res, err := s.app.PrepareProposal(ctx, r.PrepareProposal) + if err != nil { + return nil, err + } + return types.ToResponsePrepareProposal(res), nil + case *types.Request_ProcessProposal: + res, err := s.app.ProcessProposal(ctx, r.ProcessProposal) + if err != nil { + return nil, err + } + return types.ToResponseProcessProposal(res), nil case *types.Request_LoadSnapshotChunk: - res := s.app.LoadSnapshotChunk(*r.LoadSnapshotChunk) - responses <- types.ToResponseLoadSnapshotChunk(res) + res, err := s.app.LoadSnapshotChunk(ctx, r.LoadSnapshotChunk) + if err != nil { + return nil, err + } + return types.ToResponseLoadSnapshotChunk(res), nil case *types.Request_ApplySnapshotChunk: - res := s.app.ApplySnapshotChunk(*r.ApplySnapshotChunk) - responses <- types.ToResponseApplySnapshotChunk(res) + res, err := s.app.ApplySnapshotChunk(ctx, r.ApplySnapshotChunk) + if err != nil { + return nil, err + } + return types.ToResponseApplySnapshotChunk(res), nil + case *types.Request_ExtendVote: + res, err := s.app.ExtendVote(ctx, r.ExtendVote) + if err != nil { + return nil, err + } + return types.ToResponseExtendVote(res), nil + case *types.Request_VerifyVoteExtension: + res, err := s.app.VerifyVoteExtension(ctx, r.VerifyVoteExtension) + if err != nil { + return nil, err + } + return types.ToResponseVerifyVoteExtension(res), nil + case *types.Request_FinalizeBlock: + res, err := s.app.FinalizeBlock(ctx, r.FinalizeBlock) + if err != nil { + return nil, err + } + return types.ToResponseFinalizeBlock(res), nil default: - responses <- types.ToResponseException("Unknown request") + return types.ToResponseException("Unknown request"), errors.New("unknown request type") } } // Pull responses from 'responses' and write them to conn. -func (s *SocketServer) handleResponses(closeConn chan error, conn io.Writer, responses <-chan *types.Response) { +func (s *SocketServer) handleResponses( + ctx context.Context, + closer func(error), + conn io.Writer, + responses <-chan *types.Response, +) { bw := bufio.NewWriter(conn) - for res := range responses { - if err := types.WriteMessage(res, bw); err != nil { - closeConn <- fmt.Errorf("error writing message: %w", err) - return - } - if err := bw.Flush(); err != nil { - closeConn <- fmt.Errorf("error flushing write buffer: %w", err) + for { + select { + case <-ctx.Done(): + closer(ctx.Err()) return + case res := <-responses: + if err := types.WriteMessage(res, bw); err != nil { + closer(fmt.Errorf("error writing message: %w", err)) + return + } + if err := bw.Flush(); err != nil { + closer(fmt.Errorf("error writing message: %w", err)) + return + } } } } diff --git a/abci/tests/client_server_test.go b/abci/tests/client_server_test.go index 62dc6e07e4..a97c0c7c4c 100644 --- a/abci/tests/client_server_test.go +++ b/abci/tests/client_server_test.go @@ -1,27 +1,40 @@ package tests import ( + "context" "testing" + "github.com/fortytw2/leaktest" "github.com/stretchr/testify/assert" abciclientent "github.com/tendermint/tendermint/abci/client" "github.com/tendermint/tendermint/abci/example/kvstore" abciserver "github.com/tendermint/tendermint/abci/server" + "github.com/tendermint/tendermint/libs/log" ) func TestClientServerNoAddrPrefix(t *testing.T) { - addr := "localhost:26658" - transport := "socket" + t.Cleanup(leaktest.Check(t)) + + ctx, cancel := context.WithCancel(context.Background()) + defer cancel() + + const ( + addr = "localhost:26658" + transport = "socket" + ) app := kvstore.NewApplication() + logger := log.NewTestingLogger(t) - server, err := abciserver.NewServer(addr, transport, app) + server, err := abciserver.NewServer(logger, addr, transport, app) assert.NoError(t, err, "expected no error on NewServer") - err = server.Start() + err = server.Start(ctx) assert.NoError(t, err, "expected no error on server.Start") + t.Cleanup(server.Wait) - client, err := abciclientent.NewClient(addr, transport, true) + client, err := abciclientent.NewClient(logger, addr, transport, true) assert.NoError(t, err, "expected no error on NewClient") - err = client.Start() + err = client.Start(ctx) assert.NoError(t, err, "expected no error on client.Start") + t.Cleanup(client.Wait) } diff --git a/abci/tests/server/client.go b/abci/tests/server/client.go index 55af386861..ed20d3cb07 100644 --- a/abci/tests/server/client.go +++ b/abci/tests/server/client.go @@ -6,15 +6,13 @@ import ( "errors" "fmt" - abcicli "github.com/tendermint/tendermint/abci/client" + abciclient "github.com/tendermint/tendermint/abci/client" "github.com/tendermint/tendermint/abci/types" "github.com/tendermint/tendermint/crypto" "github.com/tendermint/tendermint/dash/llmq" ) -var ctx = context.Background() - -func InitChain(client abcicli.Client) error { +func InitChain(ctx context.Context, client abciclient.Client) error { const total = 10 ld, err := llmq.Generate(crypto.RandProTxHashes(total)) if err != nil { @@ -24,7 +22,7 @@ func InitChain(client abcicli.Client) error { if err != nil { return err } - _, err = client.InitChainSync(context.Background(), types.RequestInitChain{ + _, err = client.InitChain(ctx, &types.RequestInitChain{ ValidatorSet: validatorSet, }) if err != nil { @@ -35,8 +33,8 @@ func InitChain(client abcicli.Client) error { return nil } -func Commit(client abcicli.Client, hashExp []byte) error { - res, err := client.CommitSync(ctx) +func Commit(ctx context.Context, client abciclient.Client, hashExp []byte) error { + res, err := client.Commit(ctx) data := res.Data if err != nil { fmt.Println("Failed test: Commit") @@ -52,27 +50,29 @@ func Commit(client abcicli.Client, hashExp []byte) error { return nil } -func DeliverTx(client abcicli.Client, txBytes []byte, codeExp uint32, dataExp []byte) error { - res, _ := client.DeliverTxSync(ctx, types.RequestDeliverTx{Tx: txBytes}) - code, data, log := res.Code, res.Data, res.Log - if code != codeExp { - fmt.Println("Failed test: DeliverTx") - fmt.Printf("DeliverTx response code was unexpected. Got %v expected %v. Log: %v\n", - code, codeExp, log) - return errors.New("deliverTx error") - } - if !bytes.Equal(data, dataExp) { - fmt.Println("Failed test: DeliverTx") - fmt.Printf("DeliverTx response data was unexpected. Got %X expected %X\n", - data, dataExp) - return errors.New("deliverTx error") +func FinalizeBlock(ctx context.Context, client abciclient.Client, txBytes [][]byte, codeExp []uint32, dataExp []byte) error { + res, _ := client.FinalizeBlock(ctx, &types.RequestFinalizeBlock{Txs: txBytes}) + for i, tx := range res.TxResults { + code, data, log := tx.Code, tx.Data, tx.Log + if code != codeExp[i] { + fmt.Println("Failed test: FinalizeBlock") + fmt.Printf("FinalizeBlock response code was unexpected. Got %v expected %v. Log: %v\n", + code, codeExp, log) + return errors.New("FinalizeBlock error") + } + if !bytes.Equal(data, dataExp) { + fmt.Println("Failed test: FinalizeBlock") + fmt.Printf("FinalizeBlock response data was unexpected. Got %X expected %X\n", + data, dataExp) + return errors.New("FinalizeBlock error") + } } - fmt.Println("Passed test: DeliverTx") + fmt.Println("Passed test: FinalizeBlock") return nil } -func CheckTx(client abcicli.Client, txBytes []byte, codeExp uint32, dataExp []byte) error { - res, _ := client.CheckTxSync(ctx, types.RequestCheckTx{Tx: txBytes}) +func CheckTx(ctx context.Context, client abciclient.Client, txBytes []byte, codeExp uint32, dataExp []byte) error { + res, _ := client.CheckTx(ctx, &types.RequestCheckTx{Tx: txBytes}) code, data, log := res.Code, res.Data, res.Log if code != codeExp { fmt.Println("Failed test: CheckTx") diff --git a/abci/tests/test_cli/ex1.abci b/abci/tests/test_cli/ex1.abci index e909266ecf..09457189ed 100644 --- a/abci/tests/test_cli/ex1.abci +++ b/abci/tests/test_cli/ex1.abci @@ -1,10 +1,10 @@ echo hello info commit -deliver_tx "abc" +finalize_block "abc" info commit query "abc" -deliver_tx "def=xyz" +finalize_block "def=xyz" "ghi=123" commit query "def" diff --git a/abci/tests/test_cli/ex1.abci.out b/abci/tests/test_cli/ex1.abci.out index 735e4bea2e..01d0150f0f 100644 --- a/abci/tests/test_cli/ex1.abci.out +++ b/abci/tests/test_cli/ex1.abci.out @@ -3,24 +3,24 @@ -> data: hello -> data.hex: 0x68656C6C6F -> info +> info -> code: OK -> data: {"size":0} -> data.hex: 0x7B2273697A65223A307D -> commit +> commit -> code: OK -> data.hex: 0x0000000000000000000000000000000000000000000000000000000000000000 -> deliver_tx "abc" +> finalize_block "abc" -> code: OK -> info +> info -> code: OK -> data: {"size":1} -> data.hex: 0x7B2273697A65223A317D -> commit +> commit -> code: OK -> data.hex: 0x0200000000000000000000000000000000000000000000000000000000000000 @@ -33,12 +33,14 @@ -> value: abc -> value.hex: 616263 -> deliver_tx "def=xyz" +> finalize_block "def=xyz" "ghi=123" +-> code: OK +> finalize_block "def=xyz" "ghi=123" -> code: OK -> commit +> commit -> code: OK --> data.hex: 0x0400000000000000000000000000000000000000000000000000000000000000 +-> data.hex: 0x0600000000000000000000000000000000000000000000000000000000000000 > query "def" -> code: OK diff --git a/abci/tests/test_cli/ex2.abci b/abci/tests/test_cli/ex2.abci index 965ca842c7..90e99c2f90 100644 --- a/abci/tests/test_cli/ex2.abci +++ b/abci/tests/test_cli/ex2.abci @@ -1,7 +1,7 @@ check_tx 0x00 check_tx 0xff -deliver_tx 0x00 +finalize_block 0x00 check_tx 0x00 -deliver_tx 0x01 -deliver_tx 0x04 +finalize_block 0x01 +finalize_block 0x04 info diff --git a/abci/tests/test_cli/ex2.abci.out b/abci/tests/test_cli/ex2.abci.out index 7ef8abbc45..aab0b1966f 100644 --- a/abci/tests/test_cli/ex2.abci.out +++ b/abci/tests/test_cli/ex2.abci.out @@ -4,20 +4,20 @@ > check_tx 0xff -> code: OK -> deliver_tx 0x00 +> finalize_block 0x00 -> code: OK > check_tx 0x00 -> code: OK -> deliver_tx 0x01 +> finalize_block 0x01 -> code: OK -> deliver_tx 0x04 +> finalize_block 0x04 -> code: OK > info -> code: OK --> data: {"hashes":0,"txs":3} --> data.hex: 0x7B22686173686573223A302C22747873223A337D +-> data: {"size":3} +-> data.hex: 0x7B2273697A65223A337D diff --git a/abci/types/application.go b/abci/types/application.go index 2a3cabd8bb..e74b877438 100644 --- a/abci/types/application.go +++ b/abci/types/application.go @@ -1,33 +1,36 @@ package types -import ( - "context" -) +import "context" +//go:generate ../../scripts/mockery_generate.sh Application // Application is an interface that enables any finite, deterministic state machine // to be driven by a blockchain-based replication engine via the ABCI. -// All methods take a RequestXxx argument and return a ResponseXxx argument, -// except CheckTx/DeliverTx, which take `tx []byte`, and `Commit`, which takes nothing. type Application interface { // Info/Query Connection - Info(RequestInfo) ResponseInfo // Return application info - Query(RequestQuery) ResponseQuery // Query for state + Info(context.Context, *RequestInfo) (*ResponseInfo, error) // Return application info + Query(context.Context, *RequestQuery) (*ResponseQuery, error) // Query for state // Mempool Connection - CheckTx(RequestCheckTx) ResponseCheckTx // Validate a tx for the mempool + CheckTx(context.Context, *RequestCheckTx) (*ResponseCheckTx, error) // Validate a tx for the mempool // Consensus Connection - InitChain(RequestInitChain) ResponseInitChain // Initialize blockchain w validators/other info from TendermintCore - BeginBlock(RequestBeginBlock) ResponseBeginBlock // Signals the beginning of a block - DeliverTx(RequestDeliverTx) ResponseDeliverTx // Deliver a tx for full processing - EndBlock(RequestEndBlock) ResponseEndBlock // Signals the end of a block, returns changes to the validator set - Commit() ResponseCommit // Commit the state and return the application Merkle root hash + InitChain(context.Context, *RequestInitChain) (*ResponseInitChain, error) // Initialize blockchain w validators/other info from TendermintCore + PrepareProposal(context.Context, *RequestPrepareProposal) (*ResponsePrepareProposal, error) + ProcessProposal(context.Context, *RequestProcessProposal) (*ResponseProcessProposal, error) + // Commit the state and return the application Merkle root hash + Commit(context.Context) (*ResponseCommit, error) + // Create application specific vote extension + ExtendVote(context.Context, *RequestExtendVote) (*ResponseExtendVote, error) + // Verify application's vote extension data + VerifyVoteExtension(context.Context, *RequestVerifyVoteExtension) (*ResponseVerifyVoteExtension, error) + // Deliver the decided block with its txs to the Application + FinalizeBlock(context.Context, *RequestFinalizeBlock) (*ResponseFinalizeBlock, error) // State Sync Connection - ListSnapshots(RequestListSnapshots) ResponseListSnapshots // List available snapshots - OfferSnapshot(RequestOfferSnapshot) ResponseOfferSnapshot // Offer a snapshot to the application - LoadSnapshotChunk(RequestLoadSnapshotChunk) ResponseLoadSnapshotChunk // Load a snapshot chunk - ApplySnapshotChunk(RequestApplySnapshotChunk) ResponseApplySnapshotChunk // Apply a shapshot chunk + ListSnapshots(context.Context, *RequestListSnapshots) (*ResponseListSnapshots, error) // List available snapshots + OfferSnapshot(context.Context, *RequestOfferSnapshot) (*ResponseOfferSnapshot, error) // Offer a snapshot to the application + LoadSnapshotChunk(context.Context, *RequestLoadSnapshotChunk) (*ResponseLoadSnapshotChunk, error) // Load a snapshot chunk + ApplySnapshotChunk(context.Context, *RequestApplySnapshotChunk) (*ResponseApplySnapshotChunk, error) // Apply a shapshot chunk } //------------------------------------------------------- @@ -35,140 +38,84 @@ type Application interface { var _ Application = (*BaseApplication)(nil) -type BaseApplication struct { -} +type BaseApplication struct{} func NewBaseApplication() *BaseApplication { return &BaseApplication{} } -func (BaseApplication) Info(req RequestInfo) ResponseInfo { - return ResponseInfo{} -} - -func (BaseApplication) DeliverTx(req RequestDeliverTx) ResponseDeliverTx { - return ResponseDeliverTx{Code: CodeTypeOK} -} - -func (BaseApplication) CheckTx(req RequestCheckTx) ResponseCheckTx { - return ResponseCheckTx{Code: CodeTypeOK} -} - -func (BaseApplication) Commit() ResponseCommit { - return ResponseCommit{} -} - -func (BaseApplication) Query(req RequestQuery) ResponseQuery { - return ResponseQuery{Code: CodeTypeOK} -} - -func (BaseApplication) InitChain(req RequestInitChain) ResponseInitChain { - return ResponseInitChain{} -} - -func (BaseApplication) BeginBlock(req RequestBeginBlock) ResponseBeginBlock { - return ResponseBeginBlock{} -} - -func (BaseApplication) EndBlock(req RequestEndBlock) ResponseEndBlock { - return ResponseEndBlock{} -} - -func (BaseApplication) ListSnapshots(req RequestListSnapshots) ResponseListSnapshots { - return ResponseListSnapshots{} -} - -func (BaseApplication) OfferSnapshot(req RequestOfferSnapshot) ResponseOfferSnapshot { - return ResponseOfferSnapshot{} -} - -func (BaseApplication) LoadSnapshotChunk(req RequestLoadSnapshotChunk) ResponseLoadSnapshotChunk { - return ResponseLoadSnapshotChunk{} -} - -func (BaseApplication) ApplySnapshotChunk(req RequestApplySnapshotChunk) ResponseApplySnapshotChunk { - return ResponseApplySnapshotChunk{} -} - -//------------------------------------------------------- - -// GRPCApplication is a GRPC wrapper for Application -type GRPCApplication struct { - app Application -} - -func NewGRPCApplication(app Application) *GRPCApplication { - return &GRPCApplication{app} -} - -func (app *GRPCApplication) Echo(ctx context.Context, req *RequestEcho) (*ResponseEcho, error) { - return &ResponseEcho{Message: req.Message}, nil +func (BaseApplication) Info(_ context.Context, req *RequestInfo) (*ResponseInfo, error) { + return &ResponseInfo{}, nil } -func (app *GRPCApplication) Flush(ctx context.Context, req *RequestFlush) (*ResponseFlush, error) { - return &ResponseFlush{}, nil +func (BaseApplication) CheckTx(_ context.Context, req *RequestCheckTx) (*ResponseCheckTx, error) { + return &ResponseCheckTx{Code: CodeTypeOK}, nil } -func (app *GRPCApplication) Info(ctx context.Context, req *RequestInfo) (*ResponseInfo, error) { - res := app.app.Info(*req) - return &res, nil +func (BaseApplication) Commit(_ context.Context) (*ResponseCommit, error) { + return &ResponseCommit{}, nil } -func (app *GRPCApplication) DeliverTx(ctx context.Context, req *RequestDeliverTx) (*ResponseDeliverTx, error) { - res := app.app.DeliverTx(*req) - return &res, nil +func (BaseApplication) ExtendVote(_ context.Context, req *RequestExtendVote) (*ResponseExtendVote, error) { + return &ResponseExtendVote{}, nil } -func (app *GRPCApplication) CheckTx(ctx context.Context, req *RequestCheckTx) (*ResponseCheckTx, error) { - res := app.app.CheckTx(*req) - return &res, nil +func (BaseApplication) VerifyVoteExtension(_ context.Context, req *RequestVerifyVoteExtension) (*ResponseVerifyVoteExtension, error) { + return &ResponseVerifyVoteExtension{ + Status: ResponseVerifyVoteExtension_ACCEPT, + }, nil } -func (app *GRPCApplication) Query(ctx context.Context, req *RequestQuery) (*ResponseQuery, error) { - res := app.app.Query(*req) - return &res, nil +func (BaseApplication) Query(_ context.Context, req *RequestQuery) (*ResponseQuery, error) { + return &ResponseQuery{Code: CodeTypeOK}, nil } -func (app *GRPCApplication) Commit(ctx context.Context, req *RequestCommit) (*ResponseCommit, error) { - res := app.app.Commit() - return &res, nil +func (BaseApplication) InitChain(_ context.Context, req *RequestInitChain) (*ResponseInitChain, error) { + return &ResponseInitChain{}, nil } -func (app *GRPCApplication) InitChain(ctx context.Context, req *RequestInitChain) (*ResponseInitChain, error) { - res := app.app.InitChain(*req) - return &res, nil +func (BaseApplication) ListSnapshots(_ context.Context, req *RequestListSnapshots) (*ResponseListSnapshots, error) { + return &ResponseListSnapshots{}, nil } -func (app *GRPCApplication) BeginBlock(ctx context.Context, req *RequestBeginBlock) (*ResponseBeginBlock, error) { - res := app.app.BeginBlock(*req) - return &res, nil +func (BaseApplication) OfferSnapshot(_ context.Context, req *RequestOfferSnapshot) (*ResponseOfferSnapshot, error) { + return &ResponseOfferSnapshot{}, nil } -func (app *GRPCApplication) EndBlock(ctx context.Context, req *RequestEndBlock) (*ResponseEndBlock, error) { - res := app.app.EndBlock(*req) - return &res, nil +func (BaseApplication) LoadSnapshotChunk(_ context.Context, _ *RequestLoadSnapshotChunk) (*ResponseLoadSnapshotChunk, error) { + return &ResponseLoadSnapshotChunk{}, nil } -func (app *GRPCApplication) ListSnapshots( - ctx context.Context, req *RequestListSnapshots) (*ResponseListSnapshots, error) { - res := app.app.ListSnapshots(*req) - return &res, nil +func (BaseApplication) ApplySnapshotChunk(_ context.Context, req *RequestApplySnapshotChunk) (*ResponseApplySnapshotChunk, error) { + return &ResponseApplySnapshotChunk{}, nil } -func (app *GRPCApplication) OfferSnapshot( - ctx context.Context, req *RequestOfferSnapshot) (*ResponseOfferSnapshot, error) { - res := app.app.OfferSnapshot(*req) - return &res, nil +func (BaseApplication) PrepareProposal(_ context.Context, req *RequestPrepareProposal) (*ResponsePrepareProposal, error) { + trs := make([]*TxRecord, 0, len(req.Txs)) + var totalBytes int64 + for _, tx := range req.Txs { + totalBytes += int64(len(tx)) + if totalBytes > req.MaxTxBytes { + break + } + trs = append(trs, &TxRecord{ + Action: TxRecord_UNMODIFIED, + Tx: tx, + }) + } + return &ResponsePrepareProposal{TxRecords: trs}, nil } -func (app *GRPCApplication) LoadSnapshotChunk( - ctx context.Context, req *RequestLoadSnapshotChunk) (*ResponseLoadSnapshotChunk, error) { - res := app.app.LoadSnapshotChunk(*req) - return &res, nil +func (BaseApplication) ProcessProposal(_ context.Context, req *RequestProcessProposal) (*ResponseProcessProposal, error) { + return &ResponseProcessProposal{Status: ResponseProcessProposal_ACCEPT}, nil } -func (app *GRPCApplication) ApplySnapshotChunk( - ctx context.Context, req *RequestApplySnapshotChunk) (*ResponseApplySnapshotChunk, error) { - res := app.app.ApplySnapshotChunk(*req) - return &res, nil +func (BaseApplication) FinalizeBlock(_ context.Context, req *RequestFinalizeBlock) (*ResponseFinalizeBlock, error) { + txs := make([]*ExecTxResult, len(req.Txs)) + for i := range req.Txs { + txs[i] = &ExecTxResult{Code: CodeTypeOK} + } + return &ResponseFinalizeBlock{ + TxResults: txs, + }, nil } diff --git a/abci/types/client.go b/abci/types/client.go deleted file mode 100644 index ab1254f4c2..0000000000 --- a/abci/types/client.go +++ /dev/null @@ -1 +0,0 @@ -package types diff --git a/abci/types/messages.go b/abci/types/messages.go index 74f3cc75c8..80ab195259 100644 --- a/abci/types/messages.go +++ b/abci/types/messages.go @@ -4,6 +4,7 @@ import ( "io" "github.com/gogo/protobuf/proto" + "github.com/tendermint/tendermint/internal/libs/protoio" ) @@ -38,75 +39,87 @@ func ToRequestFlush() *Request { } } -func ToRequestInfo(req RequestInfo) *Request { +func ToRequestInfo(req *RequestInfo) *Request { return &Request{ - Value: &Request_Info{&req}, + Value: &Request_Info{req}, } } -func ToRequestDeliverTx(req RequestDeliverTx) *Request { +func ToRequestCheckTx(req *RequestCheckTx) *Request { return &Request{ - Value: &Request_DeliverTx{&req}, + Value: &Request_CheckTx{req}, } } -func ToRequestCheckTx(req RequestCheckTx) *Request { +func ToRequestCommit() *Request { return &Request{ - Value: &Request_CheckTx{&req}, + Value: &Request_Commit{&RequestCommit{}}, } } -func ToRequestCommit() *Request { +func ToRequestQuery(req *RequestQuery) *Request { return &Request{ - Value: &Request_Commit{&RequestCommit{}}, + Value: &Request_Query{req}, + } +} + +func ToRequestInitChain(req *RequestInitChain) *Request { + return &Request{ + Value: &Request_InitChain{req}, + } +} + +func ToRequestListSnapshots(req *RequestListSnapshots) *Request { + return &Request{ + Value: &Request_ListSnapshots{req}, } } -func ToRequestQuery(req RequestQuery) *Request { +func ToRequestOfferSnapshot(req *RequestOfferSnapshot) *Request { return &Request{ - Value: &Request_Query{&req}, + Value: &Request_OfferSnapshot{req}, } } -func ToRequestInitChain(req RequestInitChain) *Request { +func ToRequestLoadSnapshotChunk(req *RequestLoadSnapshotChunk) *Request { return &Request{ - Value: &Request_InitChain{&req}, + Value: &Request_LoadSnapshotChunk{req}, } } -func ToRequestBeginBlock(req RequestBeginBlock) *Request { +func ToRequestApplySnapshotChunk(req *RequestApplySnapshotChunk) *Request { return &Request{ - Value: &Request_BeginBlock{&req}, + Value: &Request_ApplySnapshotChunk{req}, } } -func ToRequestEndBlock(req RequestEndBlock) *Request { +func ToRequestExtendVote(req *RequestExtendVote) *Request { return &Request{ - Value: &Request_EndBlock{&req}, + Value: &Request_ExtendVote{req}, } } -func ToRequestListSnapshots(req RequestListSnapshots) *Request { +func ToRequestVerifyVoteExtension(req *RequestVerifyVoteExtension) *Request { return &Request{ - Value: &Request_ListSnapshots{&req}, + Value: &Request_VerifyVoteExtension{req}, } } -func ToRequestOfferSnapshot(req RequestOfferSnapshot) *Request { +func ToRequestPrepareProposal(req *RequestPrepareProposal) *Request { return &Request{ - Value: &Request_OfferSnapshot{&req}, + Value: &Request_PrepareProposal{req}, } } -func ToRequestLoadSnapshotChunk(req RequestLoadSnapshotChunk) *Request { +func ToRequestProcessProposal(req *RequestProcessProposal) *Request { return &Request{ - Value: &Request_LoadSnapshotChunk{&req}, + Value: &Request_ProcessProposal{req}, } } -func ToRequestApplySnapshotChunk(req RequestApplySnapshotChunk) *Request { +func ToRequestFinalizeBlock(req *RequestFinalizeBlock) *Request { return &Request{ - Value: &Request_ApplySnapshotChunk{&req}, + Value: &Request_FinalizeBlock{req}, } } @@ -130,73 +143,86 @@ func ToResponseFlush() *Response { } } -func ToResponseInfo(res ResponseInfo) *Response { +func ToResponseInfo(res *ResponseInfo) *Response { + return &Response{ + Value: &Response_Info{res}, + } +} + +func ToResponseCheckTx(res *ResponseCheckTx) *Response { return &Response{ - Value: &Response_Info{&res}, + Value: &Response_CheckTx{res}, } } -func ToResponseDeliverTx(res ResponseDeliverTx) *Response { + +func ToResponseCommit(res *ResponseCommit) *Response { + return &Response{ + Value: &Response_Commit{res}, + } +} + +func ToResponseQuery(res *ResponseQuery) *Response { return &Response{ - Value: &Response_DeliverTx{&res}, + Value: &Response_Query{res}, } } -func ToResponseCheckTx(res ResponseCheckTx) *Response { +func ToResponseInitChain(res *ResponseInitChain) *Response { return &Response{ - Value: &Response_CheckTx{&res}, + Value: &Response_InitChain{res}, } } -func ToResponseCommit(res ResponseCommit) *Response { +func ToResponseListSnapshots(res *ResponseListSnapshots) *Response { return &Response{ - Value: &Response_Commit{&res}, + Value: &Response_ListSnapshots{res}, } } -func ToResponseQuery(res ResponseQuery) *Response { +func ToResponseOfferSnapshot(res *ResponseOfferSnapshot) *Response { return &Response{ - Value: &Response_Query{&res}, + Value: &Response_OfferSnapshot{res}, } } -func ToResponseInitChain(res ResponseInitChain) *Response { +func ToResponseLoadSnapshotChunk(res *ResponseLoadSnapshotChunk) *Response { return &Response{ - Value: &Response_InitChain{&res}, + Value: &Response_LoadSnapshotChunk{res}, } } -func ToResponseBeginBlock(res ResponseBeginBlock) *Response { +func ToResponseApplySnapshotChunk(res *ResponseApplySnapshotChunk) *Response { return &Response{ - Value: &Response_BeginBlock{&res}, + Value: &Response_ApplySnapshotChunk{res}, } } -func ToResponseEndBlock(res ResponseEndBlock) *Response { +func ToResponseExtendVote(res *ResponseExtendVote) *Response { return &Response{ - Value: &Response_EndBlock{&res}, + Value: &Response_ExtendVote{res}, } } -func ToResponseListSnapshots(res ResponseListSnapshots) *Response { +func ToResponseVerifyVoteExtension(res *ResponseVerifyVoteExtension) *Response { return &Response{ - Value: &Response_ListSnapshots{&res}, + Value: &Response_VerifyVoteExtension{res}, } } -func ToResponseOfferSnapshot(res ResponseOfferSnapshot) *Response { +func ToResponsePrepareProposal(res *ResponsePrepareProposal) *Response { return &Response{ - Value: &Response_OfferSnapshot{&res}, + Value: &Response_PrepareProposal{res}, } } -func ToResponseLoadSnapshotChunk(res ResponseLoadSnapshotChunk) *Response { +func ToResponseProcessProposal(res *ResponseProcessProposal) *Response { return &Response{ - Value: &Response_LoadSnapshotChunk{&res}, + Value: &Response_ProcessProposal{res}, } } -func ToResponseApplySnapshotChunk(res ResponseApplySnapshotChunk) *Response { +func ToResponseFinalizeBlock(res *ResponseFinalizeBlock) *Response { return &Response{ - Value: &Response_ApplySnapshotChunk{&res}, + Value: &Response_FinalizeBlock{res}, } } diff --git a/abci/types/messages_test.go b/abci/types/messages_test.go index 491d10c7f8..4f17f9f83c 100644 --- a/abci/types/messages_test.go +++ b/abci/types/messages_test.go @@ -13,8 +13,8 @@ import ( ) func TestMarshalJSON(t *testing.T) { - b, err := json.Marshal(&ResponseDeliverTx{}) - assert.Nil(t, err) + b, err := json.Marshal(&ExecTxResult{Code: 1}) + assert.NoError(t, err) // include empty fields. assert.True(t, strings.Contains(string(b), "code")) r1 := ResponseCheckTx{ @@ -31,11 +31,11 @@ func TestMarshalJSON(t *testing.T) { }, } b, err = json.Marshal(&r1) - assert.Nil(t, err) + assert.NoError(t, err) var r2 ResponseCheckTx err = json.Unmarshal(b, &r2) - assert.Nil(t, err) + assert.NoError(t, err) assert.Equal(t, r1, r2) } @@ -49,11 +49,11 @@ func TestWriteReadMessageSimple(t *testing.T) { for _, c := range cases { buf := new(bytes.Buffer) err := WriteMessage(c, buf) - assert.Nil(t, err) + assert.NoError(t, err) msg := new(RequestEcho) err = ReadMessage(buf, msg) - assert.Nil(t, err) + assert.NoError(t, err) assert.True(t, proto.Equal(c, msg)) } @@ -71,11 +71,11 @@ func TestWriteReadMessage(t *testing.T) { for _, c := range cases { buf := new(bytes.Buffer) err := WriteMessage(c, buf) - assert.Nil(t, err) + assert.NoError(t, err) msg := new(tmproto.Header) err = ReadMessage(buf, msg) - assert.Nil(t, err) + assert.NoError(t, err) assert.True(t, proto.Equal(c, msg)) } @@ -103,11 +103,11 @@ func TestWriteReadMessage2(t *testing.T) { for _, c := range cases { buf := new(bytes.Buffer) err := WriteMessage(c, buf) - assert.Nil(t, err) + assert.NoError(t, err) msg := new(ResponseCheckTx) err = ReadMessage(buf, msg) - assert.Nil(t, err) + assert.NoError(t, err) assert.True(t, proto.Equal(c, msg)) } diff --git a/abci/types/mocks/application.go b/abci/types/mocks/application.go new file mode 100644 index 0000000000..2d35c481f0 --- /dev/null +++ b/abci/types/mocks/application.go @@ -0,0 +1,349 @@ +// Code generated by mockery. DO NOT EDIT. + +package mocks + +import ( + context "context" + testing "testing" + + mock "github.com/stretchr/testify/mock" + + types "github.com/tendermint/tendermint/abci/types" +) + +// Application is an autogenerated mock type for the Application type +type Application struct { + mock.Mock +} + +// ApplySnapshotChunk provides a mock function with given fields: _a0, _a1 +func (_m *Application) ApplySnapshotChunk(_a0 context.Context, _a1 *types.RequestApplySnapshotChunk) (*types.ResponseApplySnapshotChunk, error) { + ret := _m.Called(_a0, _a1) + + var r0 *types.ResponseApplySnapshotChunk + if rf, ok := ret.Get(0).(func(context.Context, *types.RequestApplySnapshotChunk) *types.ResponseApplySnapshotChunk); ok { + r0 = rf(_a0, _a1) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*types.ResponseApplySnapshotChunk) + } + } + + var r1 error + if rf, ok := ret.Get(1).(func(context.Context, *types.RequestApplySnapshotChunk) error); ok { + r1 = rf(_a0, _a1) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// CheckTx provides a mock function with given fields: _a0, _a1 +func (_m *Application) CheckTx(_a0 context.Context, _a1 *types.RequestCheckTx) (*types.ResponseCheckTx, error) { + ret := _m.Called(_a0, _a1) + + var r0 *types.ResponseCheckTx + if rf, ok := ret.Get(0).(func(context.Context, *types.RequestCheckTx) *types.ResponseCheckTx); ok { + r0 = rf(_a0, _a1) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*types.ResponseCheckTx) + } + } + + var r1 error + if rf, ok := ret.Get(1).(func(context.Context, *types.RequestCheckTx) error); ok { + r1 = rf(_a0, _a1) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// Commit provides a mock function with given fields: _a0 +func (_m *Application) Commit(_a0 context.Context) (*types.ResponseCommit, error) { + ret := _m.Called(_a0) + + var r0 *types.ResponseCommit + if rf, ok := ret.Get(0).(func(context.Context) *types.ResponseCommit); ok { + r0 = rf(_a0) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*types.ResponseCommit) + } + } + + var r1 error + if rf, ok := ret.Get(1).(func(context.Context) error); ok { + r1 = rf(_a0) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// ExtendVote provides a mock function with given fields: _a0, _a1 +func (_m *Application) ExtendVote(_a0 context.Context, _a1 *types.RequestExtendVote) (*types.ResponseExtendVote, error) { + ret := _m.Called(_a0, _a1) + + var r0 *types.ResponseExtendVote + if rf, ok := ret.Get(0).(func(context.Context, *types.RequestExtendVote) *types.ResponseExtendVote); ok { + r0 = rf(_a0, _a1) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*types.ResponseExtendVote) + } + } + + var r1 error + if rf, ok := ret.Get(1).(func(context.Context, *types.RequestExtendVote) error); ok { + r1 = rf(_a0, _a1) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// FinalizeBlock provides a mock function with given fields: _a0, _a1 +func (_m *Application) FinalizeBlock(_a0 context.Context, _a1 *types.RequestFinalizeBlock) (*types.ResponseFinalizeBlock, error) { + ret := _m.Called(_a0, _a1) + + var r0 *types.ResponseFinalizeBlock + if rf, ok := ret.Get(0).(func(context.Context, *types.RequestFinalizeBlock) *types.ResponseFinalizeBlock); ok { + r0 = rf(_a0, _a1) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*types.ResponseFinalizeBlock) + } + } + + var r1 error + if rf, ok := ret.Get(1).(func(context.Context, *types.RequestFinalizeBlock) error); ok { + r1 = rf(_a0, _a1) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// Info provides a mock function with given fields: _a0, _a1 +func (_m *Application) Info(_a0 context.Context, _a1 *types.RequestInfo) (*types.ResponseInfo, error) { + ret := _m.Called(_a0, _a1) + + var r0 *types.ResponseInfo + if rf, ok := ret.Get(0).(func(context.Context, *types.RequestInfo) *types.ResponseInfo); ok { + r0 = rf(_a0, _a1) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*types.ResponseInfo) + } + } + + var r1 error + if rf, ok := ret.Get(1).(func(context.Context, *types.RequestInfo) error); ok { + r1 = rf(_a0, _a1) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// InitChain provides a mock function with given fields: _a0, _a1 +func (_m *Application) InitChain(_a0 context.Context, _a1 *types.RequestInitChain) (*types.ResponseInitChain, error) { + ret := _m.Called(_a0, _a1) + + var r0 *types.ResponseInitChain + if rf, ok := ret.Get(0).(func(context.Context, *types.RequestInitChain) *types.ResponseInitChain); ok { + r0 = rf(_a0, _a1) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*types.ResponseInitChain) + } + } + + var r1 error + if rf, ok := ret.Get(1).(func(context.Context, *types.RequestInitChain) error); ok { + r1 = rf(_a0, _a1) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// ListSnapshots provides a mock function with given fields: _a0, _a1 +func (_m *Application) ListSnapshots(_a0 context.Context, _a1 *types.RequestListSnapshots) (*types.ResponseListSnapshots, error) { + ret := _m.Called(_a0, _a1) + + var r0 *types.ResponseListSnapshots + if rf, ok := ret.Get(0).(func(context.Context, *types.RequestListSnapshots) *types.ResponseListSnapshots); ok { + r0 = rf(_a0, _a1) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*types.ResponseListSnapshots) + } + } + + var r1 error + if rf, ok := ret.Get(1).(func(context.Context, *types.RequestListSnapshots) error); ok { + r1 = rf(_a0, _a1) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// LoadSnapshotChunk provides a mock function with given fields: _a0, _a1 +func (_m *Application) LoadSnapshotChunk(_a0 context.Context, _a1 *types.RequestLoadSnapshotChunk) (*types.ResponseLoadSnapshotChunk, error) { + ret := _m.Called(_a0, _a1) + + var r0 *types.ResponseLoadSnapshotChunk + if rf, ok := ret.Get(0).(func(context.Context, *types.RequestLoadSnapshotChunk) *types.ResponseLoadSnapshotChunk); ok { + r0 = rf(_a0, _a1) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*types.ResponseLoadSnapshotChunk) + } + } + + var r1 error + if rf, ok := ret.Get(1).(func(context.Context, *types.RequestLoadSnapshotChunk) error); ok { + r1 = rf(_a0, _a1) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// OfferSnapshot provides a mock function with given fields: _a0, _a1 +func (_m *Application) OfferSnapshot(_a0 context.Context, _a1 *types.RequestOfferSnapshot) (*types.ResponseOfferSnapshot, error) { + ret := _m.Called(_a0, _a1) + + var r0 *types.ResponseOfferSnapshot + if rf, ok := ret.Get(0).(func(context.Context, *types.RequestOfferSnapshot) *types.ResponseOfferSnapshot); ok { + r0 = rf(_a0, _a1) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*types.ResponseOfferSnapshot) + } + } + + var r1 error + if rf, ok := ret.Get(1).(func(context.Context, *types.RequestOfferSnapshot) error); ok { + r1 = rf(_a0, _a1) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// PrepareProposal provides a mock function with given fields: _a0, _a1 +func (_m *Application) PrepareProposal(_a0 context.Context, _a1 *types.RequestPrepareProposal) (*types.ResponsePrepareProposal, error) { + ret := _m.Called(_a0, _a1) + + var r0 *types.ResponsePrepareProposal + if rf, ok := ret.Get(0).(func(context.Context, *types.RequestPrepareProposal) *types.ResponsePrepareProposal); ok { + r0 = rf(_a0, _a1) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*types.ResponsePrepareProposal) + } + } + + var r1 error + if rf, ok := ret.Get(1).(func(context.Context, *types.RequestPrepareProposal) error); ok { + r1 = rf(_a0, _a1) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// ProcessProposal provides a mock function with given fields: _a0, _a1 +func (_m *Application) ProcessProposal(_a0 context.Context, _a1 *types.RequestProcessProposal) (*types.ResponseProcessProposal, error) { + ret := _m.Called(_a0, _a1) + + var r0 *types.ResponseProcessProposal + if rf, ok := ret.Get(0).(func(context.Context, *types.RequestProcessProposal) *types.ResponseProcessProposal); ok { + r0 = rf(_a0, _a1) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*types.ResponseProcessProposal) + } + } + + var r1 error + if rf, ok := ret.Get(1).(func(context.Context, *types.RequestProcessProposal) error); ok { + r1 = rf(_a0, _a1) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// Query provides a mock function with given fields: _a0, _a1 +func (_m *Application) Query(_a0 context.Context, _a1 *types.RequestQuery) (*types.ResponseQuery, error) { + ret := _m.Called(_a0, _a1) + + var r0 *types.ResponseQuery + if rf, ok := ret.Get(0).(func(context.Context, *types.RequestQuery) *types.ResponseQuery); ok { + r0 = rf(_a0, _a1) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*types.ResponseQuery) + } + } + + var r1 error + if rf, ok := ret.Get(1).(func(context.Context, *types.RequestQuery) error); ok { + r1 = rf(_a0, _a1) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// VerifyVoteExtension provides a mock function with given fields: _a0, _a1 +func (_m *Application) VerifyVoteExtension(_a0 context.Context, _a1 *types.RequestVerifyVoteExtension) (*types.ResponseVerifyVoteExtension, error) { + ret := _m.Called(_a0, _a1) + + var r0 *types.ResponseVerifyVoteExtension + if rf, ok := ret.Get(0).(func(context.Context, *types.RequestVerifyVoteExtension) *types.ResponseVerifyVoteExtension); ok { + r0 = rf(_a0, _a1) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*types.ResponseVerifyVoteExtension) + } + } + + var r1 error + if rf, ok := ret.Get(1).(func(context.Context, *types.RequestVerifyVoteExtension) error); ok { + r1 = rf(_a0, _a1) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// NewApplication creates a new instance of Application. It also registers the testing.TB interface on the mock and a cleanup function to assert the mocks expectations. +func NewApplication(t testing.TB) *Application { + mock := &Application{} + mock.Mock.Test(t) + + t.Cleanup(func() { mock.AssertExpectations(t) }) + + return mock +} diff --git a/abci/types/result.go b/abci/types/types.go similarity index 59% rename from abci/types/result.go rename to abci/types/types.go index dba6bfd159..d13947d1a9 100644 --- a/abci/types/result.go +++ b/abci/types/types.go @@ -31,6 +31,16 @@ func (r ResponseDeliverTx) IsErr() bool { return r.Code != CodeTypeOK } +// IsOK returns true if Code is OK. +func (r ExecTxResult) IsOK() bool { + return r.Code == CodeTypeOK +} + +// IsErr returns true if Code is something other than OK. +func (r ExecTxResult) IsErr() bool { + return r.Code != CodeTypeOK +} + // IsOK returns true if Code is OK. func (r ResponseQuery) IsOK() bool { return r.Code == CodeTypeOK @@ -41,6 +51,29 @@ func (r ResponseQuery) IsErr() bool { return r.Code != CodeTypeOK } +func (r ResponseProcessProposal) IsAccepted() bool { + return r.Status == ResponseProcessProposal_ACCEPT +} + +func (r ResponseProcessProposal) IsStatusUnknown() bool { + return r.Status == ResponseProcessProposal_UNKNOWN +} + +// IsStatusUnknown returns true if Code is Unknown +func (r ResponseVerifyVoteExtension) IsStatusUnknown() bool { + return r.Status == ResponseVerifyVoteExtension_UNKNOWN +} + +// IsOK returns true if Code is OK +func (r ResponseVerifyVoteExtension) IsOK() bool { + return r.Status == ResponseVerifyVoteExtension_ACCEPT +} + +// IsErr returns true if Code is something other than OK. +func (r ResponseVerifyVoteExtension) IsErr() bool { + return r.Status != ResponseVerifyVoteExtension_ACCEPT +} + //--------------------------------------------------------------------------- // override JSON marshaling so we emit defaults (ie. disable omitempty) @@ -118,3 +151,44 @@ var _ jsonRoundTripper = (*ResponseDeliverTx)(nil) var _ jsonRoundTripper = (*ResponseCheckTx)(nil) var _ jsonRoundTripper = (*EventAttribute)(nil) + +// ----------------------------------------------- +// construct Result data + +func RespondVerifyVoteExtension(ok bool) ResponseVerifyVoteExtension { + status := ResponseVerifyVoteExtension_REJECT + if ok { + status = ResponseVerifyVoteExtension_ACCEPT + } + return ResponseVerifyVoteExtension{ + Status: status, + } +} + +// deterministicExecTxResult constructs a copy of response that omits +// non-deterministic fields. The input response is not modified. +func deterministicExecTxResult(response *ExecTxResult) *ExecTxResult { + return &ExecTxResult{ + Code: response.Code, + Data: response.Data, + GasWanted: response.GasWanted, + GasUsed: response.GasUsed, + } +} + +// MarshalTxResults encodes the the TxResults as a list of byte +// slices. It strips off the non-deterministic pieces of the TxResults +// so that the resulting data can be used for hash comparisons and used +// in Merkle proofs. +func MarshalTxResults(r []*ExecTxResult) ([][]byte, error) { + s := make([][]byte, len(r)) + for i, e := range r { + d := deterministicExecTxResult(e) + b, err := d.Marshal() + if err != nil { + return nil, err + } + s[i] = b + } + return s, nil +} diff --git a/abci/types/types.pb.go b/abci/types/types.pb.go index 0a290664bc..0d6fc9cd68 100644 --- a/abci/types/types.pb.go +++ b/abci/types/types.pb.go @@ -58,31 +58,31 @@ func (CheckTxType) EnumDescriptor() ([]byte, []int) { return fileDescriptor_252557cfdd89a31a, []int{0} } -type EvidenceType int32 +type MisbehaviorType int32 const ( - EvidenceType_UNKNOWN EvidenceType = 0 - EvidenceType_DUPLICATE_VOTE EvidenceType = 1 - EvidenceType_LIGHT_CLIENT_ATTACK EvidenceType = 2 + MisbehaviorType_UNKNOWN MisbehaviorType = 0 + MisbehaviorType_DUPLICATE_VOTE MisbehaviorType = 1 + MisbehaviorType_LIGHT_CLIENT_ATTACK MisbehaviorType = 2 ) -var EvidenceType_name = map[int32]string{ +var MisbehaviorType_name = map[int32]string{ 0: "UNKNOWN", 1: "DUPLICATE_VOTE", 2: "LIGHT_CLIENT_ATTACK", } -var EvidenceType_value = map[string]int32{ +var MisbehaviorType_value = map[string]int32{ "UNKNOWN": 0, "DUPLICATE_VOTE": 1, "LIGHT_CLIENT_ATTACK": 2, } -func (x EvidenceType) String() string { - return proto.EnumName(EvidenceType_name, int32(x)) +func (x MisbehaviorType) String() string { + return proto.EnumName(MisbehaviorType_name, int32(x)) } -func (EvidenceType) EnumDescriptor() ([]byte, []int) { +func (MisbehaviorType) EnumDescriptor() ([]byte, []int) { return fileDescriptor_252557cfdd89a31a, []int{1} } @@ -120,7 +120,7 @@ func (x ResponseOfferSnapshot_Result) String() string { } func (ResponseOfferSnapshot_Result) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_252557cfdd89a31a, []int{28, 0} + return fileDescriptor_252557cfdd89a31a, []int{33, 0} } type ResponseApplySnapshotChunk_Result int32 @@ -157,7 +157,95 @@ func (x ResponseApplySnapshotChunk_Result) String() string { } func (ResponseApplySnapshotChunk_Result) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_252557cfdd89a31a, []int{30, 0} + return fileDescriptor_252557cfdd89a31a, []int{35, 0} +} + +type ResponseProcessProposal_ProposalStatus int32 + +const ( + ResponseProcessProposal_UNKNOWN ResponseProcessProposal_ProposalStatus = 0 + ResponseProcessProposal_ACCEPT ResponseProcessProposal_ProposalStatus = 1 + ResponseProcessProposal_REJECT ResponseProcessProposal_ProposalStatus = 2 +) + +var ResponseProcessProposal_ProposalStatus_name = map[int32]string{ + 0: "UNKNOWN", + 1: "ACCEPT", + 2: "REJECT", +} + +var ResponseProcessProposal_ProposalStatus_value = map[string]int32{ + "UNKNOWN": 0, + "ACCEPT": 1, + "REJECT": 2, +} + +func (x ResponseProcessProposal_ProposalStatus) String() string { + return proto.EnumName(ResponseProcessProposal_ProposalStatus_name, int32(x)) +} + +func (ResponseProcessProposal_ProposalStatus) EnumDescriptor() ([]byte, []int) { + return fileDescriptor_252557cfdd89a31a, []int{37, 0} +} + +type ResponseVerifyVoteExtension_VerifyStatus int32 + +const ( + ResponseVerifyVoteExtension_UNKNOWN ResponseVerifyVoteExtension_VerifyStatus = 0 + ResponseVerifyVoteExtension_ACCEPT ResponseVerifyVoteExtension_VerifyStatus = 1 + ResponseVerifyVoteExtension_REJECT ResponseVerifyVoteExtension_VerifyStatus = 2 +) + +var ResponseVerifyVoteExtension_VerifyStatus_name = map[int32]string{ + 0: "UNKNOWN", + 1: "ACCEPT", + 2: "REJECT", +} + +var ResponseVerifyVoteExtension_VerifyStatus_value = map[string]int32{ + "UNKNOWN": 0, + "ACCEPT": 1, + "REJECT": 2, +} + +func (x ResponseVerifyVoteExtension_VerifyStatus) String() string { + return proto.EnumName(ResponseVerifyVoteExtension_VerifyStatus_name, int32(x)) +} + +func (ResponseVerifyVoteExtension_VerifyStatus) EnumDescriptor() ([]byte, []int) { + return fileDescriptor_252557cfdd89a31a, []int{39, 0} +} + +// TxAction contains App-provided information on what to do with a transaction that is part of a raw proposal +type TxRecord_TxAction int32 + +const ( + TxRecord_UNKNOWN TxRecord_TxAction = 0 + TxRecord_UNMODIFIED TxRecord_TxAction = 1 + TxRecord_ADDED TxRecord_TxAction = 2 + TxRecord_REMOVED TxRecord_TxAction = 3 +) + +var TxRecord_TxAction_name = map[int32]string{ + 0: "UNKNOWN", + 1: "UNMODIFIED", + 2: "ADDED", + 3: "REMOVED", +} + +var TxRecord_TxAction_value = map[string]int32{ + "UNKNOWN": 0, + "UNMODIFIED": 1, + "ADDED": 2, + "REMOVED": 3, +} + +func (x TxRecord_TxAction) String() string { + return proto.EnumName(TxRecord_TxAction_name, int32(x)) +} + +func (TxRecord_TxAction) EnumDescriptor() ([]byte, []int) { + return fileDescriptor_252557cfdd89a31a, []int{47, 0} } type Request struct { @@ -176,6 +264,11 @@ type Request struct { // *Request_OfferSnapshot // *Request_LoadSnapshotChunk // *Request_ApplySnapshotChunk + // *Request_PrepareProposal + // *Request_ProcessProposal + // *Request_ExtendVote + // *Request_VerifyVoteExtension + // *Request_FinalizeBlock Value isRequest_Value `protobuf_oneof:"value"` } @@ -260,21 +353,41 @@ type Request_LoadSnapshotChunk struct { type Request_ApplySnapshotChunk struct { ApplySnapshotChunk *RequestApplySnapshotChunk `protobuf:"bytes,14,opt,name=apply_snapshot_chunk,json=applySnapshotChunk,proto3,oneof" json:"apply_snapshot_chunk,omitempty"` } - -func (*Request_Echo) isRequest_Value() {} -func (*Request_Flush) isRequest_Value() {} -func (*Request_Info) isRequest_Value() {} -func (*Request_InitChain) isRequest_Value() {} -func (*Request_Query) isRequest_Value() {} -func (*Request_BeginBlock) isRequest_Value() {} -func (*Request_CheckTx) isRequest_Value() {} -func (*Request_DeliverTx) isRequest_Value() {} -func (*Request_EndBlock) isRequest_Value() {} -func (*Request_Commit) isRequest_Value() {} -func (*Request_ListSnapshots) isRequest_Value() {} -func (*Request_OfferSnapshot) isRequest_Value() {} -func (*Request_LoadSnapshotChunk) isRequest_Value() {} -func (*Request_ApplySnapshotChunk) isRequest_Value() {} +type Request_PrepareProposal struct { + PrepareProposal *RequestPrepareProposal `protobuf:"bytes,15,opt,name=prepare_proposal,json=prepareProposal,proto3,oneof" json:"prepare_proposal,omitempty"` +} +type Request_ProcessProposal struct { + ProcessProposal *RequestProcessProposal `protobuf:"bytes,16,opt,name=process_proposal,json=processProposal,proto3,oneof" json:"process_proposal,omitempty"` +} +type Request_ExtendVote struct { + ExtendVote *RequestExtendVote `protobuf:"bytes,17,opt,name=extend_vote,json=extendVote,proto3,oneof" json:"extend_vote,omitempty"` +} +type Request_VerifyVoteExtension struct { + VerifyVoteExtension *RequestVerifyVoteExtension `protobuf:"bytes,18,opt,name=verify_vote_extension,json=verifyVoteExtension,proto3,oneof" json:"verify_vote_extension,omitempty"` +} +type Request_FinalizeBlock struct { + FinalizeBlock *RequestFinalizeBlock `protobuf:"bytes,19,opt,name=finalize_block,json=finalizeBlock,proto3,oneof" json:"finalize_block,omitempty"` +} + +func (*Request_Echo) isRequest_Value() {} +func (*Request_Flush) isRequest_Value() {} +func (*Request_Info) isRequest_Value() {} +func (*Request_InitChain) isRequest_Value() {} +func (*Request_Query) isRequest_Value() {} +func (*Request_BeginBlock) isRequest_Value() {} +func (*Request_CheckTx) isRequest_Value() {} +func (*Request_DeliverTx) isRequest_Value() {} +func (*Request_EndBlock) isRequest_Value() {} +func (*Request_Commit) isRequest_Value() {} +func (*Request_ListSnapshots) isRequest_Value() {} +func (*Request_OfferSnapshot) isRequest_Value() {} +func (*Request_LoadSnapshotChunk) isRequest_Value() {} +func (*Request_ApplySnapshotChunk) isRequest_Value() {} +func (*Request_PrepareProposal) isRequest_Value() {} +func (*Request_ProcessProposal) isRequest_Value() {} +func (*Request_ExtendVote) isRequest_Value() {} +func (*Request_VerifyVoteExtension) isRequest_Value() {} +func (*Request_FinalizeBlock) isRequest_Value() {} func (m *Request) GetValue() isRequest_Value { if m != nil { @@ -318,6 +431,7 @@ func (m *Request) GetQuery() *RequestQuery { return nil } +// Deprecated: Do not use. func (m *Request) GetBeginBlock() *RequestBeginBlock { if x, ok := m.GetValue().(*Request_BeginBlock); ok { return x.BeginBlock @@ -332,6 +446,7 @@ func (m *Request) GetCheckTx() *RequestCheckTx { return nil } +// Deprecated: Do not use. func (m *Request) GetDeliverTx() *RequestDeliverTx { if x, ok := m.GetValue().(*Request_DeliverTx); ok { return x.DeliverTx @@ -339,6 +454,7 @@ func (m *Request) GetDeliverTx() *RequestDeliverTx { return nil } +// Deprecated: Do not use. func (m *Request) GetEndBlock() *RequestEndBlock { if x, ok := m.GetValue().(*Request_EndBlock); ok { return x.EndBlock @@ -381,6 +497,41 @@ func (m *Request) GetApplySnapshotChunk() *RequestApplySnapshotChunk { return nil } +func (m *Request) GetPrepareProposal() *RequestPrepareProposal { + if x, ok := m.GetValue().(*Request_PrepareProposal); ok { + return x.PrepareProposal + } + return nil +} + +func (m *Request) GetProcessProposal() *RequestProcessProposal { + if x, ok := m.GetValue().(*Request_ProcessProposal); ok { + return x.ProcessProposal + } + return nil +} + +func (m *Request) GetExtendVote() *RequestExtendVote { + if x, ok := m.GetValue().(*Request_ExtendVote); ok { + return x.ExtendVote + } + return nil +} + +func (m *Request) GetVerifyVoteExtension() *RequestVerifyVoteExtension { + if x, ok := m.GetValue().(*Request_VerifyVoteExtension); ok { + return x.VerifyVoteExtension + } + return nil +} + +func (m *Request) GetFinalizeBlock() *RequestFinalizeBlock { + if x, ok := m.GetValue().(*Request_FinalizeBlock); ok { + return x.FinalizeBlock + } + return nil +} + // XXX_OneofWrappers is for the internal use of the proto package. func (*Request) XXX_OneofWrappers() []interface{} { return []interface{}{ @@ -398,6 +549,11 @@ func (*Request) XXX_OneofWrappers() []interface{} { (*Request_OfferSnapshot)(nil), (*Request_LoadSnapshotChunk)(nil), (*Request_ApplySnapshotChunk)(nil), + (*Request_PrepareProposal)(nil), + (*Request_ProcessProposal)(nil), + (*Request_ExtendVote)(nil), + (*Request_VerifyVoteExtension)(nil), + (*Request_FinalizeBlock)(nil), } } @@ -710,10 +866,10 @@ func (m *RequestQuery) GetProve() bool { } type RequestBeginBlock struct { - Hash []byte `protobuf:"bytes,1,opt,name=hash,proto3" json:"hash,omitempty"` - Header types1.Header `protobuf:"bytes,2,opt,name=header,proto3" json:"header"` - LastCommitInfo LastCommitInfo `protobuf:"bytes,3,opt,name=last_commit_info,json=lastCommitInfo,proto3" json:"last_commit_info"` - ByzantineValidators []Evidence `protobuf:"bytes,4,rep,name=byzantine_validators,json=byzantineValidators,proto3" json:"byzantine_validators"` + Hash []byte `protobuf:"bytes,1,opt,name=hash,proto3" json:"hash,omitempty"` + Header types1.Header `protobuf:"bytes,2,opt,name=header,proto3" json:"header"` + LastCommitInfo CommitInfo `protobuf:"bytes,3,opt,name=last_commit_info,json=lastCommitInfo,proto3" json:"last_commit_info"` + ByzantineValidators []Misbehavior `protobuf:"bytes,4,rep,name=byzantine_validators,json=byzantineValidators,proto3" json:"byzantine_validators"` } func (m *RequestBeginBlock) Reset() { *m = RequestBeginBlock{} } @@ -763,14 +919,14 @@ func (m *RequestBeginBlock) GetHeader() types1.Header { return types1.Header{} } -func (m *RequestBeginBlock) GetLastCommitInfo() LastCommitInfo { +func (m *RequestBeginBlock) GetLastCommitInfo() CommitInfo { if m != nil { return m.LastCommitInfo } - return LastCommitInfo{} + return CommitInfo{} } -func (m *RequestBeginBlock) GetByzantineValidators() []Evidence { +func (m *RequestBeginBlock) GetByzantineValidators() []Misbehavior { if m != nil { return m.ByzantineValidators } @@ -1165,38 +1321,32 @@ func (m *RequestApplySnapshotChunk) GetSender() string { return "" } -type Response struct { - // Types that are valid to be assigned to Value: - // *Response_Exception - // *Response_Echo - // *Response_Flush - // *Response_Info - // *Response_InitChain - // *Response_Query - // *Response_BeginBlock - // *Response_CheckTx - // *Response_DeliverTx - // *Response_EndBlock - // *Response_Commit - // *Response_ListSnapshots - // *Response_OfferSnapshot - // *Response_LoadSnapshotChunk - // *Response_ApplySnapshotChunk - Value isResponse_Value `protobuf_oneof:"value"` -} - -func (m *Response) Reset() { *m = Response{} } -func (m *Response) String() string { return proto.CompactTextString(m) } -func (*Response) ProtoMessage() {} -func (*Response) Descriptor() ([]byte, []int) { +type RequestPrepareProposal struct { + // the modified transactions cannot exceed this size. + MaxTxBytes int64 `protobuf:"varint,1,opt,name=max_tx_bytes,json=maxTxBytes,proto3" json:"max_tx_bytes,omitempty"` + // txs is an array of transactions that will be included in a block, + // sent to the app for possible modifications. + Txs [][]byte `protobuf:"bytes,2,rep,name=txs,proto3" json:"txs,omitempty"` + LocalLastCommit ExtendedCommitInfo `protobuf:"bytes,3,opt,name=local_last_commit,json=localLastCommit,proto3" json:"local_last_commit"` + ByzantineValidators []Misbehavior `protobuf:"bytes,4,rep,name=byzantine_validators,json=byzantineValidators,proto3" json:"byzantine_validators"` + Height int64 `protobuf:"varint,5,opt,name=height,proto3" json:"height,omitempty"` + Time time.Time `protobuf:"bytes,6,opt,name=time,proto3,stdtime" json:"time"` + NextValidatorsHash []byte `protobuf:"bytes,7,opt,name=next_validators_hash,json=nextValidatorsHash,proto3" json:"next_validators_hash,omitempty"` + ProposerProTxHash []byte `protobuf:"bytes,8,opt,name=proposer_pro_tx_hash,json=proposerProTxHash,proto3" json:"proposer_pro_tx_hash,omitempty"` +} + +func (m *RequestPrepareProposal) Reset() { *m = RequestPrepareProposal{} } +func (m *RequestPrepareProposal) String() string { return proto.CompactTextString(m) } +func (*RequestPrepareProposal) ProtoMessage() {} +func (*RequestPrepareProposal) Descriptor() ([]byte, []int) { return fileDescriptor_252557cfdd89a31a, []int{15} } -func (m *Response) XXX_Unmarshal(b []byte) error { +func (m *RequestPrepareProposal) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) } -func (m *Response) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { +func (m *RequestPrepareProposal) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { if deterministic { - return xxx_messageInfo_Response.Marshal(b, m, deterministic) + return xxx_messageInfo_RequestPrepareProposal.Marshal(b, m, deterministic) } else { b = b[:cap(b)] n, err := m.MarshalToSizedBuffer(b) @@ -1206,236 +1356,193 @@ func (m *Response) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { return b[:n], nil } } -func (m *Response) XXX_Merge(src proto.Message) { - xxx_messageInfo_Response.Merge(m, src) +func (m *RequestPrepareProposal) XXX_Merge(src proto.Message) { + xxx_messageInfo_RequestPrepareProposal.Merge(m, src) } -func (m *Response) XXX_Size() int { +func (m *RequestPrepareProposal) XXX_Size() int { return m.Size() } -func (m *Response) XXX_DiscardUnknown() { - xxx_messageInfo_Response.DiscardUnknown(m) +func (m *RequestPrepareProposal) XXX_DiscardUnknown() { + xxx_messageInfo_RequestPrepareProposal.DiscardUnknown(m) } -var xxx_messageInfo_Response proto.InternalMessageInfo - -type isResponse_Value interface { - isResponse_Value() - MarshalTo([]byte) (int, error) - Size() int -} +var xxx_messageInfo_RequestPrepareProposal proto.InternalMessageInfo -type Response_Exception struct { - Exception *ResponseException `protobuf:"bytes,1,opt,name=exception,proto3,oneof" json:"exception,omitempty"` -} -type Response_Echo struct { - Echo *ResponseEcho `protobuf:"bytes,2,opt,name=echo,proto3,oneof" json:"echo,omitempty"` -} -type Response_Flush struct { - Flush *ResponseFlush `protobuf:"bytes,3,opt,name=flush,proto3,oneof" json:"flush,omitempty"` -} -type Response_Info struct { - Info *ResponseInfo `protobuf:"bytes,4,opt,name=info,proto3,oneof" json:"info,omitempty"` -} -type Response_InitChain struct { - InitChain *ResponseInitChain `protobuf:"bytes,5,opt,name=init_chain,json=initChain,proto3,oneof" json:"init_chain,omitempty"` -} -type Response_Query struct { - Query *ResponseQuery `protobuf:"bytes,6,opt,name=query,proto3,oneof" json:"query,omitempty"` -} -type Response_BeginBlock struct { - BeginBlock *ResponseBeginBlock `protobuf:"bytes,7,opt,name=begin_block,json=beginBlock,proto3,oneof" json:"begin_block,omitempty"` -} -type Response_CheckTx struct { - CheckTx *ResponseCheckTx `protobuf:"bytes,8,opt,name=check_tx,json=checkTx,proto3,oneof" json:"check_tx,omitempty"` -} -type Response_DeliverTx struct { - DeliverTx *ResponseDeliverTx `protobuf:"bytes,9,opt,name=deliver_tx,json=deliverTx,proto3,oneof" json:"deliver_tx,omitempty"` -} -type Response_EndBlock struct { - EndBlock *ResponseEndBlock `protobuf:"bytes,10,opt,name=end_block,json=endBlock,proto3,oneof" json:"end_block,omitempty"` -} -type Response_Commit struct { - Commit *ResponseCommit `protobuf:"bytes,11,opt,name=commit,proto3,oneof" json:"commit,omitempty"` -} -type Response_ListSnapshots struct { - ListSnapshots *ResponseListSnapshots `protobuf:"bytes,12,opt,name=list_snapshots,json=listSnapshots,proto3,oneof" json:"list_snapshots,omitempty"` -} -type Response_OfferSnapshot struct { - OfferSnapshot *ResponseOfferSnapshot `protobuf:"bytes,13,opt,name=offer_snapshot,json=offerSnapshot,proto3,oneof" json:"offer_snapshot,omitempty"` -} -type Response_LoadSnapshotChunk struct { - LoadSnapshotChunk *ResponseLoadSnapshotChunk `protobuf:"bytes,14,opt,name=load_snapshot_chunk,json=loadSnapshotChunk,proto3,oneof" json:"load_snapshot_chunk,omitempty"` -} -type Response_ApplySnapshotChunk struct { - ApplySnapshotChunk *ResponseApplySnapshotChunk `protobuf:"bytes,15,opt,name=apply_snapshot_chunk,json=applySnapshotChunk,proto3,oneof" json:"apply_snapshot_chunk,omitempty"` +func (m *RequestPrepareProposal) GetMaxTxBytes() int64 { + if m != nil { + return m.MaxTxBytes + } + return 0 } -func (*Response_Exception) isResponse_Value() {} -func (*Response_Echo) isResponse_Value() {} -func (*Response_Flush) isResponse_Value() {} -func (*Response_Info) isResponse_Value() {} -func (*Response_InitChain) isResponse_Value() {} -func (*Response_Query) isResponse_Value() {} -func (*Response_BeginBlock) isResponse_Value() {} -func (*Response_CheckTx) isResponse_Value() {} -func (*Response_DeliverTx) isResponse_Value() {} -func (*Response_EndBlock) isResponse_Value() {} -func (*Response_Commit) isResponse_Value() {} -func (*Response_ListSnapshots) isResponse_Value() {} -func (*Response_OfferSnapshot) isResponse_Value() {} -func (*Response_LoadSnapshotChunk) isResponse_Value() {} -func (*Response_ApplySnapshotChunk) isResponse_Value() {} - -func (m *Response) GetValue() isResponse_Value { +func (m *RequestPrepareProposal) GetTxs() [][]byte { if m != nil { - return m.Value + return m.Txs } return nil } -func (m *Response) GetException() *ResponseException { - if x, ok := m.GetValue().(*Response_Exception); ok { - return x.Exception +func (m *RequestPrepareProposal) GetLocalLastCommit() ExtendedCommitInfo { + if m != nil { + return m.LocalLastCommit } - return nil + return ExtendedCommitInfo{} } -func (m *Response) GetEcho() *ResponseEcho { - if x, ok := m.GetValue().(*Response_Echo); ok { - return x.Echo +func (m *RequestPrepareProposal) GetByzantineValidators() []Misbehavior { + if m != nil { + return m.ByzantineValidators } return nil } -func (m *Response) GetFlush() *ResponseFlush { - if x, ok := m.GetValue().(*Response_Flush); ok { - return x.Flush +func (m *RequestPrepareProposal) GetHeight() int64 { + if m != nil { + return m.Height } - return nil + return 0 } -func (m *Response) GetInfo() *ResponseInfo { - if x, ok := m.GetValue().(*Response_Info); ok { - return x.Info +func (m *RequestPrepareProposal) GetTime() time.Time { + if m != nil { + return m.Time } - return nil + return time.Time{} } -func (m *Response) GetInitChain() *ResponseInitChain { - if x, ok := m.GetValue().(*Response_InitChain); ok { - return x.InitChain +func (m *RequestPrepareProposal) GetNextValidatorsHash() []byte { + if m != nil { + return m.NextValidatorsHash } return nil } -func (m *Response) GetQuery() *ResponseQuery { - if x, ok := m.GetValue().(*Response_Query); ok { - return x.Query +func (m *RequestPrepareProposal) GetProposerProTxHash() []byte { + if m != nil { + return m.ProposerProTxHash } return nil } -func (m *Response) GetBeginBlock() *ResponseBeginBlock { - if x, ok := m.GetValue().(*Response_BeginBlock); ok { - return x.BeginBlock +type RequestProcessProposal struct { + Txs [][]byte `protobuf:"bytes,1,rep,name=txs,proto3" json:"txs,omitempty"` + ProposedLastCommit CommitInfo `protobuf:"bytes,2,opt,name=proposed_last_commit,json=proposedLastCommit,proto3" json:"proposed_last_commit"` + ByzantineValidators []Misbehavior `protobuf:"bytes,3,rep,name=byzantine_validators,json=byzantineValidators,proto3" json:"byzantine_validators"` + // hash is the merkle root hash of the fields of the proposed block. + Hash []byte `protobuf:"bytes,4,opt,name=hash,proto3" json:"hash,omitempty"` + Height int64 `protobuf:"varint,5,opt,name=height,proto3" json:"height,omitempty"` + Time time.Time `protobuf:"bytes,6,opt,name=time,proto3,stdtime" json:"time"` + NextValidatorsHash []byte `protobuf:"bytes,7,opt,name=next_validators_hash,json=nextValidatorsHash,proto3" json:"next_validators_hash,omitempty"` + ProposerProTxHash []byte `protobuf:"bytes,8,opt,name=proposer_pro_tx_hash,json=proposerProTxHash,proto3" json:"proposer_pro_tx_hash,omitempty"` +} + +func (m *RequestProcessProposal) Reset() { *m = RequestProcessProposal{} } +func (m *RequestProcessProposal) String() string { return proto.CompactTextString(m) } +func (*RequestProcessProposal) ProtoMessage() {} +func (*RequestProcessProposal) Descriptor() ([]byte, []int) { + return fileDescriptor_252557cfdd89a31a, []int{16} +} +func (m *RequestProcessProposal) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *RequestProcessProposal) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_RequestProcessProposal.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil } - return nil +} +func (m *RequestProcessProposal) XXX_Merge(src proto.Message) { + xxx_messageInfo_RequestProcessProposal.Merge(m, src) +} +func (m *RequestProcessProposal) XXX_Size() int { + return m.Size() +} +func (m *RequestProcessProposal) XXX_DiscardUnknown() { + xxx_messageInfo_RequestProcessProposal.DiscardUnknown(m) } -func (m *Response) GetCheckTx() *ResponseCheckTx { - if x, ok := m.GetValue().(*Response_CheckTx); ok { - return x.CheckTx +var xxx_messageInfo_RequestProcessProposal proto.InternalMessageInfo + +func (m *RequestProcessProposal) GetTxs() [][]byte { + if m != nil { + return m.Txs } return nil } -func (m *Response) GetDeliverTx() *ResponseDeliverTx { - if x, ok := m.GetValue().(*Response_DeliverTx); ok { - return x.DeliverTx +func (m *RequestProcessProposal) GetProposedLastCommit() CommitInfo { + if m != nil { + return m.ProposedLastCommit } - return nil + return CommitInfo{} } -func (m *Response) GetEndBlock() *ResponseEndBlock { - if x, ok := m.GetValue().(*Response_EndBlock); ok { - return x.EndBlock +func (m *RequestProcessProposal) GetByzantineValidators() []Misbehavior { + if m != nil { + return m.ByzantineValidators } return nil } -func (m *Response) GetCommit() *ResponseCommit { - if x, ok := m.GetValue().(*Response_Commit); ok { - return x.Commit +func (m *RequestProcessProposal) GetHash() []byte { + if m != nil { + return m.Hash } return nil } -func (m *Response) GetListSnapshots() *ResponseListSnapshots { - if x, ok := m.GetValue().(*Response_ListSnapshots); ok { - return x.ListSnapshots +func (m *RequestProcessProposal) GetHeight() int64 { + if m != nil { + return m.Height } - return nil + return 0 } -func (m *Response) GetOfferSnapshot() *ResponseOfferSnapshot { - if x, ok := m.GetValue().(*Response_OfferSnapshot); ok { - return x.OfferSnapshot +func (m *RequestProcessProposal) GetTime() time.Time { + if m != nil { + return m.Time } - return nil + return time.Time{} } -func (m *Response) GetLoadSnapshotChunk() *ResponseLoadSnapshotChunk { - if x, ok := m.GetValue().(*Response_LoadSnapshotChunk); ok { - return x.LoadSnapshotChunk +func (m *RequestProcessProposal) GetNextValidatorsHash() []byte { + if m != nil { + return m.NextValidatorsHash } return nil } -func (m *Response) GetApplySnapshotChunk() *ResponseApplySnapshotChunk { - if x, ok := m.GetValue().(*Response_ApplySnapshotChunk); ok { - return x.ApplySnapshotChunk +func (m *RequestProcessProposal) GetProposerProTxHash() []byte { + if m != nil { + return m.ProposerProTxHash } return nil } -// XXX_OneofWrappers is for the internal use of the proto package. -func (*Response) XXX_OneofWrappers() []interface{} { - return []interface{}{ - (*Response_Exception)(nil), - (*Response_Echo)(nil), - (*Response_Flush)(nil), - (*Response_Info)(nil), - (*Response_InitChain)(nil), - (*Response_Query)(nil), - (*Response_BeginBlock)(nil), - (*Response_CheckTx)(nil), - (*Response_DeliverTx)(nil), - (*Response_EndBlock)(nil), - (*Response_Commit)(nil), - (*Response_ListSnapshots)(nil), - (*Response_OfferSnapshot)(nil), - (*Response_LoadSnapshotChunk)(nil), - (*Response_ApplySnapshotChunk)(nil), - } -} - -// nondeterministic -type ResponseException struct { - Error string `protobuf:"bytes,1,opt,name=error,proto3" json:"error,omitempty"` +// Extends a vote with application-side injection +type RequestExtendVote struct { + Hash []byte `protobuf:"bytes,1,opt,name=hash,proto3" json:"hash,omitempty"` + Height int64 `protobuf:"varint,2,opt,name=height,proto3" json:"height,omitempty"` } -func (m *ResponseException) Reset() { *m = ResponseException{} } -func (m *ResponseException) String() string { return proto.CompactTextString(m) } -func (*ResponseException) ProtoMessage() {} -func (*ResponseException) Descriptor() ([]byte, []int) { - return fileDescriptor_252557cfdd89a31a, []int{16} +func (m *RequestExtendVote) Reset() { *m = RequestExtendVote{} } +func (m *RequestExtendVote) String() string { return proto.CompactTextString(m) } +func (*RequestExtendVote) ProtoMessage() {} +func (*RequestExtendVote) Descriptor() ([]byte, []int) { + return fileDescriptor_252557cfdd89a31a, []int{17} } -func (m *ResponseException) XXX_Unmarshal(b []byte) error { +func (m *RequestExtendVote) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) } -func (m *ResponseException) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { +func (m *RequestExtendVote) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { if deterministic { - return xxx_messageInfo_ResponseException.Marshal(b, m, deterministic) + return xxx_messageInfo_RequestExtendVote.Marshal(b, m, deterministic) } else { b = b[:cap(b)] n, err := m.MarshalToSizedBuffer(b) @@ -1445,126 +1552,52 @@ func (m *ResponseException) XXX_Marshal(b []byte, deterministic bool) ([]byte, e return b[:n], nil } } -func (m *ResponseException) XXX_Merge(src proto.Message) { - xxx_messageInfo_ResponseException.Merge(m, src) +func (m *RequestExtendVote) XXX_Merge(src proto.Message) { + xxx_messageInfo_RequestExtendVote.Merge(m, src) } -func (m *ResponseException) XXX_Size() int { +func (m *RequestExtendVote) XXX_Size() int { return m.Size() } -func (m *ResponseException) XXX_DiscardUnknown() { - xxx_messageInfo_ResponseException.DiscardUnknown(m) +func (m *RequestExtendVote) XXX_DiscardUnknown() { + xxx_messageInfo_RequestExtendVote.DiscardUnknown(m) } -var xxx_messageInfo_ResponseException proto.InternalMessageInfo +var xxx_messageInfo_RequestExtendVote proto.InternalMessageInfo -func (m *ResponseException) GetError() string { +func (m *RequestExtendVote) GetHash() []byte { if m != nil { - return m.Error - } - return "" -} - -type ResponseEcho struct { - Message string `protobuf:"bytes,1,opt,name=message,proto3" json:"message,omitempty"` -} - -func (m *ResponseEcho) Reset() { *m = ResponseEcho{} } -func (m *ResponseEcho) String() string { return proto.CompactTextString(m) } -func (*ResponseEcho) ProtoMessage() {} -func (*ResponseEcho) Descriptor() ([]byte, []int) { - return fileDescriptor_252557cfdd89a31a, []int{17} -} -func (m *ResponseEcho) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *ResponseEcho) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_ResponseEcho.Marshal(b, m, deterministic) - } else { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err - } - return b[:n], nil + return m.Hash } + return nil } -func (m *ResponseEcho) XXX_Merge(src proto.Message) { - xxx_messageInfo_ResponseEcho.Merge(m, src) -} -func (m *ResponseEcho) XXX_Size() int { - return m.Size() -} -func (m *ResponseEcho) XXX_DiscardUnknown() { - xxx_messageInfo_ResponseEcho.DiscardUnknown(m) -} - -var xxx_messageInfo_ResponseEcho proto.InternalMessageInfo -func (m *ResponseEcho) GetMessage() string { +func (m *RequestExtendVote) GetHeight() int64 { if m != nil { - return m.Message + return m.Height } - return "" + return 0 } -type ResponseFlush struct { +// Verify the vote extension +type RequestVerifyVoteExtension struct { + Hash []byte `protobuf:"bytes,1,opt,name=hash,proto3" json:"hash,omitempty"` + ValidatorProTxHash []byte `protobuf:"bytes,2,opt,name=validator_pro_tx_hash,json=validatorProTxHash,proto3" json:"validator_pro_tx_hash,omitempty"` + Height int64 `protobuf:"varint,3,opt,name=height,proto3" json:"height,omitempty"` + VoteExtension []byte `protobuf:"bytes,4,opt,name=vote_extension,json=voteExtension,proto3" json:"vote_extension,omitempty"` } -func (m *ResponseFlush) Reset() { *m = ResponseFlush{} } -func (m *ResponseFlush) String() string { return proto.CompactTextString(m) } -func (*ResponseFlush) ProtoMessage() {} -func (*ResponseFlush) Descriptor() ([]byte, []int) { +func (m *RequestVerifyVoteExtension) Reset() { *m = RequestVerifyVoteExtension{} } +func (m *RequestVerifyVoteExtension) String() string { return proto.CompactTextString(m) } +func (*RequestVerifyVoteExtension) ProtoMessage() {} +func (*RequestVerifyVoteExtension) Descriptor() ([]byte, []int) { return fileDescriptor_252557cfdd89a31a, []int{18} } -func (m *ResponseFlush) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *ResponseFlush) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_ResponseFlush.Marshal(b, m, deterministic) - } else { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err - } - return b[:n], nil - } -} -func (m *ResponseFlush) XXX_Merge(src proto.Message) { - xxx_messageInfo_ResponseFlush.Merge(m, src) -} -func (m *ResponseFlush) XXX_Size() int { - return m.Size() -} -func (m *ResponseFlush) XXX_DiscardUnknown() { - xxx_messageInfo_ResponseFlush.DiscardUnknown(m) -} - -var xxx_messageInfo_ResponseFlush proto.InternalMessageInfo - -type ResponseInfo struct { - Data string `protobuf:"bytes,1,opt,name=data,proto3" json:"data,omitempty"` - // this is the software version of the application. TODO: remove? - Version string `protobuf:"bytes,2,opt,name=version,proto3" json:"version,omitempty"` - AppVersion uint64 `protobuf:"varint,3,opt,name=app_version,json=appVersion,proto3" json:"app_version,omitempty"` - LastBlockHeight int64 `protobuf:"varint,4,opt,name=last_block_height,json=lastBlockHeight,proto3" json:"last_block_height,omitempty"` - LastBlockAppHash []byte `protobuf:"bytes,5,opt,name=last_block_app_hash,json=lastBlockAppHash,proto3" json:"last_block_app_hash,omitempty"` -} - -func (m *ResponseInfo) Reset() { *m = ResponseInfo{} } -func (m *ResponseInfo) String() string { return proto.CompactTextString(m) } -func (*ResponseInfo) ProtoMessage() {} -func (*ResponseInfo) Descriptor() ([]byte, []int) { - return fileDescriptor_252557cfdd89a31a, []int{19} -} -func (m *ResponseInfo) XXX_Unmarshal(b []byte) error { +func (m *RequestVerifyVoteExtension) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) } -func (m *ResponseInfo) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { +func (m *RequestVerifyVoteExtension) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { if deterministic { - return xxx_messageInfo_ResponseInfo.Marshal(b, m, deterministic) + return xxx_messageInfo_RequestVerifyVoteExtension.Marshal(b, m, deterministic) } else { b = b[:cap(b)] n, err := m.MarshalToSizedBuffer(b) @@ -1574,73 +1607,70 @@ func (m *ResponseInfo) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) return b[:n], nil } } -func (m *ResponseInfo) XXX_Merge(src proto.Message) { - xxx_messageInfo_ResponseInfo.Merge(m, src) +func (m *RequestVerifyVoteExtension) XXX_Merge(src proto.Message) { + xxx_messageInfo_RequestVerifyVoteExtension.Merge(m, src) } -func (m *ResponseInfo) XXX_Size() int { +func (m *RequestVerifyVoteExtension) XXX_Size() int { return m.Size() } -func (m *ResponseInfo) XXX_DiscardUnknown() { - xxx_messageInfo_ResponseInfo.DiscardUnknown(m) +func (m *RequestVerifyVoteExtension) XXX_DiscardUnknown() { + xxx_messageInfo_RequestVerifyVoteExtension.DiscardUnknown(m) } -var xxx_messageInfo_ResponseInfo proto.InternalMessageInfo - -func (m *ResponseInfo) GetData() string { - if m != nil { - return m.Data - } - return "" -} +var xxx_messageInfo_RequestVerifyVoteExtension proto.InternalMessageInfo -func (m *ResponseInfo) GetVersion() string { +func (m *RequestVerifyVoteExtension) GetHash() []byte { if m != nil { - return m.Version + return m.Hash } - return "" + return nil } -func (m *ResponseInfo) GetAppVersion() uint64 { +func (m *RequestVerifyVoteExtension) GetValidatorProTxHash() []byte { if m != nil { - return m.AppVersion + return m.ValidatorProTxHash } - return 0 + return nil } -func (m *ResponseInfo) GetLastBlockHeight() int64 { +func (m *RequestVerifyVoteExtension) GetHeight() int64 { if m != nil { - return m.LastBlockHeight + return m.Height } return 0 } -func (m *ResponseInfo) GetLastBlockAppHash() []byte { +func (m *RequestVerifyVoteExtension) GetVoteExtension() []byte { if m != nil { - return m.LastBlockAppHash + return m.VoteExtension } return nil } -type ResponseInitChain struct { - ConsensusParams *types1.ConsensusParams `protobuf:"bytes,1,opt,name=consensus_params,json=consensusParams,proto3" json:"consensus_params,omitempty"` - AppHash []byte `protobuf:"bytes,3,opt,name=app_hash,json=appHash,proto3" json:"app_hash,omitempty"` - ValidatorSetUpdate ValidatorSetUpdate `protobuf:"bytes,100,opt,name=validator_set_update,json=validatorSetUpdate,proto3" json:"validator_set_update"` - NextCoreChainLockUpdate *types1.CoreChainLock `protobuf:"bytes,101,opt,name=next_core_chain_lock_update,json=nextCoreChainLockUpdate,proto3" json:"next_core_chain_lock_update,omitempty"` - InitialCoreHeight uint32 `protobuf:"varint,102,opt,name=initial_core_height,json=initialCoreHeight,proto3" json:"initial_core_height,omitempty"` +type RequestFinalizeBlock struct { + Txs [][]byte `protobuf:"bytes,1,rep,name=txs,proto3" json:"txs,omitempty"` + DecidedLastCommit CommitInfo `protobuf:"bytes,2,opt,name=decided_last_commit,json=decidedLastCommit,proto3" json:"decided_last_commit"` + ByzantineValidators []Misbehavior `protobuf:"bytes,3,rep,name=byzantine_validators,json=byzantineValidators,proto3" json:"byzantine_validators"` + // hash is the merkle root hash of the fields of the proposed block. + Hash []byte `protobuf:"bytes,4,opt,name=hash,proto3" json:"hash,omitempty"` + Height int64 `protobuf:"varint,5,opt,name=height,proto3" json:"height,omitempty"` + Time time.Time `protobuf:"bytes,6,opt,name=time,proto3,stdtime" json:"time"` + NextValidatorsHash []byte `protobuf:"bytes,7,opt,name=next_validators_hash,json=nextValidatorsHash,proto3" json:"next_validators_hash,omitempty"` + ProposerProTxHash []byte `protobuf:"bytes,8,opt,name=proposer_pro_tx_hash,json=proposerProTxHash,proto3" json:"proposer_pro_tx_hash,omitempty"` } -func (m *ResponseInitChain) Reset() { *m = ResponseInitChain{} } -func (m *ResponseInitChain) String() string { return proto.CompactTextString(m) } -func (*ResponseInitChain) ProtoMessage() {} -func (*ResponseInitChain) Descriptor() ([]byte, []int) { - return fileDescriptor_252557cfdd89a31a, []int{20} +func (m *RequestFinalizeBlock) Reset() { *m = RequestFinalizeBlock{} } +func (m *RequestFinalizeBlock) String() string { return proto.CompactTextString(m) } +func (*RequestFinalizeBlock) ProtoMessage() {} +func (*RequestFinalizeBlock) Descriptor() ([]byte, []int) { + return fileDescriptor_252557cfdd89a31a, []int{19} } -func (m *ResponseInitChain) XXX_Unmarshal(b []byte) error { +func (m *RequestFinalizeBlock) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) } -func (m *ResponseInitChain) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { +func (m *RequestFinalizeBlock) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { if deterministic { - return xxx_messageInfo_ResponseInitChain.Marshal(b, m, deterministic) + return xxx_messageInfo_RequestFinalizeBlock.Marshal(b, m, deterministic) } else { b = b[:cap(b)] n, err := m.MarshalToSizedBuffer(b) @@ -1650,78 +1680,111 @@ func (m *ResponseInitChain) XXX_Marshal(b []byte, deterministic bool) ([]byte, e return b[:n], nil } } -func (m *ResponseInitChain) XXX_Merge(src proto.Message) { - xxx_messageInfo_ResponseInitChain.Merge(m, src) +func (m *RequestFinalizeBlock) XXX_Merge(src proto.Message) { + xxx_messageInfo_RequestFinalizeBlock.Merge(m, src) } -func (m *ResponseInitChain) XXX_Size() int { +func (m *RequestFinalizeBlock) XXX_Size() int { return m.Size() } -func (m *ResponseInitChain) XXX_DiscardUnknown() { - xxx_messageInfo_ResponseInitChain.DiscardUnknown(m) +func (m *RequestFinalizeBlock) XXX_DiscardUnknown() { + xxx_messageInfo_RequestFinalizeBlock.DiscardUnknown(m) } -var xxx_messageInfo_ResponseInitChain proto.InternalMessageInfo +var xxx_messageInfo_RequestFinalizeBlock proto.InternalMessageInfo -func (m *ResponseInitChain) GetConsensusParams() *types1.ConsensusParams { +func (m *RequestFinalizeBlock) GetTxs() [][]byte { if m != nil { - return m.ConsensusParams + return m.Txs } return nil } -func (m *ResponseInitChain) GetAppHash() []byte { +func (m *RequestFinalizeBlock) GetDecidedLastCommit() CommitInfo { if m != nil { - return m.AppHash + return m.DecidedLastCommit } - return nil + return CommitInfo{} } -func (m *ResponseInitChain) GetValidatorSetUpdate() ValidatorSetUpdate { +func (m *RequestFinalizeBlock) GetByzantineValidators() []Misbehavior { if m != nil { - return m.ValidatorSetUpdate + return m.ByzantineValidators } - return ValidatorSetUpdate{} + return nil } -func (m *ResponseInitChain) GetNextCoreChainLockUpdate() *types1.CoreChainLock { +func (m *RequestFinalizeBlock) GetHash() []byte { if m != nil { - return m.NextCoreChainLockUpdate + return m.Hash } return nil } -func (m *ResponseInitChain) GetInitialCoreHeight() uint32 { +func (m *RequestFinalizeBlock) GetHeight() int64 { if m != nil { - return m.InitialCoreHeight + return m.Height } return 0 } -type ResponseQuery struct { - Code uint32 `protobuf:"varint,1,opt,name=code,proto3" json:"code,omitempty"` - // bytes data = 2; // use "value" instead. - Log string `protobuf:"bytes,3,opt,name=log,proto3" json:"log,omitempty"` - Info string `protobuf:"bytes,4,opt,name=info,proto3" json:"info,omitempty"` - Index int64 `protobuf:"varint,5,opt,name=index,proto3" json:"index,omitempty"` - Key []byte `protobuf:"bytes,6,opt,name=key,proto3" json:"key,omitempty"` - Value []byte `protobuf:"bytes,7,opt,name=value,proto3" json:"value,omitempty"` - ProofOps *crypto.ProofOps `protobuf:"bytes,8,opt,name=proof_ops,json=proofOps,proto3" json:"proof_ops,omitempty"` - Height int64 `protobuf:"varint,9,opt,name=height,proto3" json:"height,omitempty"` - Codespace string `protobuf:"bytes,10,opt,name=codespace,proto3" json:"codespace,omitempty"` +func (m *RequestFinalizeBlock) GetTime() time.Time { + if m != nil { + return m.Time + } + return time.Time{} } -func (m *ResponseQuery) Reset() { *m = ResponseQuery{} } -func (m *ResponseQuery) String() string { return proto.CompactTextString(m) } -func (*ResponseQuery) ProtoMessage() {} -func (*ResponseQuery) Descriptor() ([]byte, []int) { - return fileDescriptor_252557cfdd89a31a, []int{21} +func (m *RequestFinalizeBlock) GetNextValidatorsHash() []byte { + if m != nil { + return m.NextValidatorsHash + } + return nil } -func (m *ResponseQuery) XXX_Unmarshal(b []byte) error { + +func (m *RequestFinalizeBlock) GetProposerProTxHash() []byte { + if m != nil { + return m.ProposerProTxHash + } + return nil +} + +type Response struct { + // Types that are valid to be assigned to Value: + // *Response_Exception + // *Response_Echo + // *Response_Flush + // *Response_Info + // *Response_InitChain + // *Response_Query + // *Response_BeginBlock + // *Response_CheckTx + // *Response_DeliverTx + // *Response_EndBlock + // *Response_Commit + // *Response_ListSnapshots + // *Response_OfferSnapshot + // *Response_LoadSnapshotChunk + // *Response_ApplySnapshotChunk + // *Response_PrepareProposal + // *Response_ProcessProposal + // *Response_ExtendVote + // *Response_VerifyVoteExtension + // *Response_FinalizeBlock + Value isResponse_Value `protobuf_oneof:"value"` +} + +func (m *Response) Reset() { *m = Response{} } +func (m *Response) String() string { return proto.CompactTextString(m) } +func (*Response) ProtoMessage() {} +func (*Response) Descriptor() ([]byte, []int) { + return fileDescriptor_252557cfdd89a31a, []int{20} +} +func (m *Response) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) } -func (m *ResponseQuery) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { +func (m *Response) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { if deterministic { - return xxx_messageInfo_ResponseQuery.Marshal(b, m, deterministic) + return xxx_messageInfo_Response.Marshal(b, m, deterministic) } else { b = b[:cap(b)] n, err := m.MarshalToSizedBuffer(b) @@ -1731,274 +1794,299 @@ func (m *ResponseQuery) XXX_Marshal(b []byte, deterministic bool) ([]byte, error return b[:n], nil } } -func (m *ResponseQuery) XXX_Merge(src proto.Message) { - xxx_messageInfo_ResponseQuery.Merge(m, src) +func (m *Response) XXX_Merge(src proto.Message) { + xxx_messageInfo_Response.Merge(m, src) } -func (m *ResponseQuery) XXX_Size() int { +func (m *Response) XXX_Size() int { return m.Size() } -func (m *ResponseQuery) XXX_DiscardUnknown() { - xxx_messageInfo_ResponseQuery.DiscardUnknown(m) +func (m *Response) XXX_DiscardUnknown() { + xxx_messageInfo_Response.DiscardUnknown(m) } -var xxx_messageInfo_ResponseQuery proto.InternalMessageInfo +var xxx_messageInfo_Response proto.InternalMessageInfo -func (m *ResponseQuery) GetCode() uint32 { - if m != nil { - return m.Code - } - return 0 +type isResponse_Value interface { + isResponse_Value() + MarshalTo([]byte) (int, error) + Size() int } -func (m *ResponseQuery) GetLog() string { - if m != nil { - return m.Log - } - return "" +type Response_Exception struct { + Exception *ResponseException `protobuf:"bytes,1,opt,name=exception,proto3,oneof" json:"exception,omitempty"` +} +type Response_Echo struct { + Echo *ResponseEcho `protobuf:"bytes,2,opt,name=echo,proto3,oneof" json:"echo,omitempty"` +} +type Response_Flush struct { + Flush *ResponseFlush `protobuf:"bytes,3,opt,name=flush,proto3,oneof" json:"flush,omitempty"` +} +type Response_Info struct { + Info *ResponseInfo `protobuf:"bytes,4,opt,name=info,proto3,oneof" json:"info,omitempty"` +} +type Response_InitChain struct { + InitChain *ResponseInitChain `protobuf:"bytes,5,opt,name=init_chain,json=initChain,proto3,oneof" json:"init_chain,omitempty"` +} +type Response_Query struct { + Query *ResponseQuery `protobuf:"bytes,6,opt,name=query,proto3,oneof" json:"query,omitempty"` +} +type Response_BeginBlock struct { + BeginBlock *ResponseBeginBlock `protobuf:"bytes,7,opt,name=begin_block,json=beginBlock,proto3,oneof" json:"begin_block,omitempty"` +} +type Response_CheckTx struct { + CheckTx *ResponseCheckTx `protobuf:"bytes,8,opt,name=check_tx,json=checkTx,proto3,oneof" json:"check_tx,omitempty"` +} +type Response_DeliverTx struct { + DeliverTx *ResponseDeliverTx `protobuf:"bytes,9,opt,name=deliver_tx,json=deliverTx,proto3,oneof" json:"deliver_tx,omitempty"` +} +type Response_EndBlock struct { + EndBlock *ResponseEndBlock `protobuf:"bytes,10,opt,name=end_block,json=endBlock,proto3,oneof" json:"end_block,omitempty"` +} +type Response_Commit struct { + Commit *ResponseCommit `protobuf:"bytes,11,opt,name=commit,proto3,oneof" json:"commit,omitempty"` +} +type Response_ListSnapshots struct { + ListSnapshots *ResponseListSnapshots `protobuf:"bytes,12,opt,name=list_snapshots,json=listSnapshots,proto3,oneof" json:"list_snapshots,omitempty"` +} +type Response_OfferSnapshot struct { + OfferSnapshot *ResponseOfferSnapshot `protobuf:"bytes,13,opt,name=offer_snapshot,json=offerSnapshot,proto3,oneof" json:"offer_snapshot,omitempty"` +} +type Response_LoadSnapshotChunk struct { + LoadSnapshotChunk *ResponseLoadSnapshotChunk `protobuf:"bytes,14,opt,name=load_snapshot_chunk,json=loadSnapshotChunk,proto3,oneof" json:"load_snapshot_chunk,omitempty"` +} +type Response_ApplySnapshotChunk struct { + ApplySnapshotChunk *ResponseApplySnapshotChunk `protobuf:"bytes,15,opt,name=apply_snapshot_chunk,json=applySnapshotChunk,proto3,oneof" json:"apply_snapshot_chunk,omitempty"` } +type Response_PrepareProposal struct { + PrepareProposal *ResponsePrepareProposal `protobuf:"bytes,16,opt,name=prepare_proposal,json=prepareProposal,proto3,oneof" json:"prepare_proposal,omitempty"` +} +type Response_ProcessProposal struct { + ProcessProposal *ResponseProcessProposal `protobuf:"bytes,17,opt,name=process_proposal,json=processProposal,proto3,oneof" json:"process_proposal,omitempty"` +} +type Response_ExtendVote struct { + ExtendVote *ResponseExtendVote `protobuf:"bytes,18,opt,name=extend_vote,json=extendVote,proto3,oneof" json:"extend_vote,omitempty"` +} +type Response_VerifyVoteExtension struct { + VerifyVoteExtension *ResponseVerifyVoteExtension `protobuf:"bytes,19,opt,name=verify_vote_extension,json=verifyVoteExtension,proto3,oneof" json:"verify_vote_extension,omitempty"` +} +type Response_FinalizeBlock struct { + FinalizeBlock *ResponseFinalizeBlock `protobuf:"bytes,20,opt,name=finalize_block,json=finalizeBlock,proto3,oneof" json:"finalize_block,omitempty"` +} + +func (*Response_Exception) isResponse_Value() {} +func (*Response_Echo) isResponse_Value() {} +func (*Response_Flush) isResponse_Value() {} +func (*Response_Info) isResponse_Value() {} +func (*Response_InitChain) isResponse_Value() {} +func (*Response_Query) isResponse_Value() {} +func (*Response_BeginBlock) isResponse_Value() {} +func (*Response_CheckTx) isResponse_Value() {} +func (*Response_DeliverTx) isResponse_Value() {} +func (*Response_EndBlock) isResponse_Value() {} +func (*Response_Commit) isResponse_Value() {} +func (*Response_ListSnapshots) isResponse_Value() {} +func (*Response_OfferSnapshot) isResponse_Value() {} +func (*Response_LoadSnapshotChunk) isResponse_Value() {} +func (*Response_ApplySnapshotChunk) isResponse_Value() {} +func (*Response_PrepareProposal) isResponse_Value() {} +func (*Response_ProcessProposal) isResponse_Value() {} +func (*Response_ExtendVote) isResponse_Value() {} +func (*Response_VerifyVoteExtension) isResponse_Value() {} +func (*Response_FinalizeBlock) isResponse_Value() {} -func (m *ResponseQuery) GetInfo() string { +func (m *Response) GetValue() isResponse_Value { if m != nil { - return m.Info + return m.Value } - return "" + return nil } -func (m *ResponseQuery) GetIndex() int64 { - if m != nil { - return m.Index +func (m *Response) GetException() *ResponseException { + if x, ok := m.GetValue().(*Response_Exception); ok { + return x.Exception } - return 0 + return nil } -func (m *ResponseQuery) GetKey() []byte { - if m != nil { - return m.Key +func (m *Response) GetEcho() *ResponseEcho { + if x, ok := m.GetValue().(*Response_Echo); ok { + return x.Echo } return nil } -func (m *ResponseQuery) GetValue() []byte { - if m != nil { - return m.Value +func (m *Response) GetFlush() *ResponseFlush { + if x, ok := m.GetValue().(*Response_Flush); ok { + return x.Flush } return nil } -func (m *ResponseQuery) GetProofOps() *crypto.ProofOps { - if m != nil { - return m.ProofOps +func (m *Response) GetInfo() *ResponseInfo { + if x, ok := m.GetValue().(*Response_Info); ok { + return x.Info } return nil } -func (m *ResponseQuery) GetHeight() int64 { - if m != nil { - return m.Height +func (m *Response) GetInitChain() *ResponseInitChain { + if x, ok := m.GetValue().(*Response_InitChain); ok { + return x.InitChain } - return 0 + return nil } -func (m *ResponseQuery) GetCodespace() string { - if m != nil { - return m.Codespace +func (m *Response) GetQuery() *ResponseQuery { + if x, ok := m.GetValue().(*Response_Query); ok { + return x.Query } - return "" + return nil } -type ResponseBeginBlock struct { - Events []Event `protobuf:"bytes,1,rep,name=events,proto3" json:"events,omitempty"` +// Deprecated: Do not use. +func (m *Response) GetBeginBlock() *ResponseBeginBlock { + if x, ok := m.GetValue().(*Response_BeginBlock); ok { + return x.BeginBlock + } + return nil } -func (m *ResponseBeginBlock) Reset() { *m = ResponseBeginBlock{} } -func (m *ResponseBeginBlock) String() string { return proto.CompactTextString(m) } -func (*ResponseBeginBlock) ProtoMessage() {} -func (*ResponseBeginBlock) Descriptor() ([]byte, []int) { - return fileDescriptor_252557cfdd89a31a, []int{22} -} -func (m *ResponseBeginBlock) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *ResponseBeginBlock) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_ResponseBeginBlock.Marshal(b, m, deterministic) - } else { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err - } - return b[:n], nil +func (m *Response) GetCheckTx() *ResponseCheckTx { + if x, ok := m.GetValue().(*Response_CheckTx); ok { + return x.CheckTx } + return nil } -func (m *ResponseBeginBlock) XXX_Merge(src proto.Message) { - xxx_messageInfo_ResponseBeginBlock.Merge(m, src) -} -func (m *ResponseBeginBlock) XXX_Size() int { - return m.Size() -} -func (m *ResponseBeginBlock) XXX_DiscardUnknown() { - xxx_messageInfo_ResponseBeginBlock.DiscardUnknown(m) -} - -var xxx_messageInfo_ResponseBeginBlock proto.InternalMessageInfo -func (m *ResponseBeginBlock) GetEvents() []Event { - if m != nil { - return m.Events +// Deprecated: Do not use. +func (m *Response) GetDeliverTx() *ResponseDeliverTx { + if x, ok := m.GetValue().(*Response_DeliverTx); ok { + return x.DeliverTx } return nil } -type ResponseCheckTx struct { - Code uint32 `protobuf:"varint,1,opt,name=code,proto3" json:"code,omitempty"` - Data []byte `protobuf:"bytes,2,opt,name=data,proto3" json:"data,omitempty"` - Log string `protobuf:"bytes,3,opt,name=log,proto3" json:"log,omitempty"` - Info string `protobuf:"bytes,4,opt,name=info,proto3" json:"info,omitempty"` - GasWanted int64 `protobuf:"varint,5,opt,name=gas_wanted,proto3" json:"gas_wanted,omitempty"` - GasUsed int64 `protobuf:"varint,6,opt,name=gas_used,proto3" json:"gas_used,omitempty"` - Events []Event `protobuf:"bytes,7,rep,name=events,proto3" json:"events,omitempty"` - Codespace string `protobuf:"bytes,8,opt,name=codespace,proto3" json:"codespace,omitempty"` - Sender string `protobuf:"bytes,9,opt,name=sender,proto3" json:"sender,omitempty"` - Priority int64 `protobuf:"varint,10,opt,name=priority,proto3" json:"priority,omitempty"` - // mempool_error is set by Tendermint. - // ABCI applictions creating a ResponseCheckTX should not set mempool_error. - MempoolError string `protobuf:"bytes,11,opt,name=mempool_error,json=mempoolError,proto3" json:"mempool_error,omitempty"` +// Deprecated: Do not use. +func (m *Response) GetEndBlock() *ResponseEndBlock { + if x, ok := m.GetValue().(*Response_EndBlock); ok { + return x.EndBlock + } + return nil } -func (m *ResponseCheckTx) Reset() { *m = ResponseCheckTx{} } -func (m *ResponseCheckTx) String() string { return proto.CompactTextString(m) } -func (*ResponseCheckTx) ProtoMessage() {} -func (*ResponseCheckTx) Descriptor() ([]byte, []int) { - return fileDescriptor_252557cfdd89a31a, []int{23} -} -func (m *ResponseCheckTx) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *ResponseCheckTx) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_ResponseCheckTx.Marshal(b, m, deterministic) - } else { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err - } - return b[:n], nil +func (m *Response) GetCommit() *ResponseCommit { + if x, ok := m.GetValue().(*Response_Commit); ok { + return x.Commit } + return nil } -func (m *ResponseCheckTx) XXX_Merge(src proto.Message) { - xxx_messageInfo_ResponseCheckTx.Merge(m, src) -} -func (m *ResponseCheckTx) XXX_Size() int { - return m.Size() -} -func (m *ResponseCheckTx) XXX_DiscardUnknown() { - xxx_messageInfo_ResponseCheckTx.DiscardUnknown(m) -} - -var xxx_messageInfo_ResponseCheckTx proto.InternalMessageInfo -func (m *ResponseCheckTx) GetCode() uint32 { - if m != nil { - return m.Code +func (m *Response) GetListSnapshots() *ResponseListSnapshots { + if x, ok := m.GetValue().(*Response_ListSnapshots); ok { + return x.ListSnapshots } - return 0 + return nil } -func (m *ResponseCheckTx) GetData() []byte { - if m != nil { - return m.Data +func (m *Response) GetOfferSnapshot() *ResponseOfferSnapshot { + if x, ok := m.GetValue().(*Response_OfferSnapshot); ok { + return x.OfferSnapshot } return nil } -func (m *ResponseCheckTx) GetLog() string { - if m != nil { - return m.Log +func (m *Response) GetLoadSnapshotChunk() *ResponseLoadSnapshotChunk { + if x, ok := m.GetValue().(*Response_LoadSnapshotChunk); ok { + return x.LoadSnapshotChunk } - return "" + return nil } -func (m *ResponseCheckTx) GetInfo() string { - if m != nil { - return m.Info +func (m *Response) GetApplySnapshotChunk() *ResponseApplySnapshotChunk { + if x, ok := m.GetValue().(*Response_ApplySnapshotChunk); ok { + return x.ApplySnapshotChunk } - return "" + return nil } -func (m *ResponseCheckTx) GetGasWanted() int64 { - if m != nil { - return m.GasWanted +func (m *Response) GetPrepareProposal() *ResponsePrepareProposal { + if x, ok := m.GetValue().(*Response_PrepareProposal); ok { + return x.PrepareProposal } - return 0 + return nil } -func (m *ResponseCheckTx) GetGasUsed() int64 { - if m != nil { - return m.GasUsed +func (m *Response) GetProcessProposal() *ResponseProcessProposal { + if x, ok := m.GetValue().(*Response_ProcessProposal); ok { + return x.ProcessProposal } - return 0 + return nil } -func (m *ResponseCheckTx) GetEvents() []Event { - if m != nil { - return m.Events +func (m *Response) GetExtendVote() *ResponseExtendVote { + if x, ok := m.GetValue().(*Response_ExtendVote); ok { + return x.ExtendVote } return nil } -func (m *ResponseCheckTx) GetCodespace() string { - if m != nil { - return m.Codespace - } - return "" -} - -func (m *ResponseCheckTx) GetSender() string { - if m != nil { - return m.Sender +func (m *Response) GetVerifyVoteExtension() *ResponseVerifyVoteExtension { + if x, ok := m.GetValue().(*Response_VerifyVoteExtension); ok { + return x.VerifyVoteExtension } - return "" + return nil } -func (m *ResponseCheckTx) GetPriority() int64 { - if m != nil { - return m.Priority +func (m *Response) GetFinalizeBlock() *ResponseFinalizeBlock { + if x, ok := m.GetValue().(*Response_FinalizeBlock); ok { + return x.FinalizeBlock } - return 0 + return nil } -func (m *ResponseCheckTx) GetMempoolError() string { - if m != nil { - return m.MempoolError +// XXX_OneofWrappers is for the internal use of the proto package. +func (*Response) XXX_OneofWrappers() []interface{} { + return []interface{}{ + (*Response_Exception)(nil), + (*Response_Echo)(nil), + (*Response_Flush)(nil), + (*Response_Info)(nil), + (*Response_InitChain)(nil), + (*Response_Query)(nil), + (*Response_BeginBlock)(nil), + (*Response_CheckTx)(nil), + (*Response_DeliverTx)(nil), + (*Response_EndBlock)(nil), + (*Response_Commit)(nil), + (*Response_ListSnapshots)(nil), + (*Response_OfferSnapshot)(nil), + (*Response_LoadSnapshotChunk)(nil), + (*Response_ApplySnapshotChunk)(nil), + (*Response_PrepareProposal)(nil), + (*Response_ProcessProposal)(nil), + (*Response_ExtendVote)(nil), + (*Response_VerifyVoteExtension)(nil), + (*Response_FinalizeBlock)(nil), } - return "" } -type ResponseDeliverTx struct { - Code uint32 `protobuf:"varint,1,opt,name=code,proto3" json:"code,omitempty"` - Data []byte `protobuf:"bytes,2,opt,name=data,proto3" json:"data,omitempty"` - Log string `protobuf:"bytes,3,opt,name=log,proto3" json:"log,omitempty"` - Info string `protobuf:"bytes,4,opt,name=info,proto3" json:"info,omitempty"` - GasWanted int64 `protobuf:"varint,5,opt,name=gas_wanted,proto3" json:"gas_wanted,omitempty"` - GasUsed int64 `protobuf:"varint,6,opt,name=gas_used,proto3" json:"gas_used,omitempty"` - Events []Event `protobuf:"bytes,7,rep,name=events,proto3" json:"events,omitempty"` - Codespace string `protobuf:"bytes,8,opt,name=codespace,proto3" json:"codespace,omitempty"` +// nondeterministic +type ResponseException struct { + Error string `protobuf:"bytes,1,opt,name=error,proto3" json:"error,omitempty"` } -func (m *ResponseDeliverTx) Reset() { *m = ResponseDeliverTx{} } -func (m *ResponseDeliverTx) String() string { return proto.CompactTextString(m) } -func (*ResponseDeliverTx) ProtoMessage() {} -func (*ResponseDeliverTx) Descriptor() ([]byte, []int) { - return fileDescriptor_252557cfdd89a31a, []int{24} +func (m *ResponseException) Reset() { *m = ResponseException{} } +func (m *ResponseException) String() string { return proto.CompactTextString(m) } +func (*ResponseException) ProtoMessage() {} +func (*ResponseException) Descriptor() ([]byte, []int) { + return fileDescriptor_252557cfdd89a31a, []int{21} } -func (m *ResponseDeliverTx) XXX_Unmarshal(b []byte) error { +func (m *ResponseException) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) } -func (m *ResponseDeliverTx) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { +func (m *ResponseException) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { if deterministic { - return xxx_messageInfo_ResponseDeliverTx.Marshal(b, m, deterministic) + return xxx_messageInfo_ResponseException.Marshal(b, m, deterministic) } else { b = b[:cap(b)] n, err := m.MarshalToSizedBuffer(b) @@ -2008,93 +2096,84 @@ func (m *ResponseDeliverTx) XXX_Marshal(b []byte, deterministic bool) ([]byte, e return b[:n], nil } } -func (m *ResponseDeliverTx) XXX_Merge(src proto.Message) { - xxx_messageInfo_ResponseDeliverTx.Merge(m, src) +func (m *ResponseException) XXX_Merge(src proto.Message) { + xxx_messageInfo_ResponseException.Merge(m, src) } -func (m *ResponseDeliverTx) XXX_Size() int { +func (m *ResponseException) XXX_Size() int { return m.Size() } -func (m *ResponseDeliverTx) XXX_DiscardUnknown() { - xxx_messageInfo_ResponseDeliverTx.DiscardUnknown(m) +func (m *ResponseException) XXX_DiscardUnknown() { + xxx_messageInfo_ResponseException.DiscardUnknown(m) } -var xxx_messageInfo_ResponseDeliverTx proto.InternalMessageInfo +var xxx_messageInfo_ResponseException proto.InternalMessageInfo -func (m *ResponseDeliverTx) GetCode() uint32 { +func (m *ResponseException) GetError() string { if m != nil { - return m.Code + return m.Error } - return 0 + return "" } -func (m *ResponseDeliverTx) GetData() []byte { - if m != nil { - return m.Data - } - return nil +type ResponseEcho struct { + Message string `protobuf:"bytes,1,opt,name=message,proto3" json:"message,omitempty"` } -func (m *ResponseDeliverTx) GetLog() string { - if m != nil { - return m.Log - } - return "" +func (m *ResponseEcho) Reset() { *m = ResponseEcho{} } +func (m *ResponseEcho) String() string { return proto.CompactTextString(m) } +func (*ResponseEcho) ProtoMessage() {} +func (*ResponseEcho) Descriptor() ([]byte, []int) { + return fileDescriptor_252557cfdd89a31a, []int{22} } - -func (m *ResponseDeliverTx) GetInfo() string { - if m != nil { - return m.Info - } - return "" +func (m *ResponseEcho) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) } - -func (m *ResponseDeliverTx) GetGasWanted() int64 { - if m != nil { - return m.GasWanted +func (m *ResponseEcho) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_ResponseEcho.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil } - return 0 } - -func (m *ResponseDeliverTx) GetGasUsed() int64 { - if m != nil { - return m.GasUsed - } - return 0 +func (m *ResponseEcho) XXX_Merge(src proto.Message) { + xxx_messageInfo_ResponseEcho.Merge(m, src) } - -func (m *ResponseDeliverTx) GetEvents() []Event { - if m != nil { - return m.Events - } - return nil +func (m *ResponseEcho) XXX_Size() int { + return m.Size() +} +func (m *ResponseEcho) XXX_DiscardUnknown() { + xxx_messageInfo_ResponseEcho.DiscardUnknown(m) } -func (m *ResponseDeliverTx) GetCodespace() string { +var xxx_messageInfo_ResponseEcho proto.InternalMessageInfo + +func (m *ResponseEcho) GetMessage() string { if m != nil { - return m.Codespace + return m.Message } return "" } -type ResponseEndBlock struct { - ConsensusParamUpdates *types1.ConsensusParams `protobuf:"bytes,2,opt,name=consensus_param_updates,json=consensusParamUpdates,proto3" json:"consensus_param_updates,omitempty"` - Events []Event `protobuf:"bytes,3,rep,name=events,proto3" json:"events,omitempty"` - NextCoreChainLockUpdate *types1.CoreChainLock `protobuf:"bytes,100,opt,name=next_core_chain_lock_update,json=nextCoreChainLockUpdate,proto3" json:"next_core_chain_lock_update,omitempty"` - ValidatorSetUpdate *ValidatorSetUpdate `protobuf:"bytes,101,opt,name=validator_set_update,json=validatorSetUpdate,proto3" json:"validator_set_update,omitempty"` +type ResponseFlush struct { } -func (m *ResponseEndBlock) Reset() { *m = ResponseEndBlock{} } -func (m *ResponseEndBlock) String() string { return proto.CompactTextString(m) } -func (*ResponseEndBlock) ProtoMessage() {} -func (*ResponseEndBlock) Descriptor() ([]byte, []int) { - return fileDescriptor_252557cfdd89a31a, []int{25} +func (m *ResponseFlush) Reset() { *m = ResponseFlush{} } +func (m *ResponseFlush) String() string { return proto.CompactTextString(m) } +func (*ResponseFlush) ProtoMessage() {} +func (*ResponseFlush) Descriptor() ([]byte, []int) { + return fileDescriptor_252557cfdd89a31a, []int{23} } -func (m *ResponseEndBlock) XXX_Unmarshal(b []byte) error { +func (m *ResponseFlush) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) } -func (m *ResponseEndBlock) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { +func (m *ResponseFlush) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { if deterministic { - return xxx_messageInfo_ResponseEndBlock.Marshal(b, m, deterministic) + return xxx_messageInfo_ResponseFlush.Marshal(b, m, deterministic) } else { b = b[:cap(b)] n, err := m.MarshalToSizedBuffer(b) @@ -2104,64 +2183,39 @@ func (m *ResponseEndBlock) XXX_Marshal(b []byte, deterministic bool) ([]byte, er return b[:n], nil } } -func (m *ResponseEndBlock) XXX_Merge(src proto.Message) { - xxx_messageInfo_ResponseEndBlock.Merge(m, src) +func (m *ResponseFlush) XXX_Merge(src proto.Message) { + xxx_messageInfo_ResponseFlush.Merge(m, src) } -func (m *ResponseEndBlock) XXX_Size() int { +func (m *ResponseFlush) XXX_Size() int { return m.Size() } -func (m *ResponseEndBlock) XXX_DiscardUnknown() { - xxx_messageInfo_ResponseEndBlock.DiscardUnknown(m) -} - -var xxx_messageInfo_ResponseEndBlock proto.InternalMessageInfo - -func (m *ResponseEndBlock) GetConsensusParamUpdates() *types1.ConsensusParams { - if m != nil { - return m.ConsensusParamUpdates - } - return nil -} - -func (m *ResponseEndBlock) GetEvents() []Event { - if m != nil { - return m.Events - } - return nil -} - -func (m *ResponseEndBlock) GetNextCoreChainLockUpdate() *types1.CoreChainLock { - if m != nil { - return m.NextCoreChainLockUpdate - } - return nil +func (m *ResponseFlush) XXX_DiscardUnknown() { + xxx_messageInfo_ResponseFlush.DiscardUnknown(m) } -func (m *ResponseEndBlock) GetValidatorSetUpdate() *ValidatorSetUpdate { - if m != nil { - return m.ValidatorSetUpdate - } - return nil -} +var xxx_messageInfo_ResponseFlush proto.InternalMessageInfo -type ResponseCommit struct { - // reserve 1 - Data []byte `protobuf:"bytes,2,opt,name=data,proto3" json:"data,omitempty"` - RetainHeight int64 `protobuf:"varint,3,opt,name=retain_height,json=retainHeight,proto3" json:"retain_height,omitempty"` +type ResponseInfo struct { + Data string `protobuf:"bytes,1,opt,name=data,proto3" json:"data,omitempty"` + // this is the software version of the application. TODO: remove? + Version string `protobuf:"bytes,2,opt,name=version,proto3" json:"version,omitempty"` + AppVersion uint64 `protobuf:"varint,3,opt,name=app_version,json=appVersion,proto3" json:"app_version,omitempty"` + LastBlockHeight int64 `protobuf:"varint,4,opt,name=last_block_height,json=lastBlockHeight,proto3" json:"last_block_height,omitempty"` + LastBlockAppHash []byte `protobuf:"bytes,5,opt,name=last_block_app_hash,json=lastBlockAppHash,proto3" json:"last_block_app_hash,omitempty"` } -func (m *ResponseCommit) Reset() { *m = ResponseCommit{} } -func (m *ResponseCommit) String() string { return proto.CompactTextString(m) } -func (*ResponseCommit) ProtoMessage() {} -func (*ResponseCommit) Descriptor() ([]byte, []int) { - return fileDescriptor_252557cfdd89a31a, []int{26} +func (m *ResponseInfo) Reset() { *m = ResponseInfo{} } +func (m *ResponseInfo) String() string { return proto.CompactTextString(m) } +func (*ResponseInfo) ProtoMessage() {} +func (*ResponseInfo) Descriptor() ([]byte, []int) { + return fileDescriptor_252557cfdd89a31a, []int{24} } -func (m *ResponseCommit) XXX_Unmarshal(b []byte) error { +func (m *ResponseInfo) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) } -func (m *ResponseCommit) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { +func (m *ResponseInfo) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { if deterministic { - return xxx_messageInfo_ResponseCommit.Marshal(b, m, deterministic) + return xxx_messageInfo_ResponseInfo.Marshal(b, m, deterministic) } else { b = b[:cap(b)] n, err := m.MarshalToSizedBuffer(b) @@ -2171,92 +2225,73 @@ func (m *ResponseCommit) XXX_Marshal(b []byte, deterministic bool) ([]byte, erro return b[:n], nil } } -func (m *ResponseCommit) XXX_Merge(src proto.Message) { - xxx_messageInfo_ResponseCommit.Merge(m, src) +func (m *ResponseInfo) XXX_Merge(src proto.Message) { + xxx_messageInfo_ResponseInfo.Merge(m, src) } -func (m *ResponseCommit) XXX_Size() int { +func (m *ResponseInfo) XXX_Size() int { return m.Size() } -func (m *ResponseCommit) XXX_DiscardUnknown() { - xxx_messageInfo_ResponseCommit.DiscardUnknown(m) +func (m *ResponseInfo) XXX_DiscardUnknown() { + xxx_messageInfo_ResponseInfo.DiscardUnknown(m) } -var xxx_messageInfo_ResponseCommit proto.InternalMessageInfo +var xxx_messageInfo_ResponseInfo proto.InternalMessageInfo -func (m *ResponseCommit) GetData() []byte { +func (m *ResponseInfo) GetData() string { if m != nil { return m.Data } - return nil + return "" } -func (m *ResponseCommit) GetRetainHeight() int64 { +func (m *ResponseInfo) GetVersion() string { if m != nil { - return m.RetainHeight + return m.Version } - return 0 + return "" } -type ResponseListSnapshots struct { - Snapshots []*Snapshot `protobuf:"bytes,1,rep,name=snapshots,proto3" json:"snapshots,omitempty"` +func (m *ResponseInfo) GetAppVersion() uint64 { + if m != nil { + return m.AppVersion + } + return 0 } -func (m *ResponseListSnapshots) Reset() { *m = ResponseListSnapshots{} } -func (m *ResponseListSnapshots) String() string { return proto.CompactTextString(m) } -func (*ResponseListSnapshots) ProtoMessage() {} -func (*ResponseListSnapshots) Descriptor() ([]byte, []int) { - return fileDescriptor_252557cfdd89a31a, []int{27} -} -func (m *ResponseListSnapshots) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *ResponseListSnapshots) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_ResponseListSnapshots.Marshal(b, m, deterministic) - } else { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err - } - return b[:n], nil +func (m *ResponseInfo) GetLastBlockHeight() int64 { + if m != nil { + return m.LastBlockHeight } + return 0 } -func (m *ResponseListSnapshots) XXX_Merge(src proto.Message) { - xxx_messageInfo_ResponseListSnapshots.Merge(m, src) -} -func (m *ResponseListSnapshots) XXX_Size() int { - return m.Size() -} -func (m *ResponseListSnapshots) XXX_DiscardUnknown() { - xxx_messageInfo_ResponseListSnapshots.DiscardUnknown(m) -} - -var xxx_messageInfo_ResponseListSnapshots proto.InternalMessageInfo -func (m *ResponseListSnapshots) GetSnapshots() []*Snapshot { +func (m *ResponseInfo) GetLastBlockAppHash() []byte { if m != nil { - return m.Snapshots + return m.LastBlockAppHash } return nil } -type ResponseOfferSnapshot struct { - Result ResponseOfferSnapshot_Result `protobuf:"varint,1,opt,name=result,proto3,enum=tendermint.abci.ResponseOfferSnapshot_Result" json:"result,omitempty"` +type ResponseInitChain struct { + ConsensusParams *types1.ConsensusParams `protobuf:"bytes,1,opt,name=consensus_params,json=consensusParams,proto3" json:"consensus_params,omitempty"` + AppHash []byte `protobuf:"bytes,3,opt,name=app_hash,json=appHash,proto3" json:"app_hash,omitempty"` + ValidatorSetUpdate ValidatorSetUpdate `protobuf:"bytes,100,opt,name=validator_set_update,json=validatorSetUpdate,proto3" json:"validator_set_update"` + NextCoreChainLockUpdate *types1.CoreChainLock `protobuf:"bytes,101,opt,name=next_core_chain_lock_update,json=nextCoreChainLockUpdate,proto3" json:"next_core_chain_lock_update,omitempty"` + InitialCoreHeight uint32 `protobuf:"varint,102,opt,name=initial_core_height,json=initialCoreHeight,proto3" json:"initial_core_height,omitempty"` } -func (m *ResponseOfferSnapshot) Reset() { *m = ResponseOfferSnapshot{} } -func (m *ResponseOfferSnapshot) String() string { return proto.CompactTextString(m) } -func (*ResponseOfferSnapshot) ProtoMessage() {} -func (*ResponseOfferSnapshot) Descriptor() ([]byte, []int) { - return fileDescriptor_252557cfdd89a31a, []int{28} +func (m *ResponseInitChain) Reset() { *m = ResponseInitChain{} } +func (m *ResponseInitChain) String() string { return proto.CompactTextString(m) } +func (*ResponseInitChain) ProtoMessage() {} +func (*ResponseInitChain) Descriptor() ([]byte, []int) { + return fileDescriptor_252557cfdd89a31a, []int{25} } -func (m *ResponseOfferSnapshot) XXX_Unmarshal(b []byte) error { +func (m *ResponseInitChain) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) } -func (m *ResponseOfferSnapshot) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { +func (m *ResponseInitChain) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { if deterministic { - return xxx_messageInfo_ResponseOfferSnapshot.Marshal(b, m, deterministic) + return xxx_messageInfo_ResponseInitChain.Marshal(b, m, deterministic) } else { b = b[:cap(b)] n, err := m.MarshalToSizedBuffer(b) @@ -2266,87 +2301,78 @@ func (m *ResponseOfferSnapshot) XXX_Marshal(b []byte, deterministic bool) ([]byt return b[:n], nil } } -func (m *ResponseOfferSnapshot) XXX_Merge(src proto.Message) { - xxx_messageInfo_ResponseOfferSnapshot.Merge(m, src) +func (m *ResponseInitChain) XXX_Merge(src proto.Message) { + xxx_messageInfo_ResponseInitChain.Merge(m, src) } -func (m *ResponseOfferSnapshot) XXX_Size() int { +func (m *ResponseInitChain) XXX_Size() int { return m.Size() } -func (m *ResponseOfferSnapshot) XXX_DiscardUnknown() { - xxx_messageInfo_ResponseOfferSnapshot.DiscardUnknown(m) +func (m *ResponseInitChain) XXX_DiscardUnknown() { + xxx_messageInfo_ResponseInitChain.DiscardUnknown(m) } -var xxx_messageInfo_ResponseOfferSnapshot proto.InternalMessageInfo +var xxx_messageInfo_ResponseInitChain proto.InternalMessageInfo -func (m *ResponseOfferSnapshot) GetResult() ResponseOfferSnapshot_Result { +func (m *ResponseInitChain) GetConsensusParams() *types1.ConsensusParams { if m != nil { - return m.Result + return m.ConsensusParams } - return ResponseOfferSnapshot_UNKNOWN + return nil } -type ResponseLoadSnapshotChunk struct { - Chunk []byte `protobuf:"bytes,1,opt,name=chunk,proto3" json:"chunk,omitempty"` +func (m *ResponseInitChain) GetAppHash() []byte { + if m != nil { + return m.AppHash + } + return nil } -func (m *ResponseLoadSnapshotChunk) Reset() { *m = ResponseLoadSnapshotChunk{} } -func (m *ResponseLoadSnapshotChunk) String() string { return proto.CompactTextString(m) } -func (*ResponseLoadSnapshotChunk) ProtoMessage() {} -func (*ResponseLoadSnapshotChunk) Descriptor() ([]byte, []int) { - return fileDescriptor_252557cfdd89a31a, []int{29} -} -func (m *ResponseLoadSnapshotChunk) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *ResponseLoadSnapshotChunk) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_ResponseLoadSnapshotChunk.Marshal(b, m, deterministic) - } else { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err - } - return b[:n], nil +func (m *ResponseInitChain) GetValidatorSetUpdate() ValidatorSetUpdate { + if m != nil { + return m.ValidatorSetUpdate } + return ValidatorSetUpdate{} } -func (m *ResponseLoadSnapshotChunk) XXX_Merge(src proto.Message) { - xxx_messageInfo_ResponseLoadSnapshotChunk.Merge(m, src) -} -func (m *ResponseLoadSnapshotChunk) XXX_Size() int { - return m.Size() -} -func (m *ResponseLoadSnapshotChunk) XXX_DiscardUnknown() { - xxx_messageInfo_ResponseLoadSnapshotChunk.DiscardUnknown(m) -} - -var xxx_messageInfo_ResponseLoadSnapshotChunk proto.InternalMessageInfo -func (m *ResponseLoadSnapshotChunk) GetChunk() []byte { +func (m *ResponseInitChain) GetNextCoreChainLockUpdate() *types1.CoreChainLock { if m != nil { - return m.Chunk + return m.NextCoreChainLockUpdate } return nil } -type ResponseApplySnapshotChunk struct { - Result ResponseApplySnapshotChunk_Result `protobuf:"varint,1,opt,name=result,proto3,enum=tendermint.abci.ResponseApplySnapshotChunk_Result" json:"result,omitempty"` - RefetchChunks []uint32 `protobuf:"varint,2,rep,packed,name=refetch_chunks,json=refetchChunks,proto3" json:"refetch_chunks,omitempty"` - RejectSenders []string `protobuf:"bytes,3,rep,name=reject_senders,json=rejectSenders,proto3" json:"reject_senders,omitempty"` +func (m *ResponseInitChain) GetInitialCoreHeight() uint32 { + if m != nil { + return m.InitialCoreHeight + } + return 0 } -func (m *ResponseApplySnapshotChunk) Reset() { *m = ResponseApplySnapshotChunk{} } -func (m *ResponseApplySnapshotChunk) String() string { return proto.CompactTextString(m) } -func (*ResponseApplySnapshotChunk) ProtoMessage() {} -func (*ResponseApplySnapshotChunk) Descriptor() ([]byte, []int) { - return fileDescriptor_252557cfdd89a31a, []int{30} +type ResponseQuery struct { + Code uint32 `protobuf:"varint,1,opt,name=code,proto3" json:"code,omitempty"` + // bytes data = 2; // use "value" instead. + Log string `protobuf:"bytes,3,opt,name=log,proto3" json:"log,omitempty"` + Info string `protobuf:"bytes,4,opt,name=info,proto3" json:"info,omitempty"` + Index int64 `protobuf:"varint,5,opt,name=index,proto3" json:"index,omitempty"` + Key []byte `protobuf:"bytes,6,opt,name=key,proto3" json:"key,omitempty"` + Value []byte `protobuf:"bytes,7,opt,name=value,proto3" json:"value,omitempty"` + ProofOps *crypto.ProofOps `protobuf:"bytes,8,opt,name=proof_ops,json=proofOps,proto3" json:"proof_ops,omitempty"` + Height int64 `protobuf:"varint,9,opt,name=height,proto3" json:"height,omitempty"` + Codespace string `protobuf:"bytes,10,opt,name=codespace,proto3" json:"codespace,omitempty"` } -func (m *ResponseApplySnapshotChunk) XXX_Unmarshal(b []byte) error { + +func (m *ResponseQuery) Reset() { *m = ResponseQuery{} } +func (m *ResponseQuery) String() string { return proto.CompactTextString(m) } +func (*ResponseQuery) ProtoMessage() {} +func (*ResponseQuery) Descriptor() ([]byte, []int) { + return fileDescriptor_252557cfdd89a31a, []int{26} +} +func (m *ResponseQuery) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) } -func (m *ResponseApplySnapshotChunk) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { +func (m *ResponseQuery) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { if deterministic { - return xxx_messageInfo_ResponseApplySnapshotChunk.Marshal(b, m, deterministic) + return xxx_messageInfo_ResponseQuery.Marshal(b, m, deterministic) } else { b = b[:cap(b)] n, err := m.MarshalToSizedBuffer(b) @@ -2356,127 +2382,97 @@ func (m *ResponseApplySnapshotChunk) XXX_Marshal(b []byte, deterministic bool) ( return b[:n], nil } } -func (m *ResponseApplySnapshotChunk) XXX_Merge(src proto.Message) { - xxx_messageInfo_ResponseApplySnapshotChunk.Merge(m, src) +func (m *ResponseQuery) XXX_Merge(src proto.Message) { + xxx_messageInfo_ResponseQuery.Merge(m, src) } -func (m *ResponseApplySnapshotChunk) XXX_Size() int { +func (m *ResponseQuery) XXX_Size() int { return m.Size() } -func (m *ResponseApplySnapshotChunk) XXX_DiscardUnknown() { - xxx_messageInfo_ResponseApplySnapshotChunk.DiscardUnknown(m) +func (m *ResponseQuery) XXX_DiscardUnknown() { + xxx_messageInfo_ResponseQuery.DiscardUnknown(m) } -var xxx_messageInfo_ResponseApplySnapshotChunk proto.InternalMessageInfo +var xxx_messageInfo_ResponseQuery proto.InternalMessageInfo -func (m *ResponseApplySnapshotChunk) GetResult() ResponseApplySnapshotChunk_Result { +func (m *ResponseQuery) GetCode() uint32 { if m != nil { - return m.Result + return m.Code } - return ResponseApplySnapshotChunk_UNKNOWN + return 0 } -func (m *ResponseApplySnapshotChunk) GetRefetchChunks() []uint32 { +func (m *ResponseQuery) GetLog() string { if m != nil { - return m.RefetchChunks + return m.Log } - return nil + return "" } -func (m *ResponseApplySnapshotChunk) GetRejectSenders() []string { +func (m *ResponseQuery) GetInfo() string { if m != nil { - return m.RejectSenders - } - return nil -} - -type LastCommitInfo struct { - Round int32 `protobuf:"varint,1,opt,name=round,proto3" json:"round,omitempty"` - QuorumHash []byte `protobuf:"bytes,3,opt,name=quorum_hash,json=quorumHash,proto3" json:"quorum_hash,omitempty"` - BlockSignature []byte `protobuf:"bytes,4,opt,name=block_signature,json=blockSignature,proto3" json:"block_signature,omitempty"` - StateSignature []byte `protobuf:"bytes,5,opt,name=state_signature,json=stateSignature,proto3" json:"state_signature,omitempty"` -} - -func (m *LastCommitInfo) Reset() { *m = LastCommitInfo{} } -func (m *LastCommitInfo) String() string { return proto.CompactTextString(m) } -func (*LastCommitInfo) ProtoMessage() {} -func (*LastCommitInfo) Descriptor() ([]byte, []int) { - return fileDescriptor_252557cfdd89a31a, []int{31} -} -func (m *LastCommitInfo) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *LastCommitInfo) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_LastCommitInfo.Marshal(b, m, deterministic) - } else { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err - } - return b[:n], nil + return m.Info } + return "" } -func (m *LastCommitInfo) XXX_Merge(src proto.Message) { - xxx_messageInfo_LastCommitInfo.Merge(m, src) -} -func (m *LastCommitInfo) XXX_Size() int { - return m.Size() -} -func (m *LastCommitInfo) XXX_DiscardUnknown() { - xxx_messageInfo_LastCommitInfo.DiscardUnknown(m) -} - -var xxx_messageInfo_LastCommitInfo proto.InternalMessageInfo -func (m *LastCommitInfo) GetRound() int32 { +func (m *ResponseQuery) GetIndex() int64 { if m != nil { - return m.Round + return m.Index } return 0 } -func (m *LastCommitInfo) GetQuorumHash() []byte { +func (m *ResponseQuery) GetKey() []byte { if m != nil { - return m.QuorumHash + return m.Key } return nil } -func (m *LastCommitInfo) GetBlockSignature() []byte { +func (m *ResponseQuery) GetValue() []byte { if m != nil { - return m.BlockSignature + return m.Value } return nil } -func (m *LastCommitInfo) GetStateSignature() []byte { +func (m *ResponseQuery) GetProofOps() *crypto.ProofOps { if m != nil { - return m.StateSignature + return m.ProofOps } return nil } -// Event allows application developers to attach additional information to -// ResponseBeginBlock, ResponseEndBlock, ResponseCheckTx and ResponseDeliverTx. -// Later, transactions may be queried using these events. -type Event struct { - Type string `protobuf:"bytes,1,opt,name=type,proto3" json:"type,omitempty"` - Attributes []EventAttribute `protobuf:"bytes,2,rep,name=attributes,proto3" json:"attributes,omitempty"` +func (m *ResponseQuery) GetHeight() int64 { + if m != nil { + return m.Height + } + return 0 } -func (m *Event) Reset() { *m = Event{} } -func (m *Event) String() string { return proto.CompactTextString(m) } -func (*Event) ProtoMessage() {} -func (*Event) Descriptor() ([]byte, []int) { - return fileDescriptor_252557cfdd89a31a, []int{32} +func (m *ResponseQuery) GetCodespace() string { + if m != nil { + return m.Codespace + } + return "" } -func (m *Event) XXX_Unmarshal(b []byte) error { + +type ResponseBeginBlock struct { + Events []Event `protobuf:"bytes,1,rep,name=events,proto3" json:"events,omitempty"` +} + +func (m *ResponseBeginBlock) Reset() { *m = ResponseBeginBlock{} } +func (m *ResponseBeginBlock) String() string { return proto.CompactTextString(m) } +func (*ResponseBeginBlock) ProtoMessage() {} +func (*ResponseBeginBlock) Descriptor() ([]byte, []int) { + return fileDescriptor_252557cfdd89a31a, []int{27} +} +func (m *ResponseBeginBlock) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) } -func (m *Event) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { +func (m *ResponseBeginBlock) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { if deterministic { - return xxx_messageInfo_Event.Marshal(b, m, deterministic) + return xxx_messageInfo_ResponseBeginBlock.Marshal(b, m, deterministic) } else { b = b[:cap(b)] n, err := m.MarshalToSizedBuffer(b) @@ -2486,51 +2482,52 @@ func (m *Event) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { return b[:n], nil } } -func (m *Event) XXX_Merge(src proto.Message) { - xxx_messageInfo_Event.Merge(m, src) +func (m *ResponseBeginBlock) XXX_Merge(src proto.Message) { + xxx_messageInfo_ResponseBeginBlock.Merge(m, src) } -func (m *Event) XXX_Size() int { +func (m *ResponseBeginBlock) XXX_Size() int { return m.Size() } -func (m *Event) XXX_DiscardUnknown() { - xxx_messageInfo_Event.DiscardUnknown(m) +func (m *ResponseBeginBlock) XXX_DiscardUnknown() { + xxx_messageInfo_ResponseBeginBlock.DiscardUnknown(m) } -var xxx_messageInfo_Event proto.InternalMessageInfo - -func (m *Event) GetType() string { - if m != nil { - return m.Type - } - return "" -} +var xxx_messageInfo_ResponseBeginBlock proto.InternalMessageInfo -func (m *Event) GetAttributes() []EventAttribute { +func (m *ResponseBeginBlock) GetEvents() []Event { if m != nil { - return m.Attributes + return m.Events } return nil } -// EventAttribute is a single key-value pair, associated with an event. -type EventAttribute struct { - Key string `protobuf:"bytes,1,opt,name=key,proto3" json:"key,omitempty"` - Value string `protobuf:"bytes,2,opt,name=value,proto3" json:"value,omitempty"` - Index bool `protobuf:"varint,3,opt,name=index,proto3" json:"index,omitempty"` +type ResponseCheckTx struct { + Code uint32 `protobuf:"varint,1,opt,name=code,proto3" json:"code,omitempty"` + Data []byte `protobuf:"bytes,2,opt,name=data,proto3" json:"data,omitempty"` + Log string `protobuf:"bytes,3,opt,name=log,proto3" json:"log,omitempty"` + Info string `protobuf:"bytes,4,opt,name=info,proto3" json:"info,omitempty"` + GasWanted int64 `protobuf:"varint,5,opt,name=gas_wanted,json=gasWanted,proto3" json:"gas_wanted,omitempty"` + GasUsed int64 `protobuf:"varint,6,opt,name=gas_used,json=gasUsed,proto3" json:"gas_used,omitempty"` + Events []Event `protobuf:"bytes,7,rep,name=events,proto3" json:"events,omitempty"` + Codespace string `protobuf:"bytes,8,opt,name=codespace,proto3" json:"codespace,omitempty"` + Sender string `protobuf:"bytes,9,opt,name=sender,proto3" json:"sender,omitempty"` + Priority int64 `protobuf:"varint,10,opt,name=priority,proto3" json:"priority,omitempty"` + // ABCI applications creating a ResponseCheckTX should not set mempool_error. + MempoolError string `protobuf:"bytes,11,opt,name=mempool_error,json=mempoolError,proto3" json:"mempool_error,omitempty"` } -func (m *EventAttribute) Reset() { *m = EventAttribute{} } -func (m *EventAttribute) String() string { return proto.CompactTextString(m) } -func (*EventAttribute) ProtoMessage() {} -func (*EventAttribute) Descriptor() ([]byte, []int) { - return fileDescriptor_252557cfdd89a31a, []int{33} +func (m *ResponseCheckTx) Reset() { *m = ResponseCheckTx{} } +func (m *ResponseCheckTx) String() string { return proto.CompactTextString(m) } +func (*ResponseCheckTx) ProtoMessage() {} +func (*ResponseCheckTx) Descriptor() ([]byte, []int) { + return fileDescriptor_252557cfdd89a31a, []int{28} } -func (m *EventAttribute) XXX_Unmarshal(b []byte) error { +func (m *ResponseCheckTx) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) } -func (m *EventAttribute) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { +func (m *ResponseCheckTx) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { if deterministic { - return xxx_messageInfo_EventAttribute.Marshal(b, m, deterministic) + return xxx_messageInfo_ResponseCheckTx.Marshal(b, m, deterministic) } else { b = b[:cap(b)] n, err := m.MarshalToSizedBuffer(b) @@ -2540,130 +2537,118 @@ func (m *EventAttribute) XXX_Marshal(b []byte, deterministic bool) ([]byte, erro return b[:n], nil } } -func (m *EventAttribute) XXX_Merge(src proto.Message) { - xxx_messageInfo_EventAttribute.Merge(m, src) +func (m *ResponseCheckTx) XXX_Merge(src proto.Message) { + xxx_messageInfo_ResponseCheckTx.Merge(m, src) } -func (m *EventAttribute) XXX_Size() int { +func (m *ResponseCheckTx) XXX_Size() int { return m.Size() } -func (m *EventAttribute) XXX_DiscardUnknown() { - xxx_messageInfo_EventAttribute.DiscardUnknown(m) +func (m *ResponseCheckTx) XXX_DiscardUnknown() { + xxx_messageInfo_ResponseCheckTx.DiscardUnknown(m) } -var xxx_messageInfo_EventAttribute proto.InternalMessageInfo +var xxx_messageInfo_ResponseCheckTx proto.InternalMessageInfo -func (m *EventAttribute) GetKey() string { +func (m *ResponseCheckTx) GetCode() uint32 { if m != nil { - return m.Key + return m.Code } - return "" + return 0 } -func (m *EventAttribute) GetValue() string { +func (m *ResponseCheckTx) GetData() []byte { if m != nil { - return m.Value + return m.Data } - return "" + return nil } -func (m *EventAttribute) GetIndex() bool { +func (m *ResponseCheckTx) GetLog() string { if m != nil { - return m.Index + return m.Log } - return false + return "" } -// TxResult contains results of executing the transaction. -// -// One usage is indexing transaction results. -type TxResult struct { - Height int64 `protobuf:"varint,1,opt,name=height,proto3" json:"height,omitempty"` - Index uint32 `protobuf:"varint,2,opt,name=index,proto3" json:"index,omitempty"` - Tx []byte `protobuf:"bytes,3,opt,name=tx,proto3" json:"tx,omitempty"` - Result ResponseDeliverTx `protobuf:"bytes,4,opt,name=result,proto3" json:"result"` +func (m *ResponseCheckTx) GetInfo() string { + if m != nil { + return m.Info + } + return "" } -func (m *TxResult) Reset() { *m = TxResult{} } -func (m *TxResult) String() string { return proto.CompactTextString(m) } -func (*TxResult) ProtoMessage() {} -func (*TxResult) Descriptor() ([]byte, []int) { - return fileDescriptor_252557cfdd89a31a, []int{34} -} -func (m *TxResult) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *TxResult) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_TxResult.Marshal(b, m, deterministic) - } else { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err - } - return b[:n], nil +func (m *ResponseCheckTx) GetGasWanted() int64 { + if m != nil { + return m.GasWanted } + return 0 } -func (m *TxResult) XXX_Merge(src proto.Message) { - xxx_messageInfo_TxResult.Merge(m, src) -} -func (m *TxResult) XXX_Size() int { - return m.Size() -} -func (m *TxResult) XXX_DiscardUnknown() { - xxx_messageInfo_TxResult.DiscardUnknown(m) + +func (m *ResponseCheckTx) GetGasUsed() int64 { + if m != nil { + return m.GasUsed + } + return 0 } -var xxx_messageInfo_TxResult proto.InternalMessageInfo +func (m *ResponseCheckTx) GetEvents() []Event { + if m != nil { + return m.Events + } + return nil +} -func (m *TxResult) GetHeight() int64 { +func (m *ResponseCheckTx) GetCodespace() string { if m != nil { - return m.Height + return m.Codespace } - return 0 + return "" } -func (m *TxResult) GetIndex() uint32 { +func (m *ResponseCheckTx) GetSender() string { if m != nil { - return m.Index + return m.Sender } - return 0 + return "" } -func (m *TxResult) GetTx() []byte { +func (m *ResponseCheckTx) GetPriority() int64 { if m != nil { - return m.Tx + return m.Priority } - return nil + return 0 } -func (m *TxResult) GetResult() ResponseDeliverTx { +func (m *ResponseCheckTx) GetMempoolError() string { if m != nil { - return m.Result + return m.MempoolError } - return ResponseDeliverTx{} + return "" } -// Validator -type Validator struct { - // bytes address = 1; // The first 20 bytes of SHA256(public key) - // PubKey pub_key = 2 [(gogoproto.nullable)=false]; - Power int64 `protobuf:"varint,3,opt,name=power,proto3" json:"power,omitempty"` - ProTxHash []byte `protobuf:"bytes,4,opt,name=pro_tx_hash,json=proTxHash,proto3" json:"pro_tx_hash,omitempty"` +type ResponseDeliverTx struct { + Code uint32 `protobuf:"varint,1,opt,name=code,proto3" json:"code,omitempty"` + Data []byte `protobuf:"bytes,2,opt,name=data,proto3" json:"data,omitempty"` + Log string `protobuf:"bytes,3,opt,name=log,proto3" json:"log,omitempty"` + Info string `protobuf:"bytes,4,opt,name=info,proto3" json:"info,omitempty"` + GasWanted int64 `protobuf:"varint,5,opt,name=gas_wanted,proto3" json:"gas_wanted,omitempty"` + GasUsed int64 `protobuf:"varint,6,opt,name=gas_used,proto3" json:"gas_used,omitempty"` + Events []Event `protobuf:"bytes,7,rep,name=events,proto3" json:"events,omitempty"` + Codespace string `protobuf:"bytes,8,opt,name=codespace,proto3" json:"codespace,omitempty"` } -func (m *Validator) Reset() { *m = Validator{} } -func (m *Validator) String() string { return proto.CompactTextString(m) } -func (*Validator) ProtoMessage() {} -func (*Validator) Descriptor() ([]byte, []int) { - return fileDescriptor_252557cfdd89a31a, []int{35} +func (m *ResponseDeliverTx) Reset() { *m = ResponseDeliverTx{} } +func (m *ResponseDeliverTx) String() string { return proto.CompactTextString(m) } +func (*ResponseDeliverTx) ProtoMessage() {} +func (*ResponseDeliverTx) Descriptor() ([]byte, []int) { + return fileDescriptor_252557cfdd89a31a, []int{29} } -func (m *Validator) XXX_Unmarshal(b []byte) error { +func (m *ResponseDeliverTx) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) } -func (m *Validator) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { +func (m *ResponseDeliverTx) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { if deterministic { - return xxx_messageInfo_Validator.Marshal(b, m, deterministic) + return xxx_messageInfo_ResponseDeliverTx.Marshal(b, m, deterministic) } else { b = b[:cap(b)] n, err := m.MarshalToSizedBuffer(b) @@ -2673,119 +2658,93 @@ func (m *Validator) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { return b[:n], nil } } -func (m *Validator) XXX_Merge(src proto.Message) { - xxx_messageInfo_Validator.Merge(m, src) +func (m *ResponseDeliverTx) XXX_Merge(src proto.Message) { + xxx_messageInfo_ResponseDeliverTx.Merge(m, src) } -func (m *Validator) XXX_Size() int { +func (m *ResponseDeliverTx) XXX_Size() int { return m.Size() } -func (m *Validator) XXX_DiscardUnknown() { - xxx_messageInfo_Validator.DiscardUnknown(m) +func (m *ResponseDeliverTx) XXX_DiscardUnknown() { + xxx_messageInfo_ResponseDeliverTx.DiscardUnknown(m) } -var xxx_messageInfo_Validator proto.InternalMessageInfo +var xxx_messageInfo_ResponseDeliverTx proto.InternalMessageInfo -func (m *Validator) GetPower() int64 { +func (m *ResponseDeliverTx) GetCode() uint32 { if m != nil { - return m.Power + return m.Code } return 0 } -func (m *Validator) GetProTxHash() []byte { +func (m *ResponseDeliverTx) GetData() []byte { if m != nil { - return m.ProTxHash + return m.Data } return nil } -// ValidatorUpdate -type ValidatorUpdate struct { - PubKey *crypto.PublicKey `protobuf:"bytes,1,opt,name=pub_key,json=pubKey,proto3" json:"pub_key,omitempty"` - Power int64 `protobuf:"varint,2,opt,name=power,proto3" json:"power,omitempty"` - ProTxHash []byte `protobuf:"bytes,3,opt,name=pro_tx_hash,json=proTxHash,proto3" json:"pro_tx_hash,omitempty"` - NodeAddress string `protobuf:"bytes,4,opt,name=node_address,json=nodeAddress,proto3" json:"node_address,omitempty"` +func (m *ResponseDeliverTx) GetLog() string { + if m != nil { + return m.Log + } + return "" } -func (m *ValidatorUpdate) Reset() { *m = ValidatorUpdate{} } -func (m *ValidatorUpdate) String() string { return proto.CompactTextString(m) } -func (*ValidatorUpdate) ProtoMessage() {} -func (*ValidatorUpdate) Descriptor() ([]byte, []int) { - return fileDescriptor_252557cfdd89a31a, []int{36} +func (m *ResponseDeliverTx) GetInfo() string { + if m != nil { + return m.Info + } + return "" } -func (m *ValidatorUpdate) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *ValidatorUpdate) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_ValidatorUpdate.Marshal(b, m, deterministic) - } else { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err - } - return b[:n], nil - } -} -func (m *ValidatorUpdate) XXX_Merge(src proto.Message) { - xxx_messageInfo_ValidatorUpdate.Merge(m, src) -} -func (m *ValidatorUpdate) XXX_Size() int { - return m.Size() -} -func (m *ValidatorUpdate) XXX_DiscardUnknown() { - xxx_messageInfo_ValidatorUpdate.DiscardUnknown(m) -} - -var xxx_messageInfo_ValidatorUpdate proto.InternalMessageInfo -func (m *ValidatorUpdate) GetPubKey() *crypto.PublicKey { +func (m *ResponseDeliverTx) GetGasWanted() int64 { if m != nil { - return m.PubKey + return m.GasWanted } - return nil + return 0 } -func (m *ValidatorUpdate) GetPower() int64 { +func (m *ResponseDeliverTx) GetGasUsed() int64 { if m != nil { - return m.Power + return m.GasUsed } return 0 } -func (m *ValidatorUpdate) GetProTxHash() []byte { +func (m *ResponseDeliverTx) GetEvents() []Event { if m != nil { - return m.ProTxHash + return m.Events } return nil } -func (m *ValidatorUpdate) GetNodeAddress() string { +func (m *ResponseDeliverTx) GetCodespace() string { if m != nil { - return m.NodeAddress + return m.Codespace } return "" } -type ValidatorSetUpdate struct { - ValidatorUpdates []ValidatorUpdate `protobuf:"bytes,1,rep,name=validator_updates,json=validatorUpdates,proto3" json:"validator_updates"` - ThresholdPublicKey crypto.PublicKey `protobuf:"bytes,2,opt,name=threshold_public_key,json=thresholdPublicKey,proto3" json:"threshold_public_key"` - QuorumHash []byte `protobuf:"bytes,3,opt,name=quorum_hash,json=quorumHash,proto3" json:"quorum_hash,omitempty"` +type ResponseEndBlock struct { + ConsensusParamUpdates *types1.ConsensusParams `protobuf:"bytes,2,opt,name=consensus_param_updates,json=consensusParamUpdates,proto3" json:"consensus_param_updates,omitempty"` + Events []Event `protobuf:"bytes,3,rep,name=events,proto3" json:"events,omitempty"` + NextCoreChainLockUpdate *types1.CoreChainLock `protobuf:"bytes,100,opt,name=next_core_chain_lock_update,json=nextCoreChainLockUpdate,proto3" json:"next_core_chain_lock_update,omitempty"` + ValidatorSetUpdate *ValidatorSetUpdate `protobuf:"bytes,101,opt,name=validator_set_update,json=validatorSetUpdate,proto3" json:"validator_set_update,omitempty"` } -func (m *ValidatorSetUpdate) Reset() { *m = ValidatorSetUpdate{} } -func (m *ValidatorSetUpdate) String() string { return proto.CompactTextString(m) } -func (*ValidatorSetUpdate) ProtoMessage() {} -func (*ValidatorSetUpdate) Descriptor() ([]byte, []int) { - return fileDescriptor_252557cfdd89a31a, []int{37} +func (m *ResponseEndBlock) Reset() { *m = ResponseEndBlock{} } +func (m *ResponseEndBlock) String() string { return proto.CompactTextString(m) } +func (*ResponseEndBlock) ProtoMessage() {} +func (*ResponseEndBlock) Descriptor() ([]byte, []int) { + return fileDescriptor_252557cfdd89a31a, []int{30} } -func (m *ValidatorSetUpdate) XXX_Unmarshal(b []byte) error { +func (m *ResponseEndBlock) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) } -func (m *ValidatorSetUpdate) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { +func (m *ResponseEndBlock) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { if deterministic { - return xxx_messageInfo_ValidatorSetUpdate.Marshal(b, m, deterministic) + return xxx_messageInfo_ResponseEndBlock.Marshal(b, m, deterministic) } else { b = b[:cap(b)] n, err := m.MarshalToSizedBuffer(b) @@ -2795,55 +2754,64 @@ func (m *ValidatorSetUpdate) XXX_Marshal(b []byte, deterministic bool) ([]byte, return b[:n], nil } } -func (m *ValidatorSetUpdate) XXX_Merge(src proto.Message) { - xxx_messageInfo_ValidatorSetUpdate.Merge(m, src) +func (m *ResponseEndBlock) XXX_Merge(src proto.Message) { + xxx_messageInfo_ResponseEndBlock.Merge(m, src) } -func (m *ValidatorSetUpdate) XXX_Size() int { +func (m *ResponseEndBlock) XXX_Size() int { return m.Size() } -func (m *ValidatorSetUpdate) XXX_DiscardUnknown() { - xxx_messageInfo_ValidatorSetUpdate.DiscardUnknown(m) +func (m *ResponseEndBlock) XXX_DiscardUnknown() { + xxx_messageInfo_ResponseEndBlock.DiscardUnknown(m) } -var xxx_messageInfo_ValidatorSetUpdate proto.InternalMessageInfo +var xxx_messageInfo_ResponseEndBlock proto.InternalMessageInfo -func (m *ValidatorSetUpdate) GetValidatorUpdates() []ValidatorUpdate { +func (m *ResponseEndBlock) GetConsensusParamUpdates() *types1.ConsensusParams { if m != nil { - return m.ValidatorUpdates + return m.ConsensusParamUpdates } return nil } -func (m *ValidatorSetUpdate) GetThresholdPublicKey() crypto.PublicKey { +func (m *ResponseEndBlock) GetEvents() []Event { if m != nil { - return m.ThresholdPublicKey + return m.Events } - return crypto.PublicKey{} + return nil } -func (m *ValidatorSetUpdate) GetQuorumHash() []byte { +func (m *ResponseEndBlock) GetNextCoreChainLockUpdate() *types1.CoreChainLock { if m != nil { - return m.QuorumHash + return m.NextCoreChainLockUpdate } return nil } -type ThresholdPublicKeyUpdate struct { - ThresholdPublicKey crypto.PublicKey `protobuf:"bytes,1,opt,name=threshold_public_key,json=thresholdPublicKey,proto3" json:"threshold_public_key"` +func (m *ResponseEndBlock) GetValidatorSetUpdate() *ValidatorSetUpdate { + if m != nil { + return m.ValidatorSetUpdate + } + return nil } -func (m *ThresholdPublicKeyUpdate) Reset() { *m = ThresholdPublicKeyUpdate{} } -func (m *ThresholdPublicKeyUpdate) String() string { return proto.CompactTextString(m) } -func (*ThresholdPublicKeyUpdate) ProtoMessage() {} -func (*ThresholdPublicKeyUpdate) Descriptor() ([]byte, []int) { - return fileDescriptor_252557cfdd89a31a, []int{38} +type ResponseCommit struct { + // reserve 1 + Data []byte `protobuf:"bytes,2,opt,name=data,proto3" json:"data,omitempty"` + RetainHeight int64 `protobuf:"varint,3,opt,name=retain_height,json=retainHeight,proto3" json:"retain_height,omitempty"` } -func (m *ThresholdPublicKeyUpdate) XXX_Unmarshal(b []byte) error { + +func (m *ResponseCommit) Reset() { *m = ResponseCommit{} } +func (m *ResponseCommit) String() string { return proto.CompactTextString(m) } +func (*ResponseCommit) ProtoMessage() {} +func (*ResponseCommit) Descriptor() ([]byte, []int) { + return fileDescriptor_252557cfdd89a31a, []int{31} +} +func (m *ResponseCommit) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) } -func (m *ThresholdPublicKeyUpdate) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { +func (m *ResponseCommit) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { if deterministic { - return xxx_messageInfo_ThresholdPublicKeyUpdate.Marshal(b, m, deterministic) + return xxx_messageInfo_ResponseCommit.Marshal(b, m, deterministic) } else { b = b[:cap(b)] n, err := m.MarshalToSizedBuffer(b) @@ -2853,41 +2821,48 @@ func (m *ThresholdPublicKeyUpdate) XXX_Marshal(b []byte, deterministic bool) ([] return b[:n], nil } } -func (m *ThresholdPublicKeyUpdate) XXX_Merge(src proto.Message) { - xxx_messageInfo_ThresholdPublicKeyUpdate.Merge(m, src) +func (m *ResponseCommit) XXX_Merge(src proto.Message) { + xxx_messageInfo_ResponseCommit.Merge(m, src) } -func (m *ThresholdPublicKeyUpdate) XXX_Size() int { +func (m *ResponseCommit) XXX_Size() int { return m.Size() } -func (m *ThresholdPublicKeyUpdate) XXX_DiscardUnknown() { - xxx_messageInfo_ThresholdPublicKeyUpdate.DiscardUnknown(m) +func (m *ResponseCommit) XXX_DiscardUnknown() { + xxx_messageInfo_ResponseCommit.DiscardUnknown(m) } -var xxx_messageInfo_ThresholdPublicKeyUpdate proto.InternalMessageInfo +var xxx_messageInfo_ResponseCommit proto.InternalMessageInfo -func (m *ThresholdPublicKeyUpdate) GetThresholdPublicKey() crypto.PublicKey { +func (m *ResponseCommit) GetData() []byte { if m != nil { - return m.ThresholdPublicKey + return m.Data } - return crypto.PublicKey{} + return nil } -type QuorumHashUpdate struct { - QuorumHash []byte `protobuf:"bytes,1,opt,name=quorum_hash,json=quorumHash,proto3" json:"quorum_hash,omitempty"` +func (m *ResponseCommit) GetRetainHeight() int64 { + if m != nil { + return m.RetainHeight + } + return 0 } -func (m *QuorumHashUpdate) Reset() { *m = QuorumHashUpdate{} } -func (m *QuorumHashUpdate) String() string { return proto.CompactTextString(m) } -func (*QuorumHashUpdate) ProtoMessage() {} -func (*QuorumHashUpdate) Descriptor() ([]byte, []int) { - return fileDescriptor_252557cfdd89a31a, []int{39} +type ResponseListSnapshots struct { + Snapshots []*Snapshot `protobuf:"bytes,1,rep,name=snapshots,proto3" json:"snapshots,omitempty"` } -func (m *QuorumHashUpdate) XXX_Unmarshal(b []byte) error { + +func (m *ResponseListSnapshots) Reset() { *m = ResponseListSnapshots{} } +func (m *ResponseListSnapshots) String() string { return proto.CompactTextString(m) } +func (*ResponseListSnapshots) ProtoMessage() {} +func (*ResponseListSnapshots) Descriptor() ([]byte, []int) { + return fileDescriptor_252557cfdd89a31a, []int{32} +} +func (m *ResponseListSnapshots) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) } -func (m *QuorumHashUpdate) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { +func (m *ResponseListSnapshots) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { if deterministic { - return xxx_messageInfo_QuorumHashUpdate.Marshal(b, m, deterministic) + return xxx_messageInfo_ResponseListSnapshots.Marshal(b, m, deterministic) } else { b = b[:cap(b)] n, err := m.MarshalToSizedBuffer(b) @@ -2897,43 +2872,41 @@ func (m *QuorumHashUpdate) XXX_Marshal(b []byte, deterministic bool) ([]byte, er return b[:n], nil } } -func (m *QuorumHashUpdate) XXX_Merge(src proto.Message) { - xxx_messageInfo_QuorumHashUpdate.Merge(m, src) +func (m *ResponseListSnapshots) XXX_Merge(src proto.Message) { + xxx_messageInfo_ResponseListSnapshots.Merge(m, src) } -func (m *QuorumHashUpdate) XXX_Size() int { +func (m *ResponseListSnapshots) XXX_Size() int { return m.Size() } -func (m *QuorumHashUpdate) XXX_DiscardUnknown() { - xxx_messageInfo_QuorumHashUpdate.DiscardUnknown(m) +func (m *ResponseListSnapshots) XXX_DiscardUnknown() { + xxx_messageInfo_ResponseListSnapshots.DiscardUnknown(m) } -var xxx_messageInfo_QuorumHashUpdate proto.InternalMessageInfo +var xxx_messageInfo_ResponseListSnapshots proto.InternalMessageInfo -func (m *QuorumHashUpdate) GetQuorumHash() []byte { +func (m *ResponseListSnapshots) GetSnapshots() []*Snapshot { if m != nil { - return m.QuorumHash + return m.Snapshots } return nil } -// VoteInfo -type VoteInfo struct { - Validator Validator `protobuf:"bytes,1,opt,name=validator,proto3" json:"validator"` - SignedLastBlock bool `protobuf:"varint,2,opt,name=signed_last_block,json=signedLastBlock,proto3" json:"signed_last_block,omitempty"` +type ResponseOfferSnapshot struct { + Result ResponseOfferSnapshot_Result `protobuf:"varint,1,opt,name=result,proto3,enum=tendermint.abci.ResponseOfferSnapshot_Result" json:"result,omitempty"` } -func (m *VoteInfo) Reset() { *m = VoteInfo{} } -func (m *VoteInfo) String() string { return proto.CompactTextString(m) } -func (*VoteInfo) ProtoMessage() {} -func (*VoteInfo) Descriptor() ([]byte, []int) { - return fileDescriptor_252557cfdd89a31a, []int{40} +func (m *ResponseOfferSnapshot) Reset() { *m = ResponseOfferSnapshot{} } +func (m *ResponseOfferSnapshot) String() string { return proto.CompactTextString(m) } +func (*ResponseOfferSnapshot) ProtoMessage() {} +func (*ResponseOfferSnapshot) Descriptor() ([]byte, []int) { + return fileDescriptor_252557cfdd89a31a, []int{33} } -func (m *VoteInfo) XXX_Unmarshal(b []byte) error { +func (m *ResponseOfferSnapshot) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) } -func (m *VoteInfo) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { +func (m *ResponseOfferSnapshot) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { if deterministic { - return xxx_messageInfo_VoteInfo.Marshal(b, m, deterministic) + return xxx_messageInfo_ResponseOfferSnapshot.Marshal(b, m, deterministic) } else { b = b[:cap(b)] n, err := m.MarshalToSizedBuffer(b) @@ -2943,58 +2916,41 @@ func (m *VoteInfo) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { return b[:n], nil } } -func (m *VoteInfo) XXX_Merge(src proto.Message) { - xxx_messageInfo_VoteInfo.Merge(m, src) +func (m *ResponseOfferSnapshot) XXX_Merge(src proto.Message) { + xxx_messageInfo_ResponseOfferSnapshot.Merge(m, src) } -func (m *VoteInfo) XXX_Size() int { +func (m *ResponseOfferSnapshot) XXX_Size() int { return m.Size() } -func (m *VoteInfo) XXX_DiscardUnknown() { - xxx_messageInfo_VoteInfo.DiscardUnknown(m) +func (m *ResponseOfferSnapshot) XXX_DiscardUnknown() { + xxx_messageInfo_ResponseOfferSnapshot.DiscardUnknown(m) } -var xxx_messageInfo_VoteInfo proto.InternalMessageInfo - -func (m *VoteInfo) GetValidator() Validator { - if m != nil { - return m.Validator - } - return Validator{} -} +var xxx_messageInfo_ResponseOfferSnapshot proto.InternalMessageInfo -func (m *VoteInfo) GetSignedLastBlock() bool { +func (m *ResponseOfferSnapshot) GetResult() ResponseOfferSnapshot_Result { if m != nil { - return m.SignedLastBlock + return m.Result } - return false + return ResponseOfferSnapshot_UNKNOWN } -type Evidence struct { - Type EvidenceType `protobuf:"varint,1,opt,name=type,proto3,enum=tendermint.abci.EvidenceType" json:"type,omitempty"` - // The offending validator - Validator Validator `protobuf:"bytes,2,opt,name=validator,proto3" json:"validator"` - // The height when the offense occurred - Height int64 `protobuf:"varint,3,opt,name=height,proto3" json:"height,omitempty"` - // The corresponding time where the offense occurred - Time time.Time `protobuf:"bytes,4,opt,name=time,proto3,stdtime" json:"time"` - // Total voting power of the validator set in case the ABCI application does - // not store historical validators. - // https://github.com/tendermint/tendermint/issues/4581 - TotalVotingPower int64 `protobuf:"varint,5,opt,name=total_voting_power,json=totalVotingPower,proto3" json:"total_voting_power,omitempty"` +type ResponseLoadSnapshotChunk struct { + Chunk []byte `protobuf:"bytes,1,opt,name=chunk,proto3" json:"chunk,omitempty"` } -func (m *Evidence) Reset() { *m = Evidence{} } -func (m *Evidence) String() string { return proto.CompactTextString(m) } -func (*Evidence) ProtoMessage() {} -func (*Evidence) Descriptor() ([]byte, []int) { - return fileDescriptor_252557cfdd89a31a, []int{41} +func (m *ResponseLoadSnapshotChunk) Reset() { *m = ResponseLoadSnapshotChunk{} } +func (m *ResponseLoadSnapshotChunk) String() string { return proto.CompactTextString(m) } +func (*ResponseLoadSnapshotChunk) ProtoMessage() {} +func (*ResponseLoadSnapshotChunk) Descriptor() ([]byte, []int) { + return fileDescriptor_252557cfdd89a31a, []int{34} } -func (m *Evidence) XXX_Unmarshal(b []byte) error { +func (m *ResponseLoadSnapshotChunk) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) } -func (m *Evidence) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { +func (m *ResponseLoadSnapshotChunk) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { if deterministic { - return xxx_messageInfo_Evidence.Marshal(b, m, deterministic) + return xxx_messageInfo_ResponseLoadSnapshotChunk.Marshal(b, m, deterministic) } else { b = b[:cap(b)] n, err := m.MarshalToSizedBuffer(b) @@ -3004,74 +2960,105 @@ func (m *Evidence) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { return b[:n], nil } } -func (m *Evidence) XXX_Merge(src proto.Message) { - xxx_messageInfo_Evidence.Merge(m, src) +func (m *ResponseLoadSnapshotChunk) XXX_Merge(src proto.Message) { + xxx_messageInfo_ResponseLoadSnapshotChunk.Merge(m, src) } -func (m *Evidence) XXX_Size() int { +func (m *ResponseLoadSnapshotChunk) XXX_Size() int { return m.Size() } -func (m *Evidence) XXX_DiscardUnknown() { - xxx_messageInfo_Evidence.DiscardUnknown(m) -} +func (m *ResponseLoadSnapshotChunk) XXX_DiscardUnknown() { + xxx_messageInfo_ResponseLoadSnapshotChunk.DiscardUnknown(m) +} -var xxx_messageInfo_Evidence proto.InternalMessageInfo +var xxx_messageInfo_ResponseLoadSnapshotChunk proto.InternalMessageInfo -func (m *Evidence) GetType() EvidenceType { +func (m *ResponseLoadSnapshotChunk) GetChunk() []byte { if m != nil { - return m.Type + return m.Chunk } - return EvidenceType_UNKNOWN + return nil } -func (m *Evidence) GetValidator() Validator { - if m != nil { - return m.Validator +type ResponseApplySnapshotChunk struct { + Result ResponseApplySnapshotChunk_Result `protobuf:"varint,1,opt,name=result,proto3,enum=tendermint.abci.ResponseApplySnapshotChunk_Result" json:"result,omitempty"` + RefetchChunks []uint32 `protobuf:"varint,2,rep,packed,name=refetch_chunks,json=refetchChunks,proto3" json:"refetch_chunks,omitempty"` + RejectSenders []string `protobuf:"bytes,3,rep,name=reject_senders,json=rejectSenders,proto3" json:"reject_senders,omitempty"` +} + +func (m *ResponseApplySnapshotChunk) Reset() { *m = ResponseApplySnapshotChunk{} } +func (m *ResponseApplySnapshotChunk) String() string { return proto.CompactTextString(m) } +func (*ResponseApplySnapshotChunk) ProtoMessage() {} +func (*ResponseApplySnapshotChunk) Descriptor() ([]byte, []int) { + return fileDescriptor_252557cfdd89a31a, []int{35} +} +func (m *ResponseApplySnapshotChunk) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *ResponseApplySnapshotChunk) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_ResponseApplySnapshotChunk.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil } - return Validator{} } +func (m *ResponseApplySnapshotChunk) XXX_Merge(src proto.Message) { + xxx_messageInfo_ResponseApplySnapshotChunk.Merge(m, src) +} +func (m *ResponseApplySnapshotChunk) XXX_Size() int { + return m.Size() +} +func (m *ResponseApplySnapshotChunk) XXX_DiscardUnknown() { + xxx_messageInfo_ResponseApplySnapshotChunk.DiscardUnknown(m) +} + +var xxx_messageInfo_ResponseApplySnapshotChunk proto.InternalMessageInfo -func (m *Evidence) GetHeight() int64 { +func (m *ResponseApplySnapshotChunk) GetResult() ResponseApplySnapshotChunk_Result { if m != nil { - return m.Height + return m.Result } - return 0 + return ResponseApplySnapshotChunk_UNKNOWN } -func (m *Evidence) GetTime() time.Time { +func (m *ResponseApplySnapshotChunk) GetRefetchChunks() []uint32 { if m != nil { - return m.Time + return m.RefetchChunks } - return time.Time{} + return nil } -func (m *Evidence) GetTotalVotingPower() int64 { +func (m *ResponseApplySnapshotChunk) GetRejectSenders() []string { if m != nil { - return m.TotalVotingPower + return m.RejectSenders } - return 0 + return nil } -type Snapshot struct { - Height uint64 `protobuf:"varint,1,opt,name=height,proto3" json:"height,omitempty"` - Format uint32 `protobuf:"varint,2,opt,name=format,proto3" json:"format,omitempty"` - Chunks uint32 `protobuf:"varint,3,opt,name=chunks,proto3" json:"chunks,omitempty"` - Hash []byte `protobuf:"bytes,4,opt,name=hash,proto3" json:"hash,omitempty"` - Metadata []byte `protobuf:"bytes,5,opt,name=metadata,proto3" json:"metadata,omitempty"` - CoreChainLockedHeight uint32 `protobuf:"varint,100,opt,name=core_chain_locked_height,json=coreChainLockedHeight,proto3" json:"core_chain_locked_height,omitempty"` +type ResponsePrepareProposal struct { + TxRecords []*TxRecord `protobuf:"bytes,1,rep,name=tx_records,json=txRecords,proto3" json:"tx_records,omitempty"` + AppHash []byte `protobuf:"bytes,2,opt,name=app_hash,json=appHash,proto3" json:"app_hash,omitempty"` + TxResults []*ExecTxResult `protobuf:"bytes,3,rep,name=tx_results,json=txResults,proto3" json:"tx_results,omitempty"` + ValidatorUpdates []*ValidatorUpdate `protobuf:"bytes,4,rep,name=validator_updates,json=validatorUpdates,proto3" json:"validator_updates,omitempty"` + ConsensusParamUpdates *types1.ConsensusParams `protobuf:"bytes,5,opt,name=consensus_param_updates,json=consensusParamUpdates,proto3" json:"consensus_param_updates,omitempty"` } -func (m *Snapshot) Reset() { *m = Snapshot{} } -func (m *Snapshot) String() string { return proto.CompactTextString(m) } -func (*Snapshot) ProtoMessage() {} -func (*Snapshot) Descriptor() ([]byte, []int) { - return fileDescriptor_252557cfdd89a31a, []int{42} +func (m *ResponsePrepareProposal) Reset() { *m = ResponsePrepareProposal{} } +func (m *ResponsePrepareProposal) String() string { return proto.CompactTextString(m) } +func (*ResponsePrepareProposal) ProtoMessage() {} +func (*ResponsePrepareProposal) Descriptor() ([]byte, []int) { + return fileDescriptor_252557cfdd89a31a, []int{36} } -func (m *Snapshot) XXX_Unmarshal(b []byte) error { +func (m *ResponsePrepareProposal) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) } -func (m *Snapshot) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { +func (m *ResponsePrepareProposal) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { if deterministic { - return xxx_messageInfo_Snapshot.Marshal(b, m, deterministic) + return xxx_messageInfo_ResponsePrepareProposal.Marshal(b, m, deterministic) } else { b = b[:cap(b)] n, err := m.MarshalToSizedBuffer(b) @@ -3081,2589 +3068,2260 @@ func (m *Snapshot) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { return b[:n], nil } } -func (m *Snapshot) XXX_Merge(src proto.Message) { - xxx_messageInfo_Snapshot.Merge(m, src) +func (m *ResponsePrepareProposal) XXX_Merge(src proto.Message) { + xxx_messageInfo_ResponsePrepareProposal.Merge(m, src) } -func (m *Snapshot) XXX_Size() int { +func (m *ResponsePrepareProposal) XXX_Size() int { return m.Size() } -func (m *Snapshot) XXX_DiscardUnknown() { - xxx_messageInfo_Snapshot.DiscardUnknown(m) +func (m *ResponsePrepareProposal) XXX_DiscardUnknown() { + xxx_messageInfo_ResponsePrepareProposal.DiscardUnknown(m) } -var xxx_messageInfo_Snapshot proto.InternalMessageInfo +var xxx_messageInfo_ResponsePrepareProposal proto.InternalMessageInfo -func (m *Snapshot) GetHeight() uint64 { +func (m *ResponsePrepareProposal) GetTxRecords() []*TxRecord { if m != nil { - return m.Height + return m.TxRecords } - return 0 + return nil } -func (m *Snapshot) GetFormat() uint32 { +func (m *ResponsePrepareProposal) GetAppHash() []byte { if m != nil { - return m.Format + return m.AppHash } - return 0 + return nil } -func (m *Snapshot) GetChunks() uint32 { +func (m *ResponsePrepareProposal) GetTxResults() []*ExecTxResult { if m != nil { - return m.Chunks + return m.TxResults } - return 0 + return nil } -func (m *Snapshot) GetHash() []byte { +func (m *ResponsePrepareProposal) GetValidatorUpdates() []*ValidatorUpdate { if m != nil { - return m.Hash + return m.ValidatorUpdates } return nil } -func (m *Snapshot) GetMetadata() []byte { +func (m *ResponsePrepareProposal) GetConsensusParamUpdates() *types1.ConsensusParams { if m != nil { - return m.Metadata + return m.ConsensusParamUpdates } return nil } -func (m *Snapshot) GetCoreChainLockedHeight() uint32 { - if m != nil { - return m.CoreChainLockedHeight - } - return 0 +type ResponseProcessProposal struct { + Status ResponseProcessProposal_ProposalStatus `protobuf:"varint,1,opt,name=status,proto3,enum=tendermint.abci.ResponseProcessProposal_ProposalStatus" json:"status,omitempty"` + AppHash []byte `protobuf:"bytes,2,opt,name=app_hash,json=appHash,proto3" json:"app_hash,omitempty"` + TxResults []*ExecTxResult `protobuf:"bytes,3,rep,name=tx_results,json=txResults,proto3" json:"tx_results,omitempty"` + ValidatorUpdates []*ValidatorUpdate `protobuf:"bytes,4,rep,name=validator_updates,json=validatorUpdates,proto3" json:"validator_updates,omitempty"` + ConsensusParamUpdates *types1.ConsensusParams `protobuf:"bytes,5,opt,name=consensus_param_updates,json=consensusParamUpdates,proto3" json:"consensus_param_updates,omitempty"` } -func init() { - proto.RegisterEnum("tendermint.abci.CheckTxType", CheckTxType_name, CheckTxType_value) - proto.RegisterEnum("tendermint.abci.EvidenceType", EvidenceType_name, EvidenceType_value) - proto.RegisterEnum("tendermint.abci.ResponseOfferSnapshot_Result", ResponseOfferSnapshot_Result_name, ResponseOfferSnapshot_Result_value) - proto.RegisterEnum("tendermint.abci.ResponseApplySnapshotChunk_Result", ResponseApplySnapshotChunk_Result_name, ResponseApplySnapshotChunk_Result_value) - proto.RegisterType((*Request)(nil), "tendermint.abci.Request") - proto.RegisterType((*RequestEcho)(nil), "tendermint.abci.RequestEcho") - proto.RegisterType((*RequestFlush)(nil), "tendermint.abci.RequestFlush") - proto.RegisterType((*RequestInfo)(nil), "tendermint.abci.RequestInfo") - proto.RegisterType((*RequestInitChain)(nil), "tendermint.abci.RequestInitChain") - proto.RegisterType((*RequestQuery)(nil), "tendermint.abci.RequestQuery") - proto.RegisterType((*RequestBeginBlock)(nil), "tendermint.abci.RequestBeginBlock") - proto.RegisterType((*RequestCheckTx)(nil), "tendermint.abci.RequestCheckTx") - proto.RegisterType((*RequestDeliverTx)(nil), "tendermint.abci.RequestDeliverTx") - proto.RegisterType((*RequestEndBlock)(nil), "tendermint.abci.RequestEndBlock") - proto.RegisterType((*RequestCommit)(nil), "tendermint.abci.RequestCommit") - proto.RegisterType((*RequestListSnapshots)(nil), "tendermint.abci.RequestListSnapshots") - proto.RegisterType((*RequestOfferSnapshot)(nil), "tendermint.abci.RequestOfferSnapshot") - proto.RegisterType((*RequestLoadSnapshotChunk)(nil), "tendermint.abci.RequestLoadSnapshotChunk") - proto.RegisterType((*RequestApplySnapshotChunk)(nil), "tendermint.abci.RequestApplySnapshotChunk") - proto.RegisterType((*Response)(nil), "tendermint.abci.Response") - proto.RegisterType((*ResponseException)(nil), "tendermint.abci.ResponseException") - proto.RegisterType((*ResponseEcho)(nil), "tendermint.abci.ResponseEcho") - proto.RegisterType((*ResponseFlush)(nil), "tendermint.abci.ResponseFlush") - proto.RegisterType((*ResponseInfo)(nil), "tendermint.abci.ResponseInfo") - proto.RegisterType((*ResponseInitChain)(nil), "tendermint.abci.ResponseInitChain") - proto.RegisterType((*ResponseQuery)(nil), "tendermint.abci.ResponseQuery") - proto.RegisterType((*ResponseBeginBlock)(nil), "tendermint.abci.ResponseBeginBlock") - proto.RegisterType((*ResponseCheckTx)(nil), "tendermint.abci.ResponseCheckTx") - proto.RegisterType((*ResponseDeliverTx)(nil), "tendermint.abci.ResponseDeliverTx") - proto.RegisterType((*ResponseEndBlock)(nil), "tendermint.abci.ResponseEndBlock") - proto.RegisterType((*ResponseCommit)(nil), "tendermint.abci.ResponseCommit") - proto.RegisterType((*ResponseListSnapshots)(nil), "tendermint.abci.ResponseListSnapshots") - proto.RegisterType((*ResponseOfferSnapshot)(nil), "tendermint.abci.ResponseOfferSnapshot") - proto.RegisterType((*ResponseLoadSnapshotChunk)(nil), "tendermint.abci.ResponseLoadSnapshotChunk") - proto.RegisterType((*ResponseApplySnapshotChunk)(nil), "tendermint.abci.ResponseApplySnapshotChunk") - proto.RegisterType((*LastCommitInfo)(nil), "tendermint.abci.LastCommitInfo") - proto.RegisterType((*Event)(nil), "tendermint.abci.Event") - proto.RegisterType((*EventAttribute)(nil), "tendermint.abci.EventAttribute") - proto.RegisterType((*TxResult)(nil), "tendermint.abci.TxResult") - proto.RegisterType((*Validator)(nil), "tendermint.abci.Validator") - proto.RegisterType((*ValidatorUpdate)(nil), "tendermint.abci.ValidatorUpdate") - proto.RegisterType((*ValidatorSetUpdate)(nil), "tendermint.abci.ValidatorSetUpdate") - proto.RegisterType((*ThresholdPublicKeyUpdate)(nil), "tendermint.abci.ThresholdPublicKeyUpdate") - proto.RegisterType((*QuorumHashUpdate)(nil), "tendermint.abci.QuorumHashUpdate") - proto.RegisterType((*VoteInfo)(nil), "tendermint.abci.VoteInfo") - proto.RegisterType((*Evidence)(nil), "tendermint.abci.Evidence") - proto.RegisterType((*Snapshot)(nil), "tendermint.abci.Snapshot") +func (m *ResponseProcessProposal) Reset() { *m = ResponseProcessProposal{} } +func (m *ResponseProcessProposal) String() string { return proto.CompactTextString(m) } +func (*ResponseProcessProposal) ProtoMessage() {} +func (*ResponseProcessProposal) Descriptor() ([]byte, []int) { + return fileDescriptor_252557cfdd89a31a, []int{37} } - -func init() { proto.RegisterFile("tendermint/abci/types.proto", fileDescriptor_252557cfdd89a31a) } - -var fileDescriptor_252557cfdd89a31a = []byte{ - // 2912 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xe4, 0x5a, 0x4b, 0x73, 0xe3, 0xc6, - 0xf1, 0x27, 0xf8, 0x66, 0xf3, 0x21, 0x6a, 0x56, 0x5e, 0xd3, 0xf4, 0xae, 0xb4, 0x86, 0xcb, 0xf6, - 0x7a, 0x6d, 0x4b, 0x7f, 0x6b, 0xcb, 0xaf, 0xfa, 0xe7, 0x61, 0x92, 0xe6, 0x86, 0xf2, 0x2a, 0x92, - 0x3c, 0xe2, 0xae, 0xcb, 0x71, 0xbc, 0x30, 0x48, 0x8c, 0x44, 0x78, 0x49, 0x00, 0x06, 0x86, 0xb2, - 0xe4, 0xb3, 0x73, 0xf1, 0xc9, 0xc7, 0xe4, 0xe0, 0xaa, 0x7c, 0x81, 0x54, 0x3e, 0x40, 0xaa, 0x72, - 0xf6, 0x25, 0x55, 0x3e, 0xe6, 0x90, 0x38, 0x2e, 0xef, 0x25, 0x95, 0x6b, 0x0e, 0x39, 0xa5, 0x2a, - 0x35, 0x0f, 0x80, 0x00, 0x49, 0x90, 0x54, 0xf6, 0x98, 0xdb, 0x4c, 0x4f, 0x77, 0x63, 0xa6, 0x07, - 0xf3, 0xeb, 0xdf, 0x34, 0x00, 0x4f, 0x53, 0x62, 0x19, 0xc4, 0x1d, 0x99, 0x16, 0xdd, 0xd1, 0x7b, - 0x7d, 0x73, 0x87, 0x5e, 0x38, 0xc4, 0xdb, 0x76, 0x5c, 0x9b, 0xda, 0x68, 0x6d, 0x32, 0xb8, 0xcd, - 0x06, 0xeb, 0xd7, 0x43, 0xda, 0x7d, 0xf7, 0xc2, 0xa1, 0xf6, 0x8e, 0xe3, 0xda, 0xf6, 0x89, 0xd0, - 0xaf, 0x5f, 0x0b, 0x0d, 0x73, 0x3f, 0x61, 0x6f, 0x91, 0x51, 0x69, 0xfc, 0x90, 0x5c, 0xf8, 0xa3, - 0xd7, 0x67, 0x6c, 0x1d, 0xdd, 0xd5, 0x47, 0xfe, 0xf0, 0xd6, 0xa9, 0x6d, 0x9f, 0x0e, 0xc9, 0x0e, - 0xef, 0xf5, 0xc6, 0x27, 0x3b, 0xd4, 0x1c, 0x11, 0x8f, 0xea, 0x23, 0x47, 0x2a, 0x6c, 0x9c, 0xda, - 0xa7, 0x36, 0x6f, 0xee, 0xb0, 0x96, 0x90, 0xaa, 0x7f, 0xca, 0x41, 0x0e, 0x93, 0x4f, 0xc7, 0xc4, - 0xa3, 0x68, 0x17, 0xd2, 0xa4, 0x3f, 0xb0, 0x6b, 0xca, 0x0d, 0xe5, 0x66, 0x71, 0xf7, 0xda, 0xf6, - 0xd4, 0xe2, 0xb6, 0xa5, 0x5e, 0xbb, 0x3f, 0xb0, 0x3b, 0x09, 0xcc, 0x75, 0xd1, 0x6b, 0x90, 0x39, - 0x19, 0x8e, 0xbd, 0x41, 0x2d, 0xc9, 0x8d, 0xae, 0xc7, 0x19, 0xdd, 0x61, 0x4a, 0x9d, 0x04, 0x16, - 0xda, 0xec, 0x51, 0xa6, 0x75, 0x62, 0xd7, 0x52, 0x8b, 0x1f, 0xb5, 0x67, 0x9d, 0xf0, 0x47, 0x31, - 0x5d, 0xd4, 0x04, 0x30, 0x2d, 0x93, 0x6a, 0xfd, 0x81, 0x6e, 0x5a, 0xb5, 0x34, 0xb7, 0x7c, 0x26, - 0xde, 0xd2, 0xa4, 0x2d, 0xa6, 0xd8, 0x49, 0xe0, 0x82, 0xe9, 0x77, 0xd8, 0x74, 0x3f, 0x1d, 0x13, - 0xf7, 0xa2, 0x96, 0x59, 0x3c, 0xdd, 0xf7, 0x98, 0x12, 0x9b, 0x2e, 0xd7, 0x46, 0x6d, 0x28, 0xf6, - 0xc8, 0xa9, 0x69, 0x69, 0xbd, 0xa1, 0xdd, 0x7f, 0x58, 0xcb, 0x72, 0x63, 0x35, 0xce, 0xb8, 0xc9, - 0x54, 0x9b, 0x4c, 0xb3, 0x93, 0xc0, 0xd0, 0x0b, 0x7a, 0xe8, 0x47, 0x90, 0xef, 0x0f, 0x48, 0xff, - 0xa1, 0x46, 0xcf, 0x6b, 0x39, 0xee, 0x63, 0x2b, 0xce, 0x47, 0x8b, 0xe9, 0x75, 0xcf, 0x3b, 0x09, - 0x9c, 0xeb, 0x8b, 0x26, 0x5b, 0xbf, 0x41, 0x86, 0xe6, 0x19, 0x71, 0x99, 0x7d, 0x7e, 0xf1, 0xfa, - 0xdf, 0x11, 0x9a, 0xdc, 0x43, 0xc1, 0xf0, 0x3b, 0xe8, 0xa7, 0x50, 0x20, 0x96, 0x21, 0x97, 0x51, - 0xe0, 0x2e, 0x6e, 0xc4, 0xee, 0xb3, 0x65, 0xf8, 0x8b, 0xc8, 0x13, 0xd9, 0x46, 0x6f, 0x42, 0xb6, - 0x6f, 0x8f, 0x46, 0x26, 0xad, 0x01, 0xb7, 0xde, 0x8c, 0x5d, 0x00, 0xd7, 0xea, 0x24, 0xb0, 0xd4, - 0x47, 0x07, 0x50, 0x19, 0x9a, 0x1e, 0xd5, 0x3c, 0x4b, 0x77, 0xbc, 0x81, 0x4d, 0xbd, 0x5a, 0x91, - 0x7b, 0x78, 0x2e, 0xce, 0xc3, 0xbe, 0xe9, 0xd1, 0x63, 0x5f, 0xb9, 0x93, 0xc0, 0xe5, 0x61, 0x58, - 0xc0, 0xfc, 0xd9, 0x27, 0x27, 0xc4, 0x0d, 0x1c, 0xd6, 0x4a, 0x8b, 0xfd, 0x1d, 0x32, 0x6d, 0xdf, - 0x9e, 0xf9, 0xb3, 0xc3, 0x02, 0xf4, 0x21, 0x5c, 0x19, 0xda, 0xba, 0x11, 0xb8, 0xd3, 0xfa, 0x83, - 0xb1, 0xf5, 0xb0, 0x56, 0xe6, 0x4e, 0x5f, 0x8c, 0x9d, 0xa4, 0xad, 0x1b, 0xbe, 0x8b, 0x16, 0x33, - 0xe8, 0x24, 0xf0, 0xfa, 0x70, 0x5a, 0x88, 0x1e, 0xc0, 0x86, 0xee, 0x38, 0xc3, 0x8b, 0x69, 0xef, - 0x15, 0xee, 0xfd, 0x56, 0x9c, 0xf7, 0x06, 0xb3, 0x99, 0x76, 0x8f, 0xf4, 0x19, 0x69, 0x33, 0x07, - 0x99, 0x33, 0x7d, 0x38, 0x26, 0xea, 0x0b, 0x50, 0x0c, 0x1d, 0x53, 0x54, 0x83, 0xdc, 0x88, 0x78, - 0x9e, 0x7e, 0x4a, 0xf8, 0xa9, 0x2e, 0x60, 0xbf, 0xab, 0x56, 0xa0, 0x14, 0x3e, 0x9a, 0xea, 0x57, - 0x4a, 0x60, 0xc9, 0x4e, 0x1d, 0xb3, 0x3c, 0x23, 0xae, 0x67, 0xda, 0x96, 0x6f, 0x29, 0xbb, 0xe8, - 0x59, 0x28, 0xf3, 0xf7, 0x47, 0xf3, 0xc7, 0xd9, 0xd1, 0x4f, 0xe3, 0x12, 0x17, 0xde, 0x97, 0x4a, - 0x5b, 0x50, 0x74, 0x76, 0x9d, 0x40, 0x25, 0xc5, 0x55, 0xc0, 0xd9, 0x75, 0x7c, 0x85, 0x67, 0xa0, - 0xc4, 0x56, 0x1a, 0x68, 0xa4, 0xf9, 0x43, 0x8a, 0x4c, 0x26, 0x55, 0xd4, 0x2f, 0x52, 0x50, 0x9d, - 0x3e, 0xce, 0xe8, 0x4d, 0x48, 0x33, 0x64, 0x93, 0x20, 0x55, 0xdf, 0x16, 0xb0, 0xb7, 0xed, 0xc3, - 0xde, 0x76, 0xd7, 0x87, 0xbd, 0x66, 0xfe, 0x9b, 0xef, 0xb6, 0x12, 0x5f, 0xfd, 0x6d, 0x4b, 0xc1, - 0xdc, 0x02, 0x3d, 0xc5, 0x4e, 0x9f, 0x6e, 0x5a, 0x9a, 0x69, 0xf0, 0x29, 0x17, 0xd8, 0xd1, 0xd2, - 0x4d, 0x6b, 0xcf, 0x40, 0xfb, 0x50, 0xed, 0xdb, 0x96, 0x47, 0x2c, 0x6f, 0xec, 0x69, 0x02, 0x56, - 0x25, 0x34, 0x45, 0x0e, 0x98, 0x00, 0xeb, 0x96, 0xaf, 0x79, 0xc4, 0x15, 0xf1, 0x5a, 0x3f, 0x2a, - 0x40, 0x07, 0x50, 0x3e, 0xd3, 0x87, 0xa6, 0xa1, 0x53, 0xdb, 0xd5, 0x3c, 0x42, 0x25, 0x56, 0x3d, - 0x3b, 0xb3, 0xcb, 0xf7, 0x7d, 0xad, 0x63, 0x42, 0xef, 0x39, 0x86, 0x4e, 0x49, 0x33, 0xfd, 0xcd, - 0x77, 0x5b, 0x0a, 0x2e, 0x9d, 0x85, 0x46, 0xd0, 0xf3, 0xb0, 0xa6, 0x3b, 0x8e, 0xe6, 0x51, 0x9d, - 0x12, 0xad, 0x77, 0x41, 0x89, 0xc7, 0xe1, 0xab, 0x84, 0xcb, 0xba, 0xe3, 0x1c, 0x33, 0x69, 0x93, - 0x09, 0xd1, 0x73, 0x50, 0x61, 0x48, 0x67, 0xea, 0x43, 0x6d, 0x40, 0xcc, 0xd3, 0x01, 0xe5, 0x40, - 0x95, 0xc2, 0x65, 0x29, 0xed, 0x70, 0x21, 0xda, 0x86, 0x2b, 0xbe, 0x5a, 0xdf, 0x76, 0x89, 0xaf, - 0xcb, 0x00, 0xa9, 0x8c, 0xd7, 0xe5, 0x50, 0xcb, 0x76, 0x89, 0xd0, 0x57, 0x8d, 0xe0, 0x4d, 0xe1, - 0xa8, 0x88, 0x10, 0xa4, 0x0d, 0x9d, 0xea, 0x7c, 0x07, 0x4a, 0x98, 0xb7, 0x99, 0xcc, 0xd1, 0xe9, - 0x40, 0xc6, 0x95, 0xb7, 0xd1, 0x55, 0xc8, 0x4a, 0xd7, 0x29, 0x3e, 0x0d, 0xd9, 0x43, 0x1b, 0x90, - 0x71, 0x5c, 0xfb, 0x8c, 0xf0, 0xb0, 0xe4, 0xb1, 0xe8, 0xa8, 0x5f, 0x24, 0x61, 0x7d, 0x06, 0x3f, - 0x99, 0xdf, 0x81, 0xee, 0x0d, 0xfc, 0x67, 0xb1, 0x36, 0x7a, 0x9d, 0xf9, 0xd5, 0x0d, 0xe2, 0xca, - 0x9c, 0x53, 0x9b, 0xdd, 0xa2, 0x0e, 0x1f, 0xe7, 0xc1, 0x4c, 0x60, 0xa9, 0x8d, 0x0e, 0xa1, 0x3a, - 0xd4, 0x3d, 0xaa, 0x09, 0x3c, 0xd2, 0x42, 0xf9, 0x67, 0x16, 0x85, 0xf7, 0x75, 0x1f, 0xc1, 0xd8, - 0x61, 0x90, 0x8e, 0x2a, 0xc3, 0x88, 0x14, 0x61, 0xd8, 0xe8, 0x5d, 0x7c, 0xae, 0x5b, 0xd4, 0xb4, - 0x88, 0x16, 0xec, 0x98, 0x57, 0x4b, 0xdf, 0x48, 0xdd, 0x2c, 0xee, 0x3e, 0x35, 0xe3, 0xb4, 0x7d, - 0x66, 0x1a, 0xc4, 0xea, 0x13, 0xe9, 0xee, 0x4a, 0x60, 0x1c, 0xbc, 0x07, 0x9e, 0x8a, 0xa1, 0x12, - 0xcd, 0x00, 0xa8, 0x02, 0x49, 0x7a, 0x2e, 0x03, 0x90, 0xa4, 0xe7, 0xe8, 0xff, 0x20, 0xcd, 0x16, - 0xc9, 0x17, 0x5f, 0x99, 0x93, 0x3a, 0xa5, 0x5d, 0xf7, 0xc2, 0x21, 0x98, 0x6b, 0xaa, 0x6a, 0x70, - 0x8c, 0x82, 0xac, 0x30, 0xed, 0x55, 0x7d, 0x11, 0xd6, 0xa6, 0x60, 0x3f, 0xb4, 0x7f, 0x4a, 0x78, - 0xff, 0xd4, 0x35, 0x28, 0x47, 0x30, 0x5e, 0xbd, 0x0a, 0x1b, 0xf3, 0x20, 0x5b, 0x1d, 0x04, 0xf2, - 0x08, 0xf4, 0xa2, 0xd7, 0x20, 0x1f, 0x60, 0xb6, 0x38, 0xc6, 0xb3, 0xb1, 0xf2, 0x95, 0x71, 0xa0, - 0xca, 0xce, 0x2f, 0x3b, 0x06, 0xfc, 0x7d, 0x48, 0xf2, 0x89, 0xe7, 0x74, 0xc7, 0xe9, 0xe8, 0xde, - 0x40, 0xfd, 0x18, 0x6a, 0x71, 0x78, 0x3c, 0xb5, 0x8c, 0x74, 0xf0, 0x1a, 0x5e, 0x85, 0xec, 0x89, - 0xed, 0x8e, 0x74, 0xca, 0x9d, 0x95, 0xb1, 0xec, 0xb1, 0xd7, 0x53, 0x60, 0x73, 0x8a, 0x8b, 0x45, - 0x47, 0xd5, 0xe0, 0xa9, 0x58, 0x4c, 0x66, 0x26, 0xa6, 0x65, 0x10, 0x11, 0xcf, 0x32, 0x16, 0x9d, - 0x89, 0x23, 0x31, 0x59, 0xd1, 0x61, 0x8f, 0xf5, 0xf8, 0x5a, 0xb9, 0xff, 0x02, 0x96, 0x3d, 0xf5, - 0xb7, 0x79, 0xc8, 0x63, 0xe2, 0x39, 0x0c, 0x4b, 0x50, 0x13, 0x0a, 0xe4, 0xbc, 0x4f, 0x1c, 0xea, - 0xc3, 0xef, 0x7c, 0xb6, 0x21, 0xb4, 0xdb, 0xbe, 0x26, 0x4b, 0xf5, 0x81, 0x19, 0xba, 0x2d, 0xd9, - 0x5c, 0x3c, 0x31, 0x93, 0xe6, 0x61, 0x3a, 0xf7, 0xba, 0x4f, 0xe7, 0x52, 0xb1, 0xd9, 0x5d, 0x58, - 0x4d, 0xf1, 0xb9, 0xdb, 0x92, 0xcf, 0xa5, 0x97, 0x3c, 0x2c, 0x42, 0xe8, 0x5a, 0x11, 0x42, 0x97, - 0x59, 0xb2, 0xcc, 0x18, 0x46, 0xf7, 0xba, 0xcf, 0xe8, 0xb2, 0x4b, 0x66, 0x3c, 0x45, 0xe9, 0xee, - 0x44, 0x29, 0x5d, 0x2e, 0x06, 0xa2, 0x7d, 0xeb, 0x58, 0x4e, 0xf7, 0xe3, 0x10, 0xa7, 0xcb, 0xc7, - 0x12, 0x2a, 0xe1, 0x64, 0x0e, 0xa9, 0x6b, 0x45, 0x48, 0x5d, 0x61, 0x49, 0x0c, 0x62, 0x58, 0xdd, - 0xdb, 0x61, 0x56, 0x07, 0xb1, 0xc4, 0x50, 0xee, 0xf7, 0x3c, 0x5a, 0xf7, 0x56, 0x40, 0xeb, 0x8a, - 0xb1, 0xbc, 0x54, 0xae, 0x61, 0x9a, 0xd7, 0x1d, 0xce, 0xf0, 0x3a, 0xc1, 0xc3, 0x9e, 0x8f, 0x75, - 0xb1, 0x84, 0xd8, 0x1d, 0xce, 0x10, 0xbb, 0xf2, 0x12, 0x87, 0x4b, 0x98, 0xdd, 0x2f, 0xe7, 0x33, - 0xbb, 0x78, 0xee, 0x25, 0xa7, 0xb9, 0x1a, 0xb5, 0xd3, 0x62, 0xa8, 0xdd, 0x1a, 0x77, 0xff, 0x52, - 0xac, 0xfb, 0xcb, 0x73, 0xbb, 0x17, 0x59, 0x86, 0x9c, 0x3a, 0xf3, 0x0c, 0x65, 0x88, 0xeb, 0xda, - 0xae, 0x64, 0x69, 0xa2, 0xa3, 0xde, 0x64, 0x39, 0x7b, 0x72, 0xbe, 0x17, 0xf0, 0x40, 0x8e, 0xe6, - 0xa1, 0x33, 0xad, 0xfe, 0x55, 0x99, 0xd8, 0xf2, 0x34, 0x17, 0xce, 0xf7, 0x05, 0x99, 0xef, 0x43, - 0xec, 0x30, 0x19, 0x65, 0x87, 0x5b, 0x50, 0x64, 0x28, 0x3d, 0x45, 0xfc, 0x74, 0x27, 0x20, 0x7e, - 0xb7, 0x60, 0x9d, 0xa7, 0x61, 0xc1, 0x21, 0x25, 0x34, 0xa7, 0x79, 0x86, 0x59, 0x63, 0x03, 0xe2, - 0xe5, 0x14, 0x18, 0xfd, 0x0a, 0x5c, 0x09, 0xe9, 0x06, 0xe8, 0x2f, 0xd8, 0x4f, 0x35, 0xd0, 0x6e, - 0x88, 0x34, 0xf0, 0x6e, 0x3a, 0x6f, 0x54, 0x09, 0xbe, 0x2e, 0xb3, 0xbc, 0x4b, 0x04, 0xb2, 0x68, - 0x4c, 0x85, 0x18, 0xf2, 0x51, 0xea, 0xdf, 0x93, 0x93, 0x30, 0x4e, 0x68, 0xe5, 0x3c, 0x06, 0xa8, - 0xfc, 0xd7, 0x0c, 0x30, 0x9c, 0xaa, 0x52, 0x91, 0x54, 0x85, 0x3e, 0x84, 0x8d, 0x08, 0x39, 0xd4, - 0xc6, 0x9c, 0xf8, 0xd5, 0x8c, 0xcb, 0x71, 0xc4, 0x04, 0x46, 0x67, 0x33, 0x23, 0xe8, 0x23, 0x78, - 0xda, 0x22, 0xe7, 0x33, 0x8b, 0xf7, 0x9f, 0x41, 0x66, 0xcf, 0xb6, 0xbf, 0x20, 0x97, 0xf0, 0x38, - 0xec, 0xdb, 0xfd, 0x87, 0xf8, 0x49, 0xe6, 0x23, 0x22, 0x92, 0xee, 0x63, 0x98, 0xe3, 0x49, 0x1c, - 0x73, 0xfc, 0x97, 0x32, 0x79, 0xb9, 0x02, 0xee, 0xd8, 0xb7, 0x0d, 0x22, 0x13, 0x25, 0x6f, 0xa3, - 0x2a, 0xa4, 0x86, 0xf6, 0xa9, 0x4c, 0x87, 0xac, 0xc9, 0xb4, 0x82, 0x6c, 0x52, 0x90, 0xc9, 0x22, - 0xc8, 0xb1, 0x19, 0xfe, 0xaa, 0xc8, 0x1c, 0x5b, 0x85, 0xd4, 0x43, 0x22, 0xb0, 0xbf, 0x84, 0x59, - 0x93, 0xe9, 0xf1, 0xd3, 0xc2, 0x11, 0xbd, 0x84, 0x45, 0x07, 0xbd, 0x09, 0x05, 0x5e, 0x87, 0xd1, - 0x6c, 0xc7, 0x93, 0x30, 0xfd, 0x74, 0x38, 0x0c, 0xa2, 0xdc, 0xb2, 0x7d, 0xc4, 0x74, 0x0e, 0x1d, - 0x0f, 0xe7, 0x1d, 0xd9, 0x0a, 0xd1, 0x87, 0x42, 0x84, 0xc5, 0x5e, 0x83, 0x02, 0x9b, 0xbd, 0xe7, - 0xe8, 0x7d, 0xc2, 0x31, 0xb7, 0x80, 0x27, 0x02, 0xf5, 0x01, 0xa0, 0xd9, 0xcc, 0x81, 0x3a, 0x90, - 0x25, 0x67, 0xc4, 0xa2, 0xec, 0xd5, 0x62, 0x14, 0xf1, 0xea, 0x1c, 0x8a, 0x48, 0x2c, 0xda, 0xac, - 0xb1, 0x0d, 0xfe, 0xc7, 0x77, 0x5b, 0x55, 0xa1, 0xfd, 0xb2, 0x3d, 0x32, 0x29, 0x19, 0x39, 0xf4, - 0x02, 0x4b, 0x7b, 0xf5, 0x2f, 0x49, 0xc6, 0xd7, 0x22, 0x59, 0x65, 0x6e, 0x6c, 0xfd, 0xb3, 0x9b, - 0x0c, 0x71, 0xf5, 0xd5, 0xe2, 0xbd, 0x09, 0x70, 0xaa, 0x7b, 0xda, 0x67, 0xba, 0x45, 0x89, 0x21, - 0x83, 0x1e, 0x92, 0xa0, 0x3a, 0xe4, 0x59, 0x6f, 0xec, 0x11, 0x43, 0x5e, 0x33, 0x82, 0x7e, 0x68, - 0x9d, 0xb9, 0xc7, 0x5b, 0x67, 0x34, 0xca, 0xf9, 0xa9, 0x28, 0x87, 0xb8, 0x54, 0x21, 0xcc, 0xa5, - 0xd8, 0xdc, 0x1c, 0xd7, 0xb4, 0x5d, 0x93, 0x5e, 0xf0, 0xad, 0x49, 0xe1, 0xa0, 0xcf, 0x6e, 0xaf, - 0x23, 0x32, 0x72, 0x6c, 0x7b, 0xa8, 0x09, 0xdc, 0x2c, 0x72, 0xd3, 0x92, 0x14, 0xb6, 0x39, 0x7c, - 0xfe, 0x2a, 0x84, 0x11, 0x13, 0xce, 0xfc, 0x3f, 0x17, 0x60, 0xf5, 0x9f, 0x49, 0x76, 0x75, 0x88, - 0xf2, 0x06, 0xf4, 0x01, 0x3c, 0x39, 0x05, 0x95, 0x12, 0x5f, 0x3c, 0xc9, 0x35, 0x57, 0x40, 0xcc, - 0x27, 0xa2, 0x88, 0x29, 0xf0, 0xc5, 0x0b, 0xad, 0x2b, 0xf5, 0x98, 0xeb, 0x5a, 0x82, 0x84, 0xc6, - 0x63, 0x22, 0x61, 0x1c, 0x8a, 0x93, 0xcb, 0xde, 0xf4, 0xe7, 0xa0, 0xb8, 0xba, 0xc7, 0xee, 0x80, - 0x61, 0xb6, 0x35, 0xf7, 0x2d, 0x7b, 0x16, 0xca, 0x2e, 0xa1, 0x6c, 0x61, 0x91, 0x5b, 0x76, 0x49, - 0x08, 0x25, 0x02, 0x1f, 0xc1, 0x13, 0x73, 0x59, 0x17, 0x7a, 0x03, 0x0a, 0x13, 0xc2, 0xa6, 0xc4, - 0x5c, 0x58, 0x83, 0x4b, 0xd8, 0x44, 0x57, 0xfd, 0xa3, 0x32, 0x71, 0x19, 0xbd, 0xd6, 0xb5, 0x21, - 0xeb, 0x12, 0x6f, 0x3c, 0x14, 0x17, 0xad, 0xca, 0xee, 0x2b, 0xab, 0xf1, 0x35, 0x26, 0x1d, 0x0f, - 0x29, 0x96, 0xc6, 0xea, 0x03, 0xc8, 0x0a, 0x09, 0x2a, 0x42, 0xee, 0xde, 0xc1, 0xdd, 0x83, 0xc3, - 0xf7, 0x0f, 0xaa, 0x09, 0x04, 0x90, 0x6d, 0xb4, 0x5a, 0xed, 0xa3, 0x6e, 0x55, 0x41, 0x05, 0xc8, - 0x34, 0x9a, 0x87, 0xb8, 0x5b, 0x4d, 0x32, 0x31, 0x6e, 0xbf, 0xdb, 0x6e, 0x75, 0xab, 0x29, 0xb4, - 0x0e, 0x65, 0xd1, 0xd6, 0xee, 0x1c, 0xe2, 0x9f, 0x37, 0xba, 0xd5, 0x74, 0x48, 0x74, 0xdc, 0x3e, - 0x78, 0xa7, 0x8d, 0xab, 0x19, 0xf5, 0x55, 0x76, 0x93, 0x8b, 0x61, 0x78, 0x93, 0x3b, 0x9b, 0x12, - 0xba, 0xb3, 0xa9, 0xbf, 0x4e, 0x42, 0x3d, 0x9e, 0xb6, 0xa1, 0x77, 0xa7, 0x16, 0xbe, 0x7b, 0x09, - 0xce, 0x37, 0xb5, 0x7a, 0xf4, 0x1c, 0x54, 0x5c, 0x72, 0x42, 0x68, 0x7f, 0x20, 0x68, 0x24, 0x3b, - 0x53, 0xa9, 0x9b, 0x65, 0x5c, 0x96, 0x52, 0x6e, 0xe4, 0x09, 0xb5, 0x4f, 0x48, 0x9f, 0x6a, 0x02, - 0xf2, 0xc4, 0x81, 0x29, 0x30, 0x35, 0x26, 0x3d, 0x16, 0x42, 0xf5, 0xe3, 0x4b, 0xc5, 0xb2, 0x00, - 0x19, 0xdc, 0xee, 0xe2, 0x0f, 0xaa, 0x29, 0x84, 0xa0, 0xc2, 0x9b, 0xda, 0xf1, 0x41, 0xe3, 0xe8, - 0xb8, 0x73, 0xc8, 0x62, 0x79, 0x05, 0xd6, 0xfc, 0x58, 0xfa, 0xc2, 0x8c, 0xfa, 0x1b, 0x05, 0x2a, - 0xd1, 0x62, 0x09, 0x8b, 0xa1, 0x6b, 0x8f, 0x2d, 0x83, 0x47, 0x23, 0x83, 0x45, 0x87, 0xf1, 0xc2, - 0x4f, 0xc7, 0xb6, 0x3b, 0x1e, 0x85, 0x59, 0x11, 0x08, 0x11, 0x27, 0x46, 0x2f, 0xc0, 0x9a, 0xa0, - 0x79, 0x9e, 0x79, 0x6a, 0xe9, 0x74, 0xec, 0x8a, 0x02, 0x51, 0x09, 0x57, 0xb8, 0xf8, 0xd8, 0x97, - 0x32, 0x45, 0x51, 0x0a, 0x9b, 0x28, 0x0a, 0x42, 0x58, 0xe1, 0xe2, 0x40, 0x51, 0xfd, 0x1c, 0x32, - 0x1c, 0x2e, 0xd8, 0xf1, 0xe1, 0x25, 0x13, 0xc9, 0x60, 0x59, 0x1b, 0x7d, 0x04, 0xa0, 0x53, 0xea, - 0x9a, 0xbd, 0xb1, 0x00, 0xae, 0xd4, 0xdc, 0x5b, 0x0f, 0xb7, 0x6f, 0xf8, 0x7a, 0xcd, 0x6b, 0x12, - 0x77, 0x36, 0x26, 0xa6, 0x21, 0xec, 0x09, 0x39, 0x54, 0x0f, 0xa0, 0x12, 0xb5, 0xf5, 0xa9, 0x8a, - 0x98, 0x43, 0x94, 0xaa, 0x08, 0x0a, 0x2d, 0xa9, 0x4a, 0x40, 0x74, 0x52, 0xa2, 0x3c, 0xc6, 0x3b, - 0xea, 0x97, 0x0a, 0xe4, 0xbb, 0xe7, 0x72, 0x33, 0x63, 0x2a, 0x33, 0x13, 0xd3, 0x64, 0xb8, 0x0e, - 0x21, 0x4a, 0x3d, 0xa9, 0xa0, 0x80, 0xf4, 0x76, 0xf0, 0xba, 0xa6, 0x57, 0xbd, 0x6e, 0xfa, 0x95, - 0x34, 0x79, 0x44, 0x1b, 0x50, 0x08, 0x00, 0x8d, 0x97, 0xf3, 0xec, 0xcf, 0x64, 0x3d, 0x23, 0x85, - 0x45, 0x07, 0x6d, 0x42, 0xd1, 0x71, 0x6d, 0x8d, 0x9e, 0x8b, 0xed, 0x16, 0x3b, 0xc9, 0x38, 0x58, - 0xf7, 0x9c, 0x57, 0x6c, 0x7e, 0xa7, 0xc0, 0x5a, 0xe0, 0x43, 0x82, 0xea, 0xff, 0x43, 0xce, 0x19, - 0xf7, 0x34, 0x3f, 0x4a, 0x53, 0xdf, 0x85, 0x7c, 0x8a, 0x36, 0xee, 0x0d, 0xcd, 0xfe, 0x5d, 0x72, - 0x21, 0x01, 0x34, 0xeb, 0x8c, 0x7b, 0x77, 0x45, 0x30, 0xc5, 0x34, 0x92, 0x0b, 0xa6, 0x91, 0x9a, - 0x9a, 0x06, 0x7a, 0x01, 0x4a, 0x96, 0x6d, 0x10, 0x4d, 0x37, 0x0c, 0x97, 0x78, 0x9e, 0x48, 0xd0, - 0xd2, 0x73, 0x91, 0x8d, 0x34, 0xc4, 0x80, 0xfa, 0xbd, 0x02, 0x68, 0x16, 0xc4, 0xd1, 0x31, 0xac, - 0x4f, 0xf2, 0x80, 0x9f, 0x05, 0x05, 0x9c, 0xde, 0x88, 0x4f, 0x02, 0x11, 0x1e, 0x5f, 0x3d, 0x8b, - 0x8a, 0x3d, 0xd4, 0x85, 0x0d, 0x3a, 0x70, 0x89, 0x37, 0xb0, 0x87, 0x86, 0xe6, 0xf0, 0xf5, 0xf2, - 0xa0, 0x24, 0x57, 0x0c, 0x4a, 0x02, 0xa3, 0xc0, 0x3e, 0x18, 0x59, 0x7a, 0x00, 0x55, 0x07, 0x6a, - 0xdd, 0x19, 0x33, 0xb9, 0xce, 0xb8, 0x29, 0x29, 0x8f, 0x33, 0x25, 0xf5, 0x36, 0x54, 0xdf, 0x0b, - 0x9e, 0x2f, 0x9f, 0x34, 0x35, 0x4d, 0x65, 0x66, 0x9a, 0x67, 0x90, 0xbf, 0x6f, 0x53, 0x71, 0x35, - 0xfd, 0x09, 0x14, 0x82, 0xe8, 0x05, 0x5f, 0x04, 0x62, 0xc3, 0x2e, 0x67, 0x32, 0x31, 0x61, 0x77, - 0x51, 0x06, 0x22, 0xc4, 0xd0, 0x26, 0xd7, 0x4c, 0x1e, 0xe6, 0x3c, 0x5e, 0x13, 0x03, 0xfb, 0xfe, - 0x1d, 0x53, 0xfd, 0xb7, 0x02, 0x79, 0xbf, 0x82, 0x8b, 0x5e, 0x0d, 0x21, 0x4a, 0x65, 0x4e, 0xbd, - 0xcb, 0x57, 0x9c, 0x54, 0x61, 0xa3, 0x73, 0x4d, 0x5e, 0x7e, 0xae, 0x71, 0xe5, 0x74, 0xff, 0x83, - 0x48, 0xfa, 0xd2, 0x1f, 0x44, 0x5e, 0x06, 0x44, 0x6d, 0xaa, 0x0f, 0xb5, 0x33, 0x9b, 0x9a, 0xd6, - 0xa9, 0x26, 0xce, 0x8f, 0x60, 0xa2, 0x55, 0x3e, 0x72, 0x9f, 0x0f, 0x1c, 0x31, 0xb9, 0xfa, 0x07, - 0x05, 0xf2, 0x41, 0xae, 0xbf, 0x6c, 0x51, 0xf5, 0x2a, 0x64, 0x65, 0x3a, 0x13, 0x55, 0x55, 0xd9, - 0x0b, 0xea, 0xfb, 0xe9, 0x50, 0x7d, 0xbf, 0x0e, 0xf9, 0x11, 0xa1, 0x3a, 0x27, 0x3c, 0x02, 0xd8, - 0x83, 0x3e, 0x7a, 0x03, 0x6a, 0x71, 0x17, 0x7b, 0xce, 0xe9, 0xca, 0x8c, 0x59, 0x86, 0xe8, 0x1a, - 0x31, 0x04, 0x11, 0xba, 0xf5, 0x16, 0x14, 0x43, 0x85, 0x71, 0x06, 0xc6, 0x07, 0xed, 0xf7, 0xab, - 0x89, 0x7a, 0xee, 0xcb, 0xaf, 0x6f, 0xa4, 0x0e, 0xc8, 0x67, 0xa8, 0x06, 0x39, 0xdc, 0x6e, 0x75, - 0xda, 0xad, 0xbb, 0x55, 0xa5, 0x5e, 0xfc, 0xf2, 0xeb, 0x1b, 0x39, 0x4c, 0x78, 0x91, 0xee, 0x56, - 0x07, 0x4a, 0xe1, 0xed, 0x8c, 0xa6, 0x52, 0x04, 0x95, 0x77, 0xee, 0x1d, 0xed, 0xef, 0xb5, 0x1a, - 0xdd, 0xb6, 0x76, 0xff, 0xb0, 0xdb, 0xae, 0x2a, 0xe8, 0x49, 0xb8, 0xb2, 0xbf, 0xf7, 0xb3, 0x4e, - 0x57, 0x6b, 0xed, 0xef, 0xb5, 0x0f, 0xba, 0x5a, 0xa3, 0xdb, 0x6d, 0xb4, 0xee, 0x56, 0x93, 0xbb, - 0xbf, 0x2f, 0xc0, 0x5a, 0xa3, 0xd9, 0xda, 0x63, 0x34, 0xc0, 0xec, 0xeb, 0xbc, 0x7e, 0xd3, 0x82, - 0x34, 0xaf, 0xd0, 0x2c, 0xfc, 0xdc, 0x5e, 0x5f, 0x5c, 0xbe, 0x45, 0x77, 0x20, 0xc3, 0x8b, 0x37, - 0x68, 0xf1, 0xf7, 0xf7, 0xfa, 0x92, 0x7a, 0x2e, 0x9b, 0x0c, 0x3f, 0x57, 0x0b, 0x3f, 0xc8, 0xd7, - 0x17, 0x97, 0x77, 0x11, 0x86, 0xc2, 0xe4, 0xce, 0xb4, 0xfc, 0x03, 0x75, 0x7d, 0x85, 0xfc, 0x83, - 0xf6, 0x21, 0xe7, 0x5f, 0x73, 0x97, 0x7d, 0x32, 0xaf, 0x2f, 0xad, 0xbf, 0xb2, 0x70, 0x89, 0x72, - 0xc4, 0xe2, 0xef, 0xff, 0xf5, 0x25, 0xc5, 0x64, 0xb4, 0x07, 0x59, 0x49, 0xd0, 0x97, 0x7c, 0x06, - 0xaf, 0x2f, 0xab, 0xa7, 0xb2, 0xa0, 0x4d, 0x8a, 0x51, 0xcb, 0xff, 0x6a, 0xa8, 0xaf, 0x50, 0x27, - 0x47, 0xf7, 0x00, 0x42, 0xc5, 0x87, 0x15, 0x7e, 0x57, 0xa8, 0xaf, 0x52, 0xff, 0x46, 0x87, 0x90, - 0x0f, 0xee, 0x82, 0x4b, 0x7f, 0x1e, 0xa8, 0x2f, 0x2f, 0x44, 0xa3, 0x07, 0x50, 0x8e, 0x5e, 0x4e, - 0x56, 0xfb, 0x25, 0xa0, 0xbe, 0x62, 0x85, 0x99, 0xf9, 0x8f, 0xde, 0x54, 0x56, 0xfb, 0x45, 0xa0, - 0xbe, 0x62, 0xc1, 0x19, 0x7d, 0x02, 0xeb, 0xb3, 0x37, 0x89, 0xd5, 0xff, 0x18, 0xa8, 0x5f, 0xa2, - 0x04, 0x8d, 0x46, 0x80, 0xe6, 0xdc, 0x40, 0x2e, 0xf1, 0x03, 0x41, 0xfd, 0x32, 0x15, 0xe9, 0x66, - 0xfb, 0x9b, 0x1f, 0x36, 0x95, 0x6f, 0x7f, 0xd8, 0x54, 0xbe, 0xff, 0x61, 0x53, 0xf9, 0xea, 0xd1, - 0x66, 0xe2, 0xdb, 0x47, 0x9b, 0x89, 0x3f, 0x3f, 0xda, 0x4c, 0xfc, 0xe2, 0xa5, 0x53, 0x93, 0x0e, - 0xc6, 0xbd, 0xed, 0xbe, 0x3d, 0xda, 0x09, 0xff, 0x99, 0x34, 0xef, 0x6f, 0xa9, 0x5e, 0x96, 0x67, - 0xa3, 0xdb, 0xff, 0x09, 0x00, 0x00, 0xff, 0xff, 0x1d, 0xb3, 0x11, 0x48, 0x4d, 0x25, 0x00, 0x00, +func (m *ResponseProcessProposal) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) } - -// Reference imports to suppress errors if they are not otherwise used. -var _ context.Context -var _ grpc.ClientConn - -// This is a compile-time assertion to ensure that this generated file -// is compatible with the grpc package it is being compiled against. -const _ = grpc.SupportPackageIsVersion4 - -// ABCIApplicationClient is the client API for ABCIApplication service. -// -// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://godoc.org/google.golang.org/grpc#ClientConn.NewStream. -type ABCIApplicationClient interface { - Echo(ctx context.Context, in *RequestEcho, opts ...grpc.CallOption) (*ResponseEcho, error) - Flush(ctx context.Context, in *RequestFlush, opts ...grpc.CallOption) (*ResponseFlush, error) - Info(ctx context.Context, in *RequestInfo, opts ...grpc.CallOption) (*ResponseInfo, error) - DeliverTx(ctx context.Context, in *RequestDeliverTx, opts ...grpc.CallOption) (*ResponseDeliverTx, error) - CheckTx(ctx context.Context, in *RequestCheckTx, opts ...grpc.CallOption) (*ResponseCheckTx, error) - Query(ctx context.Context, in *RequestQuery, opts ...grpc.CallOption) (*ResponseQuery, error) - Commit(ctx context.Context, in *RequestCommit, opts ...grpc.CallOption) (*ResponseCommit, error) - InitChain(ctx context.Context, in *RequestInitChain, opts ...grpc.CallOption) (*ResponseInitChain, error) - BeginBlock(ctx context.Context, in *RequestBeginBlock, opts ...grpc.CallOption) (*ResponseBeginBlock, error) - EndBlock(ctx context.Context, in *RequestEndBlock, opts ...grpc.CallOption) (*ResponseEndBlock, error) - ListSnapshots(ctx context.Context, in *RequestListSnapshots, opts ...grpc.CallOption) (*ResponseListSnapshots, error) - OfferSnapshot(ctx context.Context, in *RequestOfferSnapshot, opts ...grpc.CallOption) (*ResponseOfferSnapshot, error) - LoadSnapshotChunk(ctx context.Context, in *RequestLoadSnapshotChunk, opts ...grpc.CallOption) (*ResponseLoadSnapshotChunk, error) - ApplySnapshotChunk(ctx context.Context, in *RequestApplySnapshotChunk, opts ...grpc.CallOption) (*ResponseApplySnapshotChunk, error) +func (m *ResponseProcessProposal) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_ResponseProcessProposal.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil + } } - -type aBCIApplicationClient struct { - cc *grpc.ClientConn +func (m *ResponseProcessProposal) XXX_Merge(src proto.Message) { + xxx_messageInfo_ResponseProcessProposal.Merge(m, src) } - -func NewABCIApplicationClient(cc *grpc.ClientConn) ABCIApplicationClient { - return &aBCIApplicationClient{cc} +func (m *ResponseProcessProposal) XXX_Size() int { + return m.Size() } - -func (c *aBCIApplicationClient) Echo(ctx context.Context, in *RequestEcho, opts ...grpc.CallOption) (*ResponseEcho, error) { - out := new(ResponseEcho) - err := c.cc.Invoke(ctx, "/tendermint.abci.ABCIApplication/Echo", in, out, opts...) - if err != nil { - return nil, err - } - return out, nil +func (m *ResponseProcessProposal) XXX_DiscardUnknown() { + xxx_messageInfo_ResponseProcessProposal.DiscardUnknown(m) } -func (c *aBCIApplicationClient) Flush(ctx context.Context, in *RequestFlush, opts ...grpc.CallOption) (*ResponseFlush, error) { - out := new(ResponseFlush) - err := c.cc.Invoke(ctx, "/tendermint.abci.ABCIApplication/Flush", in, out, opts...) - if err != nil { - return nil, err +var xxx_messageInfo_ResponseProcessProposal proto.InternalMessageInfo + +func (m *ResponseProcessProposal) GetStatus() ResponseProcessProposal_ProposalStatus { + if m != nil { + return m.Status } - return out, nil + return ResponseProcessProposal_UNKNOWN } -func (c *aBCIApplicationClient) Info(ctx context.Context, in *RequestInfo, opts ...grpc.CallOption) (*ResponseInfo, error) { - out := new(ResponseInfo) - err := c.cc.Invoke(ctx, "/tendermint.abci.ABCIApplication/Info", in, out, opts...) - if err != nil { - return nil, err +func (m *ResponseProcessProposal) GetAppHash() []byte { + if m != nil { + return m.AppHash } - return out, nil + return nil } -func (c *aBCIApplicationClient) DeliverTx(ctx context.Context, in *RequestDeliverTx, opts ...grpc.CallOption) (*ResponseDeliverTx, error) { - out := new(ResponseDeliverTx) - err := c.cc.Invoke(ctx, "/tendermint.abci.ABCIApplication/DeliverTx", in, out, opts...) - if err != nil { - return nil, err +func (m *ResponseProcessProposal) GetTxResults() []*ExecTxResult { + if m != nil { + return m.TxResults } - return out, nil + return nil } -func (c *aBCIApplicationClient) CheckTx(ctx context.Context, in *RequestCheckTx, opts ...grpc.CallOption) (*ResponseCheckTx, error) { - out := new(ResponseCheckTx) - err := c.cc.Invoke(ctx, "/tendermint.abci.ABCIApplication/CheckTx", in, out, opts...) - if err != nil { - return nil, err +func (m *ResponseProcessProposal) GetValidatorUpdates() []*ValidatorUpdate { + if m != nil { + return m.ValidatorUpdates } - return out, nil + return nil } -func (c *aBCIApplicationClient) Query(ctx context.Context, in *RequestQuery, opts ...grpc.CallOption) (*ResponseQuery, error) { - out := new(ResponseQuery) - err := c.cc.Invoke(ctx, "/tendermint.abci.ABCIApplication/Query", in, out, opts...) - if err != nil { - return nil, err +func (m *ResponseProcessProposal) GetConsensusParamUpdates() *types1.ConsensusParams { + if m != nil { + return m.ConsensusParamUpdates } - return out, nil + return nil } -func (c *aBCIApplicationClient) Commit(ctx context.Context, in *RequestCommit, opts ...grpc.CallOption) (*ResponseCommit, error) { - out := new(ResponseCommit) - err := c.cc.Invoke(ctx, "/tendermint.abci.ABCIApplication/Commit", in, out, opts...) - if err != nil { - return nil, err - } - return out, nil +type ResponseExtendVote struct { + VoteExtension []byte `protobuf:"bytes,1,opt,name=vote_extension,json=voteExtension,proto3" json:"vote_extension,omitempty"` } -func (c *aBCIApplicationClient) InitChain(ctx context.Context, in *RequestInitChain, opts ...grpc.CallOption) (*ResponseInitChain, error) { - out := new(ResponseInitChain) - err := c.cc.Invoke(ctx, "/tendermint.abci.ABCIApplication/InitChain", in, out, opts...) - if err != nil { - return nil, err - } - return out, nil +func (m *ResponseExtendVote) Reset() { *m = ResponseExtendVote{} } +func (m *ResponseExtendVote) String() string { return proto.CompactTextString(m) } +func (*ResponseExtendVote) ProtoMessage() {} +func (*ResponseExtendVote) Descriptor() ([]byte, []int) { + return fileDescriptor_252557cfdd89a31a, []int{38} } - -func (c *aBCIApplicationClient) BeginBlock(ctx context.Context, in *RequestBeginBlock, opts ...grpc.CallOption) (*ResponseBeginBlock, error) { - out := new(ResponseBeginBlock) - err := c.cc.Invoke(ctx, "/tendermint.abci.ABCIApplication/BeginBlock", in, out, opts...) - if err != nil { - return nil, err - } - return out, nil +func (m *ResponseExtendVote) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) } - -func (c *aBCIApplicationClient) EndBlock(ctx context.Context, in *RequestEndBlock, opts ...grpc.CallOption) (*ResponseEndBlock, error) { - out := new(ResponseEndBlock) - err := c.cc.Invoke(ctx, "/tendermint.abci.ABCIApplication/EndBlock", in, out, opts...) - if err != nil { - return nil, err +func (m *ResponseExtendVote) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_ResponseExtendVote.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil } - return out, nil } - -func (c *aBCIApplicationClient) ListSnapshots(ctx context.Context, in *RequestListSnapshots, opts ...grpc.CallOption) (*ResponseListSnapshots, error) { - out := new(ResponseListSnapshots) - err := c.cc.Invoke(ctx, "/tendermint.abci.ABCIApplication/ListSnapshots", in, out, opts...) - if err != nil { - return nil, err - } - return out, nil +func (m *ResponseExtendVote) XXX_Merge(src proto.Message) { + xxx_messageInfo_ResponseExtendVote.Merge(m, src) } - -func (c *aBCIApplicationClient) OfferSnapshot(ctx context.Context, in *RequestOfferSnapshot, opts ...grpc.CallOption) (*ResponseOfferSnapshot, error) { - out := new(ResponseOfferSnapshot) - err := c.cc.Invoke(ctx, "/tendermint.abci.ABCIApplication/OfferSnapshot", in, out, opts...) - if err != nil { - return nil, err - } - return out, nil +func (m *ResponseExtendVote) XXX_Size() int { + return m.Size() } - -func (c *aBCIApplicationClient) LoadSnapshotChunk(ctx context.Context, in *RequestLoadSnapshotChunk, opts ...grpc.CallOption) (*ResponseLoadSnapshotChunk, error) { - out := new(ResponseLoadSnapshotChunk) - err := c.cc.Invoke(ctx, "/tendermint.abci.ABCIApplication/LoadSnapshotChunk", in, out, opts...) - if err != nil { - return nil, err - } - return out, nil +func (m *ResponseExtendVote) XXX_DiscardUnknown() { + xxx_messageInfo_ResponseExtendVote.DiscardUnknown(m) } -func (c *aBCIApplicationClient) ApplySnapshotChunk(ctx context.Context, in *RequestApplySnapshotChunk, opts ...grpc.CallOption) (*ResponseApplySnapshotChunk, error) { - out := new(ResponseApplySnapshotChunk) - err := c.cc.Invoke(ctx, "/tendermint.abci.ABCIApplication/ApplySnapshotChunk", in, out, opts...) - if err != nil { - return nil, err - } - return out, nil -} +var xxx_messageInfo_ResponseExtendVote proto.InternalMessageInfo -// ABCIApplicationServer is the server API for ABCIApplication service. -type ABCIApplicationServer interface { - Echo(context.Context, *RequestEcho) (*ResponseEcho, error) - Flush(context.Context, *RequestFlush) (*ResponseFlush, error) - Info(context.Context, *RequestInfo) (*ResponseInfo, error) - DeliverTx(context.Context, *RequestDeliverTx) (*ResponseDeliverTx, error) - CheckTx(context.Context, *RequestCheckTx) (*ResponseCheckTx, error) - Query(context.Context, *RequestQuery) (*ResponseQuery, error) - Commit(context.Context, *RequestCommit) (*ResponseCommit, error) - InitChain(context.Context, *RequestInitChain) (*ResponseInitChain, error) - BeginBlock(context.Context, *RequestBeginBlock) (*ResponseBeginBlock, error) - EndBlock(context.Context, *RequestEndBlock) (*ResponseEndBlock, error) - ListSnapshots(context.Context, *RequestListSnapshots) (*ResponseListSnapshots, error) - OfferSnapshot(context.Context, *RequestOfferSnapshot) (*ResponseOfferSnapshot, error) - LoadSnapshotChunk(context.Context, *RequestLoadSnapshotChunk) (*ResponseLoadSnapshotChunk, error) - ApplySnapshotChunk(context.Context, *RequestApplySnapshotChunk) (*ResponseApplySnapshotChunk, error) +func (m *ResponseExtendVote) GetVoteExtension() []byte { + if m != nil { + return m.VoteExtension + } + return nil } -// UnimplementedABCIApplicationServer can be embedded to have forward compatible implementations. -type UnimplementedABCIApplicationServer struct { +type ResponseVerifyVoteExtension struct { + Status ResponseVerifyVoteExtension_VerifyStatus `protobuf:"varint,1,opt,name=status,proto3,enum=tendermint.abci.ResponseVerifyVoteExtension_VerifyStatus" json:"status,omitempty"` } -func (*UnimplementedABCIApplicationServer) Echo(ctx context.Context, req *RequestEcho) (*ResponseEcho, error) { - return nil, status.Errorf(codes.Unimplemented, "method Echo not implemented") +func (m *ResponseVerifyVoteExtension) Reset() { *m = ResponseVerifyVoteExtension{} } +func (m *ResponseVerifyVoteExtension) String() string { return proto.CompactTextString(m) } +func (*ResponseVerifyVoteExtension) ProtoMessage() {} +func (*ResponseVerifyVoteExtension) Descriptor() ([]byte, []int) { + return fileDescriptor_252557cfdd89a31a, []int{39} } -func (*UnimplementedABCIApplicationServer) Flush(ctx context.Context, req *RequestFlush) (*ResponseFlush, error) { - return nil, status.Errorf(codes.Unimplemented, "method Flush not implemented") +func (m *ResponseVerifyVoteExtension) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) } -func (*UnimplementedABCIApplicationServer) Info(ctx context.Context, req *RequestInfo) (*ResponseInfo, error) { - return nil, status.Errorf(codes.Unimplemented, "method Info not implemented") +func (m *ResponseVerifyVoteExtension) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_ResponseVerifyVoteExtension.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil + } } -func (*UnimplementedABCIApplicationServer) DeliverTx(ctx context.Context, req *RequestDeliverTx) (*ResponseDeliverTx, error) { - return nil, status.Errorf(codes.Unimplemented, "method DeliverTx not implemented") +func (m *ResponseVerifyVoteExtension) XXX_Merge(src proto.Message) { + xxx_messageInfo_ResponseVerifyVoteExtension.Merge(m, src) } -func (*UnimplementedABCIApplicationServer) CheckTx(ctx context.Context, req *RequestCheckTx) (*ResponseCheckTx, error) { - return nil, status.Errorf(codes.Unimplemented, "method CheckTx not implemented") +func (m *ResponseVerifyVoteExtension) XXX_Size() int { + return m.Size() } -func (*UnimplementedABCIApplicationServer) Query(ctx context.Context, req *RequestQuery) (*ResponseQuery, error) { - return nil, status.Errorf(codes.Unimplemented, "method Query not implemented") +func (m *ResponseVerifyVoteExtension) XXX_DiscardUnknown() { + xxx_messageInfo_ResponseVerifyVoteExtension.DiscardUnknown(m) } -func (*UnimplementedABCIApplicationServer) Commit(ctx context.Context, req *RequestCommit) (*ResponseCommit, error) { - return nil, status.Errorf(codes.Unimplemented, "method Commit not implemented") + +var xxx_messageInfo_ResponseVerifyVoteExtension proto.InternalMessageInfo + +func (m *ResponseVerifyVoteExtension) GetStatus() ResponseVerifyVoteExtension_VerifyStatus { + if m != nil { + return m.Status + } + return ResponseVerifyVoteExtension_UNKNOWN } -func (*UnimplementedABCIApplicationServer) InitChain(ctx context.Context, req *RequestInitChain) (*ResponseInitChain, error) { - return nil, status.Errorf(codes.Unimplemented, "method InitChain not implemented") + +type ResponseFinalizeBlock struct { + Events []Event `protobuf:"bytes,1,rep,name=events,proto3" json:"events,omitempty"` + TxResults []*ExecTxResult `protobuf:"bytes,2,rep,name=tx_results,json=txResults,proto3" json:"tx_results,omitempty"` + ConsensusParamUpdates *types1.ConsensusParams `protobuf:"bytes,4,opt,name=consensus_param_updates,json=consensusParamUpdates,proto3" json:"consensus_param_updates,omitempty"` + AppHash []byte `protobuf:"bytes,5,opt,name=app_hash,json=appHash,proto3" json:"app_hash,omitempty"` + RetainHeight int64 `protobuf:"varint,6,opt,name=retain_height,json=retainHeight,proto3" json:"retain_height,omitempty"` + NextCoreChainLockUpdate *types1.CoreChainLock `protobuf:"bytes,100,opt,name=next_core_chain_lock_update,json=nextCoreChainLockUpdate,proto3" json:"next_core_chain_lock_update,omitempty"` + ValidatorSetUpdate *ValidatorSetUpdate `protobuf:"bytes,101,opt,name=validator_set_update,json=validatorSetUpdate,proto3" json:"validator_set_update,omitempty"` } -func (*UnimplementedABCIApplicationServer) BeginBlock(ctx context.Context, req *RequestBeginBlock) (*ResponseBeginBlock, error) { - return nil, status.Errorf(codes.Unimplemented, "method BeginBlock not implemented") + +func (m *ResponseFinalizeBlock) Reset() { *m = ResponseFinalizeBlock{} } +func (m *ResponseFinalizeBlock) String() string { return proto.CompactTextString(m) } +func (*ResponseFinalizeBlock) ProtoMessage() {} +func (*ResponseFinalizeBlock) Descriptor() ([]byte, []int) { + return fileDescriptor_252557cfdd89a31a, []int{40} } -func (*UnimplementedABCIApplicationServer) EndBlock(ctx context.Context, req *RequestEndBlock) (*ResponseEndBlock, error) { - return nil, status.Errorf(codes.Unimplemented, "method EndBlock not implemented") +func (m *ResponseFinalizeBlock) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) } -func (*UnimplementedABCIApplicationServer) ListSnapshots(ctx context.Context, req *RequestListSnapshots) (*ResponseListSnapshots, error) { - return nil, status.Errorf(codes.Unimplemented, "method ListSnapshots not implemented") +func (m *ResponseFinalizeBlock) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_ResponseFinalizeBlock.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil + } } -func (*UnimplementedABCIApplicationServer) OfferSnapshot(ctx context.Context, req *RequestOfferSnapshot) (*ResponseOfferSnapshot, error) { - return nil, status.Errorf(codes.Unimplemented, "method OfferSnapshot not implemented") +func (m *ResponseFinalizeBlock) XXX_Merge(src proto.Message) { + xxx_messageInfo_ResponseFinalizeBlock.Merge(m, src) } -func (*UnimplementedABCIApplicationServer) LoadSnapshotChunk(ctx context.Context, req *RequestLoadSnapshotChunk) (*ResponseLoadSnapshotChunk, error) { - return nil, status.Errorf(codes.Unimplemented, "method LoadSnapshotChunk not implemented") +func (m *ResponseFinalizeBlock) XXX_Size() int { + return m.Size() } -func (*UnimplementedABCIApplicationServer) ApplySnapshotChunk(ctx context.Context, req *RequestApplySnapshotChunk) (*ResponseApplySnapshotChunk, error) { - return nil, status.Errorf(codes.Unimplemented, "method ApplySnapshotChunk not implemented") +func (m *ResponseFinalizeBlock) XXX_DiscardUnknown() { + xxx_messageInfo_ResponseFinalizeBlock.DiscardUnknown(m) } -func RegisterABCIApplicationServer(s *grpc.Server, srv ABCIApplicationServer) { - s.RegisterService(&_ABCIApplication_serviceDesc, srv) -} +var xxx_messageInfo_ResponseFinalizeBlock proto.InternalMessageInfo -func _ABCIApplication_Echo_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(RequestEcho) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(ABCIApplicationServer).Echo(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/tendermint.abci.ABCIApplication/Echo", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(ABCIApplicationServer).Echo(ctx, req.(*RequestEcho)) +func (m *ResponseFinalizeBlock) GetEvents() []Event { + if m != nil { + return m.Events } - return interceptor(ctx, in, info, handler) + return nil } -func _ABCIApplication_Flush_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(RequestFlush) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(ABCIApplicationServer).Flush(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/tendermint.abci.ABCIApplication/Flush", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(ABCIApplicationServer).Flush(ctx, req.(*RequestFlush)) +func (m *ResponseFinalizeBlock) GetTxResults() []*ExecTxResult { + if m != nil { + return m.TxResults } - return interceptor(ctx, in, info, handler) + return nil } -func _ABCIApplication_Info_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(RequestInfo) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(ABCIApplicationServer).Info(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/tendermint.abci.ABCIApplication/Info", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(ABCIApplicationServer).Info(ctx, req.(*RequestInfo)) +func (m *ResponseFinalizeBlock) GetConsensusParamUpdates() *types1.ConsensusParams { + if m != nil { + return m.ConsensusParamUpdates } - return interceptor(ctx, in, info, handler) + return nil } -func _ABCIApplication_DeliverTx_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(RequestDeliverTx) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(ABCIApplicationServer).DeliverTx(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/tendermint.abci.ABCIApplication/DeliverTx", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(ABCIApplicationServer).DeliverTx(ctx, req.(*RequestDeliverTx)) +func (m *ResponseFinalizeBlock) GetAppHash() []byte { + if m != nil { + return m.AppHash } - return interceptor(ctx, in, info, handler) + return nil } -func _ABCIApplication_CheckTx_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(RequestCheckTx) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(ABCIApplicationServer).CheckTx(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/tendermint.abci.ABCIApplication/CheckTx", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(ABCIApplicationServer).CheckTx(ctx, req.(*RequestCheckTx)) +func (m *ResponseFinalizeBlock) GetRetainHeight() int64 { + if m != nil { + return m.RetainHeight } - return interceptor(ctx, in, info, handler) + return 0 } -func _ABCIApplication_Query_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(RequestQuery) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(ABCIApplicationServer).Query(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/tendermint.abci.ABCIApplication/Query", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(ABCIApplicationServer).Query(ctx, req.(*RequestQuery)) +func (m *ResponseFinalizeBlock) GetNextCoreChainLockUpdate() *types1.CoreChainLock { + if m != nil { + return m.NextCoreChainLockUpdate } - return interceptor(ctx, in, info, handler) + return nil } -func _ABCIApplication_Commit_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(RequestCommit) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(ABCIApplicationServer).Commit(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/tendermint.abci.ABCIApplication/Commit", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(ABCIApplicationServer).Commit(ctx, req.(*RequestCommit)) +func (m *ResponseFinalizeBlock) GetValidatorSetUpdate() *ValidatorSetUpdate { + if m != nil { + return m.ValidatorSetUpdate } - return interceptor(ctx, in, info, handler) + return nil } -func _ABCIApplication_InitChain_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(RequestInitChain) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(ABCIApplicationServer).InitChain(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/tendermint.abci.ABCIApplication/InitChain", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(ABCIApplicationServer).InitChain(ctx, req.(*RequestInitChain)) - } - return interceptor(ctx, in, info, handler) +type CommitInfo struct { + Round int32 `protobuf:"varint,1,opt,name=round,proto3" json:"round,omitempty"` + QuorumHash []byte `protobuf:"bytes,3,opt,name=quorum_hash,json=quorumHash,proto3" json:"quorum_hash,omitempty"` + BlockSignature []byte `protobuf:"bytes,4,opt,name=block_signature,json=blockSignature,proto3" json:"block_signature,omitempty"` + StateSignature []byte `protobuf:"bytes,5,opt,name=state_signature,json=stateSignature,proto3" json:"state_signature,omitempty"` } -func _ABCIApplication_BeginBlock_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(RequestBeginBlock) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(ABCIApplicationServer).BeginBlock(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/tendermint.abci.ABCIApplication/BeginBlock", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(ABCIApplicationServer).BeginBlock(ctx, req.(*RequestBeginBlock)) - } - return interceptor(ctx, in, info, handler) +func (m *CommitInfo) Reset() { *m = CommitInfo{} } +func (m *CommitInfo) String() string { return proto.CompactTextString(m) } +func (*CommitInfo) ProtoMessage() {} +func (*CommitInfo) Descriptor() ([]byte, []int) { + return fileDescriptor_252557cfdd89a31a, []int{41} } - -func _ABCIApplication_EndBlock_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(RequestEndBlock) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(ABCIApplicationServer).EndBlock(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/tendermint.abci.ABCIApplication/EndBlock", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(ABCIApplicationServer).EndBlock(ctx, req.(*RequestEndBlock)) +func (m *CommitInfo) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *CommitInfo) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_CommitInfo.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil } - return interceptor(ctx, in, info, handler) +} +func (m *CommitInfo) XXX_Merge(src proto.Message) { + xxx_messageInfo_CommitInfo.Merge(m, src) +} +func (m *CommitInfo) XXX_Size() int { + return m.Size() +} +func (m *CommitInfo) XXX_DiscardUnknown() { + xxx_messageInfo_CommitInfo.DiscardUnknown(m) } -func _ABCIApplication_ListSnapshots_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(RequestListSnapshots) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(ABCIApplicationServer).ListSnapshots(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/tendermint.abci.ABCIApplication/ListSnapshots", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(ABCIApplicationServer).ListSnapshots(ctx, req.(*RequestListSnapshots)) +var xxx_messageInfo_CommitInfo proto.InternalMessageInfo + +func (m *CommitInfo) GetRound() int32 { + if m != nil { + return m.Round } - return interceptor(ctx, in, info, handler) + return 0 } -func _ABCIApplication_OfferSnapshot_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(RequestOfferSnapshot) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(ABCIApplicationServer).OfferSnapshot(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/tendermint.abci.ABCIApplication/OfferSnapshot", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(ABCIApplicationServer).OfferSnapshot(ctx, req.(*RequestOfferSnapshot)) +func (m *CommitInfo) GetQuorumHash() []byte { + if m != nil { + return m.QuorumHash } - return interceptor(ctx, in, info, handler) + return nil } -func _ABCIApplication_LoadSnapshotChunk_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(RequestLoadSnapshotChunk) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(ABCIApplicationServer).LoadSnapshotChunk(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/tendermint.abci.ABCIApplication/LoadSnapshotChunk", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(ABCIApplicationServer).LoadSnapshotChunk(ctx, req.(*RequestLoadSnapshotChunk)) +func (m *CommitInfo) GetBlockSignature() []byte { + if m != nil { + return m.BlockSignature } - return interceptor(ctx, in, info, handler) + return nil } -func _ABCIApplication_ApplySnapshotChunk_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(RequestApplySnapshotChunk) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(ABCIApplicationServer).ApplySnapshotChunk(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/tendermint.abci.ABCIApplication/ApplySnapshotChunk", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(ABCIApplicationServer).ApplySnapshotChunk(ctx, req.(*RequestApplySnapshotChunk)) +func (m *CommitInfo) GetStateSignature() []byte { + if m != nil { + return m.StateSignature } - return interceptor(ctx, in, info, handler) + return nil } -var _ABCIApplication_serviceDesc = grpc.ServiceDesc{ - ServiceName: "tendermint.abci.ABCIApplication", - HandlerType: (*ABCIApplicationServer)(nil), - Methods: []grpc.MethodDesc{ - { - MethodName: "Echo", - Handler: _ABCIApplication_Echo_Handler, - }, - { - MethodName: "Flush", - Handler: _ABCIApplication_Flush_Handler, - }, - { - MethodName: "Info", - Handler: _ABCIApplication_Info_Handler, - }, - { - MethodName: "DeliverTx", - Handler: _ABCIApplication_DeliverTx_Handler, - }, - { - MethodName: "CheckTx", - Handler: _ABCIApplication_CheckTx_Handler, - }, - { - MethodName: "Query", - Handler: _ABCIApplication_Query_Handler, - }, - { - MethodName: "Commit", - Handler: _ABCIApplication_Commit_Handler, - }, - { - MethodName: "InitChain", - Handler: _ABCIApplication_InitChain_Handler, - }, - { - MethodName: "BeginBlock", - Handler: _ABCIApplication_BeginBlock_Handler, - }, - { - MethodName: "EndBlock", - Handler: _ABCIApplication_EndBlock_Handler, - }, - { - MethodName: "ListSnapshots", - Handler: _ABCIApplication_ListSnapshots_Handler, - }, - { - MethodName: "OfferSnapshot", - Handler: _ABCIApplication_OfferSnapshot_Handler, - }, - { - MethodName: "LoadSnapshotChunk", - Handler: _ABCIApplication_LoadSnapshotChunk_Handler, - }, - { - MethodName: "ApplySnapshotChunk", - Handler: _ABCIApplication_ApplySnapshotChunk_Handler, - }, - }, - Streams: []grpc.StreamDesc{}, - Metadata: "tendermint/abci/types.proto", +// ExtendedCommitInfo is similar to CommitInfo except that it is only used in +// the PrepareProposal request such that Tendermint can provide vote extensions +// to the application. +type ExtendedCommitInfo struct { + // The round at which the block proposer decided in the previous height. + Round int32 `protobuf:"varint,1,opt,name=round,proto3" json:"round,omitempty"` + // List of validators' addresses in the last validator set with their voting + // information, including vote extensions. + Votes []ExtendedVoteInfo `protobuf:"bytes,2,rep,name=votes,proto3" json:"votes"` } -func (m *Request) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err - } - return dAtA[:n], nil +func (m *ExtendedCommitInfo) Reset() { *m = ExtendedCommitInfo{} } +func (m *ExtendedCommitInfo) String() string { return proto.CompactTextString(m) } +func (*ExtendedCommitInfo) ProtoMessage() {} +func (*ExtendedCommitInfo) Descriptor() ([]byte, []int) { + return fileDescriptor_252557cfdd89a31a, []int{42} } - -func (m *Request) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) +func (m *ExtendedCommitInfo) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) } - -func (m *Request) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if m.Value != nil { - { - size := m.Value.Size() - i -= size - if _, err := m.Value.MarshalTo(dAtA[i:]); err != nil { - return 0, err - } +func (m *ExtendedCommitInfo) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_ExtendedCommitInfo.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err } + return b[:n], nil } - return len(dAtA) - i, nil +} +func (m *ExtendedCommitInfo) XXX_Merge(src proto.Message) { + xxx_messageInfo_ExtendedCommitInfo.Merge(m, src) +} +func (m *ExtendedCommitInfo) XXX_Size() int { + return m.Size() +} +func (m *ExtendedCommitInfo) XXX_DiscardUnknown() { + xxx_messageInfo_ExtendedCommitInfo.DiscardUnknown(m) } -func (m *Request_Echo) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) +var xxx_messageInfo_ExtendedCommitInfo proto.InternalMessageInfo + +func (m *ExtendedCommitInfo) GetRound() int32 { + if m != nil { + return m.Round + } + return 0 } -func (m *Request_Echo) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - if m.Echo != nil { - { - size, err := m.Echo.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintTypes(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0xa +func (m *ExtendedCommitInfo) GetVotes() []ExtendedVoteInfo { + if m != nil { + return m.Votes } - return len(dAtA) - i, nil + return nil } -func (m *Request_Flush) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) + +// Event allows application developers to attach additional information to +// ResponseBeginBlock, ResponseEndBlock, ResponseCheckTx and ResponseDeliverTx. +// Later, transactions may be queried using these events. +type Event struct { + Type string `protobuf:"bytes,1,opt,name=type,proto3" json:"type,omitempty"` + Attributes []EventAttribute `protobuf:"bytes,2,rep,name=attributes,proto3" json:"attributes,omitempty"` } -func (m *Request_Flush) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - if m.Flush != nil { - { - size, err := m.Flush.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintTypes(dAtA, i, uint64(size)) +func (m *Event) Reset() { *m = Event{} } +func (m *Event) String() string { return proto.CompactTextString(m) } +func (*Event) ProtoMessage() {} +func (*Event) Descriptor() ([]byte, []int) { + return fileDescriptor_252557cfdd89a31a, []int{43} +} +func (m *Event) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *Event) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_Event.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err } - i-- - dAtA[i] = 0x12 + return b[:n], nil } - return len(dAtA) - i, nil } -func (m *Request_Info) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) +func (m *Event) XXX_Merge(src proto.Message) { + xxx_messageInfo_Event.Merge(m, src) +} +func (m *Event) XXX_Size() int { + return m.Size() +} +func (m *Event) XXX_DiscardUnknown() { + xxx_messageInfo_Event.DiscardUnknown(m) } -func (m *Request_Info) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - if m.Info != nil { - { - size, err := m.Info.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintTypes(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x1a +var xxx_messageInfo_Event proto.InternalMessageInfo + +func (m *Event) GetType() string { + if m != nil { + return m.Type } - return len(dAtA) - i, nil + return "" } -func (m *Request_InitChain) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) + +func (m *Event) GetAttributes() []EventAttribute { + if m != nil { + return m.Attributes + } + return nil } -func (m *Request_InitChain) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - if m.InitChain != nil { - { - size, err := m.InitChain.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintTypes(dAtA, i, uint64(size)) +// EventAttribute is a single key-value pair, associated with an event. +type EventAttribute struct { + Key string `protobuf:"bytes,1,opt,name=key,proto3" json:"key,omitempty"` + Value string `protobuf:"bytes,2,opt,name=value,proto3" json:"value,omitempty"` + Index bool `protobuf:"varint,3,opt,name=index,proto3" json:"index,omitempty"` +} + +func (m *EventAttribute) Reset() { *m = EventAttribute{} } +func (m *EventAttribute) String() string { return proto.CompactTextString(m) } +func (*EventAttribute) ProtoMessage() {} +func (*EventAttribute) Descriptor() ([]byte, []int) { + return fileDescriptor_252557cfdd89a31a, []int{44} +} +func (m *EventAttribute) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *EventAttribute) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_EventAttribute.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err } - i-- - dAtA[i] = 0x22 + return b[:n], nil } - return len(dAtA) - i, nil } -func (m *Request_Query) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) +func (m *EventAttribute) XXX_Merge(src proto.Message) { + xxx_messageInfo_EventAttribute.Merge(m, src) +} +func (m *EventAttribute) XXX_Size() int { + return m.Size() +} +func (m *EventAttribute) XXX_DiscardUnknown() { + xxx_messageInfo_EventAttribute.DiscardUnknown(m) } -func (m *Request_Query) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - if m.Query != nil { - { - size, err := m.Query.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintTypes(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x2a +var xxx_messageInfo_EventAttribute proto.InternalMessageInfo + +func (m *EventAttribute) GetKey() string { + if m != nil { + return m.Key } - return len(dAtA) - i, nil + return "" } -func (m *Request_BeginBlock) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) + +func (m *EventAttribute) GetValue() string { + if m != nil { + return m.Value + } + return "" } -func (m *Request_BeginBlock) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - if m.BeginBlock != nil { - { - size, err := m.BeginBlock.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintTypes(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x32 +func (m *EventAttribute) GetIndex() bool { + if m != nil { + return m.Index } - return len(dAtA) - i, nil + return false } -func (m *Request_CheckTx) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) + +// ExecTxResult contains results of executing one individual transaction. +// +// * Its structure is equivalent to #ResponseDeliverTx which will be deprecated/deleted +type ExecTxResult struct { + Code uint32 `protobuf:"varint,1,opt,name=code,proto3" json:"code,omitempty"` + Data []byte `protobuf:"bytes,2,opt,name=data,proto3" json:"data,omitempty"` + Log string `protobuf:"bytes,3,opt,name=log,proto3" json:"log,omitempty"` + Info string `protobuf:"bytes,4,opt,name=info,proto3" json:"info,omitempty"` + GasWanted int64 `protobuf:"varint,5,opt,name=gas_wanted,json=gasWanted,proto3" json:"gas_wanted,omitempty"` + GasUsed int64 `protobuf:"varint,6,opt,name=gas_used,json=gasUsed,proto3" json:"gas_used,omitempty"` + Events []Event `protobuf:"bytes,7,rep,name=events,proto3" json:"events,omitempty"` + Codespace string `protobuf:"bytes,8,opt,name=codespace,proto3" json:"codespace,omitempty"` } -func (m *Request_CheckTx) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - if m.CheckTx != nil { - { - size, err := m.CheckTx.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintTypes(dAtA, i, uint64(size)) +func (m *ExecTxResult) Reset() { *m = ExecTxResult{} } +func (m *ExecTxResult) String() string { return proto.CompactTextString(m) } +func (*ExecTxResult) ProtoMessage() {} +func (*ExecTxResult) Descriptor() ([]byte, []int) { + return fileDescriptor_252557cfdd89a31a, []int{45} +} +func (m *ExecTxResult) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *ExecTxResult) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_ExecTxResult.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err } - i-- - dAtA[i] = 0x3a + return b[:n], nil } - return len(dAtA) - i, nil } -func (m *Request_DeliverTx) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) +func (m *ExecTxResult) XXX_Merge(src proto.Message) { + xxx_messageInfo_ExecTxResult.Merge(m, src) +} +func (m *ExecTxResult) XXX_Size() int { + return m.Size() +} +func (m *ExecTxResult) XXX_DiscardUnknown() { + xxx_messageInfo_ExecTxResult.DiscardUnknown(m) } -func (m *Request_DeliverTx) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - if m.DeliverTx != nil { - { - size, err := m.DeliverTx.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintTypes(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x42 +var xxx_messageInfo_ExecTxResult proto.InternalMessageInfo + +func (m *ExecTxResult) GetCode() uint32 { + if m != nil { + return m.Code } - return len(dAtA) - i, nil + return 0 } -func (m *Request_EndBlock) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) + +func (m *ExecTxResult) GetData() []byte { + if m != nil { + return m.Data + } + return nil } -func (m *Request_EndBlock) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - if m.EndBlock != nil { - { - size, err := m.EndBlock.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintTypes(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x4a +func (m *ExecTxResult) GetLog() string { + if m != nil { + return m.Log } - return len(dAtA) - i, nil + return "" } -func (m *Request_Commit) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) + +func (m *ExecTxResult) GetInfo() string { + if m != nil { + return m.Info + } + return "" } -func (m *Request_Commit) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - if m.Commit != nil { - { - size, err := m.Commit.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintTypes(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x52 +func (m *ExecTxResult) GetGasWanted() int64 { + if m != nil { + return m.GasWanted } - return len(dAtA) - i, nil -} -func (m *Request_ListSnapshots) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) + return 0 } -func (m *Request_ListSnapshots) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - if m.ListSnapshots != nil { - { - size, err := m.ListSnapshots.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintTypes(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x5a +func (m *ExecTxResult) GetGasUsed() int64 { + if m != nil { + return m.GasUsed } - return len(dAtA) - i, nil -} -func (m *Request_OfferSnapshot) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) + return 0 } -func (m *Request_OfferSnapshot) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - if m.OfferSnapshot != nil { - { - size, err := m.OfferSnapshot.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintTypes(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x62 +func (m *ExecTxResult) GetEvents() []Event { + if m != nil { + return m.Events } - return len(dAtA) - i, nil -} -func (m *Request_LoadSnapshotChunk) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) + return nil } -func (m *Request_LoadSnapshotChunk) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - if m.LoadSnapshotChunk != nil { - { - size, err := m.LoadSnapshotChunk.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintTypes(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x6a +func (m *ExecTxResult) GetCodespace() string { + if m != nil { + return m.Codespace } - return len(dAtA) - i, nil + return "" } -func (m *Request_ApplySnapshotChunk) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) + +// TxResult contains results of executing the transaction. +// +// One usage is indexing transaction results. +type TxResult struct { + Height int64 `protobuf:"varint,1,opt,name=height,proto3" json:"height,omitempty"` + Index uint32 `protobuf:"varint,2,opt,name=index,proto3" json:"index,omitempty"` + Tx []byte `protobuf:"bytes,3,opt,name=tx,proto3" json:"tx,omitempty"` + Result ExecTxResult `protobuf:"bytes,4,opt,name=result,proto3" json:"result"` } -func (m *Request_ApplySnapshotChunk) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - if m.ApplySnapshotChunk != nil { - { - size, err := m.ApplySnapshotChunk.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintTypes(dAtA, i, uint64(size)) +func (m *TxResult) Reset() { *m = TxResult{} } +func (m *TxResult) String() string { return proto.CompactTextString(m) } +func (*TxResult) ProtoMessage() {} +func (*TxResult) Descriptor() ([]byte, []int) { + return fileDescriptor_252557cfdd89a31a, []int{46} +} +func (m *TxResult) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *TxResult) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_TxResult.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err } - i-- - dAtA[i] = 0x72 + return b[:n], nil } - return len(dAtA) - i, nil } -func (m *RequestEcho) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err - } - return dAtA[:n], nil +func (m *TxResult) XXX_Merge(src proto.Message) { + xxx_messageInfo_TxResult.Merge(m, src) } - -func (m *RequestEcho) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) +func (m *TxResult) XXX_Size() int { + return m.Size() } - -func (m *RequestEcho) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if len(m.Message) > 0 { - i -= len(m.Message) - copy(dAtA[i:], m.Message) - i = encodeVarintTypes(dAtA, i, uint64(len(m.Message))) - i-- - dAtA[i] = 0xa - } - return len(dAtA) - i, nil +func (m *TxResult) XXX_DiscardUnknown() { + xxx_messageInfo_TxResult.DiscardUnknown(m) } -func (m *RequestFlush) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err +var xxx_messageInfo_TxResult proto.InternalMessageInfo + +func (m *TxResult) GetHeight() int64 { + if m != nil { + return m.Height } - return dAtA[:n], nil + return 0 } -func (m *RequestFlush) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) +func (m *TxResult) GetIndex() uint32 { + if m != nil { + return m.Index + } + return 0 } -func (m *RequestFlush) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - return len(dAtA) - i, nil +func (m *TxResult) GetTx() []byte { + if m != nil { + return m.Tx + } + return nil } -func (m *RequestInfo) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err +func (m *TxResult) GetResult() ExecTxResult { + if m != nil { + return m.Result } - return dAtA[:n], nil + return ExecTxResult{} } -func (m *RequestInfo) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) +type TxRecord struct { + Action TxRecord_TxAction `protobuf:"varint,1,opt,name=action,proto3,enum=tendermint.abci.TxRecord_TxAction" json:"action,omitempty"` + Tx []byte `protobuf:"bytes,2,opt,name=tx,proto3" json:"tx,omitempty"` } -func (m *RequestInfo) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if len(m.AbciVersion) > 0 { - i -= len(m.AbciVersion) - copy(dAtA[i:], m.AbciVersion) - i = encodeVarintTypes(dAtA, i, uint64(len(m.AbciVersion))) - i-- - dAtA[i] = 0x22 - } - if m.P2PVersion != 0 { - i = encodeVarintTypes(dAtA, i, uint64(m.P2PVersion)) - i-- - dAtA[i] = 0x18 - } - if m.BlockVersion != 0 { - i = encodeVarintTypes(dAtA, i, uint64(m.BlockVersion)) - i-- - dAtA[i] = 0x10 - } - if len(m.Version) > 0 { - i -= len(m.Version) - copy(dAtA[i:], m.Version) - i = encodeVarintTypes(dAtA, i, uint64(len(m.Version))) - i-- - dAtA[i] = 0xa +func (m *TxRecord) Reset() { *m = TxRecord{} } +func (m *TxRecord) String() string { return proto.CompactTextString(m) } +func (*TxRecord) ProtoMessage() {} +func (*TxRecord) Descriptor() ([]byte, []int) { + return fileDescriptor_252557cfdd89a31a, []int{47} +} +func (m *TxRecord) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *TxRecord) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_TxRecord.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil } - return len(dAtA) - i, nil +} +func (m *TxRecord) XXX_Merge(src proto.Message) { + xxx_messageInfo_TxRecord.Merge(m, src) +} +func (m *TxRecord) XXX_Size() int { + return m.Size() +} +func (m *TxRecord) XXX_DiscardUnknown() { + xxx_messageInfo_TxRecord.DiscardUnknown(m) } -func (m *RequestInitChain) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err +var xxx_messageInfo_TxRecord proto.InternalMessageInfo + +func (m *TxRecord) GetAction() TxRecord_TxAction { + if m != nil { + return m.Action } - return dAtA[:n], nil + return TxRecord_UNKNOWN } -func (m *RequestInitChain) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) +func (m *TxRecord) GetTx() []byte { + if m != nil { + return m.Tx + } + return nil } -func (m *RequestInitChain) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if m.InitialCoreHeight != 0 { - i = encodeVarintTypes(dAtA, i, uint64(m.InitialCoreHeight)) - i-- - dAtA[i] = 0x38 - } - if m.InitialHeight != 0 { - i = encodeVarintTypes(dAtA, i, uint64(m.InitialHeight)) - i-- - dAtA[i] = 0x30 - } - if len(m.AppStateBytes) > 0 { - i -= len(m.AppStateBytes) - copy(dAtA[i:], m.AppStateBytes) - i = encodeVarintTypes(dAtA, i, uint64(len(m.AppStateBytes))) - i-- - dAtA[i] = 0x2a - } - if m.ValidatorSet != nil { - { - size, err := m.ValidatorSet.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintTypes(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x22 - } - if m.ConsensusParams != nil { - { - size, err := m.ConsensusParams.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintTypes(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x1a - } - if len(m.ChainId) > 0 { - i -= len(m.ChainId) - copy(dAtA[i:], m.ChainId) - i = encodeVarintTypes(dAtA, i, uint64(len(m.ChainId))) - i-- - dAtA[i] = 0x12 - } - n17, err17 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.Time, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.Time):]) - if err17 != nil { - return 0, err17 - } - i -= n17 - i = encodeVarintTypes(dAtA, i, uint64(n17)) - i-- - dAtA[i] = 0xa - return len(dAtA) - i, nil +// Validator +type Validator struct { + // bytes address = 1; // The first 20 bytes of SHA256(public key) + // PubKey pub_key = 2 [(gogoproto.nullable)=false]; + Power int64 `protobuf:"varint,3,opt,name=power,proto3" json:"power,omitempty"` + ProTxHash []byte `protobuf:"bytes,4,opt,name=pro_tx_hash,json=proTxHash,proto3" json:"pro_tx_hash,omitempty"` } -func (m *RequestQuery) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err - } - return dAtA[:n], nil +func (m *Validator) Reset() { *m = Validator{} } +func (m *Validator) String() string { return proto.CompactTextString(m) } +func (*Validator) ProtoMessage() {} +func (*Validator) Descriptor() ([]byte, []int) { + return fileDescriptor_252557cfdd89a31a, []int{48} } - -func (m *RequestQuery) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) +func (m *Validator) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) } - -func (m *RequestQuery) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if m.Prove { - i-- - if m.Prove { - dAtA[i] = 1 - } else { - dAtA[i] = 0 +func (m *Validator) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_Validator.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err } - i-- - dAtA[i] = 0x20 - } - if m.Height != 0 { - i = encodeVarintTypes(dAtA, i, uint64(m.Height)) - i-- - dAtA[i] = 0x18 - } - if len(m.Path) > 0 { - i -= len(m.Path) - copy(dAtA[i:], m.Path) - i = encodeVarintTypes(dAtA, i, uint64(len(m.Path))) - i-- - dAtA[i] = 0x12 + return b[:n], nil } - if len(m.Data) > 0 { - i -= len(m.Data) - copy(dAtA[i:], m.Data) - i = encodeVarintTypes(dAtA, i, uint64(len(m.Data))) - i-- - dAtA[i] = 0xa +} +func (m *Validator) XXX_Merge(src proto.Message) { + xxx_messageInfo_Validator.Merge(m, src) +} +func (m *Validator) XXX_Size() int { + return m.Size() +} +func (m *Validator) XXX_DiscardUnknown() { + xxx_messageInfo_Validator.DiscardUnknown(m) +} + +var xxx_messageInfo_Validator proto.InternalMessageInfo + +func (m *Validator) GetPower() int64 { + if m != nil { + return m.Power } - return len(dAtA) - i, nil + return 0 } -func (m *RequestBeginBlock) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err +func (m *Validator) GetProTxHash() []byte { + if m != nil { + return m.ProTxHash } - return dAtA[:n], nil + return nil } -func (m *RequestBeginBlock) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) +// ValidatorUpdate +type ValidatorUpdate struct { + PubKey *crypto.PublicKey `protobuf:"bytes,1,opt,name=pub_key,json=pubKey,proto3" json:"pub_key,omitempty"` + Power int64 `protobuf:"varint,2,opt,name=power,proto3" json:"power,omitempty"` + ProTxHash []byte `protobuf:"bytes,3,opt,name=pro_tx_hash,json=proTxHash,proto3" json:"pro_tx_hash,omitempty"` + NodeAddress string `protobuf:"bytes,4,opt,name=node_address,json=nodeAddress,proto3" json:"node_address,omitempty"` } -func (m *RequestBeginBlock) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if len(m.ByzantineValidators) > 0 { - for iNdEx := len(m.ByzantineValidators) - 1; iNdEx >= 0; iNdEx-- { - { - size, err := m.ByzantineValidators[iNdEx].MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintTypes(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x22 - } - } - { - size, err := m.LastCommitInfo.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintTypes(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x1a - { - size, err := m.Header.MarshalToSizedBuffer(dAtA[:i]) +func (m *ValidatorUpdate) Reset() { *m = ValidatorUpdate{} } +func (m *ValidatorUpdate) String() string { return proto.CompactTextString(m) } +func (*ValidatorUpdate) ProtoMessage() {} +func (*ValidatorUpdate) Descriptor() ([]byte, []int) { + return fileDescriptor_252557cfdd89a31a, []int{49} +} +func (m *ValidatorUpdate) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *ValidatorUpdate) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_ValidatorUpdate.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) if err != nil { - return 0, err + return nil, err } - i -= size - i = encodeVarintTypes(dAtA, i, uint64(size)) + return b[:n], nil } - i-- - dAtA[i] = 0x12 - if len(m.Hash) > 0 { - i -= len(m.Hash) - copy(dAtA[i:], m.Hash) - i = encodeVarintTypes(dAtA, i, uint64(len(m.Hash))) - i-- - dAtA[i] = 0xa +} +func (m *ValidatorUpdate) XXX_Merge(src proto.Message) { + xxx_messageInfo_ValidatorUpdate.Merge(m, src) +} +func (m *ValidatorUpdate) XXX_Size() int { + return m.Size() +} +func (m *ValidatorUpdate) XXX_DiscardUnknown() { + xxx_messageInfo_ValidatorUpdate.DiscardUnknown(m) +} + +var xxx_messageInfo_ValidatorUpdate proto.InternalMessageInfo + +func (m *ValidatorUpdate) GetPubKey() *crypto.PublicKey { + if m != nil { + return m.PubKey } - return len(dAtA) - i, nil + return nil } -func (m *RequestCheckTx) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err +func (m *ValidatorUpdate) GetPower() int64 { + if m != nil { + return m.Power } - return dAtA[:n], nil + return 0 } -func (m *RequestCheckTx) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) +func (m *ValidatorUpdate) GetProTxHash() []byte { + if m != nil { + return m.ProTxHash + } + return nil } -func (m *RequestCheckTx) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if m.Type != 0 { - i = encodeVarintTypes(dAtA, i, uint64(m.Type)) - i-- - dAtA[i] = 0x10 - } - if len(m.Tx) > 0 { - i -= len(m.Tx) - copy(dAtA[i:], m.Tx) - i = encodeVarintTypes(dAtA, i, uint64(len(m.Tx))) - i-- - dAtA[i] = 0xa +func (m *ValidatorUpdate) GetNodeAddress() string { + if m != nil { + return m.NodeAddress } - return len(dAtA) - i, nil + return "" } -func (m *RequestDeliverTx) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err - } - return dAtA[:n], nil +type ValidatorSetUpdate struct { + ValidatorUpdates []ValidatorUpdate `protobuf:"bytes,1,rep,name=validator_updates,json=validatorUpdates,proto3" json:"validator_updates"` + ThresholdPublicKey crypto.PublicKey `protobuf:"bytes,2,opt,name=threshold_public_key,json=thresholdPublicKey,proto3" json:"threshold_public_key"` + QuorumHash []byte `protobuf:"bytes,3,opt,name=quorum_hash,json=quorumHash,proto3" json:"quorum_hash,omitempty"` } -func (m *RequestDeliverTx) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) +func (m *ValidatorSetUpdate) Reset() { *m = ValidatorSetUpdate{} } +func (m *ValidatorSetUpdate) String() string { return proto.CompactTextString(m) } +func (*ValidatorSetUpdate) ProtoMessage() {} +func (*ValidatorSetUpdate) Descriptor() ([]byte, []int) { + return fileDescriptor_252557cfdd89a31a, []int{50} } - -func (m *RequestDeliverTx) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if len(m.Tx) > 0 { - i -= len(m.Tx) - copy(dAtA[i:], m.Tx) - i = encodeVarintTypes(dAtA, i, uint64(len(m.Tx))) - i-- - dAtA[i] = 0xa - } - return len(dAtA) - i, nil +func (m *ValidatorSetUpdate) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) } - -func (m *RequestEndBlock) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err +func (m *ValidatorSetUpdate) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_ValidatorSetUpdate.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil } - return dAtA[:n], nil } - -func (m *RequestEndBlock) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) +func (m *ValidatorSetUpdate) XXX_Merge(src proto.Message) { + xxx_messageInfo_ValidatorSetUpdate.Merge(m, src) +} +func (m *ValidatorSetUpdate) XXX_Size() int { + return m.Size() +} +func (m *ValidatorSetUpdate) XXX_DiscardUnknown() { + xxx_messageInfo_ValidatorSetUpdate.DiscardUnknown(m) } -func (m *RequestEndBlock) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if m.Height != 0 { - i = encodeVarintTypes(dAtA, i, uint64(m.Height)) - i-- - dAtA[i] = 0x8 +var xxx_messageInfo_ValidatorSetUpdate proto.InternalMessageInfo + +func (m *ValidatorSetUpdate) GetValidatorUpdates() []ValidatorUpdate { + if m != nil { + return m.ValidatorUpdates } - return len(dAtA) - i, nil + return nil } -func (m *RequestCommit) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err +func (m *ValidatorSetUpdate) GetThresholdPublicKey() crypto.PublicKey { + if m != nil { + return m.ThresholdPublicKey } - return dAtA[:n], nil + return crypto.PublicKey{} } -func (m *RequestCommit) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) +func (m *ValidatorSetUpdate) GetQuorumHash() []byte { + if m != nil { + return m.QuorumHash + } + return nil } -func (m *RequestCommit) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - return len(dAtA) - i, nil +type ThresholdPublicKeyUpdate struct { + ThresholdPublicKey crypto.PublicKey `protobuf:"bytes,1,opt,name=threshold_public_key,json=thresholdPublicKey,proto3" json:"threshold_public_key"` } -func (m *RequestListSnapshots) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err +func (m *ThresholdPublicKeyUpdate) Reset() { *m = ThresholdPublicKeyUpdate{} } +func (m *ThresholdPublicKeyUpdate) String() string { return proto.CompactTextString(m) } +func (*ThresholdPublicKeyUpdate) ProtoMessage() {} +func (*ThresholdPublicKeyUpdate) Descriptor() ([]byte, []int) { + return fileDescriptor_252557cfdd89a31a, []int{51} +} +func (m *ThresholdPublicKeyUpdate) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *ThresholdPublicKeyUpdate) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_ThresholdPublicKeyUpdate.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil } - return dAtA[:n], nil } - -func (m *RequestListSnapshots) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) +func (m *ThresholdPublicKeyUpdate) XXX_Merge(src proto.Message) { + xxx_messageInfo_ThresholdPublicKeyUpdate.Merge(m, src) } - -func (m *RequestListSnapshots) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - return len(dAtA) - i, nil +func (m *ThresholdPublicKeyUpdate) XXX_Size() int { + return m.Size() +} +func (m *ThresholdPublicKeyUpdate) XXX_DiscardUnknown() { + xxx_messageInfo_ThresholdPublicKeyUpdate.DiscardUnknown(m) } -func (m *RequestOfferSnapshot) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err +var xxx_messageInfo_ThresholdPublicKeyUpdate proto.InternalMessageInfo + +func (m *ThresholdPublicKeyUpdate) GetThresholdPublicKey() crypto.PublicKey { + if m != nil { + return m.ThresholdPublicKey } - return dAtA[:n], nil + return crypto.PublicKey{} } -func (m *RequestOfferSnapshot) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) +type QuorumHashUpdate struct { + QuorumHash []byte `protobuf:"bytes,1,opt,name=quorum_hash,json=quorumHash,proto3" json:"quorum_hash,omitempty"` } -func (m *RequestOfferSnapshot) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if len(m.AppHash) > 0 { - i -= len(m.AppHash) - copy(dAtA[i:], m.AppHash) - i = encodeVarintTypes(dAtA, i, uint64(len(m.AppHash))) - i-- - dAtA[i] = 0x12 - } - if m.Snapshot != nil { - { - size, err := m.Snapshot.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintTypes(dAtA, i, uint64(size)) +func (m *QuorumHashUpdate) Reset() { *m = QuorumHashUpdate{} } +func (m *QuorumHashUpdate) String() string { return proto.CompactTextString(m) } +func (*QuorumHashUpdate) ProtoMessage() {} +func (*QuorumHashUpdate) Descriptor() ([]byte, []int) { + return fileDescriptor_252557cfdd89a31a, []int{52} +} +func (m *QuorumHashUpdate) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *QuorumHashUpdate) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_QuorumHashUpdate.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err } - i-- - dAtA[i] = 0xa + return b[:n], nil } - return len(dAtA) - i, nil +} +func (m *QuorumHashUpdate) XXX_Merge(src proto.Message) { + xxx_messageInfo_QuorumHashUpdate.Merge(m, src) +} +func (m *QuorumHashUpdate) XXX_Size() int { + return m.Size() +} +func (m *QuorumHashUpdate) XXX_DiscardUnknown() { + xxx_messageInfo_QuorumHashUpdate.DiscardUnknown(m) } -func (m *RequestLoadSnapshotChunk) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err +var xxx_messageInfo_QuorumHashUpdate proto.InternalMessageInfo + +func (m *QuorumHashUpdate) GetQuorumHash() []byte { + if m != nil { + return m.QuorumHash } - return dAtA[:n], nil + return nil } -func (m *RequestLoadSnapshotChunk) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) +// VoteInfo +type VoteInfo struct { + Validator Validator `protobuf:"bytes,1,opt,name=validator,proto3" json:"validator"` + SignedLastBlock bool `protobuf:"varint,2,opt,name=signed_last_block,json=signedLastBlock,proto3" json:"signed_last_block,omitempty"` } -func (m *RequestLoadSnapshotChunk) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if m.Chunk != 0 { - i = encodeVarintTypes(dAtA, i, uint64(m.Chunk)) - i-- - dAtA[i] = 0x18 - } - if m.Format != 0 { - i = encodeVarintTypes(dAtA, i, uint64(m.Format)) - i-- - dAtA[i] = 0x10 +func (m *VoteInfo) Reset() { *m = VoteInfo{} } +func (m *VoteInfo) String() string { return proto.CompactTextString(m) } +func (*VoteInfo) ProtoMessage() {} +func (*VoteInfo) Descriptor() ([]byte, []int) { + return fileDescriptor_252557cfdd89a31a, []int{53} +} +func (m *VoteInfo) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *VoteInfo) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_VoteInfo.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil } - if m.Height != 0 { - i = encodeVarintTypes(dAtA, i, uint64(m.Height)) - i-- - dAtA[i] = 0x8 +} +func (m *VoteInfo) XXX_Merge(src proto.Message) { + xxx_messageInfo_VoteInfo.Merge(m, src) +} +func (m *VoteInfo) XXX_Size() int { + return m.Size() +} +func (m *VoteInfo) XXX_DiscardUnknown() { + xxx_messageInfo_VoteInfo.DiscardUnknown(m) +} + +var xxx_messageInfo_VoteInfo proto.InternalMessageInfo + +func (m *VoteInfo) GetValidator() Validator { + if m != nil { + return m.Validator } - return len(dAtA) - i, nil + return Validator{} } -func (m *RequestApplySnapshotChunk) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err +func (m *VoteInfo) GetSignedLastBlock() bool { + if m != nil { + return m.SignedLastBlock } - return dAtA[:n], nil + return false } -func (m *RequestApplySnapshotChunk) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) +// ExtendedVoteInfo +type ExtendedVoteInfo struct { + // The validator that sent the vote. + Validator Validator `protobuf:"bytes,1,opt,name=validator,proto3" json:"validator"` + // Indicates whether the validator signed the last block, allowing for rewards based on validator availability. + SignedLastBlock bool `protobuf:"varint,2,opt,name=signed_last_block,json=signedLastBlock,proto3" json:"signed_last_block,omitempty"` + // Non-deterministic extension provided by the sending validator's application. + VoteExtension []byte `protobuf:"bytes,3,opt,name=vote_extension,json=voteExtension,proto3" json:"vote_extension,omitempty"` } -func (m *RequestApplySnapshotChunk) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if len(m.Sender) > 0 { - i -= len(m.Sender) - copy(dAtA[i:], m.Sender) - i = encodeVarintTypes(dAtA, i, uint64(len(m.Sender))) - i-- - dAtA[i] = 0x1a - } - if len(m.Chunk) > 0 { - i -= len(m.Chunk) - copy(dAtA[i:], m.Chunk) - i = encodeVarintTypes(dAtA, i, uint64(len(m.Chunk))) - i-- - dAtA[i] = 0x12 - } - if m.Index != 0 { - i = encodeVarintTypes(dAtA, i, uint64(m.Index)) - i-- - dAtA[i] = 0x8 +func (m *ExtendedVoteInfo) Reset() { *m = ExtendedVoteInfo{} } +func (m *ExtendedVoteInfo) String() string { return proto.CompactTextString(m) } +func (*ExtendedVoteInfo) ProtoMessage() {} +func (*ExtendedVoteInfo) Descriptor() ([]byte, []int) { + return fileDescriptor_252557cfdd89a31a, []int{54} +} +func (m *ExtendedVoteInfo) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *ExtendedVoteInfo) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_ExtendedVoteInfo.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil } - return len(dAtA) - i, nil +} +func (m *ExtendedVoteInfo) XXX_Merge(src proto.Message) { + xxx_messageInfo_ExtendedVoteInfo.Merge(m, src) +} +func (m *ExtendedVoteInfo) XXX_Size() int { + return m.Size() +} +func (m *ExtendedVoteInfo) XXX_DiscardUnknown() { + xxx_messageInfo_ExtendedVoteInfo.DiscardUnknown(m) } -func (m *Response) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err +var xxx_messageInfo_ExtendedVoteInfo proto.InternalMessageInfo + +func (m *ExtendedVoteInfo) GetValidator() Validator { + if m != nil { + return m.Validator } - return dAtA[:n], nil + return Validator{} } -func (m *Response) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) +func (m *ExtendedVoteInfo) GetSignedLastBlock() bool { + if m != nil { + return m.SignedLastBlock + } + return false } -func (m *Response) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if m.Value != nil { - { - size := m.Value.Size() - i -= size - if _, err := m.Value.MarshalTo(dAtA[i:]); err != nil { - return 0, err - } - } +func (m *ExtendedVoteInfo) GetVoteExtension() []byte { + if m != nil { + return m.VoteExtension } - return len(dAtA) - i, nil + return nil } -func (m *Response_Exception) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) +type Misbehavior struct { + Type MisbehaviorType `protobuf:"varint,1,opt,name=type,proto3,enum=tendermint.abci.MisbehaviorType" json:"type,omitempty"` + // The offending validator + Validator Validator `protobuf:"bytes,2,opt,name=validator,proto3" json:"validator"` + // The height when the offense occurred + Height int64 `protobuf:"varint,3,opt,name=height,proto3" json:"height,omitempty"` + // The corresponding time where the offense occurred + Time time.Time `protobuf:"bytes,4,opt,name=time,proto3,stdtime" json:"time"` + // Total voting power of the validator set in case the ABCI application does + // not store historical validators. + // https://github.com/tendermint/tendermint/issues/4581 + TotalVotingPower int64 `protobuf:"varint,5,opt,name=total_voting_power,json=totalVotingPower,proto3" json:"total_voting_power,omitempty"` } -func (m *Response_Exception) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - if m.Exception != nil { - { - size, err := m.Exception.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintTypes(dAtA, i, uint64(size)) +func (m *Misbehavior) Reset() { *m = Misbehavior{} } +func (m *Misbehavior) String() string { return proto.CompactTextString(m) } +func (*Misbehavior) ProtoMessage() {} +func (*Misbehavior) Descriptor() ([]byte, []int) { + return fileDescriptor_252557cfdd89a31a, []int{55} +} +func (m *Misbehavior) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *Misbehavior) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_Misbehavior.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err } - i-- - dAtA[i] = 0xa + return b[:n], nil } - return len(dAtA) - i, nil } -func (m *Response_Echo) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) +func (m *Misbehavior) XXX_Merge(src proto.Message) { + xxx_messageInfo_Misbehavior.Merge(m, src) +} +func (m *Misbehavior) XXX_Size() int { + return m.Size() +} +func (m *Misbehavior) XXX_DiscardUnknown() { + xxx_messageInfo_Misbehavior.DiscardUnknown(m) } -func (m *Response_Echo) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - if m.Echo != nil { - { - size, err := m.Echo.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintTypes(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x12 +var xxx_messageInfo_Misbehavior proto.InternalMessageInfo + +func (m *Misbehavior) GetType() MisbehaviorType { + if m != nil { + return m.Type } - return len(dAtA) - i, nil -} -func (m *Response_Flush) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) + return MisbehaviorType_UNKNOWN } -func (m *Response_Flush) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - if m.Flush != nil { - { - size, err := m.Flush.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintTypes(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x1a +func (m *Misbehavior) GetValidator() Validator { + if m != nil { + return m.Validator } - return len(dAtA) - i, nil + return Validator{} } -func (m *Response_Info) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) + +func (m *Misbehavior) GetHeight() int64 { + if m != nil { + return m.Height + } + return 0 } -func (m *Response_Info) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - if m.Info != nil { - { - size, err := m.Info.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintTypes(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x22 +func (m *Misbehavior) GetTime() time.Time { + if m != nil { + return m.Time } - return len(dAtA) - i, nil + return time.Time{} } -func (m *Response_InitChain) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) + +func (m *Misbehavior) GetTotalVotingPower() int64 { + if m != nil { + return m.TotalVotingPower + } + return 0 } -func (m *Response_InitChain) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - if m.InitChain != nil { - { - size, err := m.InitChain.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintTypes(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x2a - } - return len(dAtA) - i, nil -} -func (m *Response_Query) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) +type Snapshot struct { + Height uint64 `protobuf:"varint,1,opt,name=height,proto3" json:"height,omitempty"` + Format uint32 `protobuf:"varint,2,opt,name=format,proto3" json:"format,omitempty"` + Chunks uint32 `protobuf:"varint,3,opt,name=chunks,proto3" json:"chunks,omitempty"` + Hash []byte `protobuf:"bytes,4,opt,name=hash,proto3" json:"hash,omitempty"` + Metadata []byte `protobuf:"bytes,5,opt,name=metadata,proto3" json:"metadata,omitempty"` + CoreChainLockedHeight uint32 `protobuf:"varint,100,opt,name=core_chain_locked_height,json=coreChainLockedHeight,proto3" json:"core_chain_locked_height,omitempty"` } -func (m *Response_Query) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - if m.Query != nil { - { - size, err := m.Query.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintTypes(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x32 - } - return len(dAtA) - i, nil +func (m *Snapshot) Reset() { *m = Snapshot{} } +func (m *Snapshot) String() string { return proto.CompactTextString(m) } +func (*Snapshot) ProtoMessage() {} +func (*Snapshot) Descriptor() ([]byte, []int) { + return fileDescriptor_252557cfdd89a31a, []int{56} } -func (m *Response_BeginBlock) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) +func (m *Snapshot) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) } - -func (m *Response_BeginBlock) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - if m.BeginBlock != nil { - { - size, err := m.BeginBlock.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintTypes(dAtA, i, uint64(size)) +func (m *Snapshot) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_Snapshot.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err } - i-- - dAtA[i] = 0x3a + return b[:n], nil } - return len(dAtA) - i, nil } -func (m *Response_CheckTx) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) +func (m *Snapshot) XXX_Merge(src proto.Message) { + xxx_messageInfo_Snapshot.Merge(m, src) } - -func (m *Response_CheckTx) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - if m.CheckTx != nil { - { - size, err := m.CheckTx.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintTypes(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x42 - } - return len(dAtA) - i, nil +func (m *Snapshot) XXX_Size() int { + return m.Size() } -func (m *Response_DeliverTx) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) +func (m *Snapshot) XXX_DiscardUnknown() { + xxx_messageInfo_Snapshot.DiscardUnknown(m) } -func (m *Response_DeliverTx) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - if m.DeliverTx != nil { - { - size, err := m.DeliverTx.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintTypes(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x4a - } - return len(dAtA) - i, nil -} -func (m *Response_EndBlock) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} +var xxx_messageInfo_Snapshot proto.InternalMessageInfo -func (m *Response_EndBlock) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - if m.EndBlock != nil { - { - size, err := m.EndBlock.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintTypes(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x52 +func (m *Snapshot) GetHeight() uint64 { + if m != nil { + return m.Height } - return len(dAtA) - i, nil -} -func (m *Response_Commit) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) + return 0 } -func (m *Response_Commit) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - if m.Commit != nil { - { - size, err := m.Commit.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintTypes(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x5a +func (m *Snapshot) GetFormat() uint32 { + if m != nil { + return m.Format } - return len(dAtA) - i, nil -} -func (m *Response_ListSnapshots) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) + return 0 } -func (m *Response_ListSnapshots) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - if m.ListSnapshots != nil { - { - size, err := m.ListSnapshots.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintTypes(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x62 +func (m *Snapshot) GetChunks() uint32 { + if m != nil { + return m.Chunks } - return len(dAtA) - i, nil -} -func (m *Response_OfferSnapshot) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) + return 0 } -func (m *Response_OfferSnapshot) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - if m.OfferSnapshot != nil { - { - size, err := m.OfferSnapshot.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintTypes(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x6a +func (m *Snapshot) GetHash() []byte { + if m != nil { + return m.Hash } - return len(dAtA) - i, nil -} -func (m *Response_LoadSnapshotChunk) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) + return nil } -func (m *Response_LoadSnapshotChunk) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - if m.LoadSnapshotChunk != nil { - { - size, err := m.LoadSnapshotChunk.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintTypes(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x72 +func (m *Snapshot) GetMetadata() []byte { + if m != nil { + return m.Metadata } - return len(dAtA) - i, nil -} -func (m *Response_ApplySnapshotChunk) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) + return nil } -func (m *Response_ApplySnapshotChunk) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - if m.ApplySnapshotChunk != nil { - { - size, err := m.ApplySnapshotChunk.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintTypes(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x7a +func (m *Snapshot) GetCoreChainLockedHeight() uint32 { + if m != nil { + return m.CoreChainLockedHeight } - return len(dAtA) - i, nil + return 0 } -func (m *ResponseException) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err - } - return dAtA[:n], nil + +func init() { + proto.RegisterEnum("tendermint.abci.CheckTxType", CheckTxType_name, CheckTxType_value) + proto.RegisterEnum("tendermint.abci.MisbehaviorType", MisbehaviorType_name, MisbehaviorType_value) + proto.RegisterEnum("tendermint.abci.ResponseOfferSnapshot_Result", ResponseOfferSnapshot_Result_name, ResponseOfferSnapshot_Result_value) + proto.RegisterEnum("tendermint.abci.ResponseApplySnapshotChunk_Result", ResponseApplySnapshotChunk_Result_name, ResponseApplySnapshotChunk_Result_value) + proto.RegisterEnum("tendermint.abci.ResponseProcessProposal_ProposalStatus", ResponseProcessProposal_ProposalStatus_name, ResponseProcessProposal_ProposalStatus_value) + proto.RegisterEnum("tendermint.abci.ResponseVerifyVoteExtension_VerifyStatus", ResponseVerifyVoteExtension_VerifyStatus_name, ResponseVerifyVoteExtension_VerifyStatus_value) + proto.RegisterEnum("tendermint.abci.TxRecord_TxAction", TxRecord_TxAction_name, TxRecord_TxAction_value) + proto.RegisterType((*Request)(nil), "tendermint.abci.Request") + proto.RegisterType((*RequestEcho)(nil), "tendermint.abci.RequestEcho") + proto.RegisterType((*RequestFlush)(nil), "tendermint.abci.RequestFlush") + proto.RegisterType((*RequestInfo)(nil), "tendermint.abci.RequestInfo") + proto.RegisterType((*RequestInitChain)(nil), "tendermint.abci.RequestInitChain") + proto.RegisterType((*RequestQuery)(nil), "tendermint.abci.RequestQuery") + proto.RegisterType((*RequestBeginBlock)(nil), "tendermint.abci.RequestBeginBlock") + proto.RegisterType((*RequestCheckTx)(nil), "tendermint.abci.RequestCheckTx") + proto.RegisterType((*RequestDeliverTx)(nil), "tendermint.abci.RequestDeliverTx") + proto.RegisterType((*RequestEndBlock)(nil), "tendermint.abci.RequestEndBlock") + proto.RegisterType((*RequestCommit)(nil), "tendermint.abci.RequestCommit") + proto.RegisterType((*RequestListSnapshots)(nil), "tendermint.abci.RequestListSnapshots") + proto.RegisterType((*RequestOfferSnapshot)(nil), "tendermint.abci.RequestOfferSnapshot") + proto.RegisterType((*RequestLoadSnapshotChunk)(nil), "tendermint.abci.RequestLoadSnapshotChunk") + proto.RegisterType((*RequestApplySnapshotChunk)(nil), "tendermint.abci.RequestApplySnapshotChunk") + proto.RegisterType((*RequestPrepareProposal)(nil), "tendermint.abci.RequestPrepareProposal") + proto.RegisterType((*RequestProcessProposal)(nil), "tendermint.abci.RequestProcessProposal") + proto.RegisterType((*RequestExtendVote)(nil), "tendermint.abci.RequestExtendVote") + proto.RegisterType((*RequestVerifyVoteExtension)(nil), "tendermint.abci.RequestVerifyVoteExtension") + proto.RegisterType((*RequestFinalizeBlock)(nil), "tendermint.abci.RequestFinalizeBlock") + proto.RegisterType((*Response)(nil), "tendermint.abci.Response") + proto.RegisterType((*ResponseException)(nil), "tendermint.abci.ResponseException") + proto.RegisterType((*ResponseEcho)(nil), "tendermint.abci.ResponseEcho") + proto.RegisterType((*ResponseFlush)(nil), "tendermint.abci.ResponseFlush") + proto.RegisterType((*ResponseInfo)(nil), "tendermint.abci.ResponseInfo") + proto.RegisterType((*ResponseInitChain)(nil), "tendermint.abci.ResponseInitChain") + proto.RegisterType((*ResponseQuery)(nil), "tendermint.abci.ResponseQuery") + proto.RegisterType((*ResponseBeginBlock)(nil), "tendermint.abci.ResponseBeginBlock") + proto.RegisterType((*ResponseCheckTx)(nil), "tendermint.abci.ResponseCheckTx") + proto.RegisterType((*ResponseDeliverTx)(nil), "tendermint.abci.ResponseDeliverTx") + proto.RegisterType((*ResponseEndBlock)(nil), "tendermint.abci.ResponseEndBlock") + proto.RegisterType((*ResponseCommit)(nil), "tendermint.abci.ResponseCommit") + proto.RegisterType((*ResponseListSnapshots)(nil), "tendermint.abci.ResponseListSnapshots") + proto.RegisterType((*ResponseOfferSnapshot)(nil), "tendermint.abci.ResponseOfferSnapshot") + proto.RegisterType((*ResponseLoadSnapshotChunk)(nil), "tendermint.abci.ResponseLoadSnapshotChunk") + proto.RegisterType((*ResponseApplySnapshotChunk)(nil), "tendermint.abci.ResponseApplySnapshotChunk") + proto.RegisterType((*ResponsePrepareProposal)(nil), "tendermint.abci.ResponsePrepareProposal") + proto.RegisterType((*ResponseProcessProposal)(nil), "tendermint.abci.ResponseProcessProposal") + proto.RegisterType((*ResponseExtendVote)(nil), "tendermint.abci.ResponseExtendVote") + proto.RegisterType((*ResponseVerifyVoteExtension)(nil), "tendermint.abci.ResponseVerifyVoteExtension") + proto.RegisterType((*ResponseFinalizeBlock)(nil), "tendermint.abci.ResponseFinalizeBlock") + proto.RegisterType((*CommitInfo)(nil), "tendermint.abci.CommitInfo") + proto.RegisterType((*ExtendedCommitInfo)(nil), "tendermint.abci.ExtendedCommitInfo") + proto.RegisterType((*Event)(nil), "tendermint.abci.Event") + proto.RegisterType((*EventAttribute)(nil), "tendermint.abci.EventAttribute") + proto.RegisterType((*ExecTxResult)(nil), "tendermint.abci.ExecTxResult") + proto.RegisterType((*TxResult)(nil), "tendermint.abci.TxResult") + proto.RegisterType((*TxRecord)(nil), "tendermint.abci.TxRecord") + proto.RegisterType((*Validator)(nil), "tendermint.abci.Validator") + proto.RegisterType((*ValidatorUpdate)(nil), "tendermint.abci.ValidatorUpdate") + proto.RegisterType((*ValidatorSetUpdate)(nil), "tendermint.abci.ValidatorSetUpdate") + proto.RegisterType((*ThresholdPublicKeyUpdate)(nil), "tendermint.abci.ThresholdPublicKeyUpdate") + proto.RegisterType((*QuorumHashUpdate)(nil), "tendermint.abci.QuorumHashUpdate") + proto.RegisterType((*VoteInfo)(nil), "tendermint.abci.VoteInfo") + proto.RegisterType((*ExtendedVoteInfo)(nil), "tendermint.abci.ExtendedVoteInfo") + proto.RegisterType((*Misbehavior)(nil), "tendermint.abci.Misbehavior") + proto.RegisterType((*Snapshot)(nil), "tendermint.abci.Snapshot") } -func (m *ResponseException) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) +func init() { proto.RegisterFile("tendermint/abci/types.proto", fileDescriptor_252557cfdd89a31a) } + +var fileDescriptor_252557cfdd89a31a = []byte{ + // 3742 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xec, 0x5b, 0xcb, 0x6f, 0x1b, 0xd7, + 0xd5, 0xe7, 0xf0, 0x25, 0xf2, 0x50, 0x7c, 0xe8, 0x4a, 0xb6, 0x69, 0xda, 0x96, 0x94, 0x31, 0x1c, + 0x3b, 0x4e, 0x22, 0x25, 0xf2, 0x97, 0xc4, 0xf9, 0x92, 0x7c, 0x81, 0x44, 0xd1, 0xa1, 0x6c, 0x59, + 0x92, 0x47, 0x94, 0x83, 0x7c, 0xf9, 0xe2, 0xc9, 0x88, 0x73, 0x25, 0x4e, 0x4c, 0x72, 0x26, 0x33, + 0x43, 0x85, 0xca, 0x36, 0x5f, 0x36, 0x59, 0x65, 0x53, 0xb4, 0x40, 0x11, 0x14, 0x28, 0x5a, 0xa0, + 0x9b, 0xa2, 0x7f, 0x40, 0x81, 0xae, 0xb3, 0xcc, 0xaa, 0x2d, 0x0a, 0x34, 0x0d, 0x92, 0x4d, 0xd1, + 0x6d, 0x81, 0x76, 0xd7, 0x16, 0xf7, 0x31, 0x4f, 0x72, 0xf8, 0x88, 0xd3, 0x00, 0x41, 0xb3, 0x9b, + 0x7b, 0xee, 0x39, 0x67, 0xee, 0xe3, 0xdc, 0x73, 0xce, 0xfd, 0xdd, 0x7b, 0xe1, 0x82, 0x8d, 0xbb, + 0x2a, 0x36, 0x3b, 0x5a, 0xd7, 0x5e, 0x55, 0x0e, 0x9b, 0xda, 0xaa, 0x7d, 0x6a, 0x60, 0x6b, 0xc5, + 0x30, 0x75, 0x5b, 0x47, 0x45, 0xaf, 0x72, 0x85, 0x54, 0x56, 0x2e, 0xf9, 0xb8, 0x9b, 0xe6, 0xa9, + 0x61, 0xeb, 0xab, 0x86, 0xa9, 0xeb, 0x47, 0x8c, 0xbf, 0x72, 0xd1, 0x57, 0x4d, 0xf5, 0xf8, 0xb5, + 0x05, 0x6a, 0xb9, 0xf0, 0x43, 0x7c, 0xea, 0xd4, 0x5e, 0x1a, 0x90, 0x35, 0x14, 0x53, 0xe9, 0x38, + 0xd5, 0x4b, 0xc7, 0xba, 0x7e, 0xdc, 0xc6, 0xab, 0xb4, 0x74, 0xd8, 0x3b, 0x5a, 0xb5, 0xb5, 0x0e, + 0xb6, 0x6c, 0xa5, 0x63, 0x70, 0x86, 0x85, 0x63, 0xfd, 0x58, 0xa7, 0x9f, 0xab, 0xe4, 0x8b, 0x51, + 0xc5, 0x7f, 0x02, 0xcc, 0x48, 0xf8, 0xdd, 0x1e, 0xb6, 0x6c, 0xb4, 0x06, 0x49, 0xdc, 0x6c, 0xe9, + 0x65, 0x61, 0x59, 0xb8, 0x96, 0x5b, 0xbb, 0xb8, 0x12, 0xea, 0xdc, 0x0a, 0xe7, 0xab, 0x35, 0x5b, + 0x7a, 0x3d, 0x26, 0x51, 0x5e, 0xf4, 0x1c, 0xa4, 0x8e, 0xda, 0x3d, 0xab, 0x55, 0x8e, 0x53, 0xa1, + 0x4b, 0x51, 0x42, 0xb7, 0x08, 0x53, 0x3d, 0x26, 0x31, 0x6e, 0xf2, 0x2b, 0xad, 0x7b, 0xa4, 0x97, + 0x13, 0xa3, 0x7f, 0xb5, 0xd5, 0x3d, 0xa2, 0xbf, 0x22, 0xbc, 0x68, 0x03, 0x40, 0xeb, 0x6a, 0xb6, + 0xdc, 0x6c, 0x29, 0x5a, 0xb7, 0x9c, 0xa4, 0x92, 0x8f, 0x45, 0x4b, 0x6a, 0x76, 0x95, 0x30, 0xd6, + 0x63, 0x52, 0x56, 0x73, 0x0a, 0xa4, 0xb9, 0xef, 0xf6, 0xb0, 0x79, 0x5a, 0x4e, 0x8d, 0x6e, 0xee, + 0x3d, 0xc2, 0x44, 0x9a, 0x4b, 0xb9, 0xd1, 0x16, 0xe4, 0x0e, 0xf1, 0xb1, 0xd6, 0x95, 0x0f, 0xdb, + 0x7a, 0xf3, 0x61, 0x39, 0x4d, 0x85, 0xc5, 0x28, 0xe1, 0x0d, 0xc2, 0xba, 0x41, 0x38, 0x37, 0xe2, + 0x65, 0xa1, 0x1e, 0x93, 0xe0, 0xd0, 0xa5, 0xa0, 0x97, 0x21, 0xd3, 0x6c, 0xe1, 0xe6, 0x43, 0xd9, + 0xee, 0x97, 0x67, 0xa8, 0x9e, 0xa5, 0x28, 0x3d, 0x55, 0xc2, 0xd7, 0xe8, 0xd7, 0x63, 0xd2, 0x4c, + 0x93, 0x7d, 0xa2, 0x5b, 0x00, 0x2a, 0x6e, 0x6b, 0x27, 0xd8, 0x24, 0xf2, 0x99, 0xd1, 0x63, 0xb0, + 0xc9, 0x38, 0x1b, 0x7d, 0xde, 0x8c, 0xac, 0xea, 0x10, 0x50, 0x15, 0xb2, 0xb8, 0xab, 0xf2, 0xee, + 0x64, 0xa9, 0x9a, 0xe5, 0xc8, 0xf9, 0xee, 0xaa, 0xfe, 0xce, 0x64, 0x30, 0x2f, 0xa3, 0x9b, 0x90, + 0x6e, 0xea, 0x9d, 0x8e, 0x66, 0x97, 0x81, 0x6a, 0x58, 0x8c, 0xec, 0x08, 0xe5, 0xaa, 0xc7, 0x24, + 0xce, 0x8f, 0x76, 0xa0, 0xd0, 0xd6, 0x2c, 0x5b, 0xb6, 0xba, 0x8a, 0x61, 0xb5, 0x74, 0xdb, 0x2a, + 0xe7, 0xa8, 0x86, 0x2b, 0x51, 0x1a, 0xb6, 0x35, 0xcb, 0xde, 0x77, 0x98, 0xeb, 0x31, 0x29, 0xdf, + 0xf6, 0x13, 0x88, 0x3e, 0xfd, 0xe8, 0x08, 0x9b, 0xae, 0xc2, 0xf2, 0xec, 0x68, 0x7d, 0xbb, 0x84, + 0xdb, 0x91, 0x27, 0xfa, 0x74, 0x3f, 0x01, 0xbd, 0x09, 0xf3, 0x6d, 0x5d, 0x51, 0x5d, 0x75, 0x72, + 0xb3, 0xd5, 0xeb, 0x3e, 0x2c, 0xe7, 0xa9, 0xd2, 0x27, 0x22, 0x1b, 0xa9, 0x2b, 0xaa, 0xa3, 0xa2, + 0x4a, 0x04, 0xea, 0x31, 0x69, 0xae, 0x1d, 0x26, 0xa2, 0x07, 0xb0, 0xa0, 0x18, 0x46, 0xfb, 0x34, + 0xac, 0xbd, 0x40, 0xb5, 0x5f, 0x8f, 0xd2, 0xbe, 0x4e, 0x64, 0xc2, 0xea, 0x91, 0x32, 0x40, 0x45, + 0x0d, 0x28, 0x19, 0x26, 0x36, 0x14, 0x13, 0xcb, 0x86, 0xa9, 0x1b, 0xba, 0xa5, 0xb4, 0xcb, 0x45, + 0xaa, 0xfb, 0x6a, 0x94, 0xee, 0x3d, 0xc6, 0xbf, 0xc7, 0xd9, 0xeb, 0x31, 0xa9, 0x68, 0x04, 0x49, + 0x4c, 0xab, 0xde, 0xc4, 0x96, 0xe5, 0x69, 0x2d, 0x8d, 0xd3, 0x4a, 0xf9, 0x83, 0x5a, 0x03, 0x24, + 0x54, 0x83, 0x1c, 0xee, 0x13, 0x71, 0xf9, 0x44, 0xb7, 0x71, 0x79, 0x6e, 0xf4, 0xc2, 0xaa, 0x51, + 0xd6, 0xfb, 0xba, 0x8d, 0xc9, 0xa2, 0xc2, 0x6e, 0x09, 0x29, 0x70, 0xe6, 0x04, 0x9b, 0xda, 0xd1, + 0x29, 0x55, 0x23, 0xd3, 0x1a, 0x4b, 0xd3, 0xbb, 0x65, 0x44, 0x15, 0x3e, 0x19, 0xa5, 0xf0, 0x3e, + 0x15, 0x22, 0x2a, 0x6a, 0x8e, 0x48, 0x3d, 0x26, 0xcd, 0x9f, 0x0c, 0x92, 0x89, 0x89, 0x1d, 0x69, + 0x5d, 0xa5, 0xad, 0xbd, 0x8f, 0xf9, 0xb2, 0x99, 0x1f, 0x6d, 0x62, 0xb7, 0x38, 0x37, 0x5d, 0x2b, + 0xc4, 0xc4, 0x8e, 0xfc, 0x84, 0x8d, 0x19, 0x48, 0x9d, 0x28, 0xed, 0x1e, 0x16, 0xaf, 0x42, 0xce, + 0xe7, 0x58, 0x51, 0x19, 0x66, 0x3a, 0xd8, 0xb2, 0x94, 0x63, 0x4c, 0xfd, 0x70, 0x56, 0x72, 0x8a, + 0x62, 0x01, 0x66, 0xfd, 0xce, 0x54, 0xfc, 0x58, 0x70, 0x25, 0x89, 0x9f, 0x24, 0x92, 0x27, 0xd8, + 0xa4, 0xdd, 0xe6, 0x92, 0xbc, 0x88, 0x2e, 0x43, 0x9e, 0x36, 0x59, 0x76, 0xea, 0x89, 0xb3, 0x4e, + 0x4a, 0xb3, 0x94, 0x78, 0x9f, 0x33, 0x2d, 0x41, 0xce, 0x58, 0x33, 0x5c, 0x96, 0x04, 0x65, 0x01, + 0x63, 0xcd, 0x70, 0x18, 0x1e, 0x83, 0x59, 0xd2, 0x3f, 0x97, 0x23, 0x49, 0x7f, 0x92, 0x23, 0x34, + 0xce, 0x22, 0xfe, 0x7f, 0x02, 0x4a, 0x61, 0x07, 0x8c, 0x6e, 0x42, 0x92, 0xc4, 0x22, 0x1e, 0x56, + 0x2a, 0x2b, 0x2c, 0x50, 0xad, 0x38, 0x81, 0x6a, 0xa5, 0xe1, 0x04, 0xaa, 0x8d, 0xcc, 0xa7, 0x9f, + 0x2f, 0xc5, 0x3e, 0xfe, 0xd3, 0x92, 0x20, 0x51, 0x09, 0x74, 0x9e, 0xf8, 0x4a, 0x45, 0xeb, 0xca, + 0x9a, 0x4a, 0x9b, 0x9c, 0x25, 0x8e, 0x50, 0xd1, 0xba, 0x5b, 0x2a, 0xda, 0x86, 0x52, 0x53, 0xef, + 0x5a, 0xb8, 0x6b, 0xf5, 0x2c, 0x99, 0x05, 0x42, 0x1e, 0x4c, 0x02, 0xee, 0x90, 0x85, 0xd7, 0xaa, + 0xc3, 0xb9, 0x47, 0x19, 0xa5, 0x62, 0x33, 0x48, 0x40, 0x3b, 0x90, 0x3f, 0x51, 0xda, 0x9a, 0xaa, + 0xd8, 0xba, 0x29, 0x5b, 0xd8, 0xe6, 0xd1, 0xe5, 0xf2, 0xc0, 0xdc, 0xde, 0x77, 0xb8, 0xf6, 0xb1, + 0x7d, 0x60, 0xa8, 0x8a, 0x8d, 0x37, 0x92, 0x9f, 0x7e, 0xbe, 0x24, 0x48, 0xb3, 0x27, 0xbe, 0x1a, + 0xf4, 0x38, 0x14, 0x15, 0xc3, 0x90, 0x2d, 0x5b, 0xb1, 0xb1, 0x7c, 0x78, 0x6a, 0x63, 0x8b, 0x06, + 0x9c, 0x59, 0x29, 0xaf, 0x18, 0xc6, 0x3e, 0xa1, 0x6e, 0x10, 0x22, 0xba, 0x02, 0x05, 0x12, 0x9b, + 0x34, 0xa5, 0x2d, 0xb7, 0xb0, 0x76, 0xdc, 0xb2, 0x69, 0x68, 0x49, 0x48, 0x79, 0x4e, 0xad, 0x53, + 0x22, 0x5a, 0x81, 0x79, 0x87, 0xad, 0xa9, 0x9b, 0xd8, 0xe1, 0x25, 0xe1, 0x23, 0x2f, 0xcd, 0xf1, + 0xaa, 0xaa, 0x6e, 0x62, 0xc6, 0x2f, 0xaa, 0xae, 0xa5, 0xd0, 0x38, 0x86, 0x10, 0x24, 0x55, 0xc5, + 0x56, 0xe8, 0x0c, 0xcc, 0x4a, 0xf4, 0x9b, 0xd0, 0x0c, 0xc5, 0x6e, 0xf1, 0x71, 0xa5, 0xdf, 0xe8, + 0x2c, 0xa4, 0xb9, 0xea, 0x04, 0x6d, 0x06, 0x2f, 0xa1, 0x05, 0x48, 0x19, 0xa6, 0x7e, 0x82, 0xe9, + 0xb0, 0x64, 0x24, 0x56, 0x10, 0x3f, 0x88, 0xc3, 0xdc, 0x40, 0xc4, 0x23, 0x7a, 0x5b, 0x8a, 0xd5, + 0x72, 0xfe, 0x45, 0xbe, 0xd1, 0xf3, 0x44, 0xaf, 0xa2, 0x62, 0x93, 0x67, 0x09, 0xe5, 0xc1, 0x29, + 0xaa, 0xd3, 0x7a, 0x3a, 0x98, 0x31, 0x89, 0x73, 0xa3, 0x3b, 0x50, 0x6a, 0x2b, 0x96, 0x2d, 0xb3, + 0xa8, 0x21, 0xfb, 0x32, 0x86, 0x0b, 0x03, 0x33, 0xc3, 0x62, 0x0c, 0x59, 0x08, 0x5c, 0x49, 0x81, + 0x88, 0x7a, 0x54, 0x74, 0x00, 0x0b, 0x87, 0xa7, 0xef, 0x2b, 0x5d, 0x5b, 0xeb, 0x62, 0xd9, 0x9d, + 0x2d, 0xab, 0x9c, 0x5c, 0x4e, 0x0c, 0x4d, 0x41, 0xee, 0x6a, 0xd6, 0x21, 0x6e, 0x29, 0x27, 0x9a, + 0xee, 0x34, 0x6b, 0xde, 0x95, 0x77, 0xcd, 0xc0, 0x12, 0x25, 0x28, 0x04, 0xc3, 0x35, 0x2a, 0x40, + 0xdc, 0xee, 0xf3, 0xfe, 0xc7, 0xed, 0x3e, 0x7a, 0x06, 0x92, 0xa4, 0x8f, 0xb4, 0xef, 0x85, 0x21, + 0x3f, 0xe2, 0x72, 0x8d, 0x53, 0x03, 0x4b, 0x94, 0x53, 0x14, 0xdd, 0x55, 0xe4, 0x86, 0xf0, 0xb0, + 0x56, 0xf1, 0x09, 0x28, 0x86, 0xe2, 0xb3, 0x6f, 0xfa, 0x04, 0xff, 0xf4, 0x89, 0x45, 0xc8, 0x07, + 0x02, 0xb1, 0x78, 0x16, 0x16, 0x86, 0xc5, 0x55, 0xb1, 0xe5, 0xd2, 0x03, 0xf1, 0x11, 0x3d, 0x07, + 0x19, 0x37, 0xb0, 0xb2, 0x55, 0x7c, 0x7e, 0xa0, 0x17, 0x0e, 0xb3, 0xe4, 0xb2, 0x92, 0xe5, 0x4b, + 0x56, 0x01, 0x35, 0x87, 0x38, 0x6d, 0xf8, 0x8c, 0x62, 0x18, 0x75, 0xc5, 0x6a, 0x89, 0x6f, 0x43, + 0x39, 0x2a, 0x68, 0x86, 0xba, 0x91, 0x74, 0xad, 0xf0, 0x2c, 0xa4, 0x8f, 0x74, 0xb3, 0xa3, 0xd8, + 0x54, 0x59, 0x5e, 0xe2, 0x25, 0x62, 0x9d, 0x2c, 0x80, 0x26, 0x28, 0x99, 0x15, 0x44, 0x19, 0xce, + 0x47, 0x06, 0x4e, 0x22, 0xa2, 0x75, 0x55, 0xcc, 0xc6, 0x33, 0x2f, 0xb1, 0x82, 0xa7, 0x88, 0x35, + 0x96, 0x15, 0xc8, 0x6f, 0x2d, 0xda, 0x57, 0xaa, 0x3f, 0x2b, 0xf1, 0x92, 0xf8, 0xab, 0x04, 0x9c, + 0x1d, 0x1e, 0x3e, 0xd1, 0x32, 0xcc, 0x76, 0x94, 0xbe, 0x6c, 0xf7, 0xf9, 0xda, 0x67, 0xd3, 0x01, + 0x1d, 0xa5, 0xdf, 0xe8, 0xb3, 0x85, 0x5f, 0x82, 0x84, 0xdd, 0xb7, 0xca, 0xf1, 0xe5, 0xc4, 0xb5, + 0x59, 0x89, 0x7c, 0xa2, 0x03, 0x98, 0x6b, 0xeb, 0x4d, 0xa5, 0x2d, 0xfb, 0x2c, 0x9e, 0x1b, 0xfb, + 0xa0, 0x1b, 0x62, 0x81, 0x10, 0xab, 0x03, 0x46, 0x5f, 0xa4, 0x3a, 0xb6, 0x5d, 0xcb, 0xff, 0x37, + 0x59, 0xbd, 0x6f, 0x8e, 0x52, 0x01, 0x4f, 0xe1, 0xf8, 0xfa, 0xf4, 0xd4, 0xbe, 0xfe, 0x19, 0x58, + 0xe8, 0xe2, 0xbe, 0xed, 0x6b, 0x23, 0x33, 0x9c, 0x19, 0x3a, 0x17, 0x88, 0xd4, 0x79, 0xff, 0x27, + 0x36, 0x84, 0x56, 0x61, 0x81, 0x65, 0x22, 0xd8, 0x24, 0x29, 0x09, 0x19, 0x6e, 0x2a, 0x91, 0xa1, + 0x12, 0x73, 0x4e, 0xdd, 0x9e, 0xa9, 0x37, 0xfa, 0xd4, 0xe8, 0x7e, 0xe2, 0x9f, 0xb1, 0x60, 0x1e, + 0xc2, 0xe7, 0x43, 0xf0, 0xe6, 0x63, 0xdf, 0xd5, 0xae, 0x06, 0xa6, 0x24, 0x3e, 0xa9, 0xff, 0x41, + 0x8e, 0xf8, 0x04, 0xb3, 0x91, 0x78, 0xb4, 0xd9, 0x70, 0x7c, 0x6e, 0xd2, 0xe7, 0x73, 0xbf, 0x93, + 0x33, 0xf4, 0xaa, 0x1b, 0x51, 0xbc, 0x54, 0x6f, 0x68, 0x44, 0xf1, 0x7a, 0x17, 0x0f, 0xb8, 0xba, + 0x9f, 0x0a, 0x50, 0x89, 0xce, 0xed, 0x86, 0xaa, 0x7a, 0x16, 0xce, 0x78, 0xb1, 0xdf, 0xdf, 0x4a, + 0xe6, 0x05, 0x90, 0x5b, 0xe9, 0x36, 0x33, 0x32, 0x4e, 0x5e, 0x81, 0x42, 0x28, 0xff, 0x64, 0x33, + 0x92, 0x3f, 0xf1, 0xb7, 0x42, 0xfc, 0x71, 0xc2, 0xf5, 0xb3, 0x81, 0x24, 0x71, 0x88, 0x15, 0xde, + 0x83, 0x79, 0x15, 0x37, 0x35, 0xf5, 0xeb, 0x1a, 0xe1, 0x1c, 0x97, 0xfe, 0xde, 0x06, 0x27, 0xb6, + 0xc1, 0xdf, 0xe5, 0x20, 0x23, 0x61, 0xcb, 0x20, 0x29, 0x22, 0xda, 0x80, 0x2c, 0xee, 0x37, 0xb1, + 0x61, 0x3b, 0x59, 0xf5, 0xf0, 0xdd, 0x09, 0xe3, 0xae, 0x39, 0x9c, 0x64, 0xaf, 0xed, 0x8a, 0xa1, + 0x1b, 0x1c, 0x56, 0x89, 0x46, 0x48, 0xb8, 0xb8, 0x1f, 0x57, 0x79, 0xde, 0xc1, 0x55, 0x12, 0x91, + 0x5b, 0x6b, 0x26, 0x15, 0x02, 0x56, 0x6e, 0x70, 0x60, 0x25, 0x39, 0xe6, 0x67, 0x01, 0x64, 0xa5, + 0x1a, 0x40, 0x56, 0x52, 0x63, 0xba, 0x19, 0x01, 0xad, 0x3c, 0xef, 0x40, 0x2b, 0xe9, 0x31, 0x2d, + 0x0e, 0x61, 0x2b, 0xb7, 0x83, 0xd8, 0xca, 0x4c, 0x44, 0xc8, 0x73, 0xa4, 0x47, 0x82, 0x2b, 0xaf, + 0xf8, 0xc0, 0x95, 0x4c, 0x24, 0xaa, 0xc1, 0x14, 0x0d, 0x41, 0x57, 0x5e, 0x0b, 0xa0, 0x2b, 0xd9, + 0x31, 0xe3, 0x30, 0x02, 0x5e, 0xd9, 0xf4, 0xc3, 0x2b, 0x10, 0x89, 0xd2, 0xf0, 0x79, 0x8f, 0xc2, + 0x57, 0x5e, 0x74, 0xf1, 0x95, 0x5c, 0x24, 0x50, 0xc4, 0xfb, 0x12, 0x06, 0x58, 0x76, 0x07, 0x00, + 0x16, 0x06, 0x88, 0x3c, 0x1e, 0xa9, 0x62, 0x0c, 0xc2, 0xb2, 0x3b, 0x80, 0xb0, 0xe4, 0xc7, 0x28, + 0x1c, 0x03, 0xb1, 0xfc, 0xdf, 0x70, 0x88, 0x25, 0x1a, 0x04, 0xe1, 0xcd, 0x9c, 0x0c, 0x63, 0x91, + 0x23, 0x30, 0x96, 0x62, 0x24, 0x1e, 0xc0, 0xd4, 0x4f, 0x0c, 0xb2, 0x1c, 0x0c, 0x01, 0x59, 0x18, + 0x1c, 0x72, 0x2d, 0x52, 0xf9, 0x04, 0x28, 0xcb, 0xc1, 0x10, 0x94, 0x65, 0x6e, 0xac, 0xda, 0xb1, + 0x30, 0xcb, 0xad, 0x20, 0xcc, 0x82, 0xc6, 0xac, 0xb1, 0x48, 0x9c, 0xe5, 0x30, 0x0a, 0x67, 0x61, + 0x58, 0xc8, 0x53, 0x91, 0x1a, 0xa7, 0x00, 0x5a, 0x76, 0x07, 0x80, 0x96, 0x85, 0x31, 0x96, 0x36, + 0x29, 0xd2, 0xf2, 0x04, 0xc9, 0x2e, 0x42, 0xae, 0x9a, 0x24, 0xfd, 0xd8, 0x34, 0x75, 0x93, 0x63, + 0x26, 0xac, 0x20, 0x5e, 0x23, 0x3b, 0x68, 0xcf, 0x2d, 0x8f, 0x40, 0x65, 0xe8, 0xe6, 0xca, 0xe7, + 0x8a, 0xc5, 0x3f, 0x0a, 0x9e, 0x2c, 0xdd, 0x78, 0xfa, 0x77, 0xdf, 0x59, 0xbe, 0xfb, 0xf6, 0x61, + 0x35, 0xf1, 0x20, 0x56, 0xb3, 0x04, 0x39, 0xb2, 0x69, 0x0a, 0xc1, 0x30, 0x8a, 0xe1, 0xc2, 0x30, + 0xd7, 0x61, 0x8e, 0xa6, 0x02, 0x0c, 0xd1, 0xe1, 0xf1, 0x35, 0x49, 0xe3, 0x6b, 0x91, 0x54, 0xb0, + 0x51, 0x60, 0x81, 0xf6, 0x69, 0x98, 0xf7, 0xf1, 0xba, 0x9b, 0x31, 0x86, 0x45, 0x94, 0x5c, 0xee, + 0x75, 0xb6, 0x2b, 0xbb, 0x9d, 0xcc, 0xa8, 0x25, 0x2c, 0x5d, 0xe2, 0x99, 0x86, 0x89, 0x59, 0x40, + 0x90, 0x09, 0x0b, 0x56, 0xf9, 0xaf, 0xc4, 0x3f, 0xc7, 0xbd, 0x61, 0xf4, 0x40, 0x9e, 0x61, 0x78, + 0x8c, 0xf0, 0xb5, 0xf1, 0x18, 0xff, 0xce, 0x31, 0x11, 0xd8, 0x39, 0xa2, 0x37, 0x61, 0x21, 0x00, + 0xd5, 0xc8, 0x3d, 0x0a, 0xc3, 0x94, 0xd5, 0xe9, 0x10, 0x9b, 0x98, 0x2f, 0xb1, 0x73, 0x6b, 0xd0, + 0x5b, 0x70, 0x81, 0xa6, 0x17, 0xa1, 0xce, 0x3b, 0xff, 0xc0, 0x83, 0x6e, 0xd8, 0xe9, 0x90, 0x89, + 0xe9, 0x38, 0x6c, 0xeb, 0xcd, 0x87, 0xd2, 0x39, 0xa2, 0x23, 0x40, 0xe2, 0xea, 0x23, 0x70, 0x9c, + 0xa3, 0x28, 0x1c, 0xe7, 0xef, 0x82, 0x67, 0x5c, 0x2e, 0x92, 0xd3, 0xd4, 0x55, 0xcc, 0xf7, 0xad, + 0xf4, 0x9b, 0x64, 0x8d, 0x6d, 0xfd, 0x98, 0xef, 0x4e, 0xc9, 0x27, 0xe1, 0x72, 0x93, 0x80, 0x2c, + 0x8f, 0xf1, 0xee, 0x96, 0x97, 0xa5, 0x62, 0x7c, 0xcb, 0x5b, 0x82, 0xc4, 0x43, 0xcc, 0x42, 0xf6, + 0xac, 0x44, 0x3e, 0x09, 0x1f, 0x5d, 0x2d, 0x3c, 0xa5, 0x62, 0x05, 0x74, 0x13, 0xb2, 0xf4, 0x1c, + 0x4b, 0xd6, 0x0d, 0x8b, 0x47, 0xd6, 0x40, 0xf6, 0xc9, 0x8e, 0xab, 0x56, 0xf6, 0x08, 0xcf, 0xae, + 0x61, 0x49, 0x19, 0x83, 0x7f, 0xf9, 0x72, 0xc0, 0x6c, 0x20, 0x07, 0xbc, 0x08, 0x59, 0xd2, 0x7a, + 0xcb, 0x50, 0x9a, 0x98, 0x86, 0xc8, 0xac, 0xe4, 0x11, 0xc4, 0x07, 0x80, 0x06, 0x03, 0x3e, 0xaa, + 0x43, 0x1a, 0x9f, 0xe0, 0xae, 0xcd, 0x52, 0xe4, 0xdc, 0xda, 0xd9, 0xc1, 0x8d, 0x31, 0xa9, 0xde, + 0x28, 0x93, 0x09, 0xfe, 0xcb, 0xe7, 0x4b, 0x25, 0xc6, 0xfd, 0x94, 0xde, 0xd1, 0x6c, 0xdc, 0x31, + 0xec, 0x53, 0x89, 0xcb, 0x8b, 0x7f, 0x88, 0x43, 0x31, 0x94, 0x08, 0x0c, 0x1d, 0x5b, 0x67, 0xed, + 0xc6, 0x7d, 0xc8, 0xd9, 0x64, 0xe3, 0x7d, 0x09, 0xe0, 0x58, 0xb1, 0xe4, 0xf7, 0x94, 0xae, 0x8d, + 0x55, 0x3e, 0xe8, 0xd9, 0x63, 0xc5, 0x7a, 0x9d, 0x12, 0x88, 0x85, 0x93, 0xea, 0x9e, 0x85, 0x55, + 0x8e, 0xf9, 0xcd, 0x1c, 0x2b, 0xd6, 0x81, 0x85, 0x55, 0x5f, 0x2f, 0x67, 0x1e, 0xad, 0x97, 0xc1, + 0x31, 0xce, 0x84, 0xc6, 0xd8, 0x07, 0x6c, 0x64, 0xfd, 0xc0, 0x06, 0xaa, 0x40, 0xc6, 0x30, 0x35, + 0xdd, 0xd4, 0xec, 0x53, 0x3a, 0x31, 0x09, 0xc9, 0x2d, 0xa3, 0xcb, 0x90, 0xef, 0xe0, 0x8e, 0xa1, + 0xeb, 0x6d, 0x99, 0x79, 0xcd, 0x1c, 0x15, 0x9d, 0xe5, 0xc4, 0x1a, 0x75, 0x9e, 0x1f, 0xfa, 0x3c, + 0x84, 0x07, 0x60, 0x7d, 0xb3, 0xc3, 0xbb, 0x38, 0x64, 0x78, 0x7d, 0x14, 0xd2, 0x89, 0xd0, 0xf8, + 0xba, 0xe5, 0x6f, 0x6b, 0x80, 0xc5, 0xbf, 0xc6, 0xa1, 0x14, 0x4e, 0xf2, 0xd0, 0x1b, 0x70, 0x2e, + 0xe4, 0x28, 0xb9, 0x77, 0xb1, 0xf8, 0x06, 0x61, 0x02, 0x7f, 0x79, 0x26, 0xe8, 0x2f, 0x99, 0x77, + 0xb1, 0x7c, 0xfd, 0x4a, 0x3c, 0x62, 0xbf, 0xc6, 0xf8, 0x41, 0xf5, 0x11, 0xfd, 0x60, 0x94, 0x0f, + 0xc7, 0xd3, 0xa2, 0xee, 0x43, 0x7c, 0xb8, 0xb8, 0x05, 0x85, 0x60, 0x5a, 0x3c, 0xd4, 0xca, 0x2e, + 0x43, 0xde, 0xc4, 0x36, 0xe9, 0x58, 0x60, 0x27, 0x3f, 0xcb, 0x88, 0xdc, 0xff, 0xee, 0xc1, 0x99, + 0xa1, 0xe9, 0x31, 0x7a, 0x01, 0xb2, 0x5e, 0x66, 0xcd, 0x7c, 0xd1, 0x08, 0x44, 0xd4, 0xe3, 0x15, + 0x7f, 0x23, 0x78, 0x2a, 0x83, 0x18, 0x6b, 0x0d, 0xd2, 0x26, 0xb6, 0x7a, 0x6d, 0x86, 0x7a, 0x16, + 0xd6, 0x9e, 0x9e, 0x2c, 0xb1, 0x26, 0xd4, 0x5e, 0xdb, 0x96, 0xb8, 0xb0, 0xf8, 0x00, 0xd2, 0x8c, + 0x82, 0x72, 0x30, 0x73, 0xb0, 0x73, 0x67, 0x67, 0xf7, 0xf5, 0x9d, 0x52, 0x0c, 0x01, 0xa4, 0xd7, + 0xab, 0xd5, 0xda, 0x5e, 0xa3, 0x24, 0xa0, 0x2c, 0xa4, 0xd6, 0x37, 0x76, 0xa5, 0x46, 0x29, 0x4e, + 0xc8, 0x52, 0xed, 0x76, 0xad, 0xda, 0x28, 0x25, 0xd0, 0x1c, 0xe4, 0xd9, 0xb7, 0x7c, 0x6b, 0x57, + 0xba, 0xbb, 0xde, 0x28, 0x25, 0x7d, 0xa4, 0xfd, 0xda, 0xce, 0x66, 0x4d, 0x2a, 0xa5, 0xc4, 0x67, + 0xe1, 0x7c, 0x64, 0x2a, 0xee, 0x01, 0xa8, 0x82, 0x0f, 0x40, 0x15, 0x7f, 0x14, 0x87, 0x4a, 0x74, + 0x7e, 0x8d, 0x6e, 0x87, 0x3a, 0xbe, 0x36, 0x45, 0x72, 0x1e, 0xea, 0x3d, 0xba, 0x02, 0x05, 0x13, + 0x1f, 0x61, 0xbb, 0xd9, 0x62, 0xf9, 0x3e, 0x43, 0x58, 0xf3, 0x52, 0x9e, 0x53, 0xa9, 0x90, 0xc5, + 0xd8, 0xde, 0xc1, 0x4d, 0x5b, 0x66, 0x2e, 0x8f, 0x2d, 0x98, 0x2c, 0x61, 0x23, 0xd4, 0x7d, 0x46, + 0x14, 0xdf, 0x9e, 0x6a, 0x2c, 0xb3, 0x90, 0x92, 0x6a, 0x0d, 0xe9, 0x8d, 0x52, 0x02, 0x21, 0x28, + 0xd0, 0x4f, 0x79, 0x7f, 0x67, 0x7d, 0x6f, 0xbf, 0xbe, 0x4b, 0xc6, 0x72, 0x1e, 0x8a, 0xce, 0x58, + 0x3a, 0xc4, 0x94, 0xf8, 0xdb, 0x38, 0x9c, 0x8b, 0xd8, 0x1d, 0xa0, 0x9b, 0x00, 0x76, 0x5f, 0x36, + 0x71, 0x53, 0x37, 0xd5, 0x68, 0x23, 0x6b, 0xf4, 0x25, 0xca, 0x21, 0x65, 0x6d, 0xfe, 0x65, 0x8d, + 0xc0, 0xdd, 0xd1, 0xcb, 0x5c, 0x29, 0xe9, 0x95, 0xe3, 0x26, 0x2e, 0x0d, 0x81, 0x97, 0x71, 0x93, + 0x28, 0xa6, 0x63, 0x4b, 0x15, 0x53, 0x7e, 0x74, 0x17, 0xe6, 0xbc, 0x75, 0xeb, 0x78, 0x2d, 0x86, + 0x24, 0x2f, 0x47, 0x2f, 0x5a, 0xb6, 0x2e, 0xa5, 0xd2, 0x49, 0x90, 0x60, 0x8d, 0x72, 0x85, 0xa9, + 0x47, 0x73, 0x85, 0xe2, 0xcf, 0x12, 0xfe, 0x81, 0x0d, 0x6e, 0x86, 0x76, 0x21, 0x6d, 0xd9, 0x8a, + 0xdd, 0xb3, 0xb8, 0xc1, 0xbd, 0x30, 0xe9, 0xce, 0x6a, 0xc5, 0xf9, 0xd8, 0xa7, 0xe2, 0x12, 0x57, + 0xf3, 0xfd, 0x78, 0x5b, 0xe2, 0x73, 0x50, 0x08, 0x0e, 0x4e, 0xf4, 0x92, 0xf1, 0x7c, 0x4e, 0x5c, + 0x7c, 0xc9, 0x4b, 0xf3, 0x7c, 0x80, 0xef, 0x20, 0x8c, 0x2a, 0x0c, 0x83, 0x51, 0x7f, 0x2e, 0xc0, + 0x85, 0x11, 0xfb, 0x4b, 0x74, 0x2f, 0x34, 0xcf, 0x2f, 0x4e, 0xb3, 0x3b, 0x5d, 0x61, 0xb4, 0xe0, + 0x4c, 0x8b, 0x37, 0x60, 0xd6, 0x4f, 0x9f, 0xac, 0x93, 0x7f, 0x4b, 0x78, 0x3e, 0x3f, 0x88, 0xf7, + 0x7e, 0x63, 0xf9, 0x6c, 0xc8, 0xce, 0xe2, 0x53, 0xda, 0xd9, 0x08, 0xc3, 0x48, 0x3e, 0x62, 0x4e, + 0xe2, 0x5f, 0x1b, 0xa9, 0xe0, 0xda, 0x18, 0x08, 0xc1, 0xe9, 0xc1, 0x10, 0xfc, 0x9d, 0xce, 0x44, + 0x7e, 0x20, 0x00, 0xf8, 0x0e, 0xa0, 0x17, 0x20, 0x65, 0xea, 0xbd, 0xae, 0x4a, 0xcd, 0x31, 0x25, + 0xb1, 0x02, 0xd9, 0xef, 0xbf, 0xdb, 0xd3, 0xcd, 0x5e, 0xc7, 0xbf, 0xdb, 0x05, 0x46, 0xa2, 0xc3, + 0x74, 0x15, 0x8a, 0x6c, 0xfb, 0x6e, 0x69, 0xc7, 0x5d, 0xc5, 0xee, 0x99, 0x98, 0x63, 0xec, 0x05, + 0x4a, 0xde, 0x77, 0xa8, 0x84, 0x91, 0x5d, 0x38, 0xf0, 0x18, 0xd9, 0x88, 0x17, 0x28, 0xd9, 0x65, + 0x14, 0x35, 0x40, 0x83, 0x07, 0x88, 0x11, 0xcd, 0x7b, 0x05, 0x52, 0x64, 0xd5, 0x39, 0x36, 0xf5, + 0x58, 0xe4, 0x51, 0x24, 0x59, 0x3d, 0xbe, 0x83, 0x07, 0x26, 0x25, 0xbe, 0x0f, 0x29, 0x6a, 0xc2, + 0x24, 0x07, 0xa3, 0x87, 0xe0, 0x1c, 0x04, 0x21, 0xdf, 0xe8, 0x2d, 0x00, 0xc5, 0xb6, 0x4d, 0xed, + 0xb0, 0xe7, 0xfd, 0x60, 0x69, 0xf8, 0x12, 0x58, 0x77, 0xf8, 0x36, 0x2e, 0xf2, 0xb5, 0xb0, 0xe0, + 0x89, 0xfa, 0xd6, 0x83, 0x4f, 0xa1, 0xb8, 0x03, 0x85, 0xa0, 0xac, 0xb3, 0xdb, 0x65, 0x6d, 0x08, + 0xee, 0x76, 0x19, 0x0a, 0xc3, 0x77, 0xbb, 0xee, 0x5e, 0x39, 0xc1, 0xee, 0x3b, 0xd0, 0x82, 0xf8, + 0x0f, 0x01, 0x66, 0xfd, 0x2b, 0xe8, 0x3f, 0x6d, 0xc3, 0x28, 0x7e, 0x28, 0x40, 0xc6, 0xed, 0x7c, + 0xc4, 0x65, 0x03, 0x6f, 0xec, 0xe2, 0xfe, 0xa3, 0x75, 0x76, 0x7b, 0x21, 0xe1, 0xde, 0x89, 0x78, + 0xc9, 0x4d, 0xfa, 0xa2, 0x0e, 0x2a, 0xfc, 0x23, 0xed, 0x5c, 0x0b, 0xe1, 0x39, 0xee, 0x0f, 0x79, + 0x3b, 0x48, 0xb6, 0x83, 0xfe, 0x1b, 0xd2, 0x4a, 0xd3, 0x3d, 0x9e, 0x29, 0x0c, 0xc1, 0xeb, 0x1d, + 0xd6, 0x95, 0x46, 0x7f, 0x9d, 0x72, 0x4a, 0x5c, 0x82, 0xb7, 0x2a, 0xee, 0xde, 0xa9, 0x78, 0x95, + 0xe8, 0x65, 0x3c, 0x41, 0xd7, 0x5e, 0x00, 0x38, 0xd8, 0xb9, 0xbb, 0xbb, 0xb9, 0x75, 0x6b, 0xab, + 0xb6, 0xc9, 0xd3, 0xbe, 0xcd, 0xcd, 0xda, 0x66, 0x29, 0x4e, 0xf8, 0xa4, 0xda, 0xdd, 0xdd, 0xfb, + 0xb5, 0xcd, 0x52, 0x42, 0x5c, 0x87, 0xac, 0xeb, 0x21, 0xe8, 0xad, 0x19, 0xfd, 0x3d, 0x7e, 0x6f, + 0x20, 0x21, 0xb1, 0x02, 0x5a, 0x84, 0x9c, 0xff, 0x18, 0x8a, 0x2d, 0xe5, 0xac, 0xe1, 0x1e, 0x3f, + 0xfd, 0x52, 0x80, 0x62, 0x28, 0x94, 0xa3, 0x97, 0x60, 0xc6, 0xe8, 0x1d, 0xca, 0x8e, 0xed, 0x86, + 0x4e, 0xe9, 0x1c, 0xec, 0xa5, 0x77, 0xd8, 0xd6, 0x9a, 0x77, 0xf0, 0x29, 0xf7, 0x48, 0x69, 0xa3, + 0x77, 0x78, 0x87, 0x99, 0x38, 0x6b, 0x46, 0x7c, 0x44, 0x33, 0x12, 0xa1, 0x66, 0xa0, 0xab, 0x30, + 0xdb, 0xd5, 0x55, 0x2c, 0x2b, 0xaa, 0x6a, 0x62, 0x8b, 0xc5, 0x81, 0x2c, 0xd7, 0x9c, 0x23, 0x35, + 0xeb, 0xac, 0x42, 0xfc, 0x42, 0x00, 0x34, 0xe8, 0x15, 0xd1, 0xfe, 0xb0, 0xd4, 0x45, 0x98, 0x2c, + 0x75, 0xe1, 0xd3, 0x3d, 0x98, 0xc0, 0x34, 0x60, 0xc1, 0x6e, 0x99, 0xd8, 0x6a, 0xe9, 0x6d, 0x55, + 0x36, 0x68, 0x7f, 0xe9, 0xa0, 0xc4, 0x27, 0x1c, 0x94, 0x98, 0x84, 0x5c, 0x79, 0xb7, 0x66, 0xac, + 0x07, 0x16, 0x0d, 0x28, 0x37, 0x06, 0xc4, 0x78, 0x3f, 0xa3, 0x9a, 0x24, 0x3c, 0x4a, 0x93, 0xc4, + 0x1b, 0x50, 0xba, 0xe7, 0xfe, 0x9f, 0xff, 0x29, 0xd4, 0x4c, 0x61, 0xa0, 0x99, 0x27, 0x90, 0x71, + 0x9c, 0x30, 0xfa, 0x1f, 0xc8, 0xba, 0xa3, 0xe7, 0x5e, 0xbc, 0x8b, 0x1c, 0x76, 0xde, 0x12, 0x4f, + 0x04, 0x5d, 0x87, 0x39, 0x12, 0x45, 0x9c, 0x63, 0x67, 0x86, 0xc3, 0xc7, 0xa9, 0x37, 0x2c, 0xb2, + 0x8a, 0x6d, 0x07, 0x3c, 0x26, 0x79, 0x58, 0x29, 0x1c, 0x05, 0xbe, 0xcd, 0x06, 0x0c, 0xc9, 0x17, + 0x13, 0xc3, 0xf2, 0xc5, 0x0f, 0xe2, 0x90, 0xf3, 0x1d, 0x66, 0xa3, 0xff, 0xf2, 0x85, 0xa4, 0xc2, + 0x10, 0xab, 0xf4, 0xf1, 0x7a, 0x77, 0xb3, 0x82, 0x1d, 0x8b, 0x4f, 0xdf, 0xb1, 0xa8, 0xbb, 0x03, + 0xce, 0x99, 0x78, 0x72, 0xea, 0x33, 0xf1, 0xa7, 0x00, 0xd9, 0xba, 0xad, 0xb4, 0xe5, 0x13, 0xdd, + 0xd6, 0xba, 0xc7, 0x32, 0x5b, 0xed, 0x2c, 0x80, 0x94, 0x68, 0xcd, 0x7d, 0x5a, 0xb1, 0x47, 0xe8, + 0xe2, 0xaf, 0x05, 0xc8, 0xb8, 0xa0, 0xc3, 0xb4, 0x57, 0xad, 0xce, 0x42, 0x9a, 0xef, 0xab, 0xd9, + 0x5d, 0x2b, 0x5e, 0x1a, 0x7a, 0xf8, 0x5f, 0x81, 0x4c, 0x07, 0xdb, 0x0a, 0x8d, 0x86, 0x2c, 0x0f, + 0x71, 0xcb, 0xe8, 0x05, 0x28, 0x47, 0x9d, 0x2f, 0xd0, 0x94, 0x2e, 0x4f, 0xd2, 0x49, 0x5f, 0xb6, + 0x86, 0x55, 0x96, 0x0e, 0x5e, 0x7f, 0x11, 0x72, 0xbe, 0xeb, 0x72, 0x24, 0xb2, 0xee, 0xd4, 0x5e, + 0x2f, 0xc5, 0x2a, 0x33, 0x1f, 0x7d, 0xb2, 0x9c, 0xd8, 0xc1, 0xef, 0xa1, 0x32, 0x71, 0xc7, 0xd5, + 0x7a, 0xad, 0x7a, 0xa7, 0x24, 0x54, 0x72, 0x1f, 0x7d, 0xb2, 0x3c, 0x23, 0x61, 0x7a, 0xbc, 0x7b, + 0xfd, 0x0e, 0x14, 0x43, 0x33, 0x1a, 0xf4, 0xf1, 0x08, 0x0a, 0x9b, 0x07, 0x7b, 0xdb, 0x5b, 0xd5, + 0xf5, 0x46, 0x4d, 0xbe, 0xbf, 0xdb, 0xa8, 0x95, 0x04, 0x74, 0x0e, 0xe6, 0xb7, 0xb7, 0x5e, 0xab, + 0x37, 0xe4, 0xea, 0xf6, 0x56, 0x6d, 0xa7, 0x21, 0xaf, 0x37, 0x1a, 0xeb, 0xd5, 0x3b, 0xa5, 0xf8, + 0xda, 0x2f, 0x72, 0x50, 0x5c, 0xdf, 0xa8, 0x6e, 0xad, 0x1b, 0x46, 0x5b, 0x6b, 0x2a, 0x34, 0x62, + 0x54, 0x21, 0x49, 0xcf, 0x8a, 0x46, 0x3e, 0x9c, 0xa8, 0x8c, 0x3e, 0xff, 0x47, 0xb7, 0x20, 0x45, + 0x8f, 0x91, 0xd0, 0xe8, 0x97, 0x14, 0x95, 0x31, 0x17, 0x02, 0x48, 0x63, 0xe8, 0x3a, 0x1c, 0xf9, + 0xb4, 0xa2, 0x32, 0xfa, 0x7e, 0x00, 0xda, 0x86, 0x19, 0x07, 0x1c, 0x1f, 0xf7, 0x48, 0xa1, 0x32, + 0xf6, 0xa0, 0x9d, 0x74, 0x8d, 0x1d, 0x62, 0x8c, 0x7e, 0x75, 0x51, 0x19, 0x73, 0x73, 0x00, 0x6d, + 0x41, 0x9a, 0x03, 0x7b, 0x63, 0x1e, 0x1c, 0x54, 0xc6, 0x1d, 0x98, 0x23, 0x09, 0xb2, 0xde, 0x11, + 0xd6, 0xf8, 0xb7, 0x24, 0x95, 0x09, 0x2e, 0x45, 0xa0, 0x07, 0x90, 0x0f, 0x82, 0x85, 0x93, 0x3d, + 0x6a, 0xa8, 0x4c, 0x78, 0x34, 0x4f, 0xf4, 0x07, 0x91, 0xc3, 0xc9, 0x1e, 0x39, 0x54, 0x26, 0x3c, + 0xa9, 0x47, 0xef, 0xc0, 0xdc, 0x20, 0xb2, 0x37, 0xf9, 0x9b, 0x87, 0xca, 0x14, 0x67, 0xf7, 0xa8, + 0x03, 0x68, 0x08, 0x22, 0x38, 0xc5, 0x13, 0x88, 0xca, 0x34, 0x47, 0xf9, 0x48, 0x85, 0x62, 0x18, + 0x65, 0x9b, 0xf4, 0x49, 0x44, 0x65, 0xe2, 0x63, 0x7d, 0xf6, 0x97, 0x20, 0xe4, 0x34, 0xe9, 0x13, + 0x89, 0xca, 0xc4, 0xa7, 0xfc, 0xe8, 0x00, 0xc0, 0x07, 0x99, 0x4c, 0xf0, 0x64, 0xa2, 0x32, 0xc9, + 0x79, 0x3f, 0x32, 0x60, 0x7e, 0x18, 0x96, 0x32, 0xcd, 0x0b, 0x8a, 0xca, 0x54, 0xd7, 0x00, 0x88, + 0x3d, 0x07, 0x51, 0x91, 0xc9, 0x5e, 0x54, 0x54, 0x26, 0xbc, 0x0f, 0xb0, 0x51, 0xfb, 0xf4, 0xcb, + 0x45, 0xe1, 0xb3, 0x2f, 0x17, 0x85, 0x2f, 0xbe, 0x5c, 0x14, 0x3e, 0xfe, 0x6a, 0x31, 0xf6, 0xd9, + 0x57, 0x8b, 0xb1, 0xdf, 0x7f, 0xb5, 0x18, 0xfb, 0xdf, 0x27, 0x8f, 0x35, 0xbb, 0xd5, 0x3b, 0x5c, + 0x69, 0xea, 0x9d, 0x55, 0xff, 0xe3, 0xba, 0x61, 0x0f, 0xfe, 0x0e, 0xd3, 0x34, 0x12, 0xdf, 0xf8, + 0x57, 0x00, 0x00, 0x00, 0xff, 0xff, 0x0d, 0x2a, 0x96, 0xd0, 0x10, 0x38, 0x00, 0x00, } -func (m *ResponseException) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if len(m.Error) > 0 { - i -= len(m.Error) - copy(dAtA[i:], m.Error) - i = encodeVarintTypes(dAtA, i, uint64(len(m.Error))) - i-- - dAtA[i] = 0xa - } - return len(dAtA) - i, nil +// Reference imports to suppress errors if they are not otherwise used. +var _ context.Context +var _ grpc.ClientConn + +// This is a compile-time assertion to ensure that this generated file +// is compatible with the grpc package it is being compiled against. +const _ = grpc.SupportPackageIsVersion4 + +// ABCIApplicationClient is the client API for ABCIApplication service. +// +// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://godoc.org/google.golang.org/grpc#ClientConn.NewStream. +type ABCIApplicationClient interface { + Echo(ctx context.Context, in *RequestEcho, opts ...grpc.CallOption) (*ResponseEcho, error) + Flush(ctx context.Context, in *RequestFlush, opts ...grpc.CallOption) (*ResponseFlush, error) + Info(ctx context.Context, in *RequestInfo, opts ...grpc.CallOption) (*ResponseInfo, error) + CheckTx(ctx context.Context, in *RequestCheckTx, opts ...grpc.CallOption) (*ResponseCheckTx, error) + Query(ctx context.Context, in *RequestQuery, opts ...grpc.CallOption) (*ResponseQuery, error) + Commit(ctx context.Context, in *RequestCommit, opts ...grpc.CallOption) (*ResponseCommit, error) + InitChain(ctx context.Context, in *RequestInitChain, opts ...grpc.CallOption) (*ResponseInitChain, error) + ListSnapshots(ctx context.Context, in *RequestListSnapshots, opts ...grpc.CallOption) (*ResponseListSnapshots, error) + OfferSnapshot(ctx context.Context, in *RequestOfferSnapshot, opts ...grpc.CallOption) (*ResponseOfferSnapshot, error) + LoadSnapshotChunk(ctx context.Context, in *RequestLoadSnapshotChunk, opts ...grpc.CallOption) (*ResponseLoadSnapshotChunk, error) + ApplySnapshotChunk(ctx context.Context, in *RequestApplySnapshotChunk, opts ...grpc.CallOption) (*ResponseApplySnapshotChunk, error) + PrepareProposal(ctx context.Context, in *RequestPrepareProposal, opts ...grpc.CallOption) (*ResponsePrepareProposal, error) + ProcessProposal(ctx context.Context, in *RequestProcessProposal, opts ...grpc.CallOption) (*ResponseProcessProposal, error) + ExtendVote(ctx context.Context, in *RequestExtendVote, opts ...grpc.CallOption) (*ResponseExtendVote, error) + VerifyVoteExtension(ctx context.Context, in *RequestVerifyVoteExtension, opts ...grpc.CallOption) (*ResponseVerifyVoteExtension, error) + FinalizeBlock(ctx context.Context, in *RequestFinalizeBlock, opts ...grpc.CallOption) (*ResponseFinalizeBlock, error) } -func (m *ResponseEcho) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) +type aBCIApplicationClient struct { + cc *grpc.ClientConn +} + +func NewABCIApplicationClient(cc *grpc.ClientConn) ABCIApplicationClient { + return &aBCIApplicationClient{cc} +} + +func (c *aBCIApplicationClient) Echo(ctx context.Context, in *RequestEcho, opts ...grpc.CallOption) (*ResponseEcho, error) { + out := new(ResponseEcho) + err := c.cc.Invoke(ctx, "/tendermint.abci.ABCIApplication/Echo", in, out, opts...) if err != nil { return nil, err } - return dAtA[:n], nil + return out, nil } -func (m *ResponseEcho) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) +func (c *aBCIApplicationClient) Flush(ctx context.Context, in *RequestFlush, opts ...grpc.CallOption) (*ResponseFlush, error) { + out := new(ResponseFlush) + err := c.cc.Invoke(ctx, "/tendermint.abci.ABCIApplication/Flush", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil } -func (m *ResponseEcho) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if len(m.Message) > 0 { - i -= len(m.Message) - copy(dAtA[i:], m.Message) - i = encodeVarintTypes(dAtA, i, uint64(len(m.Message))) - i-- - dAtA[i] = 0xa +func (c *aBCIApplicationClient) Info(ctx context.Context, in *RequestInfo, opts ...grpc.CallOption) (*ResponseInfo, error) { + out := new(ResponseInfo) + err := c.cc.Invoke(ctx, "/tendermint.abci.ABCIApplication/Info", in, out, opts...) + if err != nil { + return nil, err } - return len(dAtA) - i, nil + return out, nil } -func (m *ResponseFlush) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) +func (c *aBCIApplicationClient) CheckTx(ctx context.Context, in *RequestCheckTx, opts ...grpc.CallOption) (*ResponseCheckTx, error) { + out := new(ResponseCheckTx) + err := c.cc.Invoke(ctx, "/tendermint.abci.ABCIApplication/CheckTx", in, out, opts...) if err != nil { return nil, err } - return dAtA[:n], nil + return out, nil } -func (m *ResponseFlush) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) +func (c *aBCIApplicationClient) Query(ctx context.Context, in *RequestQuery, opts ...grpc.CallOption) (*ResponseQuery, error) { + out := new(ResponseQuery) + err := c.cc.Invoke(ctx, "/tendermint.abci.ABCIApplication/Query", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil } -func (m *ResponseFlush) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - return len(dAtA) - i, nil +func (c *aBCIApplicationClient) Commit(ctx context.Context, in *RequestCommit, opts ...grpc.CallOption) (*ResponseCommit, error) { + out := new(ResponseCommit) + err := c.cc.Invoke(ctx, "/tendermint.abci.ABCIApplication/Commit", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil } -func (m *ResponseInfo) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) +func (c *aBCIApplicationClient) InitChain(ctx context.Context, in *RequestInitChain, opts ...grpc.CallOption) (*ResponseInitChain, error) { + out := new(ResponseInitChain) + err := c.cc.Invoke(ctx, "/tendermint.abci.ABCIApplication/InitChain", in, out, opts...) if err != nil { return nil, err } - return dAtA[:n], nil + return out, nil } -func (m *ResponseInfo) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) +func (c *aBCIApplicationClient) ListSnapshots(ctx context.Context, in *RequestListSnapshots, opts ...grpc.CallOption) (*ResponseListSnapshots, error) { + out := new(ResponseListSnapshots) + err := c.cc.Invoke(ctx, "/tendermint.abci.ABCIApplication/ListSnapshots", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil } -func (m *ResponseInfo) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if len(m.LastBlockAppHash) > 0 { - i -= len(m.LastBlockAppHash) - copy(dAtA[i:], m.LastBlockAppHash) - i = encodeVarintTypes(dAtA, i, uint64(len(m.LastBlockAppHash))) - i-- - dAtA[i] = 0x2a - } - if m.LastBlockHeight != 0 { - i = encodeVarintTypes(dAtA, i, uint64(m.LastBlockHeight)) - i-- - dAtA[i] = 0x20 - } - if m.AppVersion != 0 { - i = encodeVarintTypes(dAtA, i, uint64(m.AppVersion)) - i-- - dAtA[i] = 0x18 +func (c *aBCIApplicationClient) OfferSnapshot(ctx context.Context, in *RequestOfferSnapshot, opts ...grpc.CallOption) (*ResponseOfferSnapshot, error) { + out := new(ResponseOfferSnapshot) + err := c.cc.Invoke(ctx, "/tendermint.abci.ABCIApplication/OfferSnapshot", in, out, opts...) + if err != nil { + return nil, err } - if len(m.Version) > 0 { - i -= len(m.Version) - copy(dAtA[i:], m.Version) - i = encodeVarintTypes(dAtA, i, uint64(len(m.Version))) - i-- - dAtA[i] = 0x12 + return out, nil +} + +func (c *aBCIApplicationClient) LoadSnapshotChunk(ctx context.Context, in *RequestLoadSnapshotChunk, opts ...grpc.CallOption) (*ResponseLoadSnapshotChunk, error) { + out := new(ResponseLoadSnapshotChunk) + err := c.cc.Invoke(ctx, "/tendermint.abci.ABCIApplication/LoadSnapshotChunk", in, out, opts...) + if err != nil { + return nil, err } - if len(m.Data) > 0 { - i -= len(m.Data) - copy(dAtA[i:], m.Data) - i = encodeVarintTypes(dAtA, i, uint64(len(m.Data))) - i-- - dAtA[i] = 0xa + return out, nil +} + +func (c *aBCIApplicationClient) ApplySnapshotChunk(ctx context.Context, in *RequestApplySnapshotChunk, opts ...grpc.CallOption) (*ResponseApplySnapshotChunk, error) { + out := new(ResponseApplySnapshotChunk) + err := c.cc.Invoke(ctx, "/tendermint.abci.ABCIApplication/ApplySnapshotChunk", in, out, opts...) + if err != nil { + return nil, err } - return len(dAtA) - i, nil + return out, nil } -func (m *ResponseInitChain) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) +func (c *aBCIApplicationClient) PrepareProposal(ctx context.Context, in *RequestPrepareProposal, opts ...grpc.CallOption) (*ResponsePrepareProposal, error) { + out := new(ResponsePrepareProposal) + err := c.cc.Invoke(ctx, "/tendermint.abci.ABCIApplication/PrepareProposal", in, out, opts...) if err != nil { return nil, err } - return dAtA[:n], nil + return out, nil } -func (m *ResponseInitChain) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) +func (c *aBCIApplicationClient) ProcessProposal(ctx context.Context, in *RequestProcessProposal, opts ...grpc.CallOption) (*ResponseProcessProposal, error) { + out := new(ResponseProcessProposal) + err := c.cc.Invoke(ctx, "/tendermint.abci.ABCIApplication/ProcessProposal", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil } -func (m *ResponseInitChain) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if m.InitialCoreHeight != 0 { - i = encodeVarintTypes(dAtA, i, uint64(m.InitialCoreHeight)) - i-- - dAtA[i] = 0x6 - i-- - dAtA[i] = 0xb0 - } - if m.NextCoreChainLockUpdate != nil { - { - size, err := m.NextCoreChainLockUpdate.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintTypes(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x6 - i-- - dAtA[i] = 0xaa - } - { - size, err := m.ValidatorSetUpdate.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintTypes(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x6 - i-- - dAtA[i] = 0xa2 - if len(m.AppHash) > 0 { - i -= len(m.AppHash) - copy(dAtA[i:], m.AppHash) - i = encodeVarintTypes(dAtA, i, uint64(len(m.AppHash))) - i-- - dAtA[i] = 0x1a +func (c *aBCIApplicationClient) ExtendVote(ctx context.Context, in *RequestExtendVote, opts ...grpc.CallOption) (*ResponseExtendVote, error) { + out := new(ResponseExtendVote) + err := c.cc.Invoke(ctx, "/tendermint.abci.ABCIApplication/ExtendVote", in, out, opts...) + if err != nil { + return nil, err } - if m.ConsensusParams != nil { - { - size, err := m.ConsensusParams.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintTypes(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0xa + return out, nil +} + +func (c *aBCIApplicationClient) VerifyVoteExtension(ctx context.Context, in *RequestVerifyVoteExtension, opts ...grpc.CallOption) (*ResponseVerifyVoteExtension, error) { + out := new(ResponseVerifyVoteExtension) + err := c.cc.Invoke(ctx, "/tendermint.abci.ABCIApplication/VerifyVoteExtension", in, out, opts...) + if err != nil { + return nil, err } - return len(dAtA) - i, nil + return out, nil } -func (m *ResponseQuery) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) +func (c *aBCIApplicationClient) FinalizeBlock(ctx context.Context, in *RequestFinalizeBlock, opts ...grpc.CallOption) (*ResponseFinalizeBlock, error) { + out := new(ResponseFinalizeBlock) + err := c.cc.Invoke(ctx, "/tendermint.abci.ABCIApplication/FinalizeBlock", in, out, opts...) if err != nil { return nil, err } - return dAtA[:n], nil + return out, nil } -func (m *ResponseQuery) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) +// ABCIApplicationServer is the server API for ABCIApplication service. +type ABCIApplicationServer interface { + Echo(context.Context, *RequestEcho) (*ResponseEcho, error) + Flush(context.Context, *RequestFlush) (*ResponseFlush, error) + Info(context.Context, *RequestInfo) (*ResponseInfo, error) + CheckTx(context.Context, *RequestCheckTx) (*ResponseCheckTx, error) + Query(context.Context, *RequestQuery) (*ResponseQuery, error) + Commit(context.Context, *RequestCommit) (*ResponseCommit, error) + InitChain(context.Context, *RequestInitChain) (*ResponseInitChain, error) + ListSnapshots(context.Context, *RequestListSnapshots) (*ResponseListSnapshots, error) + OfferSnapshot(context.Context, *RequestOfferSnapshot) (*ResponseOfferSnapshot, error) + LoadSnapshotChunk(context.Context, *RequestLoadSnapshotChunk) (*ResponseLoadSnapshotChunk, error) + ApplySnapshotChunk(context.Context, *RequestApplySnapshotChunk) (*ResponseApplySnapshotChunk, error) + PrepareProposal(context.Context, *RequestPrepareProposal) (*ResponsePrepareProposal, error) + ProcessProposal(context.Context, *RequestProcessProposal) (*ResponseProcessProposal, error) + ExtendVote(context.Context, *RequestExtendVote) (*ResponseExtendVote, error) + VerifyVoteExtension(context.Context, *RequestVerifyVoteExtension) (*ResponseVerifyVoteExtension, error) + FinalizeBlock(context.Context, *RequestFinalizeBlock) (*ResponseFinalizeBlock, error) } -func (m *ResponseQuery) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if len(m.Codespace) > 0 { - i -= len(m.Codespace) - copy(dAtA[i:], m.Codespace) - i = encodeVarintTypes(dAtA, i, uint64(len(m.Codespace))) - i-- - dAtA[i] = 0x52 - } - if m.Height != 0 { - i = encodeVarintTypes(dAtA, i, uint64(m.Height)) - i-- - dAtA[i] = 0x48 +// UnimplementedABCIApplicationServer can be embedded to have forward compatible implementations. +type UnimplementedABCIApplicationServer struct { +} + +func (*UnimplementedABCIApplicationServer) Echo(ctx context.Context, req *RequestEcho) (*ResponseEcho, error) { + return nil, status.Errorf(codes.Unimplemented, "method Echo not implemented") +} +func (*UnimplementedABCIApplicationServer) Flush(ctx context.Context, req *RequestFlush) (*ResponseFlush, error) { + return nil, status.Errorf(codes.Unimplemented, "method Flush not implemented") +} +func (*UnimplementedABCIApplicationServer) Info(ctx context.Context, req *RequestInfo) (*ResponseInfo, error) { + return nil, status.Errorf(codes.Unimplemented, "method Info not implemented") +} +func (*UnimplementedABCIApplicationServer) CheckTx(ctx context.Context, req *RequestCheckTx) (*ResponseCheckTx, error) { + return nil, status.Errorf(codes.Unimplemented, "method CheckTx not implemented") +} +func (*UnimplementedABCIApplicationServer) Query(ctx context.Context, req *RequestQuery) (*ResponseQuery, error) { + return nil, status.Errorf(codes.Unimplemented, "method Query not implemented") +} +func (*UnimplementedABCIApplicationServer) Commit(ctx context.Context, req *RequestCommit) (*ResponseCommit, error) { + return nil, status.Errorf(codes.Unimplemented, "method Commit not implemented") +} +func (*UnimplementedABCIApplicationServer) InitChain(ctx context.Context, req *RequestInitChain) (*ResponseInitChain, error) { + return nil, status.Errorf(codes.Unimplemented, "method InitChain not implemented") +} +func (*UnimplementedABCIApplicationServer) ListSnapshots(ctx context.Context, req *RequestListSnapshots) (*ResponseListSnapshots, error) { + return nil, status.Errorf(codes.Unimplemented, "method ListSnapshots not implemented") +} +func (*UnimplementedABCIApplicationServer) OfferSnapshot(ctx context.Context, req *RequestOfferSnapshot) (*ResponseOfferSnapshot, error) { + return nil, status.Errorf(codes.Unimplemented, "method OfferSnapshot not implemented") +} +func (*UnimplementedABCIApplicationServer) LoadSnapshotChunk(ctx context.Context, req *RequestLoadSnapshotChunk) (*ResponseLoadSnapshotChunk, error) { + return nil, status.Errorf(codes.Unimplemented, "method LoadSnapshotChunk not implemented") +} +func (*UnimplementedABCIApplicationServer) ApplySnapshotChunk(ctx context.Context, req *RequestApplySnapshotChunk) (*ResponseApplySnapshotChunk, error) { + return nil, status.Errorf(codes.Unimplemented, "method ApplySnapshotChunk not implemented") +} +func (*UnimplementedABCIApplicationServer) PrepareProposal(ctx context.Context, req *RequestPrepareProposal) (*ResponsePrepareProposal, error) { + return nil, status.Errorf(codes.Unimplemented, "method PrepareProposal not implemented") +} +func (*UnimplementedABCIApplicationServer) ProcessProposal(ctx context.Context, req *RequestProcessProposal) (*ResponseProcessProposal, error) { + return nil, status.Errorf(codes.Unimplemented, "method ProcessProposal not implemented") +} +func (*UnimplementedABCIApplicationServer) ExtendVote(ctx context.Context, req *RequestExtendVote) (*ResponseExtendVote, error) { + return nil, status.Errorf(codes.Unimplemented, "method ExtendVote not implemented") +} +func (*UnimplementedABCIApplicationServer) VerifyVoteExtension(ctx context.Context, req *RequestVerifyVoteExtension) (*ResponseVerifyVoteExtension, error) { + return nil, status.Errorf(codes.Unimplemented, "method VerifyVoteExtension not implemented") +} +func (*UnimplementedABCIApplicationServer) FinalizeBlock(ctx context.Context, req *RequestFinalizeBlock) (*ResponseFinalizeBlock, error) { + return nil, status.Errorf(codes.Unimplemented, "method FinalizeBlock not implemented") +} + +func RegisterABCIApplicationServer(s *grpc.Server, srv ABCIApplicationServer) { + s.RegisterService(&_ABCIApplication_serviceDesc, srv) +} + +func _ABCIApplication_Echo_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(RequestEcho) + if err := dec(in); err != nil { + return nil, err } - if m.ProofOps != nil { - { - size, err := m.ProofOps.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintTypes(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x42 + if interceptor == nil { + return srv.(ABCIApplicationServer).Echo(ctx, in) } - if len(m.Value) > 0 { - i -= len(m.Value) - copy(dAtA[i:], m.Value) - i = encodeVarintTypes(dAtA, i, uint64(len(m.Value))) - i-- - dAtA[i] = 0x3a + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/tendermint.abci.ABCIApplication/Echo", } - if len(m.Key) > 0 { - i -= len(m.Key) - copy(dAtA[i:], m.Key) - i = encodeVarintTypes(dAtA, i, uint64(len(m.Key))) - i-- - dAtA[i] = 0x32 + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(ABCIApplicationServer).Echo(ctx, req.(*RequestEcho)) } - if m.Index != 0 { - i = encodeVarintTypes(dAtA, i, uint64(m.Index)) - i-- - dAtA[i] = 0x28 + return interceptor(ctx, in, info, handler) +} + +func _ABCIApplication_Flush_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(RequestFlush) + if err := dec(in); err != nil { + return nil, err } - if len(m.Info) > 0 { - i -= len(m.Info) - copy(dAtA[i:], m.Info) - i = encodeVarintTypes(dAtA, i, uint64(len(m.Info))) - i-- - dAtA[i] = 0x22 + if interceptor == nil { + return srv.(ABCIApplicationServer).Flush(ctx, in) } - if len(m.Log) > 0 { - i -= len(m.Log) - copy(dAtA[i:], m.Log) - i = encodeVarintTypes(dAtA, i, uint64(len(m.Log))) - i-- - dAtA[i] = 0x1a + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/tendermint.abci.ABCIApplication/Flush", } - if m.Code != 0 { - i = encodeVarintTypes(dAtA, i, uint64(m.Code)) - i-- - dAtA[i] = 0x8 + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(ABCIApplicationServer).Flush(ctx, req.(*RequestFlush)) } - return len(dAtA) - i, nil + return interceptor(ctx, in, info, handler) } -func (m *ResponseBeginBlock) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { +func _ABCIApplication_Info_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(RequestInfo) + if err := dec(in); err != nil { return nil, err } - return dAtA[:n], nil + if interceptor == nil { + return srv.(ABCIApplicationServer).Info(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/tendermint.abci.ABCIApplication/Info", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(ABCIApplicationServer).Info(ctx, req.(*RequestInfo)) + } + return interceptor(ctx, in, info, handler) } -func (m *ResponseBeginBlock) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) +func _ABCIApplication_CheckTx_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(RequestCheckTx) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(ABCIApplicationServer).CheckTx(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/tendermint.abci.ABCIApplication/CheckTx", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(ABCIApplicationServer).CheckTx(ctx, req.(*RequestCheckTx)) + } + return interceptor(ctx, in, info, handler) } -func (m *ResponseBeginBlock) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if len(m.Events) > 0 { - for iNdEx := len(m.Events) - 1; iNdEx >= 0; iNdEx-- { - { - size, err := m.Events[iNdEx].MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintTypes(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0xa - } +func _ABCIApplication_Query_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(RequestQuery) + if err := dec(in); err != nil { + return nil, err } - return len(dAtA) - i, nil + if interceptor == nil { + return srv.(ABCIApplicationServer).Query(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/tendermint.abci.ABCIApplication/Query", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(ABCIApplicationServer).Query(ctx, req.(*RequestQuery)) + } + return interceptor(ctx, in, info, handler) } -func (m *ResponseCheckTx) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { +func _ABCIApplication_Commit_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(RequestCommit) + if err := dec(in); err != nil { return nil, err } - return dAtA[:n], nil + if interceptor == nil { + return srv.(ABCIApplicationServer).Commit(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/tendermint.abci.ABCIApplication/Commit", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(ABCIApplicationServer).Commit(ctx, req.(*RequestCommit)) + } + return interceptor(ctx, in, info, handler) } -func (m *ResponseCheckTx) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) +func _ABCIApplication_InitChain_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(RequestInitChain) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(ABCIApplicationServer).InitChain(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/tendermint.abci.ABCIApplication/InitChain", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(ABCIApplicationServer).InitChain(ctx, req.(*RequestInitChain)) + } + return interceptor(ctx, in, info, handler) } -func (m *ResponseCheckTx) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if len(m.MempoolError) > 0 { - i -= len(m.MempoolError) - copy(dAtA[i:], m.MempoolError) - i = encodeVarintTypes(dAtA, i, uint64(len(m.MempoolError))) - i-- - dAtA[i] = 0x5a +func _ABCIApplication_ListSnapshots_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(RequestListSnapshots) + if err := dec(in); err != nil { + return nil, err } - if m.Priority != 0 { - i = encodeVarintTypes(dAtA, i, uint64(m.Priority)) - i-- - dAtA[i] = 0x50 + if interceptor == nil { + return srv.(ABCIApplicationServer).ListSnapshots(ctx, in) } - if len(m.Sender) > 0 { - i -= len(m.Sender) - copy(dAtA[i:], m.Sender) - i = encodeVarintTypes(dAtA, i, uint64(len(m.Sender))) - i-- - dAtA[i] = 0x4a + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/tendermint.abci.ABCIApplication/ListSnapshots", } - if len(m.Codespace) > 0 { - i -= len(m.Codespace) - copy(dAtA[i:], m.Codespace) - i = encodeVarintTypes(dAtA, i, uint64(len(m.Codespace))) - i-- - dAtA[i] = 0x42 + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(ABCIApplicationServer).ListSnapshots(ctx, req.(*RequestListSnapshots)) } - if len(m.Events) > 0 { - for iNdEx := len(m.Events) - 1; iNdEx >= 0; iNdEx-- { - { - size, err := m.Events[iNdEx].MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintTypes(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x3a - } + return interceptor(ctx, in, info, handler) +} + +func _ABCIApplication_OfferSnapshot_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(RequestOfferSnapshot) + if err := dec(in); err != nil { + return nil, err } - if m.GasUsed != 0 { - i = encodeVarintTypes(dAtA, i, uint64(m.GasUsed)) - i-- - dAtA[i] = 0x30 + if interceptor == nil { + return srv.(ABCIApplicationServer).OfferSnapshot(ctx, in) } - if m.GasWanted != 0 { - i = encodeVarintTypes(dAtA, i, uint64(m.GasWanted)) - i-- - dAtA[i] = 0x28 + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/tendermint.abci.ABCIApplication/OfferSnapshot", } - if len(m.Info) > 0 { - i -= len(m.Info) - copy(dAtA[i:], m.Info) - i = encodeVarintTypes(dAtA, i, uint64(len(m.Info))) - i-- - dAtA[i] = 0x22 + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(ABCIApplicationServer).OfferSnapshot(ctx, req.(*RequestOfferSnapshot)) } - if len(m.Log) > 0 { - i -= len(m.Log) - copy(dAtA[i:], m.Log) - i = encodeVarintTypes(dAtA, i, uint64(len(m.Log))) - i-- - dAtA[i] = 0x1a + return interceptor(ctx, in, info, handler) +} + +func _ABCIApplication_LoadSnapshotChunk_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(RequestLoadSnapshotChunk) + if err := dec(in); err != nil { + return nil, err } - if len(m.Data) > 0 { - i -= len(m.Data) - copy(dAtA[i:], m.Data) - i = encodeVarintTypes(dAtA, i, uint64(len(m.Data))) - i-- - dAtA[i] = 0x12 + if interceptor == nil { + return srv.(ABCIApplicationServer).LoadSnapshotChunk(ctx, in) } - if m.Code != 0 { - i = encodeVarintTypes(dAtA, i, uint64(m.Code)) - i-- - dAtA[i] = 0x8 + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/tendermint.abci.ABCIApplication/LoadSnapshotChunk", } - return len(dAtA) - i, nil + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(ABCIApplicationServer).LoadSnapshotChunk(ctx, req.(*RequestLoadSnapshotChunk)) + } + return interceptor(ctx, in, info, handler) } -func (m *ResponseDeliverTx) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { +func _ABCIApplication_ApplySnapshotChunk_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(RequestApplySnapshotChunk) + if err := dec(in); err != nil { return nil, err } - return dAtA[:n], nil + if interceptor == nil { + return srv.(ABCIApplicationServer).ApplySnapshotChunk(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/tendermint.abci.ABCIApplication/ApplySnapshotChunk", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(ABCIApplicationServer).ApplySnapshotChunk(ctx, req.(*RequestApplySnapshotChunk)) + } + return interceptor(ctx, in, info, handler) } -func (m *ResponseDeliverTx) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) +func _ABCIApplication_PrepareProposal_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(RequestPrepareProposal) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(ABCIApplicationServer).PrepareProposal(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/tendermint.abci.ABCIApplication/PrepareProposal", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(ABCIApplicationServer).PrepareProposal(ctx, req.(*RequestPrepareProposal)) + } + return interceptor(ctx, in, info, handler) } -func (m *ResponseDeliverTx) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if len(m.Codespace) > 0 { - i -= len(m.Codespace) - copy(dAtA[i:], m.Codespace) - i = encodeVarintTypes(dAtA, i, uint64(len(m.Codespace))) - i-- - dAtA[i] = 0x42 +func _ABCIApplication_ProcessProposal_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(RequestProcessProposal) + if err := dec(in); err != nil { + return nil, err } - if len(m.Events) > 0 { - for iNdEx := len(m.Events) - 1; iNdEx >= 0; iNdEx-- { - { - size, err := m.Events[iNdEx].MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintTypes(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x3a - } + if interceptor == nil { + return srv.(ABCIApplicationServer).ProcessProposal(ctx, in) } - if m.GasUsed != 0 { - i = encodeVarintTypes(dAtA, i, uint64(m.GasUsed)) - i-- - dAtA[i] = 0x30 + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/tendermint.abci.ABCIApplication/ProcessProposal", } - if m.GasWanted != 0 { - i = encodeVarintTypes(dAtA, i, uint64(m.GasWanted)) - i-- - dAtA[i] = 0x28 + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(ABCIApplicationServer).ProcessProposal(ctx, req.(*RequestProcessProposal)) } - if len(m.Info) > 0 { - i -= len(m.Info) - copy(dAtA[i:], m.Info) - i = encodeVarintTypes(dAtA, i, uint64(len(m.Info))) - i-- - dAtA[i] = 0x22 + return interceptor(ctx, in, info, handler) +} + +func _ABCIApplication_ExtendVote_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(RequestExtendVote) + if err := dec(in); err != nil { + return nil, err } - if len(m.Log) > 0 { - i -= len(m.Log) - copy(dAtA[i:], m.Log) - i = encodeVarintTypes(dAtA, i, uint64(len(m.Log))) - i-- - dAtA[i] = 0x1a + if interceptor == nil { + return srv.(ABCIApplicationServer).ExtendVote(ctx, in) } - if len(m.Data) > 0 { - i -= len(m.Data) - copy(dAtA[i:], m.Data) - i = encodeVarintTypes(dAtA, i, uint64(len(m.Data))) - i-- - dAtA[i] = 0x12 + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/tendermint.abci.ABCIApplication/ExtendVote", } - if m.Code != 0 { - i = encodeVarintTypes(dAtA, i, uint64(m.Code)) - i-- - dAtA[i] = 0x8 + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(ABCIApplicationServer).ExtendVote(ctx, req.(*RequestExtendVote)) } - return len(dAtA) - i, nil + return interceptor(ctx, in, info, handler) } -func (m *ResponseEndBlock) Marshal() (dAtA []byte, err error) { +func _ABCIApplication_VerifyVoteExtension_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(RequestVerifyVoteExtension) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(ABCIApplicationServer).VerifyVoteExtension(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/tendermint.abci.ABCIApplication/VerifyVoteExtension", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(ABCIApplicationServer).VerifyVoteExtension(ctx, req.(*RequestVerifyVoteExtension)) + } + return interceptor(ctx, in, info, handler) +} + +func _ABCIApplication_FinalizeBlock_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(RequestFinalizeBlock) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(ABCIApplicationServer).FinalizeBlock(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/tendermint.abci.ABCIApplication/FinalizeBlock", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(ABCIApplicationServer).FinalizeBlock(ctx, req.(*RequestFinalizeBlock)) + } + return interceptor(ctx, in, info, handler) +} + +var _ABCIApplication_serviceDesc = grpc.ServiceDesc{ + ServiceName: "tendermint.abci.ABCIApplication", + HandlerType: (*ABCIApplicationServer)(nil), + Methods: []grpc.MethodDesc{ + { + MethodName: "Echo", + Handler: _ABCIApplication_Echo_Handler, + }, + { + MethodName: "Flush", + Handler: _ABCIApplication_Flush_Handler, + }, + { + MethodName: "Info", + Handler: _ABCIApplication_Info_Handler, + }, + { + MethodName: "CheckTx", + Handler: _ABCIApplication_CheckTx_Handler, + }, + { + MethodName: "Query", + Handler: _ABCIApplication_Query_Handler, + }, + { + MethodName: "Commit", + Handler: _ABCIApplication_Commit_Handler, + }, + { + MethodName: "InitChain", + Handler: _ABCIApplication_InitChain_Handler, + }, + { + MethodName: "ListSnapshots", + Handler: _ABCIApplication_ListSnapshots_Handler, + }, + { + MethodName: "OfferSnapshot", + Handler: _ABCIApplication_OfferSnapshot_Handler, + }, + { + MethodName: "LoadSnapshotChunk", + Handler: _ABCIApplication_LoadSnapshotChunk_Handler, + }, + { + MethodName: "ApplySnapshotChunk", + Handler: _ABCIApplication_ApplySnapshotChunk_Handler, + }, + { + MethodName: "PrepareProposal", + Handler: _ABCIApplication_PrepareProposal_Handler, + }, + { + MethodName: "ProcessProposal", + Handler: _ABCIApplication_ProcessProposal_Handler, + }, + { + MethodName: "ExtendVote", + Handler: _ABCIApplication_ExtendVote_Handler, + }, + { + MethodName: "VerifyVoteExtension", + Handler: _ABCIApplication_VerifyVoteExtension_Handler, + }, + { + MethodName: "FinalizeBlock", + Handler: _ABCIApplication_FinalizeBlock_Handler, + }, + }, + Streams: []grpc.StreamDesc{}, + Metadata: "tendermint/abci/types.proto", +} + +func (m *Request) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) n, err := m.MarshalToSizedBuffer(dAtA[:size]) @@ -5673,33 +5331,38 @@ func (m *ResponseEndBlock) Marshal() (dAtA []byte, err error) { return dAtA[:n], nil } -func (m *ResponseEndBlock) MarshalTo(dAtA []byte) (int, error) { +func (m *Request) MarshalTo(dAtA []byte) (int, error) { size := m.Size() return m.MarshalToSizedBuffer(dAtA[:size]) } -func (m *ResponseEndBlock) MarshalToSizedBuffer(dAtA []byte) (int, error) { +func (m *Request) MarshalToSizedBuffer(dAtA []byte) (int, error) { i := len(dAtA) _ = i var l int _ = l - if m.ValidatorSetUpdate != nil { + if m.Value != nil { { - size, err := m.ValidatorSetUpdate.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { + size := m.Value.Size() + i -= size + if _, err := m.Value.MarshalTo(dAtA[i:]); err != nil { return 0, err } - i -= size - i = encodeVarintTypes(dAtA, i, uint64(size)) } - i-- - dAtA[i] = 0x6 - i-- - dAtA[i] = 0xaa } - if m.NextCoreChainLockUpdate != nil { + return len(dAtA) - i, nil +} + +func (m *Request_Echo) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *Request_Echo) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + if m.Echo != nil { { - size, err := m.NextCoreChainLockUpdate.MarshalToSizedBuffer(dAtA[:i]) + size, err := m.Echo.MarshalToSizedBuffer(dAtA[:i]) if err != nil { return 0, err } @@ -5707,27 +5370,20 @@ func (m *ResponseEndBlock) MarshalToSizedBuffer(dAtA []byte) (int, error) { i = encodeVarintTypes(dAtA, i, uint64(size)) } i-- - dAtA[i] = 0x6 - i-- - dAtA[i] = 0xa2 - } - if len(m.Events) > 0 { - for iNdEx := len(m.Events) - 1; iNdEx >= 0; iNdEx-- { - { - size, err := m.Events[iNdEx].MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintTypes(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x1a - } + dAtA[i] = 0xa } - if m.ConsensusParamUpdates != nil { + return len(dAtA) - i, nil +} +func (m *Request_Flush) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *Request_Flush) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + if m.Flush != nil { { - size, err := m.ConsensusParamUpdates.MarshalToSizedBuffer(dAtA[:i]) + size, err := m.Flush.MarshalToSizedBuffer(dAtA[:i]) if err != nil { return 0, err } @@ -5739,333 +5395,372 @@ func (m *ResponseEndBlock) MarshalToSizedBuffer(dAtA []byte) (int, error) { } return len(dAtA) - i, nil } - -func (m *ResponseCommit) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err - } - return dAtA[:n], nil -} - -func (m *ResponseCommit) MarshalTo(dAtA []byte) (int, error) { +func (m *Request_Info) MarshalTo(dAtA []byte) (int, error) { size := m.Size() return m.MarshalToSizedBuffer(dAtA[:size]) } -func (m *ResponseCommit) MarshalToSizedBuffer(dAtA []byte) (int, error) { +func (m *Request_Info) MarshalToSizedBuffer(dAtA []byte) (int, error) { i := len(dAtA) - _ = i - var l int - _ = l - if m.RetainHeight != 0 { - i = encodeVarintTypes(dAtA, i, uint64(m.RetainHeight)) - i-- - dAtA[i] = 0x18 - } - if len(m.Data) > 0 { - i -= len(m.Data) - copy(dAtA[i:], m.Data) - i = encodeVarintTypes(dAtA, i, uint64(len(m.Data))) + if m.Info != nil { + { + size, err := m.Info.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintTypes(dAtA, i, uint64(size)) + } i-- - dAtA[i] = 0x12 + dAtA[i] = 0x1a } return len(dAtA) - i, nil } - -func (m *ResponseListSnapshots) Marshal() (dAtA []byte, err error) { +func (m *Request_InitChain) MarshalTo(dAtA []byte) (int, error) { size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err - } - return dAtA[:n], nil + return m.MarshalToSizedBuffer(dAtA[:size]) } -func (m *ResponseListSnapshots) MarshalTo(dAtA []byte) (int, error) { +func (m *Request_InitChain) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + if m.InitChain != nil { + { + size, err := m.InitChain.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintTypes(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x22 + } + return len(dAtA) - i, nil +} +func (m *Request_Query) MarshalTo(dAtA []byte) (int, error) { size := m.Size() return m.MarshalToSizedBuffer(dAtA[:size]) } -func (m *ResponseListSnapshots) MarshalToSizedBuffer(dAtA []byte) (int, error) { +func (m *Request_Query) MarshalToSizedBuffer(dAtA []byte) (int, error) { i := len(dAtA) - _ = i - var l int - _ = l - if len(m.Snapshots) > 0 { - for iNdEx := len(m.Snapshots) - 1; iNdEx >= 0; iNdEx-- { - { - size, err := m.Snapshots[iNdEx].MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintTypes(dAtA, i, uint64(size)) + if m.Query != nil { + { + size, err := m.Query.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err } - i-- - dAtA[i] = 0xa + i -= size + i = encodeVarintTypes(dAtA, i, uint64(size)) } + i-- + dAtA[i] = 0x2a } return len(dAtA) - i, nil } - -func (m *ResponseOfferSnapshot) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err - } - return dAtA[:n], nil -} - -func (m *ResponseOfferSnapshot) MarshalTo(dAtA []byte) (int, error) { +func (m *Request_BeginBlock) MarshalTo(dAtA []byte) (int, error) { size := m.Size() return m.MarshalToSizedBuffer(dAtA[:size]) } -func (m *ResponseOfferSnapshot) MarshalToSizedBuffer(dAtA []byte) (int, error) { +func (m *Request_BeginBlock) MarshalToSizedBuffer(dAtA []byte) (int, error) { i := len(dAtA) - _ = i - var l int - _ = l - if m.Result != 0 { - i = encodeVarintTypes(dAtA, i, uint64(m.Result)) + if m.BeginBlock != nil { + { + size, err := m.BeginBlock.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintTypes(dAtA, i, uint64(size)) + } i-- - dAtA[i] = 0x8 + dAtA[i] = 0x32 } return len(dAtA) - i, nil } - -func (m *ResponseLoadSnapshotChunk) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err - } - return dAtA[:n], nil -} - -func (m *ResponseLoadSnapshotChunk) MarshalTo(dAtA []byte) (int, error) { +func (m *Request_CheckTx) MarshalTo(dAtA []byte) (int, error) { size := m.Size() return m.MarshalToSizedBuffer(dAtA[:size]) } -func (m *ResponseLoadSnapshotChunk) MarshalToSizedBuffer(dAtA []byte) (int, error) { +func (m *Request_CheckTx) MarshalToSizedBuffer(dAtA []byte) (int, error) { i := len(dAtA) - _ = i - var l int - _ = l - if len(m.Chunk) > 0 { - i -= len(m.Chunk) - copy(dAtA[i:], m.Chunk) - i = encodeVarintTypes(dAtA, i, uint64(len(m.Chunk))) + if m.CheckTx != nil { + { + size, err := m.CheckTx.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintTypes(dAtA, i, uint64(size)) + } i-- - dAtA[i] = 0xa + dAtA[i] = 0x3a } return len(dAtA) - i, nil } - -func (m *ResponseApplySnapshotChunk) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err - } - return dAtA[:n], nil -} - -func (m *ResponseApplySnapshotChunk) MarshalTo(dAtA []byte) (int, error) { +func (m *Request_DeliverTx) MarshalTo(dAtA []byte) (int, error) { size := m.Size() return m.MarshalToSizedBuffer(dAtA[:size]) } -func (m *ResponseApplySnapshotChunk) MarshalToSizedBuffer(dAtA []byte) (int, error) { +func (m *Request_DeliverTx) MarshalToSizedBuffer(dAtA []byte) (int, error) { i := len(dAtA) - _ = i - var l int - _ = l - if len(m.RejectSenders) > 0 { - for iNdEx := len(m.RejectSenders) - 1; iNdEx >= 0; iNdEx-- { - i -= len(m.RejectSenders[iNdEx]) - copy(dAtA[i:], m.RejectSenders[iNdEx]) - i = encodeVarintTypes(dAtA, i, uint64(len(m.RejectSenders[iNdEx]))) - i-- - dAtA[i] = 0x1a - } - } - if len(m.RefetchChunks) > 0 { - dAtA44 := make([]byte, len(m.RefetchChunks)*10) - var j43 int - for _, num := range m.RefetchChunks { - for num >= 1<<7 { - dAtA44[j43] = uint8(uint64(num)&0x7f | 0x80) - num >>= 7 - j43++ + if m.DeliverTx != nil { + { + size, err := m.DeliverTx.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err } - dAtA44[j43] = uint8(num) - j43++ + i -= size + i = encodeVarintTypes(dAtA, i, uint64(size)) } - i -= j43 - copy(dAtA[i:], dAtA44[:j43]) - i = encodeVarintTypes(dAtA, i, uint64(j43)) - i-- - dAtA[i] = 0x12 - } - if m.Result != 0 { - i = encodeVarintTypes(dAtA, i, uint64(m.Result)) i-- - dAtA[i] = 0x8 + dAtA[i] = 0x42 } return len(dAtA) - i, nil } - -func (m *LastCommitInfo) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err - } - return dAtA[:n], nil -} - -func (m *LastCommitInfo) MarshalTo(dAtA []byte) (int, error) { +func (m *Request_EndBlock) MarshalTo(dAtA []byte) (int, error) { size := m.Size() return m.MarshalToSizedBuffer(dAtA[:size]) } -func (m *LastCommitInfo) MarshalToSizedBuffer(dAtA []byte) (int, error) { +func (m *Request_EndBlock) MarshalToSizedBuffer(dAtA []byte) (int, error) { i := len(dAtA) - _ = i - var l int - _ = l - if len(m.StateSignature) > 0 { - i -= len(m.StateSignature) - copy(dAtA[i:], m.StateSignature) - i = encodeVarintTypes(dAtA, i, uint64(len(m.StateSignature))) - i-- - dAtA[i] = 0x2a - } - if len(m.BlockSignature) > 0 { - i -= len(m.BlockSignature) - copy(dAtA[i:], m.BlockSignature) - i = encodeVarintTypes(dAtA, i, uint64(len(m.BlockSignature))) - i-- - dAtA[i] = 0x22 - } - if len(m.QuorumHash) > 0 { - i -= len(m.QuorumHash) - copy(dAtA[i:], m.QuorumHash) - i = encodeVarintTypes(dAtA, i, uint64(len(m.QuorumHash))) - i-- - dAtA[i] = 0x1a - } - if m.Round != 0 { - i = encodeVarintTypes(dAtA, i, uint64(m.Round)) + if m.EndBlock != nil { + { + size, err := m.EndBlock.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintTypes(dAtA, i, uint64(size)) + } i-- - dAtA[i] = 0x8 + dAtA[i] = 0x4a } return len(dAtA) - i, nil } - -func (m *Event) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err - } - return dAtA[:n], nil -} - -func (m *Event) MarshalTo(dAtA []byte) (int, error) { +func (m *Request_Commit) MarshalTo(dAtA []byte) (int, error) { size := m.Size() return m.MarshalToSizedBuffer(dAtA[:size]) } -func (m *Event) MarshalToSizedBuffer(dAtA []byte) (int, error) { +func (m *Request_Commit) MarshalToSizedBuffer(dAtA []byte) (int, error) { i := len(dAtA) - _ = i - var l int - _ = l - if len(m.Attributes) > 0 { - for iNdEx := len(m.Attributes) - 1; iNdEx >= 0; iNdEx-- { - { - size, err := m.Attributes[iNdEx].MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintTypes(dAtA, i, uint64(size)) + if m.Commit != nil { + { + size, err := m.Commit.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err } - i-- - dAtA[i] = 0x12 + i -= size + i = encodeVarintTypes(dAtA, i, uint64(size)) } - } - if len(m.Type) > 0 { - i -= len(m.Type) - copy(dAtA[i:], m.Type) - i = encodeVarintTypes(dAtA, i, uint64(len(m.Type))) i-- - dAtA[i] = 0xa + dAtA[i] = 0x52 } return len(dAtA) - i, nil } - -func (m *EventAttribute) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err - } - return dAtA[:n], nil -} - -func (m *EventAttribute) MarshalTo(dAtA []byte) (int, error) { +func (m *Request_ListSnapshots) MarshalTo(dAtA []byte) (int, error) { size := m.Size() return m.MarshalToSizedBuffer(dAtA[:size]) } -func (m *EventAttribute) MarshalToSizedBuffer(dAtA []byte) (int, error) { +func (m *Request_ListSnapshots) MarshalToSizedBuffer(dAtA []byte) (int, error) { i := len(dAtA) - _ = i - var l int - _ = l - if m.Index { - i-- - if m.Index { - dAtA[i] = 1 - } else { - dAtA[i] = 0 + if m.ListSnapshots != nil { + { + size, err := m.ListSnapshots.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintTypes(dAtA, i, uint64(size)) } i-- - dAtA[i] = 0x18 + dAtA[i] = 0x5a } - if len(m.Value) > 0 { - i -= len(m.Value) - copy(dAtA[i:], m.Value) - i = encodeVarintTypes(dAtA, i, uint64(len(m.Value))) + return len(dAtA) - i, nil +} +func (m *Request_OfferSnapshot) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *Request_OfferSnapshot) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + if m.OfferSnapshot != nil { + { + size, err := m.OfferSnapshot.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintTypes(dAtA, i, uint64(size)) + } i-- - dAtA[i] = 0x12 + dAtA[i] = 0x62 } - if len(m.Key) > 0 { - i -= len(m.Key) - copy(dAtA[i:], m.Key) - i = encodeVarintTypes(dAtA, i, uint64(len(m.Key))) + return len(dAtA) - i, nil +} +func (m *Request_LoadSnapshotChunk) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *Request_LoadSnapshotChunk) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + if m.LoadSnapshotChunk != nil { + { + size, err := m.LoadSnapshotChunk.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintTypes(dAtA, i, uint64(size)) + } i-- - dAtA[i] = 0xa + dAtA[i] = 0x6a } return len(dAtA) - i, nil } +func (m *Request_ApplySnapshotChunk) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} -func (m *TxResult) Marshal() (dAtA []byte, err error) { +func (m *Request_ApplySnapshotChunk) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + if m.ApplySnapshotChunk != nil { + { + size, err := m.ApplySnapshotChunk.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintTypes(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x72 + } + return len(dAtA) - i, nil +} +func (m *Request_PrepareProposal) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *Request_PrepareProposal) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + if m.PrepareProposal != nil { + { + size, err := m.PrepareProposal.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintTypes(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x7a + } + return len(dAtA) - i, nil +} +func (m *Request_ProcessProposal) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *Request_ProcessProposal) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + if m.ProcessProposal != nil { + { + size, err := m.ProcessProposal.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintTypes(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x1 + i-- + dAtA[i] = 0x82 + } + return len(dAtA) - i, nil +} +func (m *Request_ExtendVote) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *Request_ExtendVote) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + if m.ExtendVote != nil { + { + size, err := m.ExtendVote.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintTypes(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x1 + i-- + dAtA[i] = 0x8a + } + return len(dAtA) - i, nil +} +func (m *Request_VerifyVoteExtension) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *Request_VerifyVoteExtension) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + if m.VerifyVoteExtension != nil { + { + size, err := m.VerifyVoteExtension.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintTypes(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x1 + i-- + dAtA[i] = 0x92 + } + return len(dAtA) - i, nil +} +func (m *Request_FinalizeBlock) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *Request_FinalizeBlock) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + if m.FinalizeBlock != nil { + { + size, err := m.FinalizeBlock.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintTypes(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x1 + i-- + dAtA[i] = 0x9a + } + return len(dAtA) - i, nil +} +func (m *RequestEcho) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) n, err := m.MarshalToSizedBuffer(dAtA[:size]) @@ -6075,47 +5770,27 @@ func (m *TxResult) Marshal() (dAtA []byte, err error) { return dAtA[:n], nil } -func (m *TxResult) MarshalTo(dAtA []byte) (int, error) { +func (m *RequestEcho) MarshalTo(dAtA []byte) (int, error) { size := m.Size() return m.MarshalToSizedBuffer(dAtA[:size]) } -func (m *TxResult) MarshalToSizedBuffer(dAtA []byte) (int, error) { +func (m *RequestEcho) MarshalToSizedBuffer(dAtA []byte) (int, error) { i := len(dAtA) _ = i var l int _ = l - { - size, err := m.Result.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintTypes(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x22 - if len(m.Tx) > 0 { - i -= len(m.Tx) - copy(dAtA[i:], m.Tx) - i = encodeVarintTypes(dAtA, i, uint64(len(m.Tx))) - i-- - dAtA[i] = 0x1a - } - if m.Index != 0 { - i = encodeVarintTypes(dAtA, i, uint64(m.Index)) - i-- - dAtA[i] = 0x10 - } - if m.Height != 0 { - i = encodeVarintTypes(dAtA, i, uint64(m.Height)) + if len(m.Message) > 0 { + i -= len(m.Message) + copy(dAtA[i:], m.Message) + i = encodeVarintTypes(dAtA, i, uint64(len(m.Message))) i-- - dAtA[i] = 0x8 + dAtA[i] = 0xa } return len(dAtA) - i, nil } -func (m *Validator) Marshal() (dAtA []byte, err error) { +func (m *RequestFlush) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) n, err := m.MarshalToSizedBuffer(dAtA[:size]) @@ -6125,32 +5800,20 @@ func (m *Validator) Marshal() (dAtA []byte, err error) { return dAtA[:n], nil } -func (m *Validator) MarshalTo(dAtA []byte) (int, error) { +func (m *RequestFlush) MarshalTo(dAtA []byte) (int, error) { size := m.Size() return m.MarshalToSizedBuffer(dAtA[:size]) } -func (m *Validator) MarshalToSizedBuffer(dAtA []byte) (int, error) { +func (m *RequestFlush) MarshalToSizedBuffer(dAtA []byte) (int, error) { i := len(dAtA) _ = i var l int _ = l - if len(m.ProTxHash) > 0 { - i -= len(m.ProTxHash) - copy(dAtA[i:], m.ProTxHash) - i = encodeVarintTypes(dAtA, i, uint64(len(m.ProTxHash))) - i-- - dAtA[i] = 0x22 - } - if m.Power != 0 { - i = encodeVarintTypes(dAtA, i, uint64(m.Power)) - i-- - dAtA[i] = 0x18 - } return len(dAtA) - i, nil } -func (m *ValidatorUpdate) Marshal() (dAtA []byte, err error) { +func (m *RequestInfo) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) n, err := m.MarshalToSizedBuffer(dAtA[:size]) @@ -6160,51 +5823,44 @@ func (m *ValidatorUpdate) Marshal() (dAtA []byte, err error) { return dAtA[:n], nil } -func (m *ValidatorUpdate) MarshalTo(dAtA []byte) (int, error) { +func (m *RequestInfo) MarshalTo(dAtA []byte) (int, error) { size := m.Size() return m.MarshalToSizedBuffer(dAtA[:size]) } -func (m *ValidatorUpdate) MarshalToSizedBuffer(dAtA []byte) (int, error) { +func (m *RequestInfo) MarshalToSizedBuffer(dAtA []byte) (int, error) { i := len(dAtA) _ = i var l int _ = l - if len(m.NodeAddress) > 0 { - i -= len(m.NodeAddress) - copy(dAtA[i:], m.NodeAddress) - i = encodeVarintTypes(dAtA, i, uint64(len(m.NodeAddress))) + if len(m.AbciVersion) > 0 { + i -= len(m.AbciVersion) + copy(dAtA[i:], m.AbciVersion) + i = encodeVarintTypes(dAtA, i, uint64(len(m.AbciVersion))) i-- dAtA[i] = 0x22 } - if len(m.ProTxHash) > 0 { - i -= len(m.ProTxHash) - copy(dAtA[i:], m.ProTxHash) - i = encodeVarintTypes(dAtA, i, uint64(len(m.ProTxHash))) + if m.P2PVersion != 0 { + i = encodeVarintTypes(dAtA, i, uint64(m.P2PVersion)) i-- - dAtA[i] = 0x1a + dAtA[i] = 0x18 } - if m.Power != 0 { - i = encodeVarintTypes(dAtA, i, uint64(m.Power)) + if m.BlockVersion != 0 { + i = encodeVarintTypes(dAtA, i, uint64(m.BlockVersion)) i-- dAtA[i] = 0x10 } - if m.PubKey != nil { - { - size, err := m.PubKey.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintTypes(dAtA, i, uint64(size)) - } + if len(m.Version) > 0 { + i -= len(m.Version) + copy(dAtA[i:], m.Version) + i = encodeVarintTypes(dAtA, i, uint64(len(m.Version))) i-- dAtA[i] = 0xa } return len(dAtA) - i, nil } -func (m *ValidatorSetUpdate) Marshal() (dAtA []byte, err error) { +func (m *RequestInitChain) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) n, err := m.MarshalToSizedBuffer(dAtA[:size]) @@ -6214,51 +5870,76 @@ func (m *ValidatorSetUpdate) Marshal() (dAtA []byte, err error) { return dAtA[:n], nil } -func (m *ValidatorSetUpdate) MarshalTo(dAtA []byte) (int, error) { +func (m *RequestInitChain) MarshalTo(dAtA []byte) (int, error) { size := m.Size() return m.MarshalToSizedBuffer(dAtA[:size]) } -func (m *ValidatorSetUpdate) MarshalToSizedBuffer(dAtA []byte) (int, error) { +func (m *RequestInitChain) MarshalToSizedBuffer(dAtA []byte) (int, error) { i := len(dAtA) _ = i var l int _ = l - if len(m.QuorumHash) > 0 { - i -= len(m.QuorumHash) - copy(dAtA[i:], m.QuorumHash) - i = encodeVarintTypes(dAtA, i, uint64(len(m.QuorumHash))) + if m.InitialCoreHeight != 0 { + i = encodeVarintTypes(dAtA, i, uint64(m.InitialCoreHeight)) i-- - dAtA[i] = 0x1a + dAtA[i] = 0x38 } - { - size, err := m.ThresholdPublicKey.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err + if m.InitialHeight != 0 { + i = encodeVarintTypes(dAtA, i, uint64(m.InitialHeight)) + i-- + dAtA[i] = 0x30 + } + if len(m.AppStateBytes) > 0 { + i -= len(m.AppStateBytes) + copy(dAtA[i:], m.AppStateBytes) + i = encodeVarintTypes(dAtA, i, uint64(len(m.AppStateBytes))) + i-- + dAtA[i] = 0x2a + } + if m.ValidatorSet != nil { + { + size, err := m.ValidatorSet.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintTypes(dAtA, i, uint64(size)) } - i -= size - i = encodeVarintTypes(dAtA, i, uint64(size)) + i-- + dAtA[i] = 0x22 } - i-- - dAtA[i] = 0x12 - if len(m.ValidatorUpdates) > 0 { - for iNdEx := len(m.ValidatorUpdates) - 1; iNdEx >= 0; iNdEx-- { - { - size, err := m.ValidatorUpdates[iNdEx].MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintTypes(dAtA, i, uint64(size)) + if m.ConsensusParams != nil { + { + size, err := m.ConsensusParams.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err } - i-- - dAtA[i] = 0xa + i -= size + i = encodeVarintTypes(dAtA, i, uint64(size)) } + i-- + dAtA[i] = 0x1a + } + if len(m.ChainId) > 0 { + i -= len(m.ChainId) + copy(dAtA[i:], m.ChainId) + i = encodeVarintTypes(dAtA, i, uint64(len(m.ChainId))) + i-- + dAtA[i] = 0x12 + } + n22, err22 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.Time, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.Time):]) + if err22 != nil { + return 0, err22 } + i -= n22 + i = encodeVarintTypes(dAtA, i, uint64(n22)) + i-- + dAtA[i] = 0xa return len(dAtA) - i, nil } -func (m *ThresholdPublicKeyUpdate) Marshal() (dAtA []byte, err error) { +func (m *RequestQuery) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) n, err := m.MarshalToSizedBuffer(dAtA[:size]) @@ -6268,30 +5949,49 @@ func (m *ThresholdPublicKeyUpdate) Marshal() (dAtA []byte, err error) { return dAtA[:n], nil } -func (m *ThresholdPublicKeyUpdate) MarshalTo(dAtA []byte) (int, error) { +func (m *RequestQuery) MarshalTo(dAtA []byte) (int, error) { size := m.Size() return m.MarshalToSizedBuffer(dAtA[:size]) } -func (m *ThresholdPublicKeyUpdate) MarshalToSizedBuffer(dAtA []byte) (int, error) { +func (m *RequestQuery) MarshalToSizedBuffer(dAtA []byte) (int, error) { i := len(dAtA) _ = i var l int _ = l - { - size, err := m.ThresholdPublicKey.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err + if m.Prove { + i-- + if m.Prove { + dAtA[i] = 1 + } else { + dAtA[i] = 0 } - i -= size - i = encodeVarintTypes(dAtA, i, uint64(size)) + i-- + dAtA[i] = 0x20 + } + if m.Height != 0 { + i = encodeVarintTypes(dAtA, i, uint64(m.Height)) + i-- + dAtA[i] = 0x18 + } + if len(m.Path) > 0 { + i -= len(m.Path) + copy(dAtA[i:], m.Path) + i = encodeVarintTypes(dAtA, i, uint64(len(m.Path))) + i-- + dAtA[i] = 0x12 + } + if len(m.Data) > 0 { + i -= len(m.Data) + copy(dAtA[i:], m.Data) + i = encodeVarintTypes(dAtA, i, uint64(len(m.Data))) + i-- + dAtA[i] = 0xa } - i-- - dAtA[i] = 0xa return len(dAtA) - i, nil } -func (m *QuorumHashUpdate) Marshal() (dAtA []byte, err error) { +func (m *RequestBeginBlock) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) n, err := m.MarshalToSizedBuffer(dAtA[:size]) @@ -6301,27 +6001,61 @@ func (m *QuorumHashUpdate) Marshal() (dAtA []byte, err error) { return dAtA[:n], nil } -func (m *QuorumHashUpdate) MarshalTo(dAtA []byte) (int, error) { +func (m *RequestBeginBlock) MarshalTo(dAtA []byte) (int, error) { size := m.Size() return m.MarshalToSizedBuffer(dAtA[:size]) } -func (m *QuorumHashUpdate) MarshalToSizedBuffer(dAtA []byte) (int, error) { +func (m *RequestBeginBlock) MarshalToSizedBuffer(dAtA []byte) (int, error) { i := len(dAtA) _ = i var l int _ = l - if len(m.QuorumHash) > 0 { - i -= len(m.QuorumHash) - copy(dAtA[i:], m.QuorumHash) - i = encodeVarintTypes(dAtA, i, uint64(len(m.QuorumHash))) + if len(m.ByzantineValidators) > 0 { + for iNdEx := len(m.ByzantineValidators) - 1; iNdEx >= 0; iNdEx-- { + { + size, err := m.ByzantineValidators[iNdEx].MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintTypes(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x22 + } + } + { + size, err := m.LastCommitInfo.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintTypes(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x1a + { + size, err := m.Header.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintTypes(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x12 + if len(m.Hash) > 0 { + i -= len(m.Hash) + copy(dAtA[i:], m.Hash) + i = encodeVarintTypes(dAtA, i, uint64(len(m.Hash))) i-- dAtA[i] = 0xa } return len(dAtA) - i, nil } -func (m *VoteInfo) Marshal() (dAtA []byte, err error) { +func (m *RequestCheckTx) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) n, err := m.MarshalToSizedBuffer(dAtA[:size]) @@ -6331,40 +6065,32 @@ func (m *VoteInfo) Marshal() (dAtA []byte, err error) { return dAtA[:n], nil } -func (m *VoteInfo) MarshalTo(dAtA []byte) (int, error) { +func (m *RequestCheckTx) MarshalTo(dAtA []byte) (int, error) { size := m.Size() return m.MarshalToSizedBuffer(dAtA[:size]) } -func (m *VoteInfo) MarshalToSizedBuffer(dAtA []byte) (int, error) { +func (m *RequestCheckTx) MarshalToSizedBuffer(dAtA []byte) (int, error) { i := len(dAtA) _ = i var l int _ = l - if m.SignedLastBlock { - i-- - if m.SignedLastBlock { - dAtA[i] = 1 - } else { - dAtA[i] = 0 - } + if m.Type != 0 { + i = encodeVarintTypes(dAtA, i, uint64(m.Type)) i-- dAtA[i] = 0x10 } - { - size, err := m.Validator.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintTypes(dAtA, i, uint64(size)) + if len(m.Tx) > 0 { + i -= len(m.Tx) + copy(dAtA[i:], m.Tx) + i = encodeVarintTypes(dAtA, i, uint64(len(m.Tx))) + i-- + dAtA[i] = 0xa } - i-- - dAtA[i] = 0xa return len(dAtA) - i, nil } -func (m *Evidence) Marshal() (dAtA []byte, err error) { +func (m *RequestDeliverTx) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) n, err := m.MarshalToSizedBuffer(dAtA[:size]) @@ -6374,53 +6100,27 @@ func (m *Evidence) Marshal() (dAtA []byte, err error) { return dAtA[:n], nil } -func (m *Evidence) MarshalTo(dAtA []byte) (int, error) { +func (m *RequestDeliverTx) MarshalTo(dAtA []byte) (int, error) { size := m.Size() return m.MarshalToSizedBuffer(dAtA[:size]) } -func (m *Evidence) MarshalToSizedBuffer(dAtA []byte) (int, error) { +func (m *RequestDeliverTx) MarshalToSizedBuffer(dAtA []byte) (int, error) { i := len(dAtA) _ = i var l int _ = l - if m.TotalVotingPower != 0 { - i = encodeVarintTypes(dAtA, i, uint64(m.TotalVotingPower)) - i-- - dAtA[i] = 0x28 - } - n50, err50 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.Time, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.Time):]) - if err50 != nil { - return 0, err50 - } - i -= n50 - i = encodeVarintTypes(dAtA, i, uint64(n50)) - i-- - dAtA[i] = 0x22 - if m.Height != 0 { - i = encodeVarintTypes(dAtA, i, uint64(m.Height)) - i-- - dAtA[i] = 0x18 - } - { - size, err := m.Validator.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintTypes(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x12 - if m.Type != 0 { - i = encodeVarintTypes(dAtA, i, uint64(m.Type)) + if len(m.Tx) > 0 { + i -= len(m.Tx) + copy(dAtA[i:], m.Tx) + i = encodeVarintTypes(dAtA, i, uint64(len(m.Tx))) i-- - dAtA[i] = 0x8 + dAtA[i] = 0xa } return len(dAtA) - i, nil } -func (m *Snapshot) Marshal() (dAtA []byte, err error) { +func (m *RequestEndBlock) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) n, err := m.MarshalToSizedBuffer(dAtA[:size]) @@ -6430,47 +6130,16 @@ func (m *Snapshot) Marshal() (dAtA []byte, err error) { return dAtA[:n], nil } -func (m *Snapshot) MarshalTo(dAtA []byte) (int, error) { +func (m *RequestEndBlock) MarshalTo(dAtA []byte) (int, error) { size := m.Size() return m.MarshalToSizedBuffer(dAtA[:size]) } -func (m *Snapshot) MarshalToSizedBuffer(dAtA []byte) (int, error) { +func (m *RequestEndBlock) MarshalToSizedBuffer(dAtA []byte) (int, error) { i := len(dAtA) _ = i var l int _ = l - if m.CoreChainLockedHeight != 0 { - i = encodeVarintTypes(dAtA, i, uint64(m.CoreChainLockedHeight)) - i-- - dAtA[i] = 0x6 - i-- - dAtA[i] = 0xa0 - } - if len(m.Metadata) > 0 { - i -= len(m.Metadata) - copy(dAtA[i:], m.Metadata) - i = encodeVarintTypes(dAtA, i, uint64(len(m.Metadata))) - i-- - dAtA[i] = 0x2a - } - if len(m.Hash) > 0 { - i -= len(m.Hash) - copy(dAtA[i:], m.Hash) - i = encodeVarintTypes(dAtA, i, uint64(len(m.Hash))) - i-- - dAtA[i] = 0x22 - } - if m.Chunks != 0 { - i = encodeVarintTypes(dAtA, i, uint64(m.Chunks)) - i-- - dAtA[i] = 0x18 - } - if m.Format != 0 { - i = encodeVarintTypes(dAtA, i, uint64(m.Format)) - i-- - dAtA[i] = 0x10 - } if m.Height != 0 { i = encodeVarintTypes(dAtA, i, uint64(m.Height)) i-- @@ -6479,1212 +6148,7156 @@ func (m *Snapshot) MarshalToSizedBuffer(dAtA []byte) (int, error) { return len(dAtA) - i, nil } -func encodeVarintTypes(dAtA []byte, offset int, v uint64) int { - offset -= sovTypes(v) - base := offset - for v >= 1<<7 { - dAtA[offset] = uint8(v&0x7f | 0x80) - v >>= 7 - offset++ +func (m *RequestCommit) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err } - dAtA[offset] = uint8(v) - return base + return dAtA[:n], nil } -func (m *Request) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - if m.Value != nil { - n += m.Value.Size() - } - return n + +func (m *RequestCommit) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) } -func (m *Request_Echo) Size() (n int) { - if m == nil { - return 0 - } +func (m *RequestCommit) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i var l int _ = l - if m.Echo != nil { - l = m.Echo.Size() - n += 1 + l + sovTypes(uint64(l)) - } - return n + return len(dAtA) - i, nil } -func (m *Request_Flush) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - if m.Flush != nil { - l = m.Flush.Size() - n += 1 + l + sovTypes(uint64(l)) + +func (m *RequestListSnapshots) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err } - return n + return dAtA[:n], nil } -func (m *Request_Info) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - if m.Info != nil { - l = m.Info.Size() - n += 1 + l + sovTypes(uint64(l)) - } - return n + +func (m *RequestListSnapshots) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) } -func (m *Request_InitChain) Size() (n int) { - if m == nil { - return 0 - } + +func (m *RequestListSnapshots) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i var l int _ = l - if m.InitChain != nil { - l = m.InitChain.Size() - n += 1 + l + sovTypes(uint64(l)) - } - return n + return len(dAtA) - i, nil } -func (m *Request_Query) Size() (n int) { - if m == nil { - return 0 + +func (m *RequestOfferSnapshot) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err } + return dAtA[:n], nil +} + +func (m *RequestOfferSnapshot) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *RequestOfferSnapshot) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i var l int _ = l - if m.Query != nil { - l = m.Query.Size() - n += 1 + l + sovTypes(uint64(l)) + if len(m.AppHash) > 0 { + i -= len(m.AppHash) + copy(dAtA[i:], m.AppHash) + i = encodeVarintTypes(dAtA, i, uint64(len(m.AppHash))) + i-- + dAtA[i] = 0x12 } - return n + if m.Snapshot != nil { + { + size, err := m.Snapshot.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintTypes(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0xa + } + return len(dAtA) - i, nil } -func (m *Request_BeginBlock) Size() (n int) { - if m == nil { - return 0 + +func (m *RequestLoadSnapshotChunk) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err } + return dAtA[:n], nil +} + +func (m *RequestLoadSnapshotChunk) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *RequestLoadSnapshotChunk) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i var l int _ = l - if m.BeginBlock != nil { - l = m.BeginBlock.Size() - n += 1 + l + sovTypes(uint64(l)) + if m.Chunk != 0 { + i = encodeVarintTypes(dAtA, i, uint64(m.Chunk)) + i-- + dAtA[i] = 0x18 } - return n -} -func (m *Request_CheckTx) Size() (n int) { - if m == nil { - return 0 + if m.Format != 0 { + i = encodeVarintTypes(dAtA, i, uint64(m.Format)) + i-- + dAtA[i] = 0x10 } - var l int - _ = l - if m.CheckTx != nil { - l = m.CheckTx.Size() - n += 1 + l + sovTypes(uint64(l)) + if m.Height != 0 { + i = encodeVarintTypes(dAtA, i, uint64(m.Height)) + i-- + dAtA[i] = 0x8 } - return n + return len(dAtA) - i, nil } -func (m *Request_DeliverTx) Size() (n int) { - if m == nil { - return 0 + +func (m *RequestApplySnapshotChunk) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err } + return dAtA[:n], nil +} + +func (m *RequestApplySnapshotChunk) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *RequestApplySnapshotChunk) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i var l int _ = l - if m.DeliverTx != nil { - l = m.DeliverTx.Size() - n += 1 + l + sovTypes(uint64(l)) + if len(m.Sender) > 0 { + i -= len(m.Sender) + copy(dAtA[i:], m.Sender) + i = encodeVarintTypes(dAtA, i, uint64(len(m.Sender))) + i-- + dAtA[i] = 0x1a } - return n -} -func (m *Request_EndBlock) Size() (n int) { - if m == nil { - return 0 + if len(m.Chunk) > 0 { + i -= len(m.Chunk) + copy(dAtA[i:], m.Chunk) + i = encodeVarintTypes(dAtA, i, uint64(len(m.Chunk))) + i-- + dAtA[i] = 0x12 } - var l int - _ = l - if m.EndBlock != nil { - l = m.EndBlock.Size() - n += 1 + l + sovTypes(uint64(l)) + if m.Index != 0 { + i = encodeVarintTypes(dAtA, i, uint64(m.Index)) + i-- + dAtA[i] = 0x8 } - return n + return len(dAtA) - i, nil } -func (m *Request_Commit) Size() (n int) { - if m == nil { - return 0 + +func (m *RequestPrepareProposal) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err } + return dAtA[:n], nil +} + +func (m *RequestPrepareProposal) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *RequestPrepareProposal) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i var l int _ = l - if m.Commit != nil { - l = m.Commit.Size() - n += 1 + l + sovTypes(uint64(l)) + if len(m.ProposerProTxHash) > 0 { + i -= len(m.ProposerProTxHash) + copy(dAtA[i:], m.ProposerProTxHash) + i = encodeVarintTypes(dAtA, i, uint64(len(m.ProposerProTxHash))) + i-- + dAtA[i] = 0x42 } - return n -} -func (m *Request_ListSnapshots) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - if m.ListSnapshots != nil { - l = m.ListSnapshots.Size() - n += 1 + l + sovTypes(uint64(l)) + if len(m.NextValidatorsHash) > 0 { + i -= len(m.NextValidatorsHash) + copy(dAtA[i:], m.NextValidatorsHash) + i = encodeVarintTypes(dAtA, i, uint64(len(m.NextValidatorsHash))) + i-- + dAtA[i] = 0x3a } - return n -} -func (m *Request_OfferSnapshot) Size() (n int) { - if m == nil { - return 0 + n26, err26 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.Time, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.Time):]) + if err26 != nil { + return 0, err26 } - var l int - _ = l - if m.OfferSnapshot != nil { - l = m.OfferSnapshot.Size() - n += 1 + l + sovTypes(uint64(l)) + i -= n26 + i = encodeVarintTypes(dAtA, i, uint64(n26)) + i-- + dAtA[i] = 0x32 + if m.Height != 0 { + i = encodeVarintTypes(dAtA, i, uint64(m.Height)) + i-- + dAtA[i] = 0x28 } - return n -} -func (m *Request_LoadSnapshotChunk) Size() (n int) { - if m == nil { - return 0 + if len(m.ByzantineValidators) > 0 { + for iNdEx := len(m.ByzantineValidators) - 1; iNdEx >= 0; iNdEx-- { + { + size, err := m.ByzantineValidators[iNdEx].MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintTypes(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x22 + } } - var l int - _ = l - if m.LoadSnapshotChunk != nil { - l = m.LoadSnapshotChunk.Size() - n += 1 + l + sovTypes(uint64(l)) + { + size, err := m.LocalLastCommit.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintTypes(dAtA, i, uint64(size)) } - return n -} -func (m *Request_ApplySnapshotChunk) Size() (n int) { - if m == nil { - return 0 + i-- + dAtA[i] = 0x1a + if len(m.Txs) > 0 { + for iNdEx := len(m.Txs) - 1; iNdEx >= 0; iNdEx-- { + i -= len(m.Txs[iNdEx]) + copy(dAtA[i:], m.Txs[iNdEx]) + i = encodeVarintTypes(dAtA, i, uint64(len(m.Txs[iNdEx]))) + i-- + dAtA[i] = 0x12 + } } - var l int - _ = l - if m.ApplySnapshotChunk != nil { - l = m.ApplySnapshotChunk.Size() - n += 1 + l + sovTypes(uint64(l)) + if m.MaxTxBytes != 0 { + i = encodeVarintTypes(dAtA, i, uint64(m.MaxTxBytes)) + i-- + dAtA[i] = 0x8 } - return n + return len(dAtA) - i, nil } -func (m *RequestEcho) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - l = len(m.Message) - if l > 0 { - n += 1 + l + sovTypes(uint64(l)) + +func (m *RequestProcessProposal) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err } - return n + return dAtA[:n], nil } -func (m *RequestFlush) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - return n +func (m *RequestProcessProposal) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) } -func (m *RequestInfo) Size() (n int) { - if m == nil { - return 0 - } +func (m *RequestProcessProposal) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i var l int _ = l - l = len(m.Version) - if l > 0 { - n += 1 + l + sovTypes(uint64(l)) - } - if m.BlockVersion != 0 { - n += 1 + sovTypes(uint64(m.BlockVersion)) - } - if m.P2PVersion != 0 { - n += 1 + sovTypes(uint64(m.P2PVersion)) - } - l = len(m.AbciVersion) - if l > 0 { - n += 1 + l + sovTypes(uint64(l)) + if len(m.ProposerProTxHash) > 0 { + i -= len(m.ProposerProTxHash) + copy(dAtA[i:], m.ProposerProTxHash) + i = encodeVarintTypes(dAtA, i, uint64(len(m.ProposerProTxHash))) + i-- + dAtA[i] = 0x42 } - return n -} - -func (m *RequestInitChain) Size() (n int) { - if m == nil { - return 0 + if len(m.NextValidatorsHash) > 0 { + i -= len(m.NextValidatorsHash) + copy(dAtA[i:], m.NextValidatorsHash) + i = encodeVarintTypes(dAtA, i, uint64(len(m.NextValidatorsHash))) + i-- + dAtA[i] = 0x3a } - var l int - _ = l - l = github_com_gogo_protobuf_types.SizeOfStdTime(m.Time) - n += 1 + l + sovTypes(uint64(l)) - l = len(m.ChainId) - if l > 0 { - n += 1 + l + sovTypes(uint64(l)) + n28, err28 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.Time, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.Time):]) + if err28 != nil { + return 0, err28 } - if m.ConsensusParams != nil { - l = m.ConsensusParams.Size() - n += 1 + l + sovTypes(uint64(l)) + i -= n28 + i = encodeVarintTypes(dAtA, i, uint64(n28)) + i-- + dAtA[i] = 0x32 + if m.Height != 0 { + i = encodeVarintTypes(dAtA, i, uint64(m.Height)) + i-- + dAtA[i] = 0x28 } - if m.ValidatorSet != nil { - l = m.ValidatorSet.Size() - n += 1 + l + sovTypes(uint64(l)) + if len(m.Hash) > 0 { + i -= len(m.Hash) + copy(dAtA[i:], m.Hash) + i = encodeVarintTypes(dAtA, i, uint64(len(m.Hash))) + i-- + dAtA[i] = 0x22 } - l = len(m.AppStateBytes) - if l > 0 { - n += 1 + l + sovTypes(uint64(l)) + if len(m.ByzantineValidators) > 0 { + for iNdEx := len(m.ByzantineValidators) - 1; iNdEx >= 0; iNdEx-- { + { + size, err := m.ByzantineValidators[iNdEx].MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintTypes(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x1a + } } - if m.InitialHeight != 0 { - n += 1 + sovTypes(uint64(m.InitialHeight)) + { + size, err := m.ProposedLastCommit.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintTypes(dAtA, i, uint64(size)) } - if m.InitialCoreHeight != 0 { - n += 1 + sovTypes(uint64(m.InitialCoreHeight)) + i-- + dAtA[i] = 0x12 + if len(m.Txs) > 0 { + for iNdEx := len(m.Txs) - 1; iNdEx >= 0; iNdEx-- { + i -= len(m.Txs[iNdEx]) + copy(dAtA[i:], m.Txs[iNdEx]) + i = encodeVarintTypes(dAtA, i, uint64(len(m.Txs[iNdEx]))) + i-- + dAtA[i] = 0xa + } } - return n + return len(dAtA) - i, nil } -func (m *RequestQuery) Size() (n int) { - if m == nil { - return 0 +func (m *RequestExtendVote) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err } + return dAtA[:n], nil +} + +func (m *RequestExtendVote) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *RequestExtendVote) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i var l int _ = l - l = len(m.Data) - if l > 0 { - n += 1 + l + sovTypes(uint64(l)) - } - l = len(m.Path) - if l > 0 { - n += 1 + l + sovTypes(uint64(l)) - } if m.Height != 0 { - n += 1 + sovTypes(uint64(m.Height)) + i = encodeVarintTypes(dAtA, i, uint64(m.Height)) + i-- + dAtA[i] = 0x10 } - if m.Prove { - n += 2 + if len(m.Hash) > 0 { + i -= len(m.Hash) + copy(dAtA[i:], m.Hash) + i = encodeVarintTypes(dAtA, i, uint64(len(m.Hash))) + i-- + dAtA[i] = 0xa } - return n + return len(dAtA) - i, nil } -func (m *RequestBeginBlock) Size() (n int) { - if m == nil { - return 0 +func (m *RequestVerifyVoteExtension) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err } + return dAtA[:n], nil +} + +func (m *RequestVerifyVoteExtension) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *RequestVerifyVoteExtension) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i var l int _ = l - l = len(m.Hash) - if l > 0 { - n += 1 + l + sovTypes(uint64(l)) + if len(m.VoteExtension) > 0 { + i -= len(m.VoteExtension) + copy(dAtA[i:], m.VoteExtension) + i = encodeVarintTypes(dAtA, i, uint64(len(m.VoteExtension))) + i-- + dAtA[i] = 0x22 } - l = m.Header.Size() - n += 1 + l + sovTypes(uint64(l)) - l = m.LastCommitInfo.Size() - n += 1 + l + sovTypes(uint64(l)) - if len(m.ByzantineValidators) > 0 { - for _, e := range m.ByzantineValidators { - l = e.Size() - n += 1 + l + sovTypes(uint64(l)) - } - } - return n -} - -func (m *RequestCheckTx) Size() (n int) { - if m == nil { - return 0 + if m.Height != 0 { + i = encodeVarintTypes(dAtA, i, uint64(m.Height)) + i-- + dAtA[i] = 0x18 } - var l int - _ = l - l = len(m.Tx) - if l > 0 { - n += 1 + l + sovTypes(uint64(l)) + if len(m.ValidatorProTxHash) > 0 { + i -= len(m.ValidatorProTxHash) + copy(dAtA[i:], m.ValidatorProTxHash) + i = encodeVarintTypes(dAtA, i, uint64(len(m.ValidatorProTxHash))) + i-- + dAtA[i] = 0x12 } - if m.Type != 0 { - n += 1 + sovTypes(uint64(m.Type)) + if len(m.Hash) > 0 { + i -= len(m.Hash) + copy(dAtA[i:], m.Hash) + i = encodeVarintTypes(dAtA, i, uint64(len(m.Hash))) + i-- + dAtA[i] = 0xa } - return n + return len(dAtA) - i, nil } -func (m *RequestDeliverTx) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - l = len(m.Tx) - if l > 0 { - n += 1 + l + sovTypes(uint64(l)) +func (m *RequestFinalizeBlock) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err } - return n + return dAtA[:n], nil } -func (m *RequestEndBlock) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - if m.Height != 0 { - n += 1 + sovTypes(uint64(m.Height)) - } - return n +func (m *RequestFinalizeBlock) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) } -func (m *RequestCommit) Size() (n int) { - if m == nil { - return 0 - } +func (m *RequestFinalizeBlock) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i var l int _ = l - return n -} - -func (m *RequestListSnapshots) Size() (n int) { - if m == nil { - return 0 + if len(m.ProposerProTxHash) > 0 { + i -= len(m.ProposerProTxHash) + copy(dAtA[i:], m.ProposerProTxHash) + i = encodeVarintTypes(dAtA, i, uint64(len(m.ProposerProTxHash))) + i-- + dAtA[i] = 0x42 } - var l int - _ = l - return n -} - -func (m *RequestOfferSnapshot) Size() (n int) { - if m == nil { - return 0 + if len(m.NextValidatorsHash) > 0 { + i -= len(m.NextValidatorsHash) + copy(dAtA[i:], m.NextValidatorsHash) + i = encodeVarintTypes(dAtA, i, uint64(len(m.NextValidatorsHash))) + i-- + dAtA[i] = 0x3a } - var l int - _ = l - if m.Snapshot != nil { - l = m.Snapshot.Size() - n += 1 + l + sovTypes(uint64(l)) + n30, err30 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.Time, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.Time):]) + if err30 != nil { + return 0, err30 } - l = len(m.AppHash) - if l > 0 { - n += 1 + l + sovTypes(uint64(l)) + i -= n30 + i = encodeVarintTypes(dAtA, i, uint64(n30)) + i-- + dAtA[i] = 0x32 + if m.Height != 0 { + i = encodeVarintTypes(dAtA, i, uint64(m.Height)) + i-- + dAtA[i] = 0x28 } - return n -} - -func (m *RequestLoadSnapshotChunk) Size() (n int) { - if m == nil { - return 0 + if len(m.Hash) > 0 { + i -= len(m.Hash) + copy(dAtA[i:], m.Hash) + i = encodeVarintTypes(dAtA, i, uint64(len(m.Hash))) + i-- + dAtA[i] = 0x22 } - var l int - _ = l - if m.Height != 0 { - n += 1 + sovTypes(uint64(m.Height)) + if len(m.ByzantineValidators) > 0 { + for iNdEx := len(m.ByzantineValidators) - 1; iNdEx >= 0; iNdEx-- { + { + size, err := m.ByzantineValidators[iNdEx].MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintTypes(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x1a + } } - if m.Format != 0 { - n += 1 + sovTypes(uint64(m.Format)) + { + size, err := m.DecidedLastCommit.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintTypes(dAtA, i, uint64(size)) } - if m.Chunk != 0 { - n += 1 + sovTypes(uint64(m.Chunk)) + i-- + dAtA[i] = 0x12 + if len(m.Txs) > 0 { + for iNdEx := len(m.Txs) - 1; iNdEx >= 0; iNdEx-- { + i -= len(m.Txs[iNdEx]) + copy(dAtA[i:], m.Txs[iNdEx]) + i = encodeVarintTypes(dAtA, i, uint64(len(m.Txs[iNdEx]))) + i-- + dAtA[i] = 0xa + } } - return n + return len(dAtA) - i, nil } -func (m *RequestApplySnapshotChunk) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - if m.Index != 0 { - n += 1 + sovTypes(uint64(m.Index)) - } - l = len(m.Chunk) - if l > 0 { - n += 1 + l + sovTypes(uint64(l)) - } - l = len(m.Sender) - if l > 0 { - n += 1 + l + sovTypes(uint64(l)) +func (m *Response) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err } - return n + return dAtA[:n], nil } -func (m *Response) Size() (n int) { - if m == nil { - return 0 - } +func (m *Response) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *Response) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i var l int _ = l if m.Value != nil { - n += m.Value.Size() + { + size := m.Value.Size() + i -= size + if _, err := m.Value.MarshalTo(dAtA[i:]); err != nil { + return 0, err + } + } } - return n + return len(dAtA) - i, nil } -func (m *Response_Exception) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l +func (m *Response_Exception) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *Response_Exception) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) if m.Exception != nil { - l = m.Exception.Size() - n += 1 + l + sovTypes(uint64(l)) + { + size, err := m.Exception.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintTypes(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0xa } - return n + return len(dAtA) - i, nil } -func (m *Response_Echo) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l +func (m *Response_Echo) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *Response_Echo) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) if m.Echo != nil { - l = m.Echo.Size() - n += 1 + l + sovTypes(uint64(l)) + { + size, err := m.Echo.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintTypes(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x12 } - return n + return len(dAtA) - i, nil } -func (m *Response_Flush) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - if m.Flush != nil { - l = m.Flush.Size() - n += 1 + l + sovTypes(uint64(l)) - } - return n +func (m *Response_Flush) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) } -func (m *Response_Info) Size() (n int) { - if m == nil { - return 0 + +func (m *Response_Flush) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + if m.Flush != nil { + { + size, err := m.Flush.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintTypes(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x1a } - var l int - _ = l + return len(dAtA) - i, nil +} +func (m *Response_Info) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *Response_Info) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) if m.Info != nil { - l = m.Info.Size() - n += 1 + l + sovTypes(uint64(l)) + { + size, err := m.Info.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintTypes(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x22 } - return n + return len(dAtA) - i, nil } -func (m *Response_InitChain) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l +func (m *Response_InitChain) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *Response_InitChain) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) if m.InitChain != nil { - l = m.InitChain.Size() - n += 1 + l + sovTypes(uint64(l)) + { + size, err := m.InitChain.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintTypes(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x2a } - return n + return len(dAtA) - i, nil } -func (m *Response_Query) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l +func (m *Response_Query) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *Response_Query) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) if m.Query != nil { - l = m.Query.Size() - n += 1 + l + sovTypes(uint64(l)) + { + size, err := m.Query.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintTypes(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x32 } - return n + return len(dAtA) - i, nil } -func (m *Response_BeginBlock) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l +func (m *Response_BeginBlock) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *Response_BeginBlock) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) if m.BeginBlock != nil { - l = m.BeginBlock.Size() - n += 1 + l + sovTypes(uint64(l)) + { + size, err := m.BeginBlock.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintTypes(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x3a } - return n + return len(dAtA) - i, nil } -func (m *Response_CheckTx) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l +func (m *Response_CheckTx) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *Response_CheckTx) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) if m.CheckTx != nil { - l = m.CheckTx.Size() - n += 1 + l + sovTypes(uint64(l)) + { + size, err := m.CheckTx.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintTypes(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x42 } - return n + return len(dAtA) - i, nil } -func (m *Response_DeliverTx) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l +func (m *Response_DeliverTx) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *Response_DeliverTx) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) if m.DeliverTx != nil { - l = m.DeliverTx.Size() - n += 1 + l + sovTypes(uint64(l)) + { + size, err := m.DeliverTx.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintTypes(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x4a } - return n + return len(dAtA) - i, nil } -func (m *Response_EndBlock) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l +func (m *Response_EndBlock) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *Response_EndBlock) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) if m.EndBlock != nil { - l = m.EndBlock.Size() - n += 1 + l + sovTypes(uint64(l)) + { + size, err := m.EndBlock.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintTypes(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x52 } - return n + return len(dAtA) - i, nil } -func (m *Response_Commit) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l +func (m *Response_Commit) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *Response_Commit) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) if m.Commit != nil { - l = m.Commit.Size() - n += 1 + l + sovTypes(uint64(l)) + { + size, err := m.Commit.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintTypes(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x5a } - return n + return len(dAtA) - i, nil } -func (m *Response_ListSnapshots) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l +func (m *Response_ListSnapshots) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *Response_ListSnapshots) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) if m.ListSnapshots != nil { - l = m.ListSnapshots.Size() - n += 1 + l + sovTypes(uint64(l)) + { + size, err := m.ListSnapshots.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintTypes(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x62 } - return n + return len(dAtA) - i, nil } -func (m *Response_OfferSnapshot) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l +func (m *Response_OfferSnapshot) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *Response_OfferSnapshot) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) if m.OfferSnapshot != nil { - l = m.OfferSnapshot.Size() - n += 1 + l + sovTypes(uint64(l)) + { + size, err := m.OfferSnapshot.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintTypes(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x6a } - return n + return len(dAtA) - i, nil } -func (m *Response_LoadSnapshotChunk) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l +func (m *Response_LoadSnapshotChunk) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *Response_LoadSnapshotChunk) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) if m.LoadSnapshotChunk != nil { - l = m.LoadSnapshotChunk.Size() - n += 1 + l + sovTypes(uint64(l)) + { + size, err := m.LoadSnapshotChunk.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintTypes(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x72 } - return n + return len(dAtA) - i, nil } -func (m *Response_ApplySnapshotChunk) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l +func (m *Response_ApplySnapshotChunk) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *Response_ApplySnapshotChunk) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) if m.ApplySnapshotChunk != nil { - l = m.ApplySnapshotChunk.Size() - n += 1 + l + sovTypes(uint64(l)) + { + size, err := m.ApplySnapshotChunk.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintTypes(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x7a } - return n + return len(dAtA) - i, nil } -func (m *ResponseException) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - l = len(m.Error) - if l > 0 { - n += 1 + l + sovTypes(uint64(l)) - } - return n +func (m *Response_PrepareProposal) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) } -func (m *ResponseEcho) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - l = len(m.Message) - if l > 0 { - n += 1 + l + sovTypes(uint64(l)) +func (m *Response_PrepareProposal) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + if m.PrepareProposal != nil { + { + size, err := m.PrepareProposal.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintTypes(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x1 + i-- + dAtA[i] = 0x82 } - return n + return len(dAtA) - i, nil +} +func (m *Response_ProcessProposal) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) } -func (m *ResponseFlush) Size() (n int) { - if m == nil { - return 0 +func (m *Response_ProcessProposal) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + if m.ProcessProposal != nil { + { + size, err := m.ProcessProposal.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintTypes(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x1 + i-- + dAtA[i] = 0x8a } - var l int - _ = l - return n + return len(dAtA) - i, nil +} +func (m *Response_ExtendVote) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) } -func (m *ResponseInfo) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - l = len(m.Data) - if l > 0 { - n += 1 + l + sovTypes(uint64(l)) - } - l = len(m.Version) - if l > 0 { - n += 1 + l + sovTypes(uint64(l)) +func (m *Response_ExtendVote) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + if m.ExtendVote != nil { + { + size, err := m.ExtendVote.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintTypes(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x1 + i-- + dAtA[i] = 0x92 } - if m.AppVersion != 0 { - n += 1 + sovTypes(uint64(m.AppVersion)) + return len(dAtA) - i, nil +} +func (m *Response_VerifyVoteExtension) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *Response_VerifyVoteExtension) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + if m.VerifyVoteExtension != nil { + { + size, err := m.VerifyVoteExtension.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintTypes(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x1 + i-- + dAtA[i] = 0x9a } - if m.LastBlockHeight != 0 { - n += 1 + sovTypes(uint64(m.LastBlockHeight)) + return len(dAtA) - i, nil +} +func (m *Response_FinalizeBlock) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *Response_FinalizeBlock) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + if m.FinalizeBlock != nil { + { + size, err := m.FinalizeBlock.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintTypes(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x1 + i-- + dAtA[i] = 0xa2 } - l = len(m.LastBlockAppHash) - if l > 0 { - n += 1 + l + sovTypes(uint64(l)) + return len(dAtA) - i, nil +} +func (m *ResponseException) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err } - return n + return dAtA[:n], nil } -func (m *ResponseInitChain) Size() (n int) { - if m == nil { - return 0 - } +func (m *ResponseException) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *ResponseException) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i var l int _ = l - if m.ConsensusParams != nil { - l = m.ConsensusParams.Size() - n += 1 + l + sovTypes(uint64(l)) - } - l = len(m.AppHash) - if l > 0 { - n += 1 + l + sovTypes(uint64(l)) - } - l = m.ValidatorSetUpdate.Size() - n += 2 + l + sovTypes(uint64(l)) - if m.NextCoreChainLockUpdate != nil { - l = m.NextCoreChainLockUpdate.Size() - n += 2 + l + sovTypes(uint64(l)) - } - if m.InitialCoreHeight != 0 { - n += 2 + sovTypes(uint64(m.InitialCoreHeight)) + if len(m.Error) > 0 { + i -= len(m.Error) + copy(dAtA[i:], m.Error) + i = encodeVarintTypes(dAtA, i, uint64(len(m.Error))) + i-- + dAtA[i] = 0xa } - return n + return len(dAtA) - i, nil } -func (m *ResponseQuery) Size() (n int) { - if m == nil { - return 0 +func (m *ResponseEcho) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err } + return dAtA[:n], nil +} + +func (m *ResponseEcho) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *ResponseEcho) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i var l int _ = l - if m.Code != 0 { - n += 1 + sovTypes(uint64(m.Code)) - } - l = len(m.Log) - if l > 0 { - n += 1 + l + sovTypes(uint64(l)) - } - l = len(m.Info) - if l > 0 { - n += 1 + l + sovTypes(uint64(l)) - } - if m.Index != 0 { - n += 1 + sovTypes(uint64(m.Index)) - } - l = len(m.Key) - if l > 0 { - n += 1 + l + sovTypes(uint64(l)) - } - l = len(m.Value) - if l > 0 { - n += 1 + l + sovTypes(uint64(l)) - } - if m.ProofOps != nil { - l = m.ProofOps.Size() - n += 1 + l + sovTypes(uint64(l)) - } - if m.Height != 0 { - n += 1 + sovTypes(uint64(m.Height)) - } - l = len(m.Codespace) - if l > 0 { - n += 1 + l + sovTypes(uint64(l)) + if len(m.Message) > 0 { + i -= len(m.Message) + copy(dAtA[i:], m.Message) + i = encodeVarintTypes(dAtA, i, uint64(len(m.Message))) + i-- + dAtA[i] = 0xa } - return n + return len(dAtA) - i, nil } -func (m *ResponseBeginBlock) Size() (n int) { - if m == nil { - return 0 +func (m *ResponseFlush) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err } + return dAtA[:n], nil +} + +func (m *ResponseFlush) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *ResponseFlush) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i var l int _ = l - if len(m.Events) > 0 { - for _, e := range m.Events { - l = e.Size() - n += 1 + l + sovTypes(uint64(l)) - } - } - return n + return len(dAtA) - i, nil } -func (m *ResponseCheckTx) Size() (n int) { - if m == nil { - return 0 +func (m *ResponseInfo) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err } + return dAtA[:n], nil +} + +func (m *ResponseInfo) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *ResponseInfo) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i var l int _ = l - if m.Code != 0 { - n += 1 + sovTypes(uint64(m.Code)) + if len(m.LastBlockAppHash) > 0 { + i -= len(m.LastBlockAppHash) + copy(dAtA[i:], m.LastBlockAppHash) + i = encodeVarintTypes(dAtA, i, uint64(len(m.LastBlockAppHash))) + i-- + dAtA[i] = 0x2a } - l = len(m.Data) - if l > 0 { - n += 1 + l + sovTypes(uint64(l)) + if m.LastBlockHeight != 0 { + i = encodeVarintTypes(dAtA, i, uint64(m.LastBlockHeight)) + i-- + dAtA[i] = 0x20 } - l = len(m.Log) - if l > 0 { - n += 1 + l + sovTypes(uint64(l)) + if m.AppVersion != 0 { + i = encodeVarintTypes(dAtA, i, uint64(m.AppVersion)) + i-- + dAtA[i] = 0x18 } - l = len(m.Info) - if l > 0 { - n += 1 + l + sovTypes(uint64(l)) + if len(m.Version) > 0 { + i -= len(m.Version) + copy(dAtA[i:], m.Version) + i = encodeVarintTypes(dAtA, i, uint64(len(m.Version))) + i-- + dAtA[i] = 0x12 } - if m.GasWanted != 0 { - n += 1 + sovTypes(uint64(m.GasWanted)) + if len(m.Data) > 0 { + i -= len(m.Data) + copy(dAtA[i:], m.Data) + i = encodeVarintTypes(dAtA, i, uint64(len(m.Data))) + i-- + dAtA[i] = 0xa } - if m.GasUsed != 0 { - n += 1 + sovTypes(uint64(m.GasUsed)) + return len(dAtA) - i, nil +} + +func (m *ResponseInitChain) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err } - if len(m.Events) > 0 { - for _, e := range m.Events { - l = e.Size() - n += 1 + l + sovTypes(uint64(l)) - } + return dAtA[:n], nil +} + +func (m *ResponseInitChain) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *ResponseInitChain) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if m.InitialCoreHeight != 0 { + i = encodeVarintTypes(dAtA, i, uint64(m.InitialCoreHeight)) + i-- + dAtA[i] = 0x6 + i-- + dAtA[i] = 0xb0 } - l = len(m.Codespace) - if l > 0 { - n += 1 + l + sovTypes(uint64(l)) + if m.NextCoreChainLockUpdate != nil { + { + size, err := m.NextCoreChainLockUpdate.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintTypes(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x6 + i-- + dAtA[i] = 0xaa } - l = len(m.Sender) - if l > 0 { - n += 1 + l + sovTypes(uint64(l)) + { + size, err := m.ValidatorSetUpdate.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintTypes(dAtA, i, uint64(size)) } - if m.Priority != 0 { - n += 1 + sovTypes(uint64(m.Priority)) + i-- + dAtA[i] = 0x6 + i-- + dAtA[i] = 0xa2 + if len(m.AppHash) > 0 { + i -= len(m.AppHash) + copy(dAtA[i:], m.AppHash) + i = encodeVarintTypes(dAtA, i, uint64(len(m.AppHash))) + i-- + dAtA[i] = 0x1a } - l = len(m.MempoolError) - if l > 0 { - n += 1 + l + sovTypes(uint64(l)) + if m.ConsensusParams != nil { + { + size, err := m.ConsensusParams.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintTypes(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0xa } - return n + return len(dAtA) - i, nil } -func (m *ResponseDeliverTx) Size() (n int) { - if m == nil { - return 0 +func (m *ResponseQuery) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err } + return dAtA[:n], nil +} + +func (m *ResponseQuery) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *ResponseQuery) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i var l int _ = l - if m.Code != 0 { - n += 1 + sovTypes(uint64(m.Code)) + if len(m.Codespace) > 0 { + i -= len(m.Codespace) + copy(dAtA[i:], m.Codespace) + i = encodeVarintTypes(dAtA, i, uint64(len(m.Codespace))) + i-- + dAtA[i] = 0x52 } - l = len(m.Data) - if l > 0 { - n += 1 + l + sovTypes(uint64(l)) - } - l = len(m.Log) - if l > 0 { - n += 1 + l + sovTypes(uint64(l)) - } - l = len(m.Info) - if l > 0 { - n += 1 + l + sovTypes(uint64(l)) - } - if m.GasWanted != 0 { - n += 1 + sovTypes(uint64(m.GasWanted)) - } - if m.GasUsed != 0 { - n += 1 + sovTypes(uint64(m.GasUsed)) + if m.Height != 0 { + i = encodeVarintTypes(dAtA, i, uint64(m.Height)) + i-- + dAtA[i] = 0x48 } - if len(m.Events) > 0 { - for _, e := range m.Events { - l = e.Size() - n += 1 + l + sovTypes(uint64(l)) + if m.ProofOps != nil { + { + size, err := m.ProofOps.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintTypes(dAtA, i, uint64(size)) } + i-- + dAtA[i] = 0x42 } - l = len(m.Codespace) - if l > 0 { - n += 1 + l + sovTypes(uint64(l)) + if len(m.Value) > 0 { + i -= len(m.Value) + copy(dAtA[i:], m.Value) + i = encodeVarintTypes(dAtA, i, uint64(len(m.Value))) + i-- + dAtA[i] = 0x3a } - return n -} - -func (m *ResponseEndBlock) Size() (n int) { - if m == nil { - return 0 + if len(m.Key) > 0 { + i -= len(m.Key) + copy(dAtA[i:], m.Key) + i = encodeVarintTypes(dAtA, i, uint64(len(m.Key))) + i-- + dAtA[i] = 0x32 } - var l int - _ = l - if m.ConsensusParamUpdates != nil { - l = m.ConsensusParamUpdates.Size() - n += 1 + l + sovTypes(uint64(l)) + if m.Index != 0 { + i = encodeVarintTypes(dAtA, i, uint64(m.Index)) + i-- + dAtA[i] = 0x28 } - if len(m.Events) > 0 { - for _, e := range m.Events { - l = e.Size() - n += 1 + l + sovTypes(uint64(l)) - } + if len(m.Info) > 0 { + i -= len(m.Info) + copy(dAtA[i:], m.Info) + i = encodeVarintTypes(dAtA, i, uint64(len(m.Info))) + i-- + dAtA[i] = 0x22 } - if m.NextCoreChainLockUpdate != nil { - l = m.NextCoreChainLockUpdate.Size() - n += 2 + l + sovTypes(uint64(l)) + if len(m.Log) > 0 { + i -= len(m.Log) + copy(dAtA[i:], m.Log) + i = encodeVarintTypes(dAtA, i, uint64(len(m.Log))) + i-- + dAtA[i] = 0x1a } - if m.ValidatorSetUpdate != nil { - l = m.ValidatorSetUpdate.Size() - n += 2 + l + sovTypes(uint64(l)) + if m.Code != 0 { + i = encodeVarintTypes(dAtA, i, uint64(m.Code)) + i-- + dAtA[i] = 0x8 } - return n + return len(dAtA) - i, nil } -func (m *ResponseCommit) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - l = len(m.Data) - if l > 0 { - n += 1 + l + sovTypes(uint64(l)) - } - if m.RetainHeight != 0 { - n += 1 + sovTypes(uint64(m.RetainHeight)) +func (m *ResponseBeginBlock) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err } - return n + return dAtA[:n], nil } -func (m *ResponseListSnapshots) Size() (n int) { - if m == nil { - return 0 - } +func (m *ResponseBeginBlock) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *ResponseBeginBlock) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i var l int _ = l - if len(m.Snapshots) > 0 { - for _, e := range m.Snapshots { - l = e.Size() - n += 1 + l + sovTypes(uint64(l)) + if len(m.Events) > 0 { + for iNdEx := len(m.Events) - 1; iNdEx >= 0; iNdEx-- { + { + size, err := m.Events[iNdEx].MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintTypes(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0xa } } - return n + return len(dAtA) - i, nil } -func (m *ResponseOfferSnapshot) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - if m.Result != 0 { - n += 1 + sovTypes(uint64(m.Result)) +func (m *ResponseCheckTx) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err } - return n + return dAtA[:n], nil } -func (m *ResponseLoadSnapshotChunk) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - l = len(m.Chunk) - if l > 0 { - n += 1 + l + sovTypes(uint64(l)) - } - return n +func (m *ResponseCheckTx) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) } -func (m *ResponseApplySnapshotChunk) Size() (n int) { - if m == nil { - return 0 - } +func (m *ResponseCheckTx) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i var l int _ = l - if m.Result != 0 { - n += 1 + sovTypes(uint64(m.Result)) - } - if len(m.RefetchChunks) > 0 { - l = 0 - for _, e := range m.RefetchChunks { - l += sovTypes(uint64(e)) - } - n += 1 + sovTypes(uint64(l)) + l + if len(m.MempoolError) > 0 { + i -= len(m.MempoolError) + copy(dAtA[i:], m.MempoolError) + i = encodeVarintTypes(dAtA, i, uint64(len(m.MempoolError))) + i-- + dAtA[i] = 0x5a } - if len(m.RejectSenders) > 0 { - for _, s := range m.RejectSenders { - l = len(s) - n += 1 + l + sovTypes(uint64(l)) - } + if m.Priority != 0 { + i = encodeVarintTypes(dAtA, i, uint64(m.Priority)) + i-- + dAtA[i] = 0x50 } - return n -} - -func (m *LastCommitInfo) Size() (n int) { - if m == nil { - return 0 + if len(m.Sender) > 0 { + i -= len(m.Sender) + copy(dAtA[i:], m.Sender) + i = encodeVarintTypes(dAtA, i, uint64(len(m.Sender))) + i-- + dAtA[i] = 0x4a } - var l int - _ = l - if m.Round != 0 { - n += 1 + sovTypes(uint64(m.Round)) + if len(m.Codespace) > 0 { + i -= len(m.Codespace) + copy(dAtA[i:], m.Codespace) + i = encodeVarintTypes(dAtA, i, uint64(len(m.Codespace))) + i-- + dAtA[i] = 0x42 } - l = len(m.QuorumHash) - if l > 0 { - n += 1 + l + sovTypes(uint64(l)) + if len(m.Events) > 0 { + for iNdEx := len(m.Events) - 1; iNdEx >= 0; iNdEx-- { + { + size, err := m.Events[iNdEx].MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintTypes(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x3a + } } - l = len(m.BlockSignature) - if l > 0 { - n += 1 + l + sovTypes(uint64(l)) + if m.GasUsed != 0 { + i = encodeVarintTypes(dAtA, i, uint64(m.GasUsed)) + i-- + dAtA[i] = 0x30 } - l = len(m.StateSignature) - if l > 0 { - n += 1 + l + sovTypes(uint64(l)) + if m.GasWanted != 0 { + i = encodeVarintTypes(dAtA, i, uint64(m.GasWanted)) + i-- + dAtA[i] = 0x28 } - return n -} - -func (m *Event) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - l = len(m.Type) - if l > 0 { - n += 1 + l + sovTypes(uint64(l)) - } - if len(m.Attributes) > 0 { - for _, e := range m.Attributes { - l = e.Size() - n += 1 + l + sovTypes(uint64(l)) - } - } - return n -} - -func (m *EventAttribute) Size() (n int) { - if m == nil { - return 0 + if len(m.Info) > 0 { + i -= len(m.Info) + copy(dAtA[i:], m.Info) + i = encodeVarintTypes(dAtA, i, uint64(len(m.Info))) + i-- + dAtA[i] = 0x22 } - var l int - _ = l - l = len(m.Key) - if l > 0 { - n += 1 + l + sovTypes(uint64(l)) + if len(m.Log) > 0 { + i -= len(m.Log) + copy(dAtA[i:], m.Log) + i = encodeVarintTypes(dAtA, i, uint64(len(m.Log))) + i-- + dAtA[i] = 0x1a } - l = len(m.Value) - if l > 0 { - n += 1 + l + sovTypes(uint64(l)) + if len(m.Data) > 0 { + i -= len(m.Data) + copy(dAtA[i:], m.Data) + i = encodeVarintTypes(dAtA, i, uint64(len(m.Data))) + i-- + dAtA[i] = 0x12 } - if m.Index { - n += 2 + if m.Code != 0 { + i = encodeVarintTypes(dAtA, i, uint64(m.Code)) + i-- + dAtA[i] = 0x8 } - return n + return len(dAtA) - i, nil } -func (m *TxResult) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - if m.Height != 0 { - n += 1 + sovTypes(uint64(m.Height)) - } - if m.Index != 0 { - n += 1 + sovTypes(uint64(m.Index)) - } - l = len(m.Tx) - if l > 0 { - n += 1 + l + sovTypes(uint64(l)) +func (m *ResponseDeliverTx) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err } - l = m.Result.Size() - n += 1 + l + sovTypes(uint64(l)) - return n + return dAtA[:n], nil } -func (m *Validator) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - if m.Power != 0 { - n += 1 + sovTypes(uint64(m.Power)) - } - l = len(m.ProTxHash) - if l > 0 { - n += 1 + l + sovTypes(uint64(l)) - } - return n +func (m *ResponseDeliverTx) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) } -func (m *ValidatorUpdate) Size() (n int) { - if m == nil { - return 0 - } +func (m *ResponseDeliverTx) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i var l int _ = l - if m.PubKey != nil { - l = m.PubKey.Size() - n += 1 + l + sovTypes(uint64(l)) + if len(m.Codespace) > 0 { + i -= len(m.Codespace) + copy(dAtA[i:], m.Codespace) + i = encodeVarintTypes(dAtA, i, uint64(len(m.Codespace))) + i-- + dAtA[i] = 0x42 } - if m.Power != 0 { - n += 1 + sovTypes(uint64(m.Power)) + if len(m.Events) > 0 { + for iNdEx := len(m.Events) - 1; iNdEx >= 0; iNdEx-- { + { + size, err := m.Events[iNdEx].MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintTypes(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x3a + } } - l = len(m.ProTxHash) - if l > 0 { - n += 1 + l + sovTypes(uint64(l)) + if m.GasUsed != 0 { + i = encodeVarintTypes(dAtA, i, uint64(m.GasUsed)) + i-- + dAtA[i] = 0x30 } - l = len(m.NodeAddress) - if l > 0 { - n += 1 + l + sovTypes(uint64(l)) + if m.GasWanted != 0 { + i = encodeVarintTypes(dAtA, i, uint64(m.GasWanted)) + i-- + dAtA[i] = 0x28 } - return n -} - -func (m *ValidatorSetUpdate) Size() (n int) { - if m == nil { - return 0 + if len(m.Info) > 0 { + i -= len(m.Info) + copy(dAtA[i:], m.Info) + i = encodeVarintTypes(dAtA, i, uint64(len(m.Info))) + i-- + dAtA[i] = 0x22 } - var l int - _ = l - if len(m.ValidatorUpdates) > 0 { - for _, e := range m.ValidatorUpdates { - l = e.Size() - n += 1 + l + sovTypes(uint64(l)) - } + if len(m.Log) > 0 { + i -= len(m.Log) + copy(dAtA[i:], m.Log) + i = encodeVarintTypes(dAtA, i, uint64(len(m.Log))) + i-- + dAtA[i] = 0x1a } - l = m.ThresholdPublicKey.Size() - n += 1 + l + sovTypes(uint64(l)) - l = len(m.QuorumHash) - if l > 0 { - n += 1 + l + sovTypes(uint64(l)) + if len(m.Data) > 0 { + i -= len(m.Data) + copy(dAtA[i:], m.Data) + i = encodeVarintTypes(dAtA, i, uint64(len(m.Data))) + i-- + dAtA[i] = 0x12 } - return n -} - -func (m *ThresholdPublicKeyUpdate) Size() (n int) { - if m == nil { - return 0 + if m.Code != 0 { + i = encodeVarintTypes(dAtA, i, uint64(m.Code)) + i-- + dAtA[i] = 0x8 } - var l int - _ = l - l = m.ThresholdPublicKey.Size() - n += 1 + l + sovTypes(uint64(l)) - return n + return len(dAtA) - i, nil } -func (m *QuorumHashUpdate) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - l = len(m.QuorumHash) - if l > 0 { - n += 1 + l + sovTypes(uint64(l)) +func (m *ResponseEndBlock) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err } - return n + return dAtA[:n], nil } -func (m *VoteInfo) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - l = m.Validator.Size() - n += 1 + l + sovTypes(uint64(l)) - if m.SignedLastBlock { - n += 2 - } - return n +func (m *ResponseEndBlock) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) } -func (m *Evidence) Size() (n int) { - if m == nil { - return 0 - } +func (m *ResponseEndBlock) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i var l int _ = l - if m.Type != 0 { - n += 1 + sovTypes(uint64(m.Type)) - } - l = m.Validator.Size() - n += 1 + l + sovTypes(uint64(l)) - if m.Height != 0 { - n += 1 + sovTypes(uint64(m.Height)) + if m.ValidatorSetUpdate != nil { + { + size, err := m.ValidatorSetUpdate.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintTypes(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x6 + i-- + dAtA[i] = 0xaa } - l = github_com_gogo_protobuf_types.SizeOfStdTime(m.Time) + if m.NextCoreChainLockUpdate != nil { + { + size, err := m.NextCoreChainLockUpdate.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintTypes(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x6 + i-- + dAtA[i] = 0xa2 + } + if len(m.Events) > 0 { + for iNdEx := len(m.Events) - 1; iNdEx >= 0; iNdEx-- { + { + size, err := m.Events[iNdEx].MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintTypes(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x1a + } + } + if m.ConsensusParamUpdates != nil { + { + size, err := m.ConsensusParamUpdates.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintTypes(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x12 + } + return len(dAtA) - i, nil +} + +func (m *ResponseCommit) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *ResponseCommit) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *ResponseCommit) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if m.RetainHeight != 0 { + i = encodeVarintTypes(dAtA, i, uint64(m.RetainHeight)) + i-- + dAtA[i] = 0x18 + } + if len(m.Data) > 0 { + i -= len(m.Data) + copy(dAtA[i:], m.Data) + i = encodeVarintTypes(dAtA, i, uint64(len(m.Data))) + i-- + dAtA[i] = 0x12 + } + return len(dAtA) - i, nil +} + +func (m *ResponseListSnapshots) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *ResponseListSnapshots) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *ResponseListSnapshots) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if len(m.Snapshots) > 0 { + for iNdEx := len(m.Snapshots) - 1; iNdEx >= 0; iNdEx-- { + { + size, err := m.Snapshots[iNdEx].MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintTypes(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0xa + } + } + return len(dAtA) - i, nil +} + +func (m *ResponseOfferSnapshot) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *ResponseOfferSnapshot) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *ResponseOfferSnapshot) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if m.Result != 0 { + i = encodeVarintTypes(dAtA, i, uint64(m.Result)) + i-- + dAtA[i] = 0x8 + } + return len(dAtA) - i, nil +} + +func (m *ResponseLoadSnapshotChunk) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *ResponseLoadSnapshotChunk) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *ResponseLoadSnapshotChunk) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if len(m.Chunk) > 0 { + i -= len(m.Chunk) + copy(dAtA[i:], m.Chunk) + i = encodeVarintTypes(dAtA, i, uint64(len(m.Chunk))) + i-- + dAtA[i] = 0xa + } + return len(dAtA) - i, nil +} + +func (m *ResponseApplySnapshotChunk) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *ResponseApplySnapshotChunk) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *ResponseApplySnapshotChunk) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if len(m.RejectSenders) > 0 { + for iNdEx := len(m.RejectSenders) - 1; iNdEx >= 0; iNdEx-- { + i -= len(m.RejectSenders[iNdEx]) + copy(dAtA[i:], m.RejectSenders[iNdEx]) + i = encodeVarintTypes(dAtA, i, uint64(len(m.RejectSenders[iNdEx]))) + i-- + dAtA[i] = 0x1a + } + } + if len(m.RefetchChunks) > 0 { + dAtA60 := make([]byte, len(m.RefetchChunks)*10) + var j59 int + for _, num := range m.RefetchChunks { + for num >= 1<<7 { + dAtA60[j59] = uint8(uint64(num)&0x7f | 0x80) + num >>= 7 + j59++ + } + dAtA60[j59] = uint8(num) + j59++ + } + i -= j59 + copy(dAtA[i:], dAtA60[:j59]) + i = encodeVarintTypes(dAtA, i, uint64(j59)) + i-- + dAtA[i] = 0x12 + } + if m.Result != 0 { + i = encodeVarintTypes(dAtA, i, uint64(m.Result)) + i-- + dAtA[i] = 0x8 + } + return len(dAtA) - i, nil +} + +func (m *ResponsePrepareProposal) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *ResponsePrepareProposal) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *ResponsePrepareProposal) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if m.ConsensusParamUpdates != nil { + { + size, err := m.ConsensusParamUpdates.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintTypes(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x2a + } + if len(m.ValidatorUpdates) > 0 { + for iNdEx := len(m.ValidatorUpdates) - 1; iNdEx >= 0; iNdEx-- { + { + size, err := m.ValidatorUpdates[iNdEx].MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintTypes(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x22 + } + } + if len(m.TxResults) > 0 { + for iNdEx := len(m.TxResults) - 1; iNdEx >= 0; iNdEx-- { + { + size, err := m.TxResults[iNdEx].MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintTypes(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x1a + } + } + if len(m.AppHash) > 0 { + i -= len(m.AppHash) + copy(dAtA[i:], m.AppHash) + i = encodeVarintTypes(dAtA, i, uint64(len(m.AppHash))) + i-- + dAtA[i] = 0x12 + } + if len(m.TxRecords) > 0 { + for iNdEx := len(m.TxRecords) - 1; iNdEx >= 0; iNdEx-- { + { + size, err := m.TxRecords[iNdEx].MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintTypes(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0xa + } + } + return len(dAtA) - i, nil +} + +func (m *ResponseProcessProposal) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *ResponseProcessProposal) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *ResponseProcessProposal) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if m.ConsensusParamUpdates != nil { + { + size, err := m.ConsensusParamUpdates.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintTypes(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x2a + } + if len(m.ValidatorUpdates) > 0 { + for iNdEx := len(m.ValidatorUpdates) - 1; iNdEx >= 0; iNdEx-- { + { + size, err := m.ValidatorUpdates[iNdEx].MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintTypes(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x22 + } + } + if len(m.TxResults) > 0 { + for iNdEx := len(m.TxResults) - 1; iNdEx >= 0; iNdEx-- { + { + size, err := m.TxResults[iNdEx].MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintTypes(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x1a + } + } + if len(m.AppHash) > 0 { + i -= len(m.AppHash) + copy(dAtA[i:], m.AppHash) + i = encodeVarintTypes(dAtA, i, uint64(len(m.AppHash))) + i-- + dAtA[i] = 0x12 + } + if m.Status != 0 { + i = encodeVarintTypes(dAtA, i, uint64(m.Status)) + i-- + dAtA[i] = 0x8 + } + return len(dAtA) - i, nil +} + +func (m *ResponseExtendVote) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *ResponseExtendVote) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *ResponseExtendVote) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if len(m.VoteExtension) > 0 { + i -= len(m.VoteExtension) + copy(dAtA[i:], m.VoteExtension) + i = encodeVarintTypes(dAtA, i, uint64(len(m.VoteExtension))) + i-- + dAtA[i] = 0xa + } + return len(dAtA) - i, nil +} + +func (m *ResponseVerifyVoteExtension) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *ResponseVerifyVoteExtension) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *ResponseVerifyVoteExtension) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if m.Status != 0 { + i = encodeVarintTypes(dAtA, i, uint64(m.Status)) + i-- + dAtA[i] = 0x8 + } + return len(dAtA) - i, nil +} + +func (m *ResponseFinalizeBlock) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *ResponseFinalizeBlock) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *ResponseFinalizeBlock) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if m.ValidatorSetUpdate != nil { + { + size, err := m.ValidatorSetUpdate.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintTypes(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x6 + i-- + dAtA[i] = 0xaa + } + if m.NextCoreChainLockUpdate != nil { + { + size, err := m.NextCoreChainLockUpdate.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintTypes(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x6 + i-- + dAtA[i] = 0xa2 + } + if m.RetainHeight != 0 { + i = encodeVarintTypes(dAtA, i, uint64(m.RetainHeight)) + i-- + dAtA[i] = 0x30 + } + if len(m.AppHash) > 0 { + i -= len(m.AppHash) + copy(dAtA[i:], m.AppHash) + i = encodeVarintTypes(dAtA, i, uint64(len(m.AppHash))) + i-- + dAtA[i] = 0x2a + } + if m.ConsensusParamUpdates != nil { + { + size, err := m.ConsensusParamUpdates.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintTypes(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x22 + } + if len(m.TxResults) > 0 { + for iNdEx := len(m.TxResults) - 1; iNdEx >= 0; iNdEx-- { + { + size, err := m.TxResults[iNdEx].MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintTypes(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x12 + } + } + if len(m.Events) > 0 { + for iNdEx := len(m.Events) - 1; iNdEx >= 0; iNdEx-- { + { + size, err := m.Events[iNdEx].MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintTypes(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0xa + } + } + return len(dAtA) - i, nil +} + +func (m *CommitInfo) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *CommitInfo) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *CommitInfo) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if len(m.StateSignature) > 0 { + i -= len(m.StateSignature) + copy(dAtA[i:], m.StateSignature) + i = encodeVarintTypes(dAtA, i, uint64(len(m.StateSignature))) + i-- + dAtA[i] = 0x2a + } + if len(m.BlockSignature) > 0 { + i -= len(m.BlockSignature) + copy(dAtA[i:], m.BlockSignature) + i = encodeVarintTypes(dAtA, i, uint64(len(m.BlockSignature))) + i-- + dAtA[i] = 0x22 + } + if len(m.QuorumHash) > 0 { + i -= len(m.QuorumHash) + copy(dAtA[i:], m.QuorumHash) + i = encodeVarintTypes(dAtA, i, uint64(len(m.QuorumHash))) + i-- + dAtA[i] = 0x1a + } + if m.Round != 0 { + i = encodeVarintTypes(dAtA, i, uint64(m.Round)) + i-- + dAtA[i] = 0x8 + } + return len(dAtA) - i, nil +} + +func (m *ExtendedCommitInfo) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *ExtendedCommitInfo) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *ExtendedCommitInfo) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if len(m.Votes) > 0 { + for iNdEx := len(m.Votes) - 1; iNdEx >= 0; iNdEx-- { + { + size, err := m.Votes[iNdEx].MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintTypes(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x12 + } + } + if m.Round != 0 { + i = encodeVarintTypes(dAtA, i, uint64(m.Round)) + i-- + dAtA[i] = 0x8 + } + return len(dAtA) - i, nil +} + +func (m *Event) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *Event) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *Event) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if len(m.Attributes) > 0 { + for iNdEx := len(m.Attributes) - 1; iNdEx >= 0; iNdEx-- { + { + size, err := m.Attributes[iNdEx].MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintTypes(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x12 + } + } + if len(m.Type) > 0 { + i -= len(m.Type) + copy(dAtA[i:], m.Type) + i = encodeVarintTypes(dAtA, i, uint64(len(m.Type))) + i-- + dAtA[i] = 0xa + } + return len(dAtA) - i, nil +} + +func (m *EventAttribute) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *EventAttribute) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *EventAttribute) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if m.Index { + i-- + if m.Index { + dAtA[i] = 1 + } else { + dAtA[i] = 0 + } + i-- + dAtA[i] = 0x18 + } + if len(m.Value) > 0 { + i -= len(m.Value) + copy(dAtA[i:], m.Value) + i = encodeVarintTypes(dAtA, i, uint64(len(m.Value))) + i-- + dAtA[i] = 0x12 + } + if len(m.Key) > 0 { + i -= len(m.Key) + copy(dAtA[i:], m.Key) + i = encodeVarintTypes(dAtA, i, uint64(len(m.Key))) + i-- + dAtA[i] = 0xa + } + return len(dAtA) - i, nil +} + +func (m *ExecTxResult) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *ExecTxResult) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *ExecTxResult) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if len(m.Codespace) > 0 { + i -= len(m.Codespace) + copy(dAtA[i:], m.Codespace) + i = encodeVarintTypes(dAtA, i, uint64(len(m.Codespace))) + i-- + dAtA[i] = 0x42 + } + if len(m.Events) > 0 { + for iNdEx := len(m.Events) - 1; iNdEx >= 0; iNdEx-- { + { + size, err := m.Events[iNdEx].MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintTypes(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x3a + } + } + if m.GasUsed != 0 { + i = encodeVarintTypes(dAtA, i, uint64(m.GasUsed)) + i-- + dAtA[i] = 0x30 + } + if m.GasWanted != 0 { + i = encodeVarintTypes(dAtA, i, uint64(m.GasWanted)) + i-- + dAtA[i] = 0x28 + } + if len(m.Info) > 0 { + i -= len(m.Info) + copy(dAtA[i:], m.Info) + i = encodeVarintTypes(dAtA, i, uint64(len(m.Info))) + i-- + dAtA[i] = 0x22 + } + if len(m.Log) > 0 { + i -= len(m.Log) + copy(dAtA[i:], m.Log) + i = encodeVarintTypes(dAtA, i, uint64(len(m.Log))) + i-- + dAtA[i] = 0x1a + } + if len(m.Data) > 0 { + i -= len(m.Data) + copy(dAtA[i:], m.Data) + i = encodeVarintTypes(dAtA, i, uint64(len(m.Data))) + i-- + dAtA[i] = 0x12 + } + if m.Code != 0 { + i = encodeVarintTypes(dAtA, i, uint64(m.Code)) + i-- + dAtA[i] = 0x8 + } + return len(dAtA) - i, nil +} + +func (m *TxResult) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *TxResult) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *TxResult) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + { + size, err := m.Result.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintTypes(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x22 + if len(m.Tx) > 0 { + i -= len(m.Tx) + copy(dAtA[i:], m.Tx) + i = encodeVarintTypes(dAtA, i, uint64(len(m.Tx))) + i-- + dAtA[i] = 0x1a + } + if m.Index != 0 { + i = encodeVarintTypes(dAtA, i, uint64(m.Index)) + i-- + dAtA[i] = 0x10 + } + if m.Height != 0 { + i = encodeVarintTypes(dAtA, i, uint64(m.Height)) + i-- + dAtA[i] = 0x8 + } + return len(dAtA) - i, nil +} + +func (m *TxRecord) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *TxRecord) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *TxRecord) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if len(m.Tx) > 0 { + i -= len(m.Tx) + copy(dAtA[i:], m.Tx) + i = encodeVarintTypes(dAtA, i, uint64(len(m.Tx))) + i-- + dAtA[i] = 0x12 + } + if m.Action != 0 { + i = encodeVarintTypes(dAtA, i, uint64(m.Action)) + i-- + dAtA[i] = 0x8 + } + return len(dAtA) - i, nil +} + +func (m *Validator) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *Validator) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *Validator) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if len(m.ProTxHash) > 0 { + i -= len(m.ProTxHash) + copy(dAtA[i:], m.ProTxHash) + i = encodeVarintTypes(dAtA, i, uint64(len(m.ProTxHash))) + i-- + dAtA[i] = 0x22 + } + if m.Power != 0 { + i = encodeVarintTypes(dAtA, i, uint64(m.Power)) + i-- + dAtA[i] = 0x18 + } + return len(dAtA) - i, nil +} + +func (m *ValidatorUpdate) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *ValidatorUpdate) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *ValidatorUpdate) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if len(m.NodeAddress) > 0 { + i -= len(m.NodeAddress) + copy(dAtA[i:], m.NodeAddress) + i = encodeVarintTypes(dAtA, i, uint64(len(m.NodeAddress))) + i-- + dAtA[i] = 0x22 + } + if len(m.ProTxHash) > 0 { + i -= len(m.ProTxHash) + copy(dAtA[i:], m.ProTxHash) + i = encodeVarintTypes(dAtA, i, uint64(len(m.ProTxHash))) + i-- + dAtA[i] = 0x1a + } + if m.Power != 0 { + i = encodeVarintTypes(dAtA, i, uint64(m.Power)) + i-- + dAtA[i] = 0x10 + } + if m.PubKey != nil { + { + size, err := m.PubKey.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintTypes(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0xa + } + return len(dAtA) - i, nil +} + +func (m *ValidatorSetUpdate) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *ValidatorSetUpdate) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *ValidatorSetUpdate) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if len(m.QuorumHash) > 0 { + i -= len(m.QuorumHash) + copy(dAtA[i:], m.QuorumHash) + i = encodeVarintTypes(dAtA, i, uint64(len(m.QuorumHash))) + i-- + dAtA[i] = 0x1a + } + { + size, err := m.ThresholdPublicKey.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintTypes(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x12 + if len(m.ValidatorUpdates) > 0 { + for iNdEx := len(m.ValidatorUpdates) - 1; iNdEx >= 0; iNdEx-- { + { + size, err := m.ValidatorUpdates[iNdEx].MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintTypes(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0xa + } + } + return len(dAtA) - i, nil +} + +func (m *ThresholdPublicKeyUpdate) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *ThresholdPublicKeyUpdate) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *ThresholdPublicKeyUpdate) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + { + size, err := m.ThresholdPublicKey.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintTypes(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0xa + return len(dAtA) - i, nil +} + +func (m *QuorumHashUpdate) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *QuorumHashUpdate) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *QuorumHashUpdate) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if len(m.QuorumHash) > 0 { + i -= len(m.QuorumHash) + copy(dAtA[i:], m.QuorumHash) + i = encodeVarintTypes(dAtA, i, uint64(len(m.QuorumHash))) + i-- + dAtA[i] = 0xa + } + return len(dAtA) - i, nil +} + +func (m *VoteInfo) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *VoteInfo) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *VoteInfo) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if m.SignedLastBlock { + i-- + if m.SignedLastBlock { + dAtA[i] = 1 + } else { + dAtA[i] = 0 + } + i-- + dAtA[i] = 0x10 + } + { + size, err := m.Validator.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintTypes(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0xa + return len(dAtA) - i, nil +} + +func (m *ExtendedVoteInfo) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *ExtendedVoteInfo) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *ExtendedVoteInfo) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if len(m.VoteExtension) > 0 { + i -= len(m.VoteExtension) + copy(dAtA[i:], m.VoteExtension) + i = encodeVarintTypes(dAtA, i, uint64(len(m.VoteExtension))) + i-- + dAtA[i] = 0x1a + } + if m.SignedLastBlock { + i-- + if m.SignedLastBlock { + dAtA[i] = 1 + } else { + dAtA[i] = 0 + } + i-- + dAtA[i] = 0x10 + } + { + size, err := m.Validator.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintTypes(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0xa + return len(dAtA) - i, nil +} + +func (m *Misbehavior) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *Misbehavior) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *Misbehavior) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if m.TotalVotingPower != 0 { + i = encodeVarintTypes(dAtA, i, uint64(m.TotalVotingPower)) + i-- + dAtA[i] = 0x28 + } + n72, err72 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.Time, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.Time):]) + if err72 != nil { + return 0, err72 + } + i -= n72 + i = encodeVarintTypes(dAtA, i, uint64(n72)) + i-- + dAtA[i] = 0x22 + if m.Height != 0 { + i = encodeVarintTypes(dAtA, i, uint64(m.Height)) + i-- + dAtA[i] = 0x18 + } + { + size, err := m.Validator.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintTypes(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x12 + if m.Type != 0 { + i = encodeVarintTypes(dAtA, i, uint64(m.Type)) + i-- + dAtA[i] = 0x8 + } + return len(dAtA) - i, nil +} + +func (m *Snapshot) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *Snapshot) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *Snapshot) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if m.CoreChainLockedHeight != 0 { + i = encodeVarintTypes(dAtA, i, uint64(m.CoreChainLockedHeight)) + i-- + dAtA[i] = 0x6 + i-- + dAtA[i] = 0xa0 + } + if len(m.Metadata) > 0 { + i -= len(m.Metadata) + copy(dAtA[i:], m.Metadata) + i = encodeVarintTypes(dAtA, i, uint64(len(m.Metadata))) + i-- + dAtA[i] = 0x2a + } + if len(m.Hash) > 0 { + i -= len(m.Hash) + copy(dAtA[i:], m.Hash) + i = encodeVarintTypes(dAtA, i, uint64(len(m.Hash))) + i-- + dAtA[i] = 0x22 + } + if m.Chunks != 0 { + i = encodeVarintTypes(dAtA, i, uint64(m.Chunks)) + i-- + dAtA[i] = 0x18 + } + if m.Format != 0 { + i = encodeVarintTypes(dAtA, i, uint64(m.Format)) + i-- + dAtA[i] = 0x10 + } + if m.Height != 0 { + i = encodeVarintTypes(dAtA, i, uint64(m.Height)) + i-- + dAtA[i] = 0x8 + } + return len(dAtA) - i, nil +} + +func encodeVarintTypes(dAtA []byte, offset int, v uint64) int { + offset -= sovTypes(v) + base := offset + for v >= 1<<7 { + dAtA[offset] = uint8(v&0x7f | 0x80) + v >>= 7 + offset++ + } + dAtA[offset] = uint8(v) + return base +} +func (m *Request) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.Value != nil { + n += m.Value.Size() + } + return n +} + +func (m *Request_Echo) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.Echo != nil { + l = m.Echo.Size() + n += 1 + l + sovTypes(uint64(l)) + } + return n +} +func (m *Request_Flush) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.Flush != nil { + l = m.Flush.Size() + n += 1 + l + sovTypes(uint64(l)) + } + return n +} +func (m *Request_Info) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.Info != nil { + l = m.Info.Size() + n += 1 + l + sovTypes(uint64(l)) + } + return n +} +func (m *Request_InitChain) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.InitChain != nil { + l = m.InitChain.Size() + n += 1 + l + sovTypes(uint64(l)) + } + return n +} +func (m *Request_Query) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.Query != nil { + l = m.Query.Size() + n += 1 + l + sovTypes(uint64(l)) + } + return n +} +func (m *Request_BeginBlock) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.BeginBlock != nil { + l = m.BeginBlock.Size() + n += 1 + l + sovTypes(uint64(l)) + } + return n +} +func (m *Request_CheckTx) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.CheckTx != nil { + l = m.CheckTx.Size() + n += 1 + l + sovTypes(uint64(l)) + } + return n +} +func (m *Request_DeliverTx) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.DeliverTx != nil { + l = m.DeliverTx.Size() + n += 1 + l + sovTypes(uint64(l)) + } + return n +} +func (m *Request_EndBlock) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.EndBlock != nil { + l = m.EndBlock.Size() + n += 1 + l + sovTypes(uint64(l)) + } + return n +} +func (m *Request_Commit) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.Commit != nil { + l = m.Commit.Size() + n += 1 + l + sovTypes(uint64(l)) + } + return n +} +func (m *Request_ListSnapshots) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.ListSnapshots != nil { + l = m.ListSnapshots.Size() + n += 1 + l + sovTypes(uint64(l)) + } + return n +} +func (m *Request_OfferSnapshot) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.OfferSnapshot != nil { + l = m.OfferSnapshot.Size() + n += 1 + l + sovTypes(uint64(l)) + } + return n +} +func (m *Request_LoadSnapshotChunk) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.LoadSnapshotChunk != nil { + l = m.LoadSnapshotChunk.Size() + n += 1 + l + sovTypes(uint64(l)) + } + return n +} +func (m *Request_ApplySnapshotChunk) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.ApplySnapshotChunk != nil { + l = m.ApplySnapshotChunk.Size() + n += 1 + l + sovTypes(uint64(l)) + } + return n +} +func (m *Request_PrepareProposal) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.PrepareProposal != nil { + l = m.PrepareProposal.Size() + n += 1 + l + sovTypes(uint64(l)) + } + return n +} +func (m *Request_ProcessProposal) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.ProcessProposal != nil { + l = m.ProcessProposal.Size() + n += 2 + l + sovTypes(uint64(l)) + } + return n +} +func (m *Request_ExtendVote) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.ExtendVote != nil { + l = m.ExtendVote.Size() + n += 2 + l + sovTypes(uint64(l)) + } + return n +} +func (m *Request_VerifyVoteExtension) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.VerifyVoteExtension != nil { + l = m.VerifyVoteExtension.Size() + n += 2 + l + sovTypes(uint64(l)) + } + return n +} +func (m *Request_FinalizeBlock) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.FinalizeBlock != nil { + l = m.FinalizeBlock.Size() + n += 2 + l + sovTypes(uint64(l)) + } + return n +} +func (m *RequestEcho) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = len(m.Message) + if l > 0 { + n += 1 + l + sovTypes(uint64(l)) + } + return n +} + +func (m *RequestFlush) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + return n +} + +func (m *RequestInfo) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = len(m.Version) + if l > 0 { + n += 1 + l + sovTypes(uint64(l)) + } + if m.BlockVersion != 0 { + n += 1 + sovTypes(uint64(m.BlockVersion)) + } + if m.P2PVersion != 0 { + n += 1 + sovTypes(uint64(m.P2PVersion)) + } + l = len(m.AbciVersion) + if l > 0 { + n += 1 + l + sovTypes(uint64(l)) + } + return n +} + +func (m *RequestInitChain) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = github_com_gogo_protobuf_types.SizeOfStdTime(m.Time) + n += 1 + l + sovTypes(uint64(l)) + l = len(m.ChainId) + if l > 0 { + n += 1 + l + sovTypes(uint64(l)) + } + if m.ConsensusParams != nil { + l = m.ConsensusParams.Size() + n += 1 + l + sovTypes(uint64(l)) + } + if m.ValidatorSet != nil { + l = m.ValidatorSet.Size() + n += 1 + l + sovTypes(uint64(l)) + } + l = len(m.AppStateBytes) + if l > 0 { + n += 1 + l + sovTypes(uint64(l)) + } + if m.InitialHeight != 0 { + n += 1 + sovTypes(uint64(m.InitialHeight)) + } + if m.InitialCoreHeight != 0 { + n += 1 + sovTypes(uint64(m.InitialCoreHeight)) + } + return n +} + +func (m *RequestQuery) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = len(m.Data) + if l > 0 { + n += 1 + l + sovTypes(uint64(l)) + } + l = len(m.Path) + if l > 0 { + n += 1 + l + sovTypes(uint64(l)) + } + if m.Height != 0 { + n += 1 + sovTypes(uint64(m.Height)) + } + if m.Prove { + n += 2 + } + return n +} + +func (m *RequestBeginBlock) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = len(m.Hash) + if l > 0 { + n += 1 + l + sovTypes(uint64(l)) + } + l = m.Header.Size() + n += 1 + l + sovTypes(uint64(l)) + l = m.LastCommitInfo.Size() + n += 1 + l + sovTypes(uint64(l)) + if len(m.ByzantineValidators) > 0 { + for _, e := range m.ByzantineValidators { + l = e.Size() + n += 1 + l + sovTypes(uint64(l)) + } + } + return n +} + +func (m *RequestCheckTx) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = len(m.Tx) + if l > 0 { + n += 1 + l + sovTypes(uint64(l)) + } + if m.Type != 0 { + n += 1 + sovTypes(uint64(m.Type)) + } + return n +} + +func (m *RequestDeliverTx) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = len(m.Tx) + if l > 0 { + n += 1 + l + sovTypes(uint64(l)) + } + return n +} + +func (m *RequestEndBlock) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.Height != 0 { + n += 1 + sovTypes(uint64(m.Height)) + } + return n +} + +func (m *RequestCommit) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + return n +} + +func (m *RequestListSnapshots) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + return n +} + +func (m *RequestOfferSnapshot) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.Snapshot != nil { + l = m.Snapshot.Size() + n += 1 + l + sovTypes(uint64(l)) + } + l = len(m.AppHash) + if l > 0 { + n += 1 + l + sovTypes(uint64(l)) + } + return n +} + +func (m *RequestLoadSnapshotChunk) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.Height != 0 { + n += 1 + sovTypes(uint64(m.Height)) + } + if m.Format != 0 { + n += 1 + sovTypes(uint64(m.Format)) + } + if m.Chunk != 0 { + n += 1 + sovTypes(uint64(m.Chunk)) + } + return n +} + +func (m *RequestApplySnapshotChunk) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.Index != 0 { + n += 1 + sovTypes(uint64(m.Index)) + } + l = len(m.Chunk) + if l > 0 { + n += 1 + l + sovTypes(uint64(l)) + } + l = len(m.Sender) + if l > 0 { + n += 1 + l + sovTypes(uint64(l)) + } + return n +} + +func (m *RequestPrepareProposal) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.MaxTxBytes != 0 { + n += 1 + sovTypes(uint64(m.MaxTxBytes)) + } + if len(m.Txs) > 0 { + for _, b := range m.Txs { + l = len(b) + n += 1 + l + sovTypes(uint64(l)) + } + } + l = m.LocalLastCommit.Size() + n += 1 + l + sovTypes(uint64(l)) + if len(m.ByzantineValidators) > 0 { + for _, e := range m.ByzantineValidators { + l = e.Size() + n += 1 + l + sovTypes(uint64(l)) + } + } + if m.Height != 0 { + n += 1 + sovTypes(uint64(m.Height)) + } + l = github_com_gogo_protobuf_types.SizeOfStdTime(m.Time) + n += 1 + l + sovTypes(uint64(l)) + l = len(m.NextValidatorsHash) + if l > 0 { + n += 1 + l + sovTypes(uint64(l)) + } + l = len(m.ProposerProTxHash) + if l > 0 { + n += 1 + l + sovTypes(uint64(l)) + } + return n +} + +func (m *RequestProcessProposal) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if len(m.Txs) > 0 { + for _, b := range m.Txs { + l = len(b) + n += 1 + l + sovTypes(uint64(l)) + } + } + l = m.ProposedLastCommit.Size() + n += 1 + l + sovTypes(uint64(l)) + if len(m.ByzantineValidators) > 0 { + for _, e := range m.ByzantineValidators { + l = e.Size() + n += 1 + l + sovTypes(uint64(l)) + } + } + l = len(m.Hash) + if l > 0 { + n += 1 + l + sovTypes(uint64(l)) + } + if m.Height != 0 { + n += 1 + sovTypes(uint64(m.Height)) + } + l = github_com_gogo_protobuf_types.SizeOfStdTime(m.Time) + n += 1 + l + sovTypes(uint64(l)) + l = len(m.NextValidatorsHash) + if l > 0 { + n += 1 + l + sovTypes(uint64(l)) + } + l = len(m.ProposerProTxHash) + if l > 0 { + n += 1 + l + sovTypes(uint64(l)) + } + return n +} + +func (m *RequestExtendVote) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = len(m.Hash) + if l > 0 { + n += 1 + l + sovTypes(uint64(l)) + } + if m.Height != 0 { + n += 1 + sovTypes(uint64(m.Height)) + } + return n +} + +func (m *RequestVerifyVoteExtension) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = len(m.Hash) + if l > 0 { + n += 1 + l + sovTypes(uint64(l)) + } + l = len(m.ValidatorProTxHash) + if l > 0 { + n += 1 + l + sovTypes(uint64(l)) + } + if m.Height != 0 { + n += 1 + sovTypes(uint64(m.Height)) + } + l = len(m.VoteExtension) + if l > 0 { + n += 1 + l + sovTypes(uint64(l)) + } + return n +} + +func (m *RequestFinalizeBlock) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if len(m.Txs) > 0 { + for _, b := range m.Txs { + l = len(b) + n += 1 + l + sovTypes(uint64(l)) + } + } + l = m.DecidedLastCommit.Size() + n += 1 + l + sovTypes(uint64(l)) + if len(m.ByzantineValidators) > 0 { + for _, e := range m.ByzantineValidators { + l = e.Size() + n += 1 + l + sovTypes(uint64(l)) + } + } + l = len(m.Hash) + if l > 0 { + n += 1 + l + sovTypes(uint64(l)) + } + if m.Height != 0 { + n += 1 + sovTypes(uint64(m.Height)) + } + l = github_com_gogo_protobuf_types.SizeOfStdTime(m.Time) + n += 1 + l + sovTypes(uint64(l)) + l = len(m.NextValidatorsHash) + if l > 0 { + n += 1 + l + sovTypes(uint64(l)) + } + l = len(m.ProposerProTxHash) + if l > 0 { + n += 1 + l + sovTypes(uint64(l)) + } + return n +} + +func (m *Response) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.Value != nil { + n += m.Value.Size() + } + return n +} + +func (m *Response_Exception) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.Exception != nil { + l = m.Exception.Size() + n += 1 + l + sovTypes(uint64(l)) + } + return n +} +func (m *Response_Echo) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.Echo != nil { + l = m.Echo.Size() + n += 1 + l + sovTypes(uint64(l)) + } + return n +} +func (m *Response_Flush) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.Flush != nil { + l = m.Flush.Size() + n += 1 + l + sovTypes(uint64(l)) + } + return n +} +func (m *Response_Info) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.Info != nil { + l = m.Info.Size() + n += 1 + l + sovTypes(uint64(l)) + } + return n +} +func (m *Response_InitChain) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.InitChain != nil { + l = m.InitChain.Size() + n += 1 + l + sovTypes(uint64(l)) + } + return n +} +func (m *Response_Query) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.Query != nil { + l = m.Query.Size() + n += 1 + l + sovTypes(uint64(l)) + } + return n +} +func (m *Response_BeginBlock) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.BeginBlock != nil { + l = m.BeginBlock.Size() + n += 1 + l + sovTypes(uint64(l)) + } + return n +} +func (m *Response_CheckTx) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.CheckTx != nil { + l = m.CheckTx.Size() + n += 1 + l + sovTypes(uint64(l)) + } + return n +} +func (m *Response_DeliverTx) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.DeliverTx != nil { + l = m.DeliverTx.Size() + n += 1 + l + sovTypes(uint64(l)) + } + return n +} +func (m *Response_EndBlock) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.EndBlock != nil { + l = m.EndBlock.Size() + n += 1 + l + sovTypes(uint64(l)) + } + return n +} +func (m *Response_Commit) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.Commit != nil { + l = m.Commit.Size() + n += 1 + l + sovTypes(uint64(l)) + } + return n +} +func (m *Response_ListSnapshots) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.ListSnapshots != nil { + l = m.ListSnapshots.Size() + n += 1 + l + sovTypes(uint64(l)) + } + return n +} +func (m *Response_OfferSnapshot) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.OfferSnapshot != nil { + l = m.OfferSnapshot.Size() + n += 1 + l + sovTypes(uint64(l)) + } + return n +} +func (m *Response_LoadSnapshotChunk) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.LoadSnapshotChunk != nil { + l = m.LoadSnapshotChunk.Size() + n += 1 + l + sovTypes(uint64(l)) + } + return n +} +func (m *Response_ApplySnapshotChunk) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.ApplySnapshotChunk != nil { + l = m.ApplySnapshotChunk.Size() + n += 1 + l + sovTypes(uint64(l)) + } + return n +} +func (m *Response_PrepareProposal) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.PrepareProposal != nil { + l = m.PrepareProposal.Size() + n += 2 + l + sovTypes(uint64(l)) + } + return n +} +func (m *Response_ProcessProposal) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.ProcessProposal != nil { + l = m.ProcessProposal.Size() + n += 2 + l + sovTypes(uint64(l)) + } + return n +} +func (m *Response_ExtendVote) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.ExtendVote != nil { + l = m.ExtendVote.Size() + n += 2 + l + sovTypes(uint64(l)) + } + return n +} +func (m *Response_VerifyVoteExtension) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.VerifyVoteExtension != nil { + l = m.VerifyVoteExtension.Size() + n += 2 + l + sovTypes(uint64(l)) + } + return n +} +func (m *Response_FinalizeBlock) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.FinalizeBlock != nil { + l = m.FinalizeBlock.Size() + n += 2 + l + sovTypes(uint64(l)) + } + return n +} +func (m *ResponseException) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = len(m.Error) + if l > 0 { + n += 1 + l + sovTypes(uint64(l)) + } + return n +} + +func (m *ResponseEcho) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = len(m.Message) + if l > 0 { + n += 1 + l + sovTypes(uint64(l)) + } + return n +} + +func (m *ResponseFlush) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + return n +} + +func (m *ResponseInfo) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = len(m.Data) + if l > 0 { + n += 1 + l + sovTypes(uint64(l)) + } + l = len(m.Version) + if l > 0 { + n += 1 + l + sovTypes(uint64(l)) + } + if m.AppVersion != 0 { + n += 1 + sovTypes(uint64(m.AppVersion)) + } + if m.LastBlockHeight != 0 { + n += 1 + sovTypes(uint64(m.LastBlockHeight)) + } + l = len(m.LastBlockAppHash) + if l > 0 { + n += 1 + l + sovTypes(uint64(l)) + } + return n +} + +func (m *ResponseInitChain) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.ConsensusParams != nil { + l = m.ConsensusParams.Size() + n += 1 + l + sovTypes(uint64(l)) + } + l = len(m.AppHash) + if l > 0 { + n += 1 + l + sovTypes(uint64(l)) + } + l = m.ValidatorSetUpdate.Size() + n += 2 + l + sovTypes(uint64(l)) + if m.NextCoreChainLockUpdate != nil { + l = m.NextCoreChainLockUpdate.Size() + n += 2 + l + sovTypes(uint64(l)) + } + if m.InitialCoreHeight != 0 { + n += 2 + sovTypes(uint64(m.InitialCoreHeight)) + } + return n +} + +func (m *ResponseQuery) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.Code != 0 { + n += 1 + sovTypes(uint64(m.Code)) + } + l = len(m.Log) + if l > 0 { + n += 1 + l + sovTypes(uint64(l)) + } + l = len(m.Info) + if l > 0 { + n += 1 + l + sovTypes(uint64(l)) + } + if m.Index != 0 { + n += 1 + sovTypes(uint64(m.Index)) + } + l = len(m.Key) + if l > 0 { + n += 1 + l + sovTypes(uint64(l)) + } + l = len(m.Value) + if l > 0 { + n += 1 + l + sovTypes(uint64(l)) + } + if m.ProofOps != nil { + l = m.ProofOps.Size() + n += 1 + l + sovTypes(uint64(l)) + } + if m.Height != 0 { + n += 1 + sovTypes(uint64(m.Height)) + } + l = len(m.Codespace) + if l > 0 { + n += 1 + l + sovTypes(uint64(l)) + } + return n +} + +func (m *ResponseBeginBlock) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if len(m.Events) > 0 { + for _, e := range m.Events { + l = e.Size() + n += 1 + l + sovTypes(uint64(l)) + } + } + return n +} + +func (m *ResponseCheckTx) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.Code != 0 { + n += 1 + sovTypes(uint64(m.Code)) + } + l = len(m.Data) + if l > 0 { + n += 1 + l + sovTypes(uint64(l)) + } + l = len(m.Log) + if l > 0 { + n += 1 + l + sovTypes(uint64(l)) + } + l = len(m.Info) + if l > 0 { + n += 1 + l + sovTypes(uint64(l)) + } + if m.GasWanted != 0 { + n += 1 + sovTypes(uint64(m.GasWanted)) + } + if m.GasUsed != 0 { + n += 1 + sovTypes(uint64(m.GasUsed)) + } + if len(m.Events) > 0 { + for _, e := range m.Events { + l = e.Size() + n += 1 + l + sovTypes(uint64(l)) + } + } + l = len(m.Codespace) + if l > 0 { + n += 1 + l + sovTypes(uint64(l)) + } + l = len(m.Sender) + if l > 0 { + n += 1 + l + sovTypes(uint64(l)) + } + if m.Priority != 0 { + n += 1 + sovTypes(uint64(m.Priority)) + } + l = len(m.MempoolError) + if l > 0 { + n += 1 + l + sovTypes(uint64(l)) + } + return n +} + +func (m *ResponseDeliverTx) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.Code != 0 { + n += 1 + sovTypes(uint64(m.Code)) + } + l = len(m.Data) + if l > 0 { + n += 1 + l + sovTypes(uint64(l)) + } + l = len(m.Log) + if l > 0 { + n += 1 + l + sovTypes(uint64(l)) + } + l = len(m.Info) + if l > 0 { + n += 1 + l + sovTypes(uint64(l)) + } + if m.GasWanted != 0 { + n += 1 + sovTypes(uint64(m.GasWanted)) + } + if m.GasUsed != 0 { + n += 1 + sovTypes(uint64(m.GasUsed)) + } + if len(m.Events) > 0 { + for _, e := range m.Events { + l = e.Size() + n += 1 + l + sovTypes(uint64(l)) + } + } + l = len(m.Codespace) + if l > 0 { + n += 1 + l + sovTypes(uint64(l)) + } + return n +} + +func (m *ResponseEndBlock) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.ConsensusParamUpdates != nil { + l = m.ConsensusParamUpdates.Size() + n += 1 + l + sovTypes(uint64(l)) + } + if len(m.Events) > 0 { + for _, e := range m.Events { + l = e.Size() + n += 1 + l + sovTypes(uint64(l)) + } + } + if m.NextCoreChainLockUpdate != nil { + l = m.NextCoreChainLockUpdate.Size() + n += 2 + l + sovTypes(uint64(l)) + } + if m.ValidatorSetUpdate != nil { + l = m.ValidatorSetUpdate.Size() + n += 2 + l + sovTypes(uint64(l)) + } + return n +} + +func (m *ResponseCommit) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = len(m.Data) + if l > 0 { + n += 1 + l + sovTypes(uint64(l)) + } + if m.RetainHeight != 0 { + n += 1 + sovTypes(uint64(m.RetainHeight)) + } + return n +} + +func (m *ResponseListSnapshots) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if len(m.Snapshots) > 0 { + for _, e := range m.Snapshots { + l = e.Size() + n += 1 + l + sovTypes(uint64(l)) + } + } + return n +} + +func (m *ResponseOfferSnapshot) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.Result != 0 { + n += 1 + sovTypes(uint64(m.Result)) + } + return n +} + +func (m *ResponseLoadSnapshotChunk) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = len(m.Chunk) + if l > 0 { + n += 1 + l + sovTypes(uint64(l)) + } + return n +} + +func (m *ResponseApplySnapshotChunk) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.Result != 0 { + n += 1 + sovTypes(uint64(m.Result)) + } + if len(m.RefetchChunks) > 0 { + l = 0 + for _, e := range m.RefetchChunks { + l += sovTypes(uint64(e)) + } + n += 1 + sovTypes(uint64(l)) + l + } + if len(m.RejectSenders) > 0 { + for _, s := range m.RejectSenders { + l = len(s) + n += 1 + l + sovTypes(uint64(l)) + } + } + return n +} + +func (m *ResponsePrepareProposal) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if len(m.TxRecords) > 0 { + for _, e := range m.TxRecords { + l = e.Size() + n += 1 + l + sovTypes(uint64(l)) + } + } + l = len(m.AppHash) + if l > 0 { + n += 1 + l + sovTypes(uint64(l)) + } + if len(m.TxResults) > 0 { + for _, e := range m.TxResults { + l = e.Size() + n += 1 + l + sovTypes(uint64(l)) + } + } + if len(m.ValidatorUpdates) > 0 { + for _, e := range m.ValidatorUpdates { + l = e.Size() + n += 1 + l + sovTypes(uint64(l)) + } + } + if m.ConsensusParamUpdates != nil { + l = m.ConsensusParamUpdates.Size() + n += 1 + l + sovTypes(uint64(l)) + } + return n +} + +func (m *ResponseProcessProposal) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.Status != 0 { + n += 1 + sovTypes(uint64(m.Status)) + } + l = len(m.AppHash) + if l > 0 { + n += 1 + l + sovTypes(uint64(l)) + } + if len(m.TxResults) > 0 { + for _, e := range m.TxResults { + l = e.Size() + n += 1 + l + sovTypes(uint64(l)) + } + } + if len(m.ValidatorUpdates) > 0 { + for _, e := range m.ValidatorUpdates { + l = e.Size() + n += 1 + l + sovTypes(uint64(l)) + } + } + if m.ConsensusParamUpdates != nil { + l = m.ConsensusParamUpdates.Size() + n += 1 + l + sovTypes(uint64(l)) + } + return n +} + +func (m *ResponseExtendVote) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = len(m.VoteExtension) + if l > 0 { + n += 1 + l + sovTypes(uint64(l)) + } + return n +} + +func (m *ResponseVerifyVoteExtension) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.Status != 0 { + n += 1 + sovTypes(uint64(m.Status)) + } + return n +} + +func (m *ResponseFinalizeBlock) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if len(m.Events) > 0 { + for _, e := range m.Events { + l = e.Size() + n += 1 + l + sovTypes(uint64(l)) + } + } + if len(m.TxResults) > 0 { + for _, e := range m.TxResults { + l = e.Size() + n += 1 + l + sovTypes(uint64(l)) + } + } + if m.ConsensusParamUpdates != nil { + l = m.ConsensusParamUpdates.Size() + n += 1 + l + sovTypes(uint64(l)) + } + l = len(m.AppHash) + if l > 0 { + n += 1 + l + sovTypes(uint64(l)) + } + if m.RetainHeight != 0 { + n += 1 + sovTypes(uint64(m.RetainHeight)) + } + if m.NextCoreChainLockUpdate != nil { + l = m.NextCoreChainLockUpdate.Size() + n += 2 + l + sovTypes(uint64(l)) + } + if m.ValidatorSetUpdate != nil { + l = m.ValidatorSetUpdate.Size() + n += 2 + l + sovTypes(uint64(l)) + } + return n +} + +func (m *CommitInfo) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.Round != 0 { + n += 1 + sovTypes(uint64(m.Round)) + } + l = len(m.QuorumHash) + if l > 0 { + n += 1 + l + sovTypes(uint64(l)) + } + l = len(m.BlockSignature) + if l > 0 { + n += 1 + l + sovTypes(uint64(l)) + } + l = len(m.StateSignature) + if l > 0 { + n += 1 + l + sovTypes(uint64(l)) + } + return n +} + +func (m *ExtendedCommitInfo) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.Round != 0 { + n += 1 + sovTypes(uint64(m.Round)) + } + if len(m.Votes) > 0 { + for _, e := range m.Votes { + l = e.Size() + n += 1 + l + sovTypes(uint64(l)) + } + } + return n +} + +func (m *Event) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = len(m.Type) + if l > 0 { + n += 1 + l + sovTypes(uint64(l)) + } + if len(m.Attributes) > 0 { + for _, e := range m.Attributes { + l = e.Size() + n += 1 + l + sovTypes(uint64(l)) + } + } + return n +} + +func (m *EventAttribute) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = len(m.Key) + if l > 0 { + n += 1 + l + sovTypes(uint64(l)) + } + l = len(m.Value) + if l > 0 { + n += 1 + l + sovTypes(uint64(l)) + } + if m.Index { + n += 2 + } + return n +} + +func (m *ExecTxResult) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.Code != 0 { + n += 1 + sovTypes(uint64(m.Code)) + } + l = len(m.Data) + if l > 0 { + n += 1 + l + sovTypes(uint64(l)) + } + l = len(m.Log) + if l > 0 { + n += 1 + l + sovTypes(uint64(l)) + } + l = len(m.Info) + if l > 0 { + n += 1 + l + sovTypes(uint64(l)) + } + if m.GasWanted != 0 { + n += 1 + sovTypes(uint64(m.GasWanted)) + } + if m.GasUsed != 0 { + n += 1 + sovTypes(uint64(m.GasUsed)) + } + if len(m.Events) > 0 { + for _, e := range m.Events { + l = e.Size() + n += 1 + l + sovTypes(uint64(l)) + } + } + l = len(m.Codespace) + if l > 0 { + n += 1 + l + sovTypes(uint64(l)) + } + return n +} + +func (m *TxResult) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.Height != 0 { + n += 1 + sovTypes(uint64(m.Height)) + } + if m.Index != 0 { + n += 1 + sovTypes(uint64(m.Index)) + } + l = len(m.Tx) + if l > 0 { + n += 1 + l + sovTypes(uint64(l)) + } + l = m.Result.Size() + n += 1 + l + sovTypes(uint64(l)) + return n +} + +func (m *TxRecord) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.Action != 0 { + n += 1 + sovTypes(uint64(m.Action)) + } + l = len(m.Tx) + if l > 0 { + n += 1 + l + sovTypes(uint64(l)) + } + return n +} + +func (m *Validator) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.Power != 0 { + n += 1 + sovTypes(uint64(m.Power)) + } + l = len(m.ProTxHash) + if l > 0 { + n += 1 + l + sovTypes(uint64(l)) + } + return n +} + +func (m *ValidatorUpdate) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.PubKey != nil { + l = m.PubKey.Size() + n += 1 + l + sovTypes(uint64(l)) + } + if m.Power != 0 { + n += 1 + sovTypes(uint64(m.Power)) + } + l = len(m.ProTxHash) + if l > 0 { + n += 1 + l + sovTypes(uint64(l)) + } + l = len(m.NodeAddress) + if l > 0 { + n += 1 + l + sovTypes(uint64(l)) + } + return n +} + +func (m *ValidatorSetUpdate) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if len(m.ValidatorUpdates) > 0 { + for _, e := range m.ValidatorUpdates { + l = e.Size() + n += 1 + l + sovTypes(uint64(l)) + } + } + l = m.ThresholdPublicKey.Size() + n += 1 + l + sovTypes(uint64(l)) + l = len(m.QuorumHash) + if l > 0 { + n += 1 + l + sovTypes(uint64(l)) + } + return n +} + +func (m *ThresholdPublicKeyUpdate) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = m.ThresholdPublicKey.Size() + n += 1 + l + sovTypes(uint64(l)) + return n +} + +func (m *QuorumHashUpdate) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = len(m.QuorumHash) + if l > 0 { + n += 1 + l + sovTypes(uint64(l)) + } + return n +} + +func (m *VoteInfo) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = m.Validator.Size() + n += 1 + l + sovTypes(uint64(l)) + if m.SignedLastBlock { + n += 2 + } + return n +} + +func (m *ExtendedVoteInfo) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = m.Validator.Size() + n += 1 + l + sovTypes(uint64(l)) + if m.SignedLastBlock { + n += 2 + } + l = len(m.VoteExtension) + if l > 0 { + n += 1 + l + sovTypes(uint64(l)) + } + return n +} + +func (m *Misbehavior) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.Type != 0 { + n += 1 + sovTypes(uint64(m.Type)) + } + l = m.Validator.Size() + n += 1 + l + sovTypes(uint64(l)) + if m.Height != 0 { + n += 1 + sovTypes(uint64(m.Height)) + } + l = github_com_gogo_protobuf_types.SizeOfStdTime(m.Time) n += 1 + l + sovTypes(uint64(l)) if m.TotalVotingPower != 0 { n += 1 + sovTypes(uint64(m.TotalVotingPower)) } - return n -} + return n +} + +func (m *Snapshot) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.Height != 0 { + n += 1 + sovTypes(uint64(m.Height)) + } + if m.Format != 0 { + n += 1 + sovTypes(uint64(m.Format)) + } + if m.Chunks != 0 { + n += 1 + sovTypes(uint64(m.Chunks)) + } + l = len(m.Hash) + if l > 0 { + n += 1 + l + sovTypes(uint64(l)) + } + l = len(m.Metadata) + if l > 0 { + n += 1 + l + sovTypes(uint64(l)) + } + if m.CoreChainLockedHeight != 0 { + n += 2 + sovTypes(uint64(m.CoreChainLockedHeight)) + } + return n +} + +func sovTypes(x uint64) (n int) { + return (math_bits.Len64(x|1) + 6) / 7 +} +func sozTypes(x uint64) (n int) { + return sovTypes(uint64((x << 1) ^ uint64((int64(x) >> 63)))) +} +func (m *Request) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTypes + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: Request: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: Request: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Echo", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTypes + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthTypes + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthTypes + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + v := &RequestEcho{} + if err := v.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + m.Value = &Request_Echo{v} + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Flush", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTypes + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthTypes + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthTypes + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + v := &RequestFlush{} + if err := v.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + m.Value = &Request_Flush{v} + iNdEx = postIndex + case 3: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Info", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTypes + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthTypes + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthTypes + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + v := &RequestInfo{} + if err := v.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + m.Value = &Request_Info{v} + iNdEx = postIndex + case 4: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field InitChain", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTypes + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthTypes + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthTypes + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + v := &RequestInitChain{} + if err := v.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + m.Value = &Request_InitChain{v} + iNdEx = postIndex + case 5: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Query", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTypes + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthTypes + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthTypes + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + v := &RequestQuery{} + if err := v.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + m.Value = &Request_Query{v} + iNdEx = postIndex + case 6: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field BeginBlock", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTypes + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthTypes + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthTypes + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + v := &RequestBeginBlock{} + if err := v.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + m.Value = &Request_BeginBlock{v} + iNdEx = postIndex + case 7: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field CheckTx", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTypes + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthTypes + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthTypes + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + v := &RequestCheckTx{} + if err := v.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + m.Value = &Request_CheckTx{v} + iNdEx = postIndex + case 8: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field DeliverTx", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTypes + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthTypes + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthTypes + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + v := &RequestDeliverTx{} + if err := v.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + m.Value = &Request_DeliverTx{v} + iNdEx = postIndex + case 9: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field EndBlock", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTypes + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthTypes + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthTypes + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + v := &RequestEndBlock{} + if err := v.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + m.Value = &Request_EndBlock{v} + iNdEx = postIndex + case 10: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Commit", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTypes + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthTypes + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthTypes + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + v := &RequestCommit{} + if err := v.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + m.Value = &Request_Commit{v} + iNdEx = postIndex + case 11: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field ListSnapshots", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTypes + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthTypes + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthTypes + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + v := &RequestListSnapshots{} + if err := v.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + m.Value = &Request_ListSnapshots{v} + iNdEx = postIndex + case 12: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field OfferSnapshot", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTypes + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthTypes + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthTypes + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + v := &RequestOfferSnapshot{} + if err := v.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + m.Value = &Request_OfferSnapshot{v} + iNdEx = postIndex + case 13: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field LoadSnapshotChunk", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTypes + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthTypes + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthTypes + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + v := &RequestLoadSnapshotChunk{} + if err := v.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + m.Value = &Request_LoadSnapshotChunk{v} + iNdEx = postIndex + case 14: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field ApplySnapshotChunk", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTypes + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthTypes + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthTypes + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + v := &RequestApplySnapshotChunk{} + if err := v.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + m.Value = &Request_ApplySnapshotChunk{v} + iNdEx = postIndex + case 15: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field PrepareProposal", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTypes + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthTypes + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthTypes + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + v := &RequestPrepareProposal{} + if err := v.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + m.Value = &Request_PrepareProposal{v} + iNdEx = postIndex + case 16: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field ProcessProposal", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTypes + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthTypes + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthTypes + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + v := &RequestProcessProposal{} + if err := v.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + m.Value = &Request_ProcessProposal{v} + iNdEx = postIndex + case 17: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field ExtendVote", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTypes + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthTypes + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthTypes + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + v := &RequestExtendVote{} + if err := v.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + m.Value = &Request_ExtendVote{v} + iNdEx = postIndex + case 18: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field VerifyVoteExtension", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTypes + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthTypes + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthTypes + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + v := &RequestVerifyVoteExtension{} + if err := v.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + m.Value = &Request_VerifyVoteExtension{v} + iNdEx = postIndex + case 19: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field FinalizeBlock", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTypes + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthTypes + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthTypes + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + v := &RequestFinalizeBlock{} + if err := v.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + m.Value = &Request_FinalizeBlock{v} + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipTypes(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthTypes + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *RequestEcho) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTypes + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: RequestEcho: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: RequestEcho: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Message", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTypes + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthTypes + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthTypes + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Message = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipTypes(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthTypes + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *RequestFlush) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTypes + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: RequestFlush: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: RequestFlush: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + default: + iNdEx = preIndex + skippy, err := skipTypes(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthTypes + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *RequestInfo) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTypes + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: RequestInfo: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: RequestInfo: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Version", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTypes + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthTypes + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthTypes + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Version = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 2: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field BlockVersion", wireType) + } + m.BlockVersion = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTypes + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.BlockVersion |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + case 3: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field P2PVersion", wireType) + } + m.P2PVersion = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTypes + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.P2PVersion |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + case 4: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field AbciVersion", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTypes + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthTypes + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthTypes + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.AbciVersion = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipTypes(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthTypes + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *RequestInitChain) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTypes + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: RequestInitChain: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: RequestInitChain: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Time", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTypes + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthTypes + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthTypes + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if err := github_com_gogo_protobuf_types.StdTimeUnmarshal(&m.Time, dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field ChainId", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTypes + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthTypes + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthTypes + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.ChainId = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 3: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field ConsensusParams", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTypes + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthTypes + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthTypes + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.ConsensusParams == nil { + m.ConsensusParams = &types1.ConsensusParams{} + } + if err := m.ConsensusParams.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 4: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field ValidatorSet", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTypes + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthTypes + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthTypes + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.ValidatorSet == nil { + m.ValidatorSet = &ValidatorSetUpdate{} + } + if err := m.ValidatorSet.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 5: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field AppStateBytes", wireType) + } + var byteLen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTypes + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + byteLen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if byteLen < 0 { + return ErrInvalidLengthTypes + } + postIndex := iNdEx + byteLen + if postIndex < 0 { + return ErrInvalidLengthTypes + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.AppStateBytes = append(m.AppStateBytes[:0], dAtA[iNdEx:postIndex]...) + if m.AppStateBytes == nil { + m.AppStateBytes = []byte{} + } + iNdEx = postIndex + case 6: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field InitialHeight", wireType) + } + m.InitialHeight = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTypes + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.InitialHeight |= int64(b&0x7F) << shift + if b < 0x80 { + break + } + } + case 7: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field InitialCoreHeight", wireType) + } + m.InitialCoreHeight = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTypes + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.InitialCoreHeight |= uint32(b&0x7F) << shift + if b < 0x80 { + break + } + } + default: + iNdEx = preIndex + skippy, err := skipTypes(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthTypes + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *RequestQuery) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTypes + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: RequestQuery: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: RequestQuery: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Data", wireType) + } + var byteLen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTypes + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + byteLen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if byteLen < 0 { + return ErrInvalidLengthTypes + } + postIndex := iNdEx + byteLen + if postIndex < 0 { + return ErrInvalidLengthTypes + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Data = append(m.Data[:0], dAtA[iNdEx:postIndex]...) + if m.Data == nil { + m.Data = []byte{} + } + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Path", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTypes + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthTypes + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthTypes + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Path = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 3: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field Height", wireType) + } + m.Height = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTypes + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.Height |= int64(b&0x7F) << shift + if b < 0x80 { + break + } + } + case 4: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field Prove", wireType) + } + var v int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTypes + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + m.Prove = bool(v != 0) + default: + iNdEx = preIndex + skippy, err := skipTypes(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthTypes + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *RequestBeginBlock) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTypes + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: RequestBeginBlock: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: RequestBeginBlock: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Hash", wireType) + } + var byteLen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTypes + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + byteLen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if byteLen < 0 { + return ErrInvalidLengthTypes + } + postIndex := iNdEx + byteLen + if postIndex < 0 { + return ErrInvalidLengthTypes + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Hash = append(m.Hash[:0], dAtA[iNdEx:postIndex]...) + if m.Hash == nil { + m.Hash = []byte{} + } + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Header", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTypes + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthTypes + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthTypes + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if err := m.Header.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 3: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field LastCommitInfo", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTypes + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthTypes + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthTypes + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if err := m.LastCommitInfo.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 4: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field ByzantineValidators", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTypes + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthTypes + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthTypes + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.ByzantineValidators = append(m.ByzantineValidators, Misbehavior{}) + if err := m.ByzantineValidators[len(m.ByzantineValidators)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipTypes(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthTypes + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *RequestCheckTx) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTypes + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: RequestCheckTx: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: RequestCheckTx: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Tx", wireType) + } + var byteLen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTypes + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + byteLen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if byteLen < 0 { + return ErrInvalidLengthTypes + } + postIndex := iNdEx + byteLen + if postIndex < 0 { + return ErrInvalidLengthTypes + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Tx = append(m.Tx[:0], dAtA[iNdEx:postIndex]...) + if m.Tx == nil { + m.Tx = []byte{} + } + iNdEx = postIndex + case 2: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field Type", wireType) + } + m.Type = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTypes + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.Type |= CheckTxType(b&0x7F) << shift + if b < 0x80 { + break + } + } + default: + iNdEx = preIndex + skippy, err := skipTypes(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthTypes + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *RequestDeliverTx) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTypes + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: RequestDeliverTx: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: RequestDeliverTx: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Tx", wireType) + } + var byteLen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTypes + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + byteLen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if byteLen < 0 { + return ErrInvalidLengthTypes + } + postIndex := iNdEx + byteLen + if postIndex < 0 { + return ErrInvalidLengthTypes + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Tx = append(m.Tx[:0], dAtA[iNdEx:postIndex]...) + if m.Tx == nil { + m.Tx = []byte{} + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipTypes(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthTypes + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *RequestEndBlock) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTypes + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: RequestEndBlock: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: RequestEndBlock: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field Height", wireType) + } + m.Height = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTypes + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.Height |= int64(b&0x7F) << shift + if b < 0x80 { + break + } + } + default: + iNdEx = preIndex + skippy, err := skipTypes(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthTypes + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *RequestCommit) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTypes + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: RequestCommit: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: RequestCommit: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + default: + iNdEx = preIndex + skippy, err := skipTypes(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthTypes + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *RequestListSnapshots) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTypes + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: RequestListSnapshots: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: RequestListSnapshots: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + default: + iNdEx = preIndex + skippy, err := skipTypes(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthTypes + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *RequestOfferSnapshot) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTypes + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: RequestOfferSnapshot: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: RequestOfferSnapshot: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Snapshot", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTypes + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthTypes + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthTypes + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.Snapshot == nil { + m.Snapshot = &Snapshot{} + } + if err := m.Snapshot.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field AppHash", wireType) + } + var byteLen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTypes + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + byteLen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if byteLen < 0 { + return ErrInvalidLengthTypes + } + postIndex := iNdEx + byteLen + if postIndex < 0 { + return ErrInvalidLengthTypes + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.AppHash = append(m.AppHash[:0], dAtA[iNdEx:postIndex]...) + if m.AppHash == nil { + m.AppHash = []byte{} + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipTypes(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthTypes + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *RequestLoadSnapshotChunk) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTypes + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: RequestLoadSnapshotChunk: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: RequestLoadSnapshotChunk: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field Height", wireType) + } + m.Height = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTypes + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.Height |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + case 2: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field Format", wireType) + } + m.Format = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTypes + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.Format |= uint32(b&0x7F) << shift + if b < 0x80 { + break + } + } + case 3: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field Chunk", wireType) + } + m.Chunk = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTypes + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.Chunk |= uint32(b&0x7F) << shift + if b < 0x80 { + break + } + } + default: + iNdEx = preIndex + skippy, err := skipTypes(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthTypes + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *RequestApplySnapshotChunk) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTypes + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: RequestApplySnapshotChunk: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: RequestApplySnapshotChunk: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field Index", wireType) + } + m.Index = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTypes + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.Index |= uint32(b&0x7F) << shift + if b < 0x80 { + break + } + } + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Chunk", wireType) + } + var byteLen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTypes + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + byteLen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if byteLen < 0 { + return ErrInvalidLengthTypes + } + postIndex := iNdEx + byteLen + if postIndex < 0 { + return ErrInvalidLengthTypes + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Chunk = append(m.Chunk[:0], dAtA[iNdEx:postIndex]...) + if m.Chunk == nil { + m.Chunk = []byte{} + } + iNdEx = postIndex + case 3: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Sender", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTypes + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthTypes + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthTypes + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Sender = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipTypes(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthTypes + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *RequestPrepareProposal) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTypes + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: RequestPrepareProposal: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: RequestPrepareProposal: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field MaxTxBytes", wireType) + } + m.MaxTxBytes = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTypes + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.MaxTxBytes |= int64(b&0x7F) << shift + if b < 0x80 { + break + } + } + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Txs", wireType) + } + var byteLen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTypes + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + byteLen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if byteLen < 0 { + return ErrInvalidLengthTypes + } + postIndex := iNdEx + byteLen + if postIndex < 0 { + return ErrInvalidLengthTypes + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Txs = append(m.Txs, make([]byte, postIndex-iNdEx)) + copy(m.Txs[len(m.Txs)-1], dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 3: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field LocalLastCommit", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTypes + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthTypes + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthTypes + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if err := m.LocalLastCommit.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 4: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field ByzantineValidators", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTypes + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthTypes + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthTypes + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.ByzantineValidators = append(m.ByzantineValidators, Misbehavior{}) + if err := m.ByzantineValidators[len(m.ByzantineValidators)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 5: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field Height", wireType) + } + m.Height = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTypes + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.Height |= int64(b&0x7F) << shift + if b < 0x80 { + break + } + } + case 6: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Time", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTypes + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthTypes + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthTypes + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if err := github_com_gogo_protobuf_types.StdTimeUnmarshal(&m.Time, dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 7: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field NextValidatorsHash", wireType) + } + var byteLen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTypes + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + byteLen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if byteLen < 0 { + return ErrInvalidLengthTypes + } + postIndex := iNdEx + byteLen + if postIndex < 0 { + return ErrInvalidLengthTypes + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.NextValidatorsHash = append(m.NextValidatorsHash[:0], dAtA[iNdEx:postIndex]...) + if m.NextValidatorsHash == nil { + m.NextValidatorsHash = []byte{} + } + iNdEx = postIndex + case 8: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field ProposerProTxHash", wireType) + } + var byteLen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTypes + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + byteLen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if byteLen < 0 { + return ErrInvalidLengthTypes + } + postIndex := iNdEx + byteLen + if postIndex < 0 { + return ErrInvalidLengthTypes + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.ProposerProTxHash = append(m.ProposerProTxHash[:0], dAtA[iNdEx:postIndex]...) + if m.ProposerProTxHash == nil { + m.ProposerProTxHash = []byte{} + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipTypes(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthTypes + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } -func (m *Snapshot) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - if m.Height != 0 { - n += 1 + sovTypes(uint64(m.Height)) - } - if m.Format != 0 { - n += 1 + sovTypes(uint64(m.Format)) - } - if m.Chunks != 0 { - n += 1 + sovTypes(uint64(m.Chunks)) - } - l = len(m.Hash) - if l > 0 { - n += 1 + l + sovTypes(uint64(l)) - } - l = len(m.Metadata) - if l > 0 { - n += 1 + l + sovTypes(uint64(l)) - } - if m.CoreChainLockedHeight != 0 { - n += 2 + sovTypes(uint64(m.CoreChainLockedHeight)) + if iNdEx > l { + return io.ErrUnexpectedEOF } - return n -} - -func sovTypes(x uint64) (n int) { - return (math_bits.Len64(x|1) + 6) / 7 -} -func sozTypes(x uint64) (n int) { - return sovTypes(uint64((x << 1) ^ uint64((int64(x) >> 63)))) + return nil } -func (m *Request) Unmarshal(dAtA []byte) error { +func (m *RequestProcessProposal) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 for iNdEx < l { @@ -7707,17 +13320,17 @@ func (m *Request) Unmarshal(dAtA []byte) error { fieldNum := int32(wire >> 3) wireType := int(wire & 0x7) if wireType == 4 { - return fmt.Errorf("proto: Request: wiretype end group for non-group") + return fmt.Errorf("proto: RequestProcessProposal: wiretype end group for non-group") } if fieldNum <= 0 { - return fmt.Errorf("proto: Request: illegal tag %d (wire type %d)", fieldNum, wire) + return fmt.Errorf("proto: RequestProcessProposal: illegal tag %d (wire type %d)", fieldNum, wire) } switch fieldNum { case 1: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Echo", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field Txs", wireType) } - var msglen int + var byteLen int for shift := uint(0); ; shift += 7 { if shift >= 64 { return ErrIntOverflowTypes @@ -7727,30 +13340,27 @@ func (m *Request) Unmarshal(dAtA []byte) error { } b := dAtA[iNdEx] iNdEx++ - msglen |= int(b&0x7F) << shift + byteLen |= int(b&0x7F) << shift if b < 0x80 { break } } - if msglen < 0 { + if byteLen < 0 { return ErrInvalidLengthTypes } - postIndex := iNdEx + msglen + postIndex := iNdEx + byteLen if postIndex < 0 { return ErrInvalidLengthTypes } if postIndex > l { return io.ErrUnexpectedEOF } - v := &RequestEcho{} - if err := v.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - m.Value = &Request_Echo{v} + m.Txs = append(m.Txs, make([]byte, postIndex-iNdEx)) + copy(m.Txs[len(m.Txs)-1], dAtA[iNdEx:postIndex]) iNdEx = postIndex case 2: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Flush", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field ProposedLastCommit", wireType) } var msglen int for shift := uint(0); ; shift += 7 { @@ -7777,15 +13387,13 @@ func (m *Request) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - v := &RequestFlush{} - if err := v.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + if err := m.ProposedLastCommit.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { return err } - m.Value = &Request_Flush{v} iNdEx = postIndex case 3: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Info", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field ByzantineValidators", wireType) } var msglen int for shift := uint(0); ; shift += 7 { @@ -7812,17 +13420,16 @@ func (m *Request) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - v := &RequestInfo{} - if err := v.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + m.ByzantineValidators = append(m.ByzantineValidators, Misbehavior{}) + if err := m.ByzantineValidators[len(m.ByzantineValidators)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { return err } - m.Value = &Request_Info{v} iNdEx = postIndex case 4: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field InitChain", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field Hash", wireType) } - var msglen int + var byteLen int for shift := uint(0); ; shift += 7 { if shift >= 64 { return ErrIntOverflowTypes @@ -7832,32 +13439,31 @@ func (m *Request) Unmarshal(dAtA []byte) error { } b := dAtA[iNdEx] iNdEx++ - msglen |= int(b&0x7F) << shift + byteLen |= int(b&0x7F) << shift if b < 0x80 { break } } - if msglen < 0 { + if byteLen < 0 { return ErrInvalidLengthTypes } - postIndex := iNdEx + msglen + postIndex := iNdEx + byteLen if postIndex < 0 { return ErrInvalidLengthTypes } if postIndex > l { return io.ErrUnexpectedEOF } - v := &RequestInitChain{} - if err := v.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err + m.Hash = append(m.Hash[:0], dAtA[iNdEx:postIndex]...) + if m.Hash == nil { + m.Hash = []byte{} } - m.Value = &Request_InitChain{v} iNdEx = postIndex case 5: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Query", wireType) + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field Height", wireType) } - var msglen int + m.Height = 0 for shift := uint(0); ; shift += 7 { if shift >= 64 { return ErrIntOverflowTypes @@ -7867,30 +13473,14 @@ func (m *Request) Unmarshal(dAtA []byte) error { } b := dAtA[iNdEx] iNdEx++ - msglen |= int(b&0x7F) << shift + m.Height |= int64(b&0x7F) << shift if b < 0x80 { break } } - if msglen < 0 { - return ErrInvalidLengthTypes - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthTypes - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - v := &RequestQuery{} - if err := v.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - m.Value = &Request_Query{v} - iNdEx = postIndex case 6: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field BeginBlock", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field Time", wireType) } var msglen int for shift := uint(0); ; shift += 7 { @@ -7917,17 +13507,15 @@ func (m *Request) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - v := &RequestBeginBlock{} - if err := v.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + if err := github_com_gogo_protobuf_types.StdTimeUnmarshal(&m.Time, dAtA[iNdEx:postIndex]); err != nil { return err } - m.Value = &Request_BeginBlock{v} iNdEx = postIndex case 7: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field CheckTx", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field NextValidatorsHash", wireType) } - var msglen int + var byteLen int for shift := uint(0); ; shift += 7 { if shift >= 64 { return ErrIntOverflowTypes @@ -7937,32 +13525,31 @@ func (m *Request) Unmarshal(dAtA []byte) error { } b := dAtA[iNdEx] iNdEx++ - msglen |= int(b&0x7F) << shift + byteLen |= int(b&0x7F) << shift if b < 0x80 { break } } - if msglen < 0 { + if byteLen < 0 { return ErrInvalidLengthTypes } - postIndex := iNdEx + msglen + postIndex := iNdEx + byteLen if postIndex < 0 { return ErrInvalidLengthTypes } if postIndex > l { return io.ErrUnexpectedEOF } - v := &RequestCheckTx{} - if err := v.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err + m.NextValidatorsHash = append(m.NextValidatorsHash[:0], dAtA[iNdEx:postIndex]...) + if m.NextValidatorsHash == nil { + m.NextValidatorsHash = []byte{} } - m.Value = &Request_CheckTx{v} iNdEx = postIndex case 8: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field DeliverTx", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field ProposerProTxHash", wireType) } - var msglen int + var byteLen int for shift := uint(0); ; shift += 7 { if shift >= 64 { return ErrIntOverflowTypes @@ -7972,32 +13559,81 @@ func (m *Request) Unmarshal(dAtA []byte) error { } b := dAtA[iNdEx] iNdEx++ - msglen |= int(b&0x7F) << shift + byteLen |= int(b&0x7F) << shift if b < 0x80 { break } } - if msglen < 0 { + if byteLen < 0 { return ErrInvalidLengthTypes } - postIndex := iNdEx + msglen + postIndex := iNdEx + byteLen if postIndex < 0 { return ErrInvalidLengthTypes } if postIndex > l { return io.ErrUnexpectedEOF } - v := &RequestDeliverTx{} - if err := v.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err + m.ProposerProTxHash = append(m.ProposerProTxHash[:0], dAtA[iNdEx:postIndex]...) + if m.ProposerProTxHash == nil { + m.ProposerProTxHash = []byte{} } - m.Value = &Request_DeliverTx{v} iNdEx = postIndex - case 9: + default: + iNdEx = preIndex + skippy, err := skipTypes(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthTypes + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *RequestExtendVote) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTypes + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: RequestExtendVote: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: RequestExtendVote: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field EndBlock", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field Hash", wireType) } - var msglen int + var byteLen int for shift := uint(0); ; shift += 7 { if shift >= 64 { return ErrIntOverflowTypes @@ -8007,32 +13643,31 @@ func (m *Request) Unmarshal(dAtA []byte) error { } b := dAtA[iNdEx] iNdEx++ - msglen |= int(b&0x7F) << shift + byteLen |= int(b&0x7F) << shift if b < 0x80 { break } } - if msglen < 0 { + if byteLen < 0 { return ErrInvalidLengthTypes } - postIndex := iNdEx + msglen + postIndex := iNdEx + byteLen if postIndex < 0 { return ErrInvalidLengthTypes } if postIndex > l { return io.ErrUnexpectedEOF } - v := &RequestEndBlock{} - if err := v.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err + m.Hash = append(m.Hash[:0], dAtA[iNdEx:postIndex]...) + if m.Hash == nil { + m.Hash = []byte{} } - m.Value = &Request_EndBlock{v} iNdEx = postIndex - case 10: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Commit", wireType) + case 2: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field Height", wireType) } - var msglen int + m.Height = 0 for shift := uint(0); ; shift += 7 { if shift >= 64 { return ErrIntOverflowTypes @@ -8042,32 +13677,66 @@ func (m *Request) Unmarshal(dAtA []byte) error { } b := dAtA[iNdEx] iNdEx++ - msglen |= int(b&0x7F) << shift + m.Height |= int64(b&0x7F) << shift if b < 0x80 { break } } - if msglen < 0 { - return ErrInvalidLengthTypes + default: + iNdEx = preIndex + skippy, err := skipTypes(dAtA[iNdEx:]) + if err != nil { + return err } - postIndex := iNdEx + msglen - if postIndex < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthTypes } - if postIndex > l { + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *RequestVerifyVoteExtension) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTypes + } + if iNdEx >= l { return io.ErrUnexpectedEOF } - v := &RequestCommit{} - if err := v.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break } - m.Value = &Request_Commit{v} - iNdEx = postIndex - case 11: + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: RequestVerifyVoteExtension: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: RequestVerifyVoteExtension: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field ListSnapshots", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field Hash", wireType) } - var msglen int + var byteLen int for shift := uint(0); ; shift += 7 { if shift >= 64 { return ErrIntOverflowTypes @@ -8077,32 +13746,31 @@ func (m *Request) Unmarshal(dAtA []byte) error { } b := dAtA[iNdEx] iNdEx++ - msglen |= int(b&0x7F) << shift + byteLen |= int(b&0x7F) << shift if b < 0x80 { break } } - if msglen < 0 { + if byteLen < 0 { return ErrInvalidLengthTypes } - postIndex := iNdEx + msglen + postIndex := iNdEx + byteLen if postIndex < 0 { return ErrInvalidLengthTypes } if postIndex > l { return io.ErrUnexpectedEOF } - v := &RequestListSnapshots{} - if err := v.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err + m.Hash = append(m.Hash[:0], dAtA[iNdEx:postIndex]...) + if m.Hash == nil { + m.Hash = []byte{} } - m.Value = &Request_ListSnapshots{v} iNdEx = postIndex - case 12: + case 2: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field OfferSnapshot", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field ValidatorProTxHash", wireType) } - var msglen int + var byteLen int for shift := uint(0); ; shift += 7 { if shift >= 64 { return ErrIntOverflowTypes @@ -8112,32 +13780,31 @@ func (m *Request) Unmarshal(dAtA []byte) error { } b := dAtA[iNdEx] iNdEx++ - msglen |= int(b&0x7F) << shift + byteLen |= int(b&0x7F) << shift if b < 0x80 { break } } - if msglen < 0 { + if byteLen < 0 { return ErrInvalidLengthTypes } - postIndex := iNdEx + msglen + postIndex := iNdEx + byteLen if postIndex < 0 { return ErrInvalidLengthTypes } if postIndex > l { return io.ErrUnexpectedEOF } - v := &RequestOfferSnapshot{} - if err := v.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err + m.ValidatorProTxHash = append(m.ValidatorProTxHash[:0], dAtA[iNdEx:postIndex]...) + if m.ValidatorProTxHash == nil { + m.ValidatorProTxHash = []byte{} } - m.Value = &Request_OfferSnapshot{v} iNdEx = postIndex - case 13: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field LoadSnapshotChunk", wireType) + case 3: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field Height", wireType) } - var msglen int + m.Height = 0 for shift := uint(0); ; shift += 7 { if shift >= 64 { return ErrIntOverflowTypes @@ -8147,32 +13814,16 @@ func (m *Request) Unmarshal(dAtA []byte) error { } b := dAtA[iNdEx] iNdEx++ - msglen |= int(b&0x7F) << shift + m.Height |= int64(b&0x7F) << shift if b < 0x80 { break } } - if msglen < 0 { - return ErrInvalidLengthTypes - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthTypes - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - v := &RequestLoadSnapshotChunk{} - if err := v.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - m.Value = &Request_LoadSnapshotChunk{v} - iNdEx = postIndex - case 14: + case 4: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field ApplySnapshotChunk", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field VoteExtension", wireType) } - var msglen int + var byteLen int for shift := uint(0); ; shift += 7 { if shift >= 64 { return ErrIntOverflowTypes @@ -8182,26 +13833,25 @@ func (m *Request) Unmarshal(dAtA []byte) error { } b := dAtA[iNdEx] iNdEx++ - msglen |= int(b&0x7F) << shift + byteLen |= int(b&0x7F) << shift if b < 0x80 { break } } - if msglen < 0 { + if byteLen < 0 { return ErrInvalidLengthTypes } - postIndex := iNdEx + msglen + postIndex := iNdEx + byteLen if postIndex < 0 { return ErrInvalidLengthTypes } if postIndex > l { return io.ErrUnexpectedEOF } - v := &RequestApplySnapshotChunk{} - if err := v.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err + m.VoteExtension = append(m.VoteExtension[:0], dAtA[iNdEx:postIndex]...) + if m.VoteExtension == nil { + m.VoteExtension = []byte{} } - m.Value = &Request_ApplySnapshotChunk{v} iNdEx = postIndex default: iNdEx = preIndex @@ -8224,7 +13874,7 @@ func (m *Request) Unmarshal(dAtA []byte) error { } return nil } -func (m *RequestEcho) Unmarshal(dAtA []byte) error { +func (m *RequestFinalizeBlock) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 for iNdEx < l { @@ -8247,17 +13897,17 @@ func (m *RequestEcho) Unmarshal(dAtA []byte) error { fieldNum := int32(wire >> 3) wireType := int(wire & 0x7) if wireType == 4 { - return fmt.Errorf("proto: RequestEcho: wiretype end group for non-group") + return fmt.Errorf("proto: RequestFinalizeBlock: wiretype end group for non-group") } if fieldNum <= 0 { - return fmt.Errorf("proto: RequestEcho: illegal tag %d (wire type %d)", fieldNum, wire) + return fmt.Errorf("proto: RequestFinalizeBlock: illegal tag %d (wire type %d)", fieldNum, wire) } switch fieldNum { case 1: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Message", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field Txs", wireType) } - var stringLen uint64 + var byteLen int for shift := uint(0); ; shift += 7 { if shift >= 64 { return ErrIntOverflowTypes @@ -8267,129 +13917,96 @@ func (m *RequestEcho) Unmarshal(dAtA []byte) error { } b := dAtA[iNdEx] iNdEx++ - stringLen |= uint64(b&0x7F) << shift + byteLen |= int(b&0x7F) << shift if b < 0x80 { break } } - intStringLen := int(stringLen) - if intStringLen < 0 { + if byteLen < 0 { return ErrInvalidLengthTypes } - postIndex := iNdEx + intStringLen + postIndex := iNdEx + byteLen if postIndex < 0 { return ErrInvalidLengthTypes } if postIndex > l { return io.ErrUnexpectedEOF } - m.Message = string(dAtA[iNdEx:postIndex]) + m.Txs = append(m.Txs, make([]byte, postIndex-iNdEx)) + copy(m.Txs[len(m.Txs)-1], dAtA[iNdEx:postIndex]) iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipTypes(dAtA[iNdEx:]) - if err != nil { - return err + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field DecidedLastCommit", wireType) } - if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLengthTypes + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTypes + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF + if msglen < 0 { + return ErrInvalidLengthTypes } - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *RequestFlush) Unmarshal(dAtA []byte) error { - l := len(dAtA) - iNdEx := 0 - for iNdEx < l { - preIndex := iNdEx - var wire uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowTypes + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthTypes } - if iNdEx >= l { + if postIndex > l { return io.ErrUnexpectedEOF } - b := dAtA[iNdEx] - iNdEx++ - wire |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - fieldNum := int32(wire >> 3) - wireType := int(wire & 0x7) - if wireType == 4 { - return fmt.Errorf("proto: RequestFlush: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: RequestFlush: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - default: - iNdEx = preIndex - skippy, err := skipTypes(dAtA[iNdEx:]) - if err != nil { + if err := m.DecidedLastCommit.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { return err } - if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLengthTypes + iNdEx = postIndex + case 3: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field ByzantineValidators", wireType) } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTypes + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } } - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *RequestInfo) Unmarshal(dAtA []byte) error { - l := len(dAtA) - iNdEx := 0 - for iNdEx < l { - preIndex := iNdEx - var wire uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowTypes + if msglen < 0 { + return ErrInvalidLengthTypes } - if iNdEx >= l { + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthTypes + } + if postIndex > l { return io.ErrUnexpectedEOF } - b := dAtA[iNdEx] - iNdEx++ - wire |= uint64(b&0x7F) << shift - if b < 0x80 { - break + m.ByzantineValidators = append(m.ByzantineValidators, Misbehavior{}) + if err := m.ByzantineValidators[len(m.ByzantineValidators)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err } - } - fieldNum := int32(wire >> 3) - wireType := int(wire & 0x7) - if wireType == 4 { - return fmt.Errorf("proto: RequestInfo: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: RequestInfo: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: + iNdEx = postIndex + case 4: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Version", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field Hash", wireType) } - var stringLen uint64 + var byteLen int for shift := uint(0); ; shift += 7 { if shift >= 64 { return ErrIntOverflowTypes @@ -8399,29 +14016,31 @@ func (m *RequestInfo) Unmarshal(dAtA []byte) error { } b := dAtA[iNdEx] iNdEx++ - stringLen |= uint64(b&0x7F) << shift + byteLen |= int(b&0x7F) << shift if b < 0x80 { break } } - intStringLen := int(stringLen) - if intStringLen < 0 { + if byteLen < 0 { return ErrInvalidLengthTypes } - postIndex := iNdEx + intStringLen + postIndex := iNdEx + byteLen if postIndex < 0 { return ErrInvalidLengthTypes } if postIndex > l { return io.ErrUnexpectedEOF } - m.Version = string(dAtA[iNdEx:postIndex]) + m.Hash = append(m.Hash[:0], dAtA[iNdEx:postIndex]...) + if m.Hash == nil { + m.Hash = []byte{} + } iNdEx = postIndex - case 2: + case 5: if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field BlockVersion", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field Height", wireType) } - m.BlockVersion = 0 + m.Height = 0 for shift := uint(0); ; shift += 7 { if shift >= 64 { return ErrIntOverflowTypes @@ -8431,16 +14050,16 @@ func (m *RequestInfo) Unmarshal(dAtA []byte) error { } b := dAtA[iNdEx] iNdEx++ - m.BlockVersion |= uint64(b&0x7F) << shift + m.Height |= int64(b&0x7F) << shift if b < 0x80 { break } } - case 3: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field P2PVersion", wireType) + case 6: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Time", wireType) } - m.P2PVersion = 0 + var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { return ErrIntOverflowTypes @@ -8450,16 +14069,30 @@ func (m *RequestInfo) Unmarshal(dAtA []byte) error { } b := dAtA[iNdEx] iNdEx++ - m.P2PVersion |= uint64(b&0x7F) << shift + msglen |= int(b&0x7F) << shift if b < 0x80 { break } } - case 4: + if msglen < 0 { + return ErrInvalidLengthTypes + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthTypes + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if err := github_com_gogo_protobuf_types.StdTimeUnmarshal(&m.Time, dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 7: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field AbciVersion", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field NextValidatorsHash", wireType) } - var stringLen uint64 + var byteLen int for shift := uint(0); ; shift += 7 { if shift >= 64 { return ErrIntOverflowTypes @@ -8469,23 +14102,59 @@ func (m *RequestInfo) Unmarshal(dAtA []byte) error { } b := dAtA[iNdEx] iNdEx++ - stringLen |= uint64(b&0x7F) << shift + byteLen |= int(b&0x7F) << shift if b < 0x80 { break } } - intStringLen := int(stringLen) - if intStringLen < 0 { + if byteLen < 0 { return ErrInvalidLengthTypes } - postIndex := iNdEx + intStringLen + postIndex := iNdEx + byteLen if postIndex < 0 { return ErrInvalidLengthTypes } if postIndex > l { return io.ErrUnexpectedEOF } - m.AbciVersion = string(dAtA[iNdEx:postIndex]) + m.NextValidatorsHash = append(m.NextValidatorsHash[:0], dAtA[iNdEx:postIndex]...) + if m.NextValidatorsHash == nil { + m.NextValidatorsHash = []byte{} + } + iNdEx = postIndex + case 8: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field ProposerProTxHash", wireType) + } + var byteLen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTypes + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + byteLen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if byteLen < 0 { + return ErrInvalidLengthTypes + } + postIndex := iNdEx + byteLen + if postIndex < 0 { + return ErrInvalidLengthTypes + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.ProposerProTxHash = append(m.ProposerProTxHash[:0], dAtA[iNdEx:postIndex]...) + if m.ProposerProTxHash == nil { + m.ProposerProTxHash = []byte{} + } iNdEx = postIndex default: iNdEx = preIndex @@ -8508,7 +14177,7 @@ func (m *RequestInfo) Unmarshal(dAtA []byte) error { } return nil } -func (m *RequestInitChain) Unmarshal(dAtA []byte) error { +func (m *Response) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 for iNdEx < l { @@ -8531,15 +14200,15 @@ func (m *RequestInitChain) Unmarshal(dAtA []byte) error { fieldNum := int32(wire >> 3) wireType := int(wire & 0x7) if wireType == 4 { - return fmt.Errorf("proto: RequestInitChain: wiretype end group for non-group") + return fmt.Errorf("proto: Response: wiretype end group for non-group") } if fieldNum <= 0 { - return fmt.Errorf("proto: RequestInitChain: illegal tag %d (wire type %d)", fieldNum, wire) + return fmt.Errorf("proto: Response: illegal tag %d (wire type %d)", fieldNum, wire) } switch fieldNum { case 1: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Time", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field Exception", wireType) } var msglen int for shift := uint(0); ; shift += 7 { @@ -8566,15 +14235,17 @@ func (m *RequestInitChain) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - if err := github_com_gogo_protobuf_types.StdTimeUnmarshal(&m.Time, dAtA[iNdEx:postIndex]); err != nil { + v := &ResponseException{} + if err := v.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { return err } + m.Value = &Response_Exception{v} iNdEx = postIndex case 2: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field ChainId", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field Echo", wireType) } - var stringLen uint64 + var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { return ErrIntOverflowTypes @@ -8584,27 +14255,30 @@ func (m *RequestInitChain) Unmarshal(dAtA []byte) error { } b := dAtA[iNdEx] iNdEx++ - stringLen |= uint64(b&0x7F) << shift + msglen |= int(b&0x7F) << shift if b < 0x80 { break } } - intStringLen := int(stringLen) - if intStringLen < 0 { + if msglen < 0 { return ErrInvalidLengthTypes } - postIndex := iNdEx + intStringLen + postIndex := iNdEx + msglen if postIndex < 0 { return ErrInvalidLengthTypes } if postIndex > l { return io.ErrUnexpectedEOF } - m.ChainId = string(dAtA[iNdEx:postIndex]) + v := &ResponseEcho{} + if err := v.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + m.Value = &Response_Echo{v} iNdEx = postIndex case 3: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field ConsensusParams", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field Flush", wireType) } var msglen int for shift := uint(0); ; shift += 7 { @@ -8631,16 +14305,15 @@ func (m *RequestInitChain) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - if m.ConsensusParams == nil { - m.ConsensusParams = &types1.ConsensusParams{} - } - if err := m.ConsensusParams.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + v := &ResponseFlush{} + if err := v.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { return err } + m.Value = &Response_Flush{v} iNdEx = postIndex case 4: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field ValidatorSet", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field Info", wireType) } var msglen int for shift := uint(0); ; shift += 7 { @@ -8667,18 +14340,17 @@ func (m *RequestInitChain) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - if m.ValidatorSet == nil { - m.ValidatorSet = &ValidatorSetUpdate{} - } - if err := m.ValidatorSet.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + v := &ResponseInfo{} + if err := v.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { return err } + m.Value = &Response_Info{v} iNdEx = postIndex case 5: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field AppStateBytes", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field InitChain", wireType) } - var byteLen int + var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { return ErrIntOverflowTypes @@ -8688,31 +14360,32 @@ func (m *RequestInitChain) Unmarshal(dAtA []byte) error { } b := dAtA[iNdEx] iNdEx++ - byteLen |= int(b&0x7F) << shift + msglen |= int(b&0x7F) << shift if b < 0x80 { break } } - if byteLen < 0 { + if msglen < 0 { return ErrInvalidLengthTypes } - postIndex := iNdEx + byteLen + postIndex := iNdEx + msglen if postIndex < 0 { return ErrInvalidLengthTypes } if postIndex > l { return io.ErrUnexpectedEOF } - m.AppStateBytes = append(m.AppStateBytes[:0], dAtA[iNdEx:postIndex]...) - if m.AppStateBytes == nil { - m.AppStateBytes = []byte{} + v := &ResponseInitChain{} + if err := v.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err } + m.Value = &Response_InitChain{v} iNdEx = postIndex case 6: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field InitialHeight", wireType) + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Query", wireType) } - m.InitialHeight = 0 + var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { return ErrIntOverflowTypes @@ -8722,16 +14395,32 @@ func (m *RequestInitChain) Unmarshal(dAtA []byte) error { } b := dAtA[iNdEx] iNdEx++ - m.InitialHeight |= int64(b&0x7F) << shift + msglen |= int(b&0x7F) << shift if b < 0x80 { break } } + if msglen < 0 { + return ErrInvalidLengthTypes + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthTypes + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + v := &ResponseQuery{} + if err := v.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + m.Value = &Response_Query{v} + iNdEx = postIndex case 7: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field InitialCoreHeight", wireType) + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field BeginBlock", wireType) } - m.InitialCoreHeight = 0 + var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { return ErrIntOverflowTypes @@ -8741,66 +14430,67 @@ func (m *RequestInitChain) Unmarshal(dAtA []byte) error { } b := dAtA[iNdEx] iNdEx++ - m.InitialCoreHeight |= uint32(b&0x7F) << shift + msglen |= int(b&0x7F) << shift if b < 0x80 { break } } - default: - iNdEx = preIndex - skippy, err := skipTypes(dAtA[iNdEx:]) - if err != nil { - return err + if msglen < 0 { + return ErrInvalidLengthTypes } - if (skippy < 0) || (iNdEx+skippy) < 0 { + postIndex := iNdEx + msglen + if postIndex < 0 { return ErrInvalidLengthTypes } - if (iNdEx + skippy) > l { + if postIndex > l { return io.ErrUnexpectedEOF } - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *RequestQuery) Unmarshal(dAtA []byte) error { - l := len(dAtA) - iNdEx := 0 - for iNdEx < l { - preIndex := iNdEx - var wire uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowTypes + v := &ResponseBeginBlock{} + if err := v.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err } - if iNdEx >= l { - return io.ErrUnexpectedEOF + m.Value = &Response_BeginBlock{v} + iNdEx = postIndex + case 8: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field CheckTx", wireType) } - b := dAtA[iNdEx] - iNdEx++ - wire |= uint64(b&0x7F) << shift - if b < 0x80 { - break + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTypes + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthTypes + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthTypes + } + if postIndex > l { + return io.ErrUnexpectedEOF } - } - fieldNum := int32(wire >> 3) - wireType := int(wire & 0x7) - if wireType == 4 { - return fmt.Errorf("proto: RequestQuery: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: RequestQuery: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: + v := &ResponseCheckTx{} + if err := v.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + m.Value = &Response_CheckTx{v} + iNdEx = postIndex + case 9: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Data", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field DeliverTx", wireType) } - var byteLen int + var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { return ErrIntOverflowTypes @@ -8810,31 +14500,32 @@ func (m *RequestQuery) Unmarshal(dAtA []byte) error { } b := dAtA[iNdEx] iNdEx++ - byteLen |= int(b&0x7F) << shift + msglen |= int(b&0x7F) << shift if b < 0x80 { break } } - if byteLen < 0 { + if msglen < 0 { return ErrInvalidLengthTypes } - postIndex := iNdEx + byteLen + postIndex := iNdEx + msglen if postIndex < 0 { return ErrInvalidLengthTypes } if postIndex > l { return io.ErrUnexpectedEOF } - m.Data = append(m.Data[:0], dAtA[iNdEx:postIndex]...) - if m.Data == nil { - m.Data = []byte{} + v := &ResponseDeliverTx{} + if err := v.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err } + m.Value = &Response_DeliverTx{v} iNdEx = postIndex - case 2: + case 10: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Path", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field EndBlock", wireType) } - var stringLen uint64 + var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { return ErrIntOverflowTypes @@ -8844,29 +14535,32 @@ func (m *RequestQuery) Unmarshal(dAtA []byte) error { } b := dAtA[iNdEx] iNdEx++ - stringLen |= uint64(b&0x7F) << shift + msglen |= int(b&0x7F) << shift if b < 0x80 { break } } - intStringLen := int(stringLen) - if intStringLen < 0 { + if msglen < 0 { return ErrInvalidLengthTypes } - postIndex := iNdEx + intStringLen + postIndex := iNdEx + msglen if postIndex < 0 { return ErrInvalidLengthTypes } if postIndex > l { return io.ErrUnexpectedEOF } - m.Path = string(dAtA[iNdEx:postIndex]) + v := &ResponseEndBlock{} + if err := v.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + m.Value = &Response_EndBlock{v} iNdEx = postIndex - case 3: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field Height", wireType) + case 11: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Commit", wireType) } - m.Height = 0 + var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { return ErrIntOverflowTypes @@ -8876,16 +14570,32 @@ func (m *RequestQuery) Unmarshal(dAtA []byte) error { } b := dAtA[iNdEx] iNdEx++ - m.Height |= int64(b&0x7F) << shift + msglen |= int(b&0x7F) << shift if b < 0x80 { break } } - case 4: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field Prove", wireType) + if msglen < 0 { + return ErrInvalidLengthTypes } - var v int + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthTypes + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + v := &ResponseCommit{} + if err := v.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + m.Value = &Response_Commit{v} + iNdEx = postIndex + case 12: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field ListSnapshots", wireType) + } + var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { return ErrIntOverflowTypes @@ -8895,67 +14605,32 @@ func (m *RequestQuery) Unmarshal(dAtA []byte) error { } b := dAtA[iNdEx] iNdEx++ - v |= int(b&0x7F) << shift + msglen |= int(b&0x7F) << shift if b < 0x80 { break } } - m.Prove = bool(v != 0) - default: - iNdEx = preIndex - skippy, err := skipTypes(dAtA[iNdEx:]) - if err != nil { - return err - } - if (skippy < 0) || (iNdEx+skippy) < 0 { + if msglen < 0 { return ErrInvalidLengthTypes } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *RequestBeginBlock) Unmarshal(dAtA []byte) error { - l := len(dAtA) - iNdEx := 0 - for iNdEx < l { - preIndex := iNdEx - var wire uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowTypes + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthTypes } - if iNdEx >= l { + if postIndex > l { return io.ErrUnexpectedEOF } - b := dAtA[iNdEx] - iNdEx++ - wire |= uint64(b&0x7F) << shift - if b < 0x80 { - break + v := &ResponseListSnapshots{} + if err := v.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err } - } - fieldNum := int32(wire >> 3) - wireType := int(wire & 0x7) - if wireType == 4 { - return fmt.Errorf("proto: RequestBeginBlock: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: RequestBeginBlock: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: + m.Value = &Response_ListSnapshots{v} + iNdEx = postIndex + case 13: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Hash", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field OfferSnapshot", wireType) } - var byteLen int + var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { return ErrIntOverflowTypes @@ -8965,29 +14640,30 @@ func (m *RequestBeginBlock) Unmarshal(dAtA []byte) error { } b := dAtA[iNdEx] iNdEx++ - byteLen |= int(b&0x7F) << shift + msglen |= int(b&0x7F) << shift if b < 0x80 { break } } - if byteLen < 0 { + if msglen < 0 { return ErrInvalidLengthTypes } - postIndex := iNdEx + byteLen + postIndex := iNdEx + msglen if postIndex < 0 { return ErrInvalidLengthTypes } if postIndex > l { return io.ErrUnexpectedEOF } - m.Hash = append(m.Hash[:0], dAtA[iNdEx:postIndex]...) - if m.Hash == nil { - m.Hash = []byte{} + v := &ResponseOfferSnapshot{} + if err := v.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err } + m.Value = &Response_OfferSnapshot{v} iNdEx = postIndex - case 2: + case 14: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Header", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field LoadSnapshotChunk", wireType) } var msglen int for shift := uint(0); ; shift += 7 { @@ -9014,13 +14690,15 @@ func (m *RequestBeginBlock) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - if err := m.Header.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + v := &ResponseLoadSnapshotChunk{} + if err := v.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { return err } + m.Value = &Response_LoadSnapshotChunk{v} iNdEx = postIndex - case 3: + case 15: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field LastCommitInfo", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field ApplySnapshotChunk", wireType) } var msglen int for shift := uint(0); ; shift += 7 { @@ -9047,13 +14725,15 @@ func (m *RequestBeginBlock) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - if err := m.LastCommitInfo.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + v := &ResponseApplySnapshotChunk{} + if err := v.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { return err } + m.Value = &Response_ApplySnapshotChunk{v} iNdEx = postIndex - case 4: + case 16: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field ByzantineValidators", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field PrepareProposal", wireType) } var msglen int for shift := uint(0); ; shift += 7 { @@ -9080,66 +14760,52 @@ func (m *RequestBeginBlock) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - m.ByzantineValidators = append(m.ByzantineValidators, Evidence{}) - if err := m.ByzantineValidators[len(m.ByzantineValidators)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + v := &ResponsePrepareProposal{} + if err := v.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { return err } + m.Value = &Response_PrepareProposal{v} iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipTypes(dAtA[iNdEx:]) - if err != nil { - return err + case 17: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field ProcessProposal", wireType) } - if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLengthTypes + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTypes + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF + if msglen < 0 { + return ErrInvalidLengthTypes } - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *RequestCheckTx) Unmarshal(dAtA []byte) error { - l := len(dAtA) - iNdEx := 0 - for iNdEx < l { - preIndex := iNdEx - var wire uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowTypes + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthTypes } - if iNdEx >= l { + if postIndex > l { return io.ErrUnexpectedEOF } - b := dAtA[iNdEx] - iNdEx++ - wire |= uint64(b&0x7F) << shift - if b < 0x80 { - break + v := &ResponseProcessProposal{} + if err := v.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err } - } - fieldNum := int32(wire >> 3) - wireType := int(wire & 0x7) - if wireType == 4 { - return fmt.Errorf("proto: RequestCheckTx: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: RequestCheckTx: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: + m.Value = &Response_ProcessProposal{v} + iNdEx = postIndex + case 18: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Tx", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field ExtendVote", wireType) } - var byteLen int + var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { return ErrIntOverflowTypes @@ -9149,31 +14815,32 @@ func (m *RequestCheckTx) Unmarshal(dAtA []byte) error { } b := dAtA[iNdEx] iNdEx++ - byteLen |= int(b&0x7F) << shift + msglen |= int(b&0x7F) << shift if b < 0x80 { break } } - if byteLen < 0 { + if msglen < 0 { return ErrInvalidLengthTypes } - postIndex := iNdEx + byteLen + postIndex := iNdEx + msglen if postIndex < 0 { return ErrInvalidLengthTypes } if postIndex > l { return io.ErrUnexpectedEOF } - m.Tx = append(m.Tx[:0], dAtA[iNdEx:postIndex]...) - if m.Tx == nil { - m.Tx = []byte{} + v := &ResponseExtendVote{} + if err := v.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err } + m.Value = &Response_ExtendVote{v} iNdEx = postIndex - case 2: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field Type", wireType) + case 19: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field VerifyVoteExtension", wireType) } - m.Type = 0 + var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { return ErrIntOverflowTypes @@ -9183,66 +14850,32 @@ func (m *RequestCheckTx) Unmarshal(dAtA []byte) error { } b := dAtA[iNdEx] iNdEx++ - m.Type |= CheckTxType(b&0x7F) << shift + msglen |= int(b&0x7F) << shift if b < 0x80 { break } } - default: - iNdEx = preIndex - skippy, err := skipTypes(dAtA[iNdEx:]) - if err != nil { - return err - } - if (skippy < 0) || (iNdEx+skippy) < 0 { + if msglen < 0 { return ErrInvalidLengthTypes } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *RequestDeliverTx) Unmarshal(dAtA []byte) error { - l := len(dAtA) - iNdEx := 0 - for iNdEx < l { - preIndex := iNdEx - var wire uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowTypes + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthTypes } - if iNdEx >= l { + if postIndex > l { return io.ErrUnexpectedEOF } - b := dAtA[iNdEx] - iNdEx++ - wire |= uint64(b&0x7F) << shift - if b < 0x80 { - break + v := &ResponseVerifyVoteExtension{} + if err := v.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err } - } - fieldNum := int32(wire >> 3) - wireType := int(wire & 0x7) - if wireType == 4 { - return fmt.Errorf("proto: RequestDeliverTx: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: RequestDeliverTx: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: + m.Value = &Response_VerifyVoteExtension{v} + iNdEx = postIndex + case 20: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Tx", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field FinalizeBlock", wireType) } - var byteLen int + var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { return ErrIntOverflowTypes @@ -9252,25 +14885,26 @@ func (m *RequestDeliverTx) Unmarshal(dAtA []byte) error { } b := dAtA[iNdEx] iNdEx++ - byteLen |= int(b&0x7F) << shift + msglen |= int(b&0x7F) << shift if b < 0x80 { break } } - if byteLen < 0 { + if msglen < 0 { return ErrInvalidLengthTypes } - postIndex := iNdEx + byteLen + postIndex := iNdEx + msglen if postIndex < 0 { return ErrInvalidLengthTypes } if postIndex > l { return io.ErrUnexpectedEOF } - m.Tx = append(m.Tx[:0], dAtA[iNdEx:postIndex]...) - if m.Tx == nil { - m.Tx = []byte{} + v := &ResponseFinalizeBlock{} + if err := v.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err } + m.Value = &Response_FinalizeBlock{v} iNdEx = postIndex default: iNdEx = preIndex @@ -9293,7 +14927,7 @@ func (m *RequestDeliverTx) Unmarshal(dAtA []byte) error { } return nil } -func (m *RequestEndBlock) Unmarshal(dAtA []byte) error { +func (m *ResponseException) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 for iNdEx < l { @@ -9316,17 +14950,17 @@ func (m *RequestEndBlock) Unmarshal(dAtA []byte) error { fieldNum := int32(wire >> 3) wireType := int(wire & 0x7) if wireType == 4 { - return fmt.Errorf("proto: RequestEndBlock: wiretype end group for non-group") + return fmt.Errorf("proto: ResponseException: wiretype end group for non-group") } if fieldNum <= 0 { - return fmt.Errorf("proto: RequestEndBlock: illegal tag %d (wire type %d)", fieldNum, wire) + return fmt.Errorf("proto: ResponseException: illegal tag %d (wire type %d)", fieldNum, wire) } switch fieldNum { case 1: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field Height", wireType) + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Error", wireType) } - m.Height = 0 + var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { return ErrIntOverflowTypes @@ -9336,111 +14970,24 @@ func (m *RequestEndBlock) Unmarshal(dAtA []byte) error { } b := dAtA[iNdEx] iNdEx++ - m.Height |= int64(b&0x7F) << shift + stringLen |= uint64(b&0x7F) << shift if b < 0x80 { break } } - default: - iNdEx = preIndex - skippy, err := skipTypes(dAtA[iNdEx:]) - if err != nil { - return err - } - if (skippy < 0) || (iNdEx+skippy) < 0 { + intStringLen := int(stringLen) + if intStringLen < 0 { return ErrInvalidLengthTypes } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *RequestCommit) Unmarshal(dAtA []byte) error { - l := len(dAtA) - iNdEx := 0 - for iNdEx < l { - preIndex := iNdEx - var wire uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowTypes - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - wire |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - fieldNum := int32(wire >> 3) - wireType := int(wire & 0x7) - if wireType == 4 { - return fmt.Errorf("proto: RequestCommit: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: RequestCommit: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - default: - iNdEx = preIndex - skippy, err := skipTypes(dAtA[iNdEx:]) - if err != nil { - return err - } - if (skippy < 0) || (iNdEx+skippy) < 0 { + postIndex := iNdEx + intStringLen + if postIndex < 0 { return ErrInvalidLengthTypes } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *RequestListSnapshots) Unmarshal(dAtA []byte) error { - l := len(dAtA) - iNdEx := 0 - for iNdEx < l { - preIndex := iNdEx - var wire uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowTypes - } - if iNdEx >= l { + if postIndex > l { return io.ErrUnexpectedEOF } - b := dAtA[iNdEx] - iNdEx++ - wire |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - fieldNum := int32(wire >> 3) - wireType := int(wire & 0x7) - if wireType == 4 { - return fmt.Errorf("proto: RequestListSnapshots: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: RequestListSnapshots: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { + m.Error = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex default: iNdEx = preIndex skippy, err := skipTypes(dAtA[iNdEx:]) @@ -9462,76 +15009,40 @@ func (m *RequestListSnapshots) Unmarshal(dAtA []byte) error { } return nil } -func (m *RequestOfferSnapshot) Unmarshal(dAtA []byte) error { - l := len(dAtA) - iNdEx := 0 - for iNdEx < l { - preIndex := iNdEx - var wire uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowTypes - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - wire |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - fieldNum := int32(wire >> 3) - wireType := int(wire & 0x7) - if wireType == 4 { - return fmt.Errorf("proto: RequestOfferSnapshot: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: RequestOfferSnapshot: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Snapshot", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowTypes - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthTypes - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthTypes +func (m *ResponseEcho) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTypes } - if postIndex > l { + if iNdEx >= l { return io.ErrUnexpectedEOF } - if m.Snapshot == nil { - m.Snapshot = &Snapshot{} - } - if err := m.Snapshot.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break } - iNdEx = postIndex - case 2: + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: ResponseEcho: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: ResponseEcho: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field AppHash", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field Message", wireType) } - var byteLen int + var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { return ErrIntOverflowTypes @@ -9541,25 +15052,23 @@ func (m *RequestOfferSnapshot) Unmarshal(dAtA []byte) error { } b := dAtA[iNdEx] iNdEx++ - byteLen |= int(b&0x7F) << shift + stringLen |= uint64(b&0x7F) << shift if b < 0x80 { break } } - if byteLen < 0 { + intStringLen := int(stringLen) + if intStringLen < 0 { return ErrInvalidLengthTypes } - postIndex := iNdEx + byteLen + postIndex := iNdEx + intStringLen if postIndex < 0 { return ErrInvalidLengthTypes } if postIndex > l { return io.ErrUnexpectedEOF } - m.AppHash = append(m.AppHash[:0], dAtA[iNdEx:postIndex]...) - if m.AppHash == nil { - m.AppHash = []byte{} - } + m.Message = string(dAtA[iNdEx:postIndex]) iNdEx = postIndex default: iNdEx = preIndex @@ -9582,7 +15091,7 @@ func (m *RequestOfferSnapshot) Unmarshal(dAtA []byte) error { } return nil } -func (m *RequestLoadSnapshotChunk) Unmarshal(dAtA []byte) error { +func (m *ResponseFlush) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 for iNdEx < l { @@ -9605,69 +15114,12 @@ func (m *RequestLoadSnapshotChunk) Unmarshal(dAtA []byte) error { fieldNum := int32(wire >> 3) wireType := int(wire & 0x7) if wireType == 4 { - return fmt.Errorf("proto: RequestLoadSnapshotChunk: wiretype end group for non-group") + return fmt.Errorf("proto: ResponseFlush: wiretype end group for non-group") } if fieldNum <= 0 { - return fmt.Errorf("proto: RequestLoadSnapshotChunk: illegal tag %d (wire type %d)", fieldNum, wire) + return fmt.Errorf("proto: ResponseFlush: illegal tag %d (wire type %d)", fieldNum, wire) } switch fieldNum { - case 1: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field Height", wireType) - } - m.Height = 0 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowTypes - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - m.Height |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - case 2: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field Format", wireType) - } - m.Format = 0 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowTypes - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - m.Format |= uint32(b&0x7F) << shift - if b < 0x80 { - break - } - } - case 3: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field Chunk", wireType) - } - m.Chunk = 0 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowTypes - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - m.Chunk |= uint32(b&0x7F) << shift - if b < 0x80 { - break - } - } default: iNdEx = preIndex skippy, err := skipTypes(dAtA[iNdEx:]) @@ -9689,7 +15141,7 @@ func (m *RequestLoadSnapshotChunk) Unmarshal(dAtA []byte) error { } return nil } -func (m *RequestApplySnapshotChunk) Unmarshal(dAtA []byte) error { +func (m *ResponseInfo) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 for iNdEx < l { @@ -9712,17 +15164,17 @@ func (m *RequestApplySnapshotChunk) Unmarshal(dAtA []byte) error { fieldNum := int32(wire >> 3) wireType := int(wire & 0x7) if wireType == 4 { - return fmt.Errorf("proto: RequestApplySnapshotChunk: wiretype end group for non-group") + return fmt.Errorf("proto: ResponseInfo: wiretype end group for non-group") } if fieldNum <= 0 { - return fmt.Errorf("proto: RequestApplySnapshotChunk: illegal tag %d (wire type %d)", fieldNum, wire) + return fmt.Errorf("proto: ResponseInfo: illegal tag %d (wire type %d)", fieldNum, wire) } switch fieldNum { case 1: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field Index", wireType) + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Data", wireType) } - m.Index = 0 + var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { return ErrIntOverflowTypes @@ -9732,16 +15184,29 @@ func (m *RequestApplySnapshotChunk) Unmarshal(dAtA []byte) error { } b := dAtA[iNdEx] iNdEx++ - m.Index |= uint32(b&0x7F) << shift + stringLen |= uint64(b&0x7F) << shift if b < 0x80 { break } } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthTypes + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthTypes + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Data = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex case 2: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Chunk", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field Version", wireType) } - var byteLen int + var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { return ErrIntOverflowTypes @@ -9751,31 +15216,67 @@ func (m *RequestApplySnapshotChunk) Unmarshal(dAtA []byte) error { } b := dAtA[iNdEx] iNdEx++ - byteLen |= int(b&0x7F) << shift + stringLen |= uint64(b&0x7F) << shift if b < 0x80 { break } } - if byteLen < 0 { + intStringLen := int(stringLen) + if intStringLen < 0 { return ErrInvalidLengthTypes } - postIndex := iNdEx + byteLen + postIndex := iNdEx + intStringLen if postIndex < 0 { return ErrInvalidLengthTypes } if postIndex > l { return io.ErrUnexpectedEOF } - m.Chunk = append(m.Chunk[:0], dAtA[iNdEx:postIndex]...) - if m.Chunk == nil { - m.Chunk = []byte{} - } + m.Version = string(dAtA[iNdEx:postIndex]) iNdEx = postIndex case 3: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field AppVersion", wireType) + } + m.AppVersion = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTypes + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.AppVersion |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + case 4: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field LastBlockHeight", wireType) + } + m.LastBlockHeight = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTypes + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.LastBlockHeight |= int64(b&0x7F) << shift + if b < 0x80 { + break + } + } + case 5: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Sender", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field LastBlockAppHash", wireType) } - var stringLen uint64 + var byteLen int for shift := uint(0); ; shift += 7 { if shift >= 64 { return ErrIntOverflowTypes @@ -9785,23 +15286,25 @@ func (m *RequestApplySnapshotChunk) Unmarshal(dAtA []byte) error { } b := dAtA[iNdEx] iNdEx++ - stringLen |= uint64(b&0x7F) << shift + byteLen |= int(b&0x7F) << shift if b < 0x80 { break } } - intStringLen := int(stringLen) - if intStringLen < 0 { + if byteLen < 0 { return ErrInvalidLengthTypes } - postIndex := iNdEx + intStringLen + postIndex := iNdEx + byteLen if postIndex < 0 { return ErrInvalidLengthTypes } if postIndex > l { return io.ErrUnexpectedEOF } - m.Sender = string(dAtA[iNdEx:postIndex]) + m.LastBlockAppHash = append(m.LastBlockAppHash[:0], dAtA[iNdEx:postIndex]...) + if m.LastBlockAppHash == nil { + m.LastBlockAppHash = []byte{} + } iNdEx = postIndex default: iNdEx = preIndex @@ -9824,7 +15327,7 @@ func (m *RequestApplySnapshotChunk) Unmarshal(dAtA []byte) error { } return nil } -func (m *Response) Unmarshal(dAtA []byte) error { +func (m *ResponseInitChain) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 for iNdEx < l { @@ -9837,60 +15340,25 @@ func (m *Response) Unmarshal(dAtA []byte) error { if iNdEx >= l { return io.ErrUnexpectedEOF } - b := dAtA[iNdEx] - iNdEx++ - wire |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - fieldNum := int32(wire >> 3) - wireType := int(wire & 0x7) - if wireType == 4 { - return fmt.Errorf("proto: Response: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: Response: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Exception", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowTypes - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthTypes - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthTypes - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - v := &ResponseException{} - if err := v.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break } - m.Value = &Response_Exception{v} - iNdEx = postIndex - case 2: + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: ResponseInitChain: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: ResponseInitChain: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Echo", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field ConsensusParams", wireType) } var msglen int for shift := uint(0); ; shift += 7 { @@ -9917,17 +15385,18 @@ func (m *Response) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - v := &ResponseEcho{} - if err := v.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + if m.ConsensusParams == nil { + m.ConsensusParams = &types1.ConsensusParams{} + } + if err := m.ConsensusParams.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { return err } - m.Value = &Response_Echo{v} iNdEx = postIndex case 3: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Flush", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field AppHash", wireType) } - var msglen int + var byteLen int for shift := uint(0); ; shift += 7 { if shift >= 64 { return ErrIntOverflowTypes @@ -9937,30 +15406,29 @@ func (m *Response) Unmarshal(dAtA []byte) error { } b := dAtA[iNdEx] iNdEx++ - msglen |= int(b&0x7F) << shift + byteLen |= int(b&0x7F) << shift if b < 0x80 { break } } - if msglen < 0 { + if byteLen < 0 { return ErrInvalidLengthTypes } - postIndex := iNdEx + msglen + postIndex := iNdEx + byteLen if postIndex < 0 { return ErrInvalidLengthTypes } if postIndex > l { return io.ErrUnexpectedEOF } - v := &ResponseFlush{} - if err := v.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err + m.AppHash = append(m.AppHash[:0], dAtA[iNdEx:postIndex]...) + if m.AppHash == nil { + m.AppHash = []byte{} } - m.Value = &Response_Flush{v} iNdEx = postIndex - case 4: + case 100: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Info", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field ValidatorSetUpdate", wireType) } var msglen int for shift := uint(0); ; shift += 7 { @@ -9987,15 +15455,13 @@ func (m *Response) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - v := &ResponseInfo{} - if err := v.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + if err := m.ValidatorSetUpdate.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { return err } - m.Value = &Response_Info{v} iNdEx = postIndex - case 5: + case 101: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field InitChain", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field NextCoreChainLockUpdate", wireType) } var msglen int for shift := uint(0); ; shift += 7 { @@ -10022,17 +15488,18 @@ func (m *Response) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - v := &ResponseInitChain{} - if err := v.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + if m.NextCoreChainLockUpdate == nil { + m.NextCoreChainLockUpdate = &types1.CoreChainLock{} + } + if err := m.NextCoreChainLockUpdate.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { return err } - m.Value = &Response_InitChain{v} iNdEx = postIndex - case 6: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Query", wireType) + case 102: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field InitialCoreHeight", wireType) } - var msglen int + m.InitialCoreHeight = 0 for shift := uint(0); ; shift += 7 { if shift >= 64 { return ErrIntOverflowTypes @@ -10042,32 +15509,66 @@ func (m *Response) Unmarshal(dAtA []byte) error { } b := dAtA[iNdEx] iNdEx++ - msglen |= int(b&0x7F) << shift + m.InitialCoreHeight |= uint32(b&0x7F) << shift if b < 0x80 { break } } - if msglen < 0 { - return ErrInvalidLengthTypes + default: + iNdEx = preIndex + skippy, err := skipTypes(dAtA[iNdEx:]) + if err != nil { + return err } - postIndex := iNdEx + msglen - if postIndex < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthTypes } - if postIndex > l { + if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF } - v := &ResponseQuery{} - if err := v.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *ResponseQuery) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTypes } - m.Value = &Response_Query{v} - iNdEx = postIndex - case 7: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field BeginBlock", wireType) + if iNdEx >= l { + return io.ErrUnexpectedEOF } - var msglen int + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: ResponseQuery: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: ResponseQuery: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field Code", wireType) + } + m.Code = 0 for shift := uint(0); ; shift += 7 { if shift >= 64 { return ErrIntOverflowTypes @@ -10077,32 +15578,16 @@ func (m *Response) Unmarshal(dAtA []byte) error { } b := dAtA[iNdEx] iNdEx++ - msglen |= int(b&0x7F) << shift + m.Code |= uint32(b&0x7F) << shift if b < 0x80 { break } } - if msglen < 0 { - return ErrInvalidLengthTypes - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthTypes - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - v := &ResponseBeginBlock{} - if err := v.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - m.Value = &Response_BeginBlock{v} - iNdEx = postIndex - case 8: + case 3: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field CheckTx", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field Log", wireType) } - var msglen int + var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { return ErrIntOverflowTypes @@ -10112,32 +15597,29 @@ func (m *Response) Unmarshal(dAtA []byte) error { } b := dAtA[iNdEx] iNdEx++ - msglen |= int(b&0x7F) << shift + stringLen |= uint64(b&0x7F) << shift if b < 0x80 { break } } - if msglen < 0 { + intStringLen := int(stringLen) + if intStringLen < 0 { return ErrInvalidLengthTypes } - postIndex := iNdEx + msglen + postIndex := iNdEx + intStringLen if postIndex < 0 { return ErrInvalidLengthTypes } if postIndex > l { return io.ErrUnexpectedEOF } - v := &ResponseCheckTx{} - if err := v.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - m.Value = &Response_CheckTx{v} + m.Log = string(dAtA[iNdEx:postIndex]) iNdEx = postIndex - case 9: + case 4: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field DeliverTx", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field Info", wireType) } - var msglen int + var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { return ErrIntOverflowTypes @@ -10147,32 +15629,29 @@ func (m *Response) Unmarshal(dAtA []byte) error { } b := dAtA[iNdEx] iNdEx++ - msglen |= int(b&0x7F) << shift + stringLen |= uint64(b&0x7F) << shift if b < 0x80 { break } } - if msglen < 0 { + intStringLen := int(stringLen) + if intStringLen < 0 { return ErrInvalidLengthTypes } - postIndex := iNdEx + msglen + postIndex := iNdEx + intStringLen if postIndex < 0 { return ErrInvalidLengthTypes } if postIndex > l { return io.ErrUnexpectedEOF } - v := &ResponseDeliverTx{} - if err := v.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - m.Value = &Response_DeliverTx{v} + m.Info = string(dAtA[iNdEx:postIndex]) iNdEx = postIndex - case 10: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field EndBlock", wireType) + case 5: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field Index", wireType) } - var msglen int + m.Index = 0 for shift := uint(0); ; shift += 7 { if shift >= 64 { return ErrIntOverflowTypes @@ -10182,32 +15661,16 @@ func (m *Response) Unmarshal(dAtA []byte) error { } b := dAtA[iNdEx] iNdEx++ - msglen |= int(b&0x7F) << shift + m.Index |= int64(b&0x7F) << shift if b < 0x80 { break } } - if msglen < 0 { - return ErrInvalidLengthTypes - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthTypes - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - v := &ResponseEndBlock{} - if err := v.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - m.Value = &Response_EndBlock{v} - iNdEx = postIndex - case 11: + case 6: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Commit", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field Key", wireType) } - var msglen int + var byteLen int for shift := uint(0); ; shift += 7 { if shift >= 64 { return ErrIntOverflowTypes @@ -10217,32 +15680,31 @@ func (m *Response) Unmarshal(dAtA []byte) error { } b := dAtA[iNdEx] iNdEx++ - msglen |= int(b&0x7F) << shift + byteLen |= int(b&0x7F) << shift if b < 0x80 { break } } - if msglen < 0 { + if byteLen < 0 { return ErrInvalidLengthTypes } - postIndex := iNdEx + msglen + postIndex := iNdEx + byteLen if postIndex < 0 { return ErrInvalidLengthTypes } if postIndex > l { return io.ErrUnexpectedEOF } - v := &ResponseCommit{} - if err := v.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err + m.Key = append(m.Key[:0], dAtA[iNdEx:postIndex]...) + if m.Key == nil { + m.Key = []byte{} } - m.Value = &Response_Commit{v} iNdEx = postIndex - case 12: + case 7: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field ListSnapshots", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field Value", wireType) } - var msglen int + var byteLen int for shift := uint(0); ; shift += 7 { if shift >= 64 { return ErrIntOverflowTypes @@ -10252,30 +15714,29 @@ func (m *Response) Unmarshal(dAtA []byte) error { } b := dAtA[iNdEx] iNdEx++ - msglen |= int(b&0x7F) << shift + byteLen |= int(b&0x7F) << shift if b < 0x80 { break } } - if msglen < 0 { + if byteLen < 0 { return ErrInvalidLengthTypes } - postIndex := iNdEx + msglen + postIndex := iNdEx + byteLen if postIndex < 0 { return ErrInvalidLengthTypes } if postIndex > l { return io.ErrUnexpectedEOF } - v := &ResponseListSnapshots{} - if err := v.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err + m.Value = append(m.Value[:0], dAtA[iNdEx:postIndex]...) + if m.Value == nil { + m.Value = []byte{} } - m.Value = &Response_ListSnapshots{v} iNdEx = postIndex - case 13: + case 8: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field OfferSnapshot", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field ProofOps", wireType) } var msglen int for shift := uint(0); ; shift += 7 { @@ -10302,17 +15763,18 @@ func (m *Response) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - v := &ResponseOfferSnapshot{} - if err := v.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + if m.ProofOps == nil { + m.ProofOps = &crypto.ProofOps{} + } + if err := m.ProofOps.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { return err } - m.Value = &Response_OfferSnapshot{v} iNdEx = postIndex - case 14: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field LoadSnapshotChunk", wireType) + case 9: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field Height", wireType) } - var msglen int + m.Height = 0 for shift := uint(0); ; shift += 7 { if shift >= 64 { return ErrIntOverflowTypes @@ -10322,32 +15784,16 @@ func (m *Response) Unmarshal(dAtA []byte) error { } b := dAtA[iNdEx] iNdEx++ - msglen |= int(b&0x7F) << shift + m.Height |= int64(b&0x7F) << shift if b < 0x80 { break } } - if msglen < 0 { - return ErrInvalidLengthTypes - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthTypes - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - v := &ResponseLoadSnapshotChunk{} - if err := v.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - m.Value = &Response_LoadSnapshotChunk{v} - iNdEx = postIndex - case 15: + case 10: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field ApplySnapshotChunk", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field Codespace", wireType) } - var msglen int + var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { return ErrIntOverflowTypes @@ -10357,26 +15803,23 @@ func (m *Response) Unmarshal(dAtA []byte) error { } b := dAtA[iNdEx] iNdEx++ - msglen |= int(b&0x7F) << shift + stringLen |= uint64(b&0x7F) << shift if b < 0x80 { break } } - if msglen < 0 { + intStringLen := int(stringLen) + if intStringLen < 0 { return ErrInvalidLengthTypes } - postIndex := iNdEx + msglen + postIndex := iNdEx + intStringLen if postIndex < 0 { return ErrInvalidLengthTypes } if postIndex > l { return io.ErrUnexpectedEOF } - v := &ResponseApplySnapshotChunk{} - if err := v.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - m.Value = &Response_ApplySnapshotChunk{v} + m.Codespace = string(dAtA[iNdEx:postIndex]) iNdEx = postIndex default: iNdEx = preIndex @@ -10399,7 +15842,7 @@ func (m *Response) Unmarshal(dAtA []byte) error { } return nil } -func (m *ResponseException) Unmarshal(dAtA []byte) error { +func (m *ResponseBeginBlock) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 for iNdEx < l { @@ -10422,17 +15865,17 @@ func (m *ResponseException) Unmarshal(dAtA []byte) error { fieldNum := int32(wire >> 3) wireType := int(wire & 0x7) if wireType == 4 { - return fmt.Errorf("proto: ResponseException: wiretype end group for non-group") + return fmt.Errorf("proto: ResponseBeginBlock: wiretype end group for non-group") } if fieldNum <= 0 { - return fmt.Errorf("proto: ResponseException: illegal tag %d (wire type %d)", fieldNum, wire) + return fmt.Errorf("proto: ResponseBeginBlock: illegal tag %d (wire type %d)", fieldNum, wire) } switch fieldNum { case 1: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Error", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field Events", wireType) } - var stringLen uint64 + var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { return ErrIntOverflowTypes @@ -10442,23 +15885,25 @@ func (m *ResponseException) Unmarshal(dAtA []byte) error { } b := dAtA[iNdEx] iNdEx++ - stringLen |= uint64(b&0x7F) << shift + msglen |= int(b&0x7F) << shift if b < 0x80 { break } } - intStringLen := int(stringLen) - if intStringLen < 0 { + if msglen < 0 { return ErrInvalidLengthTypes } - postIndex := iNdEx + intStringLen + postIndex := iNdEx + msglen if postIndex < 0 { return ErrInvalidLengthTypes } if postIndex > l { return io.ErrUnexpectedEOF } - m.Error = string(dAtA[iNdEx:postIndex]) + m.Events = append(m.Events, Event{}) + if err := m.Events[len(m.Events)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } iNdEx = postIndex default: iNdEx = preIndex @@ -10481,7 +15926,7 @@ func (m *ResponseException) Unmarshal(dAtA []byte) error { } return nil } -func (m *ResponseEcho) Unmarshal(dAtA []byte) error { +func (m *ResponseCheckTx) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 for iNdEx < l { @@ -10504,17 +15949,36 @@ func (m *ResponseEcho) Unmarshal(dAtA []byte) error { fieldNum := int32(wire >> 3) wireType := int(wire & 0x7) if wireType == 4 { - return fmt.Errorf("proto: ResponseEcho: wiretype end group for non-group") + return fmt.Errorf("proto: ResponseCheckTx: wiretype end group for non-group") } if fieldNum <= 0 { - return fmt.Errorf("proto: ResponseEcho: illegal tag %d (wire type %d)", fieldNum, wire) + return fmt.Errorf("proto: ResponseCheckTx: illegal tag %d (wire type %d)", fieldNum, wire) } switch fieldNum { case 1: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field Code", wireType) + } + m.Code = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTypes + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.Code |= uint32(b&0x7F) << shift + if b < 0x80 { + break + } + } + case 2: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Message", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field Data", wireType) } - var stringLen uint64 + var byteLen int for shift := uint(0); ; shift += 7 { if shift >= 64 { return ErrIntOverflowTypes @@ -10524,129 +15988,133 @@ func (m *ResponseEcho) Unmarshal(dAtA []byte) error { } b := dAtA[iNdEx] iNdEx++ - stringLen |= uint64(b&0x7F) << shift + byteLen |= int(b&0x7F) << shift if b < 0x80 { break } } - intStringLen := int(stringLen) - if intStringLen < 0 { + if byteLen < 0 { return ErrInvalidLengthTypes } - postIndex := iNdEx + intStringLen + postIndex := iNdEx + byteLen if postIndex < 0 { return ErrInvalidLengthTypes } if postIndex > l { return io.ErrUnexpectedEOF } - m.Message = string(dAtA[iNdEx:postIndex]) + m.Data = append(m.Data[:0], dAtA[iNdEx:postIndex]...) + if m.Data == nil { + m.Data = []byte{} + } iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipTypes(dAtA[iNdEx:]) - if err != nil { - return err + case 3: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Log", wireType) } - if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLengthTypes + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTypes + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthTypes } - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *ResponseFlush) Unmarshal(dAtA []byte) error { - l := len(dAtA) - iNdEx := 0 - for iNdEx < l { - preIndex := iNdEx - var wire uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowTypes + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthTypes } - if iNdEx >= l { + if postIndex > l { return io.ErrUnexpectedEOF } - b := dAtA[iNdEx] - iNdEx++ - wire |= uint64(b&0x7F) << shift - if b < 0x80 { - break + m.Log = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 4: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Info", wireType) } - } - fieldNum := int32(wire >> 3) - wireType := int(wire & 0x7) - if wireType == 4 { - return fmt.Errorf("proto: ResponseFlush: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: ResponseFlush: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - default: - iNdEx = preIndex - skippy, err := skipTypes(dAtA[iNdEx:]) - if err != nil { - return err + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTypes + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } } - if (skippy < 0) || (iNdEx+skippy) < 0 { + intStringLen := int(stringLen) + if intStringLen < 0 { return ErrInvalidLengthTypes } - if (iNdEx + skippy) > l { + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthTypes + } + if postIndex > l { return io.ErrUnexpectedEOF } - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *ResponseInfo) Unmarshal(dAtA []byte) error { - l := len(dAtA) - iNdEx := 0 - for iNdEx < l { - preIndex := iNdEx - var wire uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowTypes + m.Info = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 5: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field GasWanted", wireType) + } + m.GasWanted = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTypes + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.GasWanted |= int64(b&0x7F) << shift + if b < 0x80 { + break + } } - if iNdEx >= l { - return io.ErrUnexpectedEOF + case 6: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field GasUsed", wireType) } - b := dAtA[iNdEx] - iNdEx++ - wire |= uint64(b&0x7F) << shift - if b < 0x80 { - break + m.GasUsed = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTypes + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.GasUsed |= int64(b&0x7F) << shift + if b < 0x80 { + break + } } - } - fieldNum := int32(wire >> 3) - wireType := int(wire & 0x7) - if wireType == 4 { - return fmt.Errorf("proto: ResponseInfo: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: ResponseInfo: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: + case 7: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Data", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field Events", wireType) } - var stringLen uint64 + var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { return ErrIntOverflowTypes @@ -10656,27 +16124,29 @@ func (m *ResponseInfo) Unmarshal(dAtA []byte) error { } b := dAtA[iNdEx] iNdEx++ - stringLen |= uint64(b&0x7F) << shift + msglen |= int(b&0x7F) << shift if b < 0x80 { break } } - intStringLen := int(stringLen) - if intStringLen < 0 { + if msglen < 0 { return ErrInvalidLengthTypes } - postIndex := iNdEx + intStringLen + postIndex := iNdEx + msglen if postIndex < 0 { return ErrInvalidLengthTypes } if postIndex > l { return io.ErrUnexpectedEOF } - m.Data = string(dAtA[iNdEx:postIndex]) + m.Events = append(m.Events, Event{}) + if err := m.Events[len(m.Events)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } iNdEx = postIndex - case 2: + case 8: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Version", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field Codespace", wireType) } var stringLen uint64 for shift := uint(0); ; shift += 7 { @@ -10704,13 +16174,13 @@ func (m *ResponseInfo) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - m.Version = string(dAtA[iNdEx:postIndex]) + m.Codespace = string(dAtA[iNdEx:postIndex]) iNdEx = postIndex - case 3: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field AppVersion", wireType) + case 9: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Sender", wireType) } - m.AppVersion = 0 + var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { return ErrIntOverflowTypes @@ -10720,16 +16190,29 @@ func (m *ResponseInfo) Unmarshal(dAtA []byte) error { } b := dAtA[iNdEx] iNdEx++ - m.AppVersion |= uint64(b&0x7F) << shift + stringLen |= uint64(b&0x7F) << shift if b < 0x80 { break } } - case 4: + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthTypes + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthTypes + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Sender = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 10: if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field LastBlockHeight", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field Priority", wireType) } - m.LastBlockHeight = 0 + m.Priority = 0 for shift := uint(0); ; shift += 7 { if shift >= 64 { return ErrIntOverflowTypes @@ -10739,16 +16222,16 @@ func (m *ResponseInfo) Unmarshal(dAtA []byte) error { } b := dAtA[iNdEx] iNdEx++ - m.LastBlockHeight |= int64(b&0x7F) << shift + m.Priority |= int64(b&0x7F) << shift if b < 0x80 { break } } - case 5: + case 11: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field LastBlockAppHash", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field MempoolError", wireType) } - var byteLen int + var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { return ErrIntOverflowTypes @@ -10758,25 +16241,23 @@ func (m *ResponseInfo) Unmarshal(dAtA []byte) error { } b := dAtA[iNdEx] iNdEx++ - byteLen |= int(b&0x7F) << shift + stringLen |= uint64(b&0x7F) << shift if b < 0x80 { break } } - if byteLen < 0 { + intStringLen := int(stringLen) + if intStringLen < 0 { return ErrInvalidLengthTypes } - postIndex := iNdEx + byteLen + postIndex := iNdEx + intStringLen if postIndex < 0 { return ErrInvalidLengthTypes } if postIndex > l { return io.ErrUnexpectedEOF } - m.LastBlockAppHash = append(m.LastBlockAppHash[:0], dAtA[iNdEx:postIndex]...) - if m.LastBlockAppHash == nil { - m.LastBlockAppHash = []byte{} - } + m.MempoolError = string(dAtA[iNdEx:postIndex]) iNdEx = postIndex default: iNdEx = preIndex @@ -10799,7 +16280,7 @@ func (m *ResponseInfo) Unmarshal(dAtA []byte) error { } return nil } -func (m *ResponseInitChain) Unmarshal(dAtA []byte) error { +func (m *ResponseDeliverTx) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 for iNdEx < l { @@ -10822,17 +16303,36 @@ func (m *ResponseInitChain) Unmarshal(dAtA []byte) error { fieldNum := int32(wire >> 3) wireType := int(wire & 0x7) if wireType == 4 { - return fmt.Errorf("proto: ResponseInitChain: wiretype end group for non-group") + return fmt.Errorf("proto: ResponseDeliverTx: wiretype end group for non-group") } if fieldNum <= 0 { - return fmt.Errorf("proto: ResponseInitChain: illegal tag %d (wire type %d)", fieldNum, wire) + return fmt.Errorf("proto: ResponseDeliverTx: illegal tag %d (wire type %d)", fieldNum, wire) } switch fieldNum { case 1: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field Code", wireType) + } + m.Code = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTypes + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.Code |= uint32(b&0x7F) << shift + if b < 0x80 { + break + } + } + case 2: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field ConsensusParams", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field Data", wireType) } - var msglen int + var byteLen int for shift := uint(0); ; shift += 7 { if shift >= 64 { return ErrIntOverflowTypes @@ -10842,33 +16342,31 @@ func (m *ResponseInitChain) Unmarshal(dAtA []byte) error { } b := dAtA[iNdEx] iNdEx++ - msglen |= int(b&0x7F) << shift + byteLen |= int(b&0x7F) << shift if b < 0x80 { break } } - if msglen < 0 { + if byteLen < 0 { return ErrInvalidLengthTypes } - postIndex := iNdEx + msglen + postIndex := iNdEx + byteLen if postIndex < 0 { return ErrInvalidLengthTypes } if postIndex > l { return io.ErrUnexpectedEOF } - if m.ConsensusParams == nil { - m.ConsensusParams = &types1.ConsensusParams{} - } - if err := m.ConsensusParams.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err + m.Data = append(m.Data[:0], dAtA[iNdEx:postIndex]...) + if m.Data == nil { + m.Data = []byte{} } iNdEx = postIndex case 3: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field AppHash", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field Log", wireType) } - var byteLen int + var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { return ErrIntOverflowTypes @@ -10878,31 +16376,29 @@ func (m *ResponseInitChain) Unmarshal(dAtA []byte) error { } b := dAtA[iNdEx] iNdEx++ - byteLen |= int(b&0x7F) << shift + stringLen |= uint64(b&0x7F) << shift if b < 0x80 { break } } - if byteLen < 0 { + intStringLen := int(stringLen) + if intStringLen < 0 { return ErrInvalidLengthTypes } - postIndex := iNdEx + byteLen + postIndex := iNdEx + intStringLen if postIndex < 0 { return ErrInvalidLengthTypes } if postIndex > l { return io.ErrUnexpectedEOF } - m.AppHash = append(m.AppHash[:0], dAtA[iNdEx:postIndex]...) - if m.AppHash == nil { - m.AppHash = []byte{} - } + m.Log = string(dAtA[iNdEx:postIndex]) iNdEx = postIndex - case 100: + case 4: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field ValidatorSetUpdate", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field Info", wireType) } - var msglen int + var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { return ErrIntOverflowTypes @@ -10912,28 +16408,65 @@ func (m *ResponseInitChain) Unmarshal(dAtA []byte) error { } b := dAtA[iNdEx] iNdEx++ - msglen |= int(b&0x7F) << shift + stringLen |= uint64(b&0x7F) << shift if b < 0x80 { break } } - if msglen < 0 { + intStringLen := int(stringLen) + if intStringLen < 0 { return ErrInvalidLengthTypes } - postIndex := iNdEx + msglen + postIndex := iNdEx + intStringLen if postIndex < 0 { return ErrInvalidLengthTypes } if postIndex > l { return io.ErrUnexpectedEOF } - if err := m.ValidatorSetUpdate.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } + m.Info = string(dAtA[iNdEx:postIndex]) iNdEx = postIndex - case 101: + case 5: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field GasWanted", wireType) + } + m.GasWanted = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTypes + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.GasWanted |= int64(b&0x7F) << shift + if b < 0x80 { + break + } + } + case 6: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field GasUsed", wireType) + } + m.GasUsed = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTypes + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.GasUsed |= int64(b&0x7F) << shift + if b < 0x80 { + break + } + } + case 7: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field NextCoreChainLockUpdate", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field Events", wireType) } var msglen int for shift := uint(0); ; shift += 7 { @@ -10960,18 +16493,16 @@ func (m *ResponseInitChain) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - if m.NextCoreChainLockUpdate == nil { - m.NextCoreChainLockUpdate = &types1.CoreChainLock{} - } - if err := m.NextCoreChainLockUpdate.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + m.Events = append(m.Events, Event{}) + if err := m.Events[len(m.Events)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { return err } iNdEx = postIndex - case 102: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field InitialCoreHeight", wireType) + case 8: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Codespace", wireType) } - m.InitialCoreHeight = 0 + var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { return ErrIntOverflowTypes @@ -10981,11 +16512,24 @@ func (m *ResponseInitChain) Unmarshal(dAtA []byte) error { } b := dAtA[iNdEx] iNdEx++ - m.InitialCoreHeight |= uint32(b&0x7F) << shift + stringLen |= uint64(b&0x7F) << shift if b < 0x80 { break } } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthTypes + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthTypes + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Codespace = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex default: iNdEx = preIndex skippy, err := skipTypes(dAtA[iNdEx:]) @@ -11007,7 +16551,7 @@ func (m *ResponseInitChain) Unmarshal(dAtA []byte) error { } return nil } -func (m *ResponseQuery) Unmarshal(dAtA []byte) error { +func (m *ResponseEndBlock) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 for iNdEx < l { @@ -11030,17 +16574,17 @@ func (m *ResponseQuery) Unmarshal(dAtA []byte) error { fieldNum := int32(wire >> 3) wireType := int(wire & 0x7) if wireType == 4 { - return fmt.Errorf("proto: ResponseQuery: wiretype end group for non-group") + return fmt.Errorf("proto: ResponseEndBlock: wiretype end group for non-group") } if fieldNum <= 0 { - return fmt.Errorf("proto: ResponseQuery: illegal tag %d (wire type %d)", fieldNum, wire) + return fmt.Errorf("proto: ResponseEndBlock: illegal tag %d (wire type %d)", fieldNum, wire) } switch fieldNum { - case 1: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field Code", wireType) + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field ConsensusParamUpdates", wireType) } - m.Code = 0 + var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { return ErrIntOverflowTypes @@ -11050,16 +16594,33 @@ func (m *ResponseQuery) Unmarshal(dAtA []byte) error { } b := dAtA[iNdEx] iNdEx++ - m.Code |= uint32(b&0x7F) << shift + msglen |= int(b&0x7F) << shift if b < 0x80 { break } } + if msglen < 0 { + return ErrInvalidLengthTypes + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthTypes + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.ConsensusParamUpdates == nil { + m.ConsensusParamUpdates = &types1.ConsensusParams{} + } + if err := m.ConsensusParamUpdates.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex case 3: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Log", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field Events", wireType) } - var stringLen uint64 + var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { return ErrIntOverflowTypes @@ -11069,29 +16630,31 @@ func (m *ResponseQuery) Unmarshal(dAtA []byte) error { } b := dAtA[iNdEx] iNdEx++ - stringLen |= uint64(b&0x7F) << shift + msglen |= int(b&0x7F) << shift if b < 0x80 { break } } - intStringLen := int(stringLen) - if intStringLen < 0 { + if msglen < 0 { return ErrInvalidLengthTypes } - postIndex := iNdEx + intStringLen + postIndex := iNdEx + msglen if postIndex < 0 { return ErrInvalidLengthTypes } if postIndex > l { return io.ErrUnexpectedEOF } - m.Log = string(dAtA[iNdEx:postIndex]) + m.Events = append(m.Events, Event{}) + if err := m.Events[len(m.Events)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } iNdEx = postIndex - case 4: + case 100: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Info", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field NextCoreChainLockUpdate", wireType) } - var stringLen uint64 + var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { return ErrIntOverflowTypes @@ -11101,48 +16664,33 @@ func (m *ResponseQuery) Unmarshal(dAtA []byte) error { } b := dAtA[iNdEx] iNdEx++ - stringLen |= uint64(b&0x7F) << shift + msglen |= int(b&0x7F) << shift if b < 0x80 { break } } - intStringLen := int(stringLen) - if intStringLen < 0 { + if msglen < 0 { return ErrInvalidLengthTypes } - postIndex := iNdEx + intStringLen + postIndex := iNdEx + msglen if postIndex < 0 { return ErrInvalidLengthTypes } if postIndex > l { return io.ErrUnexpectedEOF } - m.Info = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - case 5: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field Index", wireType) + if m.NextCoreChainLockUpdate == nil { + m.NextCoreChainLockUpdate = &types1.CoreChainLock{} } - m.Index = 0 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowTypes - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - m.Index |= int64(b&0x7F) << shift - if b < 0x80 { - break - } + if err := m.NextCoreChainLockUpdate.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err } - case 6: + iNdEx = postIndex + case 101: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Key", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field ValidatorSetUpdate", wireType) } - var byteLen int + var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { return ErrIntOverflowTypes @@ -11152,29 +16700,81 @@ func (m *ResponseQuery) Unmarshal(dAtA []byte) error { } b := dAtA[iNdEx] iNdEx++ - byteLen |= int(b&0x7F) << shift + msglen |= int(b&0x7F) << shift if b < 0x80 { break } } - if byteLen < 0 { + if msglen < 0 { return ErrInvalidLengthTypes } - postIndex := iNdEx + byteLen + postIndex := iNdEx + msglen if postIndex < 0 { return ErrInvalidLengthTypes } if postIndex > l { return io.ErrUnexpectedEOF } - m.Key = append(m.Key[:0], dAtA[iNdEx:postIndex]...) - if m.Key == nil { - m.Key = []byte{} + if m.ValidatorSetUpdate == nil { + m.ValidatorSetUpdate = &ValidatorSetUpdate{} + } + if err := m.ValidatorSetUpdate.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err } iNdEx = postIndex - case 7: + default: + iNdEx = preIndex + skippy, err := skipTypes(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthTypes + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *ResponseCommit) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTypes + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: ResponseCommit: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: ResponseCommit: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 2: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Value", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field Data", wireType) } var byteLen int for shift := uint(0); ; shift += 7 { @@ -11201,16 +16801,16 @@ func (m *ResponseQuery) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - m.Value = append(m.Value[:0], dAtA[iNdEx:postIndex]...) - if m.Value == nil { - m.Value = []byte{} + m.Data = append(m.Data[:0], dAtA[iNdEx:postIndex]...) + if m.Data == nil { + m.Data = []byte{} } iNdEx = postIndex - case 8: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field ProofOps", wireType) + case 3: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field RetainHeight", wireType) } - var msglen int + m.RetainHeight = 0 for shift := uint(0); ; shift += 7 { if shift >= 64 { return ErrIntOverflowTypes @@ -11220,52 +16820,66 @@ func (m *ResponseQuery) Unmarshal(dAtA []byte) error { } b := dAtA[iNdEx] iNdEx++ - msglen |= int(b&0x7F) << shift + m.RetainHeight |= int64(b&0x7F) << shift if b < 0x80 { break } } - if msglen < 0 { - return ErrInvalidLengthTypes + default: + iNdEx = preIndex + skippy, err := skipTypes(dAtA[iNdEx:]) + if err != nil { + return err } - postIndex := iNdEx + msglen - if postIndex < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthTypes } - if postIndex > l { + if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF } - if m.ProofOps == nil { - m.ProofOps = &crypto.ProofOps{} - } - if err := m.ProofOps.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *ResponseListSnapshots) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTypes } - iNdEx = postIndex - case 9: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field Height", wireType) + if iNdEx >= l { + return io.ErrUnexpectedEOF } - m.Height = 0 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowTypes - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - m.Height |= int64(b&0x7F) << shift - if b < 0x80 { - break - } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break } - case 10: + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: ResponseListSnapshots: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: ResponseListSnapshots: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Codespace", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field Snapshots", wireType) } - var stringLen uint64 + var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { return ErrIntOverflowTypes @@ -11275,23 +16889,25 @@ func (m *ResponseQuery) Unmarshal(dAtA []byte) error { } b := dAtA[iNdEx] iNdEx++ - stringLen |= uint64(b&0x7F) << shift + msglen |= int(b&0x7F) << shift if b < 0x80 { break } } - intStringLen := int(stringLen) - if intStringLen < 0 { + if msglen < 0 { return ErrInvalidLengthTypes } - postIndex := iNdEx + intStringLen + postIndex := iNdEx + msglen if postIndex < 0 { return ErrInvalidLengthTypes } if postIndex > l { return io.ErrUnexpectedEOF } - m.Codespace = string(dAtA[iNdEx:postIndex]) + m.Snapshots = append(m.Snapshots, &Snapshot{}) + if err := m.Snapshots[len(m.Snapshots)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } iNdEx = postIndex default: iNdEx = preIndex @@ -11314,7 +16930,7 @@ func (m *ResponseQuery) Unmarshal(dAtA []byte) error { } return nil } -func (m *ResponseBeginBlock) Unmarshal(dAtA []byte) error { +func (m *ResponseOfferSnapshot) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 for iNdEx < l { @@ -11337,17 +16953,17 @@ func (m *ResponseBeginBlock) Unmarshal(dAtA []byte) error { fieldNum := int32(wire >> 3) wireType := int(wire & 0x7) if wireType == 4 { - return fmt.Errorf("proto: ResponseBeginBlock: wiretype end group for non-group") + return fmt.Errorf("proto: ResponseOfferSnapshot: wiretype end group for non-group") } if fieldNum <= 0 { - return fmt.Errorf("proto: ResponseBeginBlock: illegal tag %d (wire type %d)", fieldNum, wire) + return fmt.Errorf("proto: ResponseOfferSnapshot: illegal tag %d (wire type %d)", fieldNum, wire) } switch fieldNum { case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Events", wireType) + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field Result", wireType) } - var msglen int + m.Result = 0 for shift := uint(0); ; shift += 7 { if shift >= 64 { return ErrIntOverflowTypes @@ -11357,26 +16973,11 @@ func (m *ResponseBeginBlock) Unmarshal(dAtA []byte) error { } b := dAtA[iNdEx] iNdEx++ - msglen |= int(b&0x7F) << shift + m.Result |= ResponseOfferSnapshot_Result(b&0x7F) << shift if b < 0x80 { break } } - if msglen < 0 { - return ErrInvalidLengthTypes - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthTypes - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Events = append(m.Events, Event{}) - if err := m.Events[len(m.Events)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex default: iNdEx = preIndex skippy, err := skipTypes(dAtA[iNdEx:]) @@ -11398,7 +16999,7 @@ func (m *ResponseBeginBlock) Unmarshal(dAtA []byte) error { } return nil } -func (m *ResponseCheckTx) Unmarshal(dAtA []byte) error { +func (m *ResponseLoadSnapshotChunk) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 for iNdEx < l { @@ -11421,34 +17022,15 @@ func (m *ResponseCheckTx) Unmarshal(dAtA []byte) error { fieldNum := int32(wire >> 3) wireType := int(wire & 0x7) if wireType == 4 { - return fmt.Errorf("proto: ResponseCheckTx: wiretype end group for non-group") + return fmt.Errorf("proto: ResponseLoadSnapshotChunk: wiretype end group for non-group") } if fieldNum <= 0 { - return fmt.Errorf("proto: ResponseCheckTx: illegal tag %d (wire type %d)", fieldNum, wire) + return fmt.Errorf("proto: ResponseLoadSnapshotChunk: illegal tag %d (wire type %d)", fieldNum, wire) } switch fieldNum { case 1: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field Code", wireType) - } - m.Code = 0 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowTypes - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - m.Code |= uint32(b&0x7F) << shift - if b < 0x80 { - break - } - } - case 2: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Data", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field Chunk", wireType) } var byteLen int for shift := uint(0); ; shift += 7 { @@ -11475,48 +17057,66 @@ func (m *ResponseCheckTx) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - m.Data = append(m.Data[:0], dAtA[iNdEx:postIndex]...) - if m.Data == nil { - m.Data = []byte{} + m.Chunk = append(m.Chunk[:0], dAtA[iNdEx:postIndex]...) + if m.Chunk == nil { + m.Chunk = []byte{} } iNdEx = postIndex - case 3: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Log", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowTypes - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - stringLen |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } + default: + iNdEx = preIndex + skippy, err := skipTypes(dAtA[iNdEx:]) + if err != nil { + return err } - intStringLen := int(stringLen) - if intStringLen < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthTypes } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthTypes + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF } - if postIndex > l { + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *ResponseApplySnapshotChunk) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTypes + } + if iNdEx >= l { return io.ErrUnexpectedEOF } - m.Log = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - case 4: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Info", wireType) + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break } - var stringLen uint64 + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: ResponseApplySnapshotChunk: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: ResponseApplySnapshotChunk: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field Result", wireType) + } + m.Result = 0 for shift := uint(0); ; shift += 7 { if shift >= 64 { return ErrIntOverflowTypes @@ -11526,48 +17126,92 @@ func (m *ResponseCheckTx) Unmarshal(dAtA []byte) error { } b := dAtA[iNdEx] iNdEx++ - stringLen |= uint64(b&0x7F) << shift + m.Result |= ResponseApplySnapshotChunk_Result(b&0x7F) << shift if b < 0x80 { break } } - intStringLen := int(stringLen) - if intStringLen < 0 { - return ErrInvalidLengthTypes - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthTypes - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Info = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - case 5: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field GasWanted", wireType) - } - m.GasWanted = 0 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowTypes + case 2: + if wireType == 0 { + var v uint32 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTypes + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= uint32(b&0x7F) << shift + if b < 0x80 { + break + } } - if iNdEx >= l { + m.RefetchChunks = append(m.RefetchChunks, v) + } else if wireType == 2 { + var packedLen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTypes + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + packedLen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if packedLen < 0 { + return ErrInvalidLengthTypes + } + postIndex := iNdEx + packedLen + if postIndex < 0 { + return ErrInvalidLengthTypes + } + if postIndex > l { return io.ErrUnexpectedEOF } - b := dAtA[iNdEx] - iNdEx++ - m.GasWanted |= int64(b&0x7F) << shift - if b < 0x80 { - break + var elementCount int + var count int + for _, integer := range dAtA[iNdEx:postIndex] { + if integer < 128 { + count++ + } + } + elementCount = count + if elementCount != 0 && len(m.RefetchChunks) == 0 { + m.RefetchChunks = make([]uint32, 0, elementCount) + } + for iNdEx < postIndex { + var v uint32 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTypes + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= uint32(b&0x7F) << shift + if b < 0x80 { + break + } + } + m.RefetchChunks = append(m.RefetchChunks, v) } + } else { + return fmt.Errorf("proto: wrong wireType = %d for field RefetchChunks", wireType) } - case 6: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field GasUsed", wireType) + case 3: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field RejectSenders", wireType) } - m.GasUsed = 0 + var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { return ErrIntOverflowTypes @@ -11577,14 +17221,77 @@ func (m *ResponseCheckTx) Unmarshal(dAtA []byte) error { } b := dAtA[iNdEx] iNdEx++ - m.GasUsed |= int64(b&0x7F) << shift + stringLen |= uint64(b&0x7F) << shift if b < 0x80 { break } } - case 7: + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthTypes + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthTypes + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.RejectSenders = append(m.RejectSenders, string(dAtA[iNdEx:postIndex])) + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipTypes(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthTypes + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *ResponsePrepareProposal) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTypes + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: ResponsePrepareProposal: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: ResponsePrepareProposal: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Events", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field TxRecords", wireType) } var msglen int for shift := uint(0); ; shift += 7 { @@ -11611,16 +17318,16 @@ func (m *ResponseCheckTx) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - m.Events = append(m.Events, Event{}) - if err := m.Events[len(m.Events)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + m.TxRecords = append(m.TxRecords, &TxRecord{}) + if err := m.TxRecords[len(m.TxRecords)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { return err } iNdEx = postIndex - case 8: + case 2: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Codespace", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field AppHash", wireType) } - var stringLen uint64 + var byteLen int for shift := uint(0); ; shift += 7 { if shift >= 64 { return ErrIntOverflowTypes @@ -11630,29 +17337,31 @@ func (m *ResponseCheckTx) Unmarshal(dAtA []byte) error { } b := dAtA[iNdEx] iNdEx++ - stringLen |= uint64(b&0x7F) << shift + byteLen |= int(b&0x7F) << shift if b < 0x80 { break } } - intStringLen := int(stringLen) - if intStringLen < 0 { + if byteLen < 0 { return ErrInvalidLengthTypes } - postIndex := iNdEx + intStringLen + postIndex := iNdEx + byteLen if postIndex < 0 { return ErrInvalidLengthTypes } if postIndex > l { return io.ErrUnexpectedEOF } - m.Codespace = string(dAtA[iNdEx:postIndex]) + m.AppHash = append(m.AppHash[:0], dAtA[iNdEx:postIndex]...) + if m.AppHash == nil { + m.AppHash = []byte{} + } iNdEx = postIndex - case 9: + case 3: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Sender", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field TxResults", wireType) } - var stringLen uint64 + var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { return ErrIntOverflowTypes @@ -11662,29 +17371,31 @@ func (m *ResponseCheckTx) Unmarshal(dAtA []byte) error { } b := dAtA[iNdEx] iNdEx++ - stringLen |= uint64(b&0x7F) << shift + msglen |= int(b&0x7F) << shift if b < 0x80 { break } } - intStringLen := int(stringLen) - if intStringLen < 0 { + if msglen < 0 { return ErrInvalidLengthTypes } - postIndex := iNdEx + intStringLen + postIndex := iNdEx + msglen if postIndex < 0 { return ErrInvalidLengthTypes } if postIndex > l { return io.ErrUnexpectedEOF } - m.Sender = string(dAtA[iNdEx:postIndex]) + m.TxResults = append(m.TxResults, &ExecTxResult{}) + if err := m.TxResults[len(m.TxResults)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } iNdEx = postIndex - case 10: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field Priority", wireType) + case 4: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field ValidatorUpdates", wireType) } - m.Priority = 0 + var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { return ErrIntOverflowTypes @@ -11694,16 +17405,31 @@ func (m *ResponseCheckTx) Unmarshal(dAtA []byte) error { } b := dAtA[iNdEx] iNdEx++ - m.Priority |= int64(b&0x7F) << shift + msglen |= int(b&0x7F) << shift if b < 0x80 { break } } - case 11: + if msglen < 0 { + return ErrInvalidLengthTypes + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthTypes + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.ValidatorUpdates = append(m.ValidatorUpdates, &ValidatorUpdate{}) + if err := m.ValidatorUpdates[len(m.ValidatorUpdates)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 5: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field MempoolError", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field ConsensusParamUpdates", wireType) } - var stringLen uint64 + var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { return ErrIntOverflowTypes @@ -11713,23 +17439,27 @@ func (m *ResponseCheckTx) Unmarshal(dAtA []byte) error { } b := dAtA[iNdEx] iNdEx++ - stringLen |= uint64(b&0x7F) << shift + msglen |= int(b&0x7F) << shift if b < 0x80 { break } } - intStringLen := int(stringLen) - if intStringLen < 0 { + if msglen < 0 { return ErrInvalidLengthTypes } - postIndex := iNdEx + intStringLen + postIndex := iNdEx + msglen if postIndex < 0 { return ErrInvalidLengthTypes } if postIndex > l { return io.ErrUnexpectedEOF } - m.MempoolError = string(dAtA[iNdEx:postIndex]) + if m.ConsensusParamUpdates == nil { + m.ConsensusParamUpdates = &types1.ConsensusParams{} + } + if err := m.ConsensusParamUpdates.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } iNdEx = postIndex default: iNdEx = preIndex @@ -11752,7 +17482,7 @@ func (m *ResponseCheckTx) Unmarshal(dAtA []byte) error { } return nil } -func (m *ResponseDeliverTx) Unmarshal(dAtA []byte) error { +func (m *ResponseProcessProposal) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 for iNdEx < l { @@ -11775,17 +17505,17 @@ func (m *ResponseDeliverTx) Unmarshal(dAtA []byte) error { fieldNum := int32(wire >> 3) wireType := int(wire & 0x7) if wireType == 4 { - return fmt.Errorf("proto: ResponseDeliverTx: wiretype end group for non-group") + return fmt.Errorf("proto: ResponseProcessProposal: wiretype end group for non-group") } if fieldNum <= 0 { - return fmt.Errorf("proto: ResponseDeliverTx: illegal tag %d (wire type %d)", fieldNum, wire) + return fmt.Errorf("proto: ResponseProcessProposal: illegal tag %d (wire type %d)", fieldNum, wire) } switch fieldNum { case 1: if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field Code", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field Status", wireType) } - m.Code = 0 + m.Status = 0 for shift := uint(0); ; shift += 7 { if shift >= 64 { return ErrIntOverflowTypes @@ -11795,14 +17525,14 @@ func (m *ResponseDeliverTx) Unmarshal(dAtA []byte) error { } b := dAtA[iNdEx] iNdEx++ - m.Code |= uint32(b&0x7F) << shift + m.Status |= ResponseProcessProposal_ProposalStatus(b&0x7F) << shift if b < 0x80 { break } } case 2: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Data", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field AppHash", wireType) } var byteLen int for shift := uint(0); ; shift += 7 { @@ -11829,16 +17559,16 @@ func (m *ResponseDeliverTx) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - m.Data = append(m.Data[:0], dAtA[iNdEx:postIndex]...) - if m.Data == nil { - m.Data = []byte{} + m.AppHash = append(m.AppHash[:0], dAtA[iNdEx:postIndex]...) + if m.AppHash == nil { + m.AppHash = []byte{} } iNdEx = postIndex case 3: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Log", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field TxResults", wireType) } - var stringLen uint64 + var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { return ErrIntOverflowTypes @@ -11848,29 +17578,31 @@ func (m *ResponseDeliverTx) Unmarshal(dAtA []byte) error { } b := dAtA[iNdEx] iNdEx++ - stringLen |= uint64(b&0x7F) << shift + msglen |= int(b&0x7F) << shift if b < 0x80 { break } } - intStringLen := int(stringLen) - if intStringLen < 0 { + if msglen < 0 { return ErrInvalidLengthTypes } - postIndex := iNdEx + intStringLen + postIndex := iNdEx + msglen if postIndex < 0 { return ErrInvalidLengthTypes } if postIndex > l { return io.ErrUnexpectedEOF } - m.Log = string(dAtA[iNdEx:postIndex]) + m.TxResults = append(m.TxResults, &ExecTxResult{}) + if err := m.TxResults[len(m.TxResults)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } iNdEx = postIndex case 4: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Info", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field ValidatorUpdates", wireType) } - var stringLen uint64 + var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { return ErrIntOverflowTypes @@ -11880,29 +17612,31 @@ func (m *ResponseDeliverTx) Unmarshal(dAtA []byte) error { } b := dAtA[iNdEx] iNdEx++ - stringLen |= uint64(b&0x7F) << shift + msglen |= int(b&0x7F) << shift if b < 0x80 { break } } - intStringLen := int(stringLen) - if intStringLen < 0 { + if msglen < 0 { return ErrInvalidLengthTypes } - postIndex := iNdEx + intStringLen + postIndex := iNdEx + msglen if postIndex < 0 { return ErrInvalidLengthTypes } if postIndex > l { return io.ErrUnexpectedEOF } - m.Info = string(dAtA[iNdEx:postIndex]) + m.ValidatorUpdates = append(m.ValidatorUpdates, &ValidatorUpdate{}) + if err := m.ValidatorUpdates[len(m.ValidatorUpdates)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } iNdEx = postIndex case 5: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field GasWanted", wireType) + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field ConsensusParamUpdates", wireType) } - m.GasWanted = 0 + var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { return ErrIntOverflowTypes @@ -11912,35 +17646,83 @@ func (m *ResponseDeliverTx) Unmarshal(dAtA []byte) error { } b := dAtA[iNdEx] iNdEx++ - m.GasWanted |= int64(b&0x7F) << shift + msglen |= int(b&0x7F) << shift if b < 0x80 { break } } - case 6: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field GasUsed", wireType) + if msglen < 0 { + return ErrInvalidLengthTypes } - m.GasUsed = 0 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowTypes - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - m.GasUsed |= int64(b&0x7F) << shift - if b < 0x80 { - break - } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthTypes + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.ConsensusParamUpdates == nil { + m.ConsensusParamUpdates = &types1.ConsensusParams{} + } + if err := m.ConsensusParamUpdates.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipTypes(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthTypes + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *ResponseExtendVote) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTypes } - case 7: + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: ResponseExtendVote: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: ResponseExtendVote: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Events", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field VoteExtension", wireType) } - var msglen int + var byteLen int for shift := uint(0); ; shift += 7 { if shift >= 64 { return ErrIntOverflowTypes @@ -11950,31 +17732,81 @@ func (m *ResponseDeliverTx) Unmarshal(dAtA []byte) error { } b := dAtA[iNdEx] iNdEx++ - msglen |= int(b&0x7F) << shift + byteLen |= int(b&0x7F) << shift if b < 0x80 { break } } - if msglen < 0 { + if byteLen < 0 { return ErrInvalidLengthTypes } - postIndex := iNdEx + msglen + postIndex := iNdEx + byteLen if postIndex < 0 { return ErrInvalidLengthTypes } if postIndex > l { return io.ErrUnexpectedEOF } - m.Events = append(m.Events, Event{}) - if err := m.Events[len(m.Events)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err + m.VoteExtension = append(m.VoteExtension[:0], dAtA[iNdEx:postIndex]...) + if m.VoteExtension == nil { + m.VoteExtension = []byte{} } iNdEx = postIndex - case 8: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Codespace", wireType) + default: + iNdEx = preIndex + skippy, err := skipTypes(dAtA[iNdEx:]) + if err != nil { + return err } - var stringLen uint64 + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthTypes + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *ResponseVerifyVoteExtension) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTypes + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: ResponseVerifyVoteExtension: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: ResponseVerifyVoteExtension: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field Status", wireType) + } + m.Status = 0 for shift := uint(0); ; shift += 7 { if shift >= 64 { return ErrIntOverflowTypes @@ -11984,24 +17816,11 @@ func (m *ResponseDeliverTx) Unmarshal(dAtA []byte) error { } b := dAtA[iNdEx] iNdEx++ - stringLen |= uint64(b&0x7F) << shift + m.Status |= ResponseVerifyVoteExtension_VerifyStatus(b&0x7F) << shift if b < 0x80 { break } } - intStringLen := int(stringLen) - if intStringLen < 0 { - return ErrInvalidLengthTypes - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthTypes - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Codespace = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex default: iNdEx = preIndex skippy, err := skipTypes(dAtA[iNdEx:]) @@ -12023,7 +17842,7 @@ func (m *ResponseDeliverTx) Unmarshal(dAtA []byte) error { } return nil } -func (m *ResponseEndBlock) Unmarshal(dAtA []byte) error { +func (m *ResponseFinalizeBlock) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 for iNdEx < l { @@ -12046,15 +17865,15 @@ func (m *ResponseEndBlock) Unmarshal(dAtA []byte) error { fieldNum := int32(wire >> 3) wireType := int(wire & 0x7) if wireType == 4 { - return fmt.Errorf("proto: ResponseEndBlock: wiretype end group for non-group") + return fmt.Errorf("proto: ResponseFinalizeBlock: wiretype end group for non-group") } if fieldNum <= 0 { - return fmt.Errorf("proto: ResponseEndBlock: illegal tag %d (wire type %d)", fieldNum, wire) + return fmt.Errorf("proto: ResponseFinalizeBlock: illegal tag %d (wire type %d)", fieldNum, wire) } switch fieldNum { - case 2: + case 1: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field ConsensusParamUpdates", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field Events", wireType) } var msglen int for shift := uint(0); ; shift += 7 { @@ -12081,16 +17900,48 @@ func (m *ResponseEndBlock) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - if m.ConsensusParamUpdates == nil { - m.ConsensusParamUpdates = &types1.ConsensusParams{} + m.Events = append(m.Events, Event{}) + if err := m.Events[len(m.Events)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err } - if err := m.ConsensusParamUpdates.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field TxResults", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTypes + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthTypes + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthTypes + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.TxResults = append(m.TxResults, &ExecTxResult{}) + if err := m.TxResults[len(m.TxResults)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { return err } iNdEx = postIndex - case 3: + case 4: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Events", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field ConsensusParamUpdates", wireType) } var msglen int for shift := uint(0); ; shift += 7 { @@ -12117,11 +17968,66 @@ func (m *ResponseEndBlock) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - m.Events = append(m.Events, Event{}) - if err := m.Events[len(m.Events)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + if m.ConsensusParamUpdates == nil { + m.ConsensusParamUpdates = &types1.ConsensusParams{} + } + if err := m.ConsensusParamUpdates.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { return err } iNdEx = postIndex + case 5: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field AppHash", wireType) + } + var byteLen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTypes + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + byteLen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if byteLen < 0 { + return ErrInvalidLengthTypes + } + postIndex := iNdEx + byteLen + if postIndex < 0 { + return ErrInvalidLengthTypes + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.AppHash = append(m.AppHash[:0], dAtA[iNdEx:postIndex]...) + if m.AppHash == nil { + m.AppHash = []byte{} + } + iNdEx = postIndex + case 6: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field RetainHeight", wireType) + } + m.RetainHeight = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTypes + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.RetainHeight |= int64(b&0x7F) << shift + if b < 0x80 { + break + } + } case 100: if wireType != 2 { return fmt.Errorf("proto: wrong wireType = %d for field NextCoreChainLockUpdate", wireType) @@ -12215,7 +18121,7 @@ func (m *ResponseEndBlock) Unmarshal(dAtA []byte) error { } return nil } -func (m *ResponseCommit) Unmarshal(dAtA []byte) error { +func (m *CommitInfo) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 for iNdEx < l { @@ -12238,15 +18144,34 @@ func (m *ResponseCommit) Unmarshal(dAtA []byte) error { fieldNum := int32(wire >> 3) wireType := int(wire & 0x7) if wireType == 4 { - return fmt.Errorf("proto: ResponseCommit: wiretype end group for non-group") + return fmt.Errorf("proto: CommitInfo: wiretype end group for non-group") } if fieldNum <= 0 { - return fmt.Errorf("proto: ResponseCommit: illegal tag %d (wire type %d)", fieldNum, wire) + return fmt.Errorf("proto: CommitInfo: illegal tag %d (wire type %d)", fieldNum, wire) } switch fieldNum { - case 2: + case 1: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field Round", wireType) + } + m.Round = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTypes + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.Round |= int32(b&0x7F) << shift + if b < 0x80 { + break + } + } + case 3: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Data", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field QuorumHash", wireType) } var byteLen int for shift := uint(0); ; shift += 7 { @@ -12273,16 +18198,16 @@ func (m *ResponseCommit) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - m.Data = append(m.Data[:0], dAtA[iNdEx:postIndex]...) - if m.Data == nil { - m.Data = []byte{} + m.QuorumHash = append(m.QuorumHash[:0], dAtA[iNdEx:postIndex]...) + if m.QuorumHash == nil { + m.QuorumHash = []byte{} } iNdEx = postIndex - case 3: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field RetainHeight", wireType) + case 4: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field BlockSignature", wireType) } - m.RetainHeight = 0 + var byteLen int for shift := uint(0); ; shift += 7 { if shift >= 64 { return ErrIntOverflowTypes @@ -12292,66 +18217,31 @@ func (m *ResponseCommit) Unmarshal(dAtA []byte) error { } b := dAtA[iNdEx] iNdEx++ - m.RetainHeight |= int64(b&0x7F) << shift + byteLen |= int(b&0x7F) << shift if b < 0x80 { break } } - default: - iNdEx = preIndex - skippy, err := skipTypes(dAtA[iNdEx:]) - if err != nil { - return err - } - if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLengthTypes - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF + if byteLen < 0 { + return ErrInvalidLengthTypes } - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *ResponseListSnapshots) Unmarshal(dAtA []byte) error { - l := len(dAtA) - iNdEx := 0 - for iNdEx < l { - preIndex := iNdEx - var wire uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowTypes + postIndex := iNdEx + byteLen + if postIndex < 0 { + return ErrInvalidLengthTypes } - if iNdEx >= l { + if postIndex > l { return io.ErrUnexpectedEOF } - b := dAtA[iNdEx] - iNdEx++ - wire |= uint64(b&0x7F) << shift - if b < 0x80 { - break + m.BlockSignature = append(m.BlockSignature[:0], dAtA[iNdEx:postIndex]...) + if m.BlockSignature == nil { + m.BlockSignature = []byte{} } - } - fieldNum := int32(wire >> 3) - wireType := int(wire & 0x7) - if wireType == 4 { - return fmt.Errorf("proto: ResponseListSnapshots: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: ResponseListSnapshots: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: + iNdEx = postIndex + case 5: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Snapshots", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field StateSignature", wireType) } - var msglen int + var byteLen int for shift := uint(0); ; shift += 7 { if shift >= 64 { return ErrIntOverflowTypes @@ -12361,24 +18251,24 @@ func (m *ResponseListSnapshots) Unmarshal(dAtA []byte) error { } b := dAtA[iNdEx] iNdEx++ - msglen |= int(b&0x7F) << shift + byteLen |= int(b&0x7F) << shift if b < 0x80 { break } } - if msglen < 0 { + if byteLen < 0 { return ErrInvalidLengthTypes } - postIndex := iNdEx + msglen + postIndex := iNdEx + byteLen if postIndex < 0 { return ErrInvalidLengthTypes } if postIndex > l { return io.ErrUnexpectedEOF } - m.Snapshots = append(m.Snapshots, &Snapshot{}) - if err := m.Snapshots[len(m.Snapshots)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err + m.StateSignature = append(m.StateSignature[:0], dAtA[iNdEx:postIndex]...) + if m.StateSignature == nil { + m.StateSignature = []byte{} } iNdEx = postIndex default: @@ -12402,7 +18292,7 @@ func (m *ResponseListSnapshots) Unmarshal(dAtA []byte) error { } return nil } -func (m *ResponseOfferSnapshot) Unmarshal(dAtA []byte) error { +func (m *ExtendedCommitInfo) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 for iNdEx < l { @@ -12425,17 +18315,17 @@ func (m *ResponseOfferSnapshot) Unmarshal(dAtA []byte) error { fieldNum := int32(wire >> 3) wireType := int(wire & 0x7) if wireType == 4 { - return fmt.Errorf("proto: ResponseOfferSnapshot: wiretype end group for non-group") + return fmt.Errorf("proto: ExtendedCommitInfo: wiretype end group for non-group") } if fieldNum <= 0 { - return fmt.Errorf("proto: ResponseOfferSnapshot: illegal tag %d (wire type %d)", fieldNum, wire) + return fmt.Errorf("proto: ExtendedCommitInfo: illegal tag %d (wire type %d)", fieldNum, wire) } switch fieldNum { case 1: if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field Result", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field Round", wireType) } - m.Result = 0 + m.Round = 0 for shift := uint(0); ; shift += 7 { if shift >= 64 { return ErrIntOverflowTypes @@ -12445,66 +18335,16 @@ func (m *ResponseOfferSnapshot) Unmarshal(dAtA []byte) error { } b := dAtA[iNdEx] iNdEx++ - m.Result |= ResponseOfferSnapshot_Result(b&0x7F) << shift + m.Round |= int32(b&0x7F) << shift if b < 0x80 { break } } - default: - iNdEx = preIndex - skippy, err := skipTypes(dAtA[iNdEx:]) - if err != nil { - return err - } - if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLengthTypes - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *ResponseLoadSnapshotChunk) Unmarshal(dAtA []byte) error { - l := len(dAtA) - iNdEx := 0 - for iNdEx < l { - preIndex := iNdEx - var wire uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowTypes - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - wire |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - fieldNum := int32(wire >> 3) - wireType := int(wire & 0x7) - if wireType == 4 { - return fmt.Errorf("proto: ResponseLoadSnapshotChunk: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: ResponseLoadSnapshotChunk: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: + case 2: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Chunk", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field Votes", wireType) } - var byteLen int + var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { return ErrIntOverflowTypes @@ -12514,24 +18354,24 @@ func (m *ResponseLoadSnapshotChunk) Unmarshal(dAtA []byte) error { } b := dAtA[iNdEx] iNdEx++ - byteLen |= int(b&0x7F) << shift + msglen |= int(b&0x7F) << shift if b < 0x80 { break } } - if byteLen < 0 { + if msglen < 0 { return ErrInvalidLengthTypes } - postIndex := iNdEx + byteLen + postIndex := iNdEx + msglen if postIndex < 0 { return ErrInvalidLengthTypes } if postIndex > l { return io.ErrUnexpectedEOF } - m.Chunk = append(m.Chunk[:0], dAtA[iNdEx:postIndex]...) - if m.Chunk == nil { - m.Chunk = []byte{} + m.Votes = append(m.Votes, ExtendedVoteInfo{}) + if err := m.Votes[len(m.Votes)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err } iNdEx = postIndex default: @@ -12555,7 +18395,7 @@ func (m *ResponseLoadSnapshotChunk) Unmarshal(dAtA []byte) error { } return nil } -func (m *ResponseApplySnapshotChunk) Unmarshal(dAtA []byte) error { +func (m *Event) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 for iNdEx < l { @@ -12578,17 +18418,17 @@ func (m *ResponseApplySnapshotChunk) Unmarshal(dAtA []byte) error { fieldNum := int32(wire >> 3) wireType := int(wire & 0x7) if wireType == 4 { - return fmt.Errorf("proto: ResponseApplySnapshotChunk: wiretype end group for non-group") + return fmt.Errorf("proto: Event: wiretype end group for non-group") } if fieldNum <= 0 { - return fmt.Errorf("proto: ResponseApplySnapshotChunk: illegal tag %d (wire type %d)", fieldNum, wire) + return fmt.Errorf("proto: Event: illegal tag %d (wire type %d)", fieldNum, wire) } switch fieldNum { case 1: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field Result", wireType) + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Type", wireType) } - m.Result = 0 + var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { return ErrIntOverflowTypes @@ -12598,92 +18438,29 @@ func (m *ResponseApplySnapshotChunk) Unmarshal(dAtA []byte) error { } b := dAtA[iNdEx] iNdEx++ - m.Result |= ResponseApplySnapshotChunk_Result(b&0x7F) << shift + stringLen |= uint64(b&0x7F) << shift if b < 0x80 { break } } - case 2: - if wireType == 0 { - var v uint32 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowTypes - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - v |= uint32(b&0x7F) << shift - if b < 0x80 { - break - } - } - m.RefetchChunks = append(m.RefetchChunks, v) - } else if wireType == 2 { - var packedLen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowTypes - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - packedLen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if packedLen < 0 { - return ErrInvalidLengthTypes - } - postIndex := iNdEx + packedLen - if postIndex < 0 { - return ErrInvalidLengthTypes - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - var elementCount int - var count int - for _, integer := range dAtA[iNdEx:postIndex] { - if integer < 128 { - count++ - } - } - elementCount = count - if elementCount != 0 && len(m.RefetchChunks) == 0 { - m.RefetchChunks = make([]uint32, 0, elementCount) - } - for iNdEx < postIndex { - var v uint32 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowTypes - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - v |= uint32(b&0x7F) << shift - if b < 0x80 { - break - } - } - m.RefetchChunks = append(m.RefetchChunks, v) - } - } else { - return fmt.Errorf("proto: wrong wireType = %d for field RefetchChunks", wireType) + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthTypes } - case 3: + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthTypes + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Type = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 2: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field RejectSenders", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field Attributes", wireType) } - var stringLen uint64 + var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { return ErrIntOverflowTypes @@ -12693,23 +18470,25 @@ func (m *ResponseApplySnapshotChunk) Unmarshal(dAtA []byte) error { } b := dAtA[iNdEx] iNdEx++ - stringLen |= uint64(b&0x7F) << shift + msglen |= int(b&0x7F) << shift if b < 0x80 { break } } - intStringLen := int(stringLen) - if intStringLen < 0 { + if msglen < 0 { return ErrInvalidLengthTypes } - postIndex := iNdEx + intStringLen + postIndex := iNdEx + msglen if postIndex < 0 { return ErrInvalidLengthTypes } if postIndex > l { return io.ErrUnexpectedEOF } - m.RejectSenders = append(m.RejectSenders, string(dAtA[iNdEx:postIndex])) + m.Attributes = append(m.Attributes, EventAttribute{}) + if err := m.Attributes[len(m.Attributes)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } iNdEx = postIndex default: iNdEx = preIndex @@ -12732,7 +18511,7 @@ func (m *ResponseApplySnapshotChunk) Unmarshal(dAtA []byte) error { } return nil } -func (m *LastCommitInfo) Unmarshal(dAtA []byte) error { +func (m *EventAttribute) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 for iNdEx < l { @@ -12755,36 +18534,17 @@ func (m *LastCommitInfo) Unmarshal(dAtA []byte) error { fieldNum := int32(wire >> 3) wireType := int(wire & 0x7) if wireType == 4 { - return fmt.Errorf("proto: LastCommitInfo: wiretype end group for non-group") + return fmt.Errorf("proto: EventAttribute: wiretype end group for non-group") } if fieldNum <= 0 { - return fmt.Errorf("proto: LastCommitInfo: illegal tag %d (wire type %d)", fieldNum, wire) + return fmt.Errorf("proto: EventAttribute: illegal tag %d (wire type %d)", fieldNum, wire) } switch fieldNum { case 1: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field Round", wireType) - } - m.Round = 0 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowTypes - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - m.Round |= int32(b&0x7F) << shift - if b < 0x80 { - break - } - } - case 3: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field QuorumHash", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field Key", wireType) } - var byteLen int + var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { return ErrIntOverflowTypes @@ -12794,31 +18554,29 @@ func (m *LastCommitInfo) Unmarshal(dAtA []byte) error { } b := dAtA[iNdEx] iNdEx++ - byteLen |= int(b&0x7F) << shift + stringLen |= uint64(b&0x7F) << shift if b < 0x80 { break } } - if byteLen < 0 { + intStringLen := int(stringLen) + if intStringLen < 0 { return ErrInvalidLengthTypes } - postIndex := iNdEx + byteLen + postIndex := iNdEx + intStringLen if postIndex < 0 { return ErrInvalidLengthTypes } if postIndex > l { return io.ErrUnexpectedEOF } - m.QuorumHash = append(m.QuorumHash[:0], dAtA[iNdEx:postIndex]...) - if m.QuorumHash == nil { - m.QuorumHash = []byte{} - } + m.Key = string(dAtA[iNdEx:postIndex]) iNdEx = postIndex - case 4: + case 2: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field BlockSignature", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field Value", wireType) } - var byteLen int + var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { return ErrIntOverflowTypes @@ -12828,31 +18586,29 @@ func (m *LastCommitInfo) Unmarshal(dAtA []byte) error { } b := dAtA[iNdEx] iNdEx++ - byteLen |= int(b&0x7F) << shift + stringLen |= uint64(b&0x7F) << shift if b < 0x80 { break } } - if byteLen < 0 { + intStringLen := int(stringLen) + if intStringLen < 0 { return ErrInvalidLengthTypes } - postIndex := iNdEx + byteLen + postIndex := iNdEx + intStringLen if postIndex < 0 { return ErrInvalidLengthTypes } if postIndex > l { return io.ErrUnexpectedEOF } - m.BlockSignature = append(m.BlockSignature[:0], dAtA[iNdEx:postIndex]...) - if m.BlockSignature == nil { - m.BlockSignature = []byte{} - } + m.Value = string(dAtA[iNdEx:postIndex]) iNdEx = postIndex - case 5: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field StateSignature", wireType) + case 3: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field Index", wireType) } - var byteLen int + var v int for shift := uint(0); ; shift += 7 { if shift >= 64 { return ErrIntOverflowTypes @@ -12862,26 +18618,12 @@ func (m *LastCommitInfo) Unmarshal(dAtA []byte) error { } b := dAtA[iNdEx] iNdEx++ - byteLen |= int(b&0x7F) << shift + v |= int(b&0x7F) << shift if b < 0x80 { break } } - if byteLen < 0 { - return ErrInvalidLengthTypes - } - postIndex := iNdEx + byteLen - if postIndex < 0 { - return ErrInvalidLengthTypes - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.StateSignature = append(m.StateSignature[:0], dAtA[iNdEx:postIndex]...) - if m.StateSignature == nil { - m.StateSignature = []byte{} - } - iNdEx = postIndex + m.Index = bool(v != 0) default: iNdEx = preIndex skippy, err := skipTypes(dAtA[iNdEx:]) @@ -12903,7 +18645,7 @@ func (m *LastCommitInfo) Unmarshal(dAtA []byte) error { } return nil } -func (m *Event) Unmarshal(dAtA []byte) error { +func (m *ExecTxResult) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 for iNdEx < l { @@ -12926,15 +18668,68 @@ func (m *Event) Unmarshal(dAtA []byte) error { fieldNum := int32(wire >> 3) wireType := int(wire & 0x7) if wireType == 4 { - return fmt.Errorf("proto: Event: wiretype end group for non-group") + return fmt.Errorf("proto: ExecTxResult: wiretype end group for non-group") } if fieldNum <= 0 { - return fmt.Errorf("proto: Event: illegal tag %d (wire type %d)", fieldNum, wire) + return fmt.Errorf("proto: ExecTxResult: illegal tag %d (wire type %d)", fieldNum, wire) } switch fieldNum { case 1: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field Code", wireType) + } + m.Code = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTypes + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.Code |= uint32(b&0x7F) << shift + if b < 0x80 { + break + } + } + case 2: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Type", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field Data", wireType) + } + var byteLen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTypes + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + byteLen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if byteLen < 0 { + return ErrInvalidLengthTypes + } + postIndex := iNdEx + byteLen + if postIndex < 0 { + return ErrInvalidLengthTypes + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Data = append(m.Data[:0], dAtA[iNdEx:postIndex]...) + if m.Data == nil { + m.Data = []byte{} + } + iNdEx = postIndex + case 3: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Log", wireType) } var stringLen uint64 for shift := uint(0); ; shift += 7 { @@ -12962,13 +18757,13 @@ func (m *Event) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - m.Type = string(dAtA[iNdEx:postIndex]) + m.Log = string(dAtA[iNdEx:postIndex]) iNdEx = postIndex - case 2: + case 4: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Attributes", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field Info", wireType) } - var msglen int + var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { return ErrIntOverflowTypes @@ -12978,81 +18773,67 @@ func (m *Event) Unmarshal(dAtA []byte) error { } b := dAtA[iNdEx] iNdEx++ - msglen |= int(b&0x7F) << shift + stringLen |= uint64(b&0x7F) << shift if b < 0x80 { break } } - if msglen < 0 { + intStringLen := int(stringLen) + if intStringLen < 0 { return ErrInvalidLengthTypes } - postIndex := iNdEx + msglen + postIndex := iNdEx + intStringLen if postIndex < 0 { return ErrInvalidLengthTypes } if postIndex > l { return io.ErrUnexpectedEOF } - m.Attributes = append(m.Attributes, EventAttribute{}) - if err := m.Attributes[len(m.Attributes)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } + m.Info = string(dAtA[iNdEx:postIndex]) iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipTypes(dAtA[iNdEx:]) - if err != nil { - return err - } - if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLengthTypes - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF + case 5: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field GasWanted", wireType) } - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *EventAttribute) Unmarshal(dAtA []byte) error { - l := len(dAtA) - iNdEx := 0 - for iNdEx < l { - preIndex := iNdEx - var wire uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowTypes + m.GasWanted = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTypes + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.GasWanted |= int64(b&0x7F) << shift + if b < 0x80 { + break + } } - if iNdEx >= l { - return io.ErrUnexpectedEOF + case 6: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field GasUsed", wireType) } - b := dAtA[iNdEx] - iNdEx++ - wire |= uint64(b&0x7F) << shift - if b < 0x80 { - break + m.GasUsed = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTypes + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.GasUsed |= int64(b&0x7F) << shift + if b < 0x80 { + break + } } - } - fieldNum := int32(wire >> 3) - wireType := int(wire & 0x7) - if wireType == 4 { - return fmt.Errorf("proto: EventAttribute: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: EventAttribute: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: + case 7: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Key", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field Events", wireType) } - var stringLen uint64 + var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { return ErrIntOverflowTypes @@ -13062,27 +18843,29 @@ func (m *EventAttribute) Unmarshal(dAtA []byte) error { } b := dAtA[iNdEx] iNdEx++ - stringLen |= uint64(b&0x7F) << shift + msglen |= int(b&0x7F) << shift if b < 0x80 { break } } - intStringLen := int(stringLen) - if intStringLen < 0 { + if msglen < 0 { return ErrInvalidLengthTypes } - postIndex := iNdEx + intStringLen + postIndex := iNdEx + msglen if postIndex < 0 { return ErrInvalidLengthTypes } if postIndex > l { return io.ErrUnexpectedEOF } - m.Key = string(dAtA[iNdEx:postIndex]) + m.Events = append(m.Events, Event{}) + if err := m.Events[len(m.Events)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } iNdEx = postIndex - case 2: + case 8: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Value", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field Codespace", wireType) } var stringLen uint64 for shift := uint(0); ; shift += 7 { @@ -13110,28 +18893,8 @@ func (m *EventAttribute) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - m.Value = string(dAtA[iNdEx:postIndex]) + m.Codespace = string(dAtA[iNdEx:postIndex]) iNdEx = postIndex - case 3: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field Index", wireType) - } - var v int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowTypes - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - v |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - m.Index = bool(v != 0) default: iNdEx = preIndex skippy, err := skipTypes(dAtA[iNdEx:]) @@ -13308,6 +19071,109 @@ func (m *TxResult) Unmarshal(dAtA []byte) error { } return nil } +func (m *TxRecord) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTypes + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: TxRecord: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: TxRecord: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field Action", wireType) + } + m.Action = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTypes + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.Action |= TxRecord_TxAction(b&0x7F) << shift + if b < 0x80 { + break + } + } + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Tx", wireType) + } + var byteLen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTypes + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + byteLen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if byteLen < 0 { + return ErrInvalidLengthTypes + } + postIndex := iNdEx + byteLen + if postIndex < 0 { + return ErrInvalidLengthTypes + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Tx = append(m.Tx[:0], dAtA[iNdEx:postIndex]...) + if m.Tx == nil { + m.Tx = []byte{} + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipTypes(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthTypes + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} func (m *Validator) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 @@ -14003,7 +19869,144 @@ func (m *VoteInfo) Unmarshal(dAtA []byte) error { } return nil } -func (m *Evidence) Unmarshal(dAtA []byte) error { +func (m *ExtendedVoteInfo) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTypes + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: ExtendedVoteInfo: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: ExtendedVoteInfo: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Validator", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTypes + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthTypes + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthTypes + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if err := m.Validator.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 2: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field SignedLastBlock", wireType) + } + var v int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTypes + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + m.SignedLastBlock = bool(v != 0) + case 3: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field VoteExtension", wireType) + } + var byteLen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTypes + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + byteLen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if byteLen < 0 { + return ErrInvalidLengthTypes + } + postIndex := iNdEx + byteLen + if postIndex < 0 { + return ErrInvalidLengthTypes + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.VoteExtension = append(m.VoteExtension[:0], dAtA[iNdEx:postIndex]...) + if m.VoteExtension == nil { + m.VoteExtension = []byte{} + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipTypes(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthTypes + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *Misbehavior) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 for iNdEx < l { @@ -14026,10 +20029,10 @@ func (m *Evidence) Unmarshal(dAtA []byte) error { fieldNum := int32(wire >> 3) wireType := int(wire & 0x7) if wireType == 4 { - return fmt.Errorf("proto: Evidence: wiretype end group for non-group") + return fmt.Errorf("proto: Misbehavior: wiretype end group for non-group") } if fieldNum <= 0 { - return fmt.Errorf("proto: Evidence: illegal tag %d (wire type %d)", fieldNum, wire) + return fmt.Errorf("proto: Misbehavior: illegal tag %d (wire type %d)", fieldNum, wire) } switch fieldNum { case 1: @@ -14046,7 +20049,7 @@ func (m *Evidence) Unmarshal(dAtA []byte) error { } b := dAtA[iNdEx] iNdEx++ - m.Type |= EvidenceType(b&0x7F) << shift + m.Type |= MisbehaviorType(b&0x7F) << shift if b < 0x80 { break } diff --git a/abci/types/types_test.go b/abci/types/types_test.go new file mode 100644 index 0000000000..f79a244544 --- /dev/null +++ b/abci/types/types_test.go @@ -0,0 +1,74 @@ +package types_test + +import ( + "testing" + + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" + + abci "github.com/tendermint/tendermint/abci/types" + "github.com/tendermint/tendermint/crypto/merkle" +) + +func TestHashAndProveResults(t *testing.T) { + trs := []*abci.ExecTxResult{ + // Note, these tests rely on the first two entries being in this order. + {Code: 0, Data: nil}, + {Code: 0, Data: []byte{}}, + + {Code: 0, Data: []byte("one")}, + {Code: 14, Data: nil}, + {Code: 14, Data: []byte("foo")}, + {Code: 14, Data: []byte("bar")}, + } + + // Nil and []byte{} should produce the same bytes + bz0, err := trs[0].Marshal() + require.NoError(t, err) + bz1, err := trs[1].Marshal() + require.NoError(t, err) + require.Equal(t, bz0, bz1) + + // Make sure that we can get a root hash from results and verify proofs. + rs, err := abci.MarshalTxResults(trs) + require.NoError(t, err) + root := merkle.HashFromByteSlices(rs) + assert.NotEmpty(t, root) + + _, proofs := merkle.ProofsFromByteSlices(rs) + for i, tr := range trs { + bz, err := tr.Marshal() + require.NoError(t, err) + + valid := proofs[i].Verify(root, bz) + assert.NoError(t, valid, "%d", i) + } +} + +func TestHashDeterministicFieldsOnly(t *testing.T) { + tr1 := abci.ExecTxResult{ + Code: 1, + Data: []byte("transaction"), + Log: "nondeterministic data: abc", + Info: "nondeterministic data: abc", + GasWanted: 1000, + GasUsed: 1000, + Events: []abci.Event{}, + Codespace: "nondeterministic.data.abc", + } + tr2 := abci.ExecTxResult{ + Code: 1, + Data: []byte("transaction"), + Log: "nondeterministic data: def", + Info: "nondeterministic data: def", + GasWanted: 1000, + GasUsed: 1000, + Events: []abci.Event{}, + Codespace: "nondeterministic.data.def", + } + r1, err := abci.MarshalTxResults([]*abci.ExecTxResult{&tr1}) + require.NoError(t, err) + r2, err := abci.MarshalTxResults([]*abci.ExecTxResult{&tr2}) + require.NoError(t, err) + require.Equal(t, merkle.HashFromByteSlices(r1), merkle.HashFromByteSlices(r2)) +} diff --git a/abci/version/version.go b/abci/version/version.go deleted file mode 100644 index f4dc4d2358..0000000000 --- a/abci/version/version.go +++ /dev/null @@ -1,9 +0,0 @@ -package version - -import ( - "github.com/tendermint/tendermint/version" -) - -// TODO: eliminate this after some version refactor - -const Version = version.ABCIVersion diff --git a/buf.gen.yaml b/buf.gen.yaml index dc56781dd4..d972360bbd 100644 --- a/buf.gen.yaml +++ b/buf.gen.yaml @@ -1,13 +1,9 @@ -# The version of the generation template. -# Required. -# The only currently-valid value is v1beta1. -version: v1beta1 - -# The plugins to run. +version: v1 plugins: - # The name of the plugin. - name: gogofaster - # The the relative output directory. - out: proto - # Any options to provide to the plugin. - opt: Mgoogle/protobuf/timestamp.proto=github.com/gogo/protobuf/types,Mgoogle/protobuf/duration.proto=github.com/golang/protobuf/ptypes/duration,plugins=grpc,paths=source_relative + out: ./proto/ + opt: + - Mgoogle/protobuf/timestamp.proto=github.com/gogo/protobuf/types + - Mgoogle/protobuf/duration.proto=github.com/golang/protobuf/ptypes/duration + - plugins=grpc + - paths=source_relative diff --git a/buf.work.yaml b/buf.work.yaml new file mode 100644 index 0000000000..1878b341be --- /dev/null +++ b/buf.work.yaml @@ -0,0 +1,3 @@ +version: v1 +directories: + - proto diff --git a/cmd/priv_val_server/main.go b/cmd/priv_val_server/main.go index 203b3df0dd..9014221450 100644 --- a/cmd/priv_val_server/main.go +++ b/cmd/priv_val_server/main.go @@ -6,10 +6,11 @@ import ( "crypto/x509" "flag" "fmt" - "io/ioutil" "net" "net/http" "os" + "os/signal" + "syscall" "time" grpc_prometheus "github.com/grpc-ecosystem/go-grpc-prometheus" @@ -20,7 +21,6 @@ import ( "github.com/tendermint/tendermint/libs/log" tmnet "github.com/tendermint/tendermint/libs/net" - tmos "github.com/tendermint/tendermint/libs/os" "github.com/tendermint/tendermint/privval" grpcprivval "github.com/tendermint/tendermint/privval/grpc" privvalproto "github.com/tendermint/tendermint/proto/tendermint/privval" @@ -45,12 +45,19 @@ func main() { keyFile = flag.String("keyfile", "", "absolute path to server key") rootCA = flag.String("rootcafile", "", "absolute path to root CA") prometheusAddr = flag.String("prometheus-addr", "", "address for prometheus endpoint (host:port)") - - logger = log.MustNewDefaultLogger(log.LogFormatPlain, log.LogLevelInfo, false). - With("module", "priv_val") ) flag.Parse() + logger, err := log.NewDefaultLogger(log.LogFormatPlain, log.LogLevelInfo) + if err != nil { + fmt.Fprintf(os.Stderr, "failed to construct logger: %v", err) + os.Exit(1) + } + logger = logger.With("module", "priv_val") + + ctx, cancel := context.WithCancel(context.Background()) + defer cancel() + logger.Info( "Starting private validator", "addr", *addr, @@ -78,7 +85,7 @@ func main() { } certPool := x509.NewCertPool() - bs, err := ioutil.ReadFile(*rootCA) + bs, err := os.ReadFile(*rootCA) if err != nil { fmt.Fprintf(os.Stderr, "failed to read client ca cert: %s", err) os.Exit(1) @@ -106,7 +113,7 @@ func main() { // add prometheus metrics for unary RPC calls opts = append(opts, grpc.UnaryInterceptor(grpc_prometheus.UnaryServerInterceptor)) - ss := grpcprivval.NewSignerServer(*chainID, pv, logger) + ss := grpcprivval.NewSignerServer(logger, *chainID, pv) protocol, address := tmnet.ProtocolAndAddress(*addr) @@ -131,9 +138,10 @@ func main() { os.Exit(1) } - // Stop upon receiving SIGTERM or CTRL-C. - tmos.TrapSignal(logger, func() { - logger.Debug("SignerServer: calling Close") + opctx, opcancel := signal.NotifyContext(ctx, os.Interrupt, syscall.SIGTERM) + defer opcancel() + go func() { + <-opctx.Done() if *prometheusAddr != "" { ctx, cancel := context.WithTimeout(context.Background(), 1*time.Second) defer cancel() @@ -143,7 +151,7 @@ func main() { } } s.GracefulStop() - }) + }() // Run forever. select {} diff --git a/cmd/tenderdash/commands/completion.go b/cmd/tenderdash/commands/completion.go new file mode 100644 index 0000000000..d2c81f0afc --- /dev/null +++ b/cmd/tenderdash/commands/completion.go @@ -0,0 +1,46 @@ +package commands + +import ( + "fmt" + + "github.com/spf13/cobra" +) + +// NewCompletionCmd returns a cobra.Command that generates bash and zsh +// completion scripts for the given root command. If hidden is true, the +// command will not show up in the root command's list of available commands. +func NewCompletionCmd(rootCmd *cobra.Command, hidden bool) *cobra.Command { + flagZsh := "zsh" + cmd := &cobra.Command{ + Use: "completion", + Short: "Generate shell completion scripts", + Long: fmt.Sprintf(`Generate Bash and Zsh completion scripts and print them to STDOUT. + +Once saved to file, a completion script can be loaded in the shell's +current session as shown: + + $ . <(%s completion) + +To configure your bash shell to load completions for each session add to +your $HOME/.bashrc or $HOME/.profile the following instruction: + + . <(%s completion) +`, rootCmd.Use, rootCmd.Use), + RunE: func(cmd *cobra.Command, _ []string) error { + zsh, err := cmd.Flags().GetBool(flagZsh) + if err != nil { + return err + } + if zsh { + return rootCmd.GenZshCompletion(cmd.OutOrStdout()) + } + return rootCmd.GenBashCompletion(cmd.OutOrStdout()) + }, + Hidden: hidden, + Args: cobra.NoArgs, + } + + cmd.Flags().Bool(flagZsh, false, "Generate Zsh completion script") + + return cmd +} diff --git a/cmd/tenderdash/commands/debug/debug.go b/cmd/tenderdash/commands/debug/debug.go index e07f7978de..7fd5b030f7 100644 --- a/cmd/tenderdash/commands/debug/debug.go +++ b/cmd/tenderdash/commands/debug/debug.go @@ -6,34 +6,26 @@ import ( "github.com/tendermint/tendermint/libs/log" ) -var ( - nodeRPCAddr string - profAddr string - frequency uint - +const ( flagNodeRPCAddr = "rpc-laddr" flagProfAddr = "pprof-laddr" flagFrequency = "frequency" - - logger = log.MustNewDefaultLogger(log.LogFormatPlain, log.LogLevelInfo, false) ) -// DebugCmd defines the root command containing subcommands that assist in -// debugging running Tendermint processes. -var DebugCmd = &cobra.Command{ - Use: "debug", - Short: "A utility to kill or watch a Tendermint process while aggregating debugging data", -} - -func init() { - DebugCmd.PersistentFlags().SortFlags = true - DebugCmd.PersistentFlags().StringVar( - &nodeRPCAddr, +func GetDebugCommand(logger log.Logger) *cobra.Command { + cmd := &cobra.Command{ + Use: "debug", + Short: "A utility to kill or watch a Tendermint process while aggregating debugging data", + } + cmd.PersistentFlags().SortFlags = true + cmd.PersistentFlags().String( flagNodeRPCAddr, "tcp://localhost:26657", - "the Tendermint node's RPC address (:)", + "the Tendermint node's RPC address :)", ) - DebugCmd.AddCommand(killCmd) - DebugCmd.AddCommand(dumpCmd) + cmd.AddCommand(getKillCmd(logger)) + cmd.AddCommand(getDumpCmd(logger)) + return cmd + } diff --git a/cmd/tenderdash/commands/debug/dump.go b/cmd/tenderdash/commands/debug/dump.go index cb1cc942a8..d84f6e10aa 100644 --- a/cmd/tenderdash/commands/debug/dump.go +++ b/cmd/tenderdash/commands/debug/dump.go @@ -1,9 +1,9 @@ package debug import ( + "context" "errors" "fmt" - "io/ioutil" "os" "path/filepath" "time" @@ -13,76 +13,102 @@ import ( "github.com/tendermint/tendermint/config" "github.com/tendermint/tendermint/libs/cli" + "github.com/tendermint/tendermint/libs/log" rpchttp "github.com/tendermint/tendermint/rpc/client/http" ) -var dumpCmd = &cobra.Command{ - Use: "dump [output-directory]", - Short: "Continuously poll a Tendermint process and dump debugging data into a single location", - Long: `Continuously poll a Tendermint process and dump debugging data into a single +func getDumpCmd(logger log.Logger) *cobra.Command { + cmd := &cobra.Command{ + Use: "dump [output-directory]", + Short: "Continuously poll a Tendermint process and dump debugging data into a single location", + Long: `Continuously poll a Tendermint process and dump debugging data into a single location at a specified frequency. At each frequency interval, an archived and compressed file will contain node debugging information including the goroutine and heap profiles if enabled.`, - Args: cobra.ExactArgs(1), - RunE: dumpCmdHandler, -} - -func init() { - dumpCmd.Flags().UintVar( - &frequency, + Args: cobra.ExactArgs(1), + RunE: func(cmd *cobra.Command, args []string) error { + outDir := args[0] + if outDir == "" { + return errors.New("invalid output directory") + } + frequency, err := cmd.Flags().GetUint(flagFrequency) + if err != nil { + return fmt.Errorf("flag %q not defined: %w", flagFrequency, err) + } + + if frequency == 0 { + return errors.New("frequency must be positive") + } + + nodeRPCAddr, err := cmd.Flags().GetString(flagNodeRPCAddr) + if err != nil { + return fmt.Errorf("flag %q not defined: %w", flagNodeRPCAddr, err) + } + + profAddr, err := cmd.Flags().GetString(flagProfAddr) + if err != nil { + return fmt.Errorf("flag %q not defined: %w", flagProfAddr, err) + } + + if _, err := os.Stat(outDir); os.IsNotExist(err) { + if err := os.Mkdir(outDir, os.ModePerm); err != nil { + return fmt.Errorf("failed to create output directory: %w", err) + } + } + + rpc, err := rpchttp.New(nodeRPCAddr) + if err != nil { + return fmt.Errorf("failed to create new http client: %w", err) + } + + ctx := cmd.Context() + + home := viper.GetString(cli.HomeFlag) + conf := config.DefaultConfig() + conf = conf.SetRoot(home) + config.EnsureRoot(conf.RootDir) + + dumpArgs := dumpDebugDataArgs{ + conf: conf, + outDir: outDir, + profAddr: profAddr, + } + dumpDebugData(ctx, logger, rpc, dumpArgs) + + ticker := time.NewTicker(time.Duration(frequency) * time.Second) + for range ticker.C { + dumpDebugData(ctx, logger, rpc, dumpArgs) + } + + return nil + }, + } + cmd.Flags().Uint( flagFrequency, 30, "the frequency (seconds) in which to poll, aggregate and dump Tendermint debug data", ) - dumpCmd.Flags().StringVar( - &profAddr, + cmd.Flags().String( flagProfAddr, "", "the profiling server address (:)", ) -} -func dumpCmdHandler(_ *cobra.Command, args []string) error { - outDir := args[0] - if outDir == "" { - return errors.New("invalid output directory") - } + return cmd - if frequency == 0 { - return errors.New("frequency must be positive") - } - - if _, err := os.Stat(outDir); os.IsNotExist(err) { - if err := os.Mkdir(outDir, os.ModePerm); err != nil { - return fmt.Errorf("failed to create output directory: %w", err) - } - } - - rpc, err := rpchttp.New(nodeRPCAddr) - if err != nil { - return fmt.Errorf("failed to create new http client: %w", err) - } - - home := viper.GetString(cli.HomeFlag) - conf := config.DefaultConfig() - conf = conf.SetRoot(home) - config.EnsureRoot(conf.RootDir) - - dumpDebugData(outDir, conf, rpc) - - ticker := time.NewTicker(time.Duration(frequency) * time.Second) - for range ticker.C { - dumpDebugData(outDir, conf, rpc) - } +} - return nil +type dumpDebugDataArgs struct { + conf *config.Config + outDir string + profAddr string } -func dumpDebugData(outDir string, conf *config.Config, rpc *rpchttp.HTTP) { +func dumpDebugData(ctx context.Context, logger log.Logger, rpc *rpchttp.HTTP, args dumpDebugDataArgs) { start := time.Now().UTC() - tmpDir, err := ioutil.TempDir(outDir, "tendermint_debug_tmp") + tmpDir, err := os.MkdirTemp(args.outDir, "tendermint_debug_tmp") if err != nil { logger.Error("failed to create temporary directory", "dir", tmpDir, "error", err) return @@ -90,44 +116,44 @@ func dumpDebugData(outDir string, conf *config.Config, rpc *rpchttp.HTTP) { defer os.RemoveAll(tmpDir) logger.Info("getting node status...") - if err := dumpStatus(rpc, tmpDir, "status.json"); err != nil { + if err := dumpStatus(ctx, rpc, tmpDir, "status.json"); err != nil { logger.Error("failed to dump node status", "error", err) return } logger.Info("getting node network info...") - if err := dumpNetInfo(rpc, tmpDir, "net_info.json"); err != nil { + if err := dumpNetInfo(ctx, rpc, tmpDir, "net_info.json"); err != nil { logger.Error("failed to dump node network info", "error", err) return } logger.Info("getting node consensus state...") - if err := dumpConsensusState(rpc, tmpDir, "consensus_state.json"); err != nil { + if err := dumpConsensusState(ctx, rpc, tmpDir, "consensus_state.json"); err != nil { logger.Error("failed to dump node consensus state", "error", err) return } logger.Info("copying node WAL...") - if err := copyWAL(conf, tmpDir); err != nil { + if err := copyWAL(args.conf, tmpDir); err != nil { logger.Error("failed to copy node WAL", "error", err) return } - if profAddr != "" { + if args.profAddr != "" { logger.Info("getting node goroutine profile...") - if err := dumpProfile(tmpDir, profAddr, "goroutine", 2); err != nil { + if err := dumpProfile(tmpDir, args.profAddr, "goroutine", 2); err != nil { logger.Error("failed to dump goroutine profile", "error", err) return } logger.Info("getting node heap profile...") - if err := dumpProfile(tmpDir, profAddr, "heap", 2); err != nil { + if err := dumpProfile(tmpDir, args.profAddr, "heap", 2); err != nil { logger.Error("failed to dump heap profile", "error", err) return } } - outFile := filepath.Join(outDir, fmt.Sprintf("%s.zip", start.Format(time.RFC3339))) + outFile := filepath.Join(args.outDir, fmt.Sprintf("%s.zip", start.Format(time.RFC3339))) if err := zipDir(tmpDir, outFile); err != nil { logger.Error("failed to create and compress archive", "file", outFile, "error", err) } diff --git a/cmd/tenderdash/commands/debug/io.go b/cmd/tenderdash/commands/debug/io.go index dcfff50c89..bf904cf5c6 100644 --- a/cmd/tenderdash/commands/debug/io.go +++ b/cmd/tenderdash/commands/debug/io.go @@ -5,7 +5,6 @@ import ( "encoding/json" "fmt" "io" - "io/ioutil" "os" "path" "path/filepath" @@ -111,5 +110,5 @@ func writeStateJSONToFile(state interface{}, dir, filename string) error { return fmt.Errorf("failed to encode state dump: %w", err) } - return ioutil.WriteFile(path.Join(dir, filename), stateJSON, os.ModePerm) + return os.WriteFile(path.Join(dir, filename), stateJSON, os.ModePerm) } diff --git a/cmd/tenderdash/commands/debug/kill.go b/cmd/tenderdash/commands/debug/kill.go index 3e749e5131..a6c1ac7d86 100644 --- a/cmd/tenderdash/commands/debug/kill.go +++ b/cmd/tenderdash/commands/debug/kill.go @@ -3,7 +3,6 @@ package debug import ( "errors" "fmt" - "io/ioutil" "os" "os/exec" "path/filepath" @@ -16,88 +15,96 @@ import ( "github.com/tendermint/tendermint/config" "github.com/tendermint/tendermint/libs/cli" + "github.com/tendermint/tendermint/libs/log" rpchttp "github.com/tendermint/tendermint/rpc/client/http" ) -var killCmd = &cobra.Command{ - Use: "kill [pid] [compressed-output-file]", - Short: "Kill a Tendermint process while aggregating and packaging debugging data", - Long: `Kill a Tendermint process while also aggregating Tendermint process data +func getKillCmd(logger log.Logger) *cobra.Command { + cmd := &cobra.Command{ + Use: "kill [pid] [compressed-output-file]", + Short: "Kill a Tendermint process while aggregating and packaging debugging data", + Long: `Kill a Tendermint process while also aggregating Tendermint process data such as the latest node state, including consensus and networking state, go-routine state, and the node's WAL and config information. This aggregated data is packaged into a compressed archive. Example: $ tendermint debug kill 34255 /path/to/tm-debug.zip`, - Args: cobra.ExactArgs(2), - RunE: killCmdHandler, -} - -func killCmdHandler(cmd *cobra.Command, args []string) error { - pid, err := strconv.ParseUint(args[0], 10, 64) - if err != nil { - return err - } - - outFile := args[1] - if outFile == "" { - return errors.New("invalid output file") - } - - rpc, err := rpchttp.New(nodeRPCAddr) - if err != nil { - return fmt.Errorf("failed to create new http client: %w", err) - } - - home := viper.GetString(cli.HomeFlag) - conf := config.DefaultConfig() - conf = conf.SetRoot(home) - config.EnsureRoot(conf.RootDir) - - // Create a temporary directory which will contain all the state dumps and - // relevant files and directories that will be compressed into a file. - tmpDir, err := ioutil.TempDir(os.TempDir(), "tendermint_debug_tmp") - if err != nil { - return fmt.Errorf("failed to create temporary directory: %w", err) - } - defer os.RemoveAll(tmpDir) - - logger.Info("getting node status...") - if err := dumpStatus(rpc, tmpDir, "status.json"); err != nil { - return err - } - - logger.Info("getting node network info...") - if err := dumpNetInfo(rpc, tmpDir, "net_info.json"); err != nil { - return err - } - - logger.Info("getting node consensus state...") - if err := dumpConsensusState(rpc, tmpDir, "consensus_state.json"); err != nil { - return err - } - - logger.Info("copying node WAL...") - if err := copyWAL(conf, tmpDir); err != nil { - if !os.IsNotExist(err) { - return err - } - - logger.Info("node WAL does not exist; continuing...") - } - - logger.Info("copying node configuration...") - if err := copyConfig(home, tmpDir); err != nil { - return err - } - - logger.Info("killing Tendermint process") - if err := killProc(pid, tmpDir); err != nil { - return err + Args: cobra.ExactArgs(2), + RunE: func(cmd *cobra.Command, args []string) error { + ctx := cmd.Context() + pid, err := strconv.ParseInt(args[0], 10, 64) + if err != nil { + return err + } + + outFile := args[1] + if outFile == "" { + return errors.New("invalid output file") + } + nodeRPCAddr, err := cmd.Flags().GetString(flagNodeRPCAddr) + if err != nil { + return fmt.Errorf("flag %q not defined: %w", flagNodeRPCAddr, err) + } + + rpc, err := rpchttp.New(nodeRPCAddr) + if err != nil { + return fmt.Errorf("failed to create new http client: %w", err) + } + + home := viper.GetString(cli.HomeFlag) + conf := config.DefaultConfig() + conf = conf.SetRoot(home) + config.EnsureRoot(conf.RootDir) + + // Create a temporary directory which will contain all the state dumps and + // relevant files and directories that will be compressed into a file. + tmpDir, err := os.MkdirTemp(os.TempDir(), "tendermint_debug_tmp") + if err != nil { + return fmt.Errorf("failed to create temporary directory: %w", err) + } + defer os.RemoveAll(tmpDir) + + logger.Info("getting node status...") + if err := dumpStatus(ctx, rpc, tmpDir, "status.json"); err != nil { + return err + } + + logger.Info("getting node network info...") + if err := dumpNetInfo(ctx, rpc, tmpDir, "net_info.json"); err != nil { + return err + } + + logger.Info("getting node consensus state...") + if err := dumpConsensusState(ctx, rpc, tmpDir, "consensus_state.json"); err != nil { + return err + } + + logger.Info("copying node WAL...") + if err := copyWAL(conf, tmpDir); err != nil { + if !os.IsNotExist(err) { + return err + } + + logger.Info("node WAL does not exist; continuing...") + } + + logger.Info("copying node configuration...") + if err := copyConfig(home, tmpDir); err != nil { + return err + } + + logger.Info("killing Tendermint process") + if err := killProc(int(pid), tmpDir); err != nil { + return err + } + + logger.Info("archiving and compressing debug directory...") + return zipDir(tmpDir, outFile) + }, } - logger.Info("archiving and compressing debug directory...") - return zipDir(tmpDir, outFile) + return cmd } // killProc attempts to kill the Tendermint process with a given PID with an @@ -105,7 +112,7 @@ func killCmdHandler(cmd *cobra.Command, args []string) error { // is tailed and piped to a file under the directory dir. An error is returned // if the output file cannot be created or the tail command cannot be started. // An error is not returned if any subsequent syscall fails. -func killProc(pid uint64, dir string) error { +func killProc(pid int, dir string) error { // pipe STDERR output from tailing the Tendermint process to a file // // NOTE: This will only work on UNIX systems. @@ -128,7 +135,7 @@ func killProc(pid uint64, dir string) error { go func() { // Killing the Tendermint process with the '-ABRT|-6' signal will result in // a goroutine stacktrace. - p, err := os.FindProcess(int(pid)) + p, err := os.FindProcess(pid) if err != nil { fmt.Fprintf(os.Stderr, "failed to find PID to kill Tendermint process: %s", err) } else if err = p.Signal(syscall.SIGABRT); err != nil { diff --git a/cmd/tenderdash/commands/debug/util.go b/cmd/tenderdash/commands/debug/util.go index fa356c4880..24626207f5 100644 --- a/cmd/tenderdash/commands/debug/util.go +++ b/cmd/tenderdash/commands/debug/util.go @@ -3,7 +3,7 @@ package debug import ( "context" "fmt" - "io/ioutil" + "io" "net/http" "os" "path" @@ -15,8 +15,8 @@ import ( // dumpStatus gets node status state dump from the Tendermint RPC and writes it // to file. It returns an error upon failure. -func dumpStatus(rpc *rpchttp.HTTP, dir, filename string) error { - status, err := rpc.Status(context.Background()) +func dumpStatus(ctx context.Context, rpc *rpchttp.HTTP, dir, filename string) error { + status, err := rpc.Status(ctx) if err != nil { return fmt.Errorf("failed to get node status: %w", err) } @@ -26,8 +26,8 @@ func dumpStatus(rpc *rpchttp.HTTP, dir, filename string) error { // dumpNetInfo gets network information state dump from the Tendermint RPC and // writes it to file. It returns an error upon failure. -func dumpNetInfo(rpc *rpchttp.HTTP, dir, filename string) error { - netInfo, err := rpc.NetInfo(context.Background()) +func dumpNetInfo(ctx context.Context, rpc *rpchttp.HTTP, dir, filename string) error { + netInfo, err := rpc.NetInfo(ctx) if err != nil { return fmt.Errorf("failed to get node network information: %w", err) } @@ -37,8 +37,8 @@ func dumpNetInfo(rpc *rpchttp.HTTP, dir, filename string) error { // dumpConsensusState gets consensus state dump from the Tendermint RPC and // writes it to file. It returns an error upon failure. -func dumpConsensusState(rpc *rpchttp.HTTP, dir, filename string) error { - consDump, err := rpc.DumpConsensusState(context.Background()) +func dumpConsensusState(ctx context.Context, rpc *rpchttp.HTTP, dir, filename string) error { + consDump, err := rpc.DumpConsensusState(ctx) if err != nil { return fmt.Errorf("failed to get node consensus dump: %w", err) } @@ -73,10 +73,10 @@ func dumpProfile(dir, addr, profile string, debug int) error { } defer resp.Body.Close() - body, err := ioutil.ReadAll(resp.Body) + body, err := io.ReadAll(resp.Body) if err != nil { return fmt.Errorf("failed to read %s profile response body: %w", profile, err) } - return ioutil.WriteFile(path.Join(dir, fmt.Sprintf("%s.out", profile)), body, os.ModePerm) + return os.WriteFile(path.Join(dir, fmt.Sprintf("%s.out", profile)), body, os.ModePerm) } diff --git a/cmd/tenderdash/commands/gen_node_key.go b/cmd/tenderdash/commands/gen_node_key.go index 81ea2ae70a..2a0bb758eb 100644 --- a/cmd/tenderdash/commands/gen_node_key.go +++ b/cmd/tenderdash/commands/gen_node_key.go @@ -1,11 +1,11 @@ package commands import ( + "encoding/json" "fmt" "github.com/spf13/cobra" - tmjson "github.com/tendermint/tendermint/libs/json" "github.com/tendermint/tendermint/types" ) @@ -20,7 +20,7 @@ var GenNodeKeyCmd = &cobra.Command{ func genNodeKey(cmd *cobra.Command, args []string) error { nodeKey := types.GenNodeKey() - bz, err := tmjson.Marshal(nodeKey) + bz, err := json.Marshal(nodeKey) if err != nil { return fmt.Errorf("nodeKey -> json: %w", err) } diff --git a/cmd/tenderdash/commands/gen_validator.go b/cmd/tenderdash/commands/gen_validator.go index 0ab74af5b7..bbe09e9127 100644 --- a/cmd/tenderdash/commands/gen_validator.go +++ b/cmd/tenderdash/commands/gen_validator.go @@ -1,42 +1,33 @@ package commands import ( + "encoding/json" "fmt" "github.com/spf13/cobra" - tmjson "github.com/tendermint/tendermint/libs/json" "github.com/tendermint/tendermint/privval" - "github.com/tendermint/tendermint/types" ) -var ( - keyType string -) - -// GenValidatorCmd allows the generation of a keypair for a +// MakeGenValidatorCommand allows the generation of a keypair for a // validator. -var GenValidatorCmd = &cobra.Command{ - Use: "gen-validator", - Short: "Generate new validator keypair", - RunE: genValidator, -} - -func init() { - GenValidatorCmd.Flags().StringVar(&keyType, "key", types.ABCIPubKeyTypeEd25519, - "Key type to generate privval file with. Options: ed25519, secp256k1") -} - -func genValidator(cmd *cobra.Command, args []string) error { - pv := privval.GenFilePV("", "") - - jsbz, err := tmjson.Marshal(pv) - if err != nil { - return fmt.Errorf("validator -> json: %w", err) +func MakeGenValidatorCommand() *cobra.Command { + cmd := &cobra.Command{ + Use: "gen-validator", + Short: "Generate new validator keypair", + RunE: func(cmd *cobra.Command, args []string) error { + pv := privval.GenFilePV("", "") + + jsbz, err := json.Marshal(pv) + if err != nil { + return fmt.Errorf("validator -> json: %w", err) + } + + fmt.Printf("%v\n", string(jsbz)) + + return nil + }, } - fmt.Printf(`%v -`, string(jsbz)) - - return nil + return cmd } diff --git a/cmd/tenderdash/commands/init.go b/cmd/tenderdash/commands/init.go index 1786dd70d0..7634bdf496 100644 --- a/cmd/tenderdash/commands/init.go +++ b/cmd/tenderdash/commands/init.go @@ -8,57 +8,62 @@ import ( "github.com/dashevo/dashd-go/btcjson" "github.com/spf13/cobra" - cfg "github.com/tendermint/tendermint/config" + + "github.com/tendermint/tendermint/config" + "github.com/tendermint/tendermint/libs/log" tmos "github.com/tendermint/tendermint/libs/os" tmrand "github.com/tendermint/tendermint/libs/rand" "github.com/tendermint/tendermint/privval" "github.com/tendermint/tendermint/types" ) -// InitFilesCmd initializes a fresh Tendermint Core instance. -var InitFilesCmd = &cobra.Command{ - Use: "init [full|validator|seed|single]", - Short: "Initializes a Tenderdash node", - ValidArgs: []string{"full", "validator", "seed", "single"}, - // We allow for zero args so we can throw a more informative error - Args: cobra.MaximumNArgs(1), - RunE: initFiles, -} - -var ( +type nodeConfig struct { + *config.Config quorumType int coreChainLockedHeight uint32 initChainInitialHeight int64 appHash []byte proTxHash []byte -) - -func AddInitFlags(cmd *cobra.Command) { - cmd.Flags().IntVar(&quorumType, "quorumType", 0, "Quorum Type") - cmd.Flags().Uint32Var(&coreChainLockedHeight, "coreChainLockedHeight", 1, "Initial Core Chain Locked Height") - cmd.Flags().Int64Var(&initChainInitialHeight, "initialHeight", 0, "Initial Height") - cmd.Flags().BytesHexVar(&proTxHash, "proTxHash", []byte(nil), "Node pro tx hash") - cmd.Flags().BytesHexVar(&appHash, "appHash", []byte(nil), "App hash") } -func initFiles(cmd *cobra.Command, args []string) error { - if len(args) == 0 { - return errors.New("must specify a node type: tendermint init [validator|full|seed|single]") +// MakeInitFilesCommand returns the command to initialize a fresh Tendermint Core instance. +func MakeInitFilesCommand(conf *config.Config, logger log.Logger) *cobra.Command { + nodeConf := nodeConfig{Config: conf} + + cmd := &cobra.Command{ + Use: "init [full|validator|seed]", + Short: "Initializes a Tenderdash node", + ValidArgs: []string{"full", "validator", "seed"}, + // We allow for zero args so we can throw a more informative error + Args: cobra.MaximumNArgs(1), + RunE: func(cmd *cobra.Command, args []string) error { + if len(args) == 0 { + return errors.New("must specify a node type: tendermint init [validator|full|seed]") + } + nodeConf.Mode = args[0] + return initFilesWithConfig(cmd.Context(), nodeConf, logger) + }, } - config.Mode = args[0] - return initFilesWithConfig(config) + + cmd.Flags().IntVar(&nodeConf.quorumType, "quorumType", 0, "Quorum Type") + cmd.Flags().Uint32Var(&nodeConf.coreChainLockedHeight, "coreChainLockedHeight", 1, "Initial Core Chain Locked Height") + cmd.Flags().Int64Var(&nodeConf.initChainInitialHeight, "initialHeight", 0, "Initial Height") + cmd.Flags().BytesHexVar(&nodeConf.proTxHash, "proTxHash", []byte(nil), "Node pro tx hash") + cmd.Flags().BytesHexVar(&nodeConf.appHash, "appHash", []byte(nil), "App hash") + + return cmd } -func initFilesWithConfig(config *cfg.Config) error { +func initFilesWithConfig(ctx context.Context, conf nodeConfig, logger log.Logger) error { var ( pv *privval.FilePV err error ) - if config.Mode == cfg.ModeValidator { + if conf.Mode == config.ModeValidator { // private validator - privValKeyFile := config.PrivValidator.KeyFile() - privValStateFile := config.PrivValidator.StateFile() + privValKeyFile := conf.PrivValidator.KeyFile() + privValStateFile := conf.PrivValidator.StateFile() if tmos.FileExists(privValKeyFile) { pv, err = privval.LoadFilePV(privValKeyFile, privValStateFile) if err != nil { @@ -72,13 +77,15 @@ func initFilesWithConfig(config *cfg.Config) error { if err != nil { return err } - pv.Save() + if err := pv.Save(); err != nil { + return err + } logger.Info("Generated private validator", "keyFile", privValKeyFile, "stateFile", privValStateFile) } } - nodeKeyFile := config.NodeKeyFile() + nodeKeyFile := conf.NodeKeyFile() if tmos.FileExists(nodeKeyFile) { logger.Info("Found node key", "path", nodeKeyFile) } else { @@ -89,7 +96,7 @@ func initFilesWithConfig(config *cfg.Config) error { } // genesis file - genFile := config.GenesisFile() + genFile := conf.GenesisFile() if tmos.FileExists(genFile) { logger.Info("Found genesis file", "path", genFile) } else { @@ -98,13 +105,13 @@ func initFilesWithConfig(config *cfg.Config) error { ChainID: fmt.Sprintf("test-chain-%v", tmrand.Str(6)), GenesisTime: time.Now(), ConsensusParams: types.DefaultConsensusParams(), - QuorumType: btcjson.LLMQType(quorumType), - InitialCoreChainLockedHeight: coreChainLockedHeight, - InitialHeight: initChainInitialHeight, - AppHash: appHash, + QuorumType: btcjson.LLMQType(conf.quorumType), + InitialCoreChainLockedHeight: conf.coreChainLockedHeight, + InitialHeight: conf.initChainInitialHeight, + AppHash: conf.appHash, } - ctx, cancel := context.WithTimeout(context.TODO(), ctxTimeout) + ctx, cancel := context.WithTimeout(ctx, ctxTimeout) defer cancel() // if this is a validator we add it to genesis @@ -139,10 +146,10 @@ func initFilesWithConfig(config *cfg.Config) error { } // write config file - if err := cfg.WriteConfigFile(config.RootDir, config); err != nil { + if err := config.WriteConfigFile(conf.RootDir, conf.Config); err != nil { return err } - logger.Info("Generated config", "mode", config.Mode) + logger.Info("Generated config", "mode", conf.Mode) return nil } diff --git a/cmd/tenderdash/commands/inspect.go b/cmd/tenderdash/commands/inspect.go index 4f5ce2eccf..9c12ef5cf6 100644 --- a/cmd/tenderdash/commands/inspect.go +++ b/cmd/tenderdash/commands/inspect.go @@ -1,21 +1,22 @@ package commands import ( - "context" - "os" "os/signal" "syscall" "github.com/spf13/cobra" + "github.com/tendermint/tendermint/config" "github.com/tendermint/tendermint/internal/inspect" + "github.com/tendermint/tendermint/libs/log" ) -// InspectCmd is the command for starting an inspect server. -var InspectCmd = &cobra.Command{ - Use: "inspect", - Short: "Run an inspect server for investigating Tendermint state", - Long: ` +// InspectCmd constructs the command to start an inspect server. +func MakeInspectCommand(conf *config.Config, logger log.Logger) *cobra.Command { + cmd := &cobra.Command{ + Use: "inspect", + Short: "Run an inspect server for investigating Tendermint state", + Long: ` inspect runs a subset of Tendermint's RPC endpoints that are useful for debugging issues with Tendermint. @@ -24,40 +25,27 @@ var InspectCmd = &cobra.Command{ The inspect command can be used to query the block and state store using Tendermint RPC calls to debug issues of inconsistent state. `, - - RunE: runInspect, -} - -func init() { - InspectCmd.Flags(). - String("rpc.laddr", - config.RPC.ListenAddress, "RPC listenener address. Port required") - InspectCmd.Flags(). - String("db-backend", - config.DBBackend, "database backend: goleveldb | cleveldb | boltdb | rocksdb | badgerdb") - InspectCmd.Flags(). - String("db-dir", config.DBPath, "database directory") -} - -func runInspect(cmd *cobra.Command, args []string) error { - ctx, cancel := context.WithCancel(cmd.Context()) - defer cancel() - - c := make(chan os.Signal, 1) - signal.Notify(c, syscall.SIGTERM, syscall.SIGINT) - go func() { - <-c - cancel() - }() - - ins, err := inspect.NewFromConfig(logger, config) - if err != nil { - return err + RunE: func(cmd *cobra.Command, args []string) error { + ctx, cancel := signal.NotifyContext(cmd.Context(), syscall.SIGTERM, syscall.SIGINT) + defer cancel() + + ins, err := inspect.NewFromConfig(logger, conf) + if err != nil { + return err + } + + logger.Info("starting inspect server") + if err := ins.Run(ctx); err != nil { + return err + } + return nil + }, } + cmd.Flags().String("rpc.laddr", + conf.RPC.ListenAddress, "RPC listenener address. Port required") + cmd.Flags().String("db-backend", + conf.DBBackend, "database backend: goleveldb | cleveldb | boltdb | rocksdb | badgerdb") + cmd.Flags().String("db-dir", conf.DBPath, "database directory") - logger.Info("starting inspect server") - if err := ins.Run(ctx); err != nil { - return err - } - return nil + return cmd } diff --git a/cmd/tenderdash/commands/key_migrate.go b/cmd/tenderdash/commands/key_migrate.go index 739af4a7d1..5866be341b 100644 --- a/cmd/tenderdash/commands/key_migrate.go +++ b/cmd/tenderdash/commands/key_migrate.go @@ -5,11 +5,14 @@ import ( "fmt" "github.com/spf13/cobra" + cfg "github.com/tendermint/tendermint/config" + "github.com/tendermint/tendermint/libs/log" "github.com/tendermint/tendermint/scripts/keymigrate" + "github.com/tendermint/tendermint/scripts/scmigrate" ) -func MakeKeyMigrateCommand() *cobra.Command { +func MakeKeyMigrateCommand(conf *cfg.Config, logger log.Logger) *cobra.Command { cmd := &cobra.Command{ Use: "key-migrate", Short: "Run Database key migration", @@ -38,7 +41,7 @@ func MakeKeyMigrateCommand() *cobra.Command { db, err := cfg.DefaultDBProvider(&cfg.DBContext{ ID: dbctx, - Config: config, + Config: conf, }) if err != nil { @@ -49,6 +52,13 @@ func MakeKeyMigrateCommand() *cobra.Command { return fmt.Errorf("running migration for context %q: %w", dbctx, err) } + + if dbctx == "blockstore" { + if err := scmigrate.Migrate(ctx, db); err != nil { + return fmt.Errorf("running seen commit migration: %w", err) + + } + } } logger.Info("completed database migration successfully") @@ -58,7 +68,7 @@ func MakeKeyMigrateCommand() *cobra.Command { } // allow database info to be overridden via cli - addDBFlags(cmd) + addDBFlags(cmd, conf) return cmd } diff --git a/cmd/tenderdash/commands/light.go b/cmd/tenderdash/commands/light.go index 6b01e9c412..5b37c6bd32 100644 --- a/cmd/tenderdash/commands/light.go +++ b/cmd/tenderdash/commands/light.go @@ -1,22 +1,22 @@ package commands import ( - "context" "errors" "fmt" "net/http" "os" + "os/signal" "path/filepath" "strings" + "syscall" "time" - dashcore "github.com/tendermint/tendermint/dashcore/rpc" - "github.com/spf13/cobra" dbm "github.com/tendermint/tm-db" + "github.com/tendermint/tendermint/config" + dashcore "github.com/tendermint/tendermint/dash/core" "github.com/tendermint/tendermint/libs/log" - tmos "github.com/tendermint/tendermint/libs/os" "github.com/tendermint/tendermint/light" lproxy "github.com/tendermint/tendermint/light/proxy" lrpc "github.com/tendermint/tendermint/light/rpc" @@ -24,11 +24,56 @@ import ( rpcserver "github.com/tendermint/tendermint/rpc/jsonrpc/server" ) -// LightCmd represents the base command when called without any subcommands -var LightCmd = &cobra.Command{ - Use: "light [chainID]", - Short: "Run a light client proxy server, verifying Tendermint rpc", - Long: `Run a light client proxy server, verifying Tendermint rpc. +// LightCmd constructs the base command called when invoked without any subcommands. +func MakeLightCommand(conf *config.Config, logger log.Logger) *cobra.Command { + var ( + listenAddr string + primaryAddr string + witnessAddrsJoined string + chainID string + dir string + maxOpenConnections int + + logLevel string + logFormat string + + primaryKey = []byte("primary") + witnessesKey = []byte("witnesses") + + dashCoreRPCHost string + dashCoreRPCUser string + dashCoreRPCPass string + ) + + checkForExistingProviders := func(db dbm.DB) (string, []string, error) { + primaryBytes, err := db.Get(primaryKey) + if err != nil { + return "", []string{""}, err + } + witnessesBytes, err := db.Get(witnessesKey) + if err != nil { + return "", []string{""}, err + } + witnessesAddrs := strings.Split(string(witnessesBytes), ",") + return string(primaryBytes), witnessesAddrs, nil + } + + saveProviders := func(db dbm.DB, primaryAddr, witnessesAddrs string) error { + err := db.Set(primaryKey, []byte(primaryAddr)) + if err != nil { + return fmt.Errorf("failed to save primary provider: %w", err) + } + err = db.Set(witnessesKey, []byte(witnessesAddrs)) + if err != nil { + return fmt.Errorf("failed to save witness providers: %w", err) + } + return nil + } + + cmd := &cobra.Command{ + Use: "light [chainID]", + Short: "Run a light client proxy server, verifying Tendermint rpc", + Long: `Run a light client proxy server, verifying Tendermint rpc. All calls that can be tracked back to a block header by a proof will be verified before passing them back to the caller. Other than @@ -38,6 +83,8 @@ Furthermore to the chainID, a fresh instance of a light client will need a primary RPC address and witness RPC addresses. To restart the node, thereafter only the chainID is required. +To restart the node, thereafter only the chainID is required. + When /abci_query is called, the Merkle key path format is: /{store name}/{key} @@ -45,167 +92,136 @@ When /abci_query is called, the Merkle key path format is: Please verify with your application that this Merkle key format is used (true for applications built w/ Cosmos SDK). `, - RunE: runProxy, - Args: cobra.ExactArgs(1), - Example: `light cosmoshub-3 -p http://52.57.29.196:26657 -w http://public-seed-node.cosmoshub.certus.one:26657 + RunE: func(cmd *cobra.Command, args []string) error { + chainID = args[0] + logger.Info("Creating client...", "chainID", chainID) + + var witnessesAddrs []string + if witnessAddrsJoined != "" { + witnessesAddrs = strings.Split(witnessAddrsJoined, ",") + } + + lightDB, err := dbm.NewGoLevelDB("light-client-db", dir) + if err != nil { + return fmt.Errorf("can't create a db: %w", err) + } + // create a prefixed db on the chainID + db := dbm.NewPrefixDB(lightDB, []byte(chainID)) + + if primaryAddr == "" { // check to see if we can start from an existing state + var err error + primaryAddr, witnessesAddrs, err = checkForExistingProviders(db) + if err != nil { + return fmt.Errorf("failed to retrieve primary or witness from db: %w", err) + } + if primaryAddr == "" { + return errors.New("no primary address was provided nor found. Please provide a primary (using -p)." + + " Run the command: tendermint light --help for more information") + } + } else { + err := saveProviders(db, primaryAddr, witnessAddrsJoined) + if err != nil { + logger.Error("Unable to save primary and or witness addresses", "err", err) + } + } + if primaryAddr == "" { // check to see if we can start from an existing state + var err error + primaryAddr, witnessesAddrs, err = checkForExistingProviders(db) + if err != nil { + return fmt.Errorf("failed to retrieve primary or witness from db: %w", err) + } + if primaryAddr == "" { + return errors.New( + "no primary address was provided nor found. Please provide a primary (using -p)." + + " Run the command: tendermint light --help for more information", + ) + } + } else { + err := saveProviders(db, primaryAddr, witnessAddrsJoined) + if err != nil { + logger.Error("Unable to save primary and or witness addresses", "err", err) + } + } + + options := []light.Option{ + light.Logger(logger), + light.DashCoreVerification(), + } + + rpcLogger := logger.With("module", dashcore.ModuleName) + dashCoreRPCClient, _ := dashcore.NewRPCClient(dashCoreRPCHost, dashCoreRPCUser, dashCoreRPCPass, rpcLogger) + + c, err := light.NewHTTPClient( + cmd.Context(), + chainID, + primaryAddr, + witnessesAddrs, + dbs.New(db), + dashCoreRPCClient, + options..., + ) + if err != nil { + return err + } + + cfg := rpcserver.DefaultConfig() + cfg.MaxBodyBytes = conf.RPC.MaxBodyBytes + cfg.MaxHeaderBytes = conf.RPC.MaxHeaderBytes + cfg.MaxOpenConnections = maxOpenConnections + // If necessary adjust global WriteTimeout to ensure it's greater than + // TimeoutBroadcastTxCommit. + // See https://github.com/tendermint/tendermint/issues/3435 + if cfg.WriteTimeout <= conf.RPC.TimeoutBroadcastTxCommit { + cfg.WriteTimeout = conf.RPC.TimeoutBroadcastTxCommit + 1*time.Second + } + + p, err := lproxy.NewProxy(c, listenAddr, primaryAddr, cfg, logger, lrpc.KeyPathFn(lrpc.DefaultMerkleKeyPathFn())) + if err != nil { + return err + } + + ctx, cancel := signal.NotifyContext(cmd.Context(), os.Interrupt, syscall.SIGTERM) + defer cancel() + + go func() { + <-ctx.Done() + p.Listener.Close() + }() + + logger.Info("Starting proxy...", "laddr", listenAddr) + if err := p.ListenAndServe(ctx); err != http.ErrServerClosed { + // Error starting or closing listener: + logger.Error("proxy ListenAndServe", "err", err) + } + + return nil + }, + Args: cobra.ExactArgs(1), + Example: `light cosmoshub-3 -p http://52.57.29.196:26657 -w http://public-seed-node.cosmoshub.certus.one:26657 --height 962118 --hash 28B97BE9F6DE51AC69F70E0B7BFD7E5C9CD1A595B7DC31AFF27C50D4948020CD`, -} - -var ( - listenAddr string - primaryAddr string - witnessAddrsJoined string - chainID string - dir string - maxOpenConnections int - - logLevel string - logFormat string - - primaryKey = []byte("primary") - witnessesKey = []byte("witnesses") - - dashCoreRPCHost string - dashCoreRPCUser string - dashCoreRPCPass string -) + } -func init() { - LightCmd.Flags().StringVar(&listenAddr, "laddr", "tcp://localhost:8888", + cmd.Flags().StringVar(&listenAddr, "laddr", "tcp://localhost:8888", "serve the proxy on the given address") - LightCmd.Flags().StringVarP(&primaryAddr, "primary", "p", "", + cmd.Flags().StringVarP(&primaryAddr, "primary", "p", "", "connect to a Tendermint node at this address") - LightCmd.Flags().StringVarP(&witnessAddrsJoined, "witnesses", "w", "", + cmd.Flags().StringVarP(&witnessAddrsJoined, "witnesses", "w", "", "tendermint nodes to cross-check the primary node, comma-separated") - LightCmd.Flags().StringVarP(&dir, "dir", "d", os.ExpandEnv(filepath.Join("$HOME", ".tendermint-light")), + cmd.Flags().StringVarP(&dir, "dir", "d", os.ExpandEnv(filepath.Join("$HOME", ".tendermint-light")), "specify the directory") - LightCmd.Flags().IntVar( + cmd.Flags().IntVar( &maxOpenConnections, "max-open-connections", 900, "maximum number of simultaneous connections (including WebSocket).") - LightCmd.Flags().StringVar(&logLevel, "log-level", log.LogLevelInfo, "The logging level (debug|info|warn|error|fatal)") - LightCmd.Flags().StringVar(&logFormat, "log-format", log.LogFormatPlain, "The logging format (text|json)") - LightCmd.Flags().StringVar(&dashCoreRPCHost, "dchost", "", + cmd.Flags().StringVar(&logLevel, "log-level", log.LogLevelInfo, "The logging level (debug|info|warn|error|fatal)") + cmd.Flags().StringVar(&logFormat, "log-format", log.LogFormatPlain, "The logging format (text|json)") + cmd.Flags().StringVar(&dashCoreRPCHost, "dchost", "", "host address of the Dash Core RPC node") - LightCmd.Flags().StringVar(&dashCoreRPCHost, "dcuser", "", + cmd.Flags().StringVar(&dashCoreRPCHost, "dcuser", "", "Dash Core RPC node user") - LightCmd.Flags().StringVar(&dashCoreRPCHost, "dcpass", "", + cmd.Flags().StringVar(&dashCoreRPCHost, "dcpass", "", "Dash Core RPC node password") -} - -func runProxy(cmd *cobra.Command, args []string) error { - logger, err := log.NewDefaultLogger(logFormat, logLevel, false) - if err != nil { - return err - } - - chainID = args[0] - logger.Info("Creating client...", "chainID", chainID) - - witnessesAddrs := []string{} - if witnessAddrsJoined != "" { - witnessesAddrs = strings.Split(witnessAddrsJoined, ",") - } - lightDB, err := dbm.NewGoLevelDB("light-client-db", dir) - if err != nil { - return fmt.Errorf("can't create a db: %w", err) - } - // create a prefixed db on the chainID - db := dbm.NewPrefixDB(lightDB, []byte(chainID)) - - if primaryAddr == "" { // check to see if we can start from an existing state - var err error - primaryAddr, witnessesAddrs, err = checkForExistingProviders(db) - if err != nil { - return fmt.Errorf("failed to retrieve primary or witness from db: %w", err) - } - if primaryAddr == "" { - return errors.New( - "no primary address was provided nor found. Please provide a primary (using -p)." + - " Run the command: tendermint light --help for more information", - ) - } - } else { - err := saveProviders(db, primaryAddr, witnessAddrsJoined) - if err != nil { - logger.Error("Unable to save primary and or witness addresses", "err", err) - } - } - - options := []light.Option{ - light.Logger(logger), - light.DashCoreVerification(), - } - - rpcLogger := logger.With("module", dashcore.ModuleName) - dashCoreRPCClient, _ := dashcore.NewRPCClient(dashCoreRPCHost, dashCoreRPCUser, dashCoreRPCPass, rpcLogger) - - c, err := light.NewHTTPClient( - context.Background(), - chainID, - primaryAddr, - witnessesAddrs, - dbs.New(db), - dashCoreRPCClient, - options..., - ) - if err != nil { - return err - } - - cfg := rpcserver.DefaultConfig() - cfg.MaxBodyBytes = config.RPC.MaxBodyBytes - cfg.MaxHeaderBytes = config.RPC.MaxHeaderBytes - cfg.MaxOpenConnections = maxOpenConnections - // If necessary adjust global WriteTimeout to ensure it's greater than - // TimeoutBroadcastTxCommit. - // See https://github.com/tendermint/tendermint/issues/3435 - if cfg.WriteTimeout <= config.RPC.TimeoutBroadcastTxCommit { - cfg.WriteTimeout = config.RPC.TimeoutBroadcastTxCommit + 1*time.Second - } - - p, err := lproxy.NewProxy(c, listenAddr, primaryAddr, cfg, logger, lrpc.KeyPathFn(lrpc.DefaultMerkleKeyPathFn())) - if err != nil { - return err - } - - // Stop upon receiving SIGTERM or CTRL-C. - tmos.TrapSignal(logger, func() { - p.Listener.Close() - }) - - logger.Info("Starting proxy...", "laddr", listenAddr) - if err := p.ListenAndServe(); err != http.ErrServerClosed { - // Error starting or closing listener: - logger.Error("proxy ListenAndServe", "err", err) - } - - return nil -} - -func checkForExistingProviders(db dbm.DB) (string, []string, error) { - primaryBytes, err := db.Get(primaryKey) - if err != nil { - return "", []string{""}, err - } - witnessesBytes, err := db.Get(witnessesKey) - if err != nil { - return "", []string{""}, err - } - witnessesAddrs := strings.Split(string(witnessesBytes), ",") - return string(primaryBytes), witnessesAddrs, nil -} - -func saveProviders(db dbm.DB, primaryAddr, witnessesAddrs string) error { - err := db.Set(primaryKey, []byte(primaryAddr)) - if err != nil { - return fmt.Errorf("failed to save primary provider: %w", err) - } - err = db.Set(witnessesKey, []byte(witnessesAddrs)) - if err != nil { - return fmt.Errorf("failed to save witness providers: %w", err) - } - return nil + return cmd } diff --git a/cmd/tenderdash/commands/probe_upnp.go b/cmd/tenderdash/commands/probe_upnp.go deleted file mode 100644 index 4c71e099a4..0000000000 --- a/cmd/tenderdash/commands/probe_upnp.go +++ /dev/null @@ -1,32 +0,0 @@ -package commands - -import ( - "fmt" - - "github.com/spf13/cobra" - - "github.com/tendermint/tendermint/internal/p2p/upnp" - tmjson "github.com/tendermint/tendermint/libs/json" -) - -// ProbeUpnpCmd adds capabilities to test the UPnP functionality. -var ProbeUpnpCmd = &cobra.Command{ - Use: "probe-upnp", - Short: "Test UPnP functionality", - RunE: probeUpnp, -} - -func probeUpnp(cmd *cobra.Command, args []string) error { - capabilities, err := upnp.Probe(logger) - if err != nil { - fmt.Println("Probe failed: ", err) - } else { - fmt.Println("Probe success!") - jsonBytes, err := tmjson.Marshal(capabilities) - if err != nil { - return err - } - fmt.Println(string(jsonBytes)) - } - return nil -} diff --git a/cmd/tenderdash/commands/reindex_event.go b/cmd/tenderdash/commands/reindex_event.go index bd95779635..6cec32738a 100644 --- a/cmd/tenderdash/commands/reindex_event.go +++ b/cmd/tenderdash/commands/reindex_event.go @@ -17,6 +17,7 @@ import ( "github.com/tendermint/tendermint/internal/state/indexer/sink/kv" "github.com/tendermint/tendermint/internal/state/indexer/sink/psql" "github.com/tendermint/tendermint/internal/store" + "github.com/tendermint/tendermint/libs/log" "github.com/tendermint/tendermint/libs/os" "github.com/tendermint/tendermint/rpc/coretypes" "github.com/tendermint/tendermint/types" @@ -26,59 +27,68 @@ const ( reindexFailed = "event re-index failed: " ) -// ReIndexEventCmd allows re-index the event by given block height interval -var ReIndexEventCmd = &cobra.Command{ - Use: "reindex-event", - Short: "reindex events to the event store backends", - Long: ` +// MakeReindexEventCommand constructs a command to re-index events in a block height interval. +func MakeReindexEventCommand(conf *tmcfg.Config, logger log.Logger) *cobra.Command { + var ( + startHeight int64 + endHeight int64 + ) + + cmd := &cobra.Command{ + Use: "reindex-event", + Short: "reindex events to the event store backends", + Long: ` reindex-event is an offline tooling to re-index block and tx events to the eventsinks, -you can run this command when the event store backend dropped/disconnected or you want to -replace the backend. The default start-height is 0, meaning the tooling will start -reindex from the base block height(inclusive); and the default end-height is 0, meaning +you can run this command when the event store backend dropped/disconnected or you want to +replace the backend. The default start-height is 0, meaning the tooling will start +reindex from the base block height(inclusive); and the default end-height is 0, meaning the tooling will reindex until the latest block height(inclusive). User can omit either or both arguments. `, - Example: ` + Example: ` tendermint reindex-event tendermint reindex-event --start-height 2 tendermint reindex-event --end-height 10 tendermint reindex-event --start-height 2 --end-height 10 `, - Run: func(cmd *cobra.Command, args []string) { - bs, ss, err := loadStateAndBlockStore(config) - if err != nil { - fmt.Println(reindexFailed, err) - return - } - - if err := checkValidHeight(bs); err != nil { - fmt.Println(reindexFailed, err) - return - } + RunE: func(cmd *cobra.Command, args []string) error { + bs, ss, err := loadStateAndBlockStore(conf) + if err != nil { + return fmt.Errorf("%s: %w", reindexFailed, err) + } - es, err := loadEventSinks(config) - if err != nil { - fmt.Println(reindexFailed, err) - return - } + cvhArgs := checkValidHeightArgs{ + startHeight: startHeight, + endHeight: endHeight, + } + if err := checkValidHeight(bs, cvhArgs); err != nil { + return fmt.Errorf("%s: %w", reindexFailed, err) + } - if err = eventReIndex(cmd, es, bs, ss); err != nil { - fmt.Println(reindexFailed, err) - return - } + es, err := loadEventSinks(conf) + if err != nil { + return fmt.Errorf("%s: %w", reindexFailed, err) + } - fmt.Println("event re-index finished") - }, -} + riArgs := eventReIndexArgs{ + startHeight: startHeight, + endHeight: endHeight, + sinks: es, + blockStore: bs, + stateStore: ss, + } + if err := eventReIndex(cmd, riArgs); err != nil { + return fmt.Errorf("%s: %w", reindexFailed, err) + } -var ( - startHeight int64 - endHeight int64 -) + logger.Info("event re-index finished") + return nil + }, + } -func init() { - ReIndexEventCmd.Flags().Int64Var(&startHeight, "start-height", 0, "the block height would like to start for re-index") - ReIndexEventCmd.Flags().Int64Var(&endHeight, "end-height", 0, "the block height would like to finish for re-index") + cmd.Flags().Int64Var(&startHeight, "start-height", 0, "the block height would like to start for re-index") + cmd.Flags().Int64Var(&endHeight, "end-height", 0, "the block height would like to finish for re-index") + return cmd } func loadEventSinks(cfg *tmcfg.Config) ([]indexer.EventSink, error) { @@ -109,7 +119,7 @@ func loadEventSinks(cfg *tmcfg.Config) ([]indexer.EventSink, error) { if conn == "" { return nil, errors.New("the psql connection settings cannot be empty") } - es, err := psql.NewEventSink(conn, chainID) + es, err := psql.NewEventSink(conn, cfg.ChainID()) if err != nil { return nil, err } @@ -159,52 +169,58 @@ func loadStateAndBlockStore(cfg *tmcfg.Config) (*store.BlockStore, state.Store, return blockStore, stateStore, nil } -func eventReIndex(cmd *cobra.Command, es []indexer.EventSink, bs state.BlockStore, ss state.Store) error { +type eventReIndexArgs struct { + startHeight int64 + endHeight int64 + sinks []indexer.EventSink + blockStore state.BlockStore + stateStore state.Store +} +func eventReIndex(cmd *cobra.Command, args eventReIndexArgs) error { var bar progressbar.Bar - bar.NewOption(startHeight-1, endHeight) + bar.NewOption(args.startHeight-1, args.endHeight) fmt.Println("start re-indexing events:") defer bar.Finish() - for i := startHeight; i <= endHeight; i++ { + for i := args.startHeight; i <= args.endHeight; i++ { select { case <-cmd.Context().Done(): return fmt.Errorf("event re-index terminated at height %d: %w", i, cmd.Context().Err()) default: - b := bs.LoadBlock(i) + b := args.blockStore.LoadBlock(i) if b == nil { return fmt.Errorf("not able to load block at height %d from the blockstore", i) } - r, err := ss.LoadABCIResponses(i) + r, err := args.stateStore.LoadABCIResponses(i) if err != nil { return fmt.Errorf("not able to load ABCI Response at height %d from the statestore", i) } e := types.EventDataNewBlockHeader{ - Header: b.Header, - NumTxs: int64(len(b.Txs)), - ResultBeginBlock: *r.BeginBlock, - ResultEndBlock: *r.EndBlock, + Header: b.Header, + NumTxs: int64(len(b.Txs)), + ResultFinalizeBlock: *r.FinalizeBlock, } var batch *indexer.Batch if e.NumTxs > 0 { batch = indexer.NewBatch(e.NumTxs) - for i, tx := range b.Data.Txs { + for i := range b.Data.Txs { tr := abcitypes.TxResult{ Height: b.Height, Index: uint32(i), - Tx: tx, - Result: *(r.DeliverTxs[i]), + Tx: b.Data.Txs[i], + Result: *(r.FinalizeBlock.TxResults[i]), } _ = batch.Add(&tr) } } - for _, sink := range es { + for _, sink := range args.sinks { if err := sink.IndexBlockEvents(e); err != nil { return fmt.Errorf("block event re-index at height %d failed: %w", i, err) } @@ -223,40 +239,45 @@ func eventReIndex(cmd *cobra.Command, es []indexer.EventSink, bs state.BlockStor return nil } -func checkValidHeight(bs state.BlockStore) error { +type checkValidHeightArgs struct { + startHeight int64 + endHeight int64 +} + +func checkValidHeight(bs state.BlockStore, args checkValidHeightArgs) error { base := bs.Base() - if startHeight == 0 { - startHeight = base + if args.startHeight == 0 { + args.startHeight = base fmt.Printf("set the start block height to the base height of the blockstore %d \n", base) } - if startHeight < base { + if args.startHeight < base { return fmt.Errorf("%s (requested start height: %d, base height: %d)", - coretypes.ErrHeightNotAvailable, startHeight, base) + coretypes.ErrHeightNotAvailable, args.startHeight, base) } height := bs.Height() - if startHeight > height { + if args.startHeight > height { return fmt.Errorf( - "%s (requested start height: %d, store height: %d)", coretypes.ErrHeightNotAvailable, startHeight, height) + "%s (requested start height: %d, store height: %d)", coretypes.ErrHeightNotAvailable, args.startHeight, height) } - if endHeight == 0 || endHeight > height { - endHeight = height + if args.endHeight == 0 || args.endHeight > height { + args.endHeight = height fmt.Printf("set the end block height to the latest height of the blockstore %d \n", height) } - if endHeight < base { + if args.endHeight < base { return fmt.Errorf( - "%s (requested end height: %d, base height: %d)", coretypes.ErrHeightNotAvailable, endHeight, base) + "%s (requested end height: %d, base height: %d)", coretypes.ErrHeightNotAvailable, args.endHeight, base) } - if endHeight < startHeight { + if args.endHeight < args.startHeight { return fmt.Errorf( "%s (requested the end height: %d is less than the start height: %d)", - coretypes.ErrInvalidRequest, startHeight, endHeight) + coretypes.ErrInvalidRequest, args.startHeight, args.endHeight) } return nil diff --git a/cmd/tenderdash/commands/reindex_event_test.go b/cmd/tenderdash/commands/reindex_event_test.go index 2008251bc1..f60fe1b04e 100644 --- a/cmd/tenderdash/commands/reindex_event_test.go +++ b/cmd/tenderdash/commands/reindex_event_test.go @@ -8,14 +8,15 @@ import ( "github.com/spf13/cobra" "github.com/stretchr/testify/mock" "github.com/stretchr/testify/require" + dbm "github.com/tendermint/tm-db" abcitypes "github.com/tendermint/tendermint/abci/types" - tmcfg "github.com/tendermint/tendermint/config" + "github.com/tendermint/tendermint/config" "github.com/tendermint/tendermint/internal/state/indexer" "github.com/tendermint/tendermint/internal/state/mocks" + "github.com/tendermint/tendermint/libs/log" prototmstate "github.com/tendermint/tendermint/proto/tendermint/state" "github.com/tendermint/tendermint/types" - dbm "github.com/tendermint/tm-db" _ "github.com/lib/pq" // for the psql sink ) @@ -25,13 +26,15 @@ const ( base int64 = 2 ) -func setupReIndexEventCmd() *cobra.Command { +func setupReIndexEventCmd(ctx context.Context, conf *config.Config, logger log.Logger) *cobra.Command { + cmd := MakeReindexEventCommand(conf, logger) + reIndexEventCmd := &cobra.Command{ - Use: ReIndexEventCmd.Use, + Use: cmd.Use, Run: func(cmd *cobra.Command, args []string) {}, } - _ = reIndexEventCmd.ExecuteContext(context.Background()) + _ = reIndexEventCmd.ExecuteContext(ctx) return reIndexEventCmd } @@ -68,10 +71,7 @@ func TestReIndexEventCheckHeight(t *testing.T) { } for _, tc := range testCases { - startHeight = tc.startHeight - endHeight = tc.endHeight - - err := checkValidHeight(mockBlockStore) + err := checkValidHeight(mockBlockStore, checkValidHeightArgs{startHeight: tc.startHeight, endHeight: tc.endHeight}) if tc.validHeight { require.NoError(t, err) } else { @@ -97,7 +97,7 @@ func TestLoadEventSink(t *testing.T) { } for _, tc := range testCases { - cfg := tmcfg.TestConfig() + cfg := config.TestConfig() cfg.TxIndex.Indexer = tc.sinks cfg.TxIndex.PsqlConn = tc.connURL _, err := loadEventSinks(cfg) @@ -110,7 +110,7 @@ func TestLoadEventSink(t *testing.T) { } func TestLoadBlockStore(t *testing.T) { - testCfg, err := tmcfg.ResetTestRoot(t.Name()) + testCfg, err := config.ResetTestRoot(t.TempDir(), t.Name()) require.NoError(t, err) testCfg.DBBackend = "goleveldb" _, _, err = loadStateAndBlockStore(testCfg) @@ -152,11 +152,11 @@ func TestReIndexEvent(t *testing.T) { On("IndexTxEvents", mock.AnythingOfType("[]*types.TxResult")).Return(errors.New("")).Once(). On("IndexTxEvents", mock.AnythingOfType("[]*types.TxResult")).Return(nil) - dtx := abcitypes.ResponseDeliverTx{} + dtx := abcitypes.ExecTxResult{} abciResp := &prototmstate.ABCIResponses{ - DeliverTxs: []*abcitypes.ResponseDeliverTx{&dtx}, - EndBlock: &abcitypes.ResponseEndBlock{}, - BeginBlock: &abcitypes.ResponseBeginBlock{}, + FinalizeBlock: &abcitypes.ResponseFinalizeBlock{ + TxResults: []*abcitypes.ExecTxResult{&dtx}, + }, } mockStateStore. @@ -177,11 +177,22 @@ func TestReIndexEvent(t *testing.T) { {height, height, false}, } + ctx, cancel := context.WithCancel(context.Background()) + defer cancel() + logger := log.NewNopLogger() + conf := config.DefaultConfig() + for _, tc := range testCases { - startHeight = tc.startHeight - endHeight = tc.endHeight + err := eventReIndex( + setupReIndexEventCmd(ctx, conf, logger), + eventReIndexArgs{ + sinks: []indexer.EventSink{mockEventSink}, + blockStore: mockBlockStore, + stateStore: mockStateStore, + startHeight: tc.startHeight, + endHeight: tc.endHeight, + }) - err := eventReIndex(setupReIndexEventCmd(), []indexer.EventSink{mockEventSink}, mockBlockStore, mockStateStore) if tc.reIndexErr { require.Error(t, err) } else { diff --git a/cmd/tenderdash/commands/replay.go b/cmd/tenderdash/commands/replay.go index 023921d9e4..fb6f19e55d 100644 --- a/cmd/tenderdash/commands/replay.go +++ b/cmd/tenderdash/commands/replay.go @@ -2,25 +2,30 @@ package commands import ( "github.com/spf13/cobra" + + "github.com/tendermint/tendermint/config" "github.com/tendermint/tendermint/internal/consensus" + "github.com/tendermint/tendermint/libs/log" ) -// ReplayCmd allows replaying of messages from the WAL. -var ReplayCmd = &cobra.Command{ - Use: "replay", - Short: "Replay messages from WAL", - Run: func(cmd *cobra.Command, args []string) { - consensus.RunReplayFile(config.BaseConfig, config.Consensus, false) - }, +// MakeReplayCommand constructs a command to replay messages from the WAL into consensus. +func MakeReplayCommand(conf *config.Config, logger log.Logger) *cobra.Command { + return &cobra.Command{ + Use: "replay", + Short: "Replay messages from WAL", + RunE: func(cmd *cobra.Command, args []string) error { + return consensus.RunReplayFile(cmd.Context(), logger, conf.BaseConfig, conf.Consensus, false) + }, + } } -// ReplayConsoleCmd allows replaying of messages from the WAL in a -// console. -var ReplayConsoleCmd = &cobra.Command{ - Use: "replay-console", - Short: "Replay messages from WAL in a console", - Run: func(cmd *cobra.Command, args []string) { - consensus.RunReplayFile(config.BaseConfig, config.Consensus, true) - }, - PreRun: deprecateSnakeCase, +// MakeReplayConsoleCommand constructs a command to replay WAL messages to stdout. +func MakeReplayConsoleCommand(conf *config.Config, logger log.Logger) *cobra.Command { + return &cobra.Command{ + Use: "replay-console", + Short: "Replay messages from WAL in a console", + RunE: func(cmd *cobra.Command, args []string) error { + return consensus.RunReplayFile(cmd.Context(), logger, conf.BaseConfig, conf.Consensus, true) + }, + } } diff --git a/cmd/tenderdash/commands/reset.go b/cmd/tenderdash/commands/reset.go new file mode 100644 index 0000000000..38beffb629 --- /dev/null +++ b/cmd/tenderdash/commands/reset.go @@ -0,0 +1,179 @@ +package commands + +import ( + "os" + "path/filepath" + + "github.com/spf13/cobra" + + "github.com/tendermint/tendermint/config" + "github.com/tendermint/tendermint/libs/log" + tmos "github.com/tendermint/tendermint/libs/os" + "github.com/tendermint/tendermint/privval" + "github.com/tendermint/tendermint/types" +) + +// MakeResetCommand constructs a command that removes the database of +// the specified Tendermint core instance. +func MakeResetCommand(conf *config.Config, logger log.Logger) *cobra.Command { + var keyType string + + resetCmd := &cobra.Command{ + Use: "reset", + Short: "Set of commands to conveniently reset tendermint related data", + } + + resetBlocksCmd := &cobra.Command{ + Use: "blockchain", + Short: "Removes all blocks, state, transactions and evidence stored by the tendermint node", + RunE: func(cmd *cobra.Command, args []string) error { + return ResetState(conf.DBDir(), logger) + }, + } + + resetPeersCmd := &cobra.Command{ + Use: "peers", + Short: "Removes all peer addresses", + RunE: func(cmd *cobra.Command, args []string) error { + return ResetPeerStore(conf.DBDir()) + }, + } + + resetSignerCmd := &cobra.Command{ + Use: "unsafe-signer", + Short: "esets private validator signer state", + Long: `Resets private validator signer state. +Only use in testing. This can cause the node to double sign`, + RunE: func(cmd *cobra.Command, args []string) error { + return ResetFilePV(conf.PrivValidator.KeyFile(), conf.PrivValidator.StateFile(), logger, keyType) + }, + } + + resetAllCmd := &cobra.Command{ + Use: "unsafe-all", + Short: "Removes all tendermint data including signing state", + Long: `Removes all tendermint data including signing state. +Only use in testing. This can cause the node to double sign`, + RunE: func(cmd *cobra.Command, args []string) error { + return ResetAll(conf.DBDir(), conf.PrivValidator.KeyFile(), + conf.PrivValidator.StateFile(), logger, keyType) + }, + } + + resetSignerCmd.Flags().StringVar(&keyType, "key", types.ABCIPubKeyTypeEd25519, + "Signer key type. Options: ed25519, secp256k1") + + resetAllCmd.Flags().StringVar(&keyType, "key", types.ABCIPubKeyTypeEd25519, + "Signer key type. Options: ed25519, secp256k1") + + resetCmd.AddCommand(resetBlocksCmd) + resetCmd.AddCommand(resetPeersCmd) + resetCmd.AddCommand(resetSignerCmd) + resetCmd.AddCommand(resetAllCmd) + + return resetCmd +} + +// ResetAll removes address book files plus all data, and resets the privValdiator data. +// Exported for extenal CLI usage +// XXX: this is unsafe and should only suitable for testnets. +func ResetAll(dbDir, privValKeyFile, privValStateFile string, logger log.Logger, keyType string) error { + if err := os.RemoveAll(dbDir); err == nil { + logger.Info("Removed all blockchain history", "dir", dbDir) + } else { + logger.Error("error removing all blockchain history", "dir", dbDir, "err", err) + } + + if err := tmos.EnsureDir(dbDir, 0700); err != nil { + logger.Error("unable to recreate dbDir", "err", err) + } + + // recreate the dbDir since the privVal state needs to live there + return ResetFilePV(privValKeyFile, privValStateFile, logger, keyType) +} + +// ResetState removes all blocks, tendermint state, indexed transactions and evidence. +func ResetState(dbDir string, logger log.Logger) error { + blockdb := filepath.Join(dbDir, "blockstore.db") + state := filepath.Join(dbDir, "state.db") + wal := filepath.Join(dbDir, "cs.wal") + evidence := filepath.Join(dbDir, "evidence.db") + txIndex := filepath.Join(dbDir, "tx_index.db") + + if tmos.FileExists(blockdb) { + if err := os.RemoveAll(blockdb); err == nil { + logger.Info("Removed all blockstore.db", "dir", blockdb) + } else { + logger.Error("error removing all blockstore.db", "dir", blockdb, "err", err) + } + } + + if tmos.FileExists(state) { + if err := os.RemoveAll(state); err == nil { + logger.Info("Removed all state.db", "dir", state) + } else { + logger.Error("error removing all state.db", "dir", state, "err", err) + } + } + + if tmos.FileExists(wal) { + if err := os.RemoveAll(wal); err == nil { + logger.Info("Removed all cs.wal", "dir", wal) + } else { + logger.Error("error removing all cs.wal", "dir", wal, "err", err) + } + } + + if tmos.FileExists(evidence) { + if err := os.RemoveAll(evidence); err == nil { + logger.Info("Removed all evidence.db", "dir", evidence) + } else { + logger.Error("error removing all evidence.db", "dir", evidence, "err", err) + } + } + + if tmos.FileExists(txIndex) { + if err := os.RemoveAll(txIndex); err == nil { + logger.Info("Removed tx_index.db", "dir", txIndex) + } else { + logger.Error("error removing tx_index.db", "dir", txIndex, "err", err) + } + } + + return tmos.EnsureDir(dbDir, 0700) +} + +// ResetFilePV loads the file private validator and resets the watermark to 0. If used on an existing network, +// this can cause the node to double sign. +// XXX: this is unsafe and should only suitable for testnets. +func ResetFilePV(privValKeyFile, privValStateFile string, logger log.Logger, keyType string) error { + if _, err := os.Stat(privValKeyFile); err == nil { + pv, err := privval.LoadFilePVEmptyState(privValKeyFile, privValStateFile) + if err != nil { + return err + } + if err := pv.Reset(); err != nil { + return err + } + logger.Info("Reset private validator file to genesis state", "keyFile", privValKeyFile, + "stateFile", privValStateFile) + } else { + pv := privval.GenFilePV(privValKeyFile, privValStateFile) + if err := pv.Save(); err != nil { + return err + } + logger.Info("Generated private validator file", "keyFile", privValKeyFile, + "stateFile", privValStateFile) + } + return nil +} + +// ResetPeerStore removes the peer store containing all information used by the tendermint networking layer +// In the case of a reset, new peers will need to be set either via the config or through the discovery mechanism +func ResetPeerStore(dbDir string) error { + peerstore := filepath.Join(dbDir, "peerstore.db") + if tmos.FileExists(peerstore) { + return os.RemoveAll(peerstore) + } + return nil +} diff --git a/cmd/tenderdash/commands/reset_priv_validator.go b/cmd/tenderdash/commands/reset_priv_validator.go deleted file mode 100644 index 06e18a19d2..0000000000 --- a/cmd/tenderdash/commands/reset_priv_validator.go +++ /dev/null @@ -1,94 +0,0 @@ -package commands - -import ( - "os" - - "github.com/spf13/cobra" - - "github.com/tendermint/tendermint/libs/log" - tmos "github.com/tendermint/tendermint/libs/os" - "github.com/tendermint/tendermint/privval" -) - -// ResetAllCmd removes the database of this Tendermint core -// instance. -var ResetAllCmd = &cobra.Command{ - Use: "unsafe-reset-all", - Short: "(unsafe) Remove all the data and WAL, reset this node's validator to genesis state", - RunE: resetAll, -} - -var keepAddrBook bool - -func init() { - ResetAllCmd.Flags().BoolVar(&keepAddrBook, "keep-addr-book", false, "keep the address book intact") -} - -// ResetPrivValidatorCmd resets the private validator files. -var ResetPrivValidatorCmd = &cobra.Command{ - Use: "unsafe-reset-priv-validator", - Short: "(unsafe) Reset this node's validator to genesis state", - RunE: resetPrivValidator, -} - -// XXX: this is totally unsafe. -// it's only suitable for testnets. -func resetAll(cmd *cobra.Command, args []string) error { - return ResetAll(config.DBDir(), config.P2P.AddrBookFile(), config.PrivValidator.KeyFile(), - config.PrivValidator.StateFile(), logger) -} - -// XXX: this is totally unsafe. -// it's only suitable for testnets. -func resetPrivValidator(cmd *cobra.Command, args []string) error { - return resetFilePV(config.PrivValidator.KeyFile(), config.PrivValidator.StateFile(), logger) -} - -// ResetAll removes address book files plus all data, and resets the privValdiator data. -// Exported so other CLI tools can use it. -func ResetAll(dbDir, addrBookFile, privValKeyFile, privValStateFile string, logger log.Logger) error { - if keepAddrBook { - logger.Info("The address book remains intact") - } else { - removeAddrBook(addrBookFile, logger) - } - if err := os.RemoveAll(dbDir); err == nil { - logger.Info("Removed all blockchain history", "dir", dbDir) - } else { - logger.Error("Error removing all blockchain history", "dir", dbDir, "err", err) - } - // recreate the dbDir since the privVal state needs to live there - if err := tmos.EnsureDir(dbDir, 0700); err != nil { - logger.Error("unable to recreate dbDir", "err", err) - } - return resetFilePV(privValKeyFile, privValStateFile, logger) -} - -func resetFilePV(privValKeyFile, privValStateFile string, logger log.Logger) error { - if _, err := os.Stat(privValKeyFile); err == nil { - pv, err := privval.LoadFilePVEmptyState(privValKeyFile, privValStateFile) - if err != nil { - return err - } - pv.Reset() - logger.Info("Reset private validator file to genesis state", "keyFile", privValKeyFile, - "stateFile", privValStateFile) - } else { - pv := privval.GenFilePV(privValKeyFile, privValStateFile) - if err != nil { - return err - } - pv.Save() - logger.Info("Generated private validator file", "keyFile", privValKeyFile, - "stateFile", privValStateFile) - } - return nil -} - -func removeAddrBook(addrBookFile string, logger log.Logger) { - if err := os.Remove(addrBookFile); err == nil { - logger.Info("Removed existing address book", "file", addrBookFile) - } else if !os.IsNotExist(err) { - logger.Info("Error removing address book", "file", addrBookFile, "err", err) - } -} diff --git a/cmd/tenderdash/commands/reset_test.go b/cmd/tenderdash/commands/reset_test.go new file mode 100644 index 0000000000..fd3963e885 --- /dev/null +++ b/cmd/tenderdash/commands/reset_test.go @@ -0,0 +1,62 @@ +package commands + +import ( + "context" + "path/filepath" + "testing" + + "github.com/stretchr/testify/require" + + cfg "github.com/tendermint/tendermint/config" + "github.com/tendermint/tendermint/libs/log" + "github.com/tendermint/tendermint/privval" + "github.com/tendermint/tendermint/types" +) + +func Test_ResetAll(t *testing.T) { + config := cfg.TestConfig() + dir := t.TempDir() + config.SetRoot(dir) + logger := log.NewNopLogger() + cfg.EnsureRoot(dir) + require.NoError(t, initFilesWithConfig(context.Background(), nodeConfig{Config: config}, logger)) + pv, err := privval.LoadFilePV(config.PrivValidator.KeyFile(), config.PrivValidator.StateFile()) + require.NoError(t, err) + pv.LastSignState.Height = 10 + require.NoError(t, pv.Save()) + require.NoError(t, ResetAll(config.DBDir(), config.PrivValidator.KeyFile(), + config.PrivValidator.StateFile(), logger, types.ABCIPubKeyTypeEd25519)) + require.DirExists(t, config.DBDir()) + require.NoFileExists(t, filepath.Join(config.DBDir(), "block.db")) + require.NoFileExists(t, filepath.Join(config.DBDir(), "state.db")) + require.NoFileExists(t, filepath.Join(config.DBDir(), "evidence.db")) + require.NoFileExists(t, filepath.Join(config.DBDir(), "tx_index.db")) + require.FileExists(t, config.PrivValidator.StateFile()) + pv, err = privval.LoadFilePV(config.PrivValidator.KeyFile(), config.PrivValidator.StateFile()) + require.NoError(t, err) + require.Equal(t, int64(0), pv.LastSignState.Height) +} + +func Test_ResetState(t *testing.T) { + config := cfg.TestConfig() + dir := t.TempDir() + config.SetRoot(dir) + logger := log.NewNopLogger() + cfg.EnsureRoot(dir) + require.NoError(t, initFilesWithConfig(context.Background(), nodeConfig{Config: config}, logger)) + pv, err := privval.LoadFilePV(config.PrivValidator.KeyFile(), config.PrivValidator.StateFile()) + require.NoError(t, err) + pv.LastSignState.Height = 10 + require.NoError(t, pv.Save()) + require.NoError(t, ResetState(config.DBDir(), logger)) + require.DirExists(t, config.DBDir()) + require.NoFileExists(t, filepath.Join(config.DBDir(), "block.db")) + require.NoFileExists(t, filepath.Join(config.DBDir(), "state.db")) + require.NoFileExists(t, filepath.Join(config.DBDir(), "evidence.db")) + require.NoFileExists(t, filepath.Join(config.DBDir(), "tx_index.db")) + require.FileExists(t, config.PrivValidator.StateFile()) + pv, err = privval.LoadFilePV(config.PrivValidator.KeyFile(), config.PrivValidator.StateFile()) + require.NoError(t, err) + // private validator state should still be in tact. + require.Equal(t, int64(10), pv.LastSignState.Height) +} diff --git a/cmd/tenderdash/commands/rollback.go b/cmd/tenderdash/commands/rollback.go index 8391ee506a..a604341783 100644 --- a/cmd/tenderdash/commands/rollback.go +++ b/cmd/tenderdash/commands/rollback.go @@ -5,14 +5,15 @@ import ( "github.com/spf13/cobra" - cfg "github.com/tendermint/tendermint/config" + "github.com/tendermint/tendermint/config" "github.com/tendermint/tendermint/internal/state" ) -var RollbackStateCmd = &cobra.Command{ - Use: "rollback", - Short: "rollback tendermint state by one height", - Long: ` +func MakeRollbackStateCommand(conf *config.Config) *cobra.Command { + return &cobra.Command{ + Use: "rollback", + Short: "rollback tendermint state by one height", + Long: ` A state rollback is performed to recover from an incorrect application state transition, when Tendermint has persisted an incorrect app hash and is thus unable to make progress. Rollback overwrites a state at height n with the state at height n - 1. @@ -20,21 +21,23 @@ The application should also roll back to height n - 1. No blocks are removed, so restarting Tendermint the transactions in block n will be re-executed against the application. `, - RunE: func(cmd *cobra.Command, args []string) error { - height, hash, err := RollbackState(config) - if err != nil { - return fmt.Errorf("failed to rollback state: %w", err) - } - - fmt.Printf("Rolled back state to height %d and hash %X", height, hash) - return nil - }, + RunE: func(cmd *cobra.Command, args []string) error { + height, hash, err := RollbackState(conf) + if err != nil { + return fmt.Errorf("failed to rollback state: %w", err) + } + + fmt.Printf("Rolled back state to height %d and hash %X", height, hash) + return nil + }, + } + } // RollbackState takes the state at the current height n and overwrites it with the state // at height n - 1. Note state here refers to tendermint state not application state. // Returns the latest state height and app hash alongside an error if there was one. -func RollbackState(config *cfg.Config) (int64, []byte, error) { +func RollbackState(config *config.Config) (int64, []byte, error) { // use the parsed config to load the block and state store blockStore, stateStore, err := loadStateAndBlockStore(config) if err != nil { diff --git a/cmd/tenderdash/commands/root.go b/cmd/tenderdash/commands/root.go index 02f260de57..fdee638bcb 100644 --- a/cmd/tenderdash/commands/root.go +++ b/cmd/tenderdash/commands/root.go @@ -2,73 +2,68 @@ package commands import ( "fmt" - "strings" + "os" + "path/filepath" "time" "github.com/spf13/cobra" "github.com/spf13/viper" - cfg "github.com/tendermint/tendermint/config" + "github.com/tendermint/tendermint/config" + "github.com/tendermint/tendermint/libs/cli" "github.com/tendermint/tendermint/libs/log" ) -var ( - config = cfg.DefaultConfig() - logger = log.MustNewDefaultLogger(log.LogFormatPlain, log.LogLevelInfo, false) - ctxTimeout = 4 * time.Second -) - -func init() { - registerFlagsRootCmd(RootCmd) -} - -func registerFlagsRootCmd(cmd *cobra.Command) { - cmd.PersistentFlags().String("log-level", config.LogLevel, "log level") -} +const ctxTimeout = 4 * time.Second // ParseConfig retrieves the default environment configuration, // sets up the Tendermint root and ensures that the root exists -func ParseConfig() (*cfg.Config, error) { - conf := cfg.DefaultConfig() - err := viper.Unmarshal(conf) - if err != nil { +func ParseConfig(conf *config.Config) (*config.Config, error) { + if err := viper.Unmarshal(conf); err != nil { return nil, err } + conf.SetRoot(conf.RootDir) - cfg.EnsureRoot(conf.RootDir) + if err := conf.ValidateBasic(); err != nil { - return nil, fmt.Errorf("error in config file: %v", err) + return nil, fmt.Errorf("error in config file: %w", err) } return conf, nil } -// RootCmd is the root command for Tendermint core. -var RootCmd = &cobra.Command{ - Use: "tendermint", - Short: "BFT state machine replication for applications in any programming languages", - PersistentPreRunE: func(cmd *cobra.Command, args []string) (err error) { - if cmd.Name() == VersionCmd.Name() { - return nil - } +// RootCommand constructs the root command-line entry point for Tendermint core. +func RootCommand(conf *config.Config, logger log.Logger) *cobra.Command { + cmd := &cobra.Command{ + Use: "tendermint", + Short: "BFT state machine replication for applications in any programming languages", + PersistentPreRunE: func(cmd *cobra.Command, args []string) error { + if cmd.Name() == VersionCmd.Name() { + return nil + } - config, err = ParseConfig() - if err != nil { - return err - } + if err := cli.BindFlagsLoadViper(cmd, args); err != nil { + return err + } - logger, err = log.NewDefaultLogger(config.LogFormat, config.LogLevel, false) - if err != nil { - return err - } + pconf, err := ParseConfig(conf) + if err != nil { + return err + } + *conf = *pconf + config.EnsureRoot(conf.RootDir) + if err := log.OverrideWithNewLogger(logger, conf.LogFormat, conf.LogLevel); err != nil { + return err + } + if warning := pconf.DeprecatedFieldWarning(); warning != nil { + logger.Info("WARNING", "deprecated field warning", warning) + } - logger = logger.With("module", "main") - return nil - }, -} - -// deprecateSnakeCase is a util function for 0.34.1. Should be removed in 0.35 -func deprecateSnakeCase(cmd *cobra.Command, args []string) { - if strings.Contains(cmd.CalledAs(), "_") { - fmt.Println("Deprecated: snake_case commands will be replaced by hyphen-case commands in the next major release") + return nil + }, } + cmd.PersistentFlags().StringP(cli.HomeFlag, "", os.ExpandEnv(filepath.Join("$HOME", config.DefaultTendermintDir)), "directory for config and data") + cmd.PersistentFlags().Bool(cli.TraceFlag, false, "print out full stack trace on errors") + cmd.PersistentFlags().String("log-level", conf.LogLevel, "log level") + cobra.OnInitialize(func() { cli.InitEnv("TM") }) + return cmd } diff --git a/cmd/tenderdash/commands/root_test.go b/cmd/tenderdash/commands/root_test.go index cd4bc9f5f7..a4f4fb08d5 100644 --- a/cmd/tenderdash/commands/root_test.go +++ b/cmd/tenderdash/commands/root_test.go @@ -1,11 +1,10 @@ package commands import ( + "context" "fmt" - "io/ioutil" "os" "path/filepath" - "strconv" "testing" "github.com/spf13/cobra" @@ -15,47 +14,54 @@ import ( cfg "github.com/tendermint/tendermint/config" "github.com/tendermint/tendermint/libs/cli" + "github.com/tendermint/tendermint/libs/log" tmos "github.com/tendermint/tendermint/libs/os" ) -// clearConfig clears env vars, the given root dir, and resets viper. -func clearConfig(dir string) { - if err := os.Unsetenv("TMHOME"); err != nil { - panic(err) - } - if err := os.Unsetenv("TM_HOME"); err != nil { - panic(err) +// writeConfigVals writes a toml file with the given values. +// It returns an error if writing was impossible. +func writeConfigVals(dir string, vals map[string]string) error { + data := "" + for k, v := range vals { + data += fmt.Sprintf("%s = \"%s\"\n", k, v) } + cfile := filepath.Join(dir, "config.toml") + return os.WriteFile(cfile, []byte(data), 0600) +} + +// clearConfig clears env vars, the given root dir, and resets viper. +func clearConfig(t *testing.T, dir string) *cfg.Config { + t.Helper() + require.NoError(t, os.Unsetenv("TMHOME")) + require.NoError(t, os.Unsetenv("TM_HOME")) + require.NoError(t, os.RemoveAll(dir)) - if err := os.RemoveAll(dir); err != nil { - panic(err) - } viper.Reset() - config = cfg.DefaultConfig() + conf := cfg.DefaultConfig() + conf.RootDir = dir + return conf } // prepare new rootCmd -func testRootCmd() *cobra.Command { - rootCmd := &cobra.Command{ - Use: RootCmd.Use, - PersistentPreRunE: RootCmd.PersistentPreRunE, - Run: func(cmd *cobra.Command, args []string) {}, - } - registerFlagsRootCmd(rootCmd) +func testRootCmd(conf *cfg.Config) *cobra.Command { + logger := log.NewNopLogger() + cmd := RootCommand(conf, logger) + cmd.RunE = func(cmd *cobra.Command, args []string) error { return nil } + var l string - rootCmd.PersistentFlags().String("log", l, "Log") - return rootCmd + cmd.PersistentFlags().String("log", l, "Log") + return cmd } -func testSetup(rootDir string, args []string, env map[string]string) error { - clearConfig(rootDir) +func testSetup(ctx context.Context, t *testing.T, conf *cfg.Config, args []string, env map[string]string) error { + t.Helper() - rootCmd := testRootCmd() - cmd := cli.PrepareBaseCmd(rootCmd, "TM", rootDir) + cmd := testRootCmd(conf) + viper.Set(cli.HomeFlag, conf.RootDir) // run with the args and env - args = append([]string{rootCmd.Use}, args...) - return cli.RunWithArgs(cmd, args, env) + args = append([]string{cmd.Use}, args...) + return cli.RunWithArgs(ctx, cmd, args, env) } func TestRootHome(t *testing.T) { @@ -71,23 +77,29 @@ func TestRootHome(t *testing.T) { {nil, map[string]string{"TMHOME": newRoot}, newRoot}, } + ctx, cancel := context.WithCancel(context.Background()) + defer cancel() + for i, tc := range cases { - idxString := strconv.Itoa(i) + t.Run(fmt.Sprint(i), func(t *testing.T) { + conf := clearConfig(t, tc.root) - err := testSetup(defaultRoot, tc.args, tc.env) - require.Nil(t, err, idxString) + err := testSetup(ctx, t, conf, tc.args, tc.env) + require.NoError(t, err) - assert.Equal(t, tc.root, config.RootDir, idxString) - assert.Equal(t, tc.root, config.P2P.RootDir, idxString) - assert.Equal(t, tc.root, config.Consensus.RootDir, idxString) - assert.Equal(t, tc.root, config.Mempool.RootDir, idxString) + require.Equal(t, tc.root, conf.RootDir) + require.Equal(t, tc.root, conf.P2P.RootDir) + require.Equal(t, tc.root, conf.Consensus.RootDir) + require.Equal(t, tc.root, conf.Mempool.RootDir) + }) } } func TestRootFlagsEnv(t *testing.T) { - // defaults defaults := cfg.DefaultConfig() + defaultDir := t.TempDir() + defaultLogLvl := defaults.LogLevel cases := []struct { @@ -102,18 +114,25 @@ func TestRootFlagsEnv(t *testing.T) { {nil, map[string]string{"TM_LOG_LEVEL": "debug"}, "debug"}, // right env } - defaultRoot := t.TempDir() + ctx, cancel := context.WithCancel(context.Background()) + defer cancel() + for i, tc := range cases { - idxString := strconv.Itoa(i) + t.Run(fmt.Sprint(i), func(t *testing.T) { + conf := clearConfig(t, defaultDir) - err := testSetup(defaultRoot, tc.args, tc.env) - require.Nil(t, err, idxString) + err := testSetup(ctx, t, conf, tc.args, tc.env) + require.NoError(t, err) + + assert.Equal(t, tc.logLevel, conf.LogLevel) + }) - assert.Equal(t, tc.logLevel, config.LogLevel, idxString) } } func TestRootConfig(t *testing.T) { + ctx, cancel := context.WithCancel(context.Background()) + defer cancel() // write non-default config nonDefaultLogLvl := "debug" @@ -122,9 +141,8 @@ func TestRootConfig(t *testing.T) { } cases := []struct { - args []string - env map[string]string - + args []string + env map[string]string logLvl string }{ {nil, nil, nonDefaultLogLvl}, // should load config @@ -133,29 +151,31 @@ func TestRootConfig(t *testing.T) { } for i, tc := range cases { - defaultRoot := t.TempDir() - idxString := strconv.Itoa(i) - clearConfig(defaultRoot) - - // XXX: path must match cfg.defaultConfigPath - configFilePath := filepath.Join(defaultRoot, "config") - err := tmos.EnsureDir(configFilePath, 0700) - require.Nil(t, err) - - // write the non-defaults to a different path - // TODO: support writing sub configs so we can test that too - err = WriteConfigVals(configFilePath, cvals) - require.Nil(t, err) - - rootCmd := testRootCmd() - cmd := cli.PrepareBaseCmd(rootCmd, "TM", defaultRoot) - - // run with the args and env - tc.args = append([]string{rootCmd.Use}, tc.args...) - err = cli.RunWithArgs(cmd, tc.args, tc.env) - require.Nil(t, err, idxString) - - assert.Equal(t, tc.logLvl, config.LogLevel, idxString) + t.Run(fmt.Sprint(i), func(t *testing.T) { + defaultRoot := t.TempDir() + conf := clearConfig(t, defaultRoot) + conf.LogLevel = tc.logLvl + + // XXX: path must match cfg.defaultConfigPath + configFilePath := filepath.Join(defaultRoot, "config") + err := tmos.EnsureDir(configFilePath, 0700) + require.NoError(t, err) + + // write the non-defaults to a different path + // TODO: support writing sub configs so we can test that too + err = writeConfigVals(configFilePath, cvals) + require.NoError(t, err) + + cmd := testRootCmd(conf) + viper.Set(cli.HomeFlag, conf.RootDir) + + // run with the args and env + tc.args = append([]string{cmd.Use}, tc.args...) + err = cli.RunWithArgs(ctx, cmd, tc.args, tc.env) + require.NoError(t, err) + + require.Equal(t, tc.logLvl, conf.LogLevel) + }) } } @@ -167,5 +187,5 @@ func WriteConfigVals(dir string, vals map[string]string) error { data += fmt.Sprintf("%s = \"%s\"\n", k, v) } cfile := filepath.Join(dir, "config.toml") - return ioutil.WriteFile(cfile, []byte(data), 0600) + return os.WriteFile(cfile, []byte(data), 0600) } diff --git a/cmd/tenderdash/commands/run_node.go b/cmd/tenderdash/commands/run_node.go index 435ce9ea4e..347a04034e 100644 --- a/cmd/tenderdash/commands/run_node.go +++ b/cmd/tenderdash/commands/run_node.go @@ -3,155 +3,128 @@ package commands import ( "bytes" "crypto/sha256" - "errors" - "flag" "fmt" "io" "os" + "os/signal" + "syscall" "github.com/spf13/cobra" cfg "github.com/tendermint/tendermint/config" - tmos "github.com/tendermint/tendermint/libs/os" + "github.com/tendermint/tendermint/libs/log" ) var ( genesisHash []byte ) -// AddNodeFlags exposes some common configuration options on the command-line -// These are exposed for convenience of commands embedding a tendermint node -func AddNodeFlags(cmd *cobra.Command) { +// AddNodeFlags exposes some common configuration options from conf in the flag +// set for cmd. This is a convenience for commands embedding a Tendermint node. +func AddNodeFlags(cmd *cobra.Command, conf *cfg.Config) { // bind flags - cmd.Flags().String("moniker", config.Moniker, "node name") + cmd.Flags().String("moniker", conf.Moniker, "node name") // mode flags - cmd.Flags().String("mode", config.Mode, "node mode (full | validator | seed)") + cmd.Flags().String("mode", conf.Mode, "node mode (full | validator | seed)") // priv val flags cmd.Flags().String( "priv-validator-laddr", - config.PrivValidator.ListenAddr, + conf.PrivValidator.ListenAddr, "socket address to listen on for connections from external priv-validator process") // node flags - cmd.Flags().Bool("blocksync.enable", config.BlockSync.Enable, "enable fast blockchain syncing") - - // TODO (https://github.com/tendermint/tendermint/issues/6908): remove this check after the v0.35 release cycle - // This check was added to give users an upgrade prompt to use the new flag for syncing. - // - // The pflag package does not have a native way to print a depcrecation warning - // and return an error. This logic was added to print a deprecation message to the user - // and then crash if the user attempts to use the old --fast-sync flag. - fs := flag.NewFlagSet("", flag.ExitOnError) - fs.Func("fast-sync", "deprecated", - func(string) error { - return errors.New("--fast-sync has been deprecated, please use --blocksync.enable") - }) - cmd.Flags().AddGoFlagSet(fs) - - cmd.Flags().MarkHidden("fast-sync") //nolint:errcheck + cmd.Flags().BytesHexVar( &genesisHash, "genesis-hash", []byte{}, "optional SHA-256 hash of the genesis file") - cmd.Flags().Int64("consensus.double-sign-check-height", config.Consensus.DoubleSignCheckHeight, + cmd.Flags().Int64("consensus.double-sign-check-height", conf.Consensus.DoubleSignCheckHeight, "how many blocks to look back to check existence of the node's "+ "consensus votes before joining consensus") // abci flags cmd.Flags().String( "proxy-app", - config.ProxyApp, + conf.ProxyApp, "proxy app address, or one of: 'kvstore',"+ " 'persistent_kvstore', 'e2e' or 'noop' for local testing.") - cmd.Flags().String("abci", config.ABCI, "specify abci transport (socket | grpc)") + cmd.Flags().String("abci", conf.ABCI, "specify abci transport (socket | grpc)") // rpc flags - cmd.Flags().String("rpc.laddr", config.RPC.ListenAddress, "RPC listen address. Port required") - cmd.Flags().String( - "rpc.grpc-laddr", - config.RPC.GRPCListenAddress, - "GRPC listen address (BroadcastTx only). Port required") - cmd.Flags().Bool("rpc.unsafe", config.RPC.Unsafe, "enabled unsafe rpc methods") - cmd.Flags().String("rpc.pprof-laddr", config.RPC.PprofListenAddress, "pprof listen address (https://golang.org/pkg/net/http/pprof)") + cmd.Flags().String("rpc.laddr", conf.RPC.ListenAddress, "RPC listen address. Port required") + cmd.Flags().Bool("rpc.unsafe", conf.RPC.Unsafe, "enabled unsafe rpc methods") + cmd.Flags().String("rpc.pprof-laddr", conf.RPC.PprofListenAddress, "pprof listen address (https://golang.org/pkg/net/http/pprof)") // p2p flags cmd.Flags().String( "p2p.laddr", - config.P2P.ListenAddress, + conf.P2P.ListenAddress, "node listen address. (0.0.0.0:0 means any interface, any port)") - cmd.Flags().String("p2p.seeds", config.P2P.Seeds, "comma-delimited ID@host:port seed nodes") //nolint: staticcheck - cmd.Flags().String("p2p.persistent-peers", config.P2P.PersistentPeers, "comma-delimited ID@host:port persistent peers") - cmd.Flags().String("p2p.unconditional-peer-ids", - config.P2P.UnconditionalPeerIDs, "comma-delimited IDs of unconditional peers") - cmd.Flags().Bool("p2p.upnp", config.P2P.UPNP, "enable/disable UPNP port forwarding") - cmd.Flags().Bool("p2p.pex", config.P2P.PexReactor, "enable/disable Peer-Exchange") - cmd.Flags().String("p2p.private-peer-ids", config.P2P.PrivatePeerIDs, "comma-delimited private peer IDs") + cmd.Flags().String("p2p.seeds", conf.P2P.Seeds, "comma-delimited ID@host:port seed nodes") //nolint: staticcheck + cmd.Flags().String("p2p.persistent-peers", conf.P2P.PersistentPeers, "comma-delimited ID@host:port persistent peers") + cmd.Flags().Bool("p2p.upnp", conf.P2P.UPNP, "enable/disable UPNP port forwarding") + cmd.Flags().Bool("p2p.pex", conf.P2P.PexReactor, "enable/disable Peer-Exchange") + cmd.Flags().String("p2p.private-peer-ids", conf.P2P.PrivatePeerIDs, "comma-delimited private peer IDs") // consensus flags cmd.Flags().Bool( "consensus.create-empty-blocks", - config.Consensus.CreateEmptyBlocks, + conf.Consensus.CreateEmptyBlocks, "set this to false to only produce blocks when there are txs or when the AppHash changes") cmd.Flags().String( "consensus.create-empty-blocks-interval", - config.Consensus.CreateEmptyBlocksInterval.String(), + conf.Consensus.CreateEmptyBlocksInterval.String(), "the possible interval between empty blocks") - addDBFlags(cmd) + addDBFlags(cmd, conf) } -func addDBFlags(cmd *cobra.Command) { +func addDBFlags(cmd *cobra.Command, conf *cfg.Config) { cmd.Flags().String( "db-backend", - config.DBBackend, + conf.DBBackend, "database backend: goleveldb | cleveldb | boltdb | rocksdb | badgerdb") cmd.Flags().String( "db-dir", - config.DBPath, + conf.DBPath, "database directory") } // NewRunNodeCmd returns the command that allows the CLI to start a node. // It can be used with a custom PrivValidator and in-process ABCI application. -func NewRunNodeCmd(nodeProvider cfg.ServiceProvider) *cobra.Command { +func NewRunNodeCmd(nodeProvider cfg.ServiceProvider, conf *cfg.Config, logger log.Logger) *cobra.Command { cmd := &cobra.Command{ Use: "start", Aliases: []string{"node", "run"}, Short: "Run the tendermint node", RunE: func(cmd *cobra.Command, args []string) error { - if err := checkGenesisHash(config); err != nil { + if err := checkGenesisHash(conf); err != nil { return err } - n, err := nodeProvider(config, logger) + ctx, cancel := signal.NotifyContext(cmd.Context(), os.Interrupt, syscall.SIGTERM) + defer cancel() + + n, err := nodeProvider(ctx, conf, logger) if err != nil { return fmt.Errorf("failed to create node: %w", err) } - if err := n.Start(); err != nil { + if err := n.Start(ctx); err != nil { return fmt.Errorf("failed to start node: %w", err) } - logger.Info("started node", "node", n.String()) - - // Stop upon receiving SIGTERM or CTRL-C. - tmos.TrapSignal(logger, func() { - if n.IsRunning() { - if err := n.Stop(); err != nil { - logger.Error("unable to stop the node", "error", err) - } - } - }) + logger.Info("started node", "chain", conf.ChainID()) - // Run forever. - select {} + <-ctx.Done() + return nil }, } - AddNodeFlags(cmd) + AddNodeFlags(cmd, conf) return cmd } diff --git a/cmd/tenderdash/commands/show_node_id.go b/cmd/tenderdash/commands/show_node_id.go index 488f4c3228..ffc6c4d5e0 100644 --- a/cmd/tenderdash/commands/show_node_id.go +++ b/cmd/tenderdash/commands/show_node_id.go @@ -4,21 +4,23 @@ import ( "fmt" "github.com/spf13/cobra" + + "github.com/tendermint/tendermint/config" ) -// ShowNodeIDCmd dumps node's ID to the standard output. -var ShowNodeIDCmd = &cobra.Command{ - Use: "show-node-id", - Short: "Show this node's ID", - RunE: showNodeID, -} +// MakeShowNodeIDCommand constructs a command to dump the node ID to stdout. +func MakeShowNodeIDCommand(conf *config.Config) *cobra.Command { + return &cobra.Command{ + Use: "show-node-id", + Short: "Show this node's ID", + RunE: func(cmd *cobra.Command, args []string) error { + nodeKeyID, err := conf.LoadNodeKeyID() + if err != nil { + return err + } -func showNodeID(cmd *cobra.Command, args []string) error { - nodeKeyID, err := config.LoadNodeKeyID() - if err != nil { - return err + fmt.Println(nodeKeyID) + return nil + }, } - - fmt.Println(nodeKeyID) - return nil } diff --git a/cmd/tenderdash/commands/show_validator.go b/cmd/tenderdash/commands/show_validator.go index 03ddecd9d6..548b2a3c51 100644 --- a/cmd/tenderdash/commands/show_validator.go +++ b/cmd/tenderdash/commands/show_validator.go @@ -6,74 +6,78 @@ import ( "github.com/spf13/cobra" + "github.com/tendermint/tendermint/config" "github.com/tendermint/tendermint/crypto" - tmjson "github.com/tendermint/tendermint/libs/json" + "github.com/tendermint/tendermint/internal/jsontypes" + "github.com/tendermint/tendermint/libs/log" tmnet "github.com/tendermint/tendermint/libs/net" tmos "github.com/tendermint/tendermint/libs/os" "github.com/tendermint/tendermint/privval" tmgrpc "github.com/tendermint/tendermint/privval/grpc" ) -// ShowValidatorCmd adds capabilities for showing the validator info. -var ShowValidatorCmd = &cobra.Command{ - Use: "show-validator", - Short: "Show this node's validator info", - RunE: showValidator, -} - -func showValidator(cmd *cobra.Command, args []string) error { - var ( - pubKey crypto.PubKey - err error - ) +// MakeShowValidatorCommand constructs a command to show the validator info. +func MakeShowValidatorCommand(conf *config.Config, logger log.Logger) *cobra.Command { + return &cobra.Command{ + Use: "show-validator", + Short: "Show this node's validator info", + RunE: func(cmd *cobra.Command, args []string) error { + var ( + pubKey crypto.PubKey + err error + bctx = cmd.Context() + ) + //TODO: remove once gRPC is the only supported protocol + protocol, _ := tmnet.ProtocolAndAddress(conf.PrivValidator.ListenAddr) + switch protocol { + case "grpc": + pvsc, err := tmgrpc.DialRemoteSigner( + bctx, + conf.PrivValidator, + conf.ChainID(), + logger, + conf.Instrumentation.Prometheus, + ) + if err != nil { + return fmt.Errorf("can't connect to remote validator %w", err) + } - //TODO: remove once gRPC is the only supported protocol - protocol, _ := tmnet.ProtocolAndAddress(config.PrivValidator.ListenAddr) - switch protocol { - case "grpc": - pvsc, err := tmgrpc.DialRemoteSigner( - config.PrivValidator, - config.ChainID(), - logger, - config.Instrumentation.Prometheus, - ) - if err != nil { - return fmt.Errorf("can't connect to remote validator %w", err) - } + ctx, cancel := context.WithTimeout(bctx, ctxTimeout) + defer cancel() - ctx, cancel := context.WithTimeout(context.TODO(), ctxTimeout) - defer cancel() + _, err = pvsc.GetProTxHash(ctx) + if err != nil { + return fmt.Errorf("can't get proTxHash: %w", err) + } + default: - proTxHash, err = pvsc.GetProTxHash(ctx) - if err != nil { - return fmt.Errorf("can't get proTxHash: %w", err) - } - default: + keyFilePath := conf.PrivValidator.KeyFile() + if !tmos.FileExists(keyFilePath) { + return fmt.Errorf("private validator file %s does not exist", keyFilePath) + } - keyFilePath := config.PrivValidator.KeyFile() - if !tmos.FileExists(keyFilePath) { - return fmt.Errorf("private validator file %s does not exist", keyFilePath) - } + pv, err := privval.LoadFilePV(keyFilePath, conf.PrivValidator.StateFile()) + if err != nil { + return err + } - pv, err := privval.LoadFilePV(keyFilePath, config.PrivValidator.StateFile()) - if err != nil { - return err - } + ctx, cancel := context.WithTimeout(bctx, ctxTimeout) + defer cancel() - ctx, cancel := context.WithTimeout(context.TODO(), ctxTimeout) - defer cancel() + _, err = pv.GetProTxHash(ctx) + if err != nil { + return fmt.Errorf("can't get proTxHash: %w", err) + } + } - proTxHash, err = pv.GetProTxHash(ctx) - if err != nil { - return fmt.Errorf("can't get proTxHash: %w", err) - } - } + bz, err := jsontypes.Marshal(pubKey) + if err != nil { + return fmt.Errorf("failed to marshal private validator pubkey: %w", err) + } - bz, err := tmjson.Marshal(pubKey) - if err != nil { - return fmt.Errorf("failed to marshal private validator pubkey: %w", err) + fmt.Println(string(bz)) + return nil + }, } - fmt.Println(string(bz)) - return nil } diff --git a/cmd/tenderdash/commands/testnet.go b/cmd/tenderdash/commands/testnet.go index af7fcd46f9..50d82b21b0 100644 --- a/cmd/tenderdash/commands/testnet.go +++ b/cmd/tenderdash/commands/testnet.go @@ -15,283 +15,318 @@ import ( cfg "github.com/tendermint/tendermint/config" "github.com/tendermint/tendermint/libs/bytes" + "github.com/tendermint/tendermint/libs/log" tmrand "github.com/tendermint/tendermint/libs/rand" tmtime "github.com/tendermint/tendermint/libs/time" "github.com/tendermint/tendermint/privval" "github.com/tendermint/tendermint/types" ) -var ( - nValidators int - nNonValidators int - initialHeight int64 - configFile string - outputDir string - nodeDirPrefix string - - populatePersistentPeers bool - hostnamePrefix string - hostnameSuffix string - startingIPAddress string - hostnames []string - p2pPort int - randomMonikers bool -) - const ( nodeDirPerm = 0755 ) -func init() { - TestnetFilesCmd.Flags().IntVar(&nValidators, "v", 4, +// MakeTestnetFilesCommand constructs a command to generate testnet config files. +func MakeTestnetFilesCommand(conf *cfg.Config, logger log.Logger) *cobra.Command { + cmd := &cobra.Command{ + Use: "testnet", + Short: "Initialize files for a Tendermint testnet", + Long: `testnet will create "v" + "n" number of directories and populate each with +necessary files (private validator, genesis, config, etc.). + +Note, strict routability for addresses is turned off in the config file. + +Optionally, it will fill in persistent-peers list in config file using either hostnames or IPs. + +Example: + + tendermint testnet --v 4 --o ./output --populate-persistent-peers --starting-ip-address 192.168.10.2 + `, + } + var ( + nValidators int + nNonValidators int + initialHeight int64 + configFile string + outputDir string + nodeDirPrefix string + + populatePersistentPeers bool + hostnamePrefix string + hostnameSuffix string + startingIPAddress string + hostnames []string + p2pPort int + randomMonikers bool + keyType string + ) + + cmd.Flags().IntVar(&nValidators, "v", 4, "number of validators to initialize the testnet with") - TestnetFilesCmd.Flags().StringVar(&configFile, "config", "", + cmd.Flags().StringVar(&configFile, "config", "", "config file to use (note some options may be overwritten)") - TestnetFilesCmd.Flags().IntVar(&nNonValidators, "n", 0, + cmd.Flags().IntVar(&nNonValidators, "n", 0, "number of non-validators to initialize the testnet with") - TestnetFilesCmd.Flags().StringVar(&outputDir, "o", "./mytestnet", + cmd.Flags().StringVar(&outputDir, "o", "./mytestnet", "directory to store initialization data for the testnet") - TestnetFilesCmd.Flags().StringVar(&nodeDirPrefix, "node-dir-prefix", "node", + cmd.Flags().StringVar(&nodeDirPrefix, "node-dir-prefix", "node", "prefix the directory name for each node with (node results in node0, node1, ...)") - TestnetFilesCmd.Flags().Int64Var(&initialHeight, "initial-height", 0, + cmd.Flags().Int64Var(&initialHeight, "initial-height", 0, "initial height of the first block") - TestnetFilesCmd.Flags().BoolVar(&populatePersistentPeers, "populate-persistent-peers", true, + cmd.Flags().BoolVar(&populatePersistentPeers, "populate-persistent-peers", true, "update config of each node with the list of persistent peers build using either"+ " hostname-prefix or"+ " starting-ip-address") - TestnetFilesCmd.Flags().StringVar(&hostnamePrefix, "hostname-prefix", "node", + cmd.Flags().StringVar(&hostnamePrefix, "hostname-prefix", "node", "hostname prefix (\"node\" results in persistent peers list ID0@node0:26656, ID1@node1:26656, ...)") - TestnetFilesCmd.Flags().StringVar(&hostnameSuffix, "hostname-suffix", "", + cmd.Flags().StringVar(&hostnameSuffix, "hostname-suffix", "", "hostname suffix ("+ "\".xyz.com\""+ " results in persistent peers list ID0@node0.xyz.com:26656, ID1@node1.xyz.com:26656, ...)") - TestnetFilesCmd.Flags().StringVar(&startingIPAddress, "starting-ip-address", "", + cmd.Flags().StringVar(&startingIPAddress, "starting-ip-address", "", "starting IP address ("+ "\"192.168.0.1\""+ " results in persistent peers list ID0@192.168.0.1:26656, ID1@192.168.0.2:26656, ...)") - TestnetFilesCmd.Flags().StringArrayVar(&hostnames, "hostname", []string{}, + cmd.Flags().StringArrayVar(&hostnames, "hostname", []string{}, "manually override all hostnames of validators and non-validators (use --hostname multiple times for multiple hosts)") - TestnetFilesCmd.Flags().IntVar(&p2pPort, "p2p-port", 26656, + cmd.Flags().IntVar(&p2pPort, "p2p-port", 26656, "P2P Port") - TestnetFilesCmd.Flags().BoolVar(&randomMonikers, "random-monikers", false, + cmd.Flags().BoolVar(&randomMonikers, "random-monikers", false, "randomize the moniker for each generated node") -} - -// TestnetFilesCmd allows initialisation of files for a Tendermint testnet. -var TestnetFilesCmd = &cobra.Command{ - Use: "testnet", - Short: "Initialize files for a Tendermint testnet", - Long: `testnet will create "v" + "n" number of directories and populate each with -necessary files (private validator, genesis, config, etc.). - -Note, strict routability for addresses is turned off in the config file. - -Optionally, it will fill in persistent-peers list in config file using either hostnames or IPs. - -Example: - - tendermint testnet --v 4 --o ./output --populate-persistent-peers --starting-ip-address 192.168.10.2 - `, - RunE: testnetFiles, -} - -func testnetFiles(cmd *cobra.Command, args []string) error { - if len(hostnames) > 0 && len(hostnames) != (nValidators+nNonValidators) { - return fmt.Errorf( - "testnet needs precisely %d hostnames (number of validators plus non-validators) if --hostname parameter is used", - nValidators+nNonValidators, - ) - } + cmd.Flags().StringVar(&keyType, "key", types.ABCIPubKeyTypeEd25519, + "Key type to generate privval file with. Options: ed25519, secp256k1") + + cmd.RunE = func(cmd *cobra.Command, args []string) error { + if len(hostnames) > 0 && len(hostnames) != (nValidators+nNonValidators) { + return fmt.Errorf( + "testnet needs precisely %d hostnames (number of validators plus non-validators) if --hostname parameter is used", + nValidators+nNonValidators, + ) + } - // set mode to validator for testnet - config := cfg.DefaultValidatorConfig() + // set mode to validator for testnet + config := cfg.DefaultValidatorConfig() - // overwrite default config if set and valid - if configFile != "" { - viper.SetConfigFile(configFile) - if err := viper.ReadInConfig(); err != nil { - return err - } - if err := viper.Unmarshal(config); err != nil { - return err - } - if err := config.ValidateBasic(); err != nil { - return err + // overwrite default config if set and valid + if configFile != "" { + viper.SetConfigFile(configFile) + if err := viper.ReadInConfig(); err != nil { + return err + } + if err := viper.Unmarshal(config); err != nil { + return err + } + if err := config.ValidateBasic(); err != nil { + return err + } } - } - genVals := make([]types.GenesisValidator, nValidators) + genVals := make([]types.GenesisValidator, nValidators) + ctx := cmd.Context() + for i := 0; i < nValidators; i++ { + nodeDirName := fmt.Sprintf("%s%d", nodeDirPrefix, i) + nodeDir := filepath.Join(outputDir, nodeDirName) + config.SetRoot(nodeDir) + + err := os.MkdirAll(filepath.Join(nodeDir, "config"), nodeDirPerm) + if err != nil { + _ = os.RemoveAll(outputDir) + return err + } + err = os.MkdirAll(filepath.Join(nodeDir, "data"), nodeDirPerm) + if err != nil { + _ = os.RemoveAll(outputDir) + return err + } - for i := 0; i < nValidators; i++ { - nodeDirName := fmt.Sprintf("%s%d", nodeDirPrefix, i) - nodeDir := filepath.Join(outputDir, nodeDirName) - config.SetRoot(nodeDir) + if err := initFilesWithConfig(ctx, nodeConfig{Config: config}, logger); err != nil { + return err + } - err := os.MkdirAll(filepath.Join(nodeDir, "config"), nodeDirPerm) - if err != nil { - _ = os.RemoveAll(outputDir) - return err - } - err = os.MkdirAll(filepath.Join(nodeDir, "data"), nodeDirPerm) - if err != nil { - _ = os.RemoveAll(outputDir) - return err - } + pvKeyFile := filepath.Join(nodeDir, config.PrivValidator.Key) + pvStateFile := filepath.Join(nodeDir, config.PrivValidator.State) + pv, err := privval.LoadFilePV(pvKeyFile, pvStateFile) + if err != nil { + return err + } - if err := initFilesWithConfig(config); err != nil { - return err - } + ctx, cancel := context.WithTimeout(ctx, ctxTimeout) + defer cancel() - pvKeyFile := filepath.Join(nodeDir, config.PrivValidator.Key) - pvStateFile := filepath.Join(nodeDir, config.PrivValidator.State) - pv, err := privval.LoadFilePV(pvKeyFile, pvStateFile) - if err != nil { - return err + pubKey, err := pv.GetPubKey(ctx, crypto.QuorumHash{}) + if err != nil { + return fmt.Errorf("can't get pubkey in testnet files: %w", err) + } + genVals[i] = types.GenesisValidator{ + PubKey: pubKey, + Power: 1, + Name: nodeDirName, + } } - ctx, cancel := context.WithTimeout(context.TODO(), ctxTimeout) - defer cancel() + for i := 0; i < nNonValidators; i++ { + nodeDir := filepath.Join(outputDir, fmt.Sprintf("%s%d", nodeDirPrefix, i+nValidators)) + config.SetRoot(nodeDir) - pubKey, err := pv.GetPubKey(ctx, crypto.QuorumHash{}) - if err != nil { - return fmt.Errorf("can't get pubkey in testnet files: %w", err) - } - genVals[i] = types.GenesisValidator{ - PubKey: pubKey, - Power: 1, - Name: nodeDirName, - } - } + err := os.MkdirAll(filepath.Join(nodeDir, "config"), nodeDirPerm) + if err != nil { + _ = os.RemoveAll(outputDir) + return err + } - for i := 0; i < nNonValidators; i++ { - nodeDir := filepath.Join(outputDir, fmt.Sprintf("%s%d", nodeDirPrefix, i+nValidators)) - config.SetRoot(nodeDir) + err = os.MkdirAll(filepath.Join(nodeDir, "data"), nodeDirPerm) + if err != nil { + _ = os.RemoveAll(outputDir) + return err + } - err := os.MkdirAll(filepath.Join(nodeDir, "config"), nodeDirPerm) - if err != nil { - _ = os.RemoveAll(outputDir) - return err + if err := initFilesWithConfig(ctx, nodeConfig{Config: conf}, logger); err != nil { + return err + } } - err = os.MkdirAll(filepath.Join(nodeDir, "data"), nodeDirPerm) - if err != nil { - _ = os.RemoveAll(outputDir) - return err + // Generate genesis doc from generated validators + genDoc := &types.GenesisDoc{ + ChainID: "chain-" + tmrand.Str(6), + GenesisTime: tmtime.Now(), + InitialHeight: initialHeight, + Validators: genVals, + ConsensusParams: types.DefaultConsensusParams(), } - - if err := initFilesWithConfig(config); err != nil { - return err + if keyType == "secp256k1" { + genDoc.ConsensusParams.Validator = types.ValidatorParams{ + PubKeyTypes: []string{types.ABCIPubKeyTypeSecp256k1}, + } } - } - // Generate genesis doc from generated validators - genDoc := &types.GenesisDoc{ - ChainID: "chain-" + tmrand.Str(6), - GenesisTime: tmtime.Now(), - InitialHeight: initialHeight, - Validators: genVals, - ConsensusParams: types.DefaultConsensusParams(), - } - if keyType == "secp256k1" { - genDoc.ConsensusParams.Validator = types.ValidatorParams{ - PubKeyTypes: []string{types.ABCIPubKeyTypeSecp256k1}, + // Write genesis file. + for i := 0; i < nValidators+nNonValidators; i++ { + nodeDir := filepath.Join(outputDir, fmt.Sprintf("%s%d", nodeDirPrefix, i)) + if err := genDoc.SaveAs(filepath.Join(nodeDir, config.BaseConfig.Genesis)); err != nil { + _ = os.RemoveAll(outputDir) + return err + } } - } - // Write genesis file. - for i := 0; i < nValidators+nNonValidators; i++ { - nodeDir := filepath.Join(outputDir, fmt.Sprintf("%s%d", nodeDirPrefix, i)) - if err := genDoc.SaveAs(filepath.Join(nodeDir, config.BaseConfig.Genesis)); err != nil { - _ = os.RemoveAll(outputDir) - return err + // Gather persistent peer addresses. + var ( + persistentPeers = make([]string, 0) + err error + ) + tpargs := testnetPeerArgs{ + numValidators: nValidators, + numNonValidators: nNonValidators, + peerToPeerPort: p2pPort, + nodeDirPrefix: nodeDirPrefix, + outputDir: outputDir, + hostnames: hostnames, + startingIPAddr: startingIPAddress, + hostnamePrefix: hostnamePrefix, + hostnameSuffix: hostnameSuffix, + randomMonikers: randomMonikers, } - } - // Gather persistent peer addresses. - var ( - persistentPeers = make([]string, 0) - err error - ) - if populatePersistentPeers { - persistentPeers, err = persistentPeersArray(config) - if err != nil { - _ = os.RemoveAll(outputDir) - return err + if populatePersistentPeers { + + persistentPeers, err = persistentPeersArray(config, tpargs) + if err != nil { + _ = os.RemoveAll(outputDir) + return err + } } - } - // Overwrite default config. - for i := 0; i < nValidators+nNonValidators; i++ { - nodeDir := filepath.Join(outputDir, fmt.Sprintf("%s%d", nodeDirPrefix, i)) - config.SetRoot(nodeDir) - config.P2P.AddrBookStrict = false - config.P2P.AllowDuplicateIP = true - if populatePersistentPeers { - persistentPeersWithoutSelf := make([]string, 0) - for j := 0; j < len(persistentPeers); j++ { - if j == i { - continue + // Overwrite default config. + for i := 0; i < nValidators+nNonValidators; i++ { + nodeDir := filepath.Join(outputDir, fmt.Sprintf("%s%d", nodeDirPrefix, i)) + config.SetRoot(nodeDir) + config.P2P.AllowDuplicateIP = true + if populatePersistentPeers { + persistentPeersWithoutSelf := make([]string, 0) + for j := 0; j < len(persistentPeers); j++ { + if j == i { + continue + } + persistentPeersWithoutSelf = append(persistentPeersWithoutSelf, persistentPeers[j]) } - persistentPeersWithoutSelf = append(persistentPeersWithoutSelf, persistentPeers[j]) + config.P2P.PersistentPeers = strings.Join(persistentPeersWithoutSelf, ",") } - config.P2P.PersistentPeers = strings.Join(persistentPeersWithoutSelf, ",") - } - config.Moniker = moniker(i) + config.Moniker = tpargs.moniker(i) - if err := cfg.WriteConfigFile(nodeDir, config); err != nil { - return err + if err := cfg.WriteConfigFile(nodeDir, config); err != nil { + return err + } } + + fmt.Printf("Successfully initialized %v node directories\n", nValidators+nNonValidators) + return nil } - fmt.Printf("Successfully initialized %v node directories\n", nValidators+nNonValidators) - return nil + return cmd } -func hostnameOrIP(i int) string { - if len(hostnames) > 0 && i < len(hostnames) { - return hostnames[i] +type testnetPeerArgs struct { + numValidators int + numNonValidators int + peerToPeerPort int + nodeDirPrefix string + outputDir string + hostnames []string + startingIPAddr string + hostnamePrefix string + hostnameSuffix string + randomMonikers bool +} + +func (args *testnetPeerArgs) hostnameOrIP(i int) (string, error) { + if len(args.hostnames) > 0 && i < len(args.hostnames) { + return args.hostnames[i], nil } - if startingIPAddress == "" { - return fmt.Sprintf("%s%d%s", hostnamePrefix, i, hostnameSuffix) + if args.startingIPAddr == "" { + return fmt.Sprintf("%s%d%s", args.hostnamePrefix, i, args.hostnameSuffix), nil } - ip := net.ParseIP(startingIPAddress) + ip := net.ParseIP(args.startingIPAddr) ip = ip.To4() if ip == nil { - fmt.Printf("%v: non ipv4 address\n", startingIPAddress) - os.Exit(1) + return "", fmt.Errorf("%v is non-ipv4 address", args.startingIPAddr) } for j := 0; j < i; j++ { ip[3]++ } - return ip.String() + return ip.String(), nil + } // get an array of persistent peers -func persistentPeersArray(config *cfg.Config) ([]string, error) { - peers := make([]string, nValidators+nNonValidators) - for i := 0; i < nValidators+nNonValidators; i++ { - nodeDir := filepath.Join(outputDir, fmt.Sprintf("%s%d", nodeDirPrefix, i)) +func persistentPeersArray(config *cfg.Config, args testnetPeerArgs) ([]string, error) { + peers := make([]string, args.numValidators+args.numNonValidators) + for i := 0; i < len(peers); i++ { + nodeDir := filepath.Join(args.outputDir, fmt.Sprintf("%s%d", args.nodeDirPrefix, i)) config.SetRoot(nodeDir) nodeKey, err := config.LoadNodeKeyID() if err != nil { - return []string{}, err + return nil, err } - peers[i] = nodeKey.AddressString(fmt.Sprintf("%s:%d", hostnameOrIP(i), p2pPort)) + addr, err := args.hostnameOrIP(i) + if err != nil { + return nil, err + } + + peers[i] = nodeKey.AddressString(fmt.Sprintf("%s:%d", addr, args.peerToPeerPort)) } return peers, nil } -func moniker(i int) string { - if randomMonikers { +func (args *testnetPeerArgs) moniker(i int) string { + if args.randomMonikers { return randomMoniker() } - if len(hostnames) > 0 && i < len(hostnames) { - return hostnames[i] + if len(args.hostnames) > 0 && i < len(args.hostnames) { + return args.hostnames[i] } - if startingIPAddress == "" { - return fmt.Sprintf("%s%d%s", hostnamePrefix, i, hostnameSuffix) + if args.startingIPAddr == "" { + return fmt.Sprintf("%s%d%s", args.hostnamePrefix, i, args.hostnameSuffix) } return randomMoniker() } diff --git a/cmd/tenderdash/main.go b/cmd/tenderdash/main.go index f71b7538e1..7320267fbd 100644 --- a/cmd/tenderdash/main.go +++ b/cmd/tenderdash/main.go @@ -1,41 +1,48 @@ package main import ( - "os" - "path/filepath" + "context" - cmd "github.com/tendermint/tendermint/cmd/tenderdash/commands" + "github.com/tendermint/tendermint/cmd/tenderdash/commands" "github.com/tendermint/tendermint/cmd/tenderdash/commands/debug" "github.com/tendermint/tendermint/config" "github.com/tendermint/tendermint/libs/cli" + "github.com/tendermint/tendermint/libs/log" "github.com/tendermint/tendermint/node" ) func main() { - initFilesCommand := cmd.InitFilesCmd - cmd.AddInitFlags(initFilesCommand) - - rootCmd := cmd.RootCmd - rootCmd.AddCommand( - cmd.GenValidatorCmd, - cmd.ReIndexEventCmd, - cmd.InitFilesCmd, - cmd.ProbeUpnpCmd, - cmd.LightCmd, - cmd.ReplayCmd, - cmd.ReplayConsoleCmd, - cmd.ResetAllCmd, - cmd.ResetPrivValidatorCmd, - cmd.ShowValidatorCmd, - cmd.TestnetFilesCmd, - cmd.ShowNodeIDCmd, - cmd.GenNodeKeyCmd, - cmd.VersionCmd, - cmd.InspectCmd, - cmd.RollbackStateCmd, - cmd.MakeKeyMigrateCommand(), - debug.DebugCmd, - cli.NewCompletionCmd(rootCmd, true), + ctx, cancel := context.WithCancel(context.Background()) + defer cancel() + + conf, err := commands.ParseConfig(config.DefaultConfig()) + if err != nil { + panic(err) + } + + logger, err := log.NewDefaultLogger(conf.LogFormat, conf.LogLevel) + if err != nil { + panic(err) + } + + rcmd := commands.RootCommand(conf, logger) + rcmd.AddCommand( + commands.MakeGenValidatorCommand(), + commands.MakeReindexEventCommand(conf, logger), + commands.MakeInitFilesCommand(conf, logger), + commands.MakeLightCommand(conf, logger), + commands.MakeReplayCommand(conf, logger), + commands.MakeReplayConsoleCommand(conf, logger), + commands.MakeShowValidatorCommand(conf, logger), + commands.MakeTestnetFilesCommand(conf, logger), + commands.MakeShowNodeIDCommand(conf), + commands.GenNodeKeyCmd, + commands.VersionCmd, + commands.MakeInspectCommand(conf, logger), + commands.MakeRollbackStateCommand(conf), + commands.MakeKeyMigrateCommand(conf, logger), + debug.GetDebugCommand(logger), + commands.NewCompletionCmd(rcmd, true), ) // NOTE: @@ -49,10 +56,9 @@ func main() { nodeFunc := node.NewDefault // Create & start node - rootCmd.AddCommand(cmd.NewRunNodeCmd(nodeFunc)) + rcmd.AddCommand(commands.NewRunNodeCmd(nodeFunc, conf, logger)) - cmd := cli.PrepareBaseCmd(rootCmd, "TM", os.ExpandEnv(filepath.Join("$HOME", config.DefaultTendermintDir))) - if err := cmd.Execute(); err != nil { + if err := cli.RunWithTrace(ctx, rcmd); err != nil { panic(err) } } diff --git a/config/config.go b/config/config.go index 3af0a86be5..3ccab645ed 100644 --- a/config/config.go +++ b/config/config.go @@ -2,18 +2,18 @@ package config import ( "encoding/hex" + "encoding/json" "errors" "fmt" - "io/ioutil" "net/http" "os" "path/filepath" + "strings" "time" "github.com/dashevo/dashd-go/btcjson" "github.com/tendermint/tendermint/crypto" - tmjson "github.com/tendermint/tendermint/libs/json" "github.com/tendermint/tendermint/libs/log" tmos "github.com/tendermint/tendermint/libs/os" "github.com/tendermint/tendermint/types" @@ -31,12 +31,6 @@ const ( ModeFull = "full" ModeValidator = "validator" ModeSeed = "seed" - - BlockSyncV0 = "v0" - BlockSyncV2 = "v2" - - MempoolV0 = "v0" - MempoolV1 = "v1" ) // NOTE: Most of the structs & relevant comments + the @@ -57,19 +51,14 @@ var ( defaultPrivValKeyName = "priv_validator_key.json" defaultPrivValStateName = "priv_validator_state.json" - defaultNodeKeyName = "node_key.json" - defaultAddrBookName = "addrbook.json" + defaultNodeKeyName = "node_key.json" defaultConfigFilePath = filepath.Join(defaultConfigDir, defaultConfigFileName) defaultGenesisJSONPath = filepath.Join(defaultConfigDir, defaultGenesisJSONName) defaultPrivValKeyPath = filepath.Join(defaultConfigDir, defaultPrivValKeyName) defaultPrivValStatePath = filepath.Join(defaultDataDir, defaultPrivValStateName) - defaultNodeKeyPath = filepath.Join(defaultConfigDir, defaultNodeKeyName) - defaultAddrBookPath = filepath.Join(defaultConfigDir, defaultAddrBookName) - - minSubscriptionBufferSize = 100 - defaultSubscriptionBufferSize = 200 + defaultNodeKeyPath = filepath.Join(defaultConfigDir, defaultNodeKeyName) ) // Config defines the top level configuration for a Tendermint node @@ -82,7 +71,6 @@ type Config struct { P2P *P2PConfig `mapstructure:"p2p"` Mempool *MempoolConfig `mapstructure:"mempool"` StateSync *StateSyncConfig `mapstructure:"statesync"` - BlockSync *BlockSyncConfig `mapstructure:"blocksync"` Consensus *ConsensusConfig `mapstructure:"consensus"` TxIndex *TxIndexConfig `mapstructure:"tx-index"` Instrumentation *InstrumentationConfig `mapstructure:"instrumentation"` @@ -97,7 +85,6 @@ func DefaultConfig() *Config { P2P: DefaultP2PConfig(), Mempool: DefaultMempoolConfig(), StateSync: DefaultStateSyncConfig(), - BlockSync: DefaultBlockSyncConfig(), Consensus: DefaultConsensusConfig(), TxIndex: DefaultTxIndexConfig(), Instrumentation: DefaultInstrumentationConfig(), @@ -120,7 +107,6 @@ func TestConfig() *Config { P2P: TestP2PConfig(), Mempool: TestMempoolConfig(), StateSync: TestStateSyncConfig(), - BlockSync: TestBlockSyncConfig(), Consensus: TestConsensusConfig(), TxIndex: TestTxIndexConfig(), Instrumentation: TestInstrumentationConfig(), @@ -148,18 +134,12 @@ func (cfg *Config) ValidateBasic() error { if err := cfg.RPC.ValidateBasic(); err != nil { return fmt.Errorf("error in [rpc] section: %w", err) } - if err := cfg.P2P.ValidateBasic(); err != nil { - return fmt.Errorf("error in [p2p] section: %w", err) - } if err := cfg.Mempool.ValidateBasic(); err != nil { return fmt.Errorf("error in [mempool] section: %w", err) } if err := cfg.StateSync.ValidateBasic(); err != nil { return fmt.Errorf("error in [statesync] section: %w", err) } - if err := cfg.BlockSync.ValidateBasic(); err != nil { - return fmt.Errorf("error in [blocksync] section: %w", err) - } if err := cfg.Consensus.ValidateBasic(); err != nil { return fmt.Errorf("error in [consensus] section: %w", err) } @@ -169,6 +149,10 @@ func (cfg *Config) ValidateBasic() error { return nil } +func (cfg *Config) DeprecatedFieldWarning() error { + return cfg.Consensus.DeprecatedFieldWarning() +} + //----------------------------------------------------------------------------- // BaseConfig @@ -306,12 +290,12 @@ func (cfg BaseConfig) NodeKeyFile() string { // LoadNodeKey loads NodeKey located in filePath. func (cfg BaseConfig) LoadNodeKeyID() (types.NodeID, error) { - jsonBytes, err := ioutil.ReadFile(cfg.NodeKeyFile()) + jsonBytes, err := os.ReadFile(cfg.NodeKeyFile()) if err != nil { return "", err } nodeKey := types.NodeKey{} - err = tmjson.Unmarshal(jsonBytes, &nodeKey) + err = json.Unmarshal(jsonBytes, &nodeKey) if err != nil { return "", err } @@ -362,28 +346,6 @@ func (cfg BaseConfig) ValidateBasic() error { return fmt.Errorf("unknown mode: %v", cfg.Mode) } - // TODO (https://github.com/tendermint/tendermint/issues/6908) remove this check after the v0.35 release cycle. - // This check was added to give users an upgrade prompt to use the new - // configuration option in v0.35. In future release cycles they should no longer - // be using this configuration parameter so the check can be removed. - // The cfg.Other field can likely be removed at the same time if it is not referenced - // elsewhere as it was added to service this check. - if fs, ok := cfg.Other["fastsync"]; ok { - if _, ok := fs.(map[string]interface{}); ok { - return fmt.Errorf("a configuration section named 'fastsync' was found in the " + - "configuration file. The 'fastsync' section has been renamed to " + - "'blocksync', please update the 'fastsync' field in your configuration file to 'blocksync'") - } - } - if fs, ok := cfg.Other["fast-sync"]; ok { - if fs != "" { - return fmt.Errorf("a parameter named 'fast-sync' was found in the " + - "configuration file. The parameter to enable or disable quickly syncing with a blockchain" + - "has moved to the [blocksync] section of the configuration file as blocksync.enable. " + - "Please move the 'fast-sync' field in your configuration file to 'blocksync.enable'") - } - } - return nil } @@ -498,24 +460,10 @@ type RPCConfig struct { // A list of non simple headers the client is allowed to use with cross-domain requests. CORSAllowedHeaders []string `mapstructure:"cors-allowed-headers"` - // TCP or UNIX socket address for the gRPC server to listen on - // NOTE: This server only supports /broadcast_tx_commit - // Deprecated: gRPC in the RPC layer of Tendermint will be removed in 0.36. - GRPCListenAddress string `mapstructure:"grpc-laddr"` - - // Maximum number of simultaneous connections. - // Does not include RPC (HTTP&WebSocket) connections. See max-open-connections - // If you want to accept a larger number than the default, make sure - // you increase your OS limits. - // 0 - unlimited. - // Deprecated: gRPC in the RPC layer of Tendermint will be removed in 0.36. - GRPCMaxOpenConnections int `mapstructure:"grpc-max-open-connections"` - // Activate unsafe RPC commands like /dial-persistent-peers and /unsafe-flush-mempool Unsafe bool `mapstructure:"unsafe"` // Maximum number of simultaneous connections (including WebSocket). - // Does not include gRPC connections. See grpc-max-open-connections // If you want to accept a larger number than the default, make sure // you increase your OS limits. // 0 - unlimited. @@ -529,32 +477,36 @@ type RPCConfig struct { MaxSubscriptionClients int `mapstructure:"max-subscription-clients"` // Maximum number of unique queries a given client can /subscribe to - // If you're using GRPC (or Local RPC client) and /broadcast_tx_commit, set + // If you're using a Local RPC client and /broadcast_tx_commit, set this // to the estimated maximum number of broadcast_tx_commit calls per block. MaxSubscriptionsPerClient int `mapstructure:"max-subscriptions-per-client"` - // The number of events that can be buffered per subscription before - // returning `ErrOutOfCapacity`. - SubscriptionBufferSize int `mapstructure:"experimental-subscription-buffer-size"` - - // The maximum number of responses that can be buffered per WebSocket - // client. If clients cannot read from the WebSocket endpoint fast enough, - // they will be disconnected, so increasing this parameter may reduce the - // chances of them being disconnected (but will cause the node to use more - // memory). + // If true, disable the websocket interface to the RPC service. This has + // the effect of disabling the /subscribe, /unsubscribe, and /unsubscribe_all + // methods for event subscription. // - // Must be at least the same as `SubscriptionBufferSize`, otherwise - // connections may be dropped unnecessarily. - WebSocketWriteBufferSize int `mapstructure:"experimental-websocket-write-buffer-size"` - - // If a WebSocket client cannot read fast enough, at present we may - // silently drop events instead of generating an error or disconnecting the - // client. + // EXPERIMENTAL: This setting will be removed in Tendermint v0.37. + ExperimentalDisableWebsocket bool `mapstructure:"experimental-disable-websocket"` + + // The time window size for the event log. All events up to this long before + // the latest (up to EventLogMaxItems) will be available for subscribers to + // fetch via the /events method. If 0 (the default) the event log and the + // /events RPC method are disabled. + EventLogWindowSize time.Duration `mapstructure:"event-log-window-size"` + + // The maxiumum number of events that may be retained by the event log. If + // this value is 0, no upper limit is set. Otherwise, items in excess of + // this number will be discarded from the event log. // - // Enabling this parameter will cause the WebSocket connection to be closed - // instead if it cannot read fast enough, allowing for greater - // predictability in subscription behavior. - CloseOnSlowClient bool `mapstructure:"experimental-close-on-slow-client"` + // Warning: This setting is a safety valve. Setting it too low may cause + // subscribers to miss events. Try to choose a value higher than the + // maximum worst-case expected event load within the chosen window size in + // ordinary operation. + // + // For example, if the window size is 10 minutes and the node typically + // averages 1000 events per ten minutes, but with occasional known spikes of + // up to 2000, choose a value > 2000. + EventLogMaxItems int `mapstructure:"event-log-max-items"` // How long to wait for a tx to be committed during /broadcast_tx_commit // WARNING: Using a value larger than 10s will result in increasing the @@ -593,21 +545,22 @@ type RPCConfig struct { // DefaultRPCConfig returns a default configuration for the RPC server func DefaultRPCConfig() *RPCConfig { return &RPCConfig{ - ListenAddress: "tcp://127.0.0.1:26657", - CORSAllowedOrigins: []string{}, - CORSAllowedMethods: []string{http.MethodHead, http.MethodGet, http.MethodPost}, - CORSAllowedHeaders: []string{"Origin", "Accept", "Content-Type", "X-Requested-With", "X-Server-Time"}, - GRPCListenAddress: "", - GRPCMaxOpenConnections: 900, + ListenAddress: "tcp://127.0.0.1:26657", + CORSAllowedOrigins: []string{}, + CORSAllowedMethods: []string{http.MethodHead, http.MethodGet, http.MethodPost}, + CORSAllowedHeaders: []string{"Origin", "Accept", "Content-Type", "X-Requested-With", "X-Server-Time"}, Unsafe: false, MaxOpenConnections: 900, - MaxSubscriptionClients: 100, - MaxSubscriptionsPerClient: 5, - SubscriptionBufferSize: defaultSubscriptionBufferSize, - TimeoutBroadcastTxCommit: 10 * time.Second, - WebSocketWriteBufferSize: defaultSubscriptionBufferSize, + // Settings for event subscription. + MaxSubscriptionClients: 100, + MaxSubscriptionsPerClient: 5, + ExperimentalDisableWebsocket: false, // compatible with TM v0.35 and earlier + EventLogWindowSize: 0, // disables /events RPC by default + EventLogMaxItems: 0, + + TimeoutBroadcastTxCommit: 10 * time.Second, MaxBodyBytes: int64(1000000), // 1MB MaxHeaderBytes: 1 << 20, // same as the net/http default @@ -621,7 +574,6 @@ func DefaultRPCConfig() *RPCConfig { func TestRPCConfig() *RPCConfig { cfg := DefaultRPCConfig() cfg.ListenAddress = "tcp://127.0.0.1:36657" - cfg.GRPCListenAddress = "tcp://127.0.0.1:36658" cfg.Unsafe = true return cfg } @@ -629,9 +581,6 @@ func TestRPCConfig() *RPCConfig { // ValidateBasic performs basic validation (checking param bounds, etc.) and // returns an error if any check fails. func (cfg *RPCConfig) ValidateBasic() error { - if cfg.GRPCMaxOpenConnections < 0 { - return errors.New("grpc-max-open-connections can't be negative") - } if cfg.MaxOpenConnections < 0 { return errors.New("max-open-connections can't be negative") } @@ -641,17 +590,11 @@ func (cfg *RPCConfig) ValidateBasic() error { if cfg.MaxSubscriptionsPerClient < 0 { return errors.New("max-subscriptions-per-client can't be negative") } - if cfg.SubscriptionBufferSize < minSubscriptionBufferSize { - return fmt.Errorf( - "experimental-subscription-buffer-size must be >= %d", - minSubscriptionBufferSize, - ) + if cfg.EventLogWindowSize < 0 { + return errors.New("event-log-window-size must not be negative") } - if cfg.WebSocketWriteBufferSize < cfg.SubscriptionBufferSize { - return fmt.Errorf( - "experimental-websocket-write-buffer-size must be >= experimental-subscription-buffer-size (%d)", - cfg.SubscriptionBufferSize, - ) + if cfg.EventLogMaxItems < 0 { + return errors.New("event-log-max-items must not be negative") } if cfg.TimeoutBroadcastTxCommit < 0 { return errors.New("timeout-broadcast-tx-commit can't be negative") @@ -723,25 +666,6 @@ type P2PConfig struct { //nolint: maligned // UPNP port forwarding UPNP bool `mapstructure:"upnp"` - // Path to address book - AddrBook string `mapstructure:"addr-book-file"` - - // Set true for strict address routability rules - // Set false for private or local networks - AddrBookStrict bool `mapstructure:"addr-book-strict"` - - // Maximum number of inbound peers - // - // TODO: Remove once p2p refactor is complete in favor of MaxConnections. - // ref: https://github.com/tendermint/tendermint/issues/5670 - MaxNumInboundPeers int `mapstructure:"max-num-inbound-peers"` - - // Maximum number of outbound peers to connect to, excluding persistent peers. - // - // TODO: Remove once p2p refactor is complete in favor of MaxConnections. - // ref: https://github.com/tendermint/tendermint/issues/5670 - MaxNumOutboundPeers int `mapstructure:"max-num-outbound-peers"` - // MaxConnections defines the maximum number of connected peers (inbound and // outbound). MaxConnections uint16 `mapstructure:"max-connections"` @@ -750,11 +674,15 @@ type P2PConfig struct { //nolint: maligned // attempts per IP address. MaxIncomingConnectionAttempts uint `mapstructure:"max-incoming-connection-attempts"` - // List of node IDs, to which a connection will be (re)established ignoring any existing limits - UnconditionalPeerIDs string `mapstructure:"unconditional-peer-ids"` + // Set true to enable the peer-exchange reactor + PexReactor bool `mapstructure:"pex"` + + // Comma separated list of peer IDs to keep private (will not be gossiped to + // other peers) + PrivatePeerIDs string `mapstructure:"private-peer-ids"` - // Maximum pause when redialing a persistent peer (if zero, exponential backoff is used) - PersistentPeersMaxDialPeriod time.Duration `mapstructure:"persistent-peers-max-dial-period"` + // Toggle to disable guard against peers connecting from the same ip. + AllowDuplicateIP bool `mapstructure:"allow-duplicate-ip"` // Time to wait before flushing messages out on the connection FlushThrottleTimeout time.Duration `mapstructure:"flush-throttle-timeout"` @@ -768,16 +696,6 @@ type P2PConfig struct { //nolint: maligned // Rate at which packets can be received, in bytes/second RecvRate int64 `mapstructure:"recv-rate"` - // Set true to enable the peer-exchange reactor - PexReactor bool `mapstructure:"pex"` - - // Comma separated list of peer IDs to keep private (will not be gossiped to - // other peers) - PrivatePeerIDs string `mapstructure:"private-peer-ids"` - - // Toggle to disable guard against peers connecting from the same ip. - AllowDuplicateIP bool `mapstructure:"allow-duplicate-ip"` - // Peer connection configuration. HandshakeTimeout time.Duration `mapstructure:"handshake-timeout"` DialTimeout time.Duration `mapstructure:"dial-timeout"` @@ -786,13 +704,8 @@ type P2PConfig struct { //nolint: maligned // Force dial to fail TestDialFail bool `mapstructure:"test-dial-fail"` - // UseLegacy enables the "legacy" P2P implementation and - // disables the newer default implementation. This flag will - // be removed in a future release. - UseLegacy bool `mapstructure:"use-legacy"` - // Makes it possible to configure which queue backend the p2p - // layer uses. Options are: "fifo", "priority" and "wdrr", + // layer uses. Options are: "fifo" and "priority", // with the default being "priority". QueueType string `mapstructure:"queue-type"` } @@ -803,13 +716,8 @@ func DefaultP2PConfig() *P2PConfig { ListenAddress: "tcp://0.0.0.0:26656", ExternalAddress: "", UPNP: false, - AddrBook: defaultAddrBookPath, - AddrBookStrict: true, - MaxNumInboundPeers: 40, - MaxNumOutboundPeers: 10, MaxConnections: 64, MaxIncomingConnectionAttempts: 100, - PersistentPeersMaxDialPeriod: 0 * time.Second, FlushThrottleTimeout: 100 * time.Millisecond, // The MTU (Maximum Transmission Unit) for Ethernet is 1500 bytes. // The IP header and the TCP header take up 20 bytes each at least (unless @@ -825,39 +733,15 @@ func DefaultP2PConfig() *P2PConfig { DialTimeout: 3 * time.Second, TestDialFail: false, QueueType: "priority", - UseLegacy: false, } } -// TestP2PConfig returns a configuration for testing the peer-to-peer layer -func TestP2PConfig() *P2PConfig { - cfg := DefaultP2PConfig() - cfg.ListenAddress = "tcp://127.0.0.1:36656" - cfg.FlushThrottleTimeout = 10 * time.Millisecond - cfg.AllowDuplicateIP = true - return cfg -} - -// AddrBookFile returns the full path to the address book -func (cfg *P2PConfig) AddrBookFile() string { - return rootify(cfg.AddrBook, cfg.RootDir) -} - // ValidateBasic performs basic validation (checking param bounds, etc.) and // returns an error if any check fails. func (cfg *P2PConfig) ValidateBasic() error { - if cfg.MaxNumInboundPeers < 0 { - return errors.New("max-num-inbound-peers can't be negative") - } - if cfg.MaxNumOutboundPeers < 0 { - return errors.New("max-num-outbound-peers can't be negative") - } if cfg.FlushThrottleTimeout < 0 { return errors.New("flush-throttle-timeout can't be negative") } - if cfg.PersistentPeersMaxDialPeriod < 0 { - return errors.New("persistent-peers-max-dial-period can't be negative") - } if cfg.MaxPacketMsgPayloadSize < 0 { return errors.New("max-packet-msg-payload-size can't be negative") } @@ -870,12 +754,20 @@ func (cfg *P2PConfig) ValidateBasic() error { return nil } +// TestP2PConfig returns a configuration for testing the peer-to-peer layer +func TestP2PConfig() *P2PConfig { + cfg := DefaultP2PConfig() + cfg.ListenAddress = "tcp://127.0.0.1:36656" + cfg.AllowDuplicateIP = true + cfg.FlushThrottleTimeout = 10 * time.Millisecond + return cfg +} + //----------------------------------------------------------------------------- // MempoolConfig // MempoolConfig defines the configuration options for the Tendermint mempool. type MempoolConfig struct { - Version string `mapstructure:"version"` RootDir string `mapstructure:"home"` Recheck bool `mapstructure:"recheck"` Broadcast bool `mapstructure:"broadcast"` @@ -925,7 +817,6 @@ type MempoolConfig struct { // DefaultMempoolConfig returns a default configuration for the Tendermint mempool. func DefaultMempoolConfig() *MempoolConfig { return &MempoolConfig{ - Version: MempoolV1, Recheck: true, Broadcast: true, // Each signature verification takes .5ms, Size reduced until we implement @@ -1092,42 +983,6 @@ func (cfg *StateSyncConfig) ValidateBasic() error { return nil } -//----------------------------------------------------------------------------- - -// BlockSyncConfig (formerly known as FastSync) defines the configuration for the Tendermint block sync service -// If this node is many blocks behind the tip of the chain, BlockSync -// allows them to catchup quickly by downloading blocks in parallel -// and verifying their commits. -type BlockSyncConfig struct { - Enable bool `mapstructure:"enable"` - Version string `mapstructure:"version"` -} - -// DefaultBlockSyncConfig returns a default configuration for the block sync service -func DefaultBlockSyncConfig() *BlockSyncConfig { - return &BlockSyncConfig{ - Enable: true, - Version: BlockSyncV0, - } -} - -// TestBlockSyncConfig returns a default configuration for the block sync. -func TestBlockSyncConfig() *BlockSyncConfig { - return DefaultBlockSyncConfig() -} - -// ValidateBasic performs basic validation. -func (cfg *BlockSyncConfig) ValidateBasic() error { - switch cfg.Version { - case BlockSyncV0: - return nil - case BlockSyncV2: - return errors.New("blocksync version v2 is no longer supported. Please use v0") - default: - return fmt.Errorf("unknown blocksync version %s", cfg.Version) - } -} - //----------------------------------------------------------------------------- // ConsensusConfig @@ -1138,42 +993,22 @@ type ConsensusConfig struct { WalPath string `mapstructure:"wal-file"` walFile string // overrides WalPath if set - // TODO: remove timeout configs, these should be global not local - // How long we wait for a proposal block before prevoting nil - TimeoutPropose time.Duration `mapstructure:"timeout-propose"` - // How much timeout-propose increases with each round - TimeoutProposeDelta time.Duration `mapstructure:"timeout-propose-delta"` - // How long we wait after receiving +2/3 prevotes for “anything” (ie. not a single block or nil) - TimeoutPrevote time.Duration `mapstructure:"timeout-prevote"` - // How much the timeout-prevote increases with each round - TimeoutPrevoteDelta time.Duration `mapstructure:"timeout-prevote-delta"` - // How long we wait after receiving +2/3 precommits for “anything” (ie. not a single block or nil) - TimeoutPrecommit time.Duration `mapstructure:"timeout-precommit"` - // How much the timeout-precommit increases with each round - TimeoutPrecommitDelta time.Duration `mapstructure:"timeout-precommit-delta"` - // How long we wait after committing a block, before starting on the new - // height (this gives us a chance to receive some more precommits, even - // though we already have +2/3). - TimeoutCommit time.Duration `mapstructure:"timeout-commit"` + // EmptyBlocks mode and possible interval between empty blocks + CreateEmptyBlocks bool `mapstructure:"create-empty-blocks"` + CreateEmptyBlocksInterval time.Duration `mapstructure:"create-empty-blocks-interval"` + // CreateProofBlockRange determines how many past blocks are inspected in order to determine if we need to create + // additional proof block. + CreateProofBlockRange int64 `mapstructure:"create-proof-block-range"` // The proposed block time window is doubling of the value in twice // that means for 10 sec the window will be 20 sec, 10 sec before NOW and 10 sec after // this value is used to validate a block time ProposedBlockTimeWindow time.Duration `mapstructure:"proposed-block-time-window"` - // Make progress as soon as we have all the precommits (as if TimeoutCommit = 0) - SkipTimeoutCommit bool `mapstructure:"skip-timeout-commit"` // Don't propose a block if the node is set to the proposer, the block proposal instead // has to be manual (useful for tests) DontAutoPropose bool `mapstructure:"dont-auto-propose'"` - // EmptyBlocks mode and possible interval between empty blocks - CreateEmptyBlocks bool `mapstructure:"create-empty-blocks"` - CreateEmptyBlocksInterval time.Duration `mapstructure:"create-empty-blocks-interval"` - // CreateProofBlockRange determines how many past blocks are inspected in order to determine if we need to create - // additional proof block. - CreateProofBlockRange int64 `mapstructure:"create-proof-block-range"` - // Reactor sleep duration parameters PeerGossipSleepDuration time.Duration `mapstructure:"peer-gossip-sleep-duration"` PeerQueryMaj23SleepDuration time.Duration `mapstructure:"peer-query-maj23-sleep-duration"` @@ -1183,22 +1018,59 @@ type ConsensusConfig struct { QuorumType btcjson.LLMQType `mapstructure:"quorum-type"` AppHashSize int `mapstructure:"app-hash-size"` + + // TODO: The following fields are all temporary overrides that should exist only + // for the duration of the v0.36 release. The below fields should be completely + // removed in the v0.37 release of Tendermint. + // See: https://github.com/tendermint/tendermint/issues/8188 + + // UnsafeProposeTimeoutOverride provides an unsafe override of the Propose + // timeout consensus parameter. It configures how long the consensus engine + // will wait to receive a proposal block before prevoting nil. + UnsafeProposeTimeoutOverride time.Duration `mapstructure:"unsafe-propose-timeout-override"` + // UnsafeProposeTimeoutDeltaOverride provides an unsafe override of the + // ProposeDelta timeout consensus parameter. It configures how much the + // propose timeout increases with each round. + UnsafeProposeTimeoutDeltaOverride time.Duration `mapstructure:"unsafe-propose-timeout-delta-override"` + // UnsafeVoteTimeoutOverride provides an unsafe override of the Vote timeout + // consensus parameter. It configures how long the consensus engine will wait + // to gather additional votes after receiving +2/3 votes in a round. + UnsafeVoteTimeoutOverride time.Duration `mapstructure:"unsafe-vote-timeout-override"` + // UnsafeVoteTimeoutDeltaOverride provides an unsafe override of the VoteDelta + // timeout consensus parameter. It configures how much the vote timeout + // increases with each round. + UnsafeVoteTimeoutDeltaOverride time.Duration `mapstructure:"unsafe-vote-timeout-delta-override"` + // UnsafeCommitTimeoutOverride provides an unsafe override of the Commit timeout + // consensus parameter. It configures how long the consensus engine will wait + // after receiving +2/3 precommits before beginning the next height. + UnsafeCommitTimeoutOverride time.Duration `mapstructure:"unsafe-commit-timeout-override"` + + // UnsafeBypassCommitTimeoutOverride provides an unsafe override of the + // BypassCommitTimeout consensus parameter. It configures if the consensus + // engine will wait for the full Commit timeout before proceeding to the next height. + // If it is set to true, the consensus engine will proceed to the next height + // as soon as the node has gathered votes from all of the validators on the network. + UnsafeBypassCommitTimeoutOverride *bool `mapstructure:"unsafe-bypass-commit-timeout-override"` + + // Deprecated timeout parameters. These parameters are present in this struct + // so that they can be parsed so that validation can check if they have erroneously + // been included and provide a helpful error message. + // These fields should be completely removed in v0.37. + // See: https://github.com/tendermint/tendermint/issues/8188 + DeprecatedTimeoutPropose *interface{} `mapstructure:"timeout-propose"` + DeprecatedTimeoutProposeDelta *interface{} `mapstructure:"timeout-propose-delta"` + DeprecatedTimeoutPrevote *interface{} `mapstructure:"timeout-prevote"` + DeprecatedTimeoutPrevoteDelta *interface{} `mapstructure:"timeout-prevote-delta"` + DeprecatedTimeoutPrecommit *interface{} `mapstructure:"timeout-precommit"` + DeprecatedTimeoutPrecommitDelta *interface{} `mapstructure:"timeout-precommit-delta"` + DeprecatedTimeoutCommit *interface{} `mapstructure:"timeout-commit"` + DeprecatedSkipTimeoutCommit *interface{} `mapstructure:"skip-timeout-commit"` } // DefaultConsensusConfig returns a default configuration for the consensus service func DefaultConsensusConfig() *ConsensusConfig { return &ConsensusConfig{ WalPath: filepath.Join(defaultDataDir, "cs.wal", "wal"), - TimeoutPropose: 3000 * time.Millisecond, - TimeoutProposeDelta: 500 * time.Millisecond, - TimeoutPrevote: 1000 * time.Millisecond, - TimeoutPrevoteDelta: 500 * time.Millisecond, - TimeoutPrecommit: 1000 * time.Millisecond, - TimeoutPrecommitDelta: 500 * time.Millisecond, - TimeoutCommit: 1000 * time.Millisecond, - ProposedBlockTimeWindow: 10 * time.Second, - SkipTimeoutCommit: false, - DontAutoPropose: false, CreateEmptyBlocks: true, CreateEmptyBlocksInterval: 0 * time.Second, CreateProofBlockRange: 1, @@ -1207,21 +1079,14 @@ func DefaultConsensusConfig() *ConsensusConfig { DoubleSignCheckHeight: int64(0), AppHashSize: crypto.DefaultAppHashSize, QuorumType: btcjson.LLMQType_5_60, + ProposedBlockTimeWindow: 10 * time.Second, + DontAutoPropose: false, } } // TestConsensusConfig returns a configuration for testing the consensus service func TestConsensusConfig() *ConsensusConfig { cfg := DefaultConsensusConfig() - cfg.TimeoutPropose = 80 * time.Millisecond - cfg.TimeoutProposeDelta = 5 * time.Millisecond - cfg.TimeoutPrevote = 50 * time.Millisecond - cfg.TimeoutPrevoteDelta = 5 * time.Millisecond - cfg.TimeoutPrecommit = 50 * time.Millisecond - cfg.TimeoutPrecommitDelta = 5 * time.Millisecond - // NOTE: when modifying, make sure to update time_iota_ms (testGenesisFmt) in toml.go - cfg.TimeoutCommit = 10 * time.Millisecond - cfg.SkipTimeoutCommit = true cfg.PeerGossipSleepDuration = 5 * time.Millisecond cfg.PeerQueryMaj23SleepDuration = 250 * time.Millisecond cfg.DoubleSignCheckHeight = int64(0) @@ -1235,33 +1100,6 @@ func (cfg *ConsensusConfig) WaitForTxs() bool { return !cfg.CreateEmptyBlocks || cfg.CreateEmptyBlocksInterval > 0 } -// Propose returns the amount of time to wait for a proposal -func (cfg *ConsensusConfig) Propose(round int32) time.Duration { - return time.Duration( - cfg.TimeoutPropose.Nanoseconds()+cfg.TimeoutProposeDelta.Nanoseconds()*int64(round), - ) * time.Nanosecond -} - -// Prevote returns the amount of time to wait for straggler votes after receiving any +2/3 prevotes -func (cfg *ConsensusConfig) Prevote(round int32) time.Duration { - return time.Duration( - cfg.TimeoutPrevote.Nanoseconds()+cfg.TimeoutPrevoteDelta.Nanoseconds()*int64(round), - ) * time.Nanosecond -} - -// Precommit returns the amount of time to wait for straggler votes after receiving any +2/3 precommits -func (cfg *ConsensusConfig) Precommit(round int32) time.Duration { - return time.Duration( - cfg.TimeoutPrecommit.Nanoseconds()+cfg.TimeoutPrecommitDelta.Nanoseconds()*int64(round), - ) * time.Nanosecond -} - -// Commit returns the amount of time to wait for straggler votes after receiving +2/3 precommits -// for a single block (ie. a commit). -func (cfg *ConsensusConfig) Commit(t time.Time) time.Time { - return t.Add(cfg.TimeoutCommit) -} - // WalFile returns the full path to the write-ahead log file func (cfg *ConsensusConfig) WalFile() string { if cfg.walFile != "" { @@ -1278,26 +1116,20 @@ func (cfg *ConsensusConfig) SetWalFile(walFile string) { // ValidateBasic performs basic validation (checking param bounds, etc.) and // returns an error if any check fails. func (cfg *ConsensusConfig) ValidateBasic() error { - if cfg.TimeoutPropose < 0 { - return errors.New("timeout-propose can't be negative") + if cfg.UnsafeProposeTimeoutOverride < 0 { + return errors.New("unsafe-propose-timeout-override can't be negative") } - if cfg.TimeoutProposeDelta < 0 { - return errors.New("timeout-propose-delta can't be negative") + if cfg.UnsafeProposeTimeoutDeltaOverride < 0 { + return errors.New("unsafe-propose-timeout-delta-override can't be negative") } - if cfg.TimeoutPrevote < 0 { - return errors.New("timeout-prevote can't be negative") + if cfg.UnsafeVoteTimeoutOverride < 0 { + return errors.New("unsafe-vote-timeout-override can't be negative") } - if cfg.TimeoutPrevoteDelta < 0 { - return errors.New("timeout-prevote-delta can't be negative") + if cfg.UnsafeVoteTimeoutDeltaOverride < 0 { + return errors.New("unsafe-vote-timeout-delta-override can't be negative") } - if cfg.TimeoutPrecommit < 0 { - return errors.New("timeout-precommit can't be negative") - } - if cfg.TimeoutPrecommitDelta < 0 { - return errors.New("timeout-precommit-delta can't be negative") - } - if cfg.TimeoutCommit < 0 { - return errors.New("timeout-commit can't be negative") + if cfg.UnsafeCommitTimeoutOverride < 0 { + return errors.New("unsafe-commit-timeout-override can't be negative") } if cfg.ProposedBlockTimeWindow < 0 { return errors.New("proposed-block-time can't be negative") @@ -1320,6 +1152,41 @@ func (cfg *ConsensusConfig) ValidateBasic() error { return nil } +func (cfg *ConsensusConfig) DeprecatedFieldWarning() error { + var fields []string + if cfg.DeprecatedSkipTimeoutCommit != nil { + fields = append(fields, "skip-timeout-commit") + } + if cfg.DeprecatedTimeoutPropose != nil { + fields = append(fields, "timeout-propose") + } + if cfg.DeprecatedTimeoutProposeDelta != nil { + fields = append(fields, "timeout-propose-delta") + } + if cfg.DeprecatedTimeoutPrevote != nil { + fields = append(fields, "timeout-prevote") + } + if cfg.DeprecatedTimeoutPrevoteDelta != nil { + fields = append(fields, "timeout-prevote-delta") + } + if cfg.DeprecatedTimeoutPrecommit != nil { + fields = append(fields, "timeout-precommit") + } + if cfg.DeprecatedTimeoutPrecommitDelta != nil { + fields = append(fields, "timeout-precommit-delta") + } + if cfg.DeprecatedTimeoutCommit != nil { + fields = append(fields, "timeout-commit") + } + if len(fields) != 0 { + return fmt.Errorf("the following deprecated fields were set in the "+ + "configuration file: %s. These fields were removed in v0.36. Timeout "+ + "configuration has been moved to the ConsensusParams. For more information see "+ + "https://tinyurl.com/adr074", strings.Join(fields, ", ")) + } + return nil +} + //----------------------------------------------------------------------------- // TxIndexConfig // Remember that Event has the following structure: @@ -1336,9 +1203,8 @@ type TxIndexConfig struct { // If list contains `null`, meaning no indexer service will be used. // // Options: - // 1) "null" - no indexer services. - // 2) "kv" (default) - the simplest possible indexer, - // backed by key-value storage (defaults to levelDB; see DBBackend). + // 1) "null" (default) - no indexer services. + // 2) "kv" - a simple indexer backed by key-value storage (see DBBackend) // 3) "psql" - the indexer services backed by PostgreSQL. Indexer []string `mapstructure:"indexer"` @@ -1349,14 +1215,12 @@ type TxIndexConfig struct { // DefaultTxIndexConfig returns a default configuration for the transaction indexer. func DefaultTxIndexConfig() *TxIndexConfig { - return &TxIndexConfig{ - Indexer: []string{"kv"}, - } + return &TxIndexConfig{Indexer: []string{"null"}} } // TestTxIndexConfig returns a default configuration for the transaction indexer. func TestTxIndexConfig() *TxIndexConfig { - return DefaultTxIndexConfig() + return &TxIndexConfig{Indexer: []string{"kv"}} } //----------------------------------------------------------------------------- diff --git a/config/config_test.go b/config/config_test.go index aa536dd61f..a86ab84636 100644 --- a/config/config_test.go +++ b/config/config_test.go @@ -10,46 +10,43 @@ import ( ) func TestDefaultConfig(t *testing.T) { - assert := assert.New(t) - // set up some defaults cfg := DefaultConfig() - assert.NotNil(cfg.P2P) - assert.NotNil(cfg.Mempool) - assert.NotNil(cfg.Consensus) + assert.NotNil(t, cfg.P2P) + assert.NotNil(t, cfg.Mempool) + assert.NotNil(t, cfg.Consensus) // check the root dir stuff... cfg.SetRoot("/foo") cfg.Genesis = "bar" cfg.DBPath = "/opt/data" - assert.Equal("/foo/bar", cfg.GenesisFile()) - assert.Equal("/opt/data", cfg.DBDir()) + assert.Equal(t, "/foo/bar", cfg.GenesisFile()) + assert.Equal(t, "/opt/data", cfg.DBDir()) } func TestConfigValidateBasic(t *testing.T) { cfg := DefaultConfig() assert.NoError(t, cfg.ValidateBasic()) - // tamper with timeout_propose - cfg.Consensus.TimeoutPropose = -10 * time.Second + // tamper with unsafe-propose-timeout-override + cfg.Consensus.UnsafeProposeTimeoutOverride = -10 * time.Second assert.Error(t, cfg.ValidateBasic()) } func TestTLSConfiguration(t *testing.T) { - assert := assert.New(t) cfg := DefaultConfig() cfg.SetRoot("/home/user") cfg.RPC.TLSCertFile = "file.crt" - assert.Equal("/home/user/config/file.crt", cfg.RPC.CertFile()) + assert.Equal(t, "/home/user/config/file.crt", cfg.RPC.CertFile()) cfg.RPC.TLSKeyFile = "file.key" - assert.Equal("/home/user/config/file.key", cfg.RPC.KeyFile()) + assert.Equal(t, "/home/user/config/file.key", cfg.RPC.KeyFile()) cfg.RPC.TLSCertFile = "/abs/path/to/file.crt" - assert.Equal("/abs/path/to/file.crt", cfg.RPC.CertFile()) + assert.Equal(t, "/abs/path/to/file.crt", cfg.RPC.CertFile()) cfg.RPC.TLSKeyFile = "/abs/path/to/file.key" - assert.Equal("/abs/path/to/file.key", cfg.RPC.KeyFile()) + assert.Equal(t, "/abs/path/to/file.key", cfg.RPC.KeyFile()) } func TestBaseConfigValidateBasic(t *testing.T) { @@ -66,7 +63,6 @@ func TestRPCConfigValidateBasic(t *testing.T) { assert.NoError(t, cfg.ValidateBasic()) fieldsToTest := []string{ - "GRPCMaxOpenConnections", "MaxOpenConnections", "MaxSubscriptionClients", "MaxSubscriptionsPerClient", @@ -82,26 +78,6 @@ func TestRPCConfigValidateBasic(t *testing.T) { } } -func TestP2PConfigValidateBasic(t *testing.T) { - cfg := TestP2PConfig() - assert.NoError(t, cfg.ValidateBasic()) - - fieldsToTest := []string{ - "MaxNumInboundPeers", - "MaxNumOutboundPeers", - "FlushThrottleTimeout", - "MaxPacketMsgPayloadSize", - "SendRate", - "RecvRate", - } - - for _, fieldName := range fieldsToTest { - reflect.ValueOf(cfg).Elem().FieldByName(fieldName).SetInt(-1) - assert.Error(t, cfg.ValidateBasic()) - reflect.ValueOf(cfg).Elem().FieldByName(fieldName).SetInt(0) - } -} - func TestMempoolConfigValidateBasic(t *testing.T) { cfg := TestMempoolConfig() assert.NoError(t, cfg.ValidateBasic()) @@ -125,42 +101,26 @@ func TestStateSyncConfigValidateBasic(t *testing.T) { require.NoError(t, cfg.ValidateBasic()) } -func TestBlockSyncConfigValidateBasic(t *testing.T) { - cfg := TestBlockSyncConfig() - assert.NoError(t, cfg.ValidateBasic()) - - // tamper with version - cfg.Version = "v2" - assert.Error(t, cfg.ValidateBasic()) - - cfg.Version = "invalid" - assert.Error(t, cfg.ValidateBasic()) -} - func TestConsensusConfig_ValidateBasic(t *testing.T) { testcases := map[string]struct { modify func(*ConsensusConfig) expectErr bool }{ - "TimeoutPropose": {func(c *ConsensusConfig) { c.TimeoutPropose = time.Second }, false}, - "TimeoutPropose negative": {func(c *ConsensusConfig) { c.TimeoutPropose = -1 }, true}, - "TimeoutProposeDelta": {func(c *ConsensusConfig) { c.TimeoutProposeDelta = time.Second }, false}, - "TimeoutProposeDelta negative": {func(c *ConsensusConfig) { c.TimeoutProposeDelta = -1 }, true}, - "TimeoutPrevote": {func(c *ConsensusConfig) { c.TimeoutPrevote = time.Second }, false}, - "TimeoutPrevote negative": {func(c *ConsensusConfig) { c.TimeoutPrevote = -1 }, true}, - "TimeoutPrevoteDelta": {func(c *ConsensusConfig) { c.TimeoutPrevoteDelta = time.Second }, false}, - "TimeoutPrevoteDelta negative": {func(c *ConsensusConfig) { c.TimeoutPrevoteDelta = -1 }, true}, - "TimeoutPrecommit": {func(c *ConsensusConfig) { c.TimeoutPrecommit = time.Second }, false}, - "TimeoutPrecommit negative": {func(c *ConsensusConfig) { c.TimeoutPrecommit = -1 }, true}, - "TimeoutPrecommitDelta": {func(c *ConsensusConfig) { c.TimeoutPrecommitDelta = time.Second }, false}, - "TimeoutPrecommitDelta negative": {func(c *ConsensusConfig) { c.TimeoutPrecommitDelta = -1 }, true}, - "TimeoutCommit": {func(c *ConsensusConfig) { c.TimeoutCommit = time.Second }, false}, - "TimeoutCommit negative": {func(c *ConsensusConfig) { c.TimeoutCommit = -1 }, true}, - "PeerGossipSleepDuration": {func(c *ConsensusConfig) { c.PeerGossipSleepDuration = time.Second }, false}, - "PeerGossipSleepDuration negative": {func(c *ConsensusConfig) { c.PeerGossipSleepDuration = -1 }, true}, - "PeerQueryMaj23SleepDuration": {func(c *ConsensusConfig) { c.PeerQueryMaj23SleepDuration = time.Second }, false}, - "PeerQueryMaj23SleepDuration negative": {func(c *ConsensusConfig) { c.PeerQueryMaj23SleepDuration = -1 }, true}, - "DoubleSignCheckHeight negative": {func(c *ConsensusConfig) { c.DoubleSignCheckHeight = -1 }, true}, + "UnsafeProposeTimeoutOverride": {func(c *ConsensusConfig) { c.UnsafeProposeTimeoutOverride = time.Second }, false}, + "UnsafeProposeTimeoutOverride negative": {func(c *ConsensusConfig) { c.UnsafeProposeTimeoutOverride = -1 }, true}, + "UnsafeProposeTimeoutDeltaOverride": {func(c *ConsensusConfig) { c.UnsafeProposeTimeoutDeltaOverride = time.Second }, false}, + "UnsafeProposeTimeoutDeltaOverride negative": {func(c *ConsensusConfig) { c.UnsafeProposeTimeoutDeltaOverride = -1 }, true}, + "UnsafePrevoteTimeoutOverride": {func(c *ConsensusConfig) { c.UnsafeVoteTimeoutOverride = time.Second }, false}, + "UnsafePrevoteTimeoutOverride negative": {func(c *ConsensusConfig) { c.UnsafeVoteTimeoutOverride = -1 }, true}, + "UnsafePrevoteTimeoutDeltaOverride": {func(c *ConsensusConfig) { c.UnsafeVoteTimeoutDeltaOverride = time.Second }, false}, + "UnsafePrevoteTimeoutDeltaOverride negative": {func(c *ConsensusConfig) { c.UnsafeVoteTimeoutDeltaOverride = -1 }, true}, + "UnsafeCommitTimeoutOverride": {func(c *ConsensusConfig) { c.UnsafeCommitTimeoutOverride = time.Second }, false}, + "UnsafeCommitTimeoutOverride negative": {func(c *ConsensusConfig) { c.UnsafeCommitTimeoutOverride = -1 }, true}, + "PeerGossipSleepDuration": {func(c *ConsensusConfig) { c.PeerGossipSleepDuration = time.Second }, false}, + "PeerGossipSleepDuration negative": {func(c *ConsensusConfig) { c.PeerGossipSleepDuration = -1 }, true}, + "PeerQueryMaj23SleepDuration": {func(c *ConsensusConfig) { c.PeerQueryMaj23SleepDuration = time.Second }, false}, + "PeerQueryMaj23SleepDuration negative": {func(c *ConsensusConfig) { c.PeerQueryMaj23SleepDuration = -1 }, true}, + "DoubleSignCheckHeight negative": {func(c *ConsensusConfig) { c.DoubleSignCheckHeight = -1 }, true}, } for desc, tc := range testcases { tc := tc // appease linter @@ -186,3 +146,21 @@ func TestInstrumentationConfigValidateBasic(t *testing.T) { cfg.MaxOpenConnections = -1 assert.Error(t, cfg.ValidateBasic()) } + +func TestP2PConfigValidateBasic(t *testing.T) { + cfg := TestP2PConfig() + assert.NoError(t, cfg.ValidateBasic()) + + fieldsToTest := []string{ + "FlushThrottleTimeout", + "MaxPacketMsgPayloadSize", + "SendRate", + "RecvRate", + } + + for _, fieldName := range fieldsToTest { + reflect.ValueOf(cfg).Elem().FieldByName(fieldName).SetInt(-1) + assert.Error(t, cfg.ValidateBasic()) + reflect.ValueOf(cfg).Elem().FieldByName(fieldName).SetInt(0) + } +} diff --git a/config/db.go b/config/db.go index 8f489a87aa..f508354e07 100644 --- a/config/db.go +++ b/config/db.go @@ -1,6 +1,8 @@ package config import ( + "context" + dbm "github.com/tendermint/tm-db" "github.com/tendermint/tendermint/libs/log" @@ -8,7 +10,7 @@ import ( ) // ServiceProvider takes a config and a logger and returns a ready to go Node. -type ServiceProvider func(*Config, log.Logger) (service.Service, error) +type ServiceProvider func(context.Context, *Config, log.Logger) (service.Service, error) // DBContext specifies config information for loading a new DB. type DBContext struct { diff --git a/config/toml.go b/config/toml.go index d5b432a7c6..ee5df22f6a 100644 --- a/config/toml.go +++ b/config/toml.go @@ -3,17 +3,17 @@ package config import ( "bytes" "fmt" - "io/ioutil" "os" "path/filepath" "strings" "text/template" tmos "github.com/tendermint/tendermint/libs/os" + tmrand "github.com/tendermint/tendermint/libs/rand" ) -// DefaultDirPerm is the default permissions used when creating directories. -const DefaultDirPerm = 0700 +// defaultDirPerm is the default permissions used when creating directories. +const defaultDirPerm = 0700 var configTemplate *template.Template @@ -32,13 +32,13 @@ func init() { // EnsureRoot creates the root, config, and data directories if they don't exist, // and panics if it fails. func EnsureRoot(rootDir string) { - if err := tmos.EnsureDir(rootDir, DefaultDirPerm); err != nil { + if err := tmos.EnsureDir(rootDir, defaultDirPerm); err != nil { panic(err.Error()) } - if err := tmos.EnsureDir(filepath.Join(rootDir, defaultConfigDir), DefaultDirPerm); err != nil { + if err := tmos.EnsureDir(filepath.Join(rootDir, defaultConfigDir), defaultDirPerm); err != nil { panic(err.Error()) } - if err := tmos.EnsureDir(filepath.Join(rootDir, defaultDataDir), DefaultDirPerm); err != nil { + if err := tmos.EnsureDir(filepath.Join(rootDir, defaultDataDir), defaultDirPerm); err != nil { panic(err.Error()) } } @@ -209,26 +209,10 @@ cors-allowed-methods = [{{ range .RPC.CORSAllowedMethods }}{{ printf "%q, " . }} # A list of non simple headers the client is allowed to use with cross-domain requests cors-allowed-headers = [{{ range .RPC.CORSAllowedHeaders }}{{ printf "%q, " . }}{{end}}] -# TCP or UNIX socket address for the gRPC server to listen on -# NOTE: This server only supports /broadcast_tx_commit -# Deprecated gRPC in the RPC layer of Tendermint will be deprecated in 0.36. -grpc-laddr = "{{ .RPC.GRPCListenAddress }}" - -# Maximum number of simultaneous connections. -# Does not include RPC (HTTP&WebSocket) connections. See max-open-connections -# If you want to accept a larger number than the default, make sure -# you increase your OS limits. -# 0 - unlimited. -# Should be < {ulimit -Sn} - {MaxNumInboundPeers} - {MaxNumOutboundPeers} - {N of wal, db and other open files} -# 1024 - 40 - 10 - 50 = 924 = ~900 -# Deprecated gRPC in the RPC layer of Tendermint will be deprecated in 0.36. -grpc-max-open-connections = {{ .RPC.GRPCMaxOpenConnections }} - # Activate unsafe RPC commands like /dial-seeds and /unsafe-flush-mempool unsafe = {{ .RPC.Unsafe }} # Maximum number of simultaneous connections (including WebSocket). -# Does not include gRPC connections. See grpc-max-open-connections # If you want to accept a larger number than the default, make sure # you increase your OS limits. # 0 - unlimited. @@ -242,36 +226,36 @@ max-open-connections = {{ .RPC.MaxOpenConnections }} max-subscription-clients = {{ .RPC.MaxSubscriptionClients }} # Maximum number of unique queries a given client can /subscribe to -# If you're using GRPC (or Local RPC client) and /broadcast_tx_commit, set to -# the estimated # maximum number of broadcast_tx_commit calls per block. +# If you're using a Local RPC client and /broadcast_tx_commit, set this +# to the estimated maximum number of broadcast_tx_commit calls per block. max-subscriptions-per-client = {{ .RPC.MaxSubscriptionsPerClient }} -# Experimental parameter to specify the maximum number of events a node will -# buffer, per subscription, before returning an error and closing the -# subscription. Must be set to at least 100, but higher values will accommodate -# higher event throughput rates (and will use more memory). -experimental-subscription-buffer-size = {{ .RPC.SubscriptionBufferSize }} - -# Experimental parameter to specify the maximum number of RPC responses that -# can be buffered per WebSocket client. If clients cannot read from the -# WebSocket endpoint fast enough, they will be disconnected, so increasing this -# parameter may reduce the chances of them being disconnected (but will cause -# the node to use more memory). +# If true, disable the websocket interface to the RPC service. This has +# the effect of disabling the /subscribe, /unsubscribe, and /unsubscribe_all +# methods for event subscription. # -# Must be at least the same as "experimental-subscription-buffer-size", -# otherwise connections could be dropped unnecessarily. This value should -# ideally be somewhat higher than "experimental-subscription-buffer-size" to -# accommodate non-subscription-related RPC responses. -experimental-websocket-write-buffer-size = {{ .RPC.WebSocketWriteBufferSize }} - -# If a WebSocket client cannot read fast enough, at present we may -# silently drop events instead of generating an error or disconnecting the -# client. +# EXPERIMENTAL: This setting will be removed in Tendermint v0.37. +experimental-disable-websocket = {{ .RPC.ExperimentalDisableWebsocket }} + +# The time window size for the event log. All events up to this long before +# the latest (up to EventLogMaxItems) will be available for subscribers to +# fetch via the /events method. If 0 (the default) the event log and the +# /events RPC method are disabled. +event-log-window-size = "{{ .RPC.EventLogWindowSize }}" + +# The maxiumum number of events that may be retained by the event log. If +# this value is 0, no upper limit is set. Otherwise, items in excess of +# this number will be discarded from the event log. # -# Enabling this experimental parameter will cause the WebSocket connection to -# be closed instead if it cannot read fast enough, allowing for greater -# predictability in subscription behavior. -experimental-close-on-slow-client = {{ .RPC.CloseOnSlowClient }} +# Warning: This setting is a safety valve. Setting it too low may cause +# subscribers to miss events. Try to choose a value higher than the +# maximum worst-case expected event load within the chosen window size in +# ordinary operation. +# +# For example, if the window size is 10 minutes and the node typically +# averages 1000 events per ten minutes, but with occasional known spikes of +# up to 2000, choose a value > 2000. +event-log-max-items = {{ .RPC.EventLogMaxItems }} # How long to wait for a tx to be committed during /broadcast_tx_commit. # WARNING: Using a value larger than 10s will result in increasing the @@ -308,9 +292,6 @@ pprof-laddr = "{{ .RPC.PprofListenAddress }}" ####################################################### [p2p] -# Enable the legacy p2p layer. -use-legacy = {{ .P2P.UseLegacy }} - # Select the p2p internal queue queue-type = "{{ .P2P.QueueType }}" @@ -342,86 +323,48 @@ persistent-peers = "{{ .P2P.PersistentPeers }}" # UPNP port forwarding upnp = {{ .P2P.UPNP }} -# Path to address book -# TODO: Remove once p2p refactor is complete in favor of peer store. -addr-book-file = "{{ js .P2P.AddrBook }}" - -# Set true for strict address routability rules -# Set false for private or local networks -addr-book-strict = {{ .P2P.AddrBookStrict }} - -# Maximum number of inbound peers -# -# TODO: Remove once p2p refactor is complete in favor of MaxConnections. -# ref: https://github.com/tendermint/tendermint/issues/5670 -max-num-inbound-peers = {{ .P2P.MaxNumInboundPeers }} - -# Maximum number of outbound peers to connect to, excluding persistent peers -# -# TODO: Remove once p2p refactor is complete in favor of MaxConnections. -# ref: https://github.com/tendermint/tendermint/issues/5670 -max-num-outbound-peers = {{ .P2P.MaxNumOutboundPeers }} - # Maximum number of connections (inbound and outbound). max-connections = {{ .P2P.MaxConnections }} # Rate limits the number of incoming connection attempts per IP address. max-incoming-connection-attempts = {{ .P2P.MaxIncomingConnectionAttempts }} -# List of node IDs, to which a connection will be (re)established ignoring any existing limits -# TODO: Remove once p2p refactor is complete. -# ref: https://github.com/tendermint/tendermint/issues/5670 -unconditional-peer-ids = "{{ .P2P.UnconditionalPeerIDs }}" +# Set true to enable the peer-exchange reactor +pex = {{ .P2P.PexReactor }} -# Maximum pause when redialing a persistent peer (if zero, exponential backoff is used) -# TODO: Remove once p2p refactor is complete -# ref: https:#github.com/tendermint/tendermint/issues/5670 -persistent-peers-max-dial-period = "{{ .P2P.PersistentPeersMaxDialPeriod }}" +# Comma separated list of peer IDs to keep private (will not be gossiped to other peers) +# Warning: IPs will be exposed at /net_info, for more information https://github.com/tendermint/tendermint/issues/3055 +private-peer-ids = "{{ .P2P.PrivatePeerIDs }}" + +# Toggle to disable guard against peers connecting from the same ip. +allow-duplicate-ip = {{ .P2P.AllowDuplicateIP }} + +# Peer connection configuration. +handshake-timeout = "{{ .P2P.HandshakeTimeout }}" +dial-timeout = "{{ .P2P.DialTimeout }}" # Time to wait before flushing messages out on the connection -# TODO: Remove once p2p refactor is complete -# ref: https:#github.com/tendermint/tendermint/issues/5670 +# TODO: Remove once MConnConnection is removed. flush-throttle-timeout = "{{ .P2P.FlushThrottleTimeout }}" # Maximum size of a message packet payload, in bytes -# TODO: Remove once p2p refactor is complete -# ref: https:#github.com/tendermint/tendermint/issues/5670 +# TODO: Remove once MConnConnection is removed. max-packet-msg-payload-size = {{ .P2P.MaxPacketMsgPayloadSize }} # Rate at which packets can be sent, in bytes/second -# TODO: Remove once p2p refactor is complete -# ref: https:#github.com/tendermint/tendermint/issues/5670 +# TODO: Remove once MConnConnection is removed. send-rate = {{ .P2P.SendRate }} # Rate at which packets can be received, in bytes/second -# TODO: Remove once p2p refactor is complete -# ref: https:#github.com/tendermint/tendermint/issues/5670 +# TODO: Remove once MConnConnection is removed. recv-rate = {{ .P2P.RecvRate }} -# Set true to enable the peer-exchange reactor -pex = {{ .P2P.PexReactor }} - -# Comma separated list of peer IDs to keep private (will not be gossiped to other peers) -# Warning: IPs will be exposed at /net_info, for more information https://github.com/tendermint/tendermint/issues/3055 -private-peer-ids = "{{ .P2P.PrivatePeerIDs }}" - -# Toggle to disable guard against peers connecting from the same ip. -allow-duplicate-ip = {{ .P2P.AllowDuplicateIP }} - -# Peer connection configuration. -handshake-timeout = "{{ .P2P.HandshakeTimeout }}" -dial-timeout = "{{ .P2P.DialTimeout }}" ####################################################### ### Mempool Configuration Option ### ####################################################### [mempool] -# Mempool version to use: -# 1) "v0" - The legacy non-prioritized mempool reactor. -# 2) "v1" (default) - The prioritized mempool reactor. -version = "{{ .Mempool.Version }}" - recheck = {{ .Mempool.Recheck }} broadcast = {{ .Mempool.Broadcast }} @@ -510,21 +453,6 @@ chunk-request-timeout = "{{ .StateSync.ChunkRequestTimeout }}" # The number of concurrent chunk and block fetchers to run (default: 4). fetchers = "{{ .StateSync.Fetchers }}" -####################################################### -### Block Sync Configuration Connections ### -####################################################### -[blocksync] - -# If this node is many blocks behind the tip of the chain, BlockSync -# allows them to catchup quickly by downloading blocks in parallel -# and verifying their commits -enable = {{ .BlockSync.Enable }} - -# Block Sync version to use: -# 1) "v0" (default) - the standard Block Sync implementation -# 2) "v2" - DEPRECATED, please use v0 -version = "{{ .BlockSync.Version }}" - ####################################################### ### Consensus Configuration Options ### ####################################################### @@ -532,22 +460,6 @@ version = "{{ .BlockSync.Version }}" wal-file = "{{ js .Consensus.WalPath }}" -# How long we wait for a proposal block before prevoting nil -timeout-propose = "{{ .Consensus.TimeoutPropose }}" -# How much timeout-propose increases with each round -timeout-propose-delta = "{{ .Consensus.TimeoutProposeDelta }}" -# How long we wait after receiving +2/3 prevotes for “anything” (ie. not a single block or nil) -timeout-prevote = "{{ .Consensus.TimeoutPrevote }}" -# How much the timeout-prevote increases with each round -timeout-prevote-delta = "{{ .Consensus.TimeoutPrevoteDelta }}" -# How long we wait after receiving +2/3 precommits for “anything” (ie. not a single block or nil) -timeout-precommit = "{{ .Consensus.TimeoutPrecommit }}" -# How much the timeout-precommit increases with each round -timeout-precommit-delta = "{{ .Consensus.TimeoutPrecommitDelta }}" -# How long we wait after committing a block, before starting on the new -# height (this gives us a chance to receive some more precommits, even -# though we already have +2/3). -timeout-commit = "{{ .Consensus.TimeoutCommit }}" # How long is the window for the min proposed block time proposed-block-time-window = "{{ .Consensus.ProposedBlockTimeWindow }}" @@ -557,9 +469,6 @@ proposed-block-time-window = "{{ .Consensus.ProposedBlockTimeWindow }}" # So, validators should stop the state machine, wait for some blocks, and then restart the state machine to avoid panic. double-sign-check-height = {{ .Consensus.DoubleSignCheckHeight }} -# Make progress as soon as we have all the precommits (as if TimeoutCommit = 0) -skip-timeout-commit = {{ .Consensus.SkipTimeoutCommit }} - # EmptyBlocks mode and possible interval between empty blocks create-empty-blocks = {{ .Consensus.CreateEmptyBlocks }} create-empty-blocks-interval = "{{ .Consensus.CreateEmptyBlocksInterval }}" @@ -571,6 +480,50 @@ create-proof-block-range = "{{ .Consensus.CreateProofBlockRange }}" peer-gossip-sleep-duration = "{{ .Consensus.PeerGossipSleepDuration }}" peer-query-maj23-sleep-duration = "{{ .Consensus.PeerQueryMaj23SleepDuration }}" +### Unsafe Timeout Overrides ### + +# These fields provide temporary overrides for the Timeout consensus parameters. +# Use of these parameters is strongly discouraged. Using these parameters may have serious +# liveness implications for the validator and for the chain. +# +# These fields will be removed from the configuration file in the v0.37 release of Tendermint. +# For additional information, see ADR-74: +# https://github.com/tendermint/tendermint/blob/master/docs/architecture/adr-074-timeout-params.md + +# This field provides an unsafe override of the Propose timeout consensus parameter. +# This field configures how long the consensus engine will wait for a proposal block before prevoting nil. +# If this field is set to a value greater than 0, it will take effect. +# unsafe-propose-timeout-override = {{ .Consensus.UnsafeProposeTimeoutOverride }} + +# This field provides an unsafe override of the ProposeDelta timeout consensus parameter. +# This field configures how much the propose timeout increases with each round. +# If this field is set to a value greater than 0, it will take effect. +# unsafe-propose-timeout-delta-override = {{ .Consensus.UnsafeProposeTimeoutDeltaOverride }} + +# This field provides an unsafe override of the Vote timeout consensus parameter. +# This field configures how long the consensus engine will wait after +# receiving +2/3 votes in a round. +# If this field is set to a value greater than 0, it will take effect. +# unsafe-vote-timeout-override = {{ .Consensus.UnsafeVoteTimeoutOverride }} + +# This field provides an unsafe override of the VoteDelta timeout consensus parameter. +# This field configures how much the vote timeout increases with each round. +# If this field is set to a value greater than 0, it will take effect. +# unsafe-vote-timeout-delta-override = {{ .Consensus.UnsafeVoteTimeoutDeltaOverride }} + +# This field provides an unsafe override of the Commit timeout consensus parameter. +# This field configures how long the consensus engine will wait after receiving +# +2/3 precommits before beginning the next height. +# If this field is set to a value greater than 0, it will take effect. +# unsafe-commit-timeout-override = {{ .Consensus.UnsafeCommitTimeoutOverride }} + +# This field provides an unsafe override of the BypassCommitTimeout consensus parameter. +# This field configures if the consensus engine will wait for the full Commit timeout +# before proceeding to the next height. +# If this field is set to true, the consensus engine will proceed to the next height +# as soon as the node has gathered votes from all of the validators on the network. +# unsafe-bypass-commit-timeout-override = + # Signing parameters quorum-type = "{{ .Consensus.QuorumType }}" @@ -589,8 +542,8 @@ app-hash-size = "{{ .Consensus.AppHashSize }}" # to decide which txs to index based on configuration set in the application. # # Options: -# 1) "null" -# 2) "kv" (default) - the simplest possible indexer, backed by key-value storage (defaults to levelDB; see DBBackend). +# 1) "null" (default) - no indexer services. +# 2) "kv" - a simple indexer backed by key-value storage (see DBBackend) # 3) "psql" - the indexer services backed by PostgreSQL. # When "kv" or "psql" is chosen "tx.height" and "tx.hash" will always be indexed. indexer = [{{ range $i, $e := .TxIndex.Indexer }}{{if $i}}, {{end}}{{ printf "%q" $e}}{{end}}] @@ -624,21 +577,21 @@ namespace = "{{ .Instrumentation.Namespace }}" /****** these are for test settings ***********/ -func ResetTestRoot(testName string) (*Config, error) { - return ResetTestRootWithChainID(testName, "") +func ResetTestRoot(dir, testName string) (*Config, error) { + return ResetTestRootWithChainID(dir, testName, "") } -func ResetTestRootWithChainID(testName string, chainID string) (*Config, error) { +func ResetTestRootWithChainID(dir, testName string, chainID string) (*Config, error) { // create a unique, concurrency-safe test directory under os.TempDir() - rootDir, err := ioutil.TempDir("", fmt.Sprintf("%s-%s_", chainID, testName)) + rootDir, err := os.MkdirTemp(dir, fmt.Sprintf("%s-%s_", chainID, testName)) if err != nil { return nil, err } // ensure config and data subdirs are created - if err := tmos.EnsureDir(filepath.Join(rootDir, defaultConfigDir), DefaultDirPerm); err != nil { + if err := tmos.EnsureDir(filepath.Join(rootDir, defaultConfigDir), defaultDirPerm); err != nil { return nil, err } - if err := tmos.EnsureDir(filepath.Join(rootDir, defaultDataDir), DefaultDirPerm); err != nil { + if err := tmos.EnsureDir(filepath.Join(rootDir, defaultDataDir), defaultDirPerm); err != nil { return nil, err } @@ -670,17 +623,18 @@ func ResetTestRootWithChainID(testName string, chainID string) (*Config, error) } config := TestConfig().SetRoot(rootDir) + config.Instrumentation.Namespace = fmt.Sprintf("%s_%s_%s", testName, chainID, tmrand.Str(16)) return config, nil } func writeFile(filePath string, contents []byte, mode os.FileMode) error { - if err := ioutil.WriteFile(filePath, contents, mode); err != nil { + if err := os.WriteFile(filePath, contents, mode); err != nil { return fmt.Errorf("failed to write file: %w", err) } return nil } -var testGenesisFmt = `{ +const testGenesisFmt = `{ "genesis_time": "2018-10-10T08:20:13.695936996Z", "chain_id": "%s", "initial_height": "1", @@ -691,6 +645,18 @@ var testGenesisFmt = `{ "max_gas": "-1", "time_iota_ms": "10" }, + "synchrony": { + "message_delay": "500000000", + "precision": "10000000" + }, + "timeout": { + "propose": "30000000", + "propose_delta": "50000", + "vote": "30000000", + "vote_delta": "50000", + "commit": "10000000", + "bypass_timeout_commit": true + }, "evidence": { "max_age_num_blocks": "100000", "max_age_duration": "172800000000000", @@ -709,7 +675,7 @@ var testGenesisFmt = `{ "type": "tendermint/PubKeyBLS12381", "value":"F5BjXeh0DppqaxX7a3LzoWr6CXPZcZeba6VHYdbiUCxQ23b00mFD8FRZpCz9Ug1E" }, - "power": "100", + "power": 100, "name": "", "pro_tx_hash": "51BF39CC1F41B9FC63DFA5B1EDF3F0CA3AD5CAFAE4B12B4FE9263B08BB50C45F" } @@ -744,7 +710,7 @@ var testPrivValidatorKey = `{ "pro_tx_hash": "51BF39CC1F41B9FC63DFA5B1EDF3F0CA3AD5CAFAE4B12B4FE9263B08BB50C45F" }` -var testPrivValidatorState = `{ +const testPrivValidatorState = `{ "height": "0", "round": 0, "step": 0 diff --git a/config/toml_test.go b/config/toml_test.go index 26376b72d2..cf27c4484a 100644 --- a/config/toml_test.go +++ b/config/toml_test.go @@ -1,7 +1,6 @@ package config import ( - "io/ioutil" "os" "path/filepath" "strings" @@ -15,26 +14,22 @@ func ensureFiles(t *testing.T, rootDir string, files ...string) { for _, f := range files { p := rootify(rootDir, f) _, err := os.Stat(p) - assert.Nil(t, err, p) + assert.NoError(t, err, p) } } func TestEnsureRoot(t *testing.T) { - require := require.New(t) - // setup temp dir for test - tmpDir, err := ioutil.TempDir("", "config-test") - require.NoError(err) - defer os.RemoveAll(tmpDir) + tmpDir := t.TempDir() // create root dir EnsureRoot(tmpDir) - require.NoError(WriteConfigFile(tmpDir, DefaultConfig())) + require.NoError(t, WriteConfigFile(tmpDir, DefaultConfig())) // make sure config is set properly - data, err := ioutil.ReadFile(filepath.Join(tmpDir, defaultConfigFilePath)) - require.NoError(err) + data, err := os.ReadFile(filepath.Join(tmpDir, defaultConfigFilePath)) + require.NoError(t, err) checkConfig(t, string(data)) @@ -42,19 +37,17 @@ func TestEnsureRoot(t *testing.T) { } func TestEnsureTestRoot(t *testing.T) { - require := require.New(t) - testName := "ensureTestRoot" // create root dir - cfg, err := ResetTestRoot(testName) - require.NoError(err) + cfg, err := ResetTestRoot(t.TempDir(), testName) + require.NoError(t, err) defer os.RemoveAll(cfg.RootDir) rootDir := cfg.RootDir // make sure config is set properly - data, err := ioutil.ReadFile(filepath.Join(rootDir, defaultConfigFilePath)) - require.Nil(err) + data, err := os.ReadFile(filepath.Join(rootDir, defaultConfigFilePath)) + require.NoError(t, err) checkConfig(t, string(data)) @@ -71,7 +64,6 @@ func checkConfig(t *testing.T, configFile string) { "moniker", "seeds", "proxy-app", - "blocksync", "create-empty-blocks", "peer", "timeout", diff --git a/crypto/README.md b/crypto/README.md index 20346d7155..d60628d970 100644 --- a/crypto/README.md +++ b/crypto/README.md @@ -12,7 +12,7 @@ For any specific algorithm, use its specific module e.g. ## Binary encoding -For Binary encoding, please refer to the [Tendermint encoding specification](https://docs.tendermint.com/master/spec/blockchain/encoding.html). +For Binary encoding, please refer to the [Tendermint encoding specification](https://docs.tendermint.com/master/spec/core/encoding.html). ## JSON Encoding diff --git a/crypto/bls12381/bls12381.go b/crypto/bls12381/bls12381.go index e6297bd29a..cb554e8418 100644 --- a/crypto/bls12381/bls12381.go +++ b/crypto/bls12381/bls12381.go @@ -2,6 +2,8 @@ package bls12381 import ( "bytes" + "crypto/rand" + "crypto/sha256" "crypto/subtle" "encoding/hex" "errors" @@ -9,11 +11,10 @@ import ( "io" bls "github.com/dashpay/bls-signatures/go-bindings" + "github.com/tendermint/tendermint/internal/jsontypes" "github.com/tendermint/tendermint/crypto" - "github.com/tendermint/tendermint/crypto/tmhash" tmbytes "github.com/tendermint/tendermint/libs/bytes" - tmjson "github.com/tendermint/tendermint/libs/json" ) //------------------------------------- @@ -48,13 +49,16 @@ var ( ) func init() { - tmjson.RegisterType(PubKey{}, PubKeyName) - tmjson.RegisterType(PrivKey{}, PrivKeyName) + jsontypes.MustRegister(PubKey{}) + jsontypes.MustRegister(PrivKey{}) } // PrivKey implements crypto.PrivKey. type PrivKey []byte +// TypeTag satisfies the jsontypes.Tagged interface. +func (PrivKey) TypeTag() string { return PrivKeyName } + // Bytes returns the privkey byte format. func (privKey PrivKey) Bytes() []byte { return privKey @@ -145,7 +149,7 @@ func (privKey PrivKey) TypeValue() crypto.KeyType { // It uses OS randomness in conjunction with the current global random seed // in tendermint/libs/common to generate the private key. func GenPrivKey() PrivKey { - return genPrivKey(crypto.CReader()) + return genPrivKey(rand.Reader) } // genPrivKey generates a new bls12381 private key using the provided reader. @@ -168,8 +172,8 @@ func genPrivKey(rand io.Reader) PrivKey { // NOTE: secret should be the output of a KDF like bcrypt, // if it's derived from user input. func GenPrivKeyFromSecret(secret []byte) PrivKey { - seed := crypto.Sha256(secret) // Not Ripemd160 because we want 32 bytes. - privKey, err := bls.PrivateKeyFromSeed(seed) + seed := sha256.Sum256(secret) // Not Ripemd160 because we want 32 bytes. + privKey, err := bls.PrivateKeyFromSeed(seed[:]) if err != nil { panic(err) } @@ -205,7 +209,7 @@ func RecoverThresholdPublicKeyFromPublicKeys(publicKeys []crypto.PubKey, blsIds } for i, blsID := range blsIds { - if len(blsID) != tmhash.Size { + if len(blsID) != crypto.HashSize { return nil, fmt.Errorf("blsID incorrect size in public key recovery, expected 32 bytes (got %d)", len(blsID)) } var hash bls.Hash @@ -241,7 +245,7 @@ func RecoverThresholdSignatureFromShares(sigSharesData [][]byte, blsIds [][]byte } for i, blsID := range blsIds { - if len(blsID) != tmhash.Size { + if len(blsID) != crypto.HashSize { return nil, fmt.Errorf("blsID incorrect size in signature recovery, expected 32 bytes (got %d)", len(blsID)) } var hash bls.Hash @@ -263,12 +267,15 @@ var _ crypto.PubKey = PubKey{} // PubKey PubKeyBLS12381 implements crypto.PubKey for the bls12381 signature scheme. type PubKey []byte +// TypeTag satisfies the jsontypes.Tagged interface. +func (PubKey) TypeTag() string { return PubKeyName } + // Address is the SHA256-20 of the raw pubkey bytes. func (pubKey PubKey) Address() crypto.Address { if len(pubKey) != PubKeySize { panic("pubkey is incorrect size") } - return tmhash.SumTruncated(pubKey) + return crypto.AddressHash(pubKey) } // Bytes returns the PubKey byte format. diff --git a/crypto/crypto.go b/crypto/crypto.go index 9c5073a1f2..7572d2d074 100644 --- a/crypto/crypto.go +++ b/crypto/crypto.go @@ -2,18 +2,23 @@ package crypto import ( "bytes" + "crypto/sha256" + "encoding/json" "errors" "fmt" "github.com/dashevo/dashd-go/btcjson" - "github.com/tendermint/tendermint/crypto/tmhash" + "github.com/tendermint/tendermint/internal/jsontypes" tmbytes "github.com/tendermint/tendermint/libs/bytes" ) const ( + // HashSize is the size in bytes of an AddressHash. + HashSize = sha256.Size + // AddressSize is the size of a pubkey address. - AddressSize = tmhash.TruncatedSize + AddressSize = 20 DefaultHashSize = 32 LargeAppHashSize = DefaultHashSize SmallAppHashSize = 20 @@ -45,8 +50,23 @@ type ProTxHash = tmbytes.HexBytes type QuorumHash = tmbytes.HexBytes +// AddressHash computes a truncated SHA-256 hash of bz for use as +// a peer address. +// +// See: https://docs.tendermint.com/master/spec/core/data_structures.html#address +func AddressHash(bz []byte) Address { + h := sha256.Sum256(bz) + return Address(h[:AddressSize]) +} + +// Checksum returns the SHA256 of the bz. +func Checksum(bz []byte) []byte { + h := sha256.Sum256(bz) + return h[:] +} + func ProTxHashFromSeedBytes(bz []byte) ProTxHash { - return tmhash.Sum(bz) + return Checksum(bz) } func RandProTxHash() ProTxHash { @@ -98,9 +118,50 @@ func (sptxh SortProTxHash) Swap(i, j int) { } type QuorumKeys struct { - PrivKey PrivKey `json:"priv_key"` - PubKey PubKey `json:"pub_key"` - ThresholdPublicKey PubKey `json:"threshold_public_key"` + PrivKey PrivKey + PubKey PubKey + ThresholdPublicKey PubKey +} + +type quorumKeysJSON struct { + PrivKey json.RawMessage `json:"priv_key"` + PubKey json.RawMessage `json:"pub_key"` + ThresholdPublicKey json.RawMessage `json:"threshold_public_key"` +} + +func (pvKey QuorumKeys) MarshalJSON() ([]byte, error) { + var keys quorumKeysJSON + var err error + keys.PrivKey, err = jsontypes.Marshal(pvKey.PrivKey) + if err != nil { + return nil, err + } + keys.PubKey, err = jsontypes.Marshal(pvKey.PubKey) + if err != nil { + return nil, err + } + keys.ThresholdPublicKey, err = jsontypes.Marshal(pvKey.ThresholdPublicKey) + if err != nil { + return nil, err + } + return json.Marshal(keys) +} + +func (pvKey *QuorumKeys) UnmarshalJSON(data []byte) error { + var keys quorumKeysJSON + err := json.Unmarshal(data, &keys) + if err != nil { + return err + } + err = jsontypes.Unmarshal(keys.PrivKey, &pvKey.PrivKey) + if err != nil { + return err + } + err = jsontypes.Unmarshal(keys.PubKey, &pvKey.PubKey) + if err != nil { + return err + } + return jsontypes.Unmarshal(keys.ThresholdPublicKey, &pvKey.ThresholdPublicKey) } // Validator is a validator interface @@ -109,7 +170,6 @@ type Validator interface { } type PubKey interface { - HexStringer Address() Address Bytes() []byte VerifySignature(msg []byte, sig []byte) bool @@ -118,8 +178,11 @@ type PubKey interface { VerifyAggregateSignature(msgs [][]byte, sig []byte) bool Equals(PubKey) bool Type() string - TypeValue() KeyType - String() string + + // Implementations must support tagged encoding in JSON. + jsontypes.Tagged + fmt.Stringer + HexStringer } type PrivKey interface { @@ -129,7 +192,9 @@ type PrivKey interface { PubKey() PubKey Equals(PrivKey) bool Type() string - TypeValue() KeyType + + // Implementations must support tagged encoding in JSON. + jsontypes.Tagged } type Symmetric interface { diff --git a/crypto/crypto_test.go b/crypto/crypto_test.go new file mode 100644 index 0000000000..af89915f13 --- /dev/null +++ b/crypto/crypto_test.go @@ -0,0 +1,17 @@ +package crypto + +import ( + "encoding/hex" + "testing" + + "github.com/stretchr/testify/require" +) + +func TestChecksum(t *testing.T) { + // since sha256 hash algorithm is critical for tenderdash, this test is needed to inform us + // if for any reason the hash algorithm is changed + actual := Checksum([]byte("dash is the best cryptocurrency in the world")) + want, err := hex.DecodeString("FFE75CFE38997723E7C33D0457521B0BA75AB48B39BC467413BDC853ACC7476F") + require.NoError(t, err) + require.Equal(t, want, actual) +} diff --git a/crypto/ed25519/bench_test.go b/crypto/ed25519/bench_test.go index e57cd393f5..49fcd15041 100644 --- a/crypto/ed25519/bench_test.go +++ b/crypto/ed25519/bench_test.go @@ -6,6 +6,7 @@ import ( "testing" "github.com/stretchr/testify/require" + "github.com/tendermint/tendermint/crypto" "github.com/tendermint/tendermint/crypto/internal/benchmarking" ) diff --git a/crypto/ed25519/ed25519.go b/crypto/ed25519/ed25519.go index f445808dd3..1b26a18d61 100644 --- a/crypto/ed25519/ed25519.go +++ b/crypto/ed25519/ed25519.go @@ -2,6 +2,8 @@ package ed25519 import ( "bytes" + "crypto/rand" + "crypto/sha256" "crypto/subtle" "encoding/hex" "errors" @@ -12,8 +14,7 @@ import ( "github.com/oasisprotocol/curve25519-voi/primitives/ed25519/extra/cache" "github.com/tendermint/tendermint/crypto" - "github.com/tendermint/tendermint/crypto/tmhash" - tmjson "github.com/tendermint/tendermint/libs/json" + "github.com/tendermint/tendermint/internal/jsontypes" ) //------------------------------------- @@ -57,13 +58,16 @@ const ( ) func init() { - tmjson.RegisterType(PubKey{}, PubKeyName) - tmjson.RegisterType(PrivKey{}, PrivKeyName) + jsontypes.MustRegister(PubKey{}) + jsontypes.MustRegister(PrivKey{}) } // PrivKey implements crypto.PrivKey. type PrivKey []byte +// TypeTag satisfies the jsontypes.Tagged interface. +func (PrivKey) TypeTag() string { return PrivKeyName } + // Bytes returns the privkey byte format. func (privKey PrivKey) Bytes() []byte { return []byte(privKey) @@ -138,7 +142,7 @@ func (privKey PrivKey) TypeValue() crypto.KeyType { // It uses OS randomness in conjunction with the current global random seed // in tendermint/libs/common to generate the private key. func GenPrivKey() PrivKey { - return genPrivKey(crypto.CReader()) + return genPrivKey(rand.Reader) } // genPrivKey generates a new ed25519 private key using the provided reader. @@ -156,9 +160,8 @@ func genPrivKey(rand io.Reader) PrivKey { // NOTE: secret should be the output of a KDF like bcrypt, // if it's derived from user input. func GenPrivKeyFromSecret(secret []byte) PrivKey { - seed := crypto.Sha256(secret) // Not Ripemd160 because we want 32 bytes. - - return PrivKey(ed25519.NewKeyFromSeed(seed)) + seed := sha256.Sum256(secret) + return PrivKey(ed25519.NewKeyFromSeed(seed[:])) } //------------------------------------- @@ -168,12 +171,15 @@ var _ crypto.PubKey = PubKey{} // PubKeyEd25519 implements crypto.PubKey for the Ed25519 signature scheme. type PubKey []byte +// TypeTag satisfies the jsontypes.Tagged interface. +func (PubKey) TypeTag() string { return PubKeyName } + // Address is the SHA256-20 of the raw pubkey bytes. func (pubKey PubKey) Address() crypto.Address { if len(pubKey) != PubKeySize { panic("pubkey is incorrect size") } - return crypto.Address(tmhash.SumTruncated(pubKey)) + return crypto.AddressHash(pubKey) } // Bytes returns the PubKey byte format. @@ -268,5 +274,5 @@ func (b *BatchVerifier) Add(key crypto.PubKey, msg, signature []byte) error { } func (b *BatchVerifier) Verify() (bool, []bool) { - return b.BatchVerifier.Verify(crypto.CReader()) + return b.BatchVerifier.Verify(rand.Reader) } diff --git a/crypto/ed25519/ed25519_test.go b/crypto/ed25519/ed25519_test.go index e40acd27dc..db8ff81849 100644 --- a/crypto/ed25519/ed25519_test.go +++ b/crypto/ed25519/ed25519_test.go @@ -17,7 +17,7 @@ func TestSignAndValidateEd25519(t *testing.T) { msg := crypto.CRandBytes(128) sig, err := privKey.SignDigest(msg) - require.Nil(t, err) + require.NoError(t, err) // Test the signature assert.True(t, pubKey.VerifySignature(msg, sig)) diff --git a/crypto/encoding/codec.go b/crypto/encoding/codec.go index 3319d0e5a0..8ca540ecd2 100644 --- a/crypto/encoding/codec.go +++ b/crypto/encoding/codec.go @@ -8,15 +8,15 @@ import ( "github.com/tendermint/tendermint/crypto" "github.com/tendermint/tendermint/crypto/ed25519" "github.com/tendermint/tendermint/crypto/secp256k1" - "github.com/tendermint/tendermint/libs/json" + "github.com/tendermint/tendermint/internal/jsontypes" cryptoproto "github.com/tendermint/tendermint/proto/tendermint/crypto" ) func init() { - json.RegisterType((*cryptoproto.PublicKey)(nil), "tendermint.crypto.PublicKey") - json.RegisterType((*cryptoproto.PublicKey_Bls12381)(nil), "tendermint.crypto.PublicKey_Bls12381") - json.RegisterType((*cryptoproto.PublicKey_Ed25519)(nil), "tendermint.crypto.PublicKey_Ed25519") - json.RegisterType((*cryptoproto.PublicKey_Secp256K1)(nil), "tendermint.crypto.PublicKey_Secp256K1") + jsontypes.MustRegister((*cryptoproto.PublicKey)(nil)) + jsontypes.MustRegister((*cryptoproto.PublicKey_Bls12381)(nil)) + jsontypes.MustRegister((*cryptoproto.PublicKey_Ed25519)(nil)) + jsontypes.MustRegister((*cryptoproto.PublicKey_Secp256K1)(nil)) } // PubKeyToProto takes crypto.PubKey and transforms it to a protobuf Pubkey diff --git a/crypto/example_test.go b/crypto/example_test.go deleted file mode 100644 index f1d0013d48..0000000000 --- a/crypto/example_test.go +++ /dev/null @@ -1,28 +0,0 @@ -// Copyright 2017 Tendermint. All Rights Reserved. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -package crypto_test - -import ( - "fmt" - - "github.com/tendermint/tendermint/crypto" -) - -func ExampleSha256() { - sum := crypto.Sha256([]byte("This is Tendermint")) - fmt.Printf("%x\n", sum) - // Output: - // f91afb642f3d1c87c17eb01aae5cb65c242dfdbe7cf1066cc260f4ce5d33b94e -} diff --git a/crypto/hash.go b/crypto/hash.go deleted file mode 100644 index e1d22523f2..0000000000 --- a/crypto/hash.go +++ /dev/null @@ -1,11 +0,0 @@ -package crypto - -import ( - "crypto/sha256" -) - -func Sha256(bytes []byte) []byte { - hasher := sha256.New() - hasher.Write(bytes) - return hasher.Sum(nil) -} diff --git a/crypto/merkle/hash.go b/crypto/merkle/hash.go index 9c6df1786e..0bb5448d71 100644 --- a/crypto/merkle/hash.go +++ b/crypto/merkle/hash.go @@ -3,7 +3,7 @@ package merkle import ( "hash" - "github.com/tendermint/tendermint/crypto/tmhash" + "github.com/tendermint/tendermint/crypto" ) // TODO: make these have a large predefined capacity @@ -14,12 +14,12 @@ var ( // returns tmhash() func emptyHash() []byte { - return tmhash.Sum([]byte{}) + return crypto.Checksum([]byte{}) } // returns tmhash(0x00 || leaf) func leafHash(leaf []byte) []byte { - return tmhash.Sum(append(leafPrefix, leaf...)) + return crypto.Checksum(append(leafPrefix, leaf...)) } // returns tmhash(0x00 || leaf) @@ -36,7 +36,7 @@ func innerHash(left []byte, right []byte) []byte { n := copy(data, innerPrefix) n += copy(data[n:], left) copy(data[n:], right) - return tmhash.Sum(data) + return crypto.Checksum(data)[:] } func innerHashOpt(s hash.Hash, left []byte, right []byte) []byte { diff --git a/crypto/merkle/proof.go b/crypto/merkle/proof.go index 80b289d231..8b98d1b21b 100644 --- a/crypto/merkle/proof.go +++ b/crypto/merkle/proof.go @@ -5,7 +5,7 @@ import ( "errors" "fmt" - "github.com/tendermint/tendermint/crypto/tmhash" + "github.com/tendermint/tendermint/crypto" tmcrypto "github.com/tendermint/tendermint/proto/tendermint/crypto" ) @@ -24,10 +24,10 @@ const ( // everything. This also affects the generalized proof system as // well. type Proof struct { - Total int64 `json:"total"` // Total number of items. - Index int64 `json:"index"` // Index of item to prove. - LeafHash []byte `json:"leaf_hash"` // Hash of item value. - Aunts [][]byte `json:"aunts"` // Hashes from leaf's sibling to a root's child. + Total int64 `json:"total,string"` // Total number of items. + Index int64 `json:"index,string"` // Index of item to prove. + LeafHash []byte `json:"leaf_hash"` // Hash of item value. + Aunts [][]byte `json:"aunts"` // Hashes from leaf's sibling to a root's child. } // ProofsFromByteSlices computes inclusion proof for given items. @@ -102,15 +102,15 @@ func (sp *Proof) ValidateBasic() error { if sp.Index < 0 { return errors.New("negative Index") } - if len(sp.LeafHash) != tmhash.Size { - return fmt.Errorf("expected LeafHash size to be %d, got %d", tmhash.Size, len(sp.LeafHash)) + if len(sp.LeafHash) != crypto.HashSize { + return fmt.Errorf("expected LeafHash size to be %d, got %d", crypto.HashSize, len(sp.LeafHash)) } if len(sp.Aunts) > MaxAunts { return fmt.Errorf("expected no more than %d aunts, got %d", MaxAunts, len(sp.Aunts)) } for i, auntHash := range sp.Aunts { - if len(auntHash) != tmhash.Size { - return fmt.Errorf("expected Aunts#%d size to be %d, got %d", i, tmhash.Size, len(auntHash)) + if len(auntHash) != crypto.HashSize { + return fmt.Errorf("expected Aunts#%d size to be %d, got %d", i, crypto.HashSize, len(auntHash)) } } return nil diff --git a/crypto/merkle/proof_key_path_test.go b/crypto/merkle/proof_key_path_test.go index 0cc947643f..13d26b3601 100644 --- a/crypto/merkle/proof_key_path_test.go +++ b/crypto/merkle/proof_key_path_test.go @@ -28,13 +28,13 @@ func TestKeyPath(t *testing.T) { case KeyEncodingHex: rand.Read(keys[i]) default: - panic("Unexpected encoding") + require.Fail(t, "Unexpected encoding") } path = path.AppendKey(keys[i], enc) } res, err := KeyPathToKeys(path.String()) - require.Nil(t, err) + require.NoError(t, err) require.Equal(t, len(keys), len(res)) for i, key := range keys { diff --git a/crypto/merkle/proof_test.go b/crypto/merkle/proof_test.go index f0d2f86896..05a5ca369a 100644 --- a/crypto/merkle/proof_test.go +++ b/crypto/merkle/proof_test.go @@ -79,58 +79,58 @@ func TestProofOperators(t *testing.T) { // Good popz := ProofOperators([]ProofOperator{op1, op2, op3, op4}) err = popz.Verify(bz("OUTPUT4"), "/KEY4/KEY2/KEY1", [][]byte{bz("INPUT1")}) - assert.Nil(t, err) + assert.NoError(t, err) err = popz.VerifyValue(bz("OUTPUT4"), "/KEY4/KEY2/KEY1", bz("INPUT1")) - assert.Nil(t, err) + assert.NoError(t, err) // BAD INPUT err = popz.Verify(bz("OUTPUT4"), "/KEY4/KEY2/KEY1", [][]byte{bz("INPUT1_WRONG")}) - assert.NotNil(t, err) + assert.Error(t, err) err = popz.VerifyValue(bz("OUTPUT4"), "/KEY4/KEY2/KEY1", bz("INPUT1_WRONG")) - assert.NotNil(t, err) + assert.Error(t, err) // BAD KEY 1 err = popz.Verify(bz("OUTPUT4"), "/KEY3/KEY2/KEY1", [][]byte{bz("INPUT1")}) - assert.NotNil(t, err) + assert.Error(t, err) // BAD KEY 2 err = popz.Verify(bz("OUTPUT4"), "KEY4/KEY2/KEY1", [][]byte{bz("INPUT1")}) - assert.NotNil(t, err) + assert.Error(t, err) // BAD KEY 3 err = popz.Verify(bz("OUTPUT4"), "/KEY4/KEY2/KEY1/", [][]byte{bz("INPUT1")}) - assert.NotNil(t, err) + assert.Error(t, err) // BAD KEY 4 err = popz.Verify(bz("OUTPUT4"), "//KEY4/KEY2/KEY1", [][]byte{bz("INPUT1")}) - assert.NotNil(t, err) + assert.Error(t, err) // BAD KEY 5 err = popz.Verify(bz("OUTPUT4"), "/KEY2/KEY1", [][]byte{bz("INPUT1")}) - assert.NotNil(t, err) + assert.Error(t, err) // BAD OUTPUT 1 err = popz.Verify(bz("OUTPUT4_WRONG"), "/KEY4/KEY2/KEY1", [][]byte{bz("INPUT1")}) - assert.NotNil(t, err) + assert.Error(t, err) // BAD OUTPUT 2 err = popz.Verify(bz(""), "/KEY4/KEY2/KEY1", [][]byte{bz("INPUT1")}) - assert.NotNil(t, err) + assert.Error(t, err) // BAD POPZ 1 popz = []ProofOperator{op1, op2, op4} err = popz.Verify(bz("OUTPUT4"), "/KEY4/KEY2/KEY1", [][]byte{bz("INPUT1")}) - assert.NotNil(t, err) + assert.Error(t, err) // BAD POPZ 2 popz = []ProofOperator{op4, op3, op2, op1} err = popz.Verify(bz("OUTPUT4"), "/KEY4/KEY2/KEY1", [][]byte{bz("INPUT1")}) - assert.NotNil(t, err) + assert.Error(t, err) // BAD POPZ 3 popz = []ProofOperator{} err = popz.Verify(bz("OUTPUT4"), "/KEY4/KEY2/KEY1", [][]byte{bz("INPUT1")}) - assert.NotNil(t, err) + assert.Error(t, err) } func bz(s string) []byte { diff --git a/crypto/merkle/proof_value.go b/crypto/merkle/proof_value.go index ab776216b0..0f4f2eb3dd 100644 --- a/crypto/merkle/proof_value.go +++ b/crypto/merkle/proof_value.go @@ -2,9 +2,9 @@ package merkle import ( "bytes" + "crypto/sha256" "fmt" - "github.com/tendermint/tendermint/crypto/tmhash" tmcrypto "github.com/tendermint/tendermint/proto/tendermint/crypto" ) @@ -79,14 +79,13 @@ func (op ValueOp) Run(args [][]byte) ([][]byte, error) { return nil, fmt.Errorf("expected 1 arg, got %v", len(args)) } value := args[0] - hasher := tmhash.New() - hasher.Write(value) - vhash := hasher.Sum(nil) + + vhash := sha256.Sum256(value) bz := new(bytes.Buffer) // Wrap to hash the KVPair. - encodeByteSlice(bz, op.key) // nolint: errcheck // does not error - encodeByteSlice(bz, vhash) // nolint: errcheck // does not error + encodeByteSlice(bz, op.key) //nolint: errcheck // does not error + encodeByteSlice(bz, vhash[:]) //nolint: errcheck // does not error kvhash := leafHash(bz.Bytes()) if !bytes.Equal(kvhash, op.Proof.LeafHash) { diff --git a/crypto/merkle/rfc6962_test.go b/crypto/merkle/rfc6962_test.go index 571e5c75f5..f22a48a32e 100644 --- a/crypto/merkle/rfc6962_test.go +++ b/crypto/merkle/rfc6962_test.go @@ -20,7 +20,7 @@ import ( "encoding/hex" "testing" - "github.com/tendermint/tendermint/crypto/tmhash" + "github.com/tendermint/tendermint/crypto" ) func TestRFC6962Hasher(t *testing.T) { @@ -39,7 +39,7 @@ func TestRFC6962Hasher(t *testing.T) { // echo -n '' | sha256sum { desc: "RFC6962 Empty Tree", - want: "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"[:tmhash.Size*2], + want: "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"[:crypto.HashSize*2], got: emptyTreeHash, }, @@ -47,19 +47,19 @@ func TestRFC6962Hasher(t *testing.T) { // echo -n 00 | xxd -r -p | sha256sum { desc: "RFC6962 Empty Leaf", - want: "6e340b9cffb37a989ca544e6bb780a2c78901d3fb33738768511a30617afa01d"[:tmhash.Size*2], + want: "6e340b9cffb37a989ca544e6bb780a2c78901d3fb33738768511a30617afa01d"[:crypto.HashSize*2], got: emptyLeafHash, }, // echo -n 004C313233343536 | xxd -r -p | sha256sum { desc: "RFC6962 Leaf", - want: "395aa064aa4c29f7010acfe3f25db9485bbd4b91897b6ad7ad547639252b4d56"[:tmhash.Size*2], + want: "395aa064aa4c29f7010acfe3f25db9485bbd4b91897b6ad7ad547639252b4d56"[:crypto.HashSize*2], got: leafHash, }, // echo -n 014E3132334E343536 | xxd -r -p | sha256sum { desc: "RFC6962 Node", - want: "aa217fe888e47007fa15edab33c2b492a722cb106c64667fc2b044444de66bbb"[:tmhash.Size*2], + want: "aa217fe888e47007fa15edab33c2b492a722cb106c64667fc2b044444de66bbb"[:crypto.HashSize*2], got: innerHash([]byte("N123"), []byte("N456")), }, } { diff --git a/crypto/merkle/tree_test.go b/crypto/merkle/tree_test.go index 641c46b76c..72b260178f 100644 --- a/crypto/merkle/tree_test.go +++ b/crypto/merkle/tree_test.go @@ -7,7 +7,7 @@ import ( "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" - "github.com/tendermint/tendermint/crypto/tmhash" + "github.com/tendermint/tendermint/crypto" ctest "github.com/tendermint/tendermint/internal/libs/test" tmrand "github.com/tendermint/tendermint/libs/rand" ) @@ -53,7 +53,7 @@ func TestProof(t *testing.T) { items := make([][]byte, total) for i := 0; i < total; i++ { - items[i] = testItem(tmrand.Bytes(tmhash.Size)) + items[i] = testItem(tmrand.Bytes(crypto.HashSize)) } rootHash = HashFromByteSlices(items) @@ -106,7 +106,7 @@ func TestHashAlternatives(t *testing.T) { items := make([][]byte, total) for i := 0; i < total; i++ { - items[i] = testItem(tmrand.Bytes(tmhash.Size)) + items[i] = testItem(tmrand.Bytes(crypto.HashSize)) } rootHash1 := HashFromByteSlicesIterative(items) @@ -119,7 +119,7 @@ func BenchmarkHashAlternatives(b *testing.B) { items := make([][]byte, total) for i := 0; i < total; i++ { - items[i] = testItem(tmrand.Bytes(tmhash.Size)) + items[i] = testItem(tmrand.Bytes(crypto.HashSize)) } b.ResetTimer() diff --git a/crypto/random.go b/crypto/random.go index 275fb1044f..352ea0a3ec 100644 --- a/crypto/random.go +++ b/crypto/random.go @@ -1,26 +1,20 @@ package crypto import ( - crand "crypto/rand" + "crypto/rand" "encoding/hex" - "io" ) // This only uses the OS's randomness -func randBytes(numBytes int) []byte { +func CRandBytes(numBytes int) []byte { b := make([]byte, numBytes) - _, err := crand.Read(b) + _, err := rand.Read(b) if err != nil { panic(err) } return b } -// This only uses the OS's randomness -func CRandBytes(numBytes int) []byte { - return randBytes(numBytes) -} - // CRandHex returns a hex encoded string that's floor(numDigits/2) * 2 long. // // Note: CRandHex(24) gives 96 bits of randomness that @@ -28,8 +22,3 @@ func CRandBytes(numBytes int) []byte { func CRandHex(numDigits int) string { return hex.EncodeToString(CRandBytes(numDigits / 2)) } - -// Returns a crand.Reader. -func CReader() io.Reader { - return crand.Reader -} diff --git a/crypto/secp256k1/secp256k1.go b/crypto/secp256k1/secp256k1.go index 52aee0d5d5..c520360b3c 100644 --- a/crypto/secp256k1/secp256k1.go +++ b/crypto/secp256k1/secp256k1.go @@ -2,6 +2,7 @@ package secp256k1 import ( "bytes" + "crypto/rand" "crypto/sha256" "crypto/subtle" "encoding/hex" @@ -13,10 +14,10 @@ import ( secp256k1 "github.com/btcsuite/btcd/btcec" "github.com/tendermint/tendermint/crypto" - tmjson "github.com/tendermint/tendermint/libs/json" + "github.com/tendermint/tendermint/internal/jsontypes" // necessary for Bitcoin address format - "golang.org/x/crypto/ripemd160" // nolint + "golang.org/x/crypto/ripemd160" //nolint:staticcheck ) //------------------------------------- @@ -29,8 +30,8 @@ const ( ) func init() { - tmjson.RegisterType(PubKey{}, PubKeyName) - tmjson.RegisterType(PrivKey{}, PrivKeyName) + jsontypes.MustRegister(PubKey{}) + jsontypes.MustRegister(PrivKey{}) } var _ crypto.PrivKey = PrivKey{} @@ -38,6 +39,9 @@ var _ crypto.PrivKey = PrivKey{} // PrivKey implements PrivKey. type PrivKey []byte +// TypeTag satisfies the jsontypes.Tagged interface. +func (PrivKey) TypeTag() string { return PrivKeyName } + // Bytes marshalls the private key using amino encoding. func (privKey PrivKey) Bytes() []byte { return []byte(privKey) @@ -73,7 +77,7 @@ func (privKey PrivKey) TypeValue() crypto.KeyType { // GenPrivKey generates a new ECDSA private key on curve secp256k1 private key. // It uses OS randomness to generate the private key. func GenPrivKey() PrivKey { - return genPrivKey(crypto.CReader()) + return genPrivKey(rand.Reader) } // genPrivKey generates a new secp256k1 private key using the provided reader. @@ -145,6 +149,9 @@ const PubKeySize = 33 // This prefix is followed with the x-coordinate. type PubKey []byte +// TypeTag satisfies the jsontypes.Tagged interface. +func (PubKey) TypeTag() string { return PubKeyName } + // Address returns a Bitcoin style addresses: RIPEMD160(SHA256(pubkey)) func (pubKey PubKey) Address() crypto.Address { if len(pubKey) != PubKeySize { @@ -199,8 +206,8 @@ var secp256k1halfN = new(big.Int).Rsh(secp256k1.S256().N, 1) // The returned signature will be of the form R || S (in lower-S form). func (privKey PrivKey) Sign(msg []byte) ([]byte, error) { priv, _ := secp256k1.PrivKeyFromBytes(secp256k1.S256(), privKey) - - sig, err := priv.Sign(crypto.Sha256(msg)) + seed := sha256.Sum256(msg) + sig, err := priv.Sign(seed[:]) if err != nil { return nil, err } @@ -229,28 +236,8 @@ func (pubKey PubKey) VerifySignature(msg []byte, sigStr []byte) bool { return false } - return signature.Verify(crypto.Sha256(msg), pub) -} - -// Read Signature struct from R || S. Caller needs to ensure -// that len(sigStr) == 64. -func signatureFromBytes(sigStr []byte) *secp256k1.Signature { - return &secp256k1.Signature{ - R: new(big.Int).SetBytes(sigStr[:32]), - S: new(big.Int).SetBytes(sigStr[32:64]), - } -} - -// Serialize signature to R || S. -// R, S are padded to 32 bytes respectively. -func serializeSig(sig *secp256k1.Signature) []byte { - rBytes := sig.R.Bytes() - sBytes := sig.S.Bytes() - sigBytes := make([]byte, 64) - // 0 pad the byte arrays from the left if they aren't big enough. - copy(sigBytes[32-len(rBytes):32], rBytes) - copy(sigBytes[64-len(sBytes):64], sBytes) - return sigBytes + seed := sha256.Sum256(msg) + return signature.Verify(seed[:], pub) } // SignDigest creates an ECDSA signature on curve Secp256k1. @@ -278,3 +265,24 @@ func (pubKey PubKey) VerifyAggregateSignature(messages [][]byte, sig []byte) boo func (pubKey PubKey) VerifySignatureDigest(hash []byte, sig []byte) bool { return false } + +// Read Signature struct from R || S. Caller needs to ensure +// that len(sigStr) == 64. +func signatureFromBytes(sigStr []byte) *secp256k1.Signature { + return &secp256k1.Signature{ + R: new(big.Int).SetBytes(sigStr[:32]), + S: new(big.Int).SetBytes(sigStr[32:64]), + } +} + +// Serialize signature to R || S. +// R, S are padded to 32 bytes respectively. +func serializeSig(sig *secp256k1.Signature) []byte { + rBytes := sig.R.Bytes() + sBytes := sig.S.Bytes() + sigBytes := make([]byte, 64) + // 0 pad the byte arrays from the left if they aren't big enough. + copy(sigBytes[32-len(rBytes):32], rBytes) + copy(sigBytes[64-len(sBytes):64], sBytes) + return sigBytes +} diff --git a/crypto/secp256k1/secp256k1_test.go b/crypto/secp256k1/secp256k1_test.go index 7a11092939..6cd53704c5 100644 --- a/crypto/secp256k1/secp256k1_test.go +++ b/crypto/secp256k1/secp256k1_test.go @@ -52,7 +52,7 @@ func TestSignAndValidateSecp256k1(t *testing.T) { msg := crypto.CRandBytes(128) sig, err := privKey.Sign(msg) - require.Nil(t, err) + require.NoError(t, err) assert.True(t, pubKey.VerifySignature(msg, sig)) diff --git a/crypto/tmhash/hash.go b/crypto/tmhash/hash.go deleted file mode 100644 index f9b9582420..0000000000 --- a/crypto/tmhash/hash.go +++ /dev/null @@ -1,65 +0,0 @@ -package tmhash - -import ( - "crypto/sha256" - "hash" -) - -const ( - Size = sha256.Size - BlockSize = sha256.BlockSize -) - -// New returns a new hash.Hash. -func New() hash.Hash { - return sha256.New() -} - -// Sum returns the SHA256 of the bz. -func Sum(bz []byte) []byte { - h := sha256.Sum256(bz) - return h[:] -} - -//------------------------------------------------------------- - -const ( - TruncatedSize = 20 -) - -type sha256trunc struct { - sha256 hash.Hash -} - -func (h sha256trunc) Write(p []byte) (n int, err error) { - return h.sha256.Write(p) -} -func (h sha256trunc) Sum(b []byte) []byte { - shasum := h.sha256.Sum(b) - return shasum[:TruncatedSize] -} - -func (h sha256trunc) Reset() { - h.sha256.Reset() -} - -func (h sha256trunc) Size() int { - return TruncatedSize -} - -func (h sha256trunc) BlockSize() int { - return h.sha256.BlockSize() -} - -// NewTruncated returns a new hash.Hash. -func NewTruncated() hash.Hash { - return sha256trunc{ - sha256: sha256.New(), - } -} - -// SumTruncated returns the first 20 bytes of SHA256 of the bz. -func SumTruncated(bz []byte) []byte { - hash := sha256.Sum256(bz) - return hash[:TruncatedSize] -} diff --git a/crypto/tmhash/hash_test.go b/crypto/tmhash/hash_test.go deleted file mode 100644 index cf9991b3b2..0000000000 --- a/crypto/tmhash/hash_test.go +++ /dev/null @@ -1,48 +0,0 @@ -package tmhash_test - -import ( - "crypto/sha256" - "testing" - - "github.com/stretchr/testify/assert" - "github.com/stretchr/testify/require" - - "github.com/tendermint/tendermint/crypto/tmhash" -) - -func TestHash(t *testing.T) { - testVector := []byte("abc") - hasher := tmhash.New() - _, err := hasher.Write(testVector) - require.NoError(t, err) - bz := hasher.Sum(nil) - - bz2 := tmhash.Sum(testVector) - - hasher = sha256.New() - _, err = hasher.Write(testVector) - require.NoError(t, err) - bz3 := hasher.Sum(nil) - - assert.Equal(t, bz, bz2) - assert.Equal(t, bz, bz3) -} - -func TestHashTruncated(t *testing.T) { - testVector := []byte("abc") - hasher := tmhash.NewTruncated() - _, err := hasher.Write(testVector) - require.NoError(t, err) - bz := hasher.Sum(nil) - - bz2 := tmhash.SumTruncated(testVector) - - hasher = sha256.New() - _, err = hasher.Write(testVector) - require.NoError(t, err) - bz3 := hasher.Sum(nil) - bz3 = bz3[:tmhash.TruncatedSize] - - assert.Equal(t, bz, bz2) - assert.Equal(t, bz, bz3) -} diff --git a/crypto/version.go b/crypto/version.go deleted file mode 100644 index 77c0bed8a2..0000000000 --- a/crypto/version.go +++ /dev/null @@ -1,3 +0,0 @@ -package crypto - -const Version = "0.9.0-dev" diff --git a/crypto/xchacha20poly1305/vector_test.go b/crypto/xchacha20poly1305/vector_test.go deleted file mode 100644 index c6ca9d8d23..0000000000 --- a/crypto/xchacha20poly1305/vector_test.go +++ /dev/null @@ -1,122 +0,0 @@ -package xchacha20poly1305 - -import ( - "bytes" - "encoding/hex" - "testing" -) - -func toHex(bits []byte) string { - return hex.EncodeToString(bits) -} - -func fromHex(bits string) []byte { - b, err := hex.DecodeString(bits) - if err != nil { - panic(err) - } - return b -} - -func TestHChaCha20(t *testing.T) { - for i, v := range hChaCha20Vectors { - var key [32]byte - var nonce [16]byte - copy(key[:], v.key) - copy(nonce[:], v.nonce) - - HChaCha20(&key, &nonce, &key) - if !bytes.Equal(key[:], v.keystream) { - t.Errorf("test %d: keystream mismatch:\n \t got: %s\n \t want: %s", i, toHex(key[:]), toHex(v.keystream)) - } - } -} - -var hChaCha20Vectors = []struct { - key, nonce, keystream []byte -}{ - { - fromHex("0000000000000000000000000000000000000000000000000000000000000000"), - fromHex("000000000000000000000000000000000000000000000000"), - fromHex("1140704c328d1d5d0e30086cdf209dbd6a43b8f41518a11cc387b669b2ee6586"), - }, - { - fromHex("8000000000000000000000000000000000000000000000000000000000000000"), - fromHex("000000000000000000000000000000000000000000000000"), - fromHex("7d266a7fd808cae4c02a0a70dcbfbcc250dae65ce3eae7fc210f54cc8f77df86"), - }, - { - fromHex("0000000000000000000000000000000000000000000000000000000000000001"), - fromHex("000000000000000000000000000000000000000000000002"), - fromHex("e0c77ff931bb9163a5460c02ac281c2b53d792b1c43fea817e9ad275ae546963"), - }, - { - fromHex("000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f"), - fromHex("000102030405060708090a0b0c0d0e0f1011121314151617"), - fromHex("51e3ff45a895675c4b33b46c64f4a9ace110d34df6a2ceab486372bacbd3eff6"), - }, - { - fromHex("24f11cce8a1b3d61e441561a696c1c1b7e173d084fd4812425435a8896a013dc"), - fromHex("d9660c5900ae19ddad28d6e06e45fe5e"), - fromHex("5966b3eec3bff1189f831f06afe4d4e3be97fa9235ec8c20d08acfbbb4e851e3"), - }, -} - -func TestVectors(t *testing.T) { - for i, v := range vectors { - if len(v.plaintext) == 0 { - v.plaintext = make([]byte, len(v.ciphertext)) - } - - var nonce [24]byte - copy(nonce[:], v.nonce) - - aead, err := New(v.key) - if err != nil { - t.Error(err) - } - - dst := aead.Seal(nil, nonce[:], v.plaintext, v.ad) - if !bytes.Equal(dst, v.ciphertext) { - t.Errorf("test %d: ciphertext mismatch:\n \t got: %s\n \t want: %s", i, toHex(dst), toHex(v.ciphertext)) - } - open, err := aead.Open(nil, nonce[:], dst, v.ad) - if err != nil { - t.Error(err) - } - if !bytes.Equal(open, v.plaintext) { - t.Errorf("test %d: plaintext mismatch:\n \t got: %s\n \t want: %s", i, string(open), string(v.plaintext)) - } - } -} - -var vectors = []struct { - key, nonce, ad, plaintext, ciphertext []byte -}{ - { - []byte{ - 0x80, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87, 0x88, 0x89, 0x8a, - 0x8b, 0x8c, 0x8d, 0x8e, 0x8f, 0x90, 0x91, 0x92, 0x93, 0x94, 0x95, - 0x96, 0x97, 0x98, 0x99, 0x9a, 0x9b, 0x9c, 0x9d, 0x9e, 0x9f, - }, - []byte{0x07, 0x00, 0x00, 0x00, 0x40, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49, 0x4a, 0x4b}, - []byte{0x50, 0x51, 0x52, 0x53, 0xc0, 0xc1, 0xc2, 0xc3, 0xc4, 0xc5, 0xc6, 0xc7}, - []byte( - "Ladies and Gentlemen of the class of '99: If I could offer you only one tip for the future, sunscreen would be it.", - ), - []byte{ - 0x45, 0x3c, 0x06, 0x93, 0xa7, 0x40, 0x7f, 0x04, 0xff, 0x4c, 0x56, - 0xae, 0xdb, 0x17, 0xa3, 0xc0, 0xa1, 0xaf, 0xff, 0x01, 0x17, 0x49, - 0x30, 0xfc, 0x22, 0x28, 0x7c, 0x33, 0xdb, 0xcf, 0x0a, 0xc8, 0xb8, - 0x9a, 0xd9, 0x29, 0x53, 0x0a, 0x1b, 0xb3, 0xab, 0x5e, 0x69, 0xf2, - 0x4c, 0x7f, 0x60, 0x70, 0xc8, 0xf8, 0x40, 0xc9, 0xab, 0xb4, 0xf6, - 0x9f, 0xbf, 0xc8, 0xa7, 0xff, 0x51, 0x26, 0xfa, 0xee, 0xbb, 0xb5, - 0x58, 0x05, 0xee, 0x9c, 0x1c, 0xf2, 0xce, 0x5a, 0x57, 0x26, 0x32, - 0x87, 0xae, 0xc5, 0x78, 0x0f, 0x04, 0xec, 0x32, 0x4c, 0x35, 0x14, - 0x12, 0x2c, 0xfc, 0x32, 0x31, 0xfc, 0x1a, 0x8b, 0x71, 0x8a, 0x62, - 0x86, 0x37, 0x30, 0xa2, 0x70, 0x2b, 0xb7, 0x63, 0x66, 0x11, 0x6b, - 0xed, 0x09, 0xe0, 0xfd, 0x5c, 0x6d, 0x84, 0xb6, 0xb0, 0xc1, 0xab, - 0xaf, 0x24, 0x9d, 0x5d, 0xd0, 0xf7, 0xf5, 0xa7, 0xea, - }, - }, -} diff --git a/crypto/xchacha20poly1305/xchachapoly.go b/crypto/xchacha20poly1305/xchachapoly.go deleted file mode 100644 index 2578520a5a..0000000000 --- a/crypto/xchacha20poly1305/xchachapoly.go +++ /dev/null @@ -1,259 +0,0 @@ -// Package xchacha20poly1305 creates an AEAD using hchacha, chacha, and poly1305 -// This allows for randomized nonces to be used in conjunction with chacha. -package xchacha20poly1305 - -import ( - "crypto/cipher" - "encoding/binary" - "errors" - "fmt" - - "golang.org/x/crypto/chacha20poly1305" -) - -// Implements crypto.AEAD -type xchacha20poly1305 struct { - key [KeySize]byte -} - -const ( - // KeySize is the size of the key used by this AEAD, in bytes. - KeySize = 32 - // NonceSize is the size of the nonce used with this AEAD, in bytes. - NonceSize = 24 - // TagSize is the size added from poly1305 - TagSize = 16 - // MaxPlaintextSize is the max size that can be passed into a single call of Seal - MaxPlaintextSize = (1 << 38) - 64 - // MaxCiphertextSize is the max size that can be passed into a single call of Open, - // this differs from plaintext size due to the tag - MaxCiphertextSize = (1 << 38) - 48 - - // sigma are constants used in xchacha. - // Unrolled from a slice so that they can be inlined, as slices can't be constants. - sigma0 = uint32(0x61707865) - sigma1 = uint32(0x3320646e) - sigma2 = uint32(0x79622d32) - sigma3 = uint32(0x6b206574) -) - -// New returns a new xchachapoly1305 AEAD -func New(key []byte) (cipher.AEAD, error) { - if len(key) != KeySize { - return nil, errors.New("xchacha20poly1305: bad key length") - } - ret := new(xchacha20poly1305) - copy(ret.key[:], key) - return ret, nil -} - -func (c *xchacha20poly1305) NonceSize() int { - return NonceSize -} - -func (c *xchacha20poly1305) Overhead() int { - return TagSize -} - -func (c *xchacha20poly1305) Seal(dst, nonce, plaintext, additionalData []byte) []byte { - if len(nonce) != NonceSize { - panic("xchacha20poly1305: bad nonce length passed to Seal") - } - - if uint64(len(plaintext)) > MaxPlaintextSize { - panic("xchacha20poly1305: plaintext too large") - } - - var subKey [KeySize]byte - var hNonce [16]byte - var subNonce [chacha20poly1305.NonceSize]byte - copy(hNonce[:], nonce[:16]) - - HChaCha20(&subKey, &hNonce, &c.key) - - // This can't error because we always provide a correctly sized key - chacha20poly1305, _ := chacha20poly1305.New(subKey[:]) - - copy(subNonce[4:], nonce[16:]) - - return chacha20poly1305.Seal(dst, subNonce[:], plaintext, additionalData) -} - -func (c *xchacha20poly1305) Open(dst, nonce, ciphertext, additionalData []byte) ([]byte, error) { - if len(nonce) != NonceSize { - return nil, fmt.Errorf("xchacha20poly1305: bad nonce length passed to Open") - } - if uint64(len(ciphertext)) > MaxCiphertextSize { - return nil, fmt.Errorf("xchacha20poly1305: ciphertext too large") - } - var subKey [KeySize]byte - var hNonce [16]byte - var subNonce [chacha20poly1305.NonceSize]byte - copy(hNonce[:], nonce[:16]) - - HChaCha20(&subKey, &hNonce, &c.key) - - // This can't error because we always provide a correctly sized key - chacha20poly1305, _ := chacha20poly1305.New(subKey[:]) - - copy(subNonce[4:], nonce[16:]) - - return chacha20poly1305.Open(dst, subNonce[:], ciphertext, additionalData) -} - -// HChaCha exported from -// https://github.com/aead/chacha20/blob/8b13a72661dae6e9e5dea04f344f0dc95ea29547/chacha/chacha_generic.go#L194 -// TODO: Add support for the different assembly instructions used there. - -// The MIT License (MIT) - -// Copyright (c) 2016 Andreas Auernhammer - -// Permission is hereby granted, free of charge, to any person obtaining a copy -// of this software and associated documentation files (the "Software"), to deal -// in the Software without restriction, including without limitation the rights -// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -// copies of the Software, and to permit persons to whom the Software is -// furnished to do so, subject to the following conditions: - -// The above copyright notice and this permission notice shall be included in all -// copies or substantial portions of the Software. - -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -// SOFTWARE. - -// HChaCha20 generates 32 pseudo-random bytes from a 128 bit nonce and a 256 bit secret key. -// It can be used as a key-derivation-function (KDF). -func HChaCha20(out *[32]byte, nonce *[16]byte, key *[32]byte) { hChaCha20Generic(out, nonce, key) } - -func hChaCha20Generic(out *[32]byte, nonce *[16]byte, key *[32]byte) { - v00 := sigma0 - v01 := sigma1 - v02 := sigma2 - v03 := sigma3 - v04 := binary.LittleEndian.Uint32(key[0:]) - v05 := binary.LittleEndian.Uint32(key[4:]) - v06 := binary.LittleEndian.Uint32(key[8:]) - v07 := binary.LittleEndian.Uint32(key[12:]) - v08 := binary.LittleEndian.Uint32(key[16:]) - v09 := binary.LittleEndian.Uint32(key[20:]) - v10 := binary.LittleEndian.Uint32(key[24:]) - v11 := binary.LittleEndian.Uint32(key[28:]) - v12 := binary.LittleEndian.Uint32(nonce[0:]) - v13 := binary.LittleEndian.Uint32(nonce[4:]) - v14 := binary.LittleEndian.Uint32(nonce[8:]) - v15 := binary.LittleEndian.Uint32(nonce[12:]) - - for i := 0; i < 20; i += 2 { - v00 += v04 - v12 ^= v00 - v12 = (v12 << 16) | (v12 >> 16) - v08 += v12 - v04 ^= v08 - v04 = (v04 << 12) | (v04 >> 20) - v00 += v04 - v12 ^= v00 - v12 = (v12 << 8) | (v12 >> 24) - v08 += v12 - v04 ^= v08 - v04 = (v04 << 7) | (v04 >> 25) - v01 += v05 - v13 ^= v01 - v13 = (v13 << 16) | (v13 >> 16) - v09 += v13 - v05 ^= v09 - v05 = (v05 << 12) | (v05 >> 20) - v01 += v05 - v13 ^= v01 - v13 = (v13 << 8) | (v13 >> 24) - v09 += v13 - v05 ^= v09 - v05 = (v05 << 7) | (v05 >> 25) - v02 += v06 - v14 ^= v02 - v14 = (v14 << 16) | (v14 >> 16) - v10 += v14 - v06 ^= v10 - v06 = (v06 << 12) | (v06 >> 20) - v02 += v06 - v14 ^= v02 - v14 = (v14 << 8) | (v14 >> 24) - v10 += v14 - v06 ^= v10 - v06 = (v06 << 7) | (v06 >> 25) - v03 += v07 - v15 ^= v03 - v15 = (v15 << 16) | (v15 >> 16) - v11 += v15 - v07 ^= v11 - v07 = (v07 << 12) | (v07 >> 20) - v03 += v07 - v15 ^= v03 - v15 = (v15 << 8) | (v15 >> 24) - v11 += v15 - v07 ^= v11 - v07 = (v07 << 7) | (v07 >> 25) - v00 += v05 - v15 ^= v00 - v15 = (v15 << 16) | (v15 >> 16) - v10 += v15 - v05 ^= v10 - v05 = (v05 << 12) | (v05 >> 20) - v00 += v05 - v15 ^= v00 - v15 = (v15 << 8) | (v15 >> 24) - v10 += v15 - v05 ^= v10 - v05 = (v05 << 7) | (v05 >> 25) - v01 += v06 - v12 ^= v01 - v12 = (v12 << 16) | (v12 >> 16) - v11 += v12 - v06 ^= v11 - v06 = (v06 << 12) | (v06 >> 20) - v01 += v06 - v12 ^= v01 - v12 = (v12 << 8) | (v12 >> 24) - v11 += v12 - v06 ^= v11 - v06 = (v06 << 7) | (v06 >> 25) - v02 += v07 - v13 ^= v02 - v13 = (v13 << 16) | (v13 >> 16) - v08 += v13 - v07 ^= v08 - v07 = (v07 << 12) | (v07 >> 20) - v02 += v07 - v13 ^= v02 - v13 = (v13 << 8) | (v13 >> 24) - v08 += v13 - v07 ^= v08 - v07 = (v07 << 7) | (v07 >> 25) - v03 += v04 - v14 ^= v03 - v14 = (v14 << 16) | (v14 >> 16) - v09 += v14 - v04 ^= v09 - v04 = (v04 << 12) | (v04 >> 20) - v03 += v04 - v14 ^= v03 - v14 = (v14 << 8) | (v14 >> 24) - v09 += v14 - v04 ^= v09 - v04 = (v04 << 7) | (v04 >> 25) - } - - binary.LittleEndian.PutUint32(out[0:], v00) - binary.LittleEndian.PutUint32(out[4:], v01) - binary.LittleEndian.PutUint32(out[8:], v02) - binary.LittleEndian.PutUint32(out[12:], v03) - binary.LittleEndian.PutUint32(out[16:], v12) - binary.LittleEndian.PutUint32(out[20:], v13) - binary.LittleEndian.PutUint32(out[24:], v14) - binary.LittleEndian.PutUint32(out[28:], v15) -} diff --git a/crypto/xchacha20poly1305/xchachapoly_test.go b/crypto/xchacha20poly1305/xchachapoly_test.go deleted file mode 100644 index 6e42e50ace..0000000000 --- a/crypto/xchacha20poly1305/xchachapoly_test.go +++ /dev/null @@ -1,113 +0,0 @@ -package xchacha20poly1305 - -import ( - "bytes" - crand "crypto/rand" - mrand "math/rand" - "testing" -) - -// The following test is taken from -// https://github.com/golang/crypto/blob/master/chacha20poly1305/chacha20poly1305_test.go#L69 -// It requires the below copyright notice, where "this source code" refers to the following function. -// Copyright 2016 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found at the bottom of this file. -func TestRandom(t *testing.T) { - // Some random tests to verify Open(Seal) == Plaintext - for i := 0; i < 256; i++ { - var nonce [24]byte - var key [32]byte - - al := mrand.Intn(128) - pl := mrand.Intn(16384) - ad := make([]byte, al) - plaintext := make([]byte, pl) - _, err := crand.Read(key[:]) - if err != nil { - t.Errorf("error on read: %s", err) - } - _, err = crand.Read(nonce[:]) - if err != nil { - t.Errorf("error on read: %s", err) - } - _, err = crand.Read(ad) - if err != nil { - t.Errorf("error on read: %s", err) - } - _, err = crand.Read(plaintext) - if err != nil { - t.Errorf("error on read: %s", err) - } - - aead, err := New(key[:]) - if err != nil { - t.Fatal(err) - } - - ct := aead.Seal(nil, nonce[:], plaintext, ad) - - plaintext2, err := aead.Open(nil, nonce[:], ct, ad) - if err != nil { - t.Errorf("random #%d: Open failed", i) - continue - } - - if !bytes.Equal(plaintext, plaintext2) { - t.Errorf("random #%d: plaintext's don't match: got %x vs %x", i, plaintext2, plaintext) - continue - } - - if len(ad) > 0 { - alterAdIdx := mrand.Intn(len(ad)) - ad[alterAdIdx] ^= 0x80 - if _, err := aead.Open(nil, nonce[:], ct, ad); err == nil { - t.Errorf("random #%d: Open was successful after altering additional data", i) - } - ad[alterAdIdx] ^= 0x80 - } - - alterNonceIdx := mrand.Intn(aead.NonceSize()) - nonce[alterNonceIdx] ^= 0x80 - if _, err := aead.Open(nil, nonce[:], ct, ad); err == nil { - t.Errorf("random #%d: Open was successful after altering nonce", i) - } - nonce[alterNonceIdx] ^= 0x80 - - alterCtIdx := mrand.Intn(len(ct)) - ct[alterCtIdx] ^= 0x80 - if _, err := aead.Open(nil, nonce[:], ct, ad); err == nil { - t.Errorf("random #%d: Open was successful after altering ciphertext", i) - } - ct[alterCtIdx] ^= 0x80 - } -} - -// AFOREMENTIONED LICENSE -// Copyright (c) 2009 The Go Authors. All rights reserved. -// -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions are -// met: -// -// * Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// * Redistributions in binary form must reproduce the above -// copyright notice, this list of conditions and the following disclaimer -// in the documentation and/or other materials provided with the -// distribution. -// * Neither the name of Google Inc. nor the names of its -// contributors may be used to endorse or promote products derived from -// this software without specific prior written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/crypto/xsalsa20symmetric/symmetric.go b/crypto/xsalsa20symmetric/symmetric.go deleted file mode 100644 index 74cb4b1033..0000000000 --- a/crypto/xsalsa20symmetric/symmetric.go +++ /dev/null @@ -1,54 +0,0 @@ -package xsalsa20symmetric - -import ( - "errors" - "fmt" - - "golang.org/x/crypto/nacl/secretbox" - - "github.com/tendermint/tendermint/crypto" -) - -// TODO, make this into a struct that implements crypto.Symmetric. - -const nonceLen = 24 -const secretLen = 32 - -// secret must be 32 bytes long. Use something like Sha256(Bcrypt(passphrase)) -// The ciphertext is (secretbox.Overhead + 24) bytes longer than the plaintext. -func EncryptSymmetric(plaintext []byte, secret []byte) (ciphertext []byte) { - if len(secret) != secretLen { - panic(fmt.Sprintf("Secret must be 32 bytes long, got len %v", len(secret))) - } - nonce := crypto.CRandBytes(nonceLen) - nonceArr := [nonceLen]byte{} - copy(nonceArr[:], nonce) - secretArr := [secretLen]byte{} - copy(secretArr[:], secret) - ciphertext = make([]byte, nonceLen+secretbox.Overhead+len(plaintext)) - copy(ciphertext, nonce) - secretbox.Seal(ciphertext[nonceLen:nonceLen], plaintext, &nonceArr, &secretArr) - return ciphertext -} - -// secret must be 32 bytes long. Use something like Sha256(Bcrypt(passphrase)) -// The ciphertext is (secretbox.Overhead + 24) bytes longer than the plaintext. -func DecryptSymmetric(ciphertext []byte, secret []byte) (plaintext []byte, err error) { - if len(secret) != secretLen { - panic(fmt.Sprintf("Secret must be 32 bytes long, got len %v", len(secret))) - } - if len(ciphertext) <= secretbox.Overhead+nonceLen { - return nil, errors.New("ciphertext is too short") - } - nonce := ciphertext[:nonceLen] - nonceArr := [nonceLen]byte{} - copy(nonceArr[:], nonce) - secretArr := [secretLen]byte{} - copy(secretArr[:], secret) - plaintext = make([]byte, len(ciphertext)-nonceLen-secretbox.Overhead) - _, ok := secretbox.Open(plaintext[:0], ciphertext[nonceLen:], &nonceArr, &secretArr) - if !ok { - return nil, errors.New("ciphertext decryption failed") - } - return plaintext, nil -} diff --git a/crypto/xsalsa20symmetric/symmetric_test.go b/crypto/xsalsa20symmetric/symmetric_test.go deleted file mode 100644 index 160d49a9ef..0000000000 --- a/crypto/xsalsa20symmetric/symmetric_test.go +++ /dev/null @@ -1,40 +0,0 @@ -package xsalsa20symmetric - -import ( - "testing" - - "github.com/stretchr/testify/assert" - "github.com/stretchr/testify/require" - - "golang.org/x/crypto/bcrypt" - - "github.com/tendermint/tendermint/crypto" -) - -func TestSimple(t *testing.T) { - - plaintext := []byte("sometext") - secret := []byte("somesecretoflengththirtytwo===32") - ciphertext := EncryptSymmetric(plaintext, secret) - plaintext2, err := DecryptSymmetric(ciphertext, secret) - - require.Nil(t, err, "%+v", err) - assert.Equal(t, plaintext, plaintext2) -} - -func TestSimpleWithKDF(t *testing.T) { - - plaintext := []byte("sometext") - secretPass := []byte("somesecret") - secret, err := bcrypt.GenerateFromPassword(secretPass, 12) - if err != nil { - t.Error(err) - } - secret = crypto.Sha256(secret) - - ciphertext := EncryptSymmetric(plaintext, secret) - plaintext2, err := DecryptSymmetric(ciphertext, secret) - - require.Nil(t, err, "%+v", err) - assert.Equal(t, plaintext, plaintext2) -} diff --git a/dashcore/rpc/client.go b/dash/core/client.go similarity index 92% rename from dashcore/rpc/client.go rename to dash/core/client.go index 3f3546fd9e..ae514f50da 100644 --- a/dashcore/rpc/client.go +++ b/dash/core/client.go @@ -1,4 +1,4 @@ -package dashcore +package core import ( "fmt" @@ -13,7 +13,22 @@ import ( const ModuleName = "rpcclient" +// QuorumVerifier represents subset of priv validator features that +// allows verification of threshold signatures. +type QuorumVerifier interface { + // QuorumVerify verifies quorum signature + QuorumVerify( + quorumType btcjson.LLMQType, + requestID bytes.HexBytes, + messageHash bytes.HexBytes, + signature bytes.HexBytes, + quorumHash bytes.HexBytes, + ) (bool, error) +} + type Client interface { + QuorumVerifier + // QuorumInfo returns quorum info QuorumInfo(quorumType btcjson.LLMQType, quorumHash crypto.QuorumHash) (*btcjson.QuorumInfoResult, error) // MasternodeStatus returns masternode status @@ -29,7 +44,6 @@ type Client interface { messageHash bytes.HexBytes, quorumHash bytes.HexBytes, ) (*btcjson.QuorumSignResult, error) - // QuorumVerify verifies quorum signature QuorumVerify( quorumType btcjson.LLMQType, requestID bytes.HexBytes, diff --git a/dashcore/rpc/mock.go b/dash/core/mock.go similarity index 92% rename from dashcore/rpc/mock.go rename to dash/core/mock.go index 213d24a4ea..49063527b0 100644 --- a/dashcore/rpc/mock.go +++ b/dash/core/mock.go @@ -1,4 +1,4 @@ -package dashcore +package core import ( "context" @@ -47,12 +47,13 @@ func (mc *MockClient) QuorumInfo( quorumType btcjson.LLMQType, quorumHash crypto.QuorumHash, ) (*btcjson.QuorumInfoResult, error) { + ctx := context.Background() var members []btcjson.QuorumMember - proTxHash, err := mc.localPV.GetProTxHash(context.Background()) + proTxHash, err := mc.localPV.GetProTxHash(ctx) if err != nil { panic(err) } - pk, err := mc.localPV.GetPubKey(context.Background(), quorumHash) + pk, err := mc.localPV.GetPubKey(ctx, quorumHash) if err != nil { panic(err) } @@ -64,11 +65,11 @@ func (mc *MockClient) QuorumInfo( PubKeyShare: pk.HexString(), }) } - tpk, err := mc.localPV.GetThresholdPublicKey(context.Background(), quorumHash) + tpk, err := mc.localPV.GetThresholdPublicKey(ctx, quorumHash) if err != nil { panic(err) } - height, err := mc.localPV.GetHeight(context.Background(), quorumHash) + height, err := mc.localPV.GetHeight(ctx, quorumHash) if err != nil { panic(err) } @@ -82,7 +83,8 @@ func (mc *MockClient) QuorumInfo( } func (mc *MockClient) MasternodeStatus() (*btcjson.MasternodeStatusResult, error) { - proTxHash, err := mc.localPV.GetProTxHash(context.Background()) + ctx := context.Background() + proTxHash, err := mc.localPV.GetProTxHash(ctx) if err != nil { panic(err) } diff --git a/dash/llmq/llmq.go b/dash/llmq/llmq.go index 170403c37f..65cc23896a 100644 --- a/dash/llmq/llmq.go +++ b/dash/llmq/llmq.go @@ -1,6 +1,7 @@ package llmq import ( + cryptorand "crypto/rand" "errors" "fmt" "io" @@ -91,7 +92,7 @@ func Generate(proTxHashes []crypto.ProTxHash, opts ...optionFunc) (*Data, error) conf := llmqConfig{ proTxHashes: bls12381.ReverseProTxHashes(proTxHashes), threshold: len(proTxHashes)*2/3 + 1, - seedReader: crypto.CReader(), + seedReader: cryptorand.Reader, } for _, opt := range opts { opt(&conf) diff --git a/dash/quorum/mock/dash_dialer.go b/dash/quorum/mock/dash_dialer.go index aff3cabce4..59e4b30753 100644 --- a/dash/quorum/mock/dash_dialer.go +++ b/dash/quorum/mock/dash_dialer.go @@ -3,8 +3,8 @@ package mock import ( "encoding/binary" "encoding/hex" + "sync" - "github.com/tendermint/tendermint/internal/libs/sync" "github.com/tendermint/tendermint/internal/p2p" "github.com/tendermint/tendermint/types" ) diff --git a/dash/quorum/selectpeers/dip6.go b/dash/quorum/selectpeers/dip6.go index d4621e10d8..2999bc7328 100644 --- a/dash/quorum/selectpeers/dip6.go +++ b/dash/quorum/selectpeers/dip6.go @@ -25,7 +25,7 @@ func NewDIP6ValidatorSelector(quorumHash bytes.HexBytes) ValidatorSelector { return &dip6PeerSelector{quorumHash: quorumHash} } -// SelectValidator implements ValidtorSelector. +// SelectValidators implements ValidtorSelector. // SelectValidators selects some validators from `validatorSetMembers`, according to the algorithm // described in DIP-6 https://github.com/dashpay/dips/blob/master/dip-0006.md func (s *dip6PeerSelector) SelectValidators( diff --git a/dash/quorum/selectpeers/sortable_validator.go b/dash/quorum/selectpeers/sortable_validator.go index 78e86e18fb..35ff19f8f8 100644 --- a/dash/quorum/selectpeers/sortable_validator.go +++ b/dash/quorum/selectpeers/sortable_validator.go @@ -2,7 +2,6 @@ package selectpeers import ( "bytes" - "crypto/sha256" "github.com/tendermint/tendermint/crypto" tmbytes "github.com/tendermint/tendermint/libs/bytes" @@ -45,6 +44,5 @@ func calculateDIP6SortKey(proTxHash, quorumHash tmbytes.HexBytes) []byte { keyBytes := make([]byte, 0, len(proTxHash)+len(quorumHash)) keyBytes = append(keyBytes, proTxHash...) keyBytes = append(keyBytes, quorumHash...) - keySHA := sha256.Sum256(keyBytes) - return keySHA[:] + return crypto.Checksum(keyBytes) } diff --git a/dash/quorum/selectpeers/sorted_validator_list.go b/dash/quorum/selectpeers/sorted_validator_list.go index 592f902d49..5bdfb6a8b8 100644 --- a/dash/quorum/selectpeers/sorted_validator_list.go +++ b/dash/quorum/selectpeers/sorted_validator_list.go @@ -23,7 +23,7 @@ func newSortedValidatorList(validators []*types.Validator, quorumHash tmbytes.He return ret } -// Sort() sorts this sortableValidatorList +// Sort sorts this sortableValidatorList func (vl sortedValidatorList) Sort() { sort.Sort(vl) } diff --git a/dash/quorum/validator_conn_executor.go b/dash/quorum/validator_conn_executor.go index 7521d27690..20de216f46 100644 --- a/dash/quorum/validator_conn_executor.go +++ b/dash/quorum/validator_conn_executor.go @@ -4,14 +4,16 @@ import ( "context" "errors" "fmt" + "sync" "time" "github.com/hashicorp/go-multierror" "github.com/tendermint/tendermint/crypto" "github.com/tendermint/tendermint/dash/quorum/selectpeers" - "github.com/tendermint/tendermint/internal/libs/sync" + "github.com/tendermint/tendermint/internal/eventbus" "github.com/tendermint/tendermint/internal/p2p" + tmpubsub "github.com/tendermint/tendermint/internal/pubsub" tmbytes "github.com/tendermint/tendermint/libs/bytes" "github.com/tendermint/tendermint/libs/log" "github.com/tendermint/tendermint/libs/service" @@ -41,11 +43,12 @@ type optionFunc func(vc *ValidatorConnExecutor) error // Note that we mark peers that are members of active validator set as Persistent, so p2p subsystem // will retry the connection if it fails. type ValidatorConnExecutor struct { - service.BaseService + *service.BaseService + logger log.Logger proTxHash types.ProTxHash - eventBus *types.EventBus + eventBus *eventbus.EventBus dialer p2p.DashDialer - subscription types.Subscription + subscription eventbus.Subscription // validatorSetMembers contains validators active in the current Validator Set, indexed by node ID validatorSetMembers validatorMap @@ -72,11 +75,12 @@ var ( // Don't forget to Start() and Stop() the service. func NewValidatorConnExecutor( proTxHash types.ProTxHash, - eventBus *types.EventBus, + eventBus *eventbus.EventBus, connMgr p2p.DashDialer, opts ...optionFunc, ) (*ValidatorConnExecutor, error) { vc := &ValidatorConnExecutor{ + logger: log.NewNopLogger(), proTxHash: proTxHash, eventBus: eventBus, dialer: connMgr, @@ -89,8 +93,7 @@ func NewValidatorConnExecutor( resolverAddressBook: vc.dialer, resolverTCP: NewTCPNodeIDResolver(), } - baseService := service.NewBaseService(log.NewNopLogger(), validatorConnExecutorName, vc) - vc.BaseService = *baseService + vc.BaseService = service.NewBaseService(log.NewNopLogger(), validatorConnExecutorName, vc) for _, opt := range opts { err := opt(vc) @@ -119,27 +122,27 @@ func WithValidatorsSet(valSet *types.ValidatorSet) func(vc *ValidatorConnExecuto // WithLogger sets a logger func WithLogger(logger log.Logger) func(vc *ValidatorConnExecutor) error { return func(vc *ValidatorConnExecutor) error { - vc.Logger = logger + vc.logger = logger return nil } } // OnStart implements Service to subscribe to Validator Update events -func (vc *ValidatorConnExecutor) OnStart() error { +func (vc *ValidatorConnExecutor) OnStart(ctx context.Context) error { if err := vc.subscribe(); err != nil { return err } err := vc.updateConnections() if err != nil { - vc.Logger.Error("Warning: ValidatorConnExecutor OnStart failed", "error", err) + vc.logger.Error("Warning: ValidatorConnExecutor OnStart failed", "error", err) } go func() { var err error for err == nil { - err = vc.receiveEvents() + err = vc.receiveEvents(ctx) } - vc.Logger.Error("ValidatorConnExecutor goroutine finished", "reason", err) + vc.logger.Error("ValidatorConnExecutor goroutine finished", "reason", err) }() return nil } @@ -151,7 +154,7 @@ func (vc *ValidatorConnExecutor) OnStop() { defer cancel() err := vc.eventBus.UnsubscribeAll(ctx, validatorConnExecutorName) if err != nil { - vc.Logger.Error("cannot unsubscribe from channels", "error", err) + vc.logger.Error("cannot unsubscribe from channels", "error", err) } vc.eventBus = nil } @@ -161,11 +164,13 @@ func (vc *ValidatorConnExecutor) OnStop() { func (vc *ValidatorConnExecutor) subscribe() error { ctx, cancel := context.WithTimeout(context.Background(), defaultTimeout) defer cancel() - updatesSub, err := vc.eventBus.Subscribe( + updatesSub, err := vc.eventBus.SubscribeWithArgs( ctx, - validatorConnExecutorName, - types.EventQueryValidatorSetUpdates, - vc.EventBusCapacity, + tmpubsub.SubscribeArgs{ + ClientID: validatorConnExecutorName, + Query: types.EventQueryValidatorSetUpdates, + Limit: vc.EventBusCapacity, + }, ) if err != nil { return err @@ -177,45 +182,46 @@ func (vc *ValidatorConnExecutor) subscribe() error { // receiveEvents processes received events and executes all the logic. // Returns non-nil error only if fatal error occurred and the main goroutine should be terminated. -func (vc *ValidatorConnExecutor) receiveEvents() error { - vc.Logger.Debug("ValidatorConnExecutor: waiting for an event") - select { - case msg := <-vc.subscription.Out(): - event, ok := msg.Data().(types.EventDataValidatorSetUpdate) - if !ok { - return fmt.Errorf("invalid type of validator set update message: %T", event) - } - if err := vc.handleValidatorUpdateEvent(event); err != nil { - vc.Logger.Error("cannot handle validator update", "error", err) - return nil // non-fatal, so no error returned to continue the loop +func (vc *ValidatorConnExecutor) receiveEvents(ctx context.Context) error { + vc.logger.Debug("ValidatorConnExecutor: waiting for an event") + sCtx, cancel := context.WithCancel(ctx) // TODO check value for correctness + defer cancel() + msg, err := vc.subscription.Next(sCtx) + if err != nil { + if errors.Is(err, context.Canceled) { + return fmt.Errorf("subscription canceled due to error: %w", sCtx.Err()) } - vc.Logger.Debug("validator updates processed successfully", "event", event) - case <-vc.subscription.Canceled(): - return fmt.Errorf("subscription canceled due to error: %w", vc.subscription.Err()) - case <-vc.BaseService.Quit(): - return fmt.Errorf("quit signal received") + return err } - + event, ok := msg.Data().(types.EventDataValidatorSetUpdate) + if !ok { + return fmt.Errorf("invalid type of validator set update message: %T", event) + } + if err := vc.handleValidatorUpdateEvent(event); err != nil { + vc.logger.Error("cannot handle validator update", "error", err) + return nil // non-fatal, so no error returned to continue the loop + } + vc.logger.Debug("validator updates processed successfully", "event", event) return nil } -// handleValidatorUpdateEvent checks and executes event of type EventDataValidatorSetUpdates, received from event bus. +// handleValidatorUpdateEvent checks and executes event of type EventDataValidatorSetUpdate, received from event bus. func (vc *ValidatorConnExecutor) handleValidatorUpdateEvent(event types.EventDataValidatorSetUpdate) error { vc.mux.Lock() defer vc.mux.Unlock() if len(event.ValidatorSetUpdates) < 1 { - vc.Logger.Debug("no validators in ValidatorUpdates") + vc.logger.Debug("no validators in ValidatorUpdates") return nil // not really an error } vc.validatorSetMembers = newValidatorMap(event.ValidatorSetUpdates) if len(event.QuorumHash) > 0 { if err := vc.setQuorumHash(event.QuorumHash); err != nil { - vc.Logger.Error("received invalid quorum hash", "error", err) + vc.logger.Error("received invalid quorum hash", "error", err) return fmt.Errorf("received invalid quorum hash: %w", err) } } else { - vc.Logger.Debug("received empty quorum hash") + vc.logger.Debug("received empty quorum hash") } if err := vc.updateConnections(); err != nil { return fmt.Errorf("inter-validator set connections error: %w", err) @@ -257,7 +263,7 @@ func (vc *ValidatorConnExecutor) resolveNodeID(va *types.ValidatorAddress) error va.NodeID = address.NodeID return nil // success } - vc.Logger.Debug( + vc.logger.Debug( "warning: validator node id lookup method failed", "url", va.String(), "method", method, @@ -298,7 +304,7 @@ func (vc *ValidatorConnExecutor) ensureValidatorsHaveNodeIDs(validators []*types for _, validator := range validators { err := vc.resolveNodeID(&validator.NodeAddress) if err != nil { - vc.Logger.Error("cannot determine node id for validator, skipping", "url", validator.String(), "error", err) + vc.logger.Error("cannot determine node id for validator, skipping", "url", validator.String(), "error", err) continue } results = append(results, validator) @@ -311,7 +317,7 @@ func (vc *ValidatorConnExecutor) disconnectValidator(validator types.Validator) return err } id := validator.NodeAddress.NodeID - vc.Logger.Debug("disconnecting Validator", "validator", validator, "id", id, "address", validator.NodeAddress.String()) + vc.logger.Debug("disconnecting Validator", "validator", validator, "id", id, "address", validator.NodeAddress.String()) if err := vc.dialer.DisconnectAsync(id); err != nil { return err } @@ -327,10 +333,10 @@ func (vc *ValidatorConnExecutor) disconnectValidators(exceptions validatorMap) e if err := vc.disconnectValidator(validator); err != nil { if !errors.Is(err, errPeerNotFound) { // no return, as we see it as non-fatal - vc.Logger.Error("cannot disconnect Validator", "error", err) + vc.logger.Error("cannot disconnect Validator", "error", err) continue } - vc.Logger.Debug("Validator already disconnected", "error", err) + vc.logger.Debug("Validator already disconnected", "error", err) // We still delete the validator from vc.connectedValidators } delete(vc.connectedValidators, currentKey) @@ -350,7 +356,7 @@ func (vc *ValidatorConnExecutor) isValidator() bool { func (vc *ValidatorConnExecutor) updateConnections() error { // We only do something if we are part of new ValidatorSet if !vc.isValidator() { - vc.Logger.Debug("not a member of active ValidatorSet") + vc.logger.Debug("not a member of active ValidatorSet") // We need to disconnect connected validators. It needs to be done explicitly // because they are marked as persistent and will never disconnect themselves. return vc.disconnectValidators(validatorMap{}) @@ -359,22 +365,22 @@ func (vc *ValidatorConnExecutor) updateConnections() error { // Find new newValidators newValidators, err := vc.selectValidators() if err != nil { - vc.Logger.Error("cannot determine list of validators to connect", "error", err) + vc.logger.Error("cannot determine list of validators to connect", "error", err) // no return, as we still need to disconnect unused validators } // Disconnect existing validators unless they are selected to be connected again if err := vc.disconnectValidators(newValidators); err != nil { return fmt.Errorf("cannot disconnect unused validators: %w", err) } - vc.Logger.Debug("filtering validators", "validators", newValidators.String()) + vc.logger.Debug("filtering validators", "validators", newValidators.String()) // ensure that we can connect to all validators newValidators = vc.filterAddresses(newValidators) // Connect to new validators - vc.Logger.Debug("dialing validators", "validators", newValidators.String()) + vc.logger.Debug("dialing validators", "validators", newValidators.String()) if err := vc.dial(newValidators); err != nil { return fmt.Errorf("cannot dial validators: %w", err) } - vc.Logger.Debug("connected to Validators", "validators", newValidators.String()) + vc.logger.Debug("connected to Validators", "validators", newValidators.String()) return nil } @@ -383,20 +389,20 @@ func (vc *ValidatorConnExecutor) filterAddresses(validators validatorMap) valida filtered := make(validatorMap, len(validators)) for id, validator := range validators { if vc.proTxHash != nil && string(id) == vc.proTxHash.String() { - vc.Logger.Debug("validator is ourself", "id", id, "address", validator.NodeAddress.String()) + vc.logger.Debug("validator is ourself", "id", id, "address", validator.NodeAddress.String()) continue } if err := validator.ValidateBasic(); err != nil { - vc.Logger.Debug("validator address is invalid", "id", id, "address", validator.NodeAddress.String()) + vc.logger.Debug("validator address is invalid", "id", id, "address", validator.NodeAddress.String()) continue } if vc.connectedValidators.contains(validator) { - vc.Logger.Debug("validator already connected", "id", id) + vc.logger.Debug("validator already connected", "id", id) continue } if vc.dialer.IsDialingOrConnected(validator.NodeAddress.NodeID) { - vc.Logger.Debug("already dialing this validator", "id", id, "address", validator.NodeAddress.String()) + vc.logger.Debug("already dialing this validator", "id", id, "address", validator.NodeAddress.String()) continue } @@ -416,7 +422,7 @@ func (vc *ValidatorConnExecutor) dial(vals validatorMap) error { vc.connectedValidators[id] = validator address := nodeAddress(validator.NodeAddress) if err := vc.dialer.ConnectAsync(address); err != nil { - vc.Logger.Error("cannot dial validator", "address", address.String(), "err", err) + vc.logger.Error("cannot dial validator", "address", address.String(), "err", err) return fmt.Errorf("cannot dial validator %s: %w", address.String(), err) } } diff --git a/dash/quorum/validator_conn_executor_test.go b/dash/quorum/validator_conn_executor_test.go index 78fdbc84e9..376376fa93 100644 --- a/dash/quorum/validator_conn_executor_test.go +++ b/dash/quorum/validator_conn_executor_test.go @@ -7,6 +7,7 @@ import ( "time" "github.com/stretchr/testify/assert" + testifymock "github.com/stretchr/testify/mock" "github.com/stretchr/testify/require" dbm "github.com/tendermint/tm-db" @@ -15,9 +16,11 @@ import ( "github.com/tendermint/tendermint/crypto" "github.com/tendermint/tendermint/dash/quorum/mock" "github.com/tendermint/tendermint/dash/quorum/selectpeers" - mmock "github.com/tendermint/tendermint/internal/mempool/mock" + "github.com/tendermint/tendermint/internal/eventbus" + "github.com/tendermint/tendermint/internal/mempool/mocks" "github.com/tendermint/tendermint/internal/p2p" "github.com/tendermint/tendermint/internal/proxy" + "github.com/tendermint/tendermint/internal/pubsub" sm "github.com/tendermint/tendermint/internal/state" "github.com/tendermint/tendermint/internal/store" tmbytes "github.com/tendermint/tendermint/libs/bytes" @@ -27,12 +30,8 @@ import ( ) const ( - mySeedID uint16 = math.MaxUint16 - 1 -) - -var ( + mySeedID uint16 = math.MaxUint16 - 1 chainID = "execution_chain" - testPartSize uint32 = 65536 nTxsPerBlock = 10 ) @@ -342,54 +341,64 @@ func TestValidatorConnExecutor_ValidatorUpdatesSequence(t *testing.T) { // TestEndBlock verifies if ValidatorConnExecutor is called correctly during processing of EndBlock // message from the ABCI app. -func TestEndBlock(t *testing.T) { +func TestFinalizeBlock(t *testing.T) { const timeout = 3 * time.Second // how long we'll wait for connection + ctx, cancel := context.WithCancel(context.Background()) + defer cancel() + app := newTestApp() + logger := log.NewTestingLogger(t) - clientCreator := abciclient.NewLocalCreator(app) - require.NotNil(t, clientCreator) - proxyApp := proxy.NewAppConns(clientCreator, proxy.NopMetrics()) + client := abciclient.NewLocalClient(logger, app) + require.NotNil(t, client) + proxyApp := proxy.New(client, logger, proxy.NopMetrics()) require.NotNil(t, proxyApp) - err := proxyApp.Start() + err := proxyApp.Start(ctx) require.Nil(t, err) - defer proxyApp.Stop() //nolint:errcheck // ignore for tests state, stateDB, _ := makeState(3, 1) nodeProTxHash := state.Validators.Validators[0].ProTxHash stateStore := sm.NewStore(stateDB) blockStore := store.NewBlockStore(dbm.NewMemDB()) + eventBus := eventbus.NewDefault(logger) + require.NoError(t, eventBus.Start(ctx)) + + mp := mocks.NewMempool(t) + mp.On("Lock").Return() + mp.On("Unlock").Return() + mp.On("FlushAppConn", testifymock.Anything).Return(nil) + mp.On("Update", + testifymock.Anything, + testifymock.Anything, + testifymock.Anything, + testifymock.Anything, + testifymock.Anything, + testifymock.Anything).Return(nil) blockExec := sm.NewBlockExecutor( stateStore, - log.TestingLogger(), - proxyApp.Consensus(), - proxyApp.Query(), - mmock.Mempool{}, + logger, + proxyApp, + mp, sm.EmptyEvidencePool{}, blockStore, - nil, + eventBus, + sm.NopMetrics(), ) - eventBus := types.NewEventBus() - err = eventBus.Start() - require.NoError(t, err) - defer eventBus.Stop() //nolint:errcheck // ignore for tests - - blockExec.SetEventBus(eventBus) - - updatesSub, err := eventBus.Subscribe( - context.Background(), - "TestEndBlockValidatorUpdates", - types.EventQueryValidatorSetUpdates, + updatesSub, err := eventBus.SubscribeWithArgs( + ctx, + pubsub.SubscribeArgs{ + ClientID: "TestEndBlockValidatorUpdates", + Query: types.EventQueryValidatorSetUpdates, + }, ) require.NoError(t, err) block := makeBlock(state, 1, new(types.Commit)) - blockID := types.BlockID{ - Hash: block.Hash(), - PartSetHeader: block.MakePartSet(testPartSize).Header(), - } + blockID, err := block.BlockID() + require.NoError(t, err) vals := state.Validators proTxHashes := vals.GetProTxHashes() @@ -411,13 +420,12 @@ func TestEndBlock(t *testing.T) { proTxHash := newVals.Validators[0].ProTxHash vc, err := NewValidatorConnExecutor(proTxHash, eventBus, sw) require.NoError(t, err) - err = vc.Start() + err = vc.Start(ctx) require.NoError(t, err) - defer func() { err := vc.Stop(); require.NoError(t, err) }() app.ValidatorSetUpdates[1] = newVals.ABCIEquivalentValidatorUpdates() - state, err = blockExec.ApplyBlock(state, nodeProTxHash, blockID, block) + state, err = blockExec.ApplyBlock(ctx, state, nodeProTxHash, blockID, block) require.Nil(t, err) // test new validator was added to NextValidators require.Equal(t, state.Validators.Size()+100, state.NextValidators.Size()) @@ -426,31 +434,29 @@ func TestEndBlock(t *testing.T) { assert.Contains(t, nextValidatorsProTxHashes, addProTxHash) } + sCtx, sCancel := context.WithTimeout(ctx, 1*time.Second) + defer sCancel() // test we threw an event - select { - case msg := <-updatesSub.Out(): - event, ok := msg.Data().(types.EventDataValidatorSetUpdate) - require.True( + msg, err := updatesSub.Next(sCtx) + require.NoError(t, err) + + event, ok := msg.Data().(types.EventDataValidatorSetUpdate) + require.True( + t, + ok, + "Expected event of type EventDataValidatorSetUpdate, got %T", + msg.Data(), + ) + if assert.NotEmpty(t, event.ValidatorSetUpdates) { + for _, addProTxHash := range addProTxHashes { + assert.Contains(t, mock.ValidatorsProTxHashes(event.ValidatorSetUpdates), addProTxHash) + } + assert.EqualValues( t, - ok, - "Expected event of type EventDataValidatorSetUpdates, got %T", - msg.Data(), + types.DefaultDashVotingPower, + event.ValidatorSetUpdates[1].VotingPower, ) - if assert.NotEmpty(t, event.ValidatorSetUpdates) { - for _, addProTxHash := range addProTxHashes { - assert.Contains(t, mock.ValidatorsProTxHashes(event.ValidatorSetUpdates), addProTxHash) - } - assert.EqualValues( - t, - types.DefaultDashVotingPower, - event.ValidatorSetUpdates[1].VotingPower, - ) - assert.NotEmpty(t, event.QuorumHash) - } - case <-updatesSub.Canceled(): - t.Fatalf("updatesSub was canceled (reason: %v)", updatesSub.Err()) - case <-time.After(1 * time.Second): - t.Fatal("Did not receive EventValidatorSetUpdates within 1 sec.") + assert.NotEmpty(t, event.QuorumHash) } // ensure some history got generated inside the Switch; we expect 1 dial event @@ -475,7 +481,10 @@ func executeTestCase(t *testing.T, tc testCase) { // const TIMEOUT = 100 * time.Millisecond const TIMEOUT = 5 * time.Second - eventBus, sw, vc := setup(t, tc.me) + ctx, cancel := context.WithCancel(context.Background()) + defer cancel() + + eventBus, sw, vc := setup(ctx, t, tc.me) defer cleanup(t, eventBus, sw, vc) for updateID, update := range tc.validatorUpdates { @@ -560,28 +569,29 @@ func allowedParamsDefaults( // setup creates ValidatorConnExecutor and some dependencies. // Use `defer cleanup()` to free the resources. func setup( + ctx context.Context, t *testing.T, me *types.Validator, -) (eventBus *types.EventBus, sw *mock.DashDialer, vc *ValidatorConnExecutor) { - eventBus = types.NewEventBus() - err := eventBus.Start() +) (eventBus *eventbus.EventBus, sw *mock.DashDialer, vc *ValidatorConnExecutor) { + logger := log.NewTestingLogger(t) + eventBus = eventbus.NewDefault(logger) + err := eventBus.Start(ctx) require.NoError(t, err) sw = mock.NewDashDialer() - proTxHash := me.ProTxHash - vc, err = NewValidatorConnExecutor(proTxHash, eventBus, sw, WithLogger(log.TestingLogger())) + vc, err = NewValidatorConnExecutor(me.ProTxHash, eventBus, sw, WithLogger(logger)) require.NoError(t, err) - err = vc.Start() + err = vc.Start(ctx) require.NoError(t, err) return eventBus, sw, vc } // cleanup frees some resources allocated for tests -func cleanup(t *testing.T, bus *types.EventBus, dialer p2p.DashDialer, vc *ValidatorConnExecutor) { - assert.NoError(t, bus.Stop()) - assert.NoError(t, vc.Stop()) +func cleanup(t *testing.T, bus *eventbus.EventBus, dialer p2p.DashDialer, vc *ValidatorConnExecutor) { + bus.Stop() + vc.Stop() } // SOME UTILS // @@ -629,9 +639,10 @@ func makeState(nVals int, height int64) (sm.State, dbm.DB, map[string]types.Priv } func makeBlock(state sm.State, height int64, commit *types.Commit) *types.Block { - block, _ := state.MakeBlock(height, nil, makeTxs(state.LastBlockHeight), - commit, nil, state.Validators.GetProposer().ProTxHash, 0) - return block + return state.MakeBlock( + height, nil, makeTxs(state.LastBlockHeight), + commit, nil, state.Validators.GetProposer().ProTxHash, 0, + ) } // TEST APP // @@ -640,48 +651,47 @@ func makeBlock(state sm.State, height int64, commit *types.Commit) *types.Block type testApp struct { abci.BaseApplication - ByzantineValidators []abci.Evidence + ByzantineValidators []abci.Misbehavior ValidatorSetUpdates map[int64]*abci.ValidatorSetUpdate } func newTestApp() *testApp { return &testApp{ - ByzantineValidators: []abci.Evidence{}, + ByzantineValidators: []abci.Misbehavior{}, ValidatorSetUpdates: map[int64]*abci.ValidatorSetUpdate{}, } } var _ abci.Application = (*testApp)(nil) -func (app *testApp) Info(req abci.RequestInfo) (resInfo abci.ResponseInfo) { - return abci.ResponseInfo{} +func (app *testApp) Info(context.Context, *abci.RequestInfo) (*abci.ResponseInfo, error) { + return &abci.ResponseInfo{}, nil } -func (app *testApp) BeginBlock(req abci.RequestBeginBlock) abci.ResponseBeginBlock { +func (app *testApp) FinalizeBlock(_ context.Context, req *abci.RequestFinalizeBlock) (*abci.ResponseFinalizeBlock, error) { app.ByzantineValidators = req.ByzantineValidators - return abci.ResponseBeginBlock{} -} - -func (app *testApp) EndBlock(req abci.RequestEndBlock) abci.ResponseEndBlock { - return abci.ResponseEndBlock{ + txs := make([]*abci.ExecTxResult, 0, len(req.Txs)) + for _, tx := range req.Txs { + txs = append(txs, &abci.ExecTxResult{Data: tx}) + } + return &abci.ResponseFinalizeBlock{ + Events: []abci.Event{}, + TxResults: txs, ValidatorSetUpdate: app.ValidatorSetUpdates[req.Height], ConsensusParamUpdates: &tmproto.ConsensusParams{ - Version: &tmproto.VersionParams{ - AppVersion: 1}}} -} - -func (app *testApp) DeliverTx(req abci.RequestDeliverTx) abci.ResponseDeliverTx { - return abci.ResponseDeliverTx{Events: []abci.Event{}} + Version: &tmproto.VersionParams{AppVersion: 1}, + }, + }, nil } -func (app *testApp) CheckTx(req abci.RequestCheckTx) abci.ResponseCheckTx { - return abci.ResponseCheckTx{} +func (app *testApp) CheckTx(_ context.Context, req *abci.RequestCheckTx) (*abci.ResponseCheckTx, error) { + return &abci.ResponseCheckTx{Code: abci.CodeTypeOK}, nil } -func (app *testApp) Commit() abci.ResponseCommit { - return abci.ResponseCommit{RetainHeight: 1} +func (app *testApp) Commit(_ context.Context) (*abci.ResponseCommit, error) { + return &abci.ResponseCommit{RetainHeight: 1}, nil } -func (app *testApp) Query(reqQuery abci.RequestQuery) (resQuery abci.ResponseQuery) { - return +func (app *testApp) Query(_ context.Context, req *abci.RequestQuery) (*abci.ResponseQuery, error) { + return &abci.ResponseQuery{}, nil } diff --git a/docs/DOCS_README.md b/docs/DOCS_README.md index c1ab1580ab..da06785d57 100644 --- a/docs/DOCS_README.md +++ b/docs/DOCS_README.md @@ -11,9 +11,9 @@ and other supported release branches. There is a [GitHub Actions workflow](https://github.com/tendermint/docs/actions/workflows/deployment.yml) in the `tendermint/docs` repository that clones and builds the documentation -site from the contents of this `docs` directory, for `master` and for each -supported release branch. Under the hood, this workflow runs `make build-docs` -from the [Makefile](../Makefile#L214). +site from the contents of this `docs` directory, for `master` and for the +backport branch of each supported release. Under the hood, this workflow runs +`make build-docs` from the [Makefile](../Makefile#L214). The list of supported versions are defined in [`config.js`](./.vuepress/config.js), which defines the UI menu on the documentation site, and also in diff --git a/docs/README.md b/docs/README.md index a9b6925323..3137d611a7 100644 --- a/docs/README.md +++ b/docs/README.md @@ -21,7 +21,7 @@ Tendermint?](introduction/what-is-tendermint.md). To get started quickly with an example application, see the [quick start guide](introduction/quick-start.md). -To learn about application development on Tendermint, see the [Application Blockchain Interface](https://github.com/tendermint/spec/tree/master/spec/abci). +To learn about application development on Tendermint, see the [Application Blockchain Interface](../spec/abci). For more details on using Tendermint, see the respective documentation for [Tendermint Core](tendermint-core/), [benchmarking and monitoring](tools/), and [network deployments](nodes/). diff --git a/docs/app-dev/abci-cli.md b/docs/app-dev/abci-cli.md index 9768c32950..7649b7cde7 100644 --- a/docs/app-dev/abci-cli.md +++ b/docs/app-dev/abci-cli.md @@ -27,17 +27,17 @@ Usage: abci-cli [command] Available Commands: - batch Run a batch of abci commands against an application - check_tx Validate a tx - commit Commit the application state and return the Merkle root hash - console Start an interactive abci console for multiple commands - deliver_tx Deliver a new tx to the application - kvstore ABCI demo example - echo Have the application echo a message - help Help about any command - info Get some info about the application - query Query the application state - set_option Set an options on the application + batch Run a batch of abci commands against an application + check_tx Validate a tx + commit Commit the application state and return the Merkle root hash + console Start an interactive abci console for multiple commands + finalize_block Send a set of transactions to the application + kvstore ABCI demo example + echo Have the application echo a message + help Help about any command + info Get some info about the application + query Query the application state + set_option Set an options on the application Flags: --abci string socket or grpc (default "socket") @@ -53,7 +53,7 @@ Use "abci-cli [command] --help" for more information about a command. The `abci-cli` tool lets us send ABCI messages to our application, to help build and debug them. -The most important messages are `deliver_tx`, `check_tx`, and `commit`, +The most important messages are `finalize_block`, `check_tx`, and `commit`, but there are others for convenience, configuration, and information purposes. @@ -83,19 +83,19 @@ func cmdKVStore(cmd *cobra.Command, args []string) error { if err != nil { return err } + + // Stop upon receiving SIGTERM or CTRL-C. + ctx, cancel := signal.NotifyContext(context.Background(), os.Interrupt, syscall.SIGTERM) + defer cancel() + srv.SetLogger(logger.With("module", "abci-server")) - if err := srv.Start(); err != nil { + if err := srv.Start(ctx); err != nil { return err } - // Stop upon receiving SIGTERM or CTRL-C. - tmos.TrapSignal(logger, func() { - // Cleanup - srv.Stop() - }) - - // Run forever. - select {} + // Run until shutdown. +<-ctx.Done() +srv.Wait() } ``` @@ -173,7 +173,7 @@ Try running these commands: -> code: OK -> data.hex: 0x0000000000000000 -> deliver_tx "abc" +> finalize_block "abc" -> code: OK > info @@ -192,7 +192,7 @@ Try running these commands: -> value: abc -> value.hex: 616263 -> deliver_tx "def=xyz" +> finalize_block "def=xyz" -> code: OK > commit @@ -207,8 +207,8 @@ Try running these commands: -> value.hex: 78797A ``` -Note that if we do `deliver_tx "abc"` it will store `(abc, abc)`, but if -we do `deliver_tx "abc=efg"` it will store `(abc, efg)`. +Note that if we do `finalize_block "abc"` it will store `(abc, abc)`, but if +we do `finalize_block "abc=efg"` it will store `(abc, efg)`. Similarly, you could put the commands in a file and run `abci-cli --verbose batch < myfile`. diff --git a/docs/app-dev/app-architecture.md b/docs/app-dev/app-architecture.md index ec2822688c..f478547bca 100644 --- a/docs/app-dev/app-architecture.md +++ b/docs/app-dev/app-architecture.md @@ -57,4 +57,4 @@ See the following for more extensive documentation: - [Interchain Standard for the Light-Client REST API](https://github.com/cosmos/cosmos-sdk/pull/1028) - [Tendermint RPC Docs](https://docs.tendermint.com/master/rpc/) - [Tendermint in Production](../tendermint-core/running-in-production.md) -- [ABCI spec](https://github.com/tendermint/spec/tree/95cf253b6df623066ff7cd4074a94e7a3f147c7a/spec/abci) +- [ABCI spec](https://github.com/tendermint/tendermint/tree/95cf253b6df623066ff7cd4074a94e7a3f147c7a/spec/abci) diff --git a/docs/app-dev/getting-started.md b/docs/app-dev/getting-started.md index 2f5739e0f1..a480137cac 100644 --- a/docs/app-dev/getting-started.md +++ b/docs/app-dev/getting-started.md @@ -96,25 +96,21 @@ like: ```json { - "jsonrpc": "2.0", - "id": "", - "result": { - "check_tx": {}, - "deliver_tx": { - "tags": [ - { - "key": "YXBwLmNyZWF0b3I=", - "value": "amFl" - }, - { - "key": "YXBwLmtleQ==", - "value": "YWJjZA==" - } - ] - }, - "hash": "9DF66553F98DE3C26E3C3317A3E4CED54F714E39", - "height": 14 - } + "check_tx": { ... }, + "deliver_tx": { + "tags": [ + { + "key": "YXBwLmNyZWF0b3I=", + "value": "amFl" + }, + { + "key": "YXBwLmtleQ==", + "value": "YWJjZA==" + } + ] + }, + "hash": "9DF66553F98DE3C26E3C3317A3E4CED54F714E39", + "height": 14 } ``` @@ -129,15 +125,11 @@ The result should look like: ```json { - "jsonrpc": "2.0", - "id": "", - "result": { - "response": { - "log": "exists", - "index": "-1", - "key": "YWJjZA==", - "value": "YWJjZA==" - } + "response": { + "log": "exists", + "index": "-1", + "key": "YWJjZA==", + "value": "YWJjZA==" } } ``` @@ -190,7 +182,7 @@ node example/counter.js In another window, reset and start `tendermint`: ```sh -tendermint unsafe-reset-all +tendermint reset unsafe-all tendermint start ``` diff --git a/docs/app-dev/indexing-transactions.md b/docs/app-dev/indexing-transactions.md index b8b06d01b9..67d17c8794 100644 --- a/docs/app-dev/indexing-transactions.md +++ b/docs/app-dev/indexing-transactions.md @@ -15,7 +15,7 @@ the block itself is never stored. Each event contains a type and a list of attributes, which are key-value pairs denoting something about what happened during the method's execution. For more details on `Events`, see the -[ABCI](https://github.com/tendermint/spec/blob/master/spec/abci/abci.md#events) +[ABCI](https://github.com/tendermint/tendermint/blob/master/spec/abci/abci.md#events) documentation. An `Event` has a composite key associated with it. A `compositeKey` is diff --git a/docs/app-dev/readme.md b/docs/app-dev/readme.md index 51e88fc34a..46ce06ca00 100644 --- a/docs/app-dev/readme.md +++ b/docs/app-dev/readme.md @@ -1,7 +1,6 @@ --- order: false parent: + title: "Building Applications" order: 3 ---- - -# Apps +--- \ No newline at end of file diff --git a/docs/architecture/adr-073-libp2p.md b/docs/architecture/adr-073-libp2p.md new file mode 100644 index 0000000000..080fecbcdf --- /dev/null +++ b/docs/architecture/adr-073-libp2p.md @@ -0,0 +1,235 @@ +# ADR 073: Adopt LibP2P + +## Changelog + +- 2021-11-02: Initial Draft (@tychoish) + +## Status + +Proposed. + +## Context + + +As part of the 0.35 development cycle, the Tendermint team completed +the first phase of the work described in ADRs 61 and 62, which included a +large scale refactoring of the reactors and the p2p message +routing. This replaced the switch and many of the other legacy +components without breaking protocol or network-level +interoperability and left the legacy connection/socket handling code. + +Following the release, the team has reexamined the state of the code +and the design, as well as Tendermint's requirements. The notes +from that process are available in the [P2P Roadmap +RFC][rfc]. + +This ADR supersedes the decisions made in ADRs 60 and 61, but +builds on the completed portions of this work. Previously, the +boundaries of peer management, message handling, and the higher level +business logic (e.g., "the reactors") were intermingled, and core +elements of the p2p system were responsible for the orchestration of +higher-level business logic. Refactoring the legacy components +made it more obvious that this entanglement of responsibilities +had outsized influence on the entire implementation, making +it difficult to iterate within the current abstractions. +It would not be viable to maintain interoperability with legacy +systems while also achieving many of our broader objectives. + +LibP2P is a thoroughly-specified implementation of a peer-to-peer +networking stack, designed specifically for systems such as +ours. Adopting LibP2P as the basis of Tendermint will allow the +Tendermint team to focus more of their time on other differentiating +aspects of the system, and make it possible for the ecosystem as a +whole to take advantage of tooling and efforts of the LibP2P +platform. + +## Alternative Approaches + +As discussed in the [P2P Roadmap RFC][rfc], the primary alternative would be to +continue development of Tendermint's home-grown peer-to-peer +layer. While that would give the Tendermint team maximal control +over the peer system, the current design is unexceptional on its +own merits, and the prospective maintenance burden for this system +exceeds our tolerances for the medium term. + +Tendermint can and should differentiate itself not on the basis of +its networking implementation or peer management tools, but providing +a consistent operator experience, a battle-tested consensus algorithm, +and an ergonomic user experience. + +## Decision + +Tendermint will adopt libp2p during the 0.37 development cycle, +replacing the bespoke Tendermint P2P stack. This will remove the +`Endpoint`, `Transport`, `Connection`, and `PeerManager` abstractions +and leave the reactors, `p2p.Router` and `p2p.Channel` +abstractions. + +LibP2P may obviate the need for a dedicated peer exchange (PEX) +reactor, which would also in turn obviate the need for a dedicated +seed mode. If this is the case, then all of this functionality would +be removed. + +If it turns out (based on the advice of Protocol Labs) that it makes +sense to maintain separate pubsub or gossipsub topics +per-message-type, then the `Router` abstraction could also +be entirely subsumed. + +## Detailed Design + +### Implementation Changes + +The seams in the P2P implementation between the higher level +constructs (reactors), the routing layer (`Router`) and the lower +level connection and peer management code make this operation +relatively straightforward to implement. A key +goal in this design is to minimize the impact on the reactors +(potentially entirely,) and completely remove the lower level +components (e.g., `Transport`, `Connection` and `PeerManager`) using the +separation afforded by the `Router` layer. The current state of the +code makes these changes relatively surgical, and limited to a small +number of methods: + +- `p2p.Router.OpenChannel` will still return a `Channel` structure + which will continue to serve as a pipe between the reactors and the + `Router`. The implementation will no longer need the queue + implementation, and will instead start goroutines that + are responsible for routing the messages from the channel to libp2p + fundamentals, replacing the current `p2p.Router.routeChannel`. + +- The current `p2p.Router.dialPeers` and `p2p.Router.acceptPeers`, + are responsible for establishing outbound and inbound connections, + respectively. These methods will be removed, along with + `p2p.Router.openConnection`, and the libp2p connection manager will + be responsible for maintaining network connectivity. + +- The `p2p.Channel` interface will change to replace Go + channels with a more functional interface for sending messages. + New methods on this object will take contexts to support safe + cancellation, and return errors, and will block rather than + running asynchronously. The `Out` channel through which + reactors send messages to Peers, will be replaced by a `Send` + method, and the Error channel will be replaced by an `Error` + method. + +- Reactors will be passed an interface that will allow them to + access Peer information from libp2p. This will supplant the + `p2p.PeerUpdates` subscription. + +- Add some kind of heartbeat message at the application level + (e.g. with a reactor,) potentially connected to libp2p's DHT to be + used by reactors for service discovery, message targeting, or other + features. + +- Replace the existing/legacy handshake protocol with [Noise](http://www.noiseprotocol.org/noise.html). + +This project will initially use the TCP-based transport protocols within +libp2p. QUIC is also available as an option that we may implement later. +We will not support mixed networks in the initial release, but will +revisit that possibility later if there is a demonstrated need. + +### Upgrade and Compatibility + +Because the routers and all current P2P libraries are `internal` +packages and not part of the public API, the only changes to the public +API surface area of Tendermint will be different configuration +file options, replacing the current P2P options with options relevant +to libp2p. + +However, it will not be possible to run a network with both networking +stacks active at once, so the upgrade to the version of Tendermint +will need to be coordinated between all nodes of the network. This is +consistent with the expectations around upgrades for Tendermint moving +forward, and will help manage both the complexity of the project and +the implementation timeline. + +## Open Questions + +- What is the role of Protocol Labs in the implementation of libp2p in + tendermint, both during the initial implementation and on an ongoing + basis thereafter? + +- Should all P2P traffic for a given node be pushed to a single topic, + so that a topic maps to a specific ChainID, or should + each reactor (or type of message) have its own topic? How many + topics can a libp2p network support? Is there testing that validates + the capabilities? + +- Tendermint presently provides a very coarse QoS-like functionality + using priorities based on message-type. + This intuitively/theoretically ensures that evidence and consensus + messages don't get starved by blocksync/statesync messages. It's + unclear if we can or should attempt to replicate this with libp2p. + +- What kind of QoS functionality does libp2p provide and what kind of + metrics does libp2p provide about it's QoS functionality? + +- Is it possible to store additional (and potentially arbitrary) + information into the DHT as part of the heartbeats between nodes, + such as the latest height, and then access that in the + reactors. How frequently can the DHT be updated? + +- Does it make sense to have reactors continue to consume inbound + messages from a Channel (`In`) or is there another interface or + pattern that we should consider? + + - We should avoid exposing Go channels when possible, and likely + some kind of alternate iterator likely makes sense for processing + messages within the reactors. + +- What are the security and protocol implications of tracking + information from peer heartbeats and exposing that to reactors? + +- How much (or how little) configuration can Tendermint provide for + libp2p, particularly on the first release? + + - In general, we should not support byo-functionality for libp2p + components within Tendermint, and reduce the configuration surface + area, as much as possible. + +- What are the best ways to provide request/response semantics for + reactors on top of libp2p? Will it be possible to add + request/response semantics in a future release or is there + anticipatory work that needs to be done as part of the initial + release? + +## Consequences + +### Positive + +- Reduce the maintenance burden for the Tendermint Core team by + removing a large swath of legacy code that has proven to be + difficult to modify safely. + +- Remove the responsibility for maintaining and developing the entire + peer management system (p2p) and stack. + +- Provide users with a more stable peer and networking system, + Tendermint can improve operator experience and network stability. + +### Negative + +- By deferring to library implementations for peer management and + networking, Tendermint loses some flexibility for innovating at the + peer and networking level. However, Tendermint should be innovating + primarily at the consensus layer, and libp2p does not preclude + optimization or development in the peer layer. + +- Libp2p is a large dependency and Tendermint would become dependent + upon Protocol Labs' release cycle and prioritization for bug + fixes. If this proves onerous, it's possible to maintain a vendor + fork of relevant components as needed. + +### Neutral + +- N/A + +## References + +- [ADR 61: P2P Refactor Scope][adr61] +- [ADR 62: P2P Architecture][adr62] +- [P2P Roadmap RFC][rfc] + +[adr61]: ./adr-061-p2p-refactor-scope.md +[adr62]: ./adr-062-p2p-architecture.md +[rfc]: ../rfc/rfc-000-p2p-roadmap.rst diff --git a/docs/architecture/adr-074-timeout-params.md b/docs/architecture/adr-074-timeout-params.md new file mode 100644 index 0000000000..22fd784bd9 --- /dev/null +++ b/docs/architecture/adr-074-timeout-params.md @@ -0,0 +1,203 @@ +# ADR 74: Migrate Timeout Parameters to Consensus Parameters + +## Changelog + +- 03-Jan-2022: Initial draft (@williambanfield) +- 13-Jan-2022: Updated to indicate work on upgrade path needed (@williambanfield) + +## Status + +Proposed + +## Context + +### Background + +Tendermint's consensus timeout parameters are currently configured locally by each validator +in the validator's [config.toml][config-toml]. +This means that the validators on a Tendermint network may have different timeouts +from each other. There is no reason for validators on the same network to configure +different timeout values. Proper functioning of the Tendermint consensus algorithm +relies on these parameters being uniform across validators. + +The configurable values are as follows: + +* `TimeoutPropose` + * How long the consensus algorithm waits for a proposal block before issuing a prevote. + * If no prevote arrives by `TimeoutPropose`, then the consensus algorithm will issue a nil prevote. +* `TimeoutProposeDelta` + * How much the `TimeoutPropose` grows each round. +* `TimeoutPrevote` + * How long the consensus algorithm waits after receiving +2/3 prevotes with + no quorum for a value before issuing a precommit for nil. + (See the [arXiv paper][arxiv-paper], Algorithm 1, Line 34) +* `TimeoutPrevoteDelta` + * How much the `TimeoutPrevote` increases with each round. +* `TimeoutPrecommit` + * How long the consensus algorithm waits after receiving +2/3 precommits that + do not have a quorum for a value before entering the next round. + (See the [arXiv paper][arxiv-paper], Algorithm 1, Line 47) +* `TimeoutPrecommitDelta` + * How much the `TimeoutPrecommit` increases with each round. +* `TimeoutCommit` + * How long the consensus algorithm waits after committing a block but before starting the new height. + * This gives a validator a chance to receive slow precommits. +* `SkipTimeoutCommit` + * Make progress as soon as the node has 100% of the precommits. + + +### Overview of Change + +We will consolidate the timeout parameters and migrate them from the node-local +`config.toml` file into the network-global consensus parameters. + +The 8 timeout parameters will be consolidated down to 6. These will be as follows: + +* `TimeoutPropose` + * Same as current `TimeoutPropose`. +* `TimeoutProposeDelta` + * Same as current `TimeoutProposeDelta`. +* `TimeoutVote` + * How long validators wait for votes in both the prevote + and precommit phase of the consensus algorithm. This parameter subsumes + the current `TimeoutPrevote` and `TimeoutPrecommit` parameters. +* `TimeoutVoteDelta` + * How much the `TimeoutVote` will grow each successive round. + This parameter subsumes the current `TimeoutPrevoteDelta` and `TimeoutPrecommitDelta` + parameters. +* `TimeoutCommit` + * Same as current `TimeoutCommit`. +* `BypassCommitTimeout` + * Same as current `SkipTimeoutCommit`, renamed for clarity. + +A safe default will be provided by Tendermint for each of these parameters and +networks will be able to update the parameters as they see fit. Local updates +to these parameters will no longer be possible; instead, the application will control +updating the parameters. Applications using the Cosmos SDK will be automatically be +able to change the values of these consensus parameters [via a governance proposal][cosmos-sdk-consensus-params]. + +This change is low-risk. While parameters are locally configurable, many running chains +do not change them from their default values. For example, initializing +a node on Osmosis, Terra, and the Cosmos Hub using the their `init` command produces +a `config.toml` with Tendermint's default values for these parameters. + +### Why this parameter consolidation? + +Reducing the number of parameters is good for UX. Fewer superfluous parameters makes +running and operating a Tendermint network less confusing. + +The Prevote and Precommit messages are both similar sizes, require similar amounts +of processing so there is no strong need for them to be configured separately. + +The `TimeoutPropose` parameter governs how long Tendermint will wait for the proposed +block to be gossiped. Blocks are much larger than votes and therefore tend to be +gossiped much more slowly. It therefore makes sense to keep `TimeoutPropose` and +the `TimeoutProposeDelta` as parameters separate from the vote timeouts. + +`TimeoutCommit` is used by chains to ensure that the network waits for the votes from +slower validators before proceeding to the next height. Without this timeout, the votes +from slower validators would consistently not be included in blocks and those validators +would not be counted as 'up' from the chain's perspective. Being down damages a validator's +reputation and causes potential stakers to think twice before delegating to that validator. + +`TimeoutCommit` also prevents the network from producing the next height as soon as validators +on the fastest hardware with a summed voting power of +2/3 of the network's total have +completed execution of the block. Allowing the network to proceed as soon as the fastest ++2/3 completed execution would have a cumulative effect over heights, eventually +leaving slower validators unable to participate in consensus at all. `TimeoutCommit` +therefore allows networks to have greater variability in hardware. Additional +discussion of this can be found in [tendermint issue 5911][tendermint-issue-5911-comment] +and [spec issue 359][spec-issue-359]. + +## Alternative Approaches + +### Hardcode the parameters + +Many Tendermint networks run on similar cloud-hosted infrastructure. Therefore, +they have similar bandwidth and machine resources. The timings for propagating votes +and blocks are likely to be reasonably similar across networks. As a result, the +timeout parameters are good candidates for being hardcoded. Hardcoding the timeouts +in Tendermint would mean entirely removing these parameters from any configuration +that could be altered by either an application or a node operator. Instead, +Tendermint would ship with a set of timeouts and all applications using Tendermint +would use this exact same set of values. + +While Tendermint nodes often run with similar bandwidth and on similar cloud-hosted +machines, there are enough points of variability to make configuring +consensus timeouts meaningful. Namely, Tendermint network topologies are likely to be +very different from chain to chain. Additionally, applications may vary greatly in +how long the `Commit` phase may take. Applications that perform more work during `Commit` +require a longer `TimeoutCommit` to allow the application to complete its work +and be prepared for the next height. + +## Decision + +The decision has been made to implement this work, with the caveat that the +specific mechanism for introducing the new parameters to chains is still ongoing. + +## Detailed Design + +### New Consensus Parameters + +A new `TimeoutParams` `message` will be added to the [params.proto file][consensus-params-proto]. +This message will have the following form: + +```proto +message TimeoutParams { + google.protobuf.Duration propose = 1; + google.protobuf.Duration propose_delta = 2; + google.protobuf.Duration vote = 3; + google.protobuf.Duration vote_delta = 4; + google.protobuf.Duration commit = 5; + bool bypass_commit_timeout = 6; +} +``` + +This new message will be added as a field into the [`ConsensusParams` +message][consensus-params-proto]. The same default values that are [currently +set for these parameters][current-timeout-defaults] in the local configuration +file will be used as the defaults for these new consensus parameters in the +[consensus parameter defaults][default-consensus-params]. + +The new consensus parameters will be subject to the same +[validity rules][time-param-validation] as the current configuration values, +namely, each value must be non-negative. + +### Migration + +The new `ConsensusParameters` will be added during an upcoming release. In this +release, the old `config.toml` parameters will cease to control the timeouts and +an error will be logged on nodes that continue to specify these values. The specific +mechanism by which these parameters will added to a chain is being discussed in +[RFC-009][rfc-009] and will be decided ahead of the next release. + +The specific mechanism for adding these parameters depends on work related to +[soft upgrades][soft-upgrades], which is still ongoing. + +## Consequences + +### Positive + +* Timeout parameters will be equal across all of the validators in a Tendermint network. +* Remove superfluous timeout parameters. + +### Negative + +### Neutral + +* Timeout parameters require consensus to change. + +## References + +[conseusus-params-proto]: https://github.com/tendermint/spec/blob/a00de7199f5558cdd6245bbbcd1d8405ccfb8129/proto/tendermint/types/params.proto#L11 +[hashed-params]: https://github.com/tendermint/tendermint/blob/7cdf560173dee6773b80d1c574a06489d4c394fe/types/params.go#L49 +[default-consensus-params]: https://github.com/tendermint/tendermint/blob/7cdf560173dee6773b80d1c574a06489d4c394fe/types/params.go#L79 +[current-timeout-defaults]: https://github.com/tendermint/tendermint/blob/7cdf560173dee6773b80d1c574a06489d4c394fe/config/config.go#L955 +[config-toml]: https://github.com/tendermint/tendermint/blob/5cc980698a3402afce76b26693ab54b8f67f038b/config/toml.go#L425-L440 +[cosmos-sdk-consensus-params]: https://github.com/cosmos/cosmos-sdk/issues/6197 +[time-param-validation]: https://github.com/tendermint/tendermint/blob/7cdf560173dee6773b80d1c574a06489d4c394fe/config/config.go#L1038 +[tendermint-issue-5911-comment]: https://github.com/tendermint/tendermint/issues/5911#issuecomment-973560381 +[spec-issue-359]: https://github.com/tendermint/spec/issues/359 +[arxiv-paper]: https://arxiv.org/pdf/1807.04938.pdf +[soft-upgrades]: https://github.com/tendermint/spec/pull/222 +[rfc-009]: https://github.com/tendermint/tendermint/pull/7524 diff --git a/docs/architecture/adr-075-rpc-subscription.md b/docs/architecture/adr-075-rpc-subscription.md new file mode 100644 index 0000000000..1ca48e7123 --- /dev/null +++ b/docs/architecture/adr-075-rpc-subscription.md @@ -0,0 +1,684 @@ +# ADR 075: RPC Event Subscription Interface + +## Changelog + +- 01-Mar-2022: Update long-polling interface (@creachadair). +- 10-Feb-2022: Updates to reflect implementation. +- 26-Jan-2022: Marked accepted. +- 22-Jan-2022: Updated and expanded (@creachadair). +- 20-Nov-2021: Initial draft (@creachadair). + +--- +## Status + +Accepted + +--- +## Background & Context + +For context, see [RFC 006: Event Subscription][rfc006]. + +The [Tendermint RPC service][rpc-service] permits clients to subscribe to the +event stream generated by a consensus node. This allows clients to observe the +state of the consensus network, including details of the consensus algorithm +state machine, proposals, transaction delivery, and block completion. The +application may also attach custom key-value attributes to events to expose +application-specific details to clients. + +The event subscription API in the RPC service currently comprises three methods: + +1. `subscribe`: A request to subscribe to the events matching a specific + [query expression][query-grammar]. Events can be filtered by their key-value + attributes, including custom attributes provided by the application. + +2. `unsubscribe`: A request to cancel an existing subscription based on its + query expression. + +3. `unsubscribe_all`: A request to cancel all existing subscriptions belonging + to the client. + +There are some important technical and UX issues with the current RPC event +subscription API. The rest of this ADR outlines these problems in detail, and +proposes a new API scheme intended to address them. + +### Issue 1: Persistent connections + +To subscribe to a node's event stream, a client needs a persistent connection +to the node. Unlike the other methods of the service, for which each call is +serviced by a short-lived HTTP round trip, subscription delivers a continuous +stream of events to the client by hijacking the HTTP channel for a websocket. +The stream (and hence the HTTP request) persists until either the subscription +is explicitly cancelled, or the connection is closed. + +There are several problems with this API: + +1. **Expensive per-connection state**: The server must maintain a substantial + amount of state per subscriber client: + + - The current implementation uses a [WebSocket][ws] for each active + subscriber. The connection must be maintained even if there are no + matching events for a given client. + + The server can drop idle connections to save resources, but doing so + terminates all subscriptions on those connections and forces those clients + to re-connect, adding additional resource churn for the server. + + - In addition, the server maintains a separate buffer of undelivered events + for each client. This is to reduce the dual risks that a client will miss + events, and that a slow client could "push back" on the publisher, + impeding the progress of consensus. + + Because event traffic is quite bursty, queues can potentially take up a + lot of memory. Moreover, each subscriber may have a different filter + query, so the server winds up having to duplicate the same events among + multiple subscriber queues. Not only does this add memory pressure, but it + does so most at the worst possible time, i.e., when the server is already + under load from high event traffic. + +2. **Operational access control is difficult**: The server's websocket + interface exposes _all_ the RPC service endpoints, not only the subscription + methods. This includes methods that allow callers to inject arbitrary + transactions (`broadcast_tx_*`) and evidence (`broadcast_evidence`) into the + network, remove transactions (`remove_tx`), and request arbitrary amounts of + chain state. + + Filtering requests to the GET endpoint is straightforward: A reverse proxy + like [nginx][nginx] can easily filter methods by URL path. Filtering POST + requests takes a bit more work, but can be managed with a filter program + that speaks [FastCGI][fcgi] and parses JSON-RPC request bodies. + + Filtering the websocket interface requires a dedicated proxy implementation. + Although nginx can [reverse-proxy websockets][rp-ws], it does not support + filtering websocket traffic via FastCGI. The operator would need to either + implement a custom [nginx extension module][ng-xm] or build and run a + standalone proxy that implements websocket and filters each session. Apart + from the work, this also makes the system even more resource intensive, as + well as introducing yet another connection that could potentially time out + or stall on full buffers. + + Even for the simple case of restricting access to only event subscription, + there is no easy solution currently: Once a caller has access to the + websocket endpoint, it has complete access to the RPC service. + +### Issue 2: Inconvenient client API + +The subscription interface has some inconvenient features for the client as +well as the server. These include: + +1. **Non-standard protocol:** The RPC service is mostly [JSON-RPC 2.0][jsonrpc2], + but the subscription interface diverges from the standard. + + In a standard JSON-RPC 2.0 call, the client initiates a request to the + server with a unique ID, and the server concludes the call by sending a + reply for that ID. The `subscribe` implementation, however, sends multiple + responses to the client's request: + + - The client sends `subscribe` with some ID `x` and the desired query + + - The server responds with ID `x` and an empty confirmation response. + + - The server then (repeatedly) sends event result responses with ID `x`, one + for each item with a matching event. + + Standard JSON-RPC clients will reject the subsequent replies, as they + announce a request ID (`x`) that is already complete. This means a caller + has to implement Tendermint-specific handling for these responses. + + Moreover, the result format is different between the initial confirmation + and the subsequent responses. This means a caller has to implement special + logic for decoding the first response versus the subsequent ones. + +2. **No way to detect data loss:** The subscriber connection can be terminated + for many reasons. Even ignoring ordinary network issues (e.g., packet loss): + + - The server will drop messages and/or close the websocket if its write + buffer fills, or if the queue of undelivered matching events is not + drained fast enough. The client has no way to discover that messages were + dropped even if the connection remains open. + + - Either the client or the server may close the websocket if the websocket + PING and PONG exchanges are not handled correctly, or frequently enough. + Even if correctly implemented, this may fail if the system is under high + load and cannot service those control messages in a timely manner. + + When the connection is terminated, the server drops all the subscriptions + for that client (as if it had called `unsubscribe_all`). Even if the client + reconnects, any events that were published during the period between the + disconnect and re-connect and re-subscription will be silently lost, and the + client has no way to discover that it missed some relevant messages. + +3. **No way to replay old events:** Even if a client knew it had missed some + events (due to a disconnection, for example), the API provides no way for + the client to "play back" events it may have missed. + +4. **Large response sizes:** Some event data can be quite large, and there can + be substantial duplication across items. The API allows the client to select + _which_ events are reported, but has no way to control which parts of a + matching event it wishes to receive. + + This can be costly on the server (which has to marshal those data into + JSON), the network, and the client (which has to unmarshal the result and + then pick through for the components that are relevant to it). + + Besides being inefficient, this also contributes to some of the persistent + connection issues mentioned above, e.g., filling up the websocket write + buffer and forcing the server to queue potentially several copies of a large + value in memory. + +5. **Client identity is tied to network address:** The Tendermint event API + identifies each subscriber by a (Client ID, Query) pair. In the RPC service, + the query is provided by the client, but the client ID is set to the TCP + address of the client (typically "host:port" or "ip:port"). + + This means that even if the server did _not_ drop subscriptions immediately + when the websocket connection is closed, a client may not be able to + reattach to its existing subscription. Dialing a new connection is likely + to result in a different port (and, depending on their own proxy setup, + possibly a different public IP). + + In isolation, this problem would be easy to work around with a new + subscription parameter, but it would require several other changes to the + handling of event subscriptions for that workaround to become useful. + +--- +## Decision + +To address the described problems, we will: + +1. Introduce a new API for event subscription to the Tendermint RPC service. + The proposed API is described in [Detailed Design](#detailed-design) below. + +2. This new API will target the Tendermint v0.36 release, during which the + current ("streaming") API will remain available as-is, but deprecated. + +3. The streaming API will be entirely removed in release v0.37, which will + require all users of event subscription to switch to the new API. + +> **Point for discussion:** Given that ABCI++ and PBTS are the main priorities +> for v0.36, it would be fine to slip the first phase of this work to v0.37. +> Unless there is a time problem, however, the proposed design does not disrupt +> the work on ABCI++ or PBTS, and will not increase the scope of breaking +> changes. Therefore the plan is to begin in v0.36 and slip only if necessary. + +--- +## Detailed Design + +### Design Goals + +Specific goals of this design include: + +1. Remove the need for a persistent connection to each subscription client. + Subscribers should use the same HTTP request flow for event subscription + requests as for other RPC calls. + +2. The server retains minimal state (possibly none) per-subscriber. In + particular: + + - The server does not buffer unconsumed writes nor queue undelivered events + on a per-client basis. + - A client that stalls or goes idle does not cost the server any resources. + - Any event data that is buffered or stored is shared among _all_ + subscribers, and is not duplicated per client. + +3. Slow clients have no impact (or minimal impact) on the rate of progress of + the consensus algorithm, beyond the ambient overhead of servicing individual + RPC requests. + +4. Clients can tell when they have missed events matching their subscription, + within some reasonable (configurable) window of time, and can "replay" + events within that window to catch up. + +5. Nice to have: It should be easy to use the event subscription API from + existing standard tools and libraries, including command-line use for + testing and experimentation. + +### Definitions + +- The **event stream** of a node is a single, time-ordered, heterogeneous + stream of event items. + +- Each **event item** comprises an **event datum** (for example, block header + metadata for a new-block event), and zero or more optional **events**. + +- An **event** means the [ABCI `Event` data type][abci-event], which comprises + a string type and zero or more string key-value **event attributes**. + + The use of the new terms "event item" and "event datum" is to avert confusion + between the values that are published to the event bus (what we call here + "event items") and the ABCI `Event` data type. + +- The node assigns each event item a unique identifier string called a + **cursor**. A cursor must be unique among all events published by a single + node, but it is not required to be unique globally across nodes. + + Cursors are time-ordered so that given event items A and B, if A was + published before B, then cursor(A) < cursor(B) in lexicographic order. + + A minimum viable cursor implementation is a tuple consisting of a timestamp + and a sequence number (e.g., `16CCC798FB5F4670-0123`). However, it may also + be useful to append basic type information to a cursor, to allow efficient + filtering (e.g., `16CCC87E91869050-0091:BeginBlock`). + + The initial implementation will use the minimum viable format. + +### Discussion + +The node maintains an **event log**, a shared ordered record of the events +published to its event bus within an operator-configurable time window. The +initial implementation will store the event log in-memory, and the operator +will be given two per-node configuration settings. Note, these names are +provisional: + +- `[rpc] event-log-window-size`: A duration before the latest published event, + during which the node will retain event items published. Setting this value + to zero disables event subscription. + +- `[rpc] event-log-max-items`: A maximum number of event items that the node + will retain within the time window. If the number of items exceeds this + value, the node discardes the oldest items in the window. Setting this value + to zero means that no limit is imposed on the number of items. + +The node will retain all events within the time window, provided they do not +exceed the maximum number. These config parameters allow the operator to +loosely regulate how much memory and storage the node allocates to the event +log. The client can use the server reply to tell whether the events it wants +are still available from the event log. + +The event log is shared among all subscribers to the node. + +> **Discussion point:** Should events persist across node restarts? +> +> The current event API does not persist events across restarts, so this new +> design does not either. Note, however, that we may "spill" older event data +> to disk as a way of controlling memory use. Such usage is ephemeral, however, +> and does not need to be tracked as node data (e.g., it could be temp files). + +### Query API + +To retrieve event data, the client will call the (new) RPC method `events`. +The parameters of this method will correspond to the following Go types: + +```go +type EventParams struct { + // Optional filter spec. If nil or empty, all items are eligible. + Filter *Filter `json:"filter"` + + // The maximum number of eligible results to return. + // If zero or negative, the server will report a default number. + MaxResults int `json:"max_results"` + + // Return only items after this cursor. If empty, the limit is just + // before the the beginning of the event log. + After string `json:"after"` + + // Return only items before this cursor. If empty, the limit is just + // after the head of the event log. + Before string `json:"before"` + + // Wait for up to this long for events to be available. + WaitTime time.Duration `json:"wait_time"` +} + +type Filter struct { + Query string `json:"query"` +} +``` + +> **Discussion point:** The initial implementation will not cache filter +> queries for the client. If this turns out to be a performance issue in +> production, the service can keep a small shared cache of compiled queries. +> Given the improvements from #7319 et seq., this should not be necessary. + +> **Discussion point:** For the initial implementation, the new API will use +> the existing query language as-is. Future work may extend the Filter message +> with a more structured and/or expressive query surface, but that is beyond +> the scope of this design. + +The semantics of the request are as follows: An item in the event log is +**eligible** for a query if: + +- It is newer than the `after` cursor (if set). +- It is older than the `before` cursor (if set). +- It matches the filter (if set). + +Among the eligible items in the log, the server returns up to `max_results` of +the newest items, in reverse order of cursor. If `max_results` is unset the +server chooses a number to return, and will cap `max_results` at a sensible +limit. + +The `wait_time` parameter is used to effect polling. If `before` is empty and +no items are available, the server will wait for up to `wait_time` for matching +items to arrive at the head of the log. If `wait_time` is zero or negative, the +server will wait for a default (positive) interval. + +If `before` non-empty, `wait_time` is ignored: new results are only added to +the head of the log, so there is no need to wait. This allows the client to +poll for new data, and "page" backward through matching event items. This is +discussed in more detail below. + +The server will set a sensible cap on the maximum `wait_time`, overriding +client-requested intervals longer than that. + +A successful reply from the `events` request corresponds to the following Go +types: + +```go +type EventReply struct { + // The items matching the request parameters, from newest + // to oldest, if any were available within the timeout. + Items []*EventItem `json:"items"` + + // This is true if there is at least one older matching item + // available in the log that was not returned. + More bool `json:"more"` + + // The cursor of the oldest item in the log at the time of this reply, + // or "" if the log is empty. + Oldest string `json:"oldest"` + + // The cursor of the newest item in the log at the time of this reply, + // or "" if the log is empty. + Newest string `json:"newest"` +} + +type EventItem struct { + // The cursor of this item. + Cursor string `json:"cursor"` + + // The encoded event data for this item. + // The type identifies the structure of the value. + Data struct { + Type string `json:"type"` + Value json.RawMessage `json:"value"` + } `json:"data"` +} +``` + +The `oldest` and `newest` fields of the reply report the cursors of the oldest +and newest items (of any kind) recorded in the event log at the time of the +reply, or are `""` if the log is empty. + +The `data` field contains the type-specific event datum. The datum carries any +ABCI events that may have been defined. + +> **Discussion point**: Based on [issue #7273][i7273], I did not include a +> separate field in the response for the ABCI events, since it duplicates data +> already stored elsewhere in the event data. + +The semantics of the reply are as follows: + +- If `items` is non-empty: + + - Items are ordered from newest to oldest. + + - If `more` is true, there is at least one additional, older item in the + event log that was not returned (in excess of `max_results`). + + In this case the client can fetch the next page by setting `before` in a + new request, to the cursor of the oldest item fetched (i.e., the last one + in `items`). + + - Otherwise (if `more` is false), all the matching results have been + reported (pagination is complete). + + - The first element of `items` identifies the newest item considered. + Subsequent poll requests can set `after` to this cursor to skip items + that were already retrieved. + +- If `items` is empty: + + - If the `before` was set in the request, there are no further eligible + items for this query in the log (pagination is complete). + + This is just a safety case; the client can detect this without issuing + another call by consulting the `more` field of the previous reply. + + - If the `before` was empty in the request, no eligible items were + available before the `wait_time` expired. The client may poll again to + wait for more event items. + +A client can store cursor values to detect data loss and to recover from +crashes and connectivity issues: + +- After a crash, the client requests events after the newest cursor it has + seen. If the reply indicates that cursor is no longer in range, the client + may (conservatively) conclude some event data may have been lost. + +- On the other hand, if it _is_ in range, the client can then page back through + the results that it missed, and then resume polling. As long as its recovery + cursor does not age out before it finishes, the client can be sure it has all + the relevant results. + +### Other Notes + +- The new API supports two general "modes" of operation: + + 1. In ordinary operation, clients will **long-poll** the head of the event + log for new events matching their criteria (by setting a `wait_time` and + no `before`). + + 2. If there are more events than the client requested, or if the client needs + to to read older events to recover from a stall or crash, clients will + **page** backward through the event log (by setting `before` and `after`). + +- While the new API requires explicit polling by the client, it makes better + use of the node's existing HTTP infrastructure (e.g., connection pools). + Moreover, the direct implementation is easier to use from standard tools and + client libraries for HTTP and JSON-RPC. + + Explicit polling does shift the burden of timeliness to the client. That is + arguably preferable, however, given that the RPC service is ancillary to the + node's primary goal, viz., consensus. The details of polling can be easily + hidden from client applications with simple libraries. + +- The format of a cursor is considered opaque to the client. Clients must not + parse cursor values, but they may rely on their ordering properties. + +- To maintain the event log, the server must prune items outside the time + window and in excess of the item limit. + + The initial implementation will do this by checking the tail of the event log + after each new item is published. If the number of items in the log exceeds + the item limit, it will delete oldest items until the log is under the limit; + then discard any older than the time window before the latest. + + To minimize coordination interference between the publisher (the event bus) + and the subcribers (the `events` service handlers), the event log will be + stored as a persistent linear queue with shared structure (a cons list). A + single reader-writer mutex will guard the "head" of the queue where new + items are published: + + - **To publish a new item**, the publisher acquires the write lock, conses a + new item to the front of the existing queue, and replaces the head pointer + with the new item. + + - **To scan the queue**, a reader acquires the read lock, captures the head + pointer, and then releases the lock. The rest of its request can be served + without holding a lock, since the queue structure will not change. + + When a reader wants to wait, it will yield the lock and wait on a condition + that is signaled when the publisher swings the pointer. + + - **To prune the queue**, the publisher (who is the sole writer) will track + the queue length and the age of the oldest item separately. When the + length and or age exceed the configured bounds, it will construct a new + queue spine on the same items, discarding out-of-band values. + + Pruning can be done while the publisher already holds the write lock, or + could be done outside the lock entirely: Once the new queue is constructed, + the lock can be re-acquired to swing the pointer. This costs some extra + allocations for the cons cells, but avoids duplicating any event items. + The pruning step is a simple linear scan down the first (up to) max-items + elements of the queue, to find the breakpoint of age and length. + + Moreover, the publisher can amortize the cost of pruning by item count, if + necessary, by pruning length "more aggressively" than the configuration + requires (e.g., reducing to 3/4 of the maximum rather than 1/1). + + The state of the event log before the publisher acquires the lock: + ![Before publish and pruning](./img/adr-075-log-before.png) + + After the publisher has added a new item and pruned old ones: + ![After publish and pruning](./img/adr-075-log-after.png) + +### Migration Plan + +This design requires that clients eventually migrate to the new event +subscription API, but provides a full release cycle with both APIs in place to +make this burden more tractable. The migration strategy is broadly: + +**Phase 1**: Release v0.36. + +- Implement the new `events` endpoint, keeping the existing methods as they are. +- Update the Go clients to support the new `events` endpoint, and handle polling. +- Update the old endpoints to log annoyingly about their own deprecation. +- Write tutorials about how to migrate client usage. + +At or shortly after release, we should proactively update the Cosmos SDK to use +the new API, to remove a disincentive to upgrading. + +**Phase 2**: Release v0.37 + +- During development, we should actively seek out any existing users of the + streaming event subscription API and help them migrate. +- Possibly also: Spend some time writing clients for JS, Rust, et al. +- Release: Delete the old implementation and all the websocket support code. + +> **Discussion point**: Even though the plan is to keep the existing service, +> we might take the opportunity to restrict the websocket endpoint to _only_ +> the event streaming service, removing the other endpoints. To minimize the +> disruption for users in the v0.36 cycle, I have decided not to do this for +> the first phase. +> +> If we wind up pushing this design into v0.37, however, we should re-evaulate +> this partial turn-down of the websocket. + +### Future Work + +- This design does not immediately address the problem of allowing the client + to control which data are reported back for event items. That concern is + deferred to future work. However, it would be straightforward to extend the + filter and/or the request parameters to allow more control. + +- The node currently stores a subset of event data (specifically the block and + transaction events) for use in reindexing. While these data are redundant + with the event log described in this document, they are not sufficient to + cover event subscription, as they omit other event types. + + In the future we should investigate consolidating or removing event data from + the state store entirely. For now this issue is out of scope for purposes of + updating the RPC API. We may be able to piggyback on the database unification + plans (see [RFC 001][rfc001]) to store the event log separately, so its + pruning policy does not need to be tied to the block and state stores. + +- This design reuses the existing filter query language from the old API. In + the future we may want to use a more structured and/or expressive query. The + Filter object can be extended with more fields as needed to support this. + +- Some users have trouble communicating with the RPC service because of + configuration problems like improperly-set CORS policies. While this design + does not address those issues directly, we might want to revisit how we set + policies in the RPC service to make it less susceptible to confusing errors + caused by misconfiguration. + +--- +## Consequences + +- ✅ Reduces the number of transport options for RPC. Supports [RFC 002][rfc002]. +- ️✅ Removes the primary non-standard use of JSON-RPC. +- ⛔️ Forces clients to migrate to a different API (eventually). +- ↕️ API requires clients to poll, but this reduces client state on the server. +- ↕️ We have to maintain both implementations for a whole release, but this + gives clients time to migrate. + +--- +## Alternative Approaches + +The following alternative approaches were considered: + +1. **Leave it alone.** Since existing tools mostly already work with the API as + it stands today, we could leave it alone and do our best to improve its + performance and reliability. + + Based on many issues reported by users and node operators (e.g., + [#3380][i3380], [#6439][i6439], [#6729][i6729], [#7247][i7247]), the + problems described here affect even the existing use that works. Investing + further incremental effort in the existing API is unlikely to address these + issues. + +2. **Design a better streaming API.** Instead of polling, we might try to + design a better "streaming" API for event subscription. + + A significant advantage of switching away from streaming is to remove the + need for persistent connections between the node and subscribers. A new + streaming protocol design would lose that advantage, and would still need a + way to let clients recover and replay. + + This approach might look better if we decided to use a different protocol + for event subscription, say gRPC instead of JSON-RPC. That choice, however, + would be just as breaking for existing clients, for marginal benefit. + Moreover, this option increases both the complexity and the resource cost on + the node implementation. + + Given that resource consumption and complexity are important considerations, + this option was not chosen. + +3. **Defer to an external event broker.** We might remove the entire event + subscription infrastructure from the node, and define an optional interface + to allow the node to publish all its events to an external event broker, + such as Apache Kafka. + + This has the advantage of greatly simplifying the node, but at a great cost + to the node operator: To enable event subscription in this design, the + operator has to stand up and maintain a separate process in communion with + the node, and configuration changes would have to be coordinated across + both. + + Moreover, this approach would be highly disruptive to existing client use, + and migration would probably require switching to third-party libraries. + Despite the potential benefits for the node itself, the costs to operators + and clients seems too large for this to be the best option. + + Publishing to an external event broker might be a worthwhile future project, + if there is any demand for it. That decision is out of scope for this design, + as it interacts with the design of the indexer as well. + +--- +## References + +- [RFC 006: Event Subscription][rfc006] +- [Tendermint RPC service][rpc-service] +- [Event query grammar][query-grammar] +- [RFC 6455: The WebSocket protocol][ws] +- [JSON-RPC 2.0 Specification][jsonrpc2] +- [Nginx proxy server][nginx] + - [Proxying websockets][rp-ws] + - [Extension modules][ng-xm] +- [FastCGI][fcgi] +- [RFC 001: Storage Engines & Database Layer][rfc001] +- [RFC 002: Interprocess Communication in Tendermint][rfc002] +- Issues: + - [rpc/client: test that client resubscribes upon disconnect][i3380] (#3380) + - [Too high memory usage when creating many events subscriptions][i6439] (#6439) + - [Tendermint emits events faster than clients can pull them][i6729] (#6729) + - [indexer: unbuffered event subscription slow down the consensus][i7247] (#7247) + - [rpc: remove duplication of events when querying][i7273] (#7273) + +[rfc006]: https://github.com/tendermint/tendermint/blob/master/docs/rfc/rfc-006-event-subscription.md +[rpc-service]: https://github.com/tendermint/tendermint/blob/master/rpc/openapi/openapi.yaml +[query-grammar]: https://pkg.go.dev/github.com/tendermint/tendermint@master/internal/pubsub/query/syntax +[ws]: https://datatracker.ietf.org/doc/html/rfc6455 +[jsonrpc2]: https://www.jsonrpc.org/specification +[nginx]: https://nginx.org/en/docs/ +[fcgi]: http://www.mit.edu/~yandros/doc/specs/fcgi-spec.html +[rp-ws]: https://nginx.org/en/docs/http/websocket.html + +[ng-xm]: https://www.nginx.com/resources/wiki/extending/ +[abci-event]: https://pkg.go.dev/github.com/tendermint/tendermint/abci/types#Event +[rfc001]: https://github.com/tendermint/tendermint/blob/master/docs/rfc/rfc-001-storage-engine.rst +[rfc002]: https://github.com/tendermint/tendermint/blob/master/docs/rfc/rfc-002-ipc-ecosystem.md +[i3380]: https://github.com/tendermint/tendermint/issues/3380 +[i6439]: https://github.com/tendermint/tendermint/issues/6439 +[i6729]: https://github.com/tendermint/tendermint/issues/6729 +[i7247]: https://github.com/tendermint/tendermint/issues/7247 +[i7273]: https://github.com/tendermint/tendermint/issues/7273 diff --git a/docs/architecture/adr-076-combine-spec-repo.md b/docs/architecture/adr-076-combine-spec-repo.md new file mode 100644 index 0000000000..a6365da5b8 --- /dev/null +++ b/docs/architecture/adr-076-combine-spec-repo.md @@ -0,0 +1,112 @@ +# ADR 076: Combine Spec and Tendermint Repositories + +## Changelog + +- 2022-02-04: Initial Draft. (@tychoish) + +## Status + +Accepted. + +## Context + +While the specification for Tendermint was originally in the same +repository as the Go implementation, at some point the specification +was split from the core repository and maintained separately from the +implementation. While this makes sense in promoting a conceptual +separation of specification and implementation, in practice this +separation was a premature optimization, apparently aimed at supporting +alternate implementations of Tendermint. + +The operational and documentary burden of maintaining a separate +spec repo has not returned value to justify its cost. There are no active +projects to develop alternate implementations of Tendermint based on the +common specification, and having separate repositories creates an ongoing +burden to coordinate versions, documentation, and releases. + +## Decision + +The specification repository will be merged back into the Tendermint +core repository. + +Stakeholders including representatives from the maintainers of the +spec, the Go implementation, and the Tendermint Rust library, agreed +to merge the repositories in the Tendermint core dev meeting on 27 +January 2022, including @williambanfield @cmwaters @creachadair and +@thanethomson. + +## Alternative Approaches + +The main alternative we considered was to keep separate repositories, +and to introduce a coordinated versioning scheme between the two, so +that users could figure out which spec versions go with which versions +of the core implementation. + +We decided against this on the grounds that it would further complicate +the release process for _both_ repositories, without mitigating any of +the other existing issues. + +## Detailed Design + +Clone and merge the master branch of the `tendermint/spec` repository +as a branch of the `tendermint/tendermint`, to ensure the commit history +of both repositories remains intact. + +### Implementation Instructions + +1. Within the `tendermint` repository, execute the following commands + to add a new branch with the history of the master branch of `spec`: + + ```bash + git remote add spec git@github.com:tendermint/spec.git + git fetch spec + git checkout -b spec-master spec/master + mkdir spec + git ls-tree -z --name-only HEAD | xargs -0 -I {} git mv {} subdir/ + git commit -m "spec: organize specification prior to merge" + git checkout -b spec-merge-mainline origin/master + git merge --allow-unrelated-histories spec-master + ``` + + This merges the spec into the `tendermint/tendermint` repository as + a normal branch. This commit can also be backported to the 0.35 + branch, if needed. + +2. Migrate outstanding issues from `tendermint/spec` to the + `tendermint/tendermint` repository. + +3. In the specification repository, add redirect to the README and mark + the repository as archived. + + +## Consequences + +### Positive + +Easier maintenance for the specification will obviate a number of +complicated and annoying versioning problems, and will help prevent the +possibility of the specification and the implementation drifting apart. + +Additionally, co-locating the specification will help encourage +cross-pollination and collaboration, between engineers focusing on the +specification and the protocol and engineers focusing on the implementation. + +### Negative + +Co-locating the spec and Go implementation has the potential effect of +prioritizing the Go implementation with regards to the spec, and +making it difficult to think about alternate implementations of the +Tendermint algorithm. Although we may want to foster additional +Tendermint implementations in the future, this isn't an active goal +in our current roadmap, and *not* merging these repos doesn't +change the fact that the Go implementation of Tendermint is already the +primary implementation. + +### Neutral + +N/A + +## References + +- https://github.com/tendermint/spec +- https://github.com/tendermint/tendermint diff --git a/docs/architecture/adr-077-block-retention.md b/docs/architecture/adr-077-block-retention.md new file mode 100644 index 0000000000..714b4810af --- /dev/null +++ b/docs/architecture/adr-077-block-retention.md @@ -0,0 +1,109 @@ +# ADR 077: Configurable Block Retention + +## Changelog + +- 2020-03-23: Initial draft (@erikgrinaker) +- 2020-03-25: Use local config for snapshot interval (@erikgrinaker) +- 2020-03-31: Use ABCI commit response for block retention hint +- 2020-04-02: Resolved open questions +- 2021-02-11: Migrate to tendermint repo (Originally [RFC 001](https://github.com/tendermint/spec/pull/84)) + +## Author(s) + +- Erik Grinaker (@erikgrinaker) + +## Context + +Currently, all Tendermint nodes contain the complete sequence of blocks from genesis up to some height (typically the latest chain height). This will no longer be true when the following features are released: + +- [Block pruning](https://github.com/tendermint/tendermint/issues/3652): removes historical blocks and associated data (e.g. validator sets) up to some height, keeping only the most recent blocks. + +- [State sync](https://github.com/tendermint/tendermint/issues/828): bootstraps a new node by syncing state machine snapshots at a given height, but not historical blocks and associated data. + +To maintain the integrity of the chain, the use of these features must be coordinated such that necessary historical blocks will not become unavailable or lost forever. In particular: + +- Some nodes should have complete block histories, for auditability, querying, and bootstrapping. + +- The majority of nodes should retain blocks longer than the Cosmos SDK unbonding period, for light client verification. + +- Some nodes must take and serve state sync snapshots with snapshot intervals less than the block retention periods, to allow new nodes to state sync and then replay blocks to catch up. + +- Applications may not persist their state on commit, and require block replay on restart. + +- Only a minority of nodes can be state synced within the unbonding period, for light client verification and to serve block histories for catch-up. + +However, it is unclear if and how we should enforce this. It may not be possible to technically enforce all of these without knowing the state of the entire network, but it may also be unrealistic to expect this to be enforced entirely through social coordination. This is especially unfortunate since the consequences of misconfiguration can be permanent chain-wide data loss. + +## Proposal + +Add a new field `retain_height` to the ABCI `ResponseCommit` message: + +```proto +service ABCIApplication { + rpc Commit(RequestCommit) returns (ResponseCommit); +} + +message RequestCommit {} + +message ResponseCommit { + // reserve 1 + bytes data = 2; // the Merkle root hash + uint64 retain_height = 3; // the oldest block height to retain +} +``` + +Upon ABCI `Commit`, which finalizes execution of a block in the state machine, Tendermint removes all data for heights lower than `retain_height`. This allows the state machine to control block retention, which is preferable since only it can determine the significance of historical blocks. By default (i.e. with `retain_height=0`) all historical blocks are retained. + +Removed data includes not only blocks, but also headers, commit info, consensus params, validator sets, and so on. In the first iteration this will be done synchronously, since the number of heights removed for each run is assumed to be small (often 1) in the typical case. It can be made asynchronous at a later time if this is shown to be necessary. + +Since `retain_height` is dynamic, it is possible for it to refer to a height which has already been removed. For example, commit at height 100 may return `retain_height=90` while commit at height 101 may return `retain_height=80`. This is allowed, and will be ignored - it is the application's responsibility to return appropriate values. + +State sync will eventually support backfilling heights, via e.g. a snapshot metadata field `backfill_height`, but in the initial version it will have a fully truncated block history. + +## Cosmos SDK Example + +As an example, we'll consider how the Cosmos SDK might make use of this. The specific details should be discussed in a separate SDK proposal. + +The returned `retain_height` would be the lowest height that satisfies: + +- Unbonding time: the time interval in which validators can be economically punished for misbehavior. Blocks in this interval must be auditable e.g. by the light client. + +- IAVL snapshot interval: the block interval at which the underlying IAVL database is persisted to disk, e.g. every 10000 heights. Blocks since the last IAVL snapshot must be available for replay on application restart. + +- State sync snapshots: blocks since the _oldest_ available snapshot must be available for state sync nodes to catch up (oldest because a node may be restoring an old snapshot while a new snapshot was taken). + +- Local config: archive nodes may want to retain more or all blocks, e.g. via a local config option `min-retain-blocks`. There may also be a need to vary rentention for other nodes, e.g. sentry nodes which do not need historical blocks. + +![Cosmos SDK block retention diagram](img/block-retention.png) + +## Status + +Accepted + +## Consequences + +### Positive + +- Application-specified block retention allows the application to take all relevant factors into account and prevent necessary blocks from being accidentally removed. + +- Node operators can independently decide whether they want to provide complete block histories (if local configuration for this is provided) and snapshots. + +### Negative + +- Social coordination is required to run archival nodes, failure to do so may lead to permanent loss of historical blocks. + +- Social coordination is required to run snapshot nodes, failure to do so may lead to inability to run state sync, and inability to bootstrap new nodes at all if no archival nodes are online. + +### Neutral + +- Reduced block retention requires application changes, and cannot be controlled directly in Tendermint. + +- Application-specified block retention may set a lower bound on disk space requirements for all nodes. + +## References + +- State sync ADR: + +- State sync issue: + +- Block pruning issue: diff --git a/docs/architecture/adr-078-nonzero-genesis.md b/docs/architecture/adr-078-nonzero-genesis.md new file mode 100644 index 0000000000..bd9c030f0a --- /dev/null +++ b/docs/architecture/adr-078-nonzero-genesis.md @@ -0,0 +1,82 @@ +# ADR 078: Non-Zero Genesis + +## Changelog + +- 2020-07-26: Initial draft (@erikgrinaker) +- 2020-07-28: Use weak chain linking, i.e. `predecessor` field (@erikgrinaker) +- 2020-07-31: Drop chain linking (@erikgrinaker) +- 2020-08-03: Add `State.InitialHeight` (@erikgrinaker) +- 2021-02-11: Migrate to tendermint repo (Originally [RFC 002](https://github.com/tendermint/spec/pull/119)) + +## Author(s) + +- Erik Grinaker (@erikgrinaker) + +## Context + +The recommended upgrade path for block protocol-breaking upgrades is currently to hard fork the +chain (see e.g. [`cosmoshub-3` upgrade](https://blog.cosmos.network/cosmos-hub-3-upgrade-announcement-39c9da941aee). +This is done by halting all validators at a predetermined height, exporting the application +state via application-specific tooling, and creating an entirely new chain using the exported +application state. + +As far as Tendermint is concerned, the upgraded chain is a completely separate chain, with e.g. +a new chain ID and genesis file. Notably, the new chain starts at height 1, and has none of the +old chain's block history. This causes problems for integrators, e.g. coin exchanges and +wallets, that assume a monotonically increasing height for a given blockchain. Users also find +it confusing that a given height can now refer to distinct states depending on the chain +version. + +An ideal solution would be to always retain block backwards compatibility in such a way that chain +history is never lost on upgrades. However, this may require a significant amount of engineering +work that is not viable for the planned Stargate release (Tendermint 0.34), and may prove too +restrictive for future development. + +As a first step, allowing the new chain to start from an initial height specified in the genesis +file would at least provide monotonically increasing heights. There was a proposal to include the +last block header of the previous chain as well, but since the genesis file is not verified and +hashed (only specific fields are) this would not be trustworthy. + +External tooling will be required to map historical heights onto e.g. archive nodes that contain +blocks from previous chain version. Tendermint will not include any such functionality. + +## Proposal + +Tendermint will allow chains to start from an arbitrary initial height: + +- A new field `initial_height` is added to the genesis file, defaulting to `1`. It can be set to any +non-negative integer, and `0` is considered equivalent to `1`. + +- A new field `InitialHeight` is added to the ABCI `RequestInitChain` message, with the same value +and semantics as the genesis field. + +- A new field `InitialHeight` is added to the `state.State` struct, where `0` is considered invalid. + Including the field here simplifies implementation, since the genesis value does not have to be + propagated throughout the code base separately, but it is not strictly necessary. + +ABCI applications may have to be updated to handle arbitrary initial heights, otherwise the initial +block may fail. + +## Status + +Accepted + +## Consequences + +### Positive + +- Heights can be unique throughout the history of a "logical" chain, across hard fork upgrades. + +### Negative + +- Upgrades still cause loss of block history. + +- Integrators will have to map height ranges to specific archive nodes/networks to query history. + +### Neutral + +- There is no explicit link to the last block of the previous chain. + +## References + +- [#2543: Allow genesis file to start from non-zero height w/ prev block header](https://github.com/tendermint/tendermint/issues/2543) diff --git a/docs/architecture/adr-079-ed25519-verification.md b/docs/architecture/adr-079-ed25519-verification.md new file mode 100644 index 0000000000..c20869e6c4 --- /dev/null +++ b/docs/architecture/adr-079-ed25519-verification.md @@ -0,0 +1,57 @@ +# ADR 079: Ed25519 Verification + +## Changelog + +- 2020-08-21: Initial RFC +- 2021-02-11: Migrate RFC to tendermint repo (Originally [RFC 003](https://github.com/tendermint/spec/pull/144)) + +## Author(s) + +- Marko (@marbar3778) + +## Context + +Ed25519 keys are the only supported key types for Tendermint validators currently. Tendermint-Go wraps the ed25519 key implementation from the go standard library. As more clients are implemented to communicate with the canonical Tendermint implementation (Tendermint-Go) different implementations of ed25519 will be used. Due to [RFC 8032](https://www.rfc-editor.org/rfc/rfc8032.html) not guaranteeing implementation compatibility, Tendermint clients must to come to an agreement of how to guarantee implementation compatibility. [Zcash](https://z.cash/) has multiple implementations of their client and have identified this as a problem as well. The team at Zcash has made a proposal to address this issue, [Zcash improvement proposal 215](https://zips.z.cash/zip-0215). + +## Proposal + +- Tendermint-Go would adopt [hdevalence/ed25519consensus](https://github.com/hdevalence/ed25519consensus). + - This library is implements `ed25519.Verify()` in accordance to zip-215. Tendermint-go will continue to use `crypto/ed25519` for signing and key generation. + +- Tendermint-rs would adopt [ed25519-zebra](https://github.com/ZcashFoundation/ed25519-zebra) + - related [issue](https://github.com/informalsystems/tendermint-rs/issues/355) + +Signature verification is one of the major bottlenecks of Tendermint-go, batch verification can not be used unless it has the same consensus rules, ZIP 215 makes verification safe in consensus critical areas. + +This change constitutes a breaking changes, therefore must be done in a major release. No changes to validator keys or operations will be needed for this change to be enabled. + +This change has no impact on signature aggregation. To enable this signature aggregation Tendermint will have to use different signature schema (Schnorr, BLS, ...). Secondly, this change will enable safe batch verification for the Tendermint-Go client. Batch verification for the rust client is already supported in the library being used. + +As part of the acceptance of this proposal it would be best to contract or discuss with a third party the process of conducting a security review of the go library. + +## Status + +Proposed + +## Consequences + +### Positive + +- Consistent signature verification across implementations +- Enable safe batch verification + +### Negative + +#### Tendermint-Go + +- Third_party dependency + - library has not gone through a security review. + - unclear maintenance schedule +- Fragmentation of the ed25519 key for the go implementation, verification is done using a third party library while the rest + uses the go standard library + +### Neutral + +## References + +[It’s 255:19AM. Do you know what your validation criteria are?](https://hdevalence.ca/blog/2020-10-04-its-25519am) diff --git a/docs/architecture/adr-080-reverse-sync.md b/docs/architecture/adr-080-reverse-sync.md new file mode 100644 index 0000000000..57d747fc8d --- /dev/null +++ b/docs/architecture/adr-080-reverse-sync.md @@ -0,0 +1,203 @@ +# ADR 080: ReverseSync - fetching historical data + +## Changelog + +- 2021-02-11: Migrate to tendermint repo (Originally [RFC 005](https://github.com/tendermint/spec/pull/224)) +- 2021-04-19: Use P2P to gossip necessary data for reverse sync. +- 2021-03-03: Simplify proposal to the state sync case. +- 2021-02-17: Add notes on asynchronicity of processes. +- 2020-12-10: Rename backfill blocks to reverse sync. +- 2020-11-25: Initial draft. + +## Author(s) + +- Callum Waters (@cmwaters) + +## Context + +Two new features: [Block pruning](https://github.com/tendermint/tendermint/issues/3652) +and [State sync](https://github.com/tendermint/tendermint/blob/master/docs/architecture/adr-042-state-sync.md) +meant nodes no longer needed a complete history of the blockchain. This +introduced some challenges of its own which were covered and subsequently +tackled with [RFC-001](https://github.com/tendermint/tendermint/blob/master/docs/architecture/adr-077-block-retention.md). +The RFC allowed applications to set a block retention height; an upper bound on +what blocks would be pruned. However nodes who state sync past this upper bound +(which is necessary as snapshots must be saved within the trusting period for +the assisting light client to verify) have no means of backfilling the blocks +to meet the retention limit. This could be a problem as nodes who state sync and +then eventually switch to consensus (or fast sync) may not have the block and +validator history to verify evidence causing them to panic if they see 2/3 +commit on what the node believes to be an invalid block. + +Thus, this RFC sets out to instil a minimum block history invariant amongst +honest nodes. + +## Proposal + +A backfill mechanism can simply be defined as an algorithm for fetching, +verifying and storing, headers and validator sets of a height prior to the +current base of the node's blockchain. In matching the terminology used for +other data retrieving protocols (i.e. fast sync and state sync), we +call this method **ReverseSync**. + +We will define the mechanism in four sections: + +- Usage +- Design +- Verification +- Termination + +### Usage + +For now, we focus purely on the case of a state syncing node, whom after +syncing to a height will need to verify historical data in order to be capable +of processing new blocks. We can denote the earliest height that the node will +need to verify and store in order to be able to verify any evidence that might +arise as the `max_historical_height`/`time`. Both height and time are necessary +as this maps to the BFT time used for evidence expiration. After acquiring +`State`, we calculate these parameters as: + +```go +max_historical_height = max(state.InitialHeight, state.LastBlockHeight - state.ConsensusParams.EvidenceAgeHeight) +max_historical_time = max(GenesisTime, state.LastBlockTime.Sub(state.ConsensusParams.EvidenceAgeTime)) +``` + +Before starting either fast sync or consensus, we then run the following +synchronous process: + +```go +func ReverseSync(max_historical_height int64, max_historical_time time.Time) error +``` + +Where we fetch and verify blocks until a block `A` where +`A.Height <= max_historical_height` and `A.Time <= max_historical_time`. + +Upon successfully reverse syncing, a node can now safely continue. As this +feature is only used as part of state sync, one can think of this as merely an +extension to it. + +In the future we may want to extend this functionality to allow nodes to fetch +historical blocks for reasons of accountability or data accessibility. + +### Design + +This section will provide a high level overview of some of the more important +characteristics of the design, saving the more tedious details as an ADR. + +#### P2P + +Implementation of this RFC will require the addition of a new channel and two +new messages. + +```proto +message LightBlockRequest { + uint64 height = 1; +} +``` + +```proto +message LightBlockResponse { + Header header = 1; + Commit commit = 2; + ValidatorSet validator_set = 3; +} +``` + +The P2P path may also enable P2P networked light clients and a state sync that +also doesn't need to rely on RPC. + +### Verification + +ReverseSync is used to fetch the following data structures: + +- `Header` +- `Commit` +- `ValidatorSet` + +Nodes will also need to be able to verify these. This can be achieved by first +retrieving the header at the base height from the block store. From this trusted +header, the node hashes each of the three data structures and checks that they are correct. + +1. The trusted header's last block ID matches the hash of the new header + + ```go + header[height].LastBlockID == hash(header[height-1]) + ``` + +2. The trusted header's last commit hash matches the hash of the new commit + + ```go + header[height].LastCommitHash == hash(commit[height-1]) + ``` + +3. Given that the node now trusts the new header, check that the header's validator set + hash matches the hash of the validator set + + ```go + header[height-1].ValidatorsHash == hash(validatorSet[height-1]) + ``` + +### Termination + +ReverseSync draws a lot of parallels with fast sync. An important consideration +for fast sync that also extends to ReverseSync is termination. ReverseSync will +finish it's task when one of the following conditions have been met: + +1. It reaches a block `A` where `A.Height <= max_historical_height` and +`A.Time <= max_historical_time`. +2. None of it's peers reports to have the block at the height below the +processes current block. +3. A global timeout. + +This implies that we can't guarantee adequate history and thus the term +"invariant" can't be used in the strictest sense. In the case that the first +condition isn't met, the node will log an error and optimistically attempt +to continue with either fast sync or consensus. + +## Alternative Solutions + +The need for a minimum block history invariant stems purely from the need to +validate evidence (although there may be some application relevant needs as +well). Because of this, an alternative, could be to simply trust whatever the +2/3+ majority has agreed upon and in the case where a node is at the head of the +blockchain, you simply abstain from voting. + +As it stands, if 2/3+ vote on evidence you can't verify, in the same manner if +2/3+ vote on a header that a node sees as invalid (perhaps due to a different +app hash), the node will halt. + +Another alternative is the method with which the relevant data is retrieved. +Instead of introducing new messages to the P2P layer, RPC could have been used +instead. + +The aforementioned data is already available via the following RPC endpoints: +`/commit` for `Header`'s' and `/validators` for `ValidatorSet`'s'. It was +decided predominantly due to the instability of the current RPC infrastructure +that P2P be used instead. + +## Status + +Proposed + +## Consequences + +### Positive + +- Ensures a minimum block history invariant for honest nodes. This will allow + nodes to verify evidence. + +### Negative + +- Statesync will be slower as more processing is required. + +### Neutral + +- By having validator sets served through p2p, this would make it easier to +extend p2p support to light clients and state sync. +- In the future, it may also be possible to extend this feature to allow for +nodes to freely fetch and verify prior blocks + +## References + +- [RFC-001: Block retention](https://github.com/tendermint/tendermint/blob/master/docs/architecture/adr-077-block-retention.md) +- [Original issue](https://github.com/tendermint/tendermint/issues/4629) diff --git a/docs/architecture/adr-081-protobuf-mgmt.md b/docs/architecture/adr-081-protobuf-mgmt.md new file mode 100644 index 0000000000..1199cff1b4 --- /dev/null +++ b/docs/architecture/adr-081-protobuf-mgmt.md @@ -0,0 +1,201 @@ +# ADR 081: Protocol Buffers Management + +## Changelog + +- 2022-02-28: First draft + +## Status + +Accepted + +[Tracking issue](https://github.com/tendermint/tendermint/issues/8121) + +## Context + +At present, we manage the [Protocol Buffers] schema files ("protos") that define +our wire-level data formats within the Tendermint repository itself (see the +[`proto`](../../proto/) directory). Recently, we have been making use of [Buf], +both locally and in CI, in order to generate Go stubs, and lint and check +`.proto` files for breaking changes. + +The version of Buf used at the time of this decision was `v1beta1`, and it was +discussed in [\#7975] and in weekly calls as to whether we should upgrade to +`v1` and harmonize our approach with that used by the Cosmos SDK. The team +managing the Cosmos SDK was primarily interested in having our protos versioned +and easily accessible from the [Buf] registry. + +The three main sets of stakeholders for the `.proto` files and their needs, as +currently understood, are as follows. + +1. Tendermint needs Go code generated from `.proto` files. +2. Consumers of Tendermint's `.proto` files, specifically projects that want to + interoperate with Tendermint and need to generate code for their own + programming language, want to be able to access these files in a reliable and + efficient way. +3. The Tendermint Core team wants to provide stable interfaces that are as easy + as possible to maintain, on which consumers can depend, and to be able to + notify those consumers promptly when those interfaces change. To this end, we + want to: + 1. Prevent any breaking changes from being introduced in minor/patch releases + of Tendermint. Only major version updates should be able to contain + breaking interface changes. + 2. Prevent generated code from diverging from the Protobuf schema files. + +There was also discussion surrounding the notion of automated documentation +generation and hosting, but it is not clear at this time whether this would be +that valuable to any of our stakeholders. What will, of course, be valuable at +minimum would be better documentation (in comments) of the `.proto` files +themselves. + +## Alternative Approaches + +### Meeting stakeholders' needs + +1. Go stub generation from protos. We could use: + 1. [Buf]. This approach has been rather cumbersome up to this point, and it + is not clear what Buf really provides beyond that which `protoc` provides + to justify the additional complexity in configuring Buf for stub + generation. + 2. [protoc] - the Protocol Buffers compiler. +2. Notification of breaking changes: + 1. Buf in CI for all pull requests to *release* branches only (and not on + `master`). + 2. Buf in CI on every pull request to every branch (this was the case at the + time of this decision, and the team decided that the signal-to-noise ratio + for this approach was too low to be of value). +3. `.proto` linting: + 1. Buf in CI on every pull request +4. `.proto` formatting: + 1. [clang-format] locally and a [clang-format GitHub Action] in CI to check + that files are formatted properly on every pull request. +5. Sharing of `.proto` files in a versioned, reliable manner: + 1. Consumers could simply clone the Tendermint repository, check out a + specific commit, tag or branch and manually copy out all of the `.proto` + files they need. This requires no effort from the Tendermint Core team and + will continue to be an option for consumers. The drawback of this approach + is that it requires manual coding/scripting to implement and is brittle in + the face of bigger changes. + 2. Uploading our `.proto` files to Buf's registry on every release. This is + by far the most seamless for consumers of our `.proto` files, but requires + the dependency on Buf. This has the additional benefit that the Buf + registry will automatically [generate and host + documentation][buf-docs-gen] for these protos. + 3. We could create a process that, upon release, creates a `.zip` file + containing our `.proto` files. + +### Popular alternatives to Buf + +[Prototool] was not considered as it appears deprecated, and the ecosystem seems +to be converging on Buf at this time. + +### Tooling complexity + +The more tools we have in our build/CI processes, the more complex and fragile +repository/CI management becomes, and the longer it takes to onboard new team +members. Maintainability is a core concern here. + +### Buf sustainability and costs + +One of the primary considerations regarding the usage of Buf is whether, for +example, access to its registry will eventually become a +paid-for/subscription-based service and whether this is valuable enough for us +and the ecosystem to pay for such a service. At this time, it appears as though +Buf will never charge for hosting open source projects' protos. + +Another consideration was Buf's sustainability as a project - what happens when +their resources run out? Will there be a strong and broad enough open source +community to continue maintaining it? + +### Local Buf usage options + +Local usage of Buf (i.e. not in CI) can be accomplished in two ways: + +1. Installing the relevant tools individually. +2. By way of its [Docker image][buf-docker]. + +Local installation of Buf requires developers to manually keep their toolchains +up-to-date. The Docker option comes with a number of complexities, including +how the file system permissions of code generated by a Docker container differ +between platforms (e.g. on Linux, Buf-generated code ends up being owned by +`root`). + +The trouble with the Docker-based approach is that we make use of the +[gogoprotobuf] plugin for `protoc`. Continuing to use the Docker-based approach +to using Buf will mean that we will have to continue building our own custom +Docker image with embedded gogoprotobuf. + +Along these lines, we could eventually consider coming up with a [Nix]- or +[redo]-based approach to developer tooling to ensure tooling consistency across +the team and for anyone who wants to be able to contribute to Tendermint. + +## Decision + +1. We will adopt Buf for now for proto generation, linting, breakage checking + and its registry (mainly in CI, with optional usage locally). +2. Failing CI when checking for breaking changes in `.proto` files will only + happen when performing minor/patch releases. +3. Local tooling will be favored over Docker-based tooling. + +## Detailed Design + +We currently aim to: + +1. Update to Buf `v1` to facilitate linting, breakage checking and uploading to + the Buf registry. +2. Configure CI appropriately for proto management: + 1. Uploading protos to the Buf registry on every release (e.g. the + [approach][cosmos-sdk-buf-registry-ci] used by the Cosmos SDK). + 2. Linting on every pull request (e.g. the + [approach][cosmos-sdk-buf-linting-ci] used by the Cosmos SDK). The linter + passing should be considered a requirement for accepting PRs. + 3. Checking for breaking changes in minor/patch version releases and failing + CI accordingly - see [\#8003]. + 4. Add [clang-format GitHub Action] to check `.proto` file formatting. Format + checking should be considered a requirement for accepting PRs. +3. Update the Tendermint [`Makefile`](../../Makefile) to primarily facilitate + local Protobuf stub generation, linting, formatting and breaking change + checking. More specifically: + 1. This includes removing the dependency on Docker and introducing the + dependency on local toolchain installation. CI-based equivalents, where + relevant, will rely on specific GitHub Actions instead of the Makefile. + 2. Go code generation will rely on `protoc` directly. + +## Consequences + +### Positive + +- We will still offer Go stub generation, proto linting and breakage checking. +- Breakage checking will only happen on minor/patch releases to increase the + signal-to-noise ratio in CI. +- Versioned protos will be made available via Buf's registry upon every release. + +### Negative + +- Developers/contributors will need to install the relevant Protocol + Buffers-related tooling (Buf, gogoprotobuf, clang-format) locally in order to + build, lint, format and check `.proto` files for breaking changes. + +### Neutral + +## References + +- [Protocol Buffers] +- [Buf] +- [\#7975] +- [protoc] - The Protocol Buffers compiler + +[Protocol Buffers]: https://developers.google.com/protocol-buffers +[Buf]: https://buf.build/ +[\#7975]: https://github.com/tendermint/tendermint/pull/7975 +[protoc]: https://github.com/protocolbuffers/protobuf +[clang-format]: https://clang.llvm.org/docs/ClangFormat.html +[clang-format GitHub Action]: https://github.com/marketplace/actions/clang-format-github-action +[buf-docker]: https://hub.docker.com/r/bufbuild/buf +[cosmos-sdk-buf-registry-ci]: https://github.com/cosmos/cosmos-sdk/blob/e6571906043b6751951a42b6546431b1c38b05bd/.github/workflows/proto-registry.yml +[cosmos-sdk-buf-linting-ci]: https://github.com/cosmos/cosmos-sdk/blob/e6571906043b6751951a42b6546431b1c38b05bd/.github/workflows/proto.yml#L15 +[\#8003]: https://github.com/tendermint/tendermint/issues/8003 +[Nix]: https://nixos.org/ +[gogoprotobuf]: https://github.com/gogo/protobuf +[Prototool]: https://github.com/uber/prototool +[buf-docs-gen]: https://docs.buf.build/bsr/documentation +[redo]: https://redo.readthedocs.io/en/latest/ diff --git a/docs/introduction/architecture.md b/docs/introduction/architecture.md index 3b70e70151..27e1b34c66 100644 --- a/docs/introduction/architecture.md +++ b/docs/introduction/architecture.md @@ -61,7 +61,7 @@ Here are some relevant facts about TCP: ![tcp](../imgs/tcp-window.png) -In order to have performant TCP connections under the conditions created in Tendermint, we've created the `mconnection`, or the multiplexing connection. It is our own protocol built on top of TCP. It lets us reuse TCP connections to minimize overhead, and it keeps the window size high by sending auxiliary messages when necessary. +In order to have performant TCP connections under the conditions created in Tendermint, we've created the `mconnection`, or the multiplexing connection. It is our own protocol built on top of TCP. It lets us reuse TCP connections to minimize overhead, and it keeps the window size high by sending auxiliary messages when necessary. The `mconnection` is represented by a struct, which contains a batch of messages, read and write buffers, and a map of channel IDs to reactors. It communicates with TCP via file descriptors, which it can write to. There is one `mconnection` per peer connection. diff --git a/docs/introduction/what-is-tendermint.md b/docs/introduction/what-is-tendermint.md index 2386626eac..417152d748 100644 --- a/docs/introduction/what-is-tendermint.md +++ b/docs/introduction/what-is-tendermint.md @@ -68,10 +68,10 @@ Tendermint is in essence similar software, but with two key differences: - It is Byzantine Fault Tolerant, meaning it can only tolerate up to a 1/3 of failures, but those failures can include arbitrary behaviour - - including hacking and malicious attacks. -- It does not specify a particular application, like a fancy key-value - store. Instead, it focuses on arbitrary state machine replication, - so developers can build the application logic that's right for them, + including hacking and malicious attacks. +- It does not specify a particular application, like a fancy key-value + store. Instead, it focuses on arbitrary state machine replication, + so developers can build the application logic that's right for them, from key-value store to cryptocurrency to e-voting platform and beyond. ### Bitcoin, Ethereum, etc @@ -104,12 +104,10 @@ to Tendermint, but is more opinionated about how the state is managed, and requires that all application behaviour runs in potentially many docker containers, modules it calls "chaincode". It uses an implementation of [PBFT](http://pmg.csail.mit.edu/papers/osdi99.pdf). -from a team at IBM that is [augmented to handle potentially -non-deterministic -chaincode](https://www.zurich.ibm.com/~cca/papers/sieve.pdf) It is -possible to implement this docker-based behaviour as a ABCI app in -Tendermint, though extending Tendermint to handle non-determinism -remains for future work. +from a team at IBM that is augmented to handle potentially non-deterministic +chaincode It is possible to implement this docker-based behaviour as a ABCI app +in Tendermint, though extending Tendermint to handle non-determinism remains +for future work. [Burrow](https://github.com/hyperledger/burrow) is an implementation of the Ethereum Virtual Machine and Ethereum transaction mechanics, with diff --git a/docs/networks/README.md b/docs/networks/README.md deleted file mode 100644 index 0b14e391be..0000000000 --- a/docs/networks/README.md +++ /dev/null @@ -1,16 +0,0 @@ ---- -order: 1 -parent: - title: Networks - order: 1 ---- - -# Overview - -Use [Docker Compose](./docker-compose.md) to spin up Tendermint testnets on your -local machine. - -Use [Terraform and Ansible](./terraform-and-ansible.md) to deploy Tendermint -testnets to the cloud. - -See the `tendermint testnet --help` command for more help initializing testnets. diff --git a/docs/nodes/README.md b/docs/nodes/README.md index 9be6febf03..fd9056e0dd 100644 --- a/docs/nodes/README.md +++ b/docs/nodes/README.md @@ -1,7 +1,7 @@ --- order: 1 parent: - title: Nodes + title: Node Operators order: 4 --- diff --git a/docs/nodes/configuration.md b/docs/nodes/configuration.md index e0cfe501a5..a55bfb63a2 100644 --- a/docs/nodes/configuration.md +++ b/docs/nodes/configuration.md @@ -16,7 +16,8 @@ the parameters set with their default values. It will look something like the file below, however, double check by inspecting the `config.toml` created with your version of `tendermint` installed: -```toml# This is a TOML config file. +```toml +# This is a TOML config file. # For more information, see https://github.com/toml-lang/toml # NOTE: Any path below can be absolute (e.g. "/var/myawesomeapp/data") or @@ -33,11 +34,10 @@ like the file below, however, double check by inspecting the proxy-app = "tcp://127.0.0.1:26658" # A custom human readable name for this node -moniker = "ape" - +moniker = "sidewinder" -# Mode of Node: full | validator | seed (default: "validator") -# * validator node (default) +# Mode of Node: full | validator | seed +# * validator node # - all reactors # - with priv_validator_key.json, priv_validator_state.json # * full node @@ -48,11 +48,6 @@ moniker = "ape" # - No priv_validator_key.json, priv_validator_state.json mode = "validator" -# If this node is many blocks behind the tip of the chain, FastSync -# allows them to catchup quickly by downloading blocks in parallel -# and verifying their commits -fast-sync = true - # Database backend: goleveldb | cleveldb | boltdb | rocksdb | badgerdb # * goleveldb (github.com/syndtr/goleveldb - most popular implementation) # - pure go @@ -120,10 +115,10 @@ laddr = "" client-certificate-file = "" # Client key generated while creating certificates for secure connection -validator-client-key-file = "" +client-key-file = "" # Path to the Root Certificate Authority used to sign both client and server certificates -certificate-authority = "" +root-ca-file = "" ####################################################################### @@ -149,26 +144,10 @@ cors-allowed-methods = ["HEAD", "GET", "POST", ] # A list of non simple headers the client is allowed to use with cross-domain requests cors-allowed-headers = ["Origin", "Accept", "Content-Type", "X-Requested-With", "X-Server-Time", ] -# TCP or UNIX socket address for the gRPC server to listen on -# NOTE: This server only supports /broadcast_tx_commit -# Deprecated gRPC in the RPC layer of Tendermint will be deprecated in 0.36. -grpc-laddr = "" - -# Maximum number of simultaneous connections. -# Does not include RPC (HTTP&WebSocket) connections. See max-open-connections -# If you want to accept a larger number than the default, make sure -# you increase your OS limits. -# 0 - unlimited. -# Should be < {ulimit -Sn} - {MaxNumInboundPeers} - {MaxNumOutboundPeers} - {N of wal, db and other open files} -# 1024 - 40 - 10 - 50 = 924 = ~900 -# Deprecated gRPC in the RPC layer of Tendermint will be deprecated in 0.36. -grpc-max-open-connections = 900 - # Activate unsafe RPC commands like /dial-seeds and /unsafe-flush-mempool unsafe = false # Maximum number of simultaneous connections (including WebSocket). -# Does not include gRPC connections. See grpc-max-open-connections # If you want to accept a larger number than the default, make sure # you increase your OS limits. # 0 - unlimited. @@ -182,10 +161,37 @@ max-open-connections = 900 max-subscription-clients = 100 # Maximum number of unique queries a given client can /subscribe to -# If you're using GRPC (or Local RPC client) and /broadcast_tx_commit, set to -# the estimated # maximum number of broadcast_tx_commit calls per block. +# If you're using a Local RPC client and /broadcast_tx_commit, set this +# to the estimated maximum number of broadcast_tx_commit calls per block. max-subscriptions-per-client = 5 +# If true, disable the websocket interface to the RPC service. This has +# the effect of disabling the /subscribe, /unsubscribe, and /unsubscribe_all +# methods for event subscription. +# +# EXPERIMENTAL: This setting will be removed in Tendermint v0.37. +experimental-disable-websocket = false + +# The time window size for the event log. All events up to this long before +# the latest (up to EventLogMaxItems) will be available for subscribers to +# fetch via the /events method. If 0 (the default) the event log and the +# /events RPC method are disabled. +event-log-window-size = "0s" + +# The maxiumum number of events that may be retained by the event log. If +# this value is 0, no upper limit is set. Otherwise, items in excess of +# this number will be discarded from the event log. +# +# Warning: This setting is a safety valve. Setting it too low may cause +# subscribers to miss events. Try to choose a value higher than the +# maximum worst-case expected event load within the chosen window size in +# ordinary operation. +# +# For example, if the window size is 10 minutes and the node typically +# averages 1000 events per ten minutes, but with occasional known spikes of +# up to 2000, choose a value > 2000. +event-log-max-items = 0 + # How long to wait for a tx to be committed during /broadcast_tx_commit. # WARNING: Using a value larger than 10s will result in increasing the # global HTTP write timeout, which applies to all connections and endpoints. @@ -221,9 +227,6 @@ pprof-laddr = "" ####################################################### [p2p] -# Enable the legacy p2p layer. -use-legacy = false - # Select the p2p internal queue queue-type = "priority" @@ -255,87 +258,48 @@ persistent-peers = "" # UPNP port forwarding upnp = false -# Path to address book -# TODO: Remove once p2p refactor is complete -# ref: https:#github.com/tendermint/tendermint/issues/5670 -addr-book-file = "config/addrbook.json" - -# Set true for strict address routability rules -# Set false for private or local networks -addr-book-strict = true - -# Maximum number of inbound peers -# -# TODO: Remove once p2p refactor is complete in favor of MaxConnections. -# ref: https://github.com/tendermint/tendermint/issues/5670 -max-num-inbound-peers = 40 - -# Maximum number of outbound peers to connect to, excluding persistent peers -# -# TODO: Remove once p2p refactor is complete in favor of MaxConnections. -# ref: https://github.com/tendermint/tendermint/issues/5670 -max-num-outbound-peers = 10 - # Maximum number of connections (inbound and outbound). max-connections = 64 # Rate limits the number of incoming connection attempts per IP address. max-incoming-connection-attempts = 100 -# List of node IDs, to which a connection will be (re)established ignoring any existing limits -# TODO: Remove once p2p refactor is complete -# ref: https:#github.com/tendermint/tendermint/issues/5670 -unconditional-peer-ids = "" +# Set true to enable the peer-exchange reactor +pex = true -# Maximum pause when redialing a persistent peer (if zero, exponential backoff is used) -# TODO: Remove once p2p refactor is complete -# ref: https:#github.com/tendermint/tendermint/issues/5670 -persistent-peers-max-dial-period = "0s" +# Comma separated list of peer IDs to keep private (will not be gossiped to other peers) +# Warning: IPs will be exposed at /net_info, for more information https://github.com/tendermint/tendermint/issues/3055 +private-peer-ids = "" + +# Toggle to disable guard against peers connecting from the same ip. +allow-duplicate-ip = false + +# Peer connection configuration. +handshake-timeout = "20s" +dial-timeout = "3s" # Time to wait before flushing messages out on the connection -# TODO: Remove once p2p refactor is complete -# ref: https:#github.com/tendermint/tendermint/issues/5670 +# TODO: Remove once MConnConnection is removed. flush-throttle-timeout = "100ms" # Maximum size of a message packet payload, in bytes -# TODO: Remove once p2p refactor is complete -# ref: https:#github.com/tendermint/tendermint/issues/5670 +# TODO: Remove once MConnConnection is removed. max-packet-msg-payload-size = 1400 # Rate at which packets can be sent, in bytes/second -# TODO: Remove once p2p refactor is complete -# ref: https:#github.com/tendermint/tendermint/issues/5670 +# TODO: Remove once MConnConnection is removed. send-rate = 5120000 # Rate at which packets can be received, in bytes/second -# TODO: Remove once p2p refactor is complete -# ref: https:#github.com/tendermint/tendermint/issues/5670 +# TODO: Remove once MConnConnection is removed. recv-rate = 5120000 -# Set true to enable the peer-exchange reactor -pex = true - -# Comma separated list of peer IDs to keep private (will not be gossiped to other peers) -# Warning: IPs will be exposed at /net_info, for more information https://github.com/tendermint/tendermint/issues/3055 -private-peer-ids = "" - -# Toggle to disable guard against peers connecting from the same ip. -allow-duplicate-ip = false - -# Peer connection configuration. -handshake-timeout = "20s" -dial-timeout = "3s" ####################################################### ### Mempool Configuration Option ### ####################################################### [mempool] -# Mempool version to use: -# 1) "v0" - The legacy non-prioritized mempool reactor. -# 2) "v1" (default) - The prioritized mempool reactor. -version = "v1" - recheck = true broadcast = true @@ -391,22 +355,30 @@ ttl-num-blocks = 0 # starting from the height of the snapshot. enable = false -# RPC servers (comma-separated) for light client verification of the synced state machine and -# retrieval of state data for node bootstrapping. Also needs a trusted height and corresponding -# header hash obtained from a trusted source, and a period during which validators can be trusted. -# -# For Cosmos SDK-based chains, trust-period should usually be about 2/3 of the unbonding time (~2 -# weeks) during which they can be financially punished (slashed) for misbehavior. +# State sync uses light client verification to verify state. This can be done either through the +# P2P layer or RPC layer. Set this to true to use the P2P layer. If false (default), RPC layer +# will be used. +use-p2p = false + +# If using RPC, at least two addresses need to be provided. They should be compatible with net.Dial, +# for example: "host.example.com:2125" rpc-servers = "" + +# The hash and height of a trusted block. Must be within the trust-period. trust-height = 0 trust-hash = "" + +# The trust period should be set so that Tendermint can detect and gossip misbehavior before +# it is considered expired. For chains based on the Cosmos SDK, one day less than the unbonding +# period should suffice. trust-period = "168h0m0s" # Time to spend discovering snapshots before initiating a restore. discovery-time = "15s" -# Temporary directory for state sync snapshot chunks, defaults to the OS tempdir (typically /tmp). -# Will create a new, randomly named directory within, and remove it when done. +# Temporary directory for state sync snapshot chunks, defaults to os.TempDir(). +# The synchronizer will create a new, randomly named directory within this directory +# and remove it when the sync is complete. temp-dir = "" # The timeout duration before re-requesting a chunk, possibly from a different @@ -416,21 +388,6 @@ chunk-request-timeout = "15s" # The number of concurrent chunk and block fetchers to run (default: 4). fetchers = "4" -####################################################### -### Block Sync Configuration Connections ### -####################################################### -[blocksync] - -# If this node is many blocks behind the tip of the chain, BlockSync -# allows them to catchup quickly by downloading blocks in parallel -# and verifying their commits -enable = true - -# Block Sync version to use: -# 1) "v0" (default) - the standard block sync implementation -# 2) "v2" - DEPRECATED, please use v0 -version = "v0" - ####################################################### ### Consensus Configuration Options ### ####################################################### @@ -438,32 +395,12 @@ version = "v0" wal-file = "data/cs.wal/wal" -# How long we wait for a proposal block before prevoting nil -timeout-propose = "3s" -# How much timeout-propose increases with each round -timeout-propose-delta = "500ms" -# How long we wait after receiving +2/3 prevotes for “anything” (ie. not a single block or nil) -timeout-prevote = "1s" -# How much the timeout-prevote increases with each round -timeout-prevote-delta = "500ms" -# How long we wait after receiving +2/3 precommits for “anything” (ie. not a single block or nil) -timeout-precommit = "1s" -# How much the timeout-precommit increases with each round -timeout-precommit-delta = "500ms" -# How long we wait after committing a block, before starting on the new -# height (this gives us a chance to receive some more precommits, even -# though we already have +2/3). -timeout-commit = "1s" - # How many blocks to look back to check existence of the node's consensus votes before joining consensus # When non-zero, the node will panic upon restart # if the same consensus key was used to sign {double-sign-check-height} last blocks. # So, validators should stop the state machine, wait for some blocks, and then restart the state machine to avoid panic. double-sign-check-height = 0 -# Make progress as soon as we have all the precommits (as if TimeoutCommit = 0) -skip-timeout-commit = false - # EmptyBlocks mode and possible interval between empty blocks create-empty-blocks = true create-empty-blocks-interval = "0s" @@ -472,6 +409,50 @@ create-empty-blocks-interval = "0s" peer-gossip-sleep-duration = "100ms" peer-query-maj23-sleep-duration = "2s" +### Unsafe Timeout Overrides ### + +# These fields provide temporary overrides for the Timeout consensus parameters. +# Use of these parameters is strongly discouraged. Using these parameters may have serious +# liveness implications for the validator and for the chain. +# +# These fields will be removed from the configuration file in the v0.37 release of Tendermint. +# For additional information, see ADR-74: +# https://github.com/tendermint/tendermint/blob/master/docs/architecture/adr-074-timeout-params.md + +# This field provides an unsafe override of the Propose timeout consensus parameter. +# This field configures how long the consensus engine will wait for a proposal block before prevoting nil. +# If this field is set to a value greater than 0, it will take effect. +# unsafe-propose-timeout-override = 0s + +# This field provides an unsafe override of the ProposeDelta timeout consensus parameter. +# This field configures how much the propose timeout increases with each round. +# If this field is set to a value greater than 0, it will take effect. +# unsafe-propose-timeout-delta-override = 0s + +# This field provides an unsafe override of the Vote timeout consensus parameter. +# This field configures how long the consensus engine will wait after +# receiving +2/3 votes in a around. +# If this field is set to a value greater than 0, it will take effect. +# unsafe-vote-timeout-override = 0s + +# This field provides an unsafe override of the VoteDelta timeout consensus parameter. +# This field configures how much the vote timeout increases with each round. +# If this field is set to a value greater than 0, it will take effect. +# unsafe-vote-timeout-delta-override = 0s + +# This field provides an unsafe override of the Commit timeout consensus parameter. +# This field configures how long the consensus engine will wait after receiving +# +2/3 precommits before beginning the next height. +# If this field is set to a value greater than 0, it will take effect. +# unsafe-commit-timeout-override = 0s + +# This field provides an unsafe override of the BypassCommitTimeout consensus parameter. +# This field configures if the consensus engine will wait for the full Commit timeout +# before proceeding to the next height. +# If this field is set to true, the consensus engine will proceed to the next height +# as soon as the node has gathered votes from all of the validators on the network. +# unsafe-bypass-commit-timeout-override = + ####################################################### ### Transaction Indexer Configuration Options ### ####################################################### @@ -546,46 +527,6 @@ transactions every `create-empty-blocks-interval`. For instance, with Tendermint will only create blocks if there are transactions, or after waiting 30 seconds without receiving any transactions. -## Consensus timeouts explained - -There's a variety of information about timeouts in [Running in -production](../tendermint-core/running-in-production.md) - -You can also find more detailed technical explanation in the spec: [The latest -gossip on BFT consensus](https://arxiv.org/abs/1807.04938). - -```toml -[consensus] -... - -timeout-propose = "3s" -timeout-propose-delta = "500ms" -timeout-prevote = "1s" -timeout-prevote-delta = "500ms" -timeout-precommit = "1s" -timeout-precommit-delta = "500ms" -timeout-commit = "1s" -``` - -Note that in a successful round, the only timeout that we absolutely wait no -matter what is `timeout-commit`. - -Here's a brief summary of the timeouts: - -- `timeout-propose` = how long we wait for a proposal block before prevoting - nil -- `timeout-propose-delta` = how much timeout-propose increases with each round -- `timeout-prevote` = how long we wait after receiving +2/3 prevotes for - anything (ie. not a single block or nil) -- `timeout-prevote-delta` = how much the timeout-prevote increases with each - round -- `timeout-precommit` = how long we wait after receiving +2/3 precommits for - anything (ie. not a single block or nil) -- `timeout-precommit-delta` = how much the timeout-precommit increases with - each round -- `timeout-commit` = how long we wait after committing a block, before starting - on the new height (this gives us a chance to receive some more precommits, - even though we already have +2/3) ## P2P settings @@ -597,7 +538,7 @@ This section will cover settings within the p2p section of the `config.toml`. - `pex` = turns the peer exchange reactor on or off. Validator node will want the `pex` turned off so it would not begin gossiping to unknown peers on the network. PeX can also be turned off for statically configured networks with fixed network connectivity. For full nodes on open, dynamic networks, it should be turned on. - `private-peer-ids` = is a comma-separated list of node ids that will _not_ be exposed to other peers (i.e., you will not tell other peers about the ids in this list). This can be filled with a validator's node id. -Recently the Tendermint Team conducted a refactor of the p2p layer. This lead to multiple config paramters being deprecated and/or replaced. +Recently the Tendermint Team conducted a refactor of the p2p layer. This lead to multiple config parameters being deprecated and/or replaced. We will cover the new and deprecated parameters below. ### New Parameters @@ -651,3 +592,27 @@ Example: ```shell $ psql ... -f state/indexer/sink/psql/schema.sql ``` + +## Unsafe Consensus Timeout Overrides + +Tendermint version v0.36 provides a set of unsafe overrides for the consensus +timing parameters. These parameters are provided as a safety measure in case of +unusual timing issues during the upgrade to v0.36 so that an operator may +override the timings for a single node. These overrides will completely be +removed in Tendermint v0.37. + +- `unsafe-propose-override`: How long the Tendermint consensus engine will wait + for a proposal block before prevoting nil. +- `unsafe-propose-delta-override`: How much the propose timeout increase with + each round. +- `unsafe-vote-override`: How long the consensus engine will wait after + receiving +2/3 votes in a round. +- `unsafe-vote-delta-override`: How much the vote timeout increases with each + round. +- `unsafe-commit-override`: How long the consensus engine will wait after + receiving +2/3 precommits before beginning the next height. +- `unsafe-bypass-commit-timeout-override`: Configures if the consensus engine + will wait for the full commit timeout before proceeding to the next height. If + this field is set to true, the consensus engine will proceed to the next + height as soon as the node has gathered votes from all of the validators on + the network. diff --git a/docs/nodes/logging.md b/docs/nodes/logging.md index 31a9d08d20..9261dd0edf 100644 --- a/docs/nodes/logging.md +++ b/docs/nodes/logging.md @@ -50,7 +50,7 @@ little overview what they do. they are coming from peers or the application. - `p2p` Provides an abstraction around peer-to-peer communication. For more details, please check out the - [README](https://github.com/tendermint/spec/tree/master/spec/p2p). + [README](https://github.com/tendermint/tendermint/tree/master/spec/p2p). - `rpc-server` RPC server. For implementation details, please read the [doc.go](https://github.com/tendermint/tendermint/blob/v0.35.x/rpc/jsonrpc/doc.go). - `state` Represents the latest state and execution submodule, which @@ -120,7 +120,7 @@ Next follows a standard block creation cycle, where we enter a new round, propose a block, receive more than 2/3 of prevotes, then precommits and finally have a chance to commit a block. For details, please refer to [Byzantine Consensus -Algorithm](https://github.com/tendermint/spec/blob/master/spec/consensus/consensus.md). +Algorithm](https://github.com/tendermint/tendermint/blob/master/spec/consensus/consensus.md). ```sh I[10-04|13:54:30.393] enterNewRound(91/0). Current: 91/0/RoundStepNewHeight module=consensus diff --git a/docs/nodes/metrics.md b/docs/nodes/metrics.md index 6589e044aa..1b2e9f0070 100644 --- a/docs/nodes/metrics.md +++ b/docs/nodes/metrics.md @@ -40,6 +40,7 @@ The following metrics are available: | consensus_fast_syncing | gauge | | either 0 (not fast syncing) or 1 (syncing) | | consensus_state_syncing | gauge | | either 0 (not state syncing) or 1 (syncing) | | consensus_block_size_bytes | Gauge | | Block size in bytes | +| evidence_pool_num_evidence | Gauge | | Number of evidence in the evidence pool | p2p_peers | Gauge | | Number of peers node's connected to | | p2p_peer_receive_bytes_total | counter | peer_id, chID | number of bytes per channel received from a given peer | | p2p_peer_send_bytes_total | counter | peer_id, chID | number of bytes per channel sent to a given peer | diff --git a/docs/nodes/remote-signer.md b/docs/nodes/remote-signer.md index e7dfccacdb..39a38e1b7a 100644 --- a/docs/nodes/remote-signer.md +++ b/docs/nodes/remote-signer.md @@ -37,7 +37,7 @@ There are two ways to generate certificates, [openssl](https://www.openssl.org/) - Install `Certstrap`: ```sh - go get github.com/square/certstrap@v1.2.0 + go install github.com/square/certstrap@v1.2.0 ``` - Create certificate authority for self signing. diff --git a/docs/nodes/validators.md b/docs/nodes/validators.md index b787fa8a46..e7c3a3cf43 100644 --- a/docs/nodes/validators.md +++ b/docs/nodes/validators.md @@ -109,9 +109,9 @@ Currently Tendermint uses [Ed25519](https://ed25519.cr.yp.to/) keys which are wi > **+2/3 is short for "more than 2/3"** A block is committed when +2/3 of the validator set sign [precommit -votes](https://github.com/tendermint/spec/blob/953523c3cb99fdb8c8f7a2d21e3a99094279e9de/spec/blockchain/blockchain.md#vote) for that block at the same `round`. +votes](https://github.com/tendermint/tendermint/blob/953523c3cb99fdb8c8f7a2d21e3a99094279e9de/spec/blockchain/blockchain.md#vote) for that block at the same `round`. The +2/3 set of precommit votes is called a -[_commit_](https://github.com/tendermint/spec/blob/953523c3cb99fdb8c8f7a2d21e3a99094279e9de/spec/blockchain/blockchain.md#commit). While any +2/3 set of +[_commit_](https://github.com/tendermint/tendermint/blob/953523c3cb99fdb8c8f7a2d21e3a99094279e9de/spec/blockchain/blockchain.md#commit). While any +2/3 set of precommits for the same block at the same height&round can serve as validation, the canonical commit is included in the next block (see -[LastCommit](https://github.com/tendermint/spec/blob/953523c3cb99fdb8c8f7a2d21e3a99094279e9de/spec/blockchain/blockchain.md#lastcommit)). +[LastCommit](https://github.com/tendermint/tendermint/blob/953523c3cb99fdb8c8f7a2d21e3a99094279e9de/spec/blockchain/blockchain.md#lastcommit)). diff --git a/docs/package-lock.json b/docs/package-lock.json index 8bbdae8cc6..447c8c27d0 100644 --- a/docs/package-lock.json +++ b/docs/package-lock.json @@ -3037,9 +3037,9 @@ } }, "node_modules/async": { - "version": "2.6.3", - "resolved": "https://registry.npmjs.org/async/-/async-2.6.3.tgz", - "integrity": "sha512-zflvls11DCy+dQWzTW2dzuilv8Z5X/pjfmZOWba6TNIVDm+2UDaJmXSOXlasHKfNBs8oo3M0aT50fDEWfKZjXg==", + "version": "2.6.4", + "resolved": "https://registry.npmjs.org/async/-/async-2.6.4.tgz", + "integrity": "sha512-mzo5dfJYwAn29PeiJ0zvwTo04zj8HDJj0Mn8TD7sno7q12prdbnasKJHhkm2c1LgrhlJ0teaea8860oxi51mGA==", "dependencies": { "lodash": "^4.17.14" } @@ -8876,9 +8876,9 @@ } }, "node_modules/minimist": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", - "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==" + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.6.tgz", + "integrity": "sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==" }, "node_modules/mississippi": { "version": "3.0.0", @@ -10389,9 +10389,9 @@ } }, "node_modules/prismjs": { - "version": "1.26.0", - "resolved": "https://registry.npmjs.org/prismjs/-/prismjs-1.26.0.tgz", - "integrity": "sha512-HUoH9C5Z3jKkl3UunCyiD5jwk0+Hz0fIgQ2nbwU2Oo/ceuTAQAg+pPVnfdt2TJWRVLcxKh9iuoYDUSc8clb5UQ==", + "version": "1.27.0", + "resolved": "https://registry.npmjs.org/prismjs/-/prismjs-1.27.0.tgz", + "integrity": "sha512-t13BGPUlFDR7wRB5kQDG4jjl7XeuH6jbJGt11JHPL96qwsEHNX2+68tFXqc1/k+/jALsbSWJKUOT/hcYAZ5LkA==", "engines": { "node": ">=6" } @@ -13045,9 +13045,9 @@ } }, "node_modules/url-parse": { - "version": "1.5.7", - "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.5.7.tgz", - "integrity": "sha512-HxWkieX+STA38EDk7CE9MEryFeHCKzgagxlGvsdS7WBImq9Mk+PGwiT56w82WI3aicwJA8REp42Cxo98c8FZMA==", + "version": "1.5.10", + "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.5.10.tgz", + "integrity": "sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==", "dependencies": { "querystringify": "^2.1.1", "requires-port": "^1.0.0" @@ -16588,9 +16588,9 @@ "integrity": "sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c=" }, "async": { - "version": "2.6.3", - "resolved": "https://registry.npmjs.org/async/-/async-2.6.3.tgz", - "integrity": "sha512-zflvls11DCy+dQWzTW2dzuilv8Z5X/pjfmZOWba6TNIVDm+2UDaJmXSOXlasHKfNBs8oo3M0aT50fDEWfKZjXg==", + "version": "2.6.4", + "resolved": "https://registry.npmjs.org/async/-/async-2.6.4.tgz", + "integrity": "sha512-mzo5dfJYwAn29PeiJ0zvwTo04zj8HDJj0Mn8TD7sno7q12prdbnasKJHhkm2c1LgrhlJ0teaea8860oxi51mGA==", "requires": { "lodash": "^4.17.14" } @@ -21113,9 +21113,9 @@ } }, "minimist": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", - "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==" + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.6.tgz", + "integrity": "sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==" }, "mississippi": { "version": "3.0.0", @@ -22350,9 +22350,9 @@ "integrity": "sha512-28iF6xPQrP8Oa6uxE6a1biz+lWeTOAPKggvjB8HAs6nVMKZwf5bG++632Dx614hIWgUPkgivRfG+a8uAXGTIbA==" }, "prismjs": { - "version": "1.26.0", - "resolved": "https://registry.npmjs.org/prismjs/-/prismjs-1.26.0.tgz", - "integrity": "sha512-HUoH9C5Z3jKkl3UunCyiD5jwk0+Hz0fIgQ2nbwU2Oo/ceuTAQAg+pPVnfdt2TJWRVLcxKh9iuoYDUSc8clb5UQ==" + "version": "1.27.0", + "resolved": "https://registry.npmjs.org/prismjs/-/prismjs-1.27.0.tgz", + "integrity": "sha512-t13BGPUlFDR7wRB5kQDG4jjl7XeuH6jbJGt11JHPL96qwsEHNX2+68tFXqc1/k+/jALsbSWJKUOT/hcYAZ5LkA==" }, "process": { "version": "0.11.10", @@ -24536,9 +24536,9 @@ } }, "url-parse": { - "version": "1.5.7", - "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.5.7.tgz", - "integrity": "sha512-HxWkieX+STA38EDk7CE9MEryFeHCKzgagxlGvsdS7WBImq9Mk+PGwiT56w82WI3aicwJA8REp42Cxo98c8FZMA==", + "version": "1.5.10", + "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.5.10.tgz", + "integrity": "sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==", "requires": { "querystringify": "^2.1.1", "requires-port": "^1.0.0" diff --git a/docs/pre.sh b/docs/pre.sh index 37193d265b..76a1cff99a 100755 --- a/docs/pre.sh +++ b/docs/pre.sh @@ -1,3 +1,4 @@ #!/bin/bash cp -a ../rpc/openapi/ .vuepress/public/rpc/ +cp -r ../spec . diff --git a/docs/presubmit.sh b/docs/presubmit.sh new file mode 100755 index 0000000000..19e931a4f2 --- /dev/null +++ b/docs/presubmit.sh @@ -0,0 +1,39 @@ +#!/bin/bash +# +# This script verifies that each document in the docs and architecture +# directory has a corresponding table-of-contents entry in its README file. +# +# This can be run manually from the command line. +# It is also run in CI via the docs-toc.yml workflow. +# +set -euo pipefail + +readonly base="$(dirname $0)" +cd "$base" + +readonly workdir="$(mktemp -d)" +trap "rm -fr -- '$workdir'" EXIT + +checktoc() { + local dir="$1" + local tag="$2"'-*-*' + local out="$workdir/${dir}.out.txt" + ( + cd "$dir" >/dev/null + find . -type f -maxdepth 1 -name "$tag" -not -exec grep -q "({})" README.md ';' -print + ) > "$out" + if [[ -s "$out" ]] ; then + echo "-- The following files in $dir lack a ToC entry: +" + cat "$out" + return 1 + fi +} + +err=0 + +# Verify that each RFC and ADR has a ToC entry in its README file. +checktoc architecture adr || ((err++)) +checktoc rfc rfc || ((err++)) + +exit $err diff --git a/docs/rfc/images/abci++.png b/docs/rfc/images/abci++.png new file mode 100644 index 0000000000000000000000000000000000000000..d5146f99573950d5b5a9f7fce594a2cb3c719c5e GIT binary patch literal 2792638 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 h5@@W{iFO$Y!UH2l}Dv&N#OKfey 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%0AX;UMBDuJu1uY09ZlY_@U>X}UV#I1Gi%cDaI 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 J5U(3mQs<=;J(!d6#$Fv%WzLU=zPK7M$qBeg>M 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 ~ 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 rPS?R%#7i-)emg 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

w zXZaBhyKSVFvlDe?FC&lYFX@>5O!_ySX&k2HA+~Umh+^7%Dx?E+GnEWyjFX((M=d?n8?%jm@2@sPS~{U=j-Z2 zUHIlWx86!!eSDaw-{?03*M(}QQ8;pq3QKkYa9adFGBX|5$8NSJHe2C*E+`O3l>zID z$oF@;zp&>d(=t^bIkZ?h+)TUgf(rVDHJj1ZhW`E+dT9sqaS9QH>e!iG95;+6}5tTaW`8c>n4wxCnh*UN_O z&taTEAt^~rYTt7k#BS|88^AnI3kd`9fO7kfJf@Ku!6CtrVNTK+4d2@}yAC|bQVKon zkW&Pm(690{uO_Fn$aIebzROVu@4>RCAJqu6s>X$2sfT@o7%cKIA!XOzYDpbuQhNyF zcgEyE<#gJX@K{{ww*dzyWO4#4Fl381XJNBHU>gm4skPG+)-NI^6x@3kh>39s@E&70 zzSwr9ceyti__}NEm0wMK24+@#azx%4#HRBhnp8hE(x<^0%CCcC zcc*0Zo3#%OZmYje(8BDKOSvF<@@3{pOl8qZW_-eL9DAaHpF3M?RK%w^r=d%U&+piF zyG}=+gY7N*-K$DdCxXc8CMyaO)P@uUv68T6880L%9RDaS&Z>=i4_2;m5_X|>Vsnv4 zEmSnxG!EXTs2$wu15%!z4K8FAMhb)kC6>b+l4n|(l~S3WQzAaboYaPn86->c70%Hn zftbn`--(RdL|=1s#&w~qTgRK2(Wje*SUdo0v31u_H8N!&)U*2RYZDzNQ>Fqgg+LkL z@N0zU638#$dfyVy@=i*OZYg_64 z9rY)+!3YfLk>w)|Fz15^%nYXDH8U~)x}2oItFN2_i3&y$#gp?R(R)qGU0iGN)}U16)r>9}7=#gn@6bR+L>QZU;>;W*&F!&Z(i|I>RJ>jQf zlOMew|8O1Qas5v?35VyAup|cr6JyrFh61Zz{|&W|nhKwhU9A8sI`9z`bI>E(6&?JN z3TbmbYIjeMHpBbc4t}IJJRNg8uNq70X;@a*mM9g~_h-I~jc(wN55QnK4CUZYTvQ$P zy!d!f#flj0H&1rL*ATyxmH7i4Yd+2HcKE?wpSmUgiw?LX@i(963WO9kUDW$PX`FTL z+xm+~nMikZaK#r6R5ND(n|QdL!<@M11S!gOpj+TQ#NJxCY-q*YZ*s%#d&XzI(4!h| zI&SGYq)=l=e5+3VqTzq zZ$aZQkcX2;9x&Bt0sE%^SJ+6dLk>(WkVwoIqx~+WlWYu z>HGK8cU5f*(?Z1qU+DU*l=g^aqs1f;S_6ETYG60-Kz-|%1^Vamtn!QPb?sZ$Dju472{$4mDO=Erpremg zQbzjGE0(=c=jv!#WUf`URZpC&{lLMzNN-ocOOLO@wIWk~MzFrq+lBzdb(psabIG?< zM4itq75sV*_$gT=0z&yHCZ=?zW;ES;PsJPFE)PhxfD%n{c8a6%9r+&i?7R+58X{G5 zQZ0SlGb_OxX`y!E3q@nnzq?)A@sFzRQ?NL5kbz$RZmHx~&o%aUwh|mXH{tD@SHKL0 zR#mZJEbKcKSl=11OgY>q#qMR+KkoKW0Q{D#6C!fIZ66-Nta)q*zchKXeBnXq>SPQj z9?h_3fRAk~*}<^oGD>=cq8+cLhElO~@8U49@z*yQ{=Hq1!5L8I%-fB_5q z^gqdl6?zFs-X`;i|*@MBo{%lo!g^C7?f?_`&dLwNSrY#hnTn`baNYtpo! zc+i6<38BEYiJ^xYkUqR6Qjt(>*x1z0_Tf`(8~sB`qt<8924WM%K;-Vnmfr)h^{Cc2 zd*s^)PaqI%jUn@CO~GI~+6lqW+OzDWc~x3YgPCr2BSL@TggbS;%2a=nNs;@M}57$J`diOpCZklxzEFf1T=oOoewj zlWeRHhZV!~u#;F!`bVrTKh)gztTX*xxo6AY7QOWNda5L5y{q{vR<)&3ls z@_oS)Mnee=7sG^gFO~GgqkW*-m@OJG%*iBBE%kB&Elcq|&ti_lWQH0J{aM1qDz@g` zth9rge&w@yc;niSnjWagq@6YSn2o5UHHC8-T#JNq$;D}t)E3>1gNJsuS6r^}!{(@` zDRFNgdJjS3hQVj|H4GX&v}3H*B>+S+uS9S3iYN9nPzMX*WiKZ!MiO3CE*)r~(sIV3 zFVGZADCq*ywG~R4kF3k1uQcoM{H+wUxoaJW5v}tGVWzv?@idVsG@1raTkeMJEG$$$ zRt_RR@((bKCo^`?fPl7uMOg;8LbpE`oVmE9TPO_zEE_91n^kPCLmoO=M~(M2b~mKb zLn1UA){y`wWHH8hm}gp0SyL*8BzD7^eYnF5K;Vj_)s|#CCg8)Gn9G6e(-9EZB9&!^ zsoM~2apok~KvADj*1^5VaC;`YGfsv@B#1onYWQ;Jfz5wKl_&z6#LsenIVO@_z_x|p zi7$%NwXt1p#bh?@)w<#}LEklLt&6F?e`%7??GUlrBDV-)#hpVIsskv9CLN4ZBPkNM z2ju1S+6Z&$eX*o#a<%Ak`sS7G7~Rbm?rFsv5nwQEra~KY z7Re2_V7%!wcQ7JB(2h$kR4LzMAZvEvu;Im2VM zhKkoORQstF;_{8C^Gy!^@=UxVm8Fm+xJBq|b0n_gk(hLqU))nKZ%rh&QLMaQdA1;4 z_*pleDB^REoa)UtzSzh7Hj7sk*3o6}YvxnJY4aOqiO<}xxA71-07e6^nB}WePHn5+ z-mFwS9hy)OS(cSFSkQBXdvAPovSa)FAwg5{QCz8k|1#}5WN z+$Bdp|DM}i`h5BE1j?=daYDV_Lz3s;4}fhF%O}L?46NAI0+Mh$%+0QzRCb)rYhYy} zkmfR^-BmpB9LWl?#DvQ4lXL~`|Cyo3S^QNff}ablmSskQ(Z)tb9!r6!12kwV%mMXv z5-Vdl=x9T91bI;D`Uyq22{=ovp{xX18@07i42F8Ev-VGft>twi=~hrSGunql+sfzU z;%9o37asA|MF$QuS_uVf=(f|w%t6G5{tY+a_}9ohf25>0ts>aCvi)jxkABAwg{hcA zfOv!Rm!Sh@j{j>a)Ot*we6%Th*8NICBut(*)JC&~x>)j#yWr$=#^Y{aZ{`QOQkt@J zoeW{FOeiDebu_LoZ9fZNTT7O8m>yj-tP;IF+j3+MGP)bU|9OL@Vtm%1G9ZKC2YtPk z=~Lh={@epxcQU_Jh0jXFauFe8c`1DpXb0QB5g6mtdFhx(&p=z#F?ah5g`3^ONQP!j z5)h*DdfuoWV}X_Vk`4z++zi7J5ld*ei+`Ac*h=N2_Aa)Rq{*YRDj+o$tB?eUQPczd zq1In;4T-AtXY4Y0U((N#L=xCxh6x_eLmKu0-Xc4CY}N1J%}YNbSe!=nL>)C=bM20H z{HV302-|%b#DI3lVQ=+yXq8hpzy4<3U8QG{s?I?yGr=+v=Lh$P=#S44IWw;rmVW%< z{|%!9%#yCFhM+A$<&uC`N{bYz{D^-1=u`{hj6SpToCBw>IR6KAd-e8JMz(}CE&koSO(hoszNMAKi^Y4_>`cUbs!M0(HPht zcPYJJWokGxZw&-*{x!EQ=gqt!L~$#9b8llcJyO`MCA;~ZZ+B^i3+{=FeRE?Cc_8d^ z-Y9iBd=tO~-*ru;O|A<5DkeX_l#rNe5nyhy!p)!|aG+JJa3x*-S<|pd-AO~hL6O}8 z)Sn2LHh}&vSD!A&Km7~xS})3jBGnIz+eY&MPuWBL=&_55+8{y0y+(eq2PZRm&Aam@ zxG{H?=}Yu5CbwV9&V$jc-CAXpwO#bA;Xf`cb!lvKdAI%Hk1f^dPtj$%*UQRMLNi_g6#MAcPgi2@Jo~h3 zfj`ZS4_4@Gb?1sVAoaf&)-l``j;n*Q%D)2@wC;S!u~ZSRcfsy!2fhm7rM%ZXb^rT7 zEz|R{wBzoiQn+g7j@N}De4j=JvbC@B3h%6P4`t?XwGgw@Q-_tKoD$JzhAM)lU>=d?a4bE1;0`_O4jD zk$O=6{kGMJ9I|VEA%(ZmVnNjeHNO&{)a;go>&O~R=IoMevZQlza~yc+Kjc6{KF{_? zpPOD6#fh#`42*ds@BA$NTE~gvV(E7oIaaA0m$?a3v4+)E`-OrVo_?N_7LzqXHp& zKIP(veo>kQ*`KXGU0cfIS}B3CzVOq1*fJ9Vmp=KibG@!mQrpDimEEcMnl|4V>AE}U zzO#<=HFvn~6^&HGwZkIzusnjZ%Rlq|>RHm@9sLVZc165Ci|P`glM$V~X?ygJL3O2D zhydRkXT(}I3xebl7o7U~4XNgP|F6q4uK#d4m27kHQI(s0D%;=y!vN=zxPc#1g1lsQ z;d#cxZ>^iXGth}$mdg-nra8ag#aFB2IPfQi%|A808hAJ61vC-p?Kr_cW2K zL=l&970AMw(@)Z{KZMP^v;SaWm*DQ|q37or2^I@d`ZX)&Fk~W|59p<0B5+fUT`0XsgbE}QwthI{UA*BDUM$7928~2Z z+A4PNO3yo8V)$5J`HDW{CTmZQ$K+==j<7r{)$bCE(JQPo4zj1n(9wwy?5q8L;i}X( zT1JVKG4g6iIJG#5m{-iLOA+bGv++|_bs7_|brIVj&n}b>> zvh2Q8j60OM)cEf6bw(oe&pQS|METi8~n08AjE&4arJ=a ziEAVX$7S&^B8|d-8HWGzN{HaL;#y?#P~jaG+@%+Ux&9Slp8867)5Hl`y4Hg{#CSBH zE0j+)OsY(s#A)sGE+Uw^!Va^x@egwZ;)@4IsJ0jI1fPF=E&e%TSs2atYz=}t1DjPwci0f3!i>#zyEtQ@%8UTPV>O~zvSia_I&&vy$*YtO+sB12*Xpu z{e&evE!x*W+J9rSe9C>Z?v+tzvp{Q0x(9*!ukAX}tp|BHxT%FM(=@VKd;Lt4@kO1! zWqDBdv&AKv_jzV9Y)0HT>-BV2Jaa60UgLfsJP8D6?3W%qa)uB#ymm^{I-`z=d7m_l z2`e4P?an~ph*Gjq2K%Q#+tW*}?Z3HO3+K*M&M>y@xQPkuXBX;2dg__l$8qI(i2rm? zpX517bDtOV^(s%tDpZ{z2mQax5N9Zy?!3)Dy+HK2ErRuHI^kkl%xKRvfPdP#XCg?p zC1^y=+oi`HiQ|>{IAWbe5^-MNiW0~Kpd@*&^{bxk_i$`ex)?&%|I<*MP!QZyP8u zQWS2f7?@Sl(%SQ5-??jOtAEzH74+t_h%pU)^ilnpH9Em?YuAQ&35koz><}5Vgg}bO z_j-h+OmS7 z?@b15-8S~sByR$=wxd9|$x((Zt&0z~McNvK(tLUNzHI+Q6IgxHQ8v3$yer8Ye~*OU zQ(|4%6rM^7vGmxF$gG}?0r2E-cPed1wQPlh1&_Yqa>KgG%G#aLHKVHPa^|YMAr;&C zL*AT^kU_=NEMgJDs3VzX??v)-bnZ4KDyPepOiMh0y8*zZii8fYWkp!u$JN04xiL~o zjRmqRPE{x=!5Bwoe%h6X{7IXYDluyt-DI+HNsO8D+5=zZ9M*N32!>#`c9J&}I5)hB z&`@}sN%13z4FeP@r<50xsWUw4K}qzYIbPk&H+<)!9N9ZF&$RWaqtL{wM^3|dHc}lMSe-weqt=sQi6t7N$QDSsf>k2tpHQ?ng09UC0AjpG9I~>4mm@zESl1e z`|rr!{&4UQkkhg(u5DF=Kjz`%Uyu)1;{oY6gg@?`3jRu!y<)mxPt2(M>`k=ifD#JH>b)UR}hGOe8uKD#pb(1hY2aQ zpPZ{h3HbHYfu3(#P@<}Vty^8oq3q=-fIAfy6*2qb$P>v`yuxwMp%^qLr_KIND0%Uw zNL^ofTC>UyM&C$@=83_s{9G_^qip_r2n$RkRvH&J0|c?)!Lx$EFZGOT2WgAT%rxf5 zW>i1BVI6D~Q_T;ypbbQD}?p# z>JJJ%<@CZfe|A`-j14IH!MyPNop-)xA%G7bp6ud;0e%sCT$-JRq+%`mE*_94H5G^6 zuC7F#a{;KSla-ia70c7i!Lv||p z>*c0h0j^c(vU3xp5 zf?Cof(*5QcO|4PKXG4voOkhV8Wrn<{tt|=Jjs7AMwbRE*NC@EMm}^m)9__ogfAdST zLr6UxiCp)xwW8B&mSntuRQp_w$r-u8A=bvLyl^_giv;fB7r?x-8Pq8nY7t|mQ}L}e z=Ik>L_L2Hv@xY@!0J5IewpqLy?Y8w7DJ?gGxn3aC9WL8>{@@j|B7fnhsLM(U)5TKx zbmf|_)tZqnhF)@};xI>iw30-ScS`Q5dU&RzDw{-GPj;2#fJT^$j)WWt zSlWWyziWCNn92ItWSyikjaSaPWE)F_EFPeplz5Pn>=(RA=u0PFMX~l|t{4@d z(5+TlSlsVD&sP?Sipkx%rax|`_`5{*lpSnW4AnRl{hAI={^{0MtBRHf%&W`jTXP03 zql?2SWlxU7&}K>*>kpjt6HCv<0~50%&b=0i6BzC)pRS;t-t@ z(i#0e!=D}JRE)=tQl^LhfXIv z1gsokgb(!`9fJcpWc0t*Sl>~haPU57zdUU@Gq6oFU`jitoaX8;v#^#;IDE3-HS>i} z<~+$I(u|_NmoFq{?qNk1D`e z3$QpZEi4=?a1Be8+XN-1vG+nR zGu=bE!A8W_l#fM=dBObcFOzycb#;E_f`QT&qd3evtH+XwT8+NZOg{|0$KNVX2wEdD|W1{z`9z z+U47J)QV;33o=r4i(@NS)2A#HdGX_WaHJzMN8vY zUR#`doM-%-i*c)&ENHlo=T|%g6yf zW|7OFFGG@dP7a=|g<$BAqJxW=fdHIcE!@rFAM^RK-9kzO0cWV}URsyfUIpFiQ0n}h z(P^v|NfKPU}FUhlv3Nv&66C=Ae_+V7E>=&Mm3=$pOR8! z#|NwSj0>X{bKGqM+HPlvB#5k?vdx)fPn@wj{bE7V?M&4OQFk+2oiyM5*G+FhPfbPH zwd#MD<#J^EbX`#F{naCmik`&_ zy|q_XHo|Le+|1B0iH`_r*M14T6gT4w{p7aqSBkK;1tF?;s@!;+ zSEl@kCyhML>rtntbW8ld?Mg`|ru**5|H~fC;94Iwo2V?@pf-M8LU3qlQ$n8`%hGIz zS!GgBE!7MJg^Ul$o7rY-SsD=LId(^DiIJ4dZzi>tE3EBJd3iZV-!1ofSAgs7&!S`Y zytEQyLXeL%V^b4k@RaXV08u}C@++hie#GHoz99dfh*HO;_xf+D%L9koU+EqjUz*$w zBZZ%CVr`VPJ)3gIFr}xS5^X==(ncK8tHt;KwZu-#iD{I`R($JJ4Hqrn*4E@sZV%(k z)e-|%B%JgPJSJJgHtyU=b0O7(#P)vD-o!_%fe%1*NaH+ma#Il{7q&nd#Akb3I})<| z%Tovuxz^0Vs5Q~((|Ut361htWpNk?C{7OA(#1^8D&kPxn7R9{iCB8If_H^#Wc)mo8 z5OSY6wIidTESk0on;xHecp@CcU4Hyl)-S!_QB-}Xl75qvYt`3wc+8|FtZb@o>gmL& zmsX1*g$P!Y6i;3Xe4h-ybSIVuL*p-?_Ai|e=%204R@~KBq;Q<+UZLga78fu3Ox(mC z0V~?0!GH{J)PGnwLoC_7H9iv9MO#p;u3QR1fsV^R#8W{nhRy3l8q*qZ-FCAS-ez?n zz<@o##*XZm2}=?EJg?rFCs)`xMrv5?QXSh|p1TT0zjlk4V6oCL zY}B1H3Y#6*8an-}AbXxG|w7$+Igu*i3X&OLQ+E1Ynw zqu=Wochas7t680MehDZH(|NrwV0|?z{CvdqLoPFZ_ z<(dEfzwd*YTFVXM4}4#8FvPn0JZ9$XTceFpDR%L)YY)GiSp6!eYTrdlH|uuWOfu0W zKUdFU)PV?aVP13IEM=nsLRxK7@khR)S6x;LJmAXGO+2F^Aw6#p^Y2_^ovVyyO67@z z7hM{B{HjgG@dnYV-U^LiZ+gt;d9JParHX|2kYe~K7bm$%CZ>Gv?}RNz7U=8YL zr)LX@(Dv+Q zb%H*{vLKB~lHg131OI31u$jaI2oq(B;QW+I9u1xhRTr)qlxzCV95!N&D!XZDN;vXB zEYp4W_cv6O17d0arB&xtA>dg_BP{ucQU889q$$G$MTl+_te$oY@Gl=lPb#x@d;Xilx$Ay(+lH^Ax?H3r$+?J|N~JFp zeMcoGaX=|RS{+y9oaN3%@{!x&O6CkJ1S;vVo2C4S#Eg_AI=dIvl3VerW#BKVC#B9# z#K%qfcU4@IEoTF5;`LoYv*A*Kle^O{z&=QxZky;?b+D2$P}+ znR4C(Zkz~!OzD%43&OeNTHW}bV(-5%-ft-p zcLKaOx_?JuweFlZ!{>0=bB8$`XqMzBd|&40t^1x%v-2(tT#v(# zd_HFV04`qW6UCGzyqw9ql#qh3ZR{dFu>r;^IKM0ec&NlSjIw&|CjP*vews;b5}FP zEm`sOTU{}?eyLSu)QbF_L~(4Gz}Y>;SG7wL8{Hv!duK$+uDtq?5fpr5|L* z&Rls}J*Zji(cK*0W`=|k3j66qb-llpao=@uzwTvqOC|azzbTL7K5WD-KeVj6)V{02 zeVZwH8^T1jVL5`9dKvfNTuC|CSTFgKl}3h#h-`%2TgB9H2SQm zJL?ygxLcm%`8@8uPnG@GFEXPV#vexaB>b1@uc@RgeEg~7%Kkf)ctWoHdMPEm(;d7k zD5e^jks$(7ZS`a!{PSu#8Tp^~Tq^jJm+UPsRm}6=N)LUK;nxU%CzX)ToY{YDhT$3H zVZ`1p{?rOlCg9{CSZ17K5nH(jcHV5!HEDc?r@tHk8Ns!j{gTh+A%#5VdEWznzp#2) zl9ZroaM*zR!0yG7zjpPMa=k(J2RmMB9hK?Q@Jm4_>Ar>OHym8@Ev9NA*4x*xnq`SR z@ww#Z=*%MyGq0+vag_!;f{9;8*AZ_pJ1vgm}M2vtRyho(-_aoetihLi_QnWVfD6 zj~k+-SNV+?T(h-R{=>_Z7=^~HjIP*LYO&dw{dphhqMyUECOh5XEhkjGuxDdB0y;;f z)GL=_``kqJtciu{Gqs(WvS&r_bSTBaS z#*;^;PtOQ5p)A)7zFjA~Q;3`Z?AagN-7CfNrpe|DLi_E-FQWfL(|7+<^*`_zMP_w)TezW>1a>73{5 zb)HjRZc!||W8I(xBmPgJeCyR7kwdkU4wuF#rDaKd#N4lpNPA$D6uj>;gg4%WE!T}ADH@%)N8$$Sr^GtC5_70 z)6o&0iYP?bahJ=k%hXuxwU32UeVpFk^S(El!ZuYmX1~7KMtjSk9y*Zgi1Zvo?ho8Q zJzy?$&dk9=e7Kb7;c#93X|P=FlhHgd#`apPaa^uD5z$58zf%h2o79UruZPB2-&2#C zDLnctS{$#cUDzi+`KMdc#K3?L%G<=WZXomuhdL5&!K{sYc1N&$Ei5eDd+~2KnssVh z?q|Lk$)%4_z%}KXYqRO;IOCBMDw5}E{s0xCG}#ZvPS{Q>02d#W!?q3TYtD-CAzi=K z4F{Bcf5`~(McaMBMR3XDgUk=xM}bm(+8U7J(Ff|@Be5)tyqe8s@2W17*>GLW;UJ39 zrD-=i%t3NlSCY*8i@6kiw?LE-{+27t33WTdHA4qbuX-qA5Ug(+xNIMp+4y4>+pwGA zRDL~PH=CHG31)0(b$jy{A@`NjhOf}*AmS1(+@s8XX0A6r=Q45-)X42`v!4WZm0c60 ztKB-7WF_6#c8-VU`b^e%Fm=6(=Mt0N?9W!@l~>(vb=itxnOnDvni#=ulbSnuOwB5UB50)Y>$oiR^(olC&IxCk=faFq{1~r+Pn(1dbBY1z!V>_O_<2&C zKKHiYgx;T+)3+d@ujgRqyusfcr+t0Z()Es{7SE%4Er4WwV^jN9Jui_3+N_ul|@T7QVX$A0=KT?Ua0xdAmPAchYxn z%D69jIf?98I3+!)i^}@TLT-#Gl|^6t3L|6G(#+MI2rs;iQ4?(@Jo%+Txblv`!Ylqt z;Byj%yZj;Cyhac3dO9E}S`iOdK1^Y#TNUnu zhlZk*H9INq*-L#{_Q!Fo61gw72dU3i-FvE_SsZtvw`uta4@=T%xS*uvB{IL6b${)N zaip7^;{&6f3~~xoDX=7}Rc1#z@d_djHm-Z-G6csALnmDp7|B>xnJx;}65|>Nv?VAO zXugCDGYvhD+U7Fvul#B$$0EQY!6M?=5or0Ihxm(-lN(YoGoAWcXpn_NzNZJY9*n>O z9^EgHH)!O6G<&}Igt}kv%87aG|0wb9s5>(4_eKv&wP_S6irAJ%lXcw`Wp-p z+n#NulK-fVJFj-nMs3g5+{d^(oDx40zw`!%+&W!~Z9oK&`>YmG3~i((>Nk?Q<3NS1 z<-nS{nQC->YBD#-40TY_Pn!jgtHhVRAD_~Xu{H#5wx9>5q{klOay)2Yx3IQFFJ`NKZa-RJeid>{}ASt0~xlOMz zxd}A(%Xt!x*ZpU2bri*6jo3Lg_|xEs&7z*)qtSz1_f$Vj2!6ug&y9;+nRtfu**6&x zu@w(l&wISu&=Hoavv`MvJ$`a;JX&R9@70ntN|fYPR61jOHg>mBZ61}4^$eL+29VZM zs}+gYS=>vduJ@!Ka)phF1p8l~yIqY?TVR4Rw6`{n|_5l;wzolvJ_!{tWj16WzIY zx?a8X{RLeD(_~4FVl0@;xnHAI4x`bf4%0O6XIKaX0>x_O8l7! zdoPKxBtUt;p1=oz>lzoe20X2;E(46SKbd}&n~Q0bj{TkHFd%r03mMyQT6i>3gc3>6 zZgy!H0DjbMW}$#i*B*USa)`-#*e8D^*nyT#mP^5SMgOK3Xg&|7^f?Qi4*2tJER=dW zcULINuju1aVsDommY05W5@8p?$(9gv8dv8s9z)y08mSk2?p^WOTd0)!7G^s-6}l~w zwImV@Pa5IQ<fr8b__ECsS&jd4V>ED*f;t5!Z0m@BkA`ejh=*Ouynkhk z6kBwN)L6Q2HQwK6DrtBW?AUglE}+mzR}zIU*!|jIyC~LP2&jYO49JQBV(m514DHHN zZ@Yi&VEf)?J8l8SbJIgr6g-dYz3`OU_yIWeU?di>t{Op)2``hyYYTIGhbyN~6jTJI zji?RhamlPlIGi?+7aX^Atm=3cPan6vpLu`NO+Pb0;AQTiVM7W6#m^txKCLnULarly z_Ol2Z(L0*+N=L80A4p>ETcx%qk zReZfAryT?w{UMl(afdkNPM0#~LxHQLV>?Pxg#N*Pc~a76646E3j8(u9yM6; z*EcgEw5I1PVH+Wy{d+j=29f(U?cYyB5RWuVlET~`@#gBoL|qHlV?AeF&4gN7-ss-= zuu_q`J+v+ldaFtDcgwm-qP1amM!kccKd6&S-FhUDoLeU~y`l?VX$BnsILFpOj^2eI zeU{aKRrW;d0O?e3nNo#Vy>wH?HM|5i4|>sxi3*^g(Mjt8-P#cpdsk%m7gU`k@mV{H z4ZgJKtVf+Vi$L=SX0F_#wW~GYhlT@>YafbyAV0A@mLUh4PP1APF{8G46qBECm5OvQ z=t--#v~MqmWt6#fqIjDD^&eIv zW-tqznqe&Q=9kIt{sOGE^G@kB^eVgG#{)XEec4H~({OvnHM3I~Q!m%YpVA`TO04lx zSV(juSTo&K;5L5VQ&AwR4Ir3(C}qu0>g5=tMT2C#tMvVA;k#=8DwY8E2L6ACXR{v6 z7Md&b-~3}7=W)-D_QSY67dIYAWr9$TG;t1;gH7XN6?2}^XFLHRzBDPI${jn{^^7F z^qY@D_;jm-*xJ5_o{Y$Wsf0~Ws{?@>UER%h3eFypNU!nb4Ch*kD+A=N>wRu4Tb57! z78sPX+d!;e42^N-Ga zX2`i8w#U4w&pJ8|!*{u*)p>+E9=3m&ta0IPzM@vn^@*^)RwtauTe|6W7u>*bWtQPm z5M43A{y0IS_i+;RwN;4(4^0S5M5}zPF9(H&X zA?jd`dXbNN0%ya}>o8^}MhWGylW)dY>7X*Tx%JhmyxVzjhWh#W9f%rUKSp(Eu>kr0 zlB{{Dcs$S>P455YOF`iPjrdXJaotknRJk1XtWKEx^Pl5 zEaP}(fA}v2TM>!4XMw$SfT+)b%8-x~*NL<3U3yfCQ(!^$rvkE>PcN25AXQpRWg}(#)UBj${UBoQ5IZbnu8Nh{YE^b(fLN#&1886r=gA zy6Wt@YnA(>|B?i9tCPG)&5Pg|ziS5V$$!WG93O+XRBd3Z-v!uW#^CqBz5Po<1uylz z-|~k9%mf?BFWd({|Go5tHbD1js@WV(RQ8gw$cgaF4kDrqfSQKMg@j?`&&+3svI-&@ za9h!LT>TDG-LL{t-~K@p>VCN(#|ga3rlLoQ3L2NdMWoadOr-0z>rTw!6xI7kAuxVg zgedzRCsHJC55Yn5bG>Qj$$$^Xm6?Z|2N}kz{vT(u0%do*KebyCS>s*!L}gmyNn7ay zHXrx0u7{pRR2Fx^ zKCGJ%=~@SmOHb28dbe?~&#d9Dv2#-STx*rXOh13NFVnWyQ6S4iSgg$;87%2WIMdv@ zdZf}Qy$&9gcfBwAs8V2T>jQS9QxqTdFe^`kQ2=Ia3pp=!5h-`uvIVI5h0~34(BQ_< zNnK+j_NiV_@izZ|`)8;hxMV`piWs8Y&E3Hb#U}kdQP5-2yJ0ifQR7>|Z)*8x>ld#` zX6BNQcsrcN_vqFv>V^y)R<3L+F+s4{B2sL(9%^s|W>Wjbyk>us8}vtngFJEe;;&m6 zT2Z|jbLum&2H&rhK1wN^JzUGKJ6>b0d$>&m)tDq*Tst@MT<`Lnjkv|?&PLS%RR&Dv?*!cPB%AFJ@OQCZ*Q)racpb(=d}A( z@@3fV{%+$BUmqi0%OPS-@#XvEbd6WthCBK5H>pj|OUB}|ZXNcWsvpeb8)bWnUL!h7 zdGLQLFz3RJXMcQOXGk;rc4roeJl>hcd&u4Qtzli4Lzl?cx^7E=xds>MYTG4qLnu zP7cQ2zfpKp5}lY|CRWS^;pLTs{Hb=z!yuMB3A4=0@9357u=1y8TOEM{eWK3T8vFX~ zT2oHsd#c@IwcKqb_W66tOfF%OuF2}VQ~g5nM9yYzQvwf%=As#O&)T?M`=-7~;j5sJ zHQ_J^YgM((%Y+g_Gi_5TDn>0WL&kkLLoVWYp8g8^ zwXTxFM^0%!E9%FCw|>o7xQd^?K4xtUtyiFpq1v#nI{Q<-%v5P^Zf~IH;do96%qH;T z;s>H`rmM$jK-JzS?eIp-@2-pRDriNrjt;b`4o;{XN0^n$jw~UT`HV$PUV-cdeAfjX zM|E`F)QVwrV&+BCB9eG9wuz0*D>eD$Xy^ua-6l6c-AXyB0@neskY_@KQnS9`=&@G$qIyg7D?e>7rSG?l*Ws_G&yY;ZbnFrN6t zKU~I)fm6xw6x3fzcJt=(_Be{(F_XXiu|7eD{a*UyB^qb}A85%IeB|9&cdVAI1NkB8w{knRIMWtcy>=KpG>94N;}TRDpKh%TA~*zn?&m< z@FA;yU-{RR85dYUGBc$)>md(bv0ydEGCT{ezog0<^11mwS@f#2!g&!Lry}oN!OEgv z6_vj~4)oEam`p`l2Wc)Zl=M7!uIrQ%S7yf3;5?A@O1n44ai#cI5pEa`pTt=X1{%qW zeCD+Dt&nOzKuI1dKqJhLQ)<1J^ixNcA8NWh2R_%~W`@B!_e0*q!i7lrK2DQr1AEfU z5XdhDF7#a55}7(lIYH67eKEE@e5>N`Bh?=Q4#V`bex@rS9e}J4zEk7Y5#)l4*by0> zg2JV<%cqM0UJgleA2>a8KF~%(+AjQ-$$o6(KTHIW@~1RLKi|9-tK}Ua-YgjI4Ub<8 zP7ld1ex#(+`UuoRqS589k`b=Hc7GVWaMp8QK?;DZ%gKuYRC%yk0_!OE$%Z|M9-H`Gn%}ruHZ{CGg~S`Ige%&~MI zvlN$On95gfS}~5U9lvT2L4KdUR2FxF)=3{t7S7^87s;Dl-;vRo14}dQ_iID-!zFy? z8g>!ub63ZXjY55WV_}5N9%Dh<(mi$mRBAmG^@3~6yiJD)**2u)aJCy>yUqLwH67wu z+a#1W;Zcq6UohORXM;*W!B3A7DsFRW$MfZ4Cc=;Al`ErhLvGiLp?5TQ^~nWSA@f1z zV+|wo1Es%Z9d9!g=7o-pOO8AbjyV1u4m3`7(II$D?lbh2plpA7m#_;W!^=gf-tVR5 z8zCPo$e3Nb*_h63E0H1vu8~E7KnrVUhc;sf4a^#($09F~=+! zq&k^v%d8~AK1M!g87b~nmFHk*JssQoETeNKVGnpe0@o@h)~xIIMLLK}32rNs78tL! zb~5VKKV1{FeAWJuCikrAhxzYrF3W4TDnBN3=ra7o_B+?^)R8+|86L3STh z`TO!tw$^*2rN}7PX_AXdsJ*yFimrFb40F>T<~7YAyMPo|_uXiBnYP@0rMK~N8Y;Kg-yPj#>#tBu>Sf?DA%#yt#bq_L+x%wrg(tV+ymw1xmMCy z?#QhrI8nMjps)J#!DCl>qIwd$wTq!+IEj(BfBpBvYPYJwr#r)ES&ntib1rwf?cD}& z00^<(KuT4BYXvo_satMrAj_Vz6Dx>?@s!Q+y&!m*7S{4+Go&0>VFFFQC$IZC%E3w)s?iG83t&BJbd7l!9fRa}1fnSy1V zgHi|0-{9~J^xG7AIze%xXWO1XU$5q~s#N8|O>;9P{+4rnmyDu``wlEgy_Qoy4N0& z7JKPdn>&qc{9^W^>_d@n5+CdVQ8sMThdbGUtYvz2`7ML?Y!h43g8NPOnw}w9lDpld zy`NBuhI0>^U879KzDu?|P3@=y4zSv8IDfSh)9-&U6Z4>=td0<>-&v66o74Z)vWcpj zvQNe*1`16H9Zt|nrMfy1)ZJXYb-RDF2+8o`?EC$Y((_BT!?f*d2~%}u_jh+zkI&8+ zq}F6tny=)qjKxE5z@;pSG$Br{vt#kem1pAqgA~ZCf;5E0vVqf_qgC5uL0h}x;y~b} zS{TpfpAgNIXg>cGxpkAUX%(!$Q`Yq5@TyQCq0^m3Iy^Y4E2o!;3fa{FK`|cro$giz z&P|uqiEn0GQoOUCVbpQsFz^QQ=79^QhqrG z?K8L|q;ej{mG#*t!hE!{q>HOO)vo07*+FH?@kNCJ{x8ap&(NHq=4gY@_O)cK(B9Jn z_P*HWz~N24WT7Ie)dN!2>D`kphBqALDE9@$9U|pL7wf8Bgclm=?%mVjVfqrn^`7yo z2plbwaTq?x(^1YX0ej7Fsei5wcQ!Gd6=qRO(ujO=`L5ZFZ_qT~ERP1qs|nx*S90X~ z@-+y9@&=K6e6Ta~=6`Wf$3HDk$F{m%xP5e1C}H}JU6GJkpSt?OTlD`<=9{9;ZkH`S ztAy2>=wD0Uf^hC9OZi(u4(8J>}V2Tum}e zC+}h06A2V}MyYDu=$Yn!Ty<>|%Qny3Het?yS{qaz?CH6}d>UFaf!5+VGpb>aBd^Gw zZxy=Okqpplpp9x&TWi%q^wI|}qpk9=Q>GwiRu|uQb*~056Di9P9 zyjc5O!|#t{42BK&T_Ey#a$c;#ah`0;R*mD}Zo;r$j4%u~^1OdZb#97pv{+Pi9pCS7?>MDlU|5wV?Go)U~j%+xWc3{Qwm5;7Q@171S4{&1e_N#&-qep!u z(w^r9((bI7dDC^x@rT1nz5c~`aLr_jwLQydNI&z~;n`D5S*kn)ek z4tuRYY;>))q2p|5w3nh|mNF@_yph-cgvWxfdCOp5)`A$+gPmBBUZbF-Trwy{Z0Kbt zE6-!r{1{~4?MbL=d475|=sUa(-3s*=B$4#%eB1G$AO-1s5^(8x zyP!Ke6y`~wGV~3Po?C}_0_?_7-$6IF&O!RYS?wC@gvwiSeArnfP!(1!e4Zds3vf0# zYcGBx9w9L61)@;9hzoPy>`gki5-N>ctKEWw@k;SBhXiIdZY;Bqg%|3nRf!u9HZZb$ zPdYH~aQY7{J=_+SE7CY~))~nbggKs@mvimUQ0{W

yWw3MnVBCW%u7u^gmB*PD0N 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

d=tvlV&!=8%Kuk} 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˱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�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