Merge branch 'master' into gov_split_vote_weighted_vote
This commit is contained in:
commit
e239504bc0
4
.github/workflows/proto.yml
vendored
4
.github/workflows/proto.yml
vendored
@ -12,10 +12,10 @@ jobs:
|
||||
steps:
|
||||
- uses: actions/checkout@master
|
||||
- name: lint
|
||||
run: make proto-lint-docker
|
||||
run: make proto-lint
|
||||
breakage:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- uses: actions/checkout@master
|
||||
- name: check-breakage
|
||||
run: make proto-check-breaking-docker
|
||||
run: make proto-check-breaking
|
||||
|
||||
4
.github/workflows/release-sims.yml
vendored
4
.github/workflows/release-sims.yml
vendored
@ -30,7 +30,7 @@ jobs:
|
||||
- name: install runsim
|
||||
run: |
|
||||
export GO111MODULE="on" && go get github.com/cosmos/tools/cmd/runsim@v1.0.0
|
||||
- uses: actions/cache@v2.1.2
|
||||
- uses: actions/cache@v2.1.3
|
||||
with:
|
||||
path: ~/go/bin
|
||||
key: ${{ runner.os }}-go-runsim-binary
|
||||
@ -40,7 +40,7 @@ jobs:
|
||||
needs: [build, install-runsim]
|
||||
steps:
|
||||
- uses: actions/checkout@v2
|
||||
- uses: actions/cache@v2.1.2
|
||||
- uses: actions/cache@v2.1.3
|
||||
with:
|
||||
path: ~/go/bin
|
||||
key: ${{ runner.os }}-go-runsim-binary
|
||||
|
||||
10
.github/workflows/sims.yml
vendored
10
.github/workflows/sims.yml
vendored
@ -39,7 +39,7 @@ jobs:
|
||||
run: go version
|
||||
- name: Install runsim
|
||||
run: export GO111MODULE="on" && go get github.com/cosmos/tools/cmd/runsim@v1.0.0
|
||||
- uses: actions/cache@v2.1.2
|
||||
- uses: actions/cache@v2.1.3
|
||||
with:
|
||||
path: ~/go/bin
|
||||
key: ${{ runner.os }}-go-runsim-binary
|
||||
@ -60,7 +60,7 @@ jobs:
|
||||
**/**.go
|
||||
go.mod
|
||||
go.sum
|
||||
- uses: actions/cache@v2.1.2
|
||||
- uses: actions/cache@v2.1.3
|
||||
with:
|
||||
path: ~/go/bin
|
||||
key: ${{ runner.os }}-go-runsim-binary
|
||||
@ -88,7 +88,7 @@ jobs:
|
||||
go.sum
|
||||
SET_ENV_NAME_INSERTIONS: 1
|
||||
SET_ENV_NAME_LINES: 1
|
||||
- uses: actions/cache@v2.1.2
|
||||
- uses: actions/cache@v2.1.3
|
||||
with:
|
||||
path: ~/go/bin
|
||||
key: ${{ runner.os }}-go-runsim-binary
|
||||
@ -116,7 +116,7 @@ jobs:
|
||||
go.sum
|
||||
SET_ENV_NAME_INSERTIONS: 1
|
||||
SET_ENV_NAME_LINES: 1
|
||||
- uses: actions/cache@v2.1.2
|
||||
- uses: actions/cache@v2.1.3
|
||||
with:
|
||||
path: ~/go/bin
|
||||
key: ${{ runner.os }}-go-runsim-binary
|
||||
@ -144,7 +144,7 @@ jobs:
|
||||
go.sum
|
||||
SET_ENV_NAME_INSERTIONS: 1
|
||||
SET_ENV_NAME_LINES: 1
|
||||
- uses: actions/cache@v2.1.2
|
||||
- uses: actions/cache@v2.1.3
|
||||
with:
|
||||
path: ~/go/bin
|
||||
key: ${{ runner.os }}-go-runsim-binary
|
||||
|
||||
4
.github/workflows/test.yml
vendored
4
.github/workflows/test.yml
vendored
@ -26,7 +26,7 @@ jobs:
|
||||
- name: install tparse
|
||||
run: |
|
||||
export GO111MODULE="on" && go get github.com/mfridman/tparse@v0.8.3
|
||||
- uses: actions/cache@v2.1.2
|
||||
- uses: actions/cache@v2.1.3
|
||||
with:
|
||||
path: ~/go/bin
|
||||
key: ${{ runner.os }}-go-tparse-binary
|
||||
@ -216,7 +216,7 @@ jobs:
|
||||
with:
|
||||
name: "${{ github.sha }}-03-race-output"
|
||||
if: env.GIT_DIFF
|
||||
- uses: actions/cache@v2.1.2
|
||||
- uses: actions/cache@v2.1.3
|
||||
with:
|
||||
path: ~/go/bin
|
||||
key: ${{ runner.os }}-go-tparse-binary
|
||||
|
||||
1
.gitignore
vendored
1
.gitignore
vendored
@ -20,7 +20,6 @@ docs/node_modules
|
||||
docs/modules
|
||||
dist
|
||||
tools-stamp
|
||||
proto-tools-stamp
|
||||
buf-stamp
|
||||
artifacts
|
||||
|
||||
|
||||
15
CHANGELOG.md
15
CHANGELOG.md
@ -36,6 +36,18 @@ Ref: https://keepachangelog.com/en/1.0.0/
|
||||
|
||||
## [Unreleased]
|
||||
|
||||
### Improvements
|
||||
- (SDK) [\#7925](https://github.com/cosmos/cosmos-sdk/pull/7925) Updated dependencies to use gRPC v1.33.2
|
||||
* Updated gRPC dependency to v1.33.2
|
||||
* Updated iavl dependency to v0.15-rc2
|
||||
|
||||
|
||||
## [v0.40.0-rc3](https://github.com/cosmos/cosmos-sdk/releases/tag/v0.40.0-rc3) - 2020-11-06
|
||||
|
||||
### Client Breaking
|
||||
|
||||
* (x/staking) [\#7419](https://github.com/cosmos/cosmos-sdk/pull/7419) The `TmConsPubKey` method on ValidatorI has been removed and replaced instead by `ConsPubKey` (which returns a SDK `cryptotypes.PubKey`) and `TmConsPublicKey` (which returns a Tendermint proto PublicKey).
|
||||
|
||||
### Improvements
|
||||
* (tendermint) [\#7828](https://github.com/cosmos/cosmos-sdk/pull/7828) Update tendermint dependency to v0.34.0-rc6
|
||||
|
||||
@ -59,6 +71,9 @@ Ref: https://keepachangelog.com/en/1.0.0/
|
||||
* `server/types.AppExporter` requires extra argument: `AppOptions`.
|
||||
* `server.AddCommands` requires extra argument: `addStartFlags types.ModuleInitFlags`
|
||||
* `x/crisis.NewAppModule` has a new attribute: `skipGenesisInvariants`. [PR](https://github.com/cosmos/cosmos-sdk/pull/7764)
|
||||
* [#7918](https://github.com/cosmos/cosmos-sdk/pull/7918) Add x/capability safety checks:
|
||||
* All outward facing APIs will now check that capability is not nil and name is not empty before performing any state-machine changes
|
||||
* `SetIndex` has been renamed to `InitializeIndex`
|
||||
|
||||
### Features
|
||||
|
||||
|
||||
@ -142,11 +142,15 @@ build, in which case we can fall back on `go mod tidy -v`.
|
||||
|
||||
We use [Protocol Buffers](https://developers.google.com/protocol-buffers) along with [gogoproto](https://github.com/gogo/protobuf) to generate code for use in Cosmos-SDK.
|
||||
|
||||
For determinstic behavior around Protobuf tooling, everything is containerized using Docker. Make sure to have Docker installed on your machine, or head to [Docker's website](https://docs.docker.com/get-docker/) to install it.
|
||||
|
||||
For formatting code in `.proto` files, you can run `make proto-format` command.
|
||||
|
||||
For linting and checking breaking changes, we use [buf](https://buf.build/). There are two options for linting and to check if your changes will cause a break. The first is that you can install [buf](https://buf.build/docs/installation) locally, the commands for running buf after installing are `make proto-lint` and the breaking changes check will be `make proto-check-breaking`. If you do not want to install buf and have docker installed already then you can use these commands `make proto-lint-docker` and `make proto-check-breaking-docker`.
|
||||
For linting and checking breaking changes, we use [buf](https://buf.build/). You can use the commands `make proto-lint` and `make proto-check-breaking` to respectively lint your proto files and check for breaking changes.
|
||||
|
||||
To generate the protobuf stubs you must have `protoc` and `protoc-gen-gocosmos` installed. To install these tools run `make proto-tools`. After this step you will be able to run `make proto-gen` to generate the protobuf stubs.
|
||||
To generate the protobuf stubs, you can run `make proto-gen`.
|
||||
|
||||
We also added the `make proto-all` command to run all the above commands sequentially.
|
||||
|
||||
In order for imports to properly compile in your IDE, you may need to manually set your protobuf path in your IDE's workspace settings/config.
|
||||
|
||||
@ -268,8 +272,8 @@ and PRs are merged into `master`, if a contributor wishes the PR to be released
|
||||
- **[Impact]** Explanation of how the bug affects users or developers.
|
||||
- **[Test Case]** section with detailed instructions on how to reproduce the bug.
|
||||
- **[Regression Potential]** section with a discussion how regressions are most likely to manifest, or might
|
||||
manifest even if it's unlikely, as a result of the change. **It is assumed that any SRU candidate PR is
|
||||
well-tested before it is merged in and has an overall low risk of regression**.
|
||||
manifest even if it's unlikely, as a result of the change. **It is assumed that any SRU candidate PR is
|
||||
well-tested before it is merged in and has an overall low risk of regression**.
|
||||
|
||||
It is the PR's author's responsibility to fix merge conflicts, update changelog entries, and
|
||||
ensure CI passes. If a PR originates from an external contributor, it may be a core team member's
|
||||
@ -280,7 +284,7 @@ Finally, when a point release is ready to be made:
|
||||
|
||||
1. Create `release/v0.38.N` branch
|
||||
2. Ensure changelog entries are verified
|
||||
2. Be sure changelog entries are added to `RELEASE_CHANGELOG.md`
|
||||
1. Be sure changelog entries are added to `RELEASE_CHANGELOG.md`
|
||||
3. Add release version date to the changelog
|
||||
4. Push release branch along with the annotated tag: **git tag -a**
|
||||
5. Create a PR into `master` containing ONLY `CHANGELOG.md` updates
|
||||
|
||||
24
Makefile
24
Makefile
@ -10,7 +10,7 @@ BUILDDIR ?= $(CURDIR)/build
|
||||
SIMAPP = ./simapp
|
||||
MOCKS_DIR = $(CURDIR)/tests/mocks
|
||||
HTTPS_GIT := https://github.com/cosmos/cosmos-sdk.git
|
||||
DOCKER_BUF := docker run -v $(shell pwd):/workspace --workdir /workspace bufbuild/buf
|
||||
DOCKER_BUF := docker run -v $(CURDIR):/workspace --workdir /workspace bufbuild/buf
|
||||
|
||||
export GO111MODULE = on
|
||||
|
||||
@ -356,38 +356,30 @@ devdoc-update:
|
||||
### Protobuf ###
|
||||
###############################################################################
|
||||
|
||||
proto-all: proto-tools proto-gen proto-lint proto-check-breaking proto-swagger-gen proto-format
|
||||
proto-all: proto-format proto-lint proto-check-breaking proto-gen
|
||||
|
||||
proto-gen:
|
||||
@./scripts/protocgen.sh
|
||||
@echo "Generating Protobuf files"
|
||||
docker run -v $(CURDIR):/workspace --workdir /workspace tendermintdev/sdk-proto-gen sh ./scripts/protocgen.sh
|
||||
|
||||
proto-format:
|
||||
@echo "Formatting Protobuf files"
|
||||
docker run -v $(shell pwd):/workspace \
|
||||
docker run -v $(CURDIR):/workspace \
|
||||
--workdir /workspace tendermintdev/docker-build-proto \
|
||||
find ./ -not -path "./third_party/*" -name *.proto -exec clang-format -i {} \;
|
||||
.PHONY: proto-format
|
||||
|
||||
# This generates the SDK's custom wrapper for google.protobuf.Any. It should only be run manually when needed
|
||||
proto-gen-any:
|
||||
@./scripts/protocgen-any.sh
|
||||
docker run -v $(CURDIR):/workspace --workdir /workspace tendermintdev/sdk-proto-gen sh ./scripts/protocgen-any.sh
|
||||
|
||||
proto-swagger-gen:
|
||||
@./scripts/protoc-swagger-gen.sh
|
||||
|
||||
proto-lint:
|
||||
@buf check lint --error-format=json
|
||||
@$(DOCKER_BUF) check lint --error-format=json
|
||||
|
||||
proto-check-breaking:
|
||||
@buf check breaking --against-input '.git#branch=master'
|
||||
|
||||
proto-lint-docker:
|
||||
@$(DOCKER_BUF) check lint --error-format=json
|
||||
.PHONY: proto-lint
|
||||
|
||||
proto-check-breaking-docker:
|
||||
@$(DOCKER_BUF) check breaking --against-input $(HTTPS_GIT)#branch=master
|
||||
.PHONY: proto-check-breaking-ci
|
||||
|
||||
TM_URL = https://raw.githubusercontent.com/tendermint/tendermint/v0.34.0-rc6/proto/tendermint
|
||||
GOGO_PROTO_URL = https://raw.githubusercontent.com/regen-network/protobuf/cosmos
|
||||
@ -440,7 +432,7 @@ proto-update-deps:
|
||||
## Issue link: https://github.com/confio/ics23/issues/32
|
||||
@sed -i '4ioption go_package = "github.com/confio/ics23/go";' $(CONFIO_TYPES)/proofs.proto
|
||||
|
||||
.PHONY: proto-all proto-gen proto-lint proto-check-breaking proto-update-deps
|
||||
.PHONY: proto-all proto-gen proto-gen-any proto-swagger-gen proto-format proto-lint proto-check-breaking proto-update-deps
|
||||
|
||||
###############################################################################
|
||||
### Localnet ###
|
||||
|
||||
@ -1,15 +1,14 @@
|
||||
package client
|
||||
|
||||
import (
|
||||
"github.com/tendermint/tendermint/crypto"
|
||||
|
||||
cryptotypes "github.com/cosmos/cosmos-sdk/crypto/types"
|
||||
sdk "github.com/cosmos/cosmos-sdk/types"
|
||||
)
|
||||
|
||||
// Account defines a read-only version of the auth module's AccountI.
|
||||
type Account interface {
|
||||
GetAddress() sdk.AccAddress
|
||||
GetPubKey() crypto.PubKey // can return nil.
|
||||
GetPubKey() cryptotypes.PubKey // can return nil.
|
||||
GetAccountNumber() uint64
|
||||
GetSequence() uint64
|
||||
}
|
||||
|
||||
@ -8,10 +8,10 @@ import (
|
||||
"strings"
|
||||
|
||||
"github.com/spf13/cobra"
|
||||
"github.com/tendermint/tendermint/crypto"
|
||||
|
||||
"github.com/cosmos/cosmos-sdk/client"
|
||||
"github.com/cosmos/cosmos-sdk/crypto/keys/ed25519"
|
||||
cryptotypes "github.com/cosmos/cosmos-sdk/crypto/types"
|
||||
sdk "github.com/cosmos/cosmos-sdk/types"
|
||||
"github.com/cosmos/cosmos-sdk/types/errors"
|
||||
"github.com/cosmos/cosmos-sdk/version"
|
||||
@ -34,7 +34,7 @@ func Cmd() *cobra.Command {
|
||||
// getPubKeyFromString returns a Tendermint PubKey (PubKeyEd25519) by attempting
|
||||
// to decode the pubkey string from hex, base64, and finally bech32. If all
|
||||
// encodings fail, an error is returned.
|
||||
func getPubKeyFromString(pkstr string) (crypto.PubKey, error) {
|
||||
func getPubKeyFromString(pkstr string) (cryptotypes.PubKey, error) {
|
||||
bz, err := hex.DecodeString(pkstr)
|
||||
if err == nil {
|
||||
if len(bz) == ed25519.PubKeySize {
|
||||
|
||||
289
client/docs/swagger-ui/swagger.yaml
vendored
289
client/docs/swagger-ui/swagger.yaml
vendored
@ -15760,7 +15760,7 @@ paths:
|
||||
}
|
||||
tags:
|
||||
- Query
|
||||
/ibc/channel/v1beta1/channels:
|
||||
/ibc/core/channel/v1beta1/channels:
|
||||
get:
|
||||
summary: Channels queries all the IBC channels of a chain.
|
||||
operationId: Channels
|
||||
@ -16146,7 +16146,7 @@ paths:
|
||||
type: boolean
|
||||
tags:
|
||||
- Query
|
||||
'/ibc/channel/v1beta1/channels/{channel_id}/ports/{port_id}':
|
||||
'/ibc/core/channel/v1beta1/channels/{channel_id}/ports/{port_id}':
|
||||
get:
|
||||
summary: Channel queries an IBC Channel.
|
||||
operationId: Channel
|
||||
@ -16471,7 +16471,7 @@ paths:
|
||||
type: string
|
||||
tags:
|
||||
- Query
|
||||
'/ibc/channel/v1beta1/channels/{channel_id}/ports/{port_id}/client_state':
|
||||
'/ibc/core/channel/v1beta1/channels/{channel_id}/ports/{port_id}/client_state':
|
||||
get:
|
||||
summary: >-
|
||||
ChannelClientState queries for the client state for the channel
|
||||
@ -16909,7 +16909,7 @@ paths:
|
||||
type: string
|
||||
tags:
|
||||
- Query
|
||||
'/ibc/channel/v1beta1/channels/{channel_id}/ports/{port_id}/consensus_state/version/{version_number}/height/{version_height}':
|
||||
'/ibc/core/channel/v1beta1/channels/{channel_id}/ports/{port_id}/consensus_state/version/{version_number}/height/{version_height}':
|
||||
get:
|
||||
summary: |-
|
||||
ChannelConsensusState queries for the consensus state for the channel
|
||||
@ -17344,7 +17344,7 @@ paths:
|
||||
format: uint64
|
||||
tags:
|
||||
- Query
|
||||
'/ibc/channel/v1beta1/channels/{channel_id}/ports/{port_id}/next_sequence':
|
||||
'/ibc/core/channel/v1beta1/channels/{channel_id}/ports/{port_id}/next_sequence':
|
||||
get:
|
||||
summary: >-
|
||||
NextSequenceReceive returns the next receive sequence for a given
|
||||
@ -17596,7 +17596,7 @@ paths:
|
||||
type: string
|
||||
tags:
|
||||
- Query
|
||||
'/ibc/channel/v1beta1/channels/{channel_id}/ports/{port_id}/packet_acknowledgements':
|
||||
'/ibc/core/channel/v1beta1/channels/{channel_id}/ports/{port_id}/packet_acknowledgements':
|
||||
get:
|
||||
summary: >-
|
||||
PacketAcknowledgements returns all the packet acknowledgements
|
||||
@ -17945,7 +17945,7 @@ paths:
|
||||
type: boolean
|
||||
tags:
|
||||
- Query
|
||||
'/ibc/channel/v1beta1/channels/{channel_id}/ports/{port_id}/packet_acks/{sequence}':
|
||||
'/ibc/core/channel/v1beta1/channels/{channel_id}/ports/{port_id}/packet_acks/{sequence}':
|
||||
get:
|
||||
summary: PacketAcknowledgement queries a stored packet acknowledgement hash.
|
||||
operationId: PacketAcknowledgement
|
||||
@ -18205,7 +18205,7 @@ paths:
|
||||
format: uint64
|
||||
tags:
|
||||
- Query
|
||||
'/ibc/channel/v1beta1/channels/{channel_id}/ports/{port_id}/packet_commitments':
|
||||
'/ibc/core/channel/v1beta1/channels/{channel_id}/ports/{port_id}/packet_commitments':
|
||||
get:
|
||||
summary: |-
|
||||
PacketCommitments returns all the packet commitments hashes associated
|
||||
@ -18552,7 +18552,7 @@ paths:
|
||||
type: boolean
|
||||
tags:
|
||||
- Query
|
||||
'/ibc/channel/v1beta1/channels/{channel_id}/ports/{port_id}/packet_commitments/{packet_ack_sequences}/unreceived_acks':
|
||||
'/ibc/core/channel/v1beta1/channels/{channel_id}/ports/{port_id}/packet_commitments/{packet_ack_sequences}/unreceived_acks':
|
||||
get:
|
||||
summary: >-
|
||||
UnreceivedAcks returns all the unreceived IBC acknowledgements
|
||||
@ -18814,7 +18814,7 @@ paths:
|
||||
minItems: 1
|
||||
tags:
|
||||
- Query
|
||||
'/ibc/channel/v1beta1/channels/{channel_id}/ports/{port_id}/packet_commitments/{packet_commitment_sequences}/unreceived_packets':
|
||||
'/ibc/core/channel/v1beta1/channels/{channel_id}/ports/{port_id}/packet_commitments/{packet_commitment_sequences}/unreceived_packets':
|
||||
get:
|
||||
summary: >-
|
||||
UnreceivedPackets returns all the unreceived IBC packets associated with
|
||||
@ -19076,7 +19076,7 @@ paths:
|
||||
minItems: 1
|
||||
tags:
|
||||
- Query
|
||||
'/ibc/channel/v1beta1/channels/{channel_id}/ports/{port_id}/packet_commitments/{sequence}':
|
||||
'/ibc/core/channel/v1beta1/channels/{channel_id}/ports/{port_id}/packet_commitments/{sequence}':
|
||||
get:
|
||||
summary: PacketCommitment queries a stored packet commitment hash.
|
||||
operationId: PacketCommitment
|
||||
@ -19337,7 +19337,7 @@ paths:
|
||||
format: uint64
|
||||
tags:
|
||||
- Query
|
||||
'/ibc/channel/v1beta1/channels/{channel_id}/ports/{port_id}/packet_receipts/{sequence}':
|
||||
'/ibc/core/channel/v1beta1/channels/{channel_id}/ports/{port_id}/packet_receipts/{sequence}':
|
||||
get:
|
||||
summary: >-
|
||||
PacketReceipt queries if a given packet sequence has been received on
|
||||
@ -19599,7 +19599,7 @@ paths:
|
||||
format: uint64
|
||||
tags:
|
||||
- Query
|
||||
'/ibc/channel/v1beta1/connections/{connection}/channels':
|
||||
'/ibc/core/channel/v1beta1/connections/{connection}/channels':
|
||||
get:
|
||||
summary: |-
|
||||
ConnectionChannels queries all the channels associated with a connection
|
||||
@ -19992,7 +19992,222 @@ paths:
|
||||
type: boolean
|
||||
tags:
|
||||
- Query
|
||||
/ibc/client/v1beta1/client_states:
|
||||
/ibc/client/v1beta1/params:
|
||||
get:
|
||||
summary: ClientParams queries all parameters of the ibc client.
|
||||
operationId: ClientParams
|
||||
responses:
|
||||
'200':
|
||||
description: A successful response.
|
||||
schema:
|
||||
type: object
|
||||
properties:
|
||||
params:
|
||||
description: params defines the parameters of the module.
|
||||
type: object
|
||||
properties:
|
||||
allowed_clients:
|
||||
type: array
|
||||
items:
|
||||
type: string
|
||||
description: >-
|
||||
allowed_clients defines the list of allowed client state
|
||||
types.
|
||||
description: >-
|
||||
QueryClientParamsResponse is the response type for the
|
||||
Query/ClientParams RPC method.
|
||||
default:
|
||||
description: An unexpected error response.
|
||||
schema:
|
||||
type: object
|
||||
properties:
|
||||
error:
|
||||
type: string
|
||||
code:
|
||||
type: integer
|
||||
format: int32
|
||||
message:
|
||||
type: string
|
||||
details:
|
||||
type: array
|
||||
items:
|
||||
type: object
|
||||
properties:
|
||||
type_url:
|
||||
type: string
|
||||
description: >-
|
||||
A URL/resource name that uniquely identifies the type of
|
||||
the serialized
|
||||
|
||||
protocol buffer message. This string must contain at
|
||||
least
|
||||
|
||||
one "/" character. The last segment of the URL's path
|
||||
must represent
|
||||
|
||||
the fully qualified name of the type (as in
|
||||
|
||||
`path/google.protobuf.Duration`). The name should be in
|
||||
a canonical form
|
||||
|
||||
(e.g., leading "." is not accepted).
|
||||
|
||||
|
||||
In practice, teams usually precompile into the binary
|
||||
all types that they
|
||||
|
||||
expect it to use in the context of Any. However, for
|
||||
URLs which use the
|
||||
|
||||
scheme `http`, `https`, or no scheme, one can optionally
|
||||
set up a type
|
||||
|
||||
server that maps type URLs to message definitions as
|
||||
follows:
|
||||
|
||||
|
||||
* If no scheme is provided, `https` is assumed.
|
||||
|
||||
* An HTTP GET on the URL must yield a
|
||||
[google.protobuf.Type][]
|
||||
value in binary format, or produce an error.
|
||||
* Applications are allowed to cache lookup results based
|
||||
on the
|
||||
URL, or have them precompiled into a binary to avoid any
|
||||
lookup. Therefore, binary compatibility needs to be preserved
|
||||
on changes to types. (Use versioned type names to manage
|
||||
breaking changes.)
|
||||
|
||||
Note: this functionality is not currently available in
|
||||
the official
|
||||
|
||||
protobuf release, and it is not used for type URLs
|
||||
beginning with
|
||||
|
||||
type.googleapis.com.
|
||||
|
||||
|
||||
Schemes other than `http`, `https` (or the empty scheme)
|
||||
might be
|
||||
|
||||
used with implementation specific semantics.
|
||||
value:
|
||||
type: string
|
||||
format: byte
|
||||
description: >-
|
||||
Must be a valid serialized protocol buffer of the above
|
||||
specified type.
|
||||
description: >-
|
||||
`Any` contains an arbitrary serialized protocol buffer
|
||||
message along with a
|
||||
|
||||
URL that describes the type of the serialized message.
|
||||
|
||||
|
||||
Protobuf library provides support to pack/unpack Any values
|
||||
in the form
|
||||
|
||||
of utility functions or additional generated methods of the
|
||||
Any type.
|
||||
|
||||
|
||||
Example 1: Pack and unpack a message in C++.
|
||||
|
||||
Foo foo = ...;
|
||||
Any any;
|
||||
any.PackFrom(foo);
|
||||
...
|
||||
if (any.UnpackTo(&foo)) {
|
||||
...
|
||||
}
|
||||
|
||||
Example 2: Pack and unpack a message in Java.
|
||||
|
||||
Foo foo = ...;
|
||||
Any any = Any.pack(foo);
|
||||
...
|
||||
if (any.is(Foo.class)) {
|
||||
foo = any.unpack(Foo.class);
|
||||
}
|
||||
|
||||
Example 3: Pack and unpack a message in Python.
|
||||
|
||||
foo = Foo(...)
|
||||
any = Any()
|
||||
any.Pack(foo)
|
||||
...
|
||||
if any.Is(Foo.DESCRIPTOR):
|
||||
any.Unpack(foo)
|
||||
...
|
||||
|
||||
Example 4: Pack and unpack a message in Go
|
||||
|
||||
foo := &pb.Foo{...}
|
||||
any, err := ptypes.MarshalAny(foo)
|
||||
...
|
||||
foo := &pb.Foo{}
|
||||
if err := ptypes.UnmarshalAny(any, foo); err != nil {
|
||||
...
|
||||
}
|
||||
|
||||
The pack methods provided by protobuf library will by
|
||||
default use
|
||||
|
||||
'type.googleapis.com/full.type.name' as the type URL and the
|
||||
unpack
|
||||
|
||||
methods only use the fully qualified type name after the
|
||||
last '/'
|
||||
|
||||
in the type URL, for example "foo.bar.com/x/y.z" will yield
|
||||
type
|
||||
|
||||
name "y.z".
|
||||
|
||||
|
||||
|
||||
JSON
|
||||
|
||||
====
|
||||
|
||||
The JSON representation of an `Any` value uses the regular
|
||||
|
||||
representation of the deserialized, embedded message, with
|
||||
an
|
||||
|
||||
additional field `@type` which contains the type URL.
|
||||
Example:
|
||||
|
||||
package google.profile;
|
||||
message Person {
|
||||
string first_name = 1;
|
||||
string last_name = 2;
|
||||
}
|
||||
|
||||
{
|
||||
"@type": "type.googleapis.com/google.profile.Person",
|
||||
"firstName": <string>,
|
||||
"lastName": <string>
|
||||
}
|
||||
|
||||
If the embedded message type is well-known and has a custom
|
||||
JSON
|
||||
|
||||
representation, that representation will be embedded adding
|
||||
a field
|
||||
|
||||
`value` which holds the custom JSON in addition to the
|
||||
`@type`
|
||||
|
||||
field. Example (for message [google.protobuf.Duration][]):
|
||||
|
||||
{
|
||||
"@type": "type.googleapis.com/google.protobuf.Duration",
|
||||
"value": "1.212s"
|
||||
}
|
||||
tags:
|
||||
- Query
|
||||
/ibc/core/client/v1beta1/client_states:
|
||||
get:
|
||||
summary: ClientStates queries all the IBC light clients of a chain.
|
||||
operationId: ClientStates
|
||||
@ -20465,7 +20680,7 @@ paths:
|
||||
type: boolean
|
||||
tags:
|
||||
- Query
|
||||
'/ibc/client/v1beta1/client_states/{client_id}':
|
||||
'/ibc/core/client/v1beta1/client_states/{client_id}':
|
||||
get:
|
||||
summary: ClientState queries an IBC light client.
|
||||
operationId: ClientState
|
||||
@ -20883,7 +21098,7 @@ paths:
|
||||
type: string
|
||||
tags:
|
||||
- Query
|
||||
'/ibc/client/v1beta1/consensus_states/{client_id}':
|
||||
'/ibc/core/client/v1beta1/consensus_states/{client_id}':
|
||||
get:
|
||||
summary: |-
|
||||
ConsensusStates queries all the consensus state associated with a given
|
||||
@ -21383,7 +21598,7 @@ paths:
|
||||
type: boolean
|
||||
tags:
|
||||
- Query
|
||||
'/ibc/client/v1beta1/consensus_states/{client_id}/version/{version_number}/height/{version_height}':
|
||||
'/ibc/core/client/v1beta1/consensus_states/{client_id}/version/{version_number}/height/{version_height}':
|
||||
get:
|
||||
summary: >-
|
||||
ConsensusState queries a consensus state associated with a client state
|
||||
@ -21825,7 +22040,7 @@ paths:
|
||||
type: boolean
|
||||
tags:
|
||||
- Query
|
||||
'/ibc/connection/v1beta1/client_connections/{client_id}':
|
||||
'/ibc/core/connection/v1beta1/client_connections/{client_id}':
|
||||
get:
|
||||
summary: |-
|
||||
ClientConnections queries the connection paths associated with a client
|
||||
@ -22073,7 +22288,7 @@ paths:
|
||||
type: string
|
||||
tags:
|
||||
- Query
|
||||
/ibc/connection/v1beta1/connections:
|
||||
/ibc/core/connection/v1beta1/connections:
|
||||
get:
|
||||
summary: Connections queries all the IBC connections of a chain.
|
||||
operationId: Connections
|
||||
@ -22457,7 +22672,7 @@ paths:
|
||||
type: boolean
|
||||
tags:
|
||||
- Query
|
||||
'/ibc/connection/v1beta1/connections/{connection_id}':
|
||||
'/ibc/core/connection/v1beta1/connections/{connection_id}':
|
||||
get:
|
||||
summary: Connection queries an IBC connection end.
|
||||
operationId: Connection
|
||||
@ -22777,7 +22992,7 @@ paths:
|
||||
type: string
|
||||
tags:
|
||||
- Query
|
||||
'/ibc/connection/v1beta1/connections/{connection_id}/client_state':
|
||||
'/ibc/core/connection/v1beta1/connections/{connection_id}/client_state':
|
||||
get:
|
||||
summary: |-
|
||||
ConnectionClientState queries the client state associated with the
|
||||
@ -23208,7 +23423,7 @@ paths:
|
||||
type: string
|
||||
tags:
|
||||
- Query
|
||||
'/ibc/connection/v1beta1/connections/{connection_id}/consensus_state/version/{version_number}/height/{version_height}':
|
||||
'/ibc/core/connection/v1beta1/connections/{connection_id}/consensus_state/version/{version_number}/height/{version_height}':
|
||||
get:
|
||||
summary: |-
|
||||
ConnectionConsensusState queries the consensus state associated with the
|
||||
@ -23636,7 +23851,7 @@ paths:
|
||||
format: uint64
|
||||
tags:
|
||||
- Query
|
||||
/ibc_transfer/v1beta1/denom_traces:
|
||||
/ibc/applications/transfer/v1beta1/denom_traces:
|
||||
get:
|
||||
summary: DenomTraces queries all denomination traces.
|
||||
operationId: DenomTraces
|
||||
@ -23761,7 +23976,7 @@ paths:
|
||||
type: boolean
|
||||
tags:
|
||||
- Query
|
||||
'/ibc_transfer/v1beta1/denom_traces/{hash}':
|
||||
'/ibc/applications/transfer/v1beta1/denom_traces/{hash}':
|
||||
get:
|
||||
summary: DenomTrace queries a denomination trace information.
|
||||
operationId: DenomTrace
|
||||
@ -23822,7 +24037,7 @@ paths:
|
||||
type: string
|
||||
tags:
|
||||
- Query
|
||||
/ibc_transfer/v1beta1/params:
|
||||
/ibc/applications/transfer/v1beta1/params:
|
||||
get:
|
||||
summary: Params queries all parameters of the ibc-transfer module.
|
||||
operationId: IBCTransferParams
|
||||
@ -33015,6 +33230,30 @@ definitions:
|
||||
description: >-
|
||||
ConsensusStateWithHeight defines a consensus state with an additional
|
||||
height field.
|
||||
ibc.core.client.v1.Params:
|
||||
type: object
|
||||
properties:
|
||||
allowed_clients:
|
||||
type: array
|
||||
items:
|
||||
type: string
|
||||
description: allowed_clients defines the list of allowed client state types.
|
||||
description: Params defines the set of IBC light client parameters.
|
||||
ibc.core.client.v1.QueryClientParamsResponse:
|
||||
type: object
|
||||
properties:
|
||||
params:
|
||||
description: params defines the parameters of the module.
|
||||
type: object
|
||||
properties:
|
||||
allowed_clients:
|
||||
type: array
|
||||
items:
|
||||
type: string
|
||||
description: allowed_clients defines the list of allowed client state types.
|
||||
description: >-
|
||||
QueryClientParamsResponse is the response type for the Query/ClientParams
|
||||
RPC method.
|
||||
ibc.core.client.v1.QueryClientStateResponse:
|
||||
type: object
|
||||
properties:
|
||||
|
||||
@ -9,7 +9,6 @@ import (
|
||||
|
||||
bip39 "github.com/cosmos/go-bip39"
|
||||
"github.com/spf13/cobra"
|
||||
"github.com/tendermint/tendermint/crypto"
|
||||
"github.com/tendermint/tendermint/libs/cli"
|
||||
|
||||
"github.com/cosmos/cosmos-sdk/client"
|
||||
@ -18,6 +17,7 @@ import (
|
||||
"github.com/cosmos/cosmos-sdk/crypto/hd"
|
||||
"github.com/cosmos/cosmos-sdk/crypto/keyring"
|
||||
"github.com/cosmos/cosmos-sdk/crypto/keys/multisig"
|
||||
cryptotypes "github.com/cosmos/cosmos-sdk/crypto/types"
|
||||
sdk "github.com/cosmos/cosmos-sdk/types"
|
||||
)
|
||||
|
||||
@ -152,7 +152,7 @@ func RunAddCmd(cmd *cobra.Command, args []string, kb keyring.Keyring, inBuf *buf
|
||||
|
||||
multisigKeys, _ := cmd.Flags().GetStringSlice(flagMultisig)
|
||||
if len(multisigKeys) != 0 {
|
||||
var pks []crypto.PubKey
|
||||
var pks []cryptotypes.PubKey
|
||||
|
||||
multisigThreshold, _ := cmd.Flags().GetInt(flagMultiSigThreshold)
|
||||
if err := validateMultisigThreshold(multisigThreshold, len(multisigKeys)); err != nil {
|
||||
@ -247,7 +247,7 @@ func RunAddCmd(cmd *cobra.Command, args []string, kb keyring.Keyring, inBuf *buf
|
||||
}
|
||||
|
||||
if len(mnemonic) == 0 {
|
||||
// read entropy seed straight from crypto.Rand and convert to mnemonic
|
||||
// read entropy seed straight from tmcrypto.Rand and convert to mnemonic
|
||||
entropySeed, err := bip39.NewEntropy(mnemonicEntropySize)
|
||||
if err != nil {
|
||||
return err
|
||||
|
||||
@ -1 +0,0 @@
|
||||
eyJhbGciOiJQQkVTMi1IUzI1NitBMTI4S1ciLCJjcmVhdGVkIjoiMjAyMC0xMC0wOCAxMzowNjozOC45MTAzNTggLTA0MDAgRURUIG09KzAuMDUwMTczMjM4IiwiZW5jIjoiQTI1NkdDTSIsInAyYyI6ODE5MiwicDJzIjoiT25IN1lscERZSHZUVFFQcCJ9.27X3naS_OL75csQLEIFoPvvCyYb9R4D573z1Z1obm3TRGn4HyPFN_w.GXNcqKAUkxqM537Q.cT169l1KGKeOra6NXHbx3kEOEDw77Lom-42mwKV0bRQ_5WZU3kG5o6Ix14r7LFL1ajjc8rdXkuiUgKQyVXEXVpo-6WkEfk2-D_CQaaUgq0-UErT-9Pj7djI3FZkPPG-yxlVSiQXB1xMk38I_AxYwAakctpwHlEK_YC0-UycFmk25Qjezar_ni69KDRPyuqCYh3dyhimG6LgdpWF4pQHjtZPy5qIqcaE7TR0OeKvf9MtsaKEzpAQOeAvh.WbbZ_Fs8qk9rsN6FuWa2zg
|
||||
@ -1 +0,0 @@
|
||||
eyJhbGciOiJQQkVTMi1IUzI1NitBMTI4S1ciLCJjcmVhdGVkIjoiMjAyMC0xMC0wOCAxMjo1MDoxOC4yMzA4ODggLTA0MDAgRURUIG09KzAuMTYxMTg1Nzk2IiwiZW5jIjoiQTI1NkdDTSIsInAyYyI6ODE5MiwicDJzIjoiU3ZNM1hfZU42VHhpSVg3aiJ9.BjL9xqItRueA3u4ujcWPTp4TJjO6w4NeR9G7p32ndo63ADDGJ7j1JQ.8Fd_XM52yxKhF31U.7Cm3SBAmp0u4QffFwBgeueuU3rWT1npSKI5CUROX5COgKbDpqj5CaT54k6UGeZiUxv8itQXglUpAsg7XsF-1LjbbUAfVxXe9H9n1GcfxrLov0L8_Ia-5JadXMXkbvv9jKyjhVg6kSziQXoHcHaeauF1X0_ij3a-UVH87cLqsdAI_OXtptyU8GonVyt_Q0n8mljonjZhj2c_bmXmHARYXZOmCj52dmzSpmkyQ9vqdhlRPco93-JWR5P1V.5J7fb71-1WKJ91g02D0JGg
|
||||
@ -1 +0,0 @@
|
||||
eyJhbGciOiJQQkVTMi1IUzI1NitBMTI4S1ciLCJjcmVhdGVkIjoiMjAyMC0xMC0wOCAxMjo1MzoyMy4yNjI0NzEgLTA0MDAgRURUIG09KzAuMDc2MzQ4MjA5IiwiZW5jIjoiQTI1NkdDTSIsInAyYyI6ODE5MiwicDJzIjoiTE02SnY0RUdZNHBPLTQxWSJ9.wsqaCPHz_PlOH4_B3QlKT_4N9nTEjMzqn_Rqjq2ZM3vzf1dTO1_gjA.WVEaKSvNNWJ3ZaTT.eWrtCGCCplDULPw1QEyijVO_totUT5-6yx-TK4KP_BdKmhdEG8Bm319dXU33BchHthFa2VxDyB4NH_hsUenErJSKIJgJGoVc_AMwqrVZr0Wg0qJaay7jRGh1IRNXc0cuEsNpEek1C31tNaXjD2IuJzkicwdDT3BARFLFFdRhY97LG83YTvX0gVKyJFfjx8TAgUHZgpYyJMI4_vVajnneI-v1SYCY_VMbFTaCqWKFZdYOhu3x-hXfFBww.rxnMJbBz5OU4itr8nuyZgA
|
||||
@ -1 +0,0 @@
|
||||
eyJhbGciOiJQQkVTMi1IUzI1NitBMTI4S1ciLCJjcmVhdGVkIjoiMjAyMC0xMC0wOCAxMjo1MDoxOC4yNDQwMTEgLTA0MDAgRURUIG09KzAuMTc0MzMxMjAxIiwiZW5jIjoiQTI1NkdDTSIsInAyYyI6ODE5MiwicDJzIjoiYmlQLXR5Mnlvc3U2aHBvLSJ9.3drCmgYTeqS3PohaYKQc7i1fyjtOMuEPu_pDqMpT0UStPNDxG_LUDg.VS6Au9HoIruV0RiE._2BmFif-VbT_x4OD1NfsOCVFdL2MZfsG645SkptEKZAncOwHkKmWnBlKiV_LwnNzRBh-9eGGsCGfyou3zjUQRMDDHJOuW2EaVNmufmBWcAb9UoNO8O5kzPHwIvNqqJo5TQyjOviKCoP2PVcJXAwzttqDOw71B-9OuPwt_Ed4G6u8evwGIe08CzV6CKVImzj-AQg-1UI-uL06yFIEJ6CzB1DMdPR0qDQddP8pSYR_RTHnEUsii7HeKK1O.jqlYm4IZhXqe1k5kBQtguA
|
||||
@ -1 +0,0 @@
|
||||
eyJhbGciOiJQQkVTMi1IUzI1NitBMTI4S1ciLCJjcmVhdGVkIjoiMjAyMC0xMC0wOCAxMjo1MDoxOC4yMDQ1NjYgLTA0MDAgRURUIG09KzAuMTM0ODY0MzE4IiwiZW5jIjoiQTI1NkdDTSIsInAyYyI6ODE5MiwicDJzIjoidjVpMzRMY3NNbXduakEyMiJ9.XTokiwtSrKOIGREG7P7uaSfcV3hEr2ANHVUwaKbvLbuQVlTQO8fALw.bldSMLqfirE4GM9S.kNlvEojt1cavNW-nCaxX-Qk3tNm09xtXbuKppWbmMBUCf-_p-U_TWsnHuKbLon47RH1lxomrc1RpcfXwWhDEsGLwibtsjRdxz_2DGh124jeKOr4-Bl2raoPWdHKimm_cf5Ve17ChFfVy1AOaXwIr97ZdGWSU0FP8hOvv5_z5iUsuMK9T0DLxjz0162-_xSQMWWl4-hLknHz-QdO3oR_FpYo2K2eucNaFKmcN5Rn4s2n8FYLU9dIcopUF.WpNuRheBDoTiv3rK95yNjA
|
||||
@ -1 +0,0 @@
|
||||
eyJhbGciOiJQQkVTMi1IUzI1NitBMTI4S1ciLCJjcmVhdGVkIjoiMjAyMC0xMC0wOCAxMjo1MDoxOC4yMjAyOSAtMDQwMCBFRFQgbT0rMC4xNTA1ODc4MjYiLCJlbmMiOiJBMjU2R0NNIiwicDJjIjo4MTkyLCJwMnMiOiJJYXRUWEFMVjBfeXV2ZnNMIn0.kCXD6XXDHeBiXR-GqF10fbMWBvy3qe38r16b92Xu3oLpA5c0a6ByMg.ONW9ggBJFhdfIA8M.IWm_ioQqOCLSK3FbSwjAlEVtzRR4AAW7ceIXpKzv_voaCGDNgcr7xSyRR5N-YK-sVYInwUDrme8rb5T14mjcsNgoGdKKB2QXuApY-GcPwpe2Tf7TyiCxFp91VotHnrbjCh1NvWnjDC-SZNm8HDVolkYtiBPkIkk0uFGh35WWprkVpgEYFyNIFQ0PP3XD4D9A58X0UXdGEu5Q8VcJnt1p86XUyI1le_LufJUrWAz3o_89n3xKj-b6sYzQ.KZSIrdNzE97BxrTSNkMkTw
|
||||
@ -1 +0,0 @@
|
||||
eyJhbGciOiJQQkVTMi1IUzI1NitBMTI4S1ciLCJjcmVhdGVkIjoiMjAyMC0xMC0wOCAxMzowNjozOC45MDMwMjcgLTA0MDAgRURUIG09KzAuMDQyODQyNTY4IiwiZW5jIjoiQTI1NkdDTSIsInAyYyI6ODE5MiwicDJzIjoiSjBxN2Zza0pGRUJJR25mYSJ9.W91-I2lpaBfacsUO2Xn2_tCadqztjGX7MjAkA6GKL4uMkqjEHDXyhw.c8uKD9z5w-jpSmq1.XGnt9JaOg0VT1cjg4RAlwC6Bsq9KowSF6wM6Ak1Y16Kq4sV3NnwA4CqJKnluIjAG6D4sfBKEs2FCHy5zux4uaOQ3Y5EJjRxWoTdBP7HahmO2-jsSFX_sPIzr86KIlKIqaYFJAOUqvaObOsQkX3EL_2-vDonSRMz32abg8thFS6mNi7NtM4xGXQ5Knrix-6OgzBmvWbn4Y0v82vNNWh8d4ubKf_RSEBV7CIWfuFg2CxfRq5EbUUmtMINF74eG52F8y8zjTDcn6n3qKLcecdr6s0n1tc7iq-f3s1EHnzPefwROPLFxiq0Zyt7N7vZCSowOElYZtgQWEg0dy6CIyZ274gNPlfLXMHA-kUsZj4Q_3w.sUPc7D8bBR4I3S-njXa4Ww
|
||||
@ -1 +0,0 @@
|
||||
eyJhbGciOiJQQkVTMi1IUzI1NitBMTI4S1ciLCJjcmVhdGVkIjoiMjAyMC0xMC0wOCAxMjo1MzoyMy4yNTg0OTUgLTA0MDAgRURUIG09KzAuMDcyMzcyNTM1IiwiZW5jIjoiQTI1NkdDTSIsInAyYyI6ODE5MiwicDJzIjoiTW1XOFlVU0Nia2JUNW9iSSJ9.JyBrlPAvgtgYWwu0rcfTn6k9qvv6DywUotcWxPUiJncCBue2WPC5cQ.CmWeu5wMFFinUfiE.FA9k3Q_W8mBgSuJRkYV8h_U5YR2mDmW595L4DnFzuSFJ19Us0O1SQF9-xPJQAyjh4jli46o5mfFfsmU0ce1h4HwklW7AdrRJXVXZ0reZLjrdiojCbLvzyM9tsWInRXi6izUcwLggv2lNCXP5UIRpjMpUPiEC4GsHiwNH8qN04_feICxHuSWJ4mKLWEDtgKxHTrBqvaHT304UF6gRD-_W9_hWdEIj66-5HE4jlxcJAe22WdoF2Z1c3ujhm4piSfHaNnWYsZHLI5Jy1WhkFC2eULOe31c6eAeik5DyUUdWKvAoSiEk4H0Z9EcSbNzlW2rrU30WIIb-icK1qLID21WYurbxM8zvXl-CvhSM2VRN1g.tu_usvTlCOy3okBKmC6zHg
|
||||
@ -1 +0,0 @@
|
||||
eyJhbGciOiJQQkVTMi1IUzI1NitBMTI4S1ciLCJjcmVhdGVkIjoiMjAyMC0xMC0wOCAxMjo1MDoxOC4xOTkwMDUgLTA0MDAgRURUIG09KzAuMTI5MzA0MDMxIiwiZW5jIjoiQTI1NkdDTSIsInAyYyI6ODE5MiwicDJzIjoiYzVYM09VdTBtQmJ4TFd4ayJ9.Pa4p1u-9N9x4E9-5rjUlReLsfH3TvTfAw-Dr1iV8z5ccAfnqLY1UWQ.Q41_cYh4c-C2zi3v.aFna4CwpZeGQBI2_ecOzlJSKypCV0NLCD8PCOnpYvY-k-HqoUFSeouFbuKeN9VaIo12JSZmjzGhfCAupZDBcSJisLVHOvaBAjl5XCOa8k49jb-aSopMI4HXQWatBJcnM65p9Hl1JrYOcnoKPxNKzJ4PiPQnHKv_VgAvWU_CBt6nnSjkwwVJjPMobgvNzeQTEFq-4pyziJNDbDWKUrQSrc-VaO-31JBlhpu6dPOJPFsnOcMyPc76po5cAQQdog-g79d59_Y4vj8s7qd-YPCHnWmoCbgf9w8vbpmJ4Y9evXZQz8A0-c0rFX7F96aZBYtQOeC1ZpRi0BMsbs_WHrpdN678HXej6YpfNDijQmiNYzQ.ayDBvX4W6GiGxAjN3ch8DA
|
||||
@ -1 +0,0 @@
|
||||
eyJhbGciOiJQQkVTMi1IUzI1NitBMTI4S1ciLCJjcmVhdGVkIjoiMjAyMC0xMC0wOCAxMjo1MDoxOC4yMTYwNTkgLTA0MDAgRURUIG09KzAuMTQ2MzU3MTI5IiwiZW5jIjoiQTI1NkdDTSIsInAyYyI6ODE5MiwicDJzIjoidmNnOXNfXzFvY0N1ZC1YTCJ9.hQ21Z1cXTw925V8Xxm_Gywb05S92rKEX54tnELv16xZvkgV8XiEj9A.4Wnaa4LemIi3bdIT.kEJyzWUvmLof5_bYbDePbrYyfjyqTLuUIOdnom3igOuwfzFDHtPuEb3rSLKjxj7LgJOmZVqZGP_ihW1sJQPXbK7ZuWA4zH_Wf-n5T8CFDmNIUhlUIb6sfd_ze-s45CE58hjKRkp7b5k61xBnMujZ5KC5Vk_JHUOUyZB5SqhTuEUJDjSSCFnMDJ1UYKEp23U__XFwcZonent4IMfM0fWvmA6NC2h0qLAMcKw9hbJ_yyNHt2I3lI5twthsAOsXKxUkjhx7c9Tc7BnttFxq-puD_QyjReExP77DzuueDJ-5KBd8PMgeiQMHoYM8e2NAAJU7MXe7voB-D8Ki2QcEgH7GfHNcr6vP1by3hvV5M32OXg.ifBDbtRjrXBOdH_jEORHgw
|
||||
@ -1 +0,0 @@
|
||||
eyJhbGciOiJQQkVTMi1IUzI1NitBMTI4S1ciLCJjcmVhdGVkIjoiMjAyMC0xMC0wOCAxMjo1MDoxOC4yMjY1OTEgLTA0MDAgRURUIG09KzAuMTU2ODg5MTU0IiwiZW5jIjoiQTI1NkdDTSIsInAyYyI6ODE5MiwicDJzIjoiNUtTSWJtdGhCVHVSUnRjYyJ9.qD2C7cQK5P0EHy2Yr-uQZzMHep6U6n57z2LwWTmgxQp6m7ujLw-C-g.rmsltoJfFO4e56RZ.IDpVmduqe2WgyepT_-paXzcosHQzK6sfKY9JH16lT4QRVJ_lAozQOyZrW3X5MbgefrmtXGsoEIEFYhTDYBtXxrW7IqLaBhSCiA5MVwR403H3C2NkcygdGDdR-uDQGW3_bp7xnOhVL_3ofu0-7MQMMhZyz_wEmVW-aG7F6lN68TPaO5KTIqfnI8vOJyyZsSgB0M0gA3f-P4aar64YDTUdjgXPOSBkyRZr07JIOauGhTFXwmHWsDVBvGo3aIIx9ybAg_Blgo8ZAPqOJ6EYmA3J5RE2_LkfJjgI8dEpIFaviBHeWrG54AAN0klQ7trq9MOCpUGPc7PqySwiwTmxb2g4kFH9fR_yQ-g5g6mjj3JYVA.GRnNxd28SYmRt1I9twptPw
|
||||
@ -1 +0,0 @@
|
||||
eyJhbGciOiJQQkVTMi1IUzI1NitBMTI4S1ciLCJjcmVhdGVkIjoiMjAyMC0xMC0wOCAxMjo1MDoxOC4yMzg1MTQgLTA0MDAgRURUIG09KzAuMTY4ODExNzMwIiwiZW5jIjoiQTI1NkdDTSIsInAyYyI6ODE5MiwicDJzIjoiUmZDZC0xeGh6OVJ3RzJfViJ9.hMyIYfHwLYAwJs6THPC30rWfhd1SRUl5po4ifTvln5cV_VHyHLW3MQ.ku5jtKB-G5acpq4v.s0oNPaUaRQbFk-X8AL8QitkI_SdBWB2BpBmRRbo2ZMAkq4x81hSC5p7RlSrM3OGTNFZ4yOrRgzdMv43YpCl7ZpJIypF4l7Hyvl_13jTjqzB7o81dEhl_10SI_Fw607VKCnwqq02_VoqD489EpMVuQ05Fg2pUT3M_mJMacGztORYVJrIWwzbyUiHfM4GlnaoUQaKfwbkHS2W2-1wOPTSWTLEBVJlRG1EAZR_upcPJolcAStjl8PY5EfkxXD56c8Xu6SI8LjMrJAXXg7lTqOGNOkt0v8M8UZWd95Gy2zH_KJm3ItYR_YjPoMIHh-_Cb2-0uoXNRyykW4EpGptp08n7QubSYltzXwaw_NgLP9KUmg.67EgfbLDNyvEYCR12Bjoew
|
||||
@ -5,13 +5,13 @@ import (
|
||||
"fmt"
|
||||
|
||||
"github.com/spf13/cobra"
|
||||
tmcrypto "github.com/tendermint/tendermint/crypto"
|
||||
"github.com/tendermint/tendermint/libs/cli"
|
||||
|
||||
"github.com/cosmos/cosmos-sdk/client"
|
||||
"github.com/cosmos/cosmos-sdk/crypto/keyring"
|
||||
"github.com/cosmos/cosmos-sdk/crypto/keys/multisig"
|
||||
"github.com/cosmos/cosmos-sdk/crypto/ledger"
|
||||
cryptotypes "github.com/cosmos/cosmos-sdk/crypto/types"
|
||||
sdk "github.com/cosmos/cosmos-sdk/types"
|
||||
)
|
||||
|
||||
@ -61,7 +61,7 @@ func runShowCmd(cmd *cobra.Command, args []string) (err error) {
|
||||
return fmt.Errorf("%s is not a valid name or address: %v", args[0], err)
|
||||
}
|
||||
} else {
|
||||
pks := make([]tmcrypto.PubKey, len(args))
|
||||
pks := make([]cryptotypes.PubKey, len(args))
|
||||
for i, keyref := range args {
|
||||
info, err := fetchKey(clientCtx.Keyring, keyref)
|
||||
if err != nil {
|
||||
|
||||
@ -7,14 +7,13 @@ import (
|
||||
|
||||
"github.com/stretchr/testify/require"
|
||||
|
||||
"github.com/tendermint/tendermint/crypto"
|
||||
|
||||
"github.com/cosmos/cosmos-sdk/client"
|
||||
"github.com/cosmos/cosmos-sdk/client/flags"
|
||||
"github.com/cosmos/cosmos-sdk/crypto/hd"
|
||||
"github.com/cosmos/cosmos-sdk/crypto/keyring"
|
||||
"github.com/cosmos/cosmos-sdk/crypto/keys/multisig"
|
||||
"github.com/cosmos/cosmos-sdk/crypto/keys/secp256k1"
|
||||
cryptotypes "github.com/cosmos/cosmos-sdk/crypto/types"
|
||||
"github.com/cosmos/cosmos-sdk/testutil"
|
||||
sdk "github.com/cosmos/cosmos-sdk/types"
|
||||
)
|
||||
@ -23,7 +22,7 @@ func Test_multiSigKey_Properties(t *testing.T) {
|
||||
tmpKey1 := secp256k1.GenPrivKeyFromSecret([]byte("mySecret"))
|
||||
pk := multisig.NewLegacyAminoPubKey(
|
||||
1,
|
||||
[]crypto.PubKey{tmpKey1.PubKey()},
|
||||
[]cryptotypes.PubKey{tmpKey1.PubKey()},
|
||||
)
|
||||
tmp := keyring.NewMultiInfo("myMultisig", pk)
|
||||
|
||||
|
||||
@ -14,6 +14,7 @@ import (
|
||||
|
||||
"github.com/cosmos/cosmos-sdk/client"
|
||||
"github.com/cosmos/cosmos-sdk/client/flags"
|
||||
cryptocodec "github.com/cosmos/cosmos-sdk/crypto/codec"
|
||||
sdk "github.com/cosmos/cosmos-sdk/types"
|
||||
"github.com/cosmos/cosmos-sdk/types/rest"
|
||||
)
|
||||
@ -99,7 +100,11 @@ func (rvo ResultValidatorsOutput) String() string {
|
||||
}
|
||||
|
||||
func bech32ValidatorOutput(validator *tmtypes.Validator) (ValidatorOutput, error) {
|
||||
bechValPubkey, err := sdk.Bech32ifyPubKey(sdk.Bech32PubKeyTypeConsPub, validator.PubKey)
|
||||
pk, err := cryptocodec.FromTmPubKeyInterface(validator.PubKey)
|
||||
if err != nil {
|
||||
return ValidatorOutput{}, err
|
||||
}
|
||||
bechValPubkey, err := sdk.Bech32ifyPubKey(sdk.Bech32PubKeyTypeConsPub, pk)
|
||||
if err != nil {
|
||||
return ValidatorOutput{}, err
|
||||
}
|
||||
|
||||
@ -3,8 +3,7 @@ package client
|
||||
import (
|
||||
"fmt"
|
||||
|
||||
"github.com/tendermint/tendermint/crypto"
|
||||
|
||||
cryptotypes "github.com/cosmos/cosmos-sdk/crypto/types"
|
||||
sdk "github.com/cosmos/cosmos-sdk/types"
|
||||
)
|
||||
|
||||
@ -26,7 +25,7 @@ func (t TestAccount) GetAddress() sdk.AccAddress {
|
||||
}
|
||||
|
||||
// GetPubKey implements client Account.GetPubKey
|
||||
func (t TestAccount) GetPubKey() crypto.PubKey {
|
||||
func (t TestAccount) GetPubKey() cryptotypes.PubKey {
|
||||
return nil
|
||||
}
|
||||
|
||||
|
||||
@ -8,13 +8,13 @@ import (
|
||||
"os"
|
||||
|
||||
"github.com/spf13/pflag"
|
||||
"github.com/tendermint/tendermint/crypto"
|
||||
|
||||
"github.com/cosmos/cosmos-sdk/client"
|
||||
"github.com/cosmos/cosmos-sdk/client/flags"
|
||||
"github.com/cosmos/cosmos-sdk/client/input"
|
||||
codectypes "github.com/cosmos/cosmos-sdk/codec/types"
|
||||
"github.com/cosmos/cosmos-sdk/crypto/keys/secp256k1"
|
||||
cryptotypes "github.com/cosmos/cosmos-sdk/crypto/types"
|
||||
sdk "github.com/cosmos/cosmos-sdk/types"
|
||||
sdkerrors "github.com/cosmos/cosmos-sdk/types/errors"
|
||||
"github.com/cosmos/cosmos-sdk/types/rest"
|
||||
@ -343,7 +343,7 @@ func PrepareFactory(clientCtx client.Context, txf Factory) (Factory, error) {
|
||||
// corresponding SignatureV2 if the signing is successful.
|
||||
func SignWithPrivKey(
|
||||
signMode signing.SignMode, signerData authsigning.SignerData,
|
||||
txBuilder client.TxBuilder, priv crypto.PrivKey, txConfig client.TxConfig,
|
||||
txBuilder client.TxBuilder, priv cryptotypes.PrivKey, txConfig client.TxConfig,
|
||||
accSeq uint64,
|
||||
) (signing.SignatureV2, error) {
|
||||
var sigV2 signing.SignatureV2
|
||||
|
||||
@ -1,5 +1,5 @@
|
||||
// Code generated by protoc-gen-gogo. DO NOT EDIT.
|
||||
// source: third_party/proto/google/protobuf/any.proto
|
||||
// source: google/protobuf/any.proto
|
||||
|
||||
package types
|
||||
|
||||
@ -29,7 +29,7 @@ const _ = proto.GoGoProtoPackageIsVersion3 // please upgrade the proto package
|
||||
func (m *Any) Reset() { *m = Any{} }
|
||||
func (*Any) ProtoMessage() {}
|
||||
func (*Any) Descriptor() ([]byte, []int) {
|
||||
return fileDescriptor_cb68f365a8e2bcdc, []int{0}
|
||||
return fileDescriptor_b53526c13ae22eb4, []int{0}
|
||||
}
|
||||
func (*Any) XXX_WellKnownType() string { return "Any" }
|
||||
func (m *Any) XXX_Unmarshal(b []byte) error {
|
||||
@ -79,28 +79,25 @@ func (*Any) XXX_MessageName() string {
|
||||
func init() {
|
||||
}
|
||||
|
||||
func init() {
|
||||
proto.RegisterFile("third_party/proto/google/protobuf/any.proto", fileDescriptor_cb68f365a8e2bcdc)
|
||||
}
|
||||
func init() { proto.RegisterFile("google/protobuf/any.proto", fileDescriptor_b53526c13ae22eb4) }
|
||||
|
||||
var fileDescriptor_cb68f365a8e2bcdc = []byte{
|
||||
// 246 bytes of a gzipped FileDescriptorProto
|
||||
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xe2, 0xd2, 0x2e, 0xc9, 0xc8, 0x2c,
|
||||
0x4a, 0x89, 0x2f, 0x48, 0x2c, 0x2a, 0xa9, 0xd4, 0x2f, 0x28, 0xca, 0x2f, 0xc9, 0xd7, 0x4f, 0xcf,
|
||||
0xcf, 0x4f, 0xcf, 0x49, 0x85, 0x70, 0x92, 0x4a, 0xd3, 0xf4, 0x13, 0xf3, 0x2a, 0xf5, 0xc0, 0x1c,
|
||||
0x21, 0x7e, 0x88, 0x94, 0x1e, 0x4c, 0x4a, 0x4a, 0x0d, 0x9b, 0xee, 0xf4, 0x7c, 0x04, 0x0b, 0xa2,
|
||||
0x54, 0xc9, 0x86, 0x8b, 0xd9, 0x31, 0xaf, 0x52, 0x48, 0x92, 0x8b, 0xa3, 0xa4, 0xb2, 0x20, 0x35,
|
||||
0xbe, 0xb4, 0x28, 0x47, 0x82, 0x51, 0x81, 0x51, 0x83, 0x33, 0x88, 0x1d, 0xc4, 0x0f, 0x2d, 0xca,
|
||||
0x11, 0x12, 0xe1, 0x62, 0x2d, 0x4b, 0xcc, 0x29, 0x4d, 0x95, 0x60, 0x52, 0x60, 0xd4, 0xe0, 0x09,
|
||||
0x82, 0x70, 0xac, 0x58, 0x3e, 0x2c, 0x94, 0x67, 0x70, 0x6a, 0x66, 0xbc, 0xf1, 0x50, 0x8e, 0xe1,
|
||||
0xc3, 0x43, 0x39, 0xc6, 0x1f, 0x0f, 0xe5, 0x18, 0x1b, 0x1e, 0xc9, 0x31, 0xae, 0x78, 0x24, 0xc7,
|
||||
0x78, 0xe2, 0x91, 0x1c, 0xe3, 0x85, 0x47, 0x72, 0x8c, 0x0f, 0x1e, 0xc9, 0x31, 0xbe, 0x78, 0x24,
|
||||
0xc7, 0xf0, 0x01, 0x24, 0xfe, 0x58, 0x8e, 0xf1, 0xc0, 0x63, 0x39, 0x86, 0x13, 0x8f, 0xe5, 0x18,
|
||||
0xb9, 0x84, 0x93, 0xf3, 0x73, 0xf5, 0xd0, 0x5c, 0xec, 0xc4, 0xe1, 0x98, 0x57, 0x19, 0x00, 0xe2,
|
||||
0x04, 0x30, 0x46, 0xb1, 0x82, 0x2c, 0x2f, 0x5e, 0xc4, 0xc4, 0xec, 0x1e, 0xe0, 0xb4, 0x8a, 0x49,
|
||||
0xce, 0x1d, 0xa2, 0x34, 0x00, 0xaa, 0x54, 0x2f, 0x3c, 0x35, 0x27, 0xc7, 0x3b, 0x2f, 0xbf, 0x3c,
|
||||
0x2f, 0x04, 0xa4, 0x2c, 0x89, 0x0d, 0x6c, 0x86, 0x31, 0x20, 0x00, 0x00, 0xff, 0xff, 0x16, 0xc3,
|
||||
0x46, 0x5f, 0x32, 0x01, 0x00, 0x00,
|
||||
var fileDescriptor_b53526c13ae22eb4 = []byte{
|
||||
// 235 bytes of a gzipped FileDescriptorProto
|
||||
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xe2, 0x92, 0x4c, 0xcf, 0xcf, 0x4f,
|
||||
0xcf, 0x49, 0xd5, 0x2f, 0x28, 0xca, 0x2f, 0xc9, 0x4f, 0x2a, 0x4d, 0xd3, 0x4f, 0xcc, 0xab, 0xd4,
|
||||
0x03, 0x73, 0x84, 0xf8, 0x21, 0x52, 0x7a, 0x30, 0x29, 0x29, 0x91, 0xf4, 0xfc, 0xf4, 0x7c, 0x30,
|
||||
0x4f, 0x1f, 0xc4, 0x82, 0x48, 0x28, 0xd9, 0x70, 0x31, 0x3b, 0xe6, 0x55, 0x0a, 0x49, 0x72, 0x71,
|
||||
0x94, 0x54, 0x16, 0xa4, 0xc6, 0x97, 0x16, 0xe5, 0x48, 0x30, 0x2a, 0x30, 0x6a, 0x70, 0x06, 0xb1,
|
||||
0x83, 0xf8, 0xa1, 0x45, 0x39, 0x42, 0x22, 0x5c, 0xac, 0x65, 0x89, 0x39, 0xa5, 0xa9, 0x12, 0x4c,
|
||||
0x0a, 0x8c, 0x1a, 0x3c, 0x41, 0x10, 0x8e, 0x15, 0xcb, 0x87, 0x85, 0xf2, 0x0c, 0x4e, 0xcd, 0x8c,
|
||||
0x37, 0x1e, 0xca, 0x31, 0x7c, 0x78, 0x28, 0xc7, 0xf8, 0xe3, 0xa1, 0x1c, 0x63, 0xc3, 0x23, 0x39,
|
||||
0xc6, 0x15, 0x8f, 0xe4, 0x18, 0x4f, 0x3c, 0x92, 0x63, 0xbc, 0xf0, 0x48, 0x8e, 0xf1, 0xc1, 0x23,
|
||||
0x39, 0xc6, 0x17, 0x8f, 0xe4, 0x18, 0x3e, 0x80, 0xc4, 0x1f, 0xcb, 0x31, 0x1e, 0x78, 0x2c, 0xc7,
|
||||
0x70, 0xe2, 0xb1, 0x1c, 0x23, 0x97, 0x70, 0x72, 0x7e, 0xae, 0x1e, 0x9a, 0xfb, 0x9c, 0x38, 0x1c,
|
||||
0xf3, 0x2a, 0x03, 0x40, 0x9c, 0x00, 0xc6, 0x28, 0x56, 0x90, 0xe5, 0xc5, 0x8b, 0x98, 0x98, 0xdd,
|
||||
0x03, 0x9c, 0x56, 0x31, 0xc9, 0xb9, 0x43, 0x94, 0x06, 0x40, 0x95, 0xea, 0x85, 0xa7, 0xe6, 0xe4,
|
||||
0x78, 0xe7, 0xe5, 0x97, 0xe7, 0x85, 0x80, 0x94, 0x25, 0xb1, 0x81, 0xcd, 0x30, 0x06, 0x04, 0x00,
|
||||
0x00, 0xff, 0xff, 0xe6, 0xfb, 0xa0, 0x21, 0x0e, 0x01, 0x00, 0x00,
|
||||
}
|
||||
|
||||
func (this *Any) Compare(that interface{}) int {
|
||||
|
||||
25
codec/unknownproto/regression_test.go
Normal file
25
codec/unknownproto/regression_test.go
Normal file
@ -0,0 +1,25 @@
|
||||
package unknownproto_test
|
||||
|
||||
import (
|
||||
"encoding/hex"
|
||||
"io"
|
||||
"testing"
|
||||
|
||||
"github.com/stretchr/testify/require"
|
||||
|
||||
"github.com/cosmos/cosmos-sdk/simapp"
|
||||
)
|
||||
|
||||
// Issue #7739: Catch parse errors resulting from unexpected EOF in
|
||||
// protowire.ConsumeFieldValue. Discovered from fuzzing.
|
||||
func TestBadBytesPassedIntoDecoder(t *testing.T) {
|
||||
data, _ := hex.DecodeString("0A9F010A9C200A2D2F6962632E636F72652E636F6E6E656374696F6E2E76312E4D7367436F6E6E656374696F584F75656E496E6974126B0A0D6962637A65726F636C69656E74120B6962637A65726F636F6E6E1A1C0A0C6962636F6E65636C69656E74120A6962636F6E65636F6E6E00002205312E302E302A283235454635364341373935313335453430393336384536444238313130463232413442453035433212080A0612040A0208011A40143342993E25DA936CDDC7BE3D8F603CA6E9661518D536D0C482E18A0154AA096E438A6B9BCADFCFC2F0D689DCCAF55B96399D67A8361B70F5DA13091E2F929")
|
||||
cfg := simapp.MakeTestEncodingConfig()
|
||||
decoder := cfg.TxConfig.TxDecoder()
|
||||
tx, err := decoder(data)
|
||||
|
||||
// TODO: When issue https://github.com/cosmos/cosmos-sdk/issues/7846
|
||||
// is addressed, we'll remove this .Contains check.
|
||||
require.Contains(t, err.Error(), io.ErrUnexpectedEOF.Error())
|
||||
require.Nil(t, tx)
|
||||
}
|
||||
@ -92,6 +92,11 @@ func RejectUnknownFields(bz []byte, msg proto.Message, allowUnknownNonCriticals
|
||||
// Skip over the bytes that store fieldNumber and wireType bytes.
|
||||
bz = bz[m:]
|
||||
n := protowire.ConsumeFieldValue(tagNum, wireType, bz)
|
||||
if n < 0 {
|
||||
err = fmt.Errorf("could not consume field value for tagNum: %d, wireType: %q; %w",
|
||||
tagNum, wireTypeToString(wireType), protowire.ParseError(n))
|
||||
return hasUnknownNonCriticals, err
|
||||
}
|
||||
fieldBytes := bz[:n]
|
||||
bz = bz[n:]
|
||||
|
||||
|
||||
@ -57,14 +57,6 @@ tools-stamp: statik runsim
|
||||
# in a row.
|
||||
touch $@
|
||||
|
||||
proto-tools: proto-tools-stamp
|
||||
proto-tools-stamp:
|
||||
bash $(mkfile_dir)/proto-tools-installer.sh
|
||||
# Create dummy file to satisfy dependency and avoid
|
||||
# rebuilding when this Makefile target is hit twice
|
||||
# in a row.
|
||||
touch $@
|
||||
|
||||
# Install the runsim binary with a temporary workaround of entering an outside
|
||||
# directory as the "go get" command ignores the -mod option and will polute the
|
||||
# go.{mod, sum} files.
|
||||
@ -87,6 +79,6 @@ $(RUNSIM):
|
||||
|
||||
tools-clean:
|
||||
rm -f $(STATIK) $(GOLANGCI_LINT) $(RUNSIM)
|
||||
rm -f proto-tools-stamp tools-stamp
|
||||
rm -f tools-stamp
|
||||
|
||||
.PHONY: tools-clean statik runsim
|
||||
|
||||
@ -1,128 +0,0 @@
|
||||
#!/bin/bash
|
||||
|
||||
set -ue
|
||||
|
||||
DESTDIR=${DESTDIR:-}
|
||||
PREFIX=${PREFIX:-/usr/local}
|
||||
UNAME_S="$(uname -s 2>/dev/null)"
|
||||
UNAME_M="$(uname -m 2>/dev/null)"
|
||||
BUF_VERSION=0.11.0
|
||||
PROTOC_VERSION=3.13.0
|
||||
PROTOC_GRPC_GATEWAY_VERSION=1.14.7
|
||||
|
||||
f_abort() {
|
||||
local l_rc=$1
|
||||
shift
|
||||
|
||||
echo $@ >&2
|
||||
exit ${l_rc}
|
||||
}
|
||||
|
||||
case "${UNAME_S}" in
|
||||
Linux)
|
||||
PROTOC_ZIP="protoc-${PROTOC_VERSION}-linux-x86_64.zip"
|
||||
PROTOC_GRPC_GATEWAY_BIN="protoc-gen-grpc-gateway-v${PROTOC_GRPC_GATEWAY_VERSION}-linux-x86_64"
|
||||
;;
|
||||
Darwin)
|
||||
PROTOC_ZIP="protoc-${PROTOC_VERSION}-osx-x86_64.zip"
|
||||
PROTOC_GRPC_GATEWAY_BIN="protoc-gen-grpc-gateway-v${PROTOC_GRPC_GATEWAY_VERSION}-darwin-x86_64"
|
||||
;;
|
||||
*)
|
||||
f_abort 1 "Unknown kernel name. Exiting."
|
||||
esac
|
||||
|
||||
TEMPDIR="$(mktemp -d)"
|
||||
|
||||
trap "rm -rvf ${TEMPDIR}" EXIT
|
||||
|
||||
f_print_installing_with_padding() {
|
||||
printf "Installing %30s ..." "$1" >&2
|
||||
}
|
||||
|
||||
f_print_done() {
|
||||
echo -e "\tDONE" >&2
|
||||
}
|
||||
|
||||
f_ensure_tools() {
|
||||
! which curl &>/dev/null && f_abort 2 "couldn't find curl, aborting" || true
|
||||
}
|
||||
|
||||
f_ensure_dirs() {
|
||||
mkdir -p "${DESTDIR}/${PREFIX}/bin"
|
||||
mkdir -p "${DESTDIR}/${PREFIX}/include"
|
||||
}
|
||||
|
||||
f_needs_install() {
|
||||
if [ -x $1 ]; then
|
||||
echo -e "\talready installed. Skipping." >&2
|
||||
return 1
|
||||
fi
|
||||
|
||||
return 0
|
||||
}
|
||||
|
||||
f_install_protoc() {
|
||||
f_print_installing_with_padding proto_c
|
||||
f_needs_install "${DESTDIR}/${PREFIX}/bin/protoc" || return 0
|
||||
|
||||
pushd "${TEMPDIR}" >/dev/null
|
||||
curl -o "${PROTOC_ZIP}" -sSL "https://github.com/protocolbuffers/protobuf/releases/download/v${PROTOC_VERSION}/${PROTOC_ZIP}"
|
||||
unzip -q -o ${PROTOC_ZIP} -d ${DESTDIR}/${PREFIX} bin/protoc; \
|
||||
unzip -q -o ${PROTOC_ZIP} -d ${DESTDIR}/${PREFIX} 'include/*'; \
|
||||
rm -f ${PROTOC_ZIP}
|
||||
popd >/dev/null
|
||||
f_print_done
|
||||
}
|
||||
|
||||
f_install_buf() {
|
||||
f_print_installing_with_padding buf
|
||||
f_needs_install "${DESTDIR}/${PREFIX}/bin/buf" || return 0
|
||||
|
||||
curl -sSL "https://github.com/bufbuild/buf/releases/download/v${BUF_VERSION}/buf-${UNAME_S}-${UNAME_M}" -o "${DESTDIR}/${PREFIX}/bin/buf"
|
||||
chmod +x "${DESTDIR}/${PREFIX}/bin/buf"
|
||||
f_print_done
|
||||
}
|
||||
|
||||
f_install_protoc_gen_gocosmos() {
|
||||
f_print_installing_with_padding protoc-gen-gocosmos
|
||||
|
||||
if ! grep "github.com/gogo/protobuf => github.com/regen-network/protobuf" go.mod &>/dev/null ; then
|
||||
echo -e "\tPlease run this command from somewhere inside the cosmos-sdk folder."
|
||||
return 1
|
||||
fi
|
||||
|
||||
go get github.com/regen-network/cosmos-proto/protoc-gen-gocosmos 2>/dev/null
|
||||
f_print_done
|
||||
}
|
||||
|
||||
f_install_protoc_gen_grpc_gateway() {
|
||||
f_print_installing_with_padding protoc-gen-grpc-gateway
|
||||
f_needs_install "${DESTDIR}/${PREFIX}/bin/protoc-gen-grpc-gateway" || return 0
|
||||
|
||||
curl -o "${DESTDIR}/${PREFIX}/bin/protoc-gen-grpc-gateway" -sSL "https://github.com/grpc-ecosystem/grpc-gateway/releases/download/v${PROTOC_GRPC_GATEWAY_VERSION}/${PROTOC_GRPC_GATEWAY_BIN}"
|
||||
f_print_done
|
||||
}
|
||||
|
||||
f_install_protoc_gen_swagger() {
|
||||
f_print_installing_with_padding protoc-gen-swagger
|
||||
f_needs_install "${DESTDIR}/${PREFIX}/bin/protoc-gen-swagger" || return 0
|
||||
|
||||
if ! which npm &>/dev/null ; then
|
||||
echo -e "\tNPM is not installed. Skipping."
|
||||
return 0
|
||||
fi
|
||||
|
||||
pushd "${TEMPDIR}" >/dev/null
|
||||
go get github.com/grpc-ecosystem/grpc-gateway/protoc-gen-swagger
|
||||
npm install -g swagger-combine
|
||||
popd >/dev/null
|
||||
f_print_done
|
||||
}
|
||||
|
||||
f_ensure_tools
|
||||
f_ensure_dirs
|
||||
f_install_protoc
|
||||
f_install_buf
|
||||
f_install_protoc_gen_gocosmos
|
||||
f_install_protoc_gen_grpc_gateway
|
||||
f_install_protoc_gen_swagger
|
||||
@ -5,10 +5,18 @@ import (
|
||||
"path/filepath"
|
||||
"testing"
|
||||
|
||||
"github.com/stretchr/testify/assert"
|
||||
"github.com/stretchr/testify/suite"
|
||||
)
|
||||
|
||||
func TestConfigPaths(t *testing.T) {
|
||||
type argsTestSuite struct {
|
||||
suite.Suite
|
||||
}
|
||||
|
||||
func TestArgsTestSuite(t *testing.T) {
|
||||
suite.Run(t, new(argsTestSuite))
|
||||
}
|
||||
|
||||
func (s *argsTestSuite) TestConfigPaths() {
|
||||
cases := map[string]struct {
|
||||
cfg Config
|
||||
upgradeName string
|
||||
@ -32,23 +40,21 @@ func TestConfigPaths(t *testing.T) {
|
||||
},
|
||||
}
|
||||
|
||||
for name, tc := range cases {
|
||||
t.Run(name, func(t *testing.T) {
|
||||
assert.Equal(t, tc.cfg.Root(), filepath.FromSlash(tc.expectRoot))
|
||||
assert.Equal(t, tc.cfg.GenesisBin(), filepath.FromSlash(tc.expectGenesis))
|
||||
assert.Equal(t, tc.cfg.UpgradeBin(tc.upgradeName), filepath.FromSlash(tc.expectUpgrade))
|
||||
})
|
||||
for _, tc := range cases {
|
||||
s.Require().Equal(tc.cfg.Root(), filepath.FromSlash(tc.expectRoot))
|
||||
s.Require().Equal(tc.cfg.GenesisBin(), filepath.FromSlash(tc.expectGenesis))
|
||||
s.Require().Equal(tc.cfg.UpgradeBin(tc.upgradeName), filepath.FromSlash(tc.expectUpgrade))
|
||||
}
|
||||
}
|
||||
|
||||
// Test validate
|
||||
func TestValidate(t *testing.T) {
|
||||
func (s *argsTestSuite) TestValidate() {
|
||||
relPath := filepath.Join("testdata", "validate")
|
||||
absPath, err := filepath.Abs(relPath)
|
||||
assert.NoError(t, err)
|
||||
s.Require().NoError(err)
|
||||
|
||||
testdata, err := filepath.Abs("testdata")
|
||||
assert.NoError(t, err)
|
||||
s.Require().NoError(err)
|
||||
|
||||
cases := map[string]struct {
|
||||
cfg Config
|
||||
@ -84,28 +90,25 @@ func TestValidate(t *testing.T) {
|
||||
},
|
||||
}
|
||||
|
||||
for name, tc := range cases {
|
||||
t.Run(name, func(t *testing.T) {
|
||||
err := tc.cfg.validate()
|
||||
if tc.valid {
|
||||
assert.NoError(t, err)
|
||||
} else {
|
||||
assert.Error(t, err)
|
||||
}
|
||||
})
|
||||
for _, tc := range cases {
|
||||
err := tc.cfg.validate()
|
||||
if tc.valid {
|
||||
s.Require().NoError(err)
|
||||
} else {
|
||||
s.Require().Error(err)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
func TestEnsureBin(t *testing.T) {
|
||||
func (s *argsTestSuite) TestEnsureBin() {
|
||||
relPath := filepath.Join("testdata", "validate")
|
||||
absPath, err := filepath.Abs(relPath)
|
||||
assert.NoError(t, err)
|
||||
s.Require().NoError(err)
|
||||
|
||||
cfg := Config{Home: absPath, Name: "dummyd"}
|
||||
assert.NoError(t, cfg.validate())
|
||||
s.Require().NoError(cfg.validate())
|
||||
|
||||
err = EnsureBinary(cfg.GenesisBin())
|
||||
assert.NoError(t, err)
|
||||
s.Require().NoError(EnsureBinary(cfg.GenesisBin()))
|
||||
|
||||
cases := map[string]struct {
|
||||
upgrade string
|
||||
@ -117,14 +120,12 @@ func TestEnsureBin(t *testing.T) {
|
||||
"no directory": {"foobarbaz", false},
|
||||
}
|
||||
|
||||
for name, tc := range cases {
|
||||
t.Run(name, func(t *testing.T) {
|
||||
err := EnsureBinary(cfg.UpgradeBin(tc.upgrade))
|
||||
if tc.hasBin {
|
||||
assert.NoError(t, err)
|
||||
} else {
|
||||
assert.Error(t, err)
|
||||
}
|
||||
})
|
||||
for _, tc := range cases {
|
||||
err := EnsureBinary(cfg.UpgradeBin(tc.upgrade))
|
||||
if tc.hasBin {
|
||||
s.Require().NoError(err)
|
||||
} else {
|
||||
s.Require().Error(err)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@ -4,9 +4,13 @@ import (
|
||||
"bufio"
|
||||
"fmt"
|
||||
"io"
|
||||
"log"
|
||||
"os"
|
||||
"os/exec"
|
||||
"os/signal"
|
||||
"strings"
|
||||
"sync"
|
||||
"syscall"
|
||||
)
|
||||
|
||||
// LaunchProcess runs a subprocess and returns when the subprocess exits,
|
||||
@ -39,6 +43,15 @@ func LaunchProcess(cfg *Config, args []string, stdout, stderr io.Writer) (bool,
|
||||
return false, fmt.Errorf("launching process %s %s: %w", bin, strings.Join(args, " "), err)
|
||||
}
|
||||
|
||||
sigs := make(chan os.Signal, 1)
|
||||
signal.Notify(sigs, syscall.SIGQUIT, syscall.SIGTERM)
|
||||
go func() {
|
||||
sig := <-sigs
|
||||
if err := cmd.Process.Signal(sig); err != nil {
|
||||
log.Fatal(err)
|
||||
}
|
||||
}()
|
||||
|
||||
// three ways to exit - command ends, find regexp in scanOut, find regexp in scanErr
|
||||
upgradeInfo, err := WaitForUpgradeOrExit(cmd, scanOut, scanErr)
|
||||
if err != nil {
|
||||
|
||||
@ -1,110 +1,114 @@
|
||||
// +build linux
|
||||
|
||||
package cosmovisor
|
||||
package cosmovisor_test
|
||||
|
||||
import (
|
||||
"bytes"
|
||||
"os"
|
||||
"testing"
|
||||
|
||||
"github.com/stretchr/testify/assert"
|
||||
"github.com/stretchr/testify/require"
|
||||
"github.com/stretchr/testify/suite"
|
||||
|
||||
"github.com/cosmos/cosmos-sdk/cosmovisor"
|
||||
)
|
||||
|
||||
// TestLaunchProcess will try running the script a few times and watch upgrades work properly
|
||||
// and args are passed through
|
||||
func TestLaunchProcess(t *testing.T) {
|
||||
home, err := copyTestData("validate")
|
||||
cfg := &Config{Home: home, Name: "dummyd"}
|
||||
require.NoError(t, err)
|
||||
defer os.RemoveAll(home)
|
||||
type processTestSuite struct {
|
||||
suite.Suite
|
||||
}
|
||||
|
||||
// should run the genesis binary and produce expected output
|
||||
var stdout, stderr bytes.Buffer
|
||||
currentBin, err := cfg.CurrentBin()
|
||||
require.NoError(t, err)
|
||||
|
||||
require.Equal(t, cfg.GenesisBin(), currentBin)
|
||||
|
||||
args := []string{"foo", "bar", "1234"}
|
||||
doUpgrade, err := LaunchProcess(cfg, args, &stdout, &stderr)
|
||||
require.NoError(t, err)
|
||||
assert.True(t, doUpgrade)
|
||||
assert.Equal(t, "", stderr.String())
|
||||
assert.Equal(t, "Genesis foo bar 1234\nUPGRADE \"chain2\" NEEDED at height: 49: {}\n", stdout.String())
|
||||
|
||||
// ensure this is upgraded now and produces new output
|
||||
|
||||
currentBin, err = cfg.CurrentBin()
|
||||
require.NoError(t, err)
|
||||
require.Equal(t, cfg.UpgradeBin("chain2"), currentBin)
|
||||
args = []string{"second", "run", "--verbose"}
|
||||
stdout.Reset()
|
||||
stderr.Reset()
|
||||
doUpgrade, err = LaunchProcess(cfg, args, &stdout, &stderr)
|
||||
require.NoError(t, err)
|
||||
assert.False(t, doUpgrade)
|
||||
assert.Equal(t, "", stderr.String())
|
||||
assert.Equal(t, "Chain 2 is live!\nArgs: second run --verbose\nFinished successfully\n", stdout.String())
|
||||
|
||||
// ended without other upgrade
|
||||
require.Equal(t, cfg.UpgradeBin("chain2"), currentBin)
|
||||
func TestProcessTestSuite(t *testing.T) {
|
||||
suite.Run(t, new(processTestSuite))
|
||||
}
|
||||
|
||||
// TestLaunchProcess will try running the script a few times and watch upgrades work properly
|
||||
// and args are passed through
|
||||
func TestLaunchProcessWithDownloads(t *testing.T) {
|
||||
func (s *processTestSuite) TestLaunchProcess() {
|
||||
home := copyTestData(s.T(), "validate")
|
||||
cfg := &cosmovisor.Config{Home: home, Name: "dummyd"}
|
||||
|
||||
// should run the genesis binary and produce expected output
|
||||
var stdout, stderr bytes.Buffer
|
||||
currentBin, err := cfg.CurrentBin()
|
||||
s.Require().NoError(err)
|
||||
|
||||
s.Require().Equal(cfg.GenesisBin(), currentBin)
|
||||
|
||||
args := []string{"foo", "bar", "1234"}
|
||||
doUpgrade, err := cosmovisor.LaunchProcess(cfg, args, &stdout, &stderr)
|
||||
s.Require().NoError(err)
|
||||
s.Require().True(doUpgrade)
|
||||
s.Require().Equal("", stderr.String())
|
||||
s.Require().Equal("Genesis foo bar 1234\nUPGRADE \"chain2\" NEEDED at height: 49: {}\n", stdout.String())
|
||||
|
||||
// ensure this is upgraded now and produces new output
|
||||
|
||||
currentBin, err = cfg.CurrentBin()
|
||||
s.Require().NoError(err)
|
||||
s.Require().Equal(cfg.UpgradeBin("chain2"), currentBin)
|
||||
args = []string{"second", "run", "--verbose"}
|
||||
stdout.Reset()
|
||||
stderr.Reset()
|
||||
doUpgrade, err = cosmovisor.LaunchProcess(cfg, args, &stdout, &stderr)
|
||||
s.Require().NoError(err)
|
||||
s.Require().False(doUpgrade)
|
||||
s.Require().Equal("", stderr.String())
|
||||
s.Require().Equal("Chain 2 is live!\nArgs: second run --verbose\nFinished successfully\n", stdout.String())
|
||||
|
||||
// ended without other upgrade
|
||||
s.Require().Equal(cfg.UpgradeBin("chain2"), currentBin)
|
||||
}
|
||||
|
||||
// TestLaunchProcess will try running the script a few times and watch upgrades work properly
|
||||
// and args are passed through
|
||||
func (s *processTestSuite) TestLaunchProcessWithDownloads() {
|
||||
// this is a fun path
|
||||
// genesis -> "chain2" = zip_binary
|
||||
// zip_binary -> "chain3" = ref_zipped -> zip_directory
|
||||
// zip_directory no upgrade
|
||||
home, err := copyTestData("download")
|
||||
cfg := &Config{Home: home, Name: "autod", AllowDownloadBinaries: true}
|
||||
require.NoError(t, err)
|
||||
defer os.RemoveAll(home)
|
||||
home := copyTestData(s.T(), "download")
|
||||
cfg := &cosmovisor.Config{Home: home, Name: "autod", AllowDownloadBinaries: true}
|
||||
|
||||
// should run the genesis binary and produce expected output
|
||||
var stdout, stderr bytes.Buffer
|
||||
currentBin, err := cfg.CurrentBin()
|
||||
require.NoError(t, err)
|
||||
s.Require().NoError(err)
|
||||
|
||||
require.Equal(t, cfg.GenesisBin(), currentBin)
|
||||
s.Require().Equal(cfg.GenesisBin(), currentBin)
|
||||
args := []string{"some", "args"}
|
||||
doUpgrade, err := LaunchProcess(cfg, args, &stdout, &stderr)
|
||||
require.NoError(t, err)
|
||||
assert.True(t, doUpgrade)
|
||||
assert.Equal(t, "", stderr.String())
|
||||
assert.Equal(t, "Preparing auto-download some args\n"+`ERROR: UPGRADE "chain2" NEEDED at height: 49: {"binaries":{"linux/amd64":"https://github.com/cosmos/cosmos-sdk/raw/51249cb93130810033408934454841c98423ed4b/cosmovisor/testdata/repo/zip_binary/autod.zip?checksum=sha256:dc48829b4126ae95bc0db316c66d4e9da5f3db95e212665b6080638cca77e998"}} module=main`+"\n", stdout.String())
|
||||
doUpgrade, err := cosmovisor.LaunchProcess(cfg, args, &stdout, &stderr)
|
||||
s.Require().NoError(err)
|
||||
s.Require().True(doUpgrade)
|
||||
s.Require().Equal("", stderr.String())
|
||||
s.Require().Equal("Preparing auto-download some args\n"+`ERROR: UPGRADE "chain2" NEEDED at height: 49: {"binaries":{"linux/amd64":"https://github.com/cosmos/cosmos-sdk/raw/51249cb93130810033408934454841c98423ed4b/cosmovisor/testdata/repo/zip_binary/autod.zip?checksum=sha256:dc48829b4126ae95bc0db316c66d4e9da5f3db95e212665b6080638cca77e998"}} module=main`+"\n", stdout.String())
|
||||
|
||||
// ensure this is upgraded now and produces new output
|
||||
currentBin, err = cfg.CurrentBin()
|
||||
require.NoError(t, err)
|
||||
require.Equal(t, cfg.UpgradeBin("chain2"), currentBin)
|
||||
s.Require().NoError(err)
|
||||
s.Require().Equal(cfg.UpgradeBin("chain2"), currentBin)
|
||||
args = []string{"run", "--fast"}
|
||||
stdout.Reset()
|
||||
stderr.Reset()
|
||||
doUpgrade, err = LaunchProcess(cfg, args, &stdout, &stderr)
|
||||
require.NoError(t, err)
|
||||
assert.True(t, doUpgrade)
|
||||
assert.Equal(t, "", stderr.String())
|
||||
assert.Equal(t, "Chain 2 from zipped binary link to referral\nArgs: run --fast\n"+`ERROR: UPGRADE "chain3" NEEDED at height: 936: https://github.com/cosmos/cosmos-sdk/raw/0eae1a50612b8bf803336d35055896fbddaa1ddd/cosmovisor/testdata/repo/ref_zipped?checksum=sha256:0a428575de718ed3cf0771c9687eefaf6f19359977eca4d94a0abd0e11ef8e64 module=main`+"\n", stdout.String())
|
||||
doUpgrade, err = cosmovisor.LaunchProcess(cfg, args, &stdout, &stderr)
|
||||
s.Require().NoError(err)
|
||||
s.Require().True(doUpgrade)
|
||||
s.Require().Equal("", stderr.String())
|
||||
s.Require().Equal("Chain 2 from zipped binary link to referral\nArgs: run --fast\n"+`ERROR: UPGRADE "chain3" NEEDED at height: 936: https://github.com/cosmos/cosmos-sdk/raw/0eae1a50612b8bf803336d35055896fbddaa1ddd/cosmovisor/testdata/repo/ref_zipped?checksum=sha256:0a428575de718ed3cf0771c9687eefaf6f19359977eca4d94a0abd0e11ef8e64 module=main`+"\n", stdout.String())
|
||||
|
||||
// ended with one more upgrade
|
||||
currentBin, err = cfg.CurrentBin()
|
||||
require.NoError(t, err)
|
||||
require.Equal(t, cfg.UpgradeBin("chain3"), currentBin)
|
||||
s.Require().NoError(err)
|
||||
s.Require().Equal(cfg.UpgradeBin("chain3"), currentBin)
|
||||
// make sure this is the proper binary now....
|
||||
args = []string{"end", "--halt"}
|
||||
stdout.Reset()
|
||||
stderr.Reset()
|
||||
doUpgrade, err = LaunchProcess(cfg, args, &stdout, &stderr)
|
||||
require.NoError(t, err)
|
||||
assert.False(t, doUpgrade)
|
||||
assert.Equal(t, "", stderr.String())
|
||||
assert.Equal(t, "Chain 2 from zipped directory\nArgs: end --halt\n", stdout.String())
|
||||
doUpgrade, err = cosmovisor.LaunchProcess(cfg, args, &stdout, &stderr)
|
||||
s.Require().NoError(err)
|
||||
s.Require().False(doUpgrade)
|
||||
s.Require().Equal("", stderr.String())
|
||||
s.Require().Equal("Chain 2 from zipped directory\nArgs: end --halt\n", stdout.String())
|
||||
|
||||
// and this doesn't upgrade
|
||||
currentBin, err = cfg.CurrentBin()
|
||||
require.NoError(t, err)
|
||||
require.Equal(t, cfg.UpgradeBin("chain3"), currentBin)
|
||||
s.Require().NoError(err)
|
||||
s.Require().Equal(cfg.UpgradeBin("chain3"), currentBin)
|
||||
}
|
||||
|
||||
@ -1,17 +1,19 @@
|
||||
package cosmovisor
|
||||
package cosmovisor_test
|
||||
|
||||
import (
|
||||
"bufio"
|
||||
"io"
|
||||
"testing"
|
||||
|
||||
"github.com/stretchr/testify/assert"
|
||||
"github.com/cosmos/cosmos-sdk/cosmovisor"
|
||||
|
||||
"github.com/stretchr/testify/require"
|
||||
)
|
||||
|
||||
func TestWaitForInfo(t *testing.T) {
|
||||
cases := map[string]struct {
|
||||
write []string
|
||||
expectUpgrade *UpgradeInfo
|
||||
expectUpgrade *cosmovisor.UpgradeInfo
|
||||
expectErr bool
|
||||
}{
|
||||
"no match": {
|
||||
@ -19,14 +21,14 @@ func TestWaitForInfo(t *testing.T) {
|
||||
},
|
||||
"match name with no info": {
|
||||
write: []string{"first line\n", `UPGRADE "myname" NEEDED at height: 123: `, "\nnext line\n"},
|
||||
expectUpgrade: &UpgradeInfo{
|
||||
expectUpgrade: &cosmovisor.UpgradeInfo{
|
||||
Name: "myname",
|
||||
Info: "",
|
||||
},
|
||||
},
|
||||
"match name with info": {
|
||||
write: []string{"first line\n", `UPGRADE "take2" NEEDED at height: 123: DownloadData here!`, "\nnext line\n"},
|
||||
expectUpgrade: &UpgradeInfo{
|
||||
expectUpgrade: &cosmovisor.UpgradeInfo{
|
||||
Name: "take2",
|
||||
Info: "DownloadData",
|
||||
},
|
||||
@ -42,20 +44,20 @@ func TestWaitForInfo(t *testing.T) {
|
||||
go func() {
|
||||
for _, line := range tc.write {
|
||||
n, err := w.Write([]byte(line))
|
||||
assert.NoError(t, err)
|
||||
assert.Equal(t, len(line), n)
|
||||
require.NoError(t, err)
|
||||
require.Equal(t, len(line), n)
|
||||
}
|
||||
w.Close()
|
||||
}()
|
||||
|
||||
// now scan the info
|
||||
info, err := WaitForUpdate(scan)
|
||||
info, err := cosmovisor.WaitForUpdate(scan)
|
||||
if tc.expectErr {
|
||||
assert.Error(t, err)
|
||||
require.Error(t, err)
|
||||
return
|
||||
}
|
||||
assert.NoError(t, err)
|
||||
assert.Equal(t, tc.expectUpgrade, info)
|
||||
require.NoError(t, err)
|
||||
require.Equal(t, tc.expectUpgrade, info)
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
@ -119,12 +119,12 @@ func GetDownloadURL(info *UpgradeInfo) (string, error) {
|
||||
var config UpgradeConfig
|
||||
|
||||
if err := json.Unmarshal([]byte(doc), &config); err == nil {
|
||||
url, ok := config.Binaries[osArch()]
|
||||
url, ok := config.Binaries[OSArch()]
|
||||
if !ok {
|
||||
url, ok = config.Binaries["any"]
|
||||
}
|
||||
if !ok {
|
||||
return "", fmt.Errorf("cannot find binary for os/arch: neither %s, nor any", osArch())
|
||||
return "", fmt.Errorf("cannot find binary for os/arch: neither %s, nor any", OSArch())
|
||||
}
|
||||
|
||||
return url, nil
|
||||
@ -133,7 +133,7 @@ func GetDownloadURL(info *UpgradeInfo) (string, error) {
|
||||
return "", errors.New("upgrade info doesn't contain binary map")
|
||||
}
|
||||
|
||||
func osArch() string {
|
||||
func OSArch() string {
|
||||
return fmt.Sprintf("%s/%s", runtime.GOOS, runtime.GOARCH)
|
||||
}
|
||||
|
||||
|
||||
@ -1,139 +1,138 @@
|
||||
// +build linux
|
||||
|
||||
package cosmovisor
|
||||
package cosmovisor_test
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"io/ioutil"
|
||||
"os"
|
||||
"path/filepath"
|
||||
"strings"
|
||||
"testing"
|
||||
|
||||
copy2 "github.com/otiai10/copy"
|
||||
"github.com/stretchr/testify/suite"
|
||||
|
||||
"github.com/stretchr/testify/assert"
|
||||
"github.com/otiai10/copy"
|
||||
"github.com/stretchr/testify/require"
|
||||
|
||||
"github.com/cosmos/cosmos-sdk/cosmovisor"
|
||||
)
|
||||
|
||||
func TestCurrentBin(t *testing.T) {
|
||||
home, err := copyTestData("validate")
|
||||
require.NoError(t, err)
|
||||
defer os.RemoveAll(home)
|
||||
type upgradeTestSuite struct {
|
||||
suite.Suite
|
||||
}
|
||||
|
||||
cfg := Config{Home: home, Name: "dummyd"}
|
||||
func TestUpgradeTestSuite(t *testing.T) {
|
||||
suite.Run(t, new(upgradeTestSuite))
|
||||
}
|
||||
|
||||
func (s *upgradeTestSuite) TestCurrentBin() {
|
||||
home := copyTestData(s.T(), "validate")
|
||||
cfg := cosmovisor.Config{Home: home, Name: "dummyd"}
|
||||
|
||||
currentBin, err := cfg.CurrentBin()
|
||||
require.NoError(t, err)
|
||||
s.Require().NoError(err)
|
||||
|
||||
assert.Equal(t, cfg.GenesisBin(), currentBin)
|
||||
s.Require().Equal(cfg.GenesisBin(), currentBin)
|
||||
|
||||
// ensure we cannot set this to an invalid value
|
||||
for _, name := range []string{"missing", "nobin", "noexec"} {
|
||||
err = cfg.SetCurrentUpgrade(name)
|
||||
require.Error(t, err, name)
|
||||
s.Require().Error(cfg.SetCurrentUpgrade(name), name)
|
||||
|
||||
currentBin, err := cfg.CurrentBin()
|
||||
require.NoError(t, err)
|
||||
s.Require().NoError(err)
|
||||
|
||||
assert.Equal(t, cfg.GenesisBin(), currentBin, name)
|
||||
s.Require().Equal(cfg.GenesisBin(), currentBin, name)
|
||||
}
|
||||
|
||||
// try a few times to make sure this can be reproduced
|
||||
for _, upgrade := range []string{"chain2", "chain3", "chain2"} {
|
||||
// now set it to a valid upgrade and make sure CurrentBin is now set properly
|
||||
err = cfg.SetCurrentUpgrade(upgrade)
|
||||
require.NoError(t, err)
|
||||
s.Require().NoError(err)
|
||||
// we should see current point to the new upgrade dir
|
||||
currentBin, err := cfg.CurrentBin()
|
||||
require.NoError(t, err)
|
||||
s.Require().NoError(err)
|
||||
|
||||
assert.Equal(t, cfg.UpgradeBin(upgrade), currentBin)
|
||||
s.Require().Equal(cfg.UpgradeBin(upgrade), currentBin)
|
||||
}
|
||||
}
|
||||
|
||||
func TestCurrentAlwaysSymlinkToDirectory(t *testing.T) {
|
||||
home, err := copyTestData("validate")
|
||||
require.NoError(t, err)
|
||||
defer os.RemoveAll(home)
|
||||
|
||||
cfg := Config{Home: home, Name: "dummyd"}
|
||||
func (s *upgradeTestSuite) TestCurrentAlwaysSymlinkToDirectory() {
|
||||
home := copyTestData(s.T(), "validate")
|
||||
cfg := cosmovisor.Config{Home: home, Name: "dummyd"}
|
||||
|
||||
currentBin, err := cfg.CurrentBin()
|
||||
require.NoError(t, err)
|
||||
assert.Equal(t, cfg.GenesisBin(), currentBin)
|
||||
assertCurrentLink(t, cfg, "genesis")
|
||||
s.Require().NoError(err)
|
||||
s.Require().Equal(cfg.GenesisBin(), currentBin)
|
||||
s.assertCurrentLink(cfg, "genesis")
|
||||
|
||||
err = cfg.SetCurrentUpgrade("chain2")
|
||||
require.NoError(t, err)
|
||||
s.Require().NoError(err)
|
||||
currentBin, err = cfg.CurrentBin()
|
||||
require.NoError(t, err)
|
||||
assert.Equal(t, cfg.UpgradeBin("chain2"), currentBin)
|
||||
assertCurrentLink(t, cfg, filepath.Join("upgrades", "chain2"))
|
||||
s.Require().NoError(err)
|
||||
s.Require().Equal(cfg.UpgradeBin("chain2"), currentBin)
|
||||
s.assertCurrentLink(cfg, filepath.Join("upgrades", "chain2"))
|
||||
}
|
||||
|
||||
func assertCurrentLink(t *testing.T, cfg Config, target string) {
|
||||
link := filepath.Join(cfg.Root(), currentLink)
|
||||
func (s *upgradeTestSuite) assertCurrentLink(cfg cosmovisor.Config, target string) {
|
||||
link := filepath.Join(cfg.Root(), "current")
|
||||
// ensure this is a symlink
|
||||
info, err := os.Lstat(link)
|
||||
require.NoError(t, err)
|
||||
require.Equal(t, os.ModeSymlink, info.Mode()&os.ModeSymlink)
|
||||
s.Require().NoError(err)
|
||||
s.Require().Equal(os.ModeSymlink, info.Mode()&os.ModeSymlink)
|
||||
|
||||
dest, err := os.Readlink(link)
|
||||
require.NoError(t, err)
|
||||
s.Require().NoError(err)
|
||||
expected := filepath.Join(cfg.Root(), target)
|
||||
require.Equal(t, expected, dest)
|
||||
s.Require().Equal(expected, dest)
|
||||
}
|
||||
|
||||
// TODO: test with download (and test all download functions)
|
||||
func TestDoUpgradeNoDownloadUrl(t *testing.T) {
|
||||
home, err := copyTestData("validate")
|
||||
require.NoError(t, err)
|
||||
defer os.RemoveAll(home)
|
||||
|
||||
cfg := &Config{Home: home, Name: "dummyd", AllowDownloadBinaries: true}
|
||||
func (s *upgradeTestSuite) TestDoUpgradeNoDownloadUrl() {
|
||||
home := copyTestData(s.T(), "validate")
|
||||
cfg := &cosmovisor.Config{Home: home, Name: "dummyd", AllowDownloadBinaries: true}
|
||||
|
||||
currentBin, err := cfg.CurrentBin()
|
||||
require.NoError(t, err)
|
||||
s.Require().NoError(err)
|
||||
|
||||
assert.Equal(t, cfg.GenesisBin(), currentBin)
|
||||
s.Require().Equal(cfg.GenesisBin(), currentBin)
|
||||
|
||||
// do upgrade ignores bad files
|
||||
for _, name := range []string{"missing", "nobin", "noexec"} {
|
||||
info := &UpgradeInfo{Name: name}
|
||||
err = DoUpgrade(cfg, info)
|
||||
require.Error(t, err, name)
|
||||
info := &cosmovisor.UpgradeInfo{Name: name}
|
||||
err = cosmovisor.DoUpgrade(cfg, info)
|
||||
s.Require().Error(err, name)
|
||||
currentBin, err := cfg.CurrentBin()
|
||||
require.NoError(t, err)
|
||||
assert.Equal(t, cfg.GenesisBin(), currentBin, name)
|
||||
s.Require().NoError(err)
|
||||
s.Require().Equal(cfg.GenesisBin(), currentBin, name)
|
||||
}
|
||||
|
||||
// make sure it updates a few times
|
||||
for _, upgrade := range []string{"chain2", "chain3"} {
|
||||
// now set it to a valid upgrade and make sure CurrentBin is now set properly
|
||||
info := &UpgradeInfo{Name: upgrade}
|
||||
err = DoUpgrade(cfg, info)
|
||||
require.NoError(t, err)
|
||||
info := &cosmovisor.UpgradeInfo{Name: upgrade}
|
||||
err = cosmovisor.DoUpgrade(cfg, info)
|
||||
s.Require().NoError(err)
|
||||
// we should see current point to the new upgrade dir
|
||||
upgradeBin := cfg.UpgradeBin(upgrade)
|
||||
currentBin, err := cfg.CurrentBin()
|
||||
require.NoError(t, err)
|
||||
s.Require().NoError(err)
|
||||
|
||||
assert.Equal(t, upgradeBin, currentBin)
|
||||
s.Require().Equal(upgradeBin, currentBin)
|
||||
}
|
||||
}
|
||||
|
||||
func TestOsArch(t *testing.T) {
|
||||
func (s *upgradeTestSuite) TestOsArch() {
|
||||
// all download tests will fail if we are not on linux...
|
||||
assert.Equal(t, "linux/amd64", osArch())
|
||||
s.Require().Equal("linux/amd64", cosmovisor.OSArch())
|
||||
}
|
||||
|
||||
func TestGetDownloadURL(t *testing.T) {
|
||||
func (s *upgradeTestSuite) TestGetDownloadURL() {
|
||||
// all download tests will fail if we are not on linux...
|
||||
ref, err := filepath.Abs(filepath.FromSlash("./testdata/repo/ref_zipped"))
|
||||
require.NoError(t, err)
|
||||
s.Require().NoError(err)
|
||||
badref, err := filepath.Abs(filepath.FromSlash("./testdata/repo/zip_binary/autod.zip"))
|
||||
require.NoError(t, err)
|
||||
s.Require().NoError(err)
|
||||
|
||||
cases := map[string]struct {
|
||||
info string
|
||||
@ -173,20 +172,18 @@ func TestGetDownloadURL(t *testing.T) {
|
||||
},
|
||||
}
|
||||
|
||||
for name, tc := range cases {
|
||||
t.Run(name, func(t *testing.T) {
|
||||
url, err := GetDownloadURL(&UpgradeInfo{Info: tc.info})
|
||||
if tc.isErr {
|
||||
assert.Error(t, err)
|
||||
} else {
|
||||
assert.NoError(t, err)
|
||||
assert.Equal(t, tc.url, url)
|
||||
}
|
||||
})
|
||||
for _, tc := range cases {
|
||||
url, err := cosmovisor.GetDownloadURL(&cosmovisor.UpgradeInfo{Info: tc.info})
|
||||
if tc.isErr {
|
||||
s.Require().Error(err)
|
||||
} else {
|
||||
s.Require().NoError(err)
|
||||
s.Require().Equal(tc.url, url)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
func TestDownloadBinary(t *testing.T) {
|
||||
func (s *upgradeTestSuite) TestDownloadBinary() {
|
||||
cases := map[string]struct {
|
||||
url string
|
||||
canDownload bool
|
||||
@ -228,65 +225,55 @@ func TestDownloadBinary(t *testing.T) {
|
||||
},
|
||||
}
|
||||
|
||||
for name, tc := range cases {
|
||||
t.Run(name, func(t *testing.T) {
|
||||
// make temp dir
|
||||
home, err := copyTestData("download")
|
||||
require.NoError(t, err)
|
||||
defer os.RemoveAll(home)
|
||||
for _, tc := range cases {
|
||||
var err error
|
||||
// make temp dir
|
||||
home := copyTestData(s.T(), "download")
|
||||
|
||||
cfg := &Config{
|
||||
Home: home,
|
||||
Name: "autod",
|
||||
AllowDownloadBinaries: true,
|
||||
}
|
||||
cfg := &cosmovisor.Config{
|
||||
Home: home,
|
||||
Name: "autod",
|
||||
AllowDownloadBinaries: true,
|
||||
}
|
||||
|
||||
// if we have a relative path, make it absolute, but don't change eg. https://... urls
|
||||
url := tc.url
|
||||
if strings.HasPrefix(url, "./") {
|
||||
url, err = filepath.Abs(url)
|
||||
require.NoError(t, err)
|
||||
}
|
||||
// if we have a relative path, make it absolute, but don't change eg. https://... urls
|
||||
url := tc.url
|
||||
if strings.HasPrefix(url, "./") {
|
||||
url, err = filepath.Abs(url)
|
||||
s.Require().NoError(err)
|
||||
}
|
||||
|
||||
upgrade := "amazonas"
|
||||
info := &UpgradeInfo{
|
||||
Name: upgrade,
|
||||
Info: fmt.Sprintf(`{"binaries":{"%s": "%s"}}`, osArch(), url),
|
||||
}
|
||||
upgrade := "amazonas"
|
||||
info := &cosmovisor.UpgradeInfo{
|
||||
Name: upgrade,
|
||||
Info: fmt.Sprintf(`{"binaries":{"%s": "%s"}}`, cosmovisor.OSArch(), url),
|
||||
}
|
||||
|
||||
err = DownloadBinary(cfg, info)
|
||||
if !tc.canDownload {
|
||||
assert.Error(t, err)
|
||||
return
|
||||
}
|
||||
require.NoError(t, err)
|
||||
err = cosmovisor.DownloadBinary(cfg, info)
|
||||
if !tc.canDownload {
|
||||
s.Require().Error(err)
|
||||
return
|
||||
}
|
||||
s.Require().NoError(err)
|
||||
|
||||
err = EnsureBinary(cfg.UpgradeBin(upgrade))
|
||||
if tc.validBinary {
|
||||
require.NoError(t, err)
|
||||
} else {
|
||||
require.Error(t, err)
|
||||
}
|
||||
})
|
||||
err = cosmovisor.EnsureBinary(cfg.UpgradeBin(upgrade))
|
||||
if tc.validBinary {
|
||||
s.Require().NoError(err)
|
||||
} else {
|
||||
s.Require().Error(err)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// copyTestData will make a tempdir and then
|
||||
// "cp -r" a subdirectory under testdata there
|
||||
// returns the directory (which can now be used as Config.Home) and modified safely
|
||||
func copyTestData(subdir string) (string, error) {
|
||||
tmpdir, err := ioutil.TempDir("", "upgrade-manager-test")
|
||||
if err != nil {
|
||||
return "", fmt.Errorf("couldn't create temporary directory: %w", err)
|
||||
}
|
||||
func copyTestData(t *testing.T, subdir string) string {
|
||||
t.Helper()
|
||||
|
||||
src := filepath.Join("testdata", subdir)
|
||||
tmpdir := t.TempDir()
|
||||
|
||||
err = copy2.Copy(src, tmpdir)
|
||||
if err != nil {
|
||||
os.RemoveAll(tmpdir)
|
||||
return "", fmt.Errorf("couldn't copy files: %w", err)
|
||||
}
|
||||
require.NoError(t, copy.Copy(filepath.Join("testdata", subdir), tmpdir))
|
||||
|
||||
return tmpdir, nil
|
||||
return tmpdir
|
||||
}
|
||||
|
||||
@ -11,6 +11,7 @@ import (
|
||||
|
||||
"github.com/cosmos/cosmos-sdk/codec/legacy"
|
||||
cryptoAmino "github.com/cosmos/cosmos-sdk/crypto/codec"
|
||||
cryptotypes "github.com/cosmos/cosmos-sdk/crypto/types"
|
||||
sdkerrors "github.com/cosmos/cosmos-sdk/types/errors"
|
||||
)
|
||||
|
||||
@ -124,7 +125,7 @@ func unarmorBytes(armorStr, blockType string) (bz []byte, header map[string]stri
|
||||
// encrypt/decrypt with armor
|
||||
|
||||
// Encrypt and armor the private key.
|
||||
func EncryptArmorPrivKey(privKey crypto.PrivKey, passphrase string, algo string) string {
|
||||
func EncryptArmorPrivKey(privKey cryptotypes.PrivKey, passphrase string, algo string) string {
|
||||
saltBytes, encBytes := encryptPrivKey(privKey, passphrase)
|
||||
header := map[string]string{
|
||||
"kdf": "bcrypt",
|
||||
@ -143,7 +144,7 @@ func EncryptArmorPrivKey(privKey crypto.PrivKey, passphrase string, algo string)
|
||||
// encrypt the given privKey with the passphrase using a randomly
|
||||
// generated salt and the xsalsa20 cipher. returns the salt and the
|
||||
// encrypted priv key.
|
||||
func encryptPrivKey(privKey crypto.PrivKey, passphrase string) (saltBytes []byte, encBytes []byte) {
|
||||
func encryptPrivKey(privKey cryptotypes.PrivKey, passphrase string) (saltBytes []byte, encBytes []byte) {
|
||||
saltBytes = crypto.CRandBytes(16)
|
||||
key, err := bcrypt.GenerateFromPassword(saltBytes, []byte(passphrase), BcryptSecurityParameter)
|
||||
|
||||
@ -158,7 +159,7 @@ func encryptPrivKey(privKey crypto.PrivKey, passphrase string) (saltBytes []byte
|
||||
}
|
||||
|
||||
// UnarmorDecryptPrivKey returns the privkey byte slice, a string of the algo type, and an error
|
||||
func UnarmorDecryptPrivKey(armorStr string, passphrase string) (privKey crypto.PrivKey, algo string, err error) {
|
||||
func UnarmorDecryptPrivKey(armorStr string, passphrase string) (privKey cryptotypes.PrivKey, algo string, err error) {
|
||||
blockType, header, encBytes, err := armor.DecodeArmor(armorStr)
|
||||
if err != nil {
|
||||
return privKey, "", err
|
||||
@ -190,7 +191,7 @@ func UnarmorDecryptPrivKey(armorStr string, passphrase string) (privKey crypto.P
|
||||
return privKey, header[headerType], err
|
||||
}
|
||||
|
||||
func decryptPrivKey(saltBytes []byte, encBytes []byte, passphrase string) (privKey crypto.PrivKey, err error) {
|
||||
func decryptPrivKey(saltBytes []byte, encBytes []byte, passphrase string) (privKey cryptotypes.PrivKey, err error) {
|
||||
key, err := bcrypt.GenerateFromPassword(saltBytes, []byte(passphrase), BcryptSecurityParameter)
|
||||
if err != nil {
|
||||
return privKey, sdkerrors.Wrap(err, "error generating bcrypt key from passphrase")
|
||||
|
||||
@ -19,6 +19,7 @@ import (
|
||||
"github.com/cosmos/cosmos-sdk/crypto/hd"
|
||||
"github.com/cosmos/cosmos-sdk/crypto/keyring"
|
||||
"github.com/cosmos/cosmos-sdk/crypto/keys/secp256k1"
|
||||
cryptotypes "github.com/cosmos/cosmos-sdk/crypto/types"
|
||||
"github.com/cosmos/cosmos-sdk/types"
|
||||
)
|
||||
|
||||
@ -46,7 +47,7 @@ func TestArmorUnarmorPrivKey(t *testing.T) {
|
||||
require.Contains(t, err.Error(), "unrecognized armor type")
|
||||
|
||||
// armor key manually
|
||||
encryptPrivKeyFn := func(privKey tmcrypto.PrivKey, passphrase string) (saltBytes []byte, encBytes []byte) {
|
||||
encryptPrivKeyFn := func(privKey cryptotypes.PrivKey, passphrase string) (saltBytes []byte, encBytes []byte) {
|
||||
saltBytes = tmcrypto.CRandBytes(16)
|
||||
key, err := bcrypt.GenerateFromPassword(saltBytes, []byte(passphrase), crypto.BcryptSecurityParameter)
|
||||
require.NoError(t, err)
|
||||
|
||||
@ -1,8 +1,6 @@
|
||||
package codec
|
||||
|
||||
import (
|
||||
"github.com/tendermint/tendermint/crypto"
|
||||
tmed25519 "github.com/tendermint/tendermint/crypto/ed25519"
|
||||
"github.com/tendermint/tendermint/crypto/sr25519"
|
||||
|
||||
"github.com/cosmos/cosmos-sdk/codec"
|
||||
@ -22,16 +20,9 @@ func init() {
|
||||
// RegisterCrypto registers all crypto dependency types with the provided Amino
|
||||
// codec.
|
||||
func RegisterCrypto(cdc *codec.LegacyAmino) {
|
||||
// TODO We now register both Tendermint's PubKey and our own PubKey. In the
|
||||
// long-term, we should move away from Tendermint's PubKey, and delete this
|
||||
// first line.
|
||||
cdc.RegisterInterface((*crypto.PubKey)(nil), nil)
|
||||
cdc.RegisterInterface((*cryptotypes.PubKey)(nil), nil)
|
||||
cdc.RegisterConcrete(sr25519.PubKey{},
|
||||
sr25519.PubKeyName, nil)
|
||||
// TODO Same as above, for ED25519
|
||||
cdc.RegisterConcrete(tmed25519.PubKey{},
|
||||
tmed25519.PubKeyName, nil)
|
||||
cdc.RegisterConcrete(&ed25519.PubKey{},
|
||||
ed25519.PubKeyName, nil)
|
||||
cdc.RegisterConcrete(&secp256k1.PubKey{},
|
||||
@ -39,12 +30,9 @@ func RegisterCrypto(cdc *codec.LegacyAmino) {
|
||||
cdc.RegisterConcrete(&kmultisig.LegacyAminoPubKey{},
|
||||
kmultisig.PubKeyAminoRoute, nil)
|
||||
|
||||
cdc.RegisterInterface((*crypto.PrivKey)(nil), nil)
|
||||
cdc.RegisterInterface((*cryptotypes.PrivKey)(nil), nil)
|
||||
cdc.RegisterConcrete(sr25519.PrivKey{},
|
||||
sr25519.PrivKeyName, nil)
|
||||
// TODO Same as above
|
||||
cdc.RegisterConcrete(tmed25519.PrivKey{},
|
||||
tmed25519.PrivKeyName, nil)
|
||||
cdc.RegisterConcrete(&ed25519.PrivKey{},
|
||||
ed25519.PrivKeyName, nil)
|
||||
cdc.RegisterConcrete(&secp256k1.PrivKey{},
|
||||
@ -52,13 +40,13 @@ func RegisterCrypto(cdc *codec.LegacyAmino) {
|
||||
}
|
||||
|
||||
// PrivKeyFromBytes unmarshals private key bytes and returns a PrivKey
|
||||
func PrivKeyFromBytes(privKeyBytes []byte) (privKey crypto.PrivKey, err error) {
|
||||
func PrivKeyFromBytes(privKeyBytes []byte) (privKey cryptotypes.PrivKey, err error) {
|
||||
err = amino.UnmarshalBinaryBare(privKeyBytes, &privKey)
|
||||
return
|
||||
}
|
||||
|
||||
// PubKeyFromBytes unmarshals public key bytes and returns a PubKey
|
||||
func PubKeyFromBytes(pubKeyBytes []byte) (pubKey crypto.PubKey, err error) {
|
||||
func PubKeyFromBytes(pubKeyBytes []byte) (pubKey cryptotypes.PubKey, err error) {
|
||||
err = amino.UnmarshalBinaryBare(pubKeyBytes, &pubKey)
|
||||
return
|
||||
}
|
||||
|
||||
@ -1,8 +1,6 @@
|
||||
package codec
|
||||
|
||||
import (
|
||||
tmcrypto "github.com/tendermint/tendermint/crypto"
|
||||
|
||||
codectypes "github.com/cosmos/cosmos-sdk/codec/types"
|
||||
"github.com/cosmos/cosmos-sdk/crypto/keys/ed25519"
|
||||
"github.com/cosmos/cosmos-sdk/crypto/keys/multisig"
|
||||
@ -12,14 +10,6 @@ import (
|
||||
|
||||
// RegisterInterfaces registers the sdk.Tx interface.
|
||||
func RegisterInterfaces(registry codectypes.InterfaceRegistry) {
|
||||
// TODO We now register both Tendermint's PubKey and our own PubKey. In the
|
||||
// long-term, we should move away from Tendermint's PubKey, and delete
|
||||
// these lines.
|
||||
registry.RegisterInterface("tendermint.crypto.PubKey", (*tmcrypto.PubKey)(nil))
|
||||
registry.RegisterImplementations((*tmcrypto.PubKey)(nil), &ed25519.PubKey{})
|
||||
registry.RegisterImplementations((*tmcrypto.PubKey)(nil), &secp256k1.PubKey{})
|
||||
registry.RegisterImplementations((*tmcrypto.PubKey)(nil), &multisig.LegacyAminoPubKey{})
|
||||
|
||||
registry.RegisterInterface("cosmos.crypto.PubKey", (*cryptotypes.PubKey)(nil))
|
||||
registry.RegisterImplementations((*cryptotypes.PubKey)(nil), &ed25519.PubKey{})
|
||||
registry.RegisterImplementations((*cryptotypes.PubKey)(nil), &secp256k1.PubKey{})
|
||||
|
||||
68
crypto/codec/tm.go
Normal file
68
crypto/codec/tm.go
Normal file
@ -0,0 +1,68 @@
|
||||
package codec
|
||||
|
||||
import (
|
||||
tmcrypto "github.com/tendermint/tendermint/crypto"
|
||||
"github.com/tendermint/tendermint/crypto/encoding"
|
||||
tmprotocrypto "github.com/tendermint/tendermint/proto/tendermint/crypto"
|
||||
|
||||
"github.com/cosmos/cosmos-sdk/crypto/keys/ed25519"
|
||||
"github.com/cosmos/cosmos-sdk/crypto/keys/secp256k1"
|
||||
cryptotypes "github.com/cosmos/cosmos-sdk/crypto/types"
|
||||
sdkerrors "github.com/cosmos/cosmos-sdk/types/errors"
|
||||
)
|
||||
|
||||
// FromTmProtoPublicKey converts a TM's tmprotocrypto.PublicKey into our own PubKey.
|
||||
func FromTmProtoPublicKey(protoPk tmprotocrypto.PublicKey) (cryptotypes.PubKey, error) {
|
||||
switch protoPk := protoPk.Sum.(type) {
|
||||
case *tmprotocrypto.PublicKey_Ed25519:
|
||||
return &ed25519.PubKey{
|
||||
Key: protoPk.Ed25519,
|
||||
}, nil
|
||||
case *tmprotocrypto.PublicKey_Secp256K1:
|
||||
return &secp256k1.PubKey{
|
||||
Key: protoPk.Secp256K1,
|
||||
}, nil
|
||||
default:
|
||||
return nil, sdkerrors.Wrapf(sdkerrors.ErrInvalidType, "cannot convert %v from Tendermint public key", protoPk)
|
||||
}
|
||||
}
|
||||
|
||||
// ToTmProtoPublicKey converts our own PubKey to TM's tmprotocrypto.PublicKey.
|
||||
func ToTmProtoPublicKey(pk cryptotypes.PubKey) (tmprotocrypto.PublicKey, error) {
|
||||
switch pk := pk.(type) {
|
||||
case *ed25519.PubKey:
|
||||
return tmprotocrypto.PublicKey{
|
||||
Sum: &tmprotocrypto.PublicKey_Ed25519{
|
||||
Ed25519: pk.Key,
|
||||
},
|
||||
}, nil
|
||||
case *secp256k1.PubKey:
|
||||
return tmprotocrypto.PublicKey{
|
||||
Sum: &tmprotocrypto.PublicKey_Secp256K1{
|
||||
Secp256K1: pk.Key,
|
||||
},
|
||||
}, nil
|
||||
default:
|
||||
return tmprotocrypto.PublicKey{}, sdkerrors.Wrapf(sdkerrors.ErrInvalidType, "cannot convert %v to Tendermint public key", pk)
|
||||
}
|
||||
}
|
||||
|
||||
// FromTmPubKeyInterface converts TM's tmcrypto.PubKey to our own PubKey.
|
||||
func FromTmPubKeyInterface(tmPk tmcrypto.PubKey) (cryptotypes.PubKey, error) {
|
||||
tmProtoPk, err := encoding.PubKeyToProto(tmPk)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
return FromTmProtoPublicKey(tmProtoPk)
|
||||
}
|
||||
|
||||
// ToTmPubKeyInterface converts our own PubKey to TM's tmcrypto.PubKey.
|
||||
func ToTmPubKeyInterface(pk cryptotypes.PubKey) (tmcrypto.PubKey, error) {
|
||||
tmProtoPk, err := ToTmProtoPublicKey(pk)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
return encoding.PubKeyFromProto(tmProtoPk)
|
||||
}
|
||||
@ -2,9 +2,9 @@ package hd
|
||||
|
||||
import (
|
||||
bip39 "github.com/cosmos/go-bip39"
|
||||
"github.com/tendermint/tendermint/crypto"
|
||||
|
||||
"github.com/cosmos/cosmos-sdk/crypto/keys/secp256k1"
|
||||
"github.com/cosmos/cosmos-sdk/crypto/types"
|
||||
)
|
||||
|
||||
// PubKeyType defines an algorithm to derive key-pairs which can be used for cryptographic signing.
|
||||
@ -28,11 +28,11 @@ var (
|
||||
)
|
||||
|
||||
type DeriveFn func(mnemonic string, bip39Passphrase, hdPath string) ([]byte, error)
|
||||
type GenerateFn func(bz []byte) crypto.PrivKey
|
||||
type GenerateFn func(bz []byte) types.PrivKey
|
||||
|
||||
type WalletGenerator interface {
|
||||
Derive(mnemonic string, bip39Passphrase, hdPath string) ([]byte, error)
|
||||
Generate(bz []byte) crypto.PrivKey
|
||||
Generate(bz []byte) types.PrivKey
|
||||
}
|
||||
|
||||
type secp256k1Algo struct {
|
||||
@ -62,7 +62,7 @@ func (s secp256k1Algo) Derive() DeriveFn {
|
||||
|
||||
// Generate generates a secp256k1 private key from the given bytes.
|
||||
func (s secp256k1Algo) Generate() GenerateFn {
|
||||
return func(bz []byte) crypto.PrivKey {
|
||||
return func(bz []byte) types.PrivKey {
|
||||
var bzArr = make([]byte, secp256k1.PrivKeySize)
|
||||
copy(bzArr, bz)
|
||||
|
||||
|
||||
@ -3,11 +3,10 @@ package keyring
|
||||
import (
|
||||
"fmt"
|
||||
|
||||
"github.com/tendermint/tendermint/crypto"
|
||||
|
||||
codectypes "github.com/cosmos/cosmos-sdk/codec/types"
|
||||
"github.com/cosmos/cosmos-sdk/crypto/hd"
|
||||
"github.com/cosmos/cosmos-sdk/crypto/keys/multisig"
|
||||
cryptotypes "github.com/cosmos/cosmos-sdk/crypto/types"
|
||||
"github.com/cosmos/cosmos-sdk/types"
|
||||
)
|
||||
|
||||
@ -18,7 +17,7 @@ type Info interface {
|
||||
// Name of the key
|
||||
GetName() string
|
||||
// Public key
|
||||
GetPubKey() crypto.PubKey
|
||||
GetPubKey() cryptotypes.PubKey
|
||||
// Address
|
||||
GetAddress() types.AccAddress
|
||||
// Bip44 Path
|
||||
@ -37,13 +36,13 @@ var (
|
||||
// localInfo is the public information about a locally stored key
|
||||
// Note: Algo must be last field in struct for backwards amino compatibility
|
||||
type localInfo struct {
|
||||
Name string `json:"name"`
|
||||
PubKey crypto.PubKey `json:"pubkey"`
|
||||
PrivKeyArmor string `json:"privkey.armor"`
|
||||
Algo hd.PubKeyType `json:"algo"`
|
||||
Name string `json:"name"`
|
||||
PubKey cryptotypes.PubKey `json:"pubkey"`
|
||||
PrivKeyArmor string `json:"privkey.armor"`
|
||||
Algo hd.PubKeyType `json:"algo"`
|
||||
}
|
||||
|
||||
func newLocalInfo(name string, pub crypto.PubKey, privArmor string, algo hd.PubKeyType) Info {
|
||||
func newLocalInfo(name string, pub cryptotypes.PubKey, privArmor string, algo hd.PubKeyType) Info {
|
||||
return &localInfo{
|
||||
Name: name,
|
||||
PubKey: pub,
|
||||
@ -63,7 +62,7 @@ func (i localInfo) GetName() string {
|
||||
}
|
||||
|
||||
// GetType implements Info interface
|
||||
func (i localInfo) GetPubKey() crypto.PubKey {
|
||||
func (i localInfo) GetPubKey() cryptotypes.PubKey {
|
||||
return i.PubKey
|
||||
}
|
||||
|
||||
@ -85,13 +84,13 @@ func (i localInfo) GetPath() (*hd.BIP44Params, error) {
|
||||
// ledgerInfo is the public information about a Ledger key
|
||||
// Note: Algo must be last field in struct for backwards amino compatibility
|
||||
type ledgerInfo struct {
|
||||
Name string `json:"name"`
|
||||
PubKey crypto.PubKey `json:"pubkey"`
|
||||
Path hd.BIP44Params `json:"path"`
|
||||
Algo hd.PubKeyType `json:"algo"`
|
||||
Name string `json:"name"`
|
||||
PubKey cryptotypes.PubKey `json:"pubkey"`
|
||||
Path hd.BIP44Params `json:"path"`
|
||||
Algo hd.PubKeyType `json:"algo"`
|
||||
}
|
||||
|
||||
func newLedgerInfo(name string, pub crypto.PubKey, path hd.BIP44Params, algo hd.PubKeyType) Info {
|
||||
func newLedgerInfo(name string, pub cryptotypes.PubKey, path hd.BIP44Params, algo hd.PubKeyType) Info {
|
||||
return &ledgerInfo{
|
||||
Name: name,
|
||||
PubKey: pub,
|
||||
@ -111,7 +110,7 @@ func (i ledgerInfo) GetName() string {
|
||||
}
|
||||
|
||||
// GetPubKey implements Info interface
|
||||
func (i ledgerInfo) GetPubKey() crypto.PubKey {
|
||||
func (i ledgerInfo) GetPubKey() cryptotypes.PubKey {
|
||||
return i.PubKey
|
||||
}
|
||||
|
||||
@ -134,12 +133,12 @@ func (i ledgerInfo) GetPath() (*hd.BIP44Params, error) {
|
||||
// offlineInfo is the public information about an offline key
|
||||
// Note: Algo must be last field in struct for backwards amino compatibility
|
||||
type offlineInfo struct {
|
||||
Name string `json:"name"`
|
||||
PubKey crypto.PubKey `json:"pubkey"`
|
||||
Algo hd.PubKeyType `json:"algo"`
|
||||
Name string `json:"name"`
|
||||
PubKey cryptotypes.PubKey `json:"pubkey"`
|
||||
Algo hd.PubKeyType `json:"algo"`
|
||||
}
|
||||
|
||||
func newOfflineInfo(name string, pub crypto.PubKey, algo hd.PubKeyType) Info {
|
||||
func newOfflineInfo(name string, pub cryptotypes.PubKey, algo hd.PubKeyType) Info {
|
||||
return &offlineInfo{
|
||||
Name: name,
|
||||
PubKey: pub,
|
||||
@ -158,7 +157,7 @@ func (i offlineInfo) GetName() string {
|
||||
}
|
||||
|
||||
// GetPubKey implements Info interface
|
||||
func (i offlineInfo) GetPubKey() crypto.PubKey {
|
||||
func (i offlineInfo) GetPubKey() cryptotypes.PubKey {
|
||||
return i.PubKey
|
||||
}
|
||||
|
||||
@ -178,20 +177,20 @@ func (i offlineInfo) GetPath() (*hd.BIP44Params, error) {
|
||||
}
|
||||
|
||||
type multisigPubKeyInfo struct {
|
||||
PubKey crypto.PubKey `json:"pubkey"`
|
||||
Weight uint `json:"weight"`
|
||||
PubKey cryptotypes.PubKey `json:"pubkey"`
|
||||
Weight uint `json:"weight"`
|
||||
}
|
||||
|
||||
// multiInfo is the public information about a multisig key
|
||||
type multiInfo struct {
|
||||
Name string `json:"name"`
|
||||
PubKey crypto.PubKey `json:"pubkey"`
|
||||
PubKey cryptotypes.PubKey `json:"pubkey"`
|
||||
Threshold uint `json:"threshold"`
|
||||
PubKeys []multisigPubKeyInfo `json:"pubkeys"`
|
||||
}
|
||||
|
||||
// NewMultiInfo creates a new multiInfo instance
|
||||
func NewMultiInfo(name string, pub crypto.PubKey) Info {
|
||||
func NewMultiInfo(name string, pub cryptotypes.PubKey) Info {
|
||||
multiPK := pub.(*multisig.LegacyAminoPubKey)
|
||||
|
||||
pubKeys := make([]multisigPubKeyInfo, len(multiPK.PubKeys))
|
||||
@ -219,7 +218,7 @@ func (i multiInfo) GetName() string {
|
||||
}
|
||||
|
||||
// GetPubKey implements Info interface
|
||||
func (i multiInfo) GetPubKey() crypto.PubKey {
|
||||
func (i multiInfo) GetPubKey() cryptotypes.PubKey {
|
||||
return i.PubKey
|
||||
}
|
||||
|
||||
|
||||
@ -22,6 +22,7 @@ import (
|
||||
cryptoamino "github.com/cosmos/cosmos-sdk/crypto/codec"
|
||||
"github.com/cosmos/cosmos-sdk/crypto/hd"
|
||||
"github.com/cosmos/cosmos-sdk/crypto/ledger"
|
||||
"github.com/cosmos/cosmos-sdk/crypto/types"
|
||||
sdk "github.com/cosmos/cosmos-sdk/types"
|
||||
sdkerrors "github.com/cosmos/cosmos-sdk/types/errors"
|
||||
)
|
||||
@ -76,10 +77,10 @@ type Keyring interface {
|
||||
SaveLedgerKey(uid string, algo SignatureAlgo, hrp string, coinType, account, index uint32) (Info, error)
|
||||
|
||||
// SavePubKey stores a public key and returns the persisted Info structure.
|
||||
SavePubKey(uid string, pubkey tmcrypto.PubKey, algo hd.PubKeyType) (Info, error)
|
||||
SavePubKey(uid string, pubkey types.PubKey, algo hd.PubKeyType) (Info, error)
|
||||
|
||||
// SaveMultisig stores and returns a new multsig (offline) key reference.
|
||||
SaveMultisig(uid string, pubkey tmcrypto.PubKey) (Info, error)
|
||||
SaveMultisig(uid string, pubkey types.PubKey) (Info, error)
|
||||
|
||||
Signer
|
||||
|
||||
@ -90,10 +91,10 @@ type Keyring interface {
|
||||
// Signer is implemented by key stores that want to provide signing capabilities.
|
||||
type Signer interface {
|
||||
// Sign sign byte messages with a user key.
|
||||
Sign(uid string, msg []byte) ([]byte, tmcrypto.PubKey, error)
|
||||
Sign(uid string, msg []byte) ([]byte, types.PubKey, error)
|
||||
|
||||
// SignByAddress sign byte messages with a user key providing the address.
|
||||
SignByAddress(address sdk.Address, msg []byte) ([]byte, tmcrypto.PubKey, error)
|
||||
SignByAddress(address sdk.Address, msg []byte) ([]byte, types.PubKey, error)
|
||||
}
|
||||
|
||||
// Importer is implemented by key stores that support import of public and private keys.
|
||||
@ -224,13 +225,13 @@ func (ks keystore) ExportPrivKeyArmor(uid, encryptPassphrase string) (armor stri
|
||||
}
|
||||
|
||||
// ExportPrivateKeyObject exports an armored private key object.
|
||||
func (ks keystore) ExportPrivateKeyObject(uid string) (tmcrypto.PrivKey, error) {
|
||||
func (ks keystore) ExportPrivateKeyObject(uid string) (types.PrivKey, error) {
|
||||
info, err := ks.Key(uid)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
var priv tmcrypto.PrivKey
|
||||
var priv types.PrivKey
|
||||
|
||||
switch linfo := info.(type) {
|
||||
case localInfo:
|
||||
@ -301,13 +302,13 @@ func (ks keystore) ImportPubKey(uid string, armor string) error {
|
||||
return nil
|
||||
}
|
||||
|
||||
func (ks keystore) Sign(uid string, msg []byte) ([]byte, tmcrypto.PubKey, error) {
|
||||
func (ks keystore) Sign(uid string, msg []byte) ([]byte, types.PubKey, error) {
|
||||
info, err := ks.Key(uid)
|
||||
if err != nil {
|
||||
return nil, nil, err
|
||||
}
|
||||
|
||||
var priv tmcrypto.PrivKey
|
||||
var priv types.PrivKey
|
||||
|
||||
switch i := info.(type) {
|
||||
case localInfo:
|
||||
@ -335,7 +336,7 @@ func (ks keystore) Sign(uid string, msg []byte) ([]byte, tmcrypto.PubKey, error)
|
||||
return sig, priv.PubKey(), nil
|
||||
}
|
||||
|
||||
func (ks keystore) SignByAddress(address sdk.Address, msg []byte) ([]byte, tmcrypto.PubKey, error) {
|
||||
func (ks keystore) SignByAddress(address sdk.Address, msg []byte) ([]byte, types.PubKey, error) {
|
||||
key, err := ks.KeyByAddress(address)
|
||||
if err != nil {
|
||||
return nil, nil, err
|
||||
@ -359,7 +360,7 @@ func (ks keystore) SaveLedgerKey(uid string, algo SignatureAlgo, hrp string, coi
|
||||
return ks.writeLedgerKey(uid, priv.PubKey(), *hdPath, algo.Name())
|
||||
}
|
||||
|
||||
func (ks keystore) writeLedgerKey(name string, pub tmcrypto.PubKey, path hd.BIP44Params, algo hd.PubKeyType) (Info, error) {
|
||||
func (ks keystore) writeLedgerKey(name string, pub types.PubKey, path hd.BIP44Params, algo hd.PubKeyType) (Info, error) {
|
||||
info := newLedgerInfo(name, pub, path, algo)
|
||||
if err := ks.writeInfo(info); err != nil {
|
||||
return nil, err
|
||||
@ -368,11 +369,11 @@ func (ks keystore) writeLedgerKey(name string, pub tmcrypto.PubKey, path hd.BIP4
|
||||
return info, nil
|
||||
}
|
||||
|
||||
func (ks keystore) SaveMultisig(uid string, pubkey tmcrypto.PubKey) (Info, error) {
|
||||
func (ks keystore) SaveMultisig(uid string, pubkey types.PubKey) (Info, error) {
|
||||
return ks.writeMultisigKey(uid, pubkey)
|
||||
}
|
||||
|
||||
func (ks keystore) SavePubKey(uid string, pubkey tmcrypto.PubKey, algo hd.PubKeyType) (Info, error) {
|
||||
func (ks keystore) SavePubKey(uid string, pubkey types.PubKey, algo hd.PubKeyType) (Info, error) {
|
||||
return ks.writeOfflineKey(uid, pubkey, algo)
|
||||
}
|
||||
|
||||
@ -533,7 +534,7 @@ func (ks keystore) SupportedAlgorithms() (SigningAlgoList, SigningAlgoList) {
|
||||
// SignWithLedger signs a binary message with the ledger device referenced by an Info object
|
||||
// and returns the signed bytes and the public key. It returns an error if the device could
|
||||
// not be queried or it returned an error.
|
||||
func SignWithLedger(info Info, msg []byte) (sig []byte, pub tmcrypto.PubKey, err error) {
|
||||
func SignWithLedger(info Info, msg []byte) (sig []byte, pub types.PubKey, err error) {
|
||||
switch info.(type) {
|
||||
case *ledgerInfo, ledgerInfo:
|
||||
default:
|
||||
@ -691,7 +692,7 @@ func newRealPrompt(dir string, buf io.Reader) func(string) (string, error) {
|
||||
}
|
||||
}
|
||||
|
||||
func (ks keystore) writeLocalKey(name string, priv tmcrypto.PrivKey, algo hd.PubKeyType) (Info, error) {
|
||||
func (ks keystore) writeLocalKey(name string, priv types.PrivKey, algo hd.PubKeyType) (Info, error) {
|
||||
// encrypt private key using keyring
|
||||
pub := priv.PubKey()
|
||||
|
||||
@ -753,7 +754,7 @@ func (ks keystore) existsInDb(info Info) (bool, error) {
|
||||
return false, nil
|
||||
}
|
||||
|
||||
func (ks keystore) writeOfflineKey(name string, pub tmcrypto.PubKey, algo hd.PubKeyType) (Info, error) {
|
||||
func (ks keystore) writeOfflineKey(name string, pub types.PubKey, algo hd.PubKeyType) (Info, error) {
|
||||
info := newOfflineInfo(name, pub, algo)
|
||||
err := ks.writeInfo(info)
|
||||
if err != nil {
|
||||
@ -763,7 +764,7 @@ func (ks keystore) writeOfflineKey(name string, pub tmcrypto.PubKey, algo hd.Pub
|
||||
return info, nil
|
||||
}
|
||||
|
||||
func (ks keystore) writeMultisigKey(name string, pub tmcrypto.PubKey) (Info, error) {
|
||||
func (ks keystore) writeMultisigKey(name string, pub types.PubKey) (Info, error) {
|
||||
info := NewMultiInfo(name, pub)
|
||||
err := ks.writeInfo(info)
|
||||
if err != nil {
|
||||
|
||||
@ -8,13 +8,13 @@ import (
|
||||
"github.com/99designs/keyring"
|
||||
bip39 "github.com/cosmos/go-bip39"
|
||||
"github.com/stretchr/testify/require"
|
||||
tmcrypto "github.com/tendermint/tendermint/crypto"
|
||||
|
||||
"github.com/cosmos/cosmos-sdk/crypto"
|
||||
"github.com/cosmos/cosmos-sdk/crypto/hd"
|
||||
"github.com/cosmos/cosmos-sdk/crypto/keys/ed25519"
|
||||
"github.com/cosmos/cosmos-sdk/crypto/keys/multisig"
|
||||
"github.com/cosmos/cosmos-sdk/crypto/keys/secp256k1"
|
||||
"github.com/cosmos/cosmos-sdk/crypto/types"
|
||||
sdk "github.com/cosmos/cosmos-sdk/types"
|
||||
)
|
||||
|
||||
@ -166,7 +166,7 @@ func TestSignVerifyKeyRing(t *testing.T) {
|
||||
|
||||
// let's try to validate and make sure it only works when everything is proper
|
||||
cases := []struct {
|
||||
key tmcrypto.PubKey
|
||||
key types.PubKey
|
||||
data []byte
|
||||
sig []byte
|
||||
valid bool
|
||||
@ -380,7 +380,7 @@ func TestInMemoryCreateMultisig(t *testing.T) {
|
||||
kb, err := New("keybasename", "memory", "", nil)
|
||||
require.NoError(t, err)
|
||||
multi := multisig.NewLegacyAminoPubKey(
|
||||
1, []tmcrypto.PubKey{
|
||||
1, []types.PubKey{
|
||||
secp256k1.GenPrivKey().PubKey(),
|
||||
},
|
||||
)
|
||||
@ -521,7 +521,7 @@ func TestInMemorySignVerify(t *testing.T) {
|
||||
|
||||
// let's try to validate and make sure it only works when everything is proper
|
||||
cases := []struct {
|
||||
key tmcrypto.PubKey
|
||||
key types.PubKey
|
||||
data []byte
|
||||
sig []byte
|
||||
valid bool
|
||||
@ -947,7 +947,7 @@ func TestAltKeyring_SaveMultisig(t *testing.T) {
|
||||
key := "multi"
|
||||
pub := multisig.NewLegacyAminoPubKey(
|
||||
2,
|
||||
[]tmcrypto.PubKey{
|
||||
[]types.PubKey{
|
||||
&secp256k1.PubKey{Key: mnemonic1.GetPubKey().Bytes()},
|
||||
&secp256k1.PubKey{Key: mnemonic2.GetPubKey().Bytes()},
|
||||
},
|
||||
|
||||
@ -6,11 +6,11 @@ import (
|
||||
"strings"
|
||||
|
||||
"github.com/pkg/errors"
|
||||
tmcrypto "github.com/tendermint/tendermint/crypto"
|
||||
tmos "github.com/tendermint/tendermint/libs/os"
|
||||
dbm "github.com/tendermint/tm-db"
|
||||
|
||||
"github.com/cosmos/cosmos-sdk/crypto"
|
||||
"github.com/cosmos/cosmos-sdk/crypto/types"
|
||||
sdk "github.com/cosmos/cosmos-sdk/types"
|
||||
sdkerrors "github.com/cosmos/cosmos-sdk/types/errors"
|
||||
)
|
||||
@ -101,13 +101,13 @@ func (kb dbKeybase) Get(name string) (Info, error) {
|
||||
// ExportPrivateKeyObject returns a PrivKey object given the key name and
|
||||
// passphrase. An error is returned if the key does not exist or if the Info for
|
||||
// the key is invalid.
|
||||
func (kb dbKeybase) ExportPrivateKeyObject(name string, passphrase string) (tmcrypto.PrivKey, error) {
|
||||
func (kb dbKeybase) ExportPrivateKeyObject(name string, passphrase string) (types.PrivKey, error) {
|
||||
info, err := kb.Get(name)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
var priv tmcrypto.PrivKey
|
||||
var priv types.PrivKey
|
||||
|
||||
switch i := info.(type) {
|
||||
case localInfo:
|
||||
|
||||
@ -4,10 +4,10 @@ import (
|
||||
"testing"
|
||||
|
||||
"github.com/stretchr/testify/require"
|
||||
"github.com/tendermint/tendermint/crypto"
|
||||
|
||||
kmultisig "github.com/cosmos/cosmos-sdk/crypto/keys/multisig"
|
||||
"github.com/cosmos/cosmos-sdk/crypto/keys/secp256k1"
|
||||
"github.com/cosmos/cosmos-sdk/crypto/types"
|
||||
sdk "github.com/cosmos/cosmos-sdk/types"
|
||||
)
|
||||
|
||||
@ -16,7 +16,7 @@ func TestBech32KeysOutput(t *testing.T) {
|
||||
bechTmpKey := sdk.MustBech32ifyPubKey(sdk.Bech32PubKeyTypeAccPub, tmpKey)
|
||||
tmpAddr := sdk.AccAddress(tmpKey.Address().Bytes())
|
||||
|
||||
multisigPks := kmultisig.NewLegacyAminoPubKey(1, []crypto.PubKey{tmpKey})
|
||||
multisigPks := kmultisig.NewLegacyAminoPubKey(1, []types.PubKey{tmpKey})
|
||||
multiInfo := NewMultiInfo("multisig", multisigPks)
|
||||
accAddr := sdk.AccAddress(multiInfo.GetPubKey().Address().Bytes())
|
||||
bechPubKey := sdk.MustBech32ifyPubKey(sdk.Bech32PubKeyTypeAccPub, multiInfo.GetPubKey())
|
||||
|
||||
@ -1,9 +1,8 @@
|
||||
package keyring
|
||||
|
||||
import (
|
||||
"github.com/tendermint/tendermint/crypto"
|
||||
|
||||
"github.com/cosmos/cosmos-sdk/crypto/hd"
|
||||
cryptotypes "github.com/cosmos/cosmos-sdk/crypto/types"
|
||||
)
|
||||
|
||||
// Language is a language to create the BIP 39 mnemonic in.
|
||||
@ -68,5 +67,5 @@ type (
|
||||
// DeriveKeyFunc defines the function to derive a new key from a seed and hd path
|
||||
DeriveKeyFunc func(mnemonic string, bip39Passphrase, hdPath string, algo hd.PubKeyType) ([]byte, error)
|
||||
// PrivKeyGenFunc defines the function to convert derived key bytes to a tendermint private key
|
||||
PrivKeyGenFunc func(bz []byte, algo hd.PubKeyType) (crypto.PrivKey, error)
|
||||
PrivKeyGenFunc func(bz []byte, algo hd.PubKeyType) (cryptotypes.PrivKey, error)
|
||||
)
|
||||
|
||||
@ -7,7 +7,6 @@ import (
|
||||
"io"
|
||||
|
||||
"github.com/tendermint/tendermint/crypto"
|
||||
tmed25519 "github.com/tendermint/tendermint/crypto/ed25519"
|
||||
"github.com/tendermint/tendermint/crypto/tmhash"
|
||||
|
||||
"github.com/cosmos/cosmos-sdk/codec"
|
||||
@ -18,8 +17,8 @@ import (
|
||||
//-------------------------------------
|
||||
|
||||
const (
|
||||
PrivKeyName = "cosmos/PrivKeyEd25519"
|
||||
PubKeyName = "cosmos/PubKeyEd25519"
|
||||
PrivKeyName = "tendermint/PrivKeyEd25519"
|
||||
PubKeyName = "tendermint/PubKeyEd25519"
|
||||
// PubKeySize is is the size, in bytes, of public keys as used in this package.
|
||||
PubKeySize = 32
|
||||
// PrivKeySize is the size, in bytes, of private keys as used in this package.
|
||||
@ -56,7 +55,7 @@ func (privKey *PrivKey) Sign(msg []byte) ([]byte, error) {
|
||||
// PubKey gets the corresponding public key from the private key.
|
||||
//
|
||||
// Panics if the private key is not initialized.
|
||||
func (privKey *PrivKey) PubKey() crypto.PubKey {
|
||||
func (privKey *PrivKey) PubKey() cryptotypes.PubKey {
|
||||
// If the latter 32 bytes of the privkey are all zero, privkey is not
|
||||
// initialized.
|
||||
initialized := false
|
||||
@ -78,7 +77,7 @@ func (privKey *PrivKey) PubKey() crypto.PubKey {
|
||||
|
||||
// Equals - you probably don't need to use this.
|
||||
// Runs in constant time based on length of the keys.
|
||||
func (privKey *PrivKey) Equals(other crypto.PrivKey) bool {
|
||||
func (privKey *PrivKey) Equals(other cryptotypes.LedgerPrivKey) bool {
|
||||
if privKey.Type() != other.Type() {
|
||||
return false
|
||||
}
|
||||
@ -150,7 +149,6 @@ func GenPrivKeyFromSecret(secret []byte) *PrivKey {
|
||||
|
||||
var _ cryptotypes.PubKey = &PubKey{}
|
||||
var _ codec.AminoMarshaler = &PubKey{}
|
||||
var _ cryptotypes.IntoTmPubKey = &PubKey{}
|
||||
|
||||
// Address is the SHA256-20 of the raw pubkey bytes.
|
||||
func (pubKey *PubKey) Address() crypto.Address {
|
||||
@ -182,7 +180,7 @@ func (pubKey *PubKey) Type() string {
|
||||
return keyType
|
||||
}
|
||||
|
||||
func (pubKey *PubKey) Equals(other crypto.PubKey) bool {
|
||||
func (pubKey *PubKey) Equals(other cryptotypes.PubKey) bool {
|
||||
if pubKey.Type() != other.Type() {
|
||||
return false
|
||||
}
|
||||
@ -216,19 +214,3 @@ func (pubKey PubKey) MarshalAminoJSON() ([]byte, error) {
|
||||
func (pubKey *PubKey) UnmarshalAminoJSON(bz []byte) error {
|
||||
return pubKey.UnmarshalAmino(bz)
|
||||
}
|
||||
|
||||
// AsTmPubKey converts our own PubKey into a Tendermint ED25519 pubkey.
|
||||
func (pubKey *PubKey) AsTmPubKey() crypto.PubKey {
|
||||
return tmed25519.PubKey(pubKey.Key)
|
||||
}
|
||||
|
||||
// FromTmEd25519 converts a Tendermint ED25519 pubkey into our own ED25519
|
||||
// PubKey.
|
||||
func FromTmEd25519(pubKey crypto.PubKey) (*PubKey, error) {
|
||||
tmPk, ok := pubKey.(tmed25519.PubKey)
|
||||
if !ok {
|
||||
return nil, fmt.Errorf("expected %T, got %T", tmed25519.PubKey{}, pubKey)
|
||||
}
|
||||
|
||||
return &PubKey{Key: []byte(tmPk)}, nil
|
||||
}
|
||||
|
||||
@ -9,10 +9,10 @@ import (
|
||||
"github.com/stretchr/testify/require"
|
||||
"github.com/tendermint/tendermint/crypto"
|
||||
tmed25519 "github.com/tendermint/tendermint/crypto/ed25519"
|
||||
"github.com/tendermint/tendermint/crypto/sr25519"
|
||||
|
||||
"github.com/cosmos/cosmos-sdk/codec"
|
||||
ed25519 "github.com/cosmos/cosmos-sdk/crypto/keys/ed25519"
|
||||
"github.com/cosmos/cosmos-sdk/crypto/keys/secp256k1"
|
||||
cryptotypes "github.com/cosmos/cosmos-sdk/crypto/types"
|
||||
)
|
||||
|
||||
@ -51,7 +51,7 @@ func TestPubKeyEquals(t *testing.T) {
|
||||
testCases := []struct {
|
||||
msg string
|
||||
pubKey cryptotypes.PubKey
|
||||
other crypto.PubKey
|
||||
other cryptotypes.PubKey
|
||||
expectEq bool
|
||||
}{
|
||||
{
|
||||
@ -71,7 +71,7 @@ func TestPubKeyEquals(t *testing.T) {
|
||||
{
|
||||
"different types",
|
||||
ed25519PubKey,
|
||||
sr25519.GenPrivKey().PubKey(),
|
||||
secp256k1.GenPrivKey().PubKey(),
|
||||
false,
|
||||
},
|
||||
}
|
||||
@ -90,7 +90,7 @@ func TestPrivKeyEquals(t *testing.T) {
|
||||
testCases := []struct {
|
||||
msg string
|
||||
privKey cryptotypes.PrivKey
|
||||
other crypto.PrivKey
|
||||
other cryptotypes.PrivKey
|
||||
expectEq bool
|
||||
}{
|
||||
{
|
||||
@ -110,7 +110,7 @@ func TestPrivKeyEquals(t *testing.T) {
|
||||
{
|
||||
"different types",
|
||||
ed25519PrivKey,
|
||||
sr25519.GenPrivKey(),
|
||||
secp256k1.GenPrivKey(),
|
||||
false,
|
||||
},
|
||||
}
|
||||
|
||||
@ -4,7 +4,7 @@ import (
|
||||
"io"
|
||||
"testing"
|
||||
|
||||
"github.com/tendermint/tendermint/crypto"
|
||||
"github.com/cosmos/cosmos-sdk/crypto/types"
|
||||
)
|
||||
|
||||
// The code in this file is adapted from agl/ed25519.
|
||||
@ -24,7 +24,7 @@ func (zeroReader) Read(buf []byte) (int, error) {
|
||||
|
||||
// BenchmarkKeyGeneration benchmarks the given key generation algorithm using
|
||||
// a dummy reader.
|
||||
func BenchmarkKeyGeneration(b *testing.B, generateKey func(reader io.Reader) crypto.PrivKey) {
|
||||
func BenchmarkKeyGeneration(b *testing.B, generateKey func(reader io.Reader) types.PrivKey) {
|
||||
var zero zeroReader
|
||||
for i := 0; i < b.N; i++ {
|
||||
generateKey(zero)
|
||||
@ -33,7 +33,7 @@ func BenchmarkKeyGeneration(b *testing.B, generateKey func(reader io.Reader) cry
|
||||
|
||||
// BenchmarkSigning benchmarks the given signing algorithm using
|
||||
// the provided privkey.
|
||||
func BenchmarkSigning(b *testing.B, priv crypto.PrivKey) {
|
||||
func BenchmarkSigning(b *testing.B, priv types.PrivKey) {
|
||||
message := []byte("Hello, world!")
|
||||
b.ResetTimer()
|
||||
for i := 0; i < b.N; i++ {
|
||||
@ -47,7 +47,7 @@ func BenchmarkSigning(b *testing.B, priv crypto.PrivKey) {
|
||||
|
||||
// BenchmarkVerification benchmarks the given verification algorithm using
|
||||
// the provided privkey on a constant message.
|
||||
func BenchmarkVerification(b *testing.B, priv crypto.PrivKey) {
|
||||
func BenchmarkVerification(b *testing.B, priv types.PrivKey) {
|
||||
pub := priv.PubKey()
|
||||
// use a short message, so this time doesn't get dominated by hashing.
|
||||
message := []byte("Hello, world!")
|
||||
|
||||
@ -1,7 +1,6 @@
|
||||
package multisig
|
||||
|
||||
import (
|
||||
"github.com/tendermint/tendermint/crypto"
|
||||
"github.com/tendermint/tendermint/crypto/sr25519"
|
||||
|
||||
"github.com/cosmos/cosmos-sdk/codec"
|
||||
@ -19,10 +18,6 @@ const (
|
||||
var AminoCdc = codec.NewLegacyAmino()
|
||||
|
||||
func init() {
|
||||
// TODO We now register both Tendermint's PubKey and our own PubKey. In the
|
||||
// long-term, we should move away from Tendermint's PubKey, and delete this
|
||||
// first line.
|
||||
AminoCdc.RegisterInterface((*crypto.PubKey)(nil), nil)
|
||||
AminoCdc.RegisterInterface((*cryptotypes.PubKey)(nil), nil)
|
||||
AminoCdc.RegisterConcrete(ed25519.PubKey{},
|
||||
ed25519.PubKeyName, nil)
|
||||
|
||||
@ -5,10 +5,8 @@ import (
|
||||
|
||||
tmcrypto "github.com/tendermint/tendermint/crypto"
|
||||
|
||||
proto "github.com/gogo/protobuf/proto"
|
||||
|
||||
"github.com/cosmos/cosmos-sdk/codec/types"
|
||||
crypto "github.com/cosmos/cosmos-sdk/crypto/types"
|
||||
cryptotypes "github.com/cosmos/cosmos-sdk/crypto/types"
|
||||
multisigtypes "github.com/cosmos/cosmos-sdk/crypto/types/multisig"
|
||||
"github.com/cosmos/cosmos-sdk/types/tx/signing"
|
||||
)
|
||||
@ -18,7 +16,7 @@ var _ types.UnpackInterfacesMessage = &LegacyAminoPubKey{}
|
||||
|
||||
// NewLegacyAminoPubKey returns a new LegacyAminoPubKey.
|
||||
// Panics if len(pubKeys) < k or 0 >= k.
|
||||
func NewLegacyAminoPubKey(k int, pubKeys []tmcrypto.PubKey) *LegacyAminoPubKey {
|
||||
func NewLegacyAminoPubKey(k int, pubKeys []cryptotypes.PubKey) *LegacyAminoPubKey {
|
||||
if k <= 0 {
|
||||
panic("threshold k of n multisignature: k <= 0")
|
||||
}
|
||||
@ -32,8 +30,8 @@ func NewLegacyAminoPubKey(k int, pubKeys []tmcrypto.PubKey) *LegacyAminoPubKey {
|
||||
return &LegacyAminoPubKey{Threshold: uint32(k), PubKeys: anyPubKeys}
|
||||
}
|
||||
|
||||
// Address implements crypto.PubKey Address method
|
||||
func (m *LegacyAminoPubKey) Address() tmcrypto.Address {
|
||||
// Address implements cryptotypes.PubKey Address method
|
||||
func (m *LegacyAminoPubKey) Address() cryptotypes.Address {
|
||||
return tmcrypto.AddressHash(m.Bytes())
|
||||
}
|
||||
|
||||
@ -91,7 +89,7 @@ func (m *LegacyAminoPubKey) VerifyMultisignature(getSignBytes multisigtypes.GetS
|
||||
return nil
|
||||
}
|
||||
|
||||
// VerifySignature implements crypto.PubKey VerifySignature method,
|
||||
// VerifySignature implements cryptotypes.PubKey VerifySignature method,
|
||||
// it panics because it can't handle MultiSignatureData
|
||||
// cf. https://github.com/cosmos/cosmos-sdk/issues/7109#issuecomment-686329936
|
||||
func (m *LegacyAminoPubKey) VerifySignature(msg []byte, sig []byte) bool {
|
||||
@ -99,11 +97,11 @@ func (m *LegacyAminoPubKey) VerifySignature(msg []byte, sig []byte) bool {
|
||||
}
|
||||
|
||||
// GetPubKeys implements the PubKey.GetPubKeys method
|
||||
func (m *LegacyAminoPubKey) GetPubKeys() []tmcrypto.PubKey {
|
||||
func (m *LegacyAminoPubKey) GetPubKeys() []cryptotypes.PubKey {
|
||||
if m != nil {
|
||||
pubKeys := make([]tmcrypto.PubKey, len(m.PubKeys))
|
||||
pubKeys := make([]cryptotypes.PubKey, len(m.PubKeys))
|
||||
for i := 0; i < len(m.PubKeys); i++ {
|
||||
pubKeys[i] = m.PubKeys[i].GetCachedValue().(tmcrypto.PubKey)
|
||||
pubKeys[i] = m.PubKeys[i].GetCachedValue().(cryptotypes.PubKey)
|
||||
}
|
||||
return pubKeys
|
||||
}
|
||||
@ -113,7 +111,7 @@ func (m *LegacyAminoPubKey) GetPubKeys() []tmcrypto.PubKey {
|
||||
|
||||
// Equals returns true if m and other both have the same number of keys, and
|
||||
// all constituent keys are the same, and in the same order.
|
||||
func (m *LegacyAminoPubKey) Equals(key tmcrypto.PubKey) bool {
|
||||
func (m *LegacyAminoPubKey) Equals(key cryptotypes.PubKey) bool {
|
||||
otherKey, ok := key.(multisigtypes.PubKey)
|
||||
if !ok {
|
||||
return false
|
||||
@ -145,7 +143,7 @@ func (m *LegacyAminoPubKey) Type() string {
|
||||
// UnpackInterfaces implements UnpackInterfacesMessage.UnpackInterfaces
|
||||
func (m *LegacyAminoPubKey) UnpackInterfaces(unpacker types.AnyUnpacker) error {
|
||||
for _, any := range m.PubKeys {
|
||||
var pk crypto.PubKey
|
||||
var pk cryptotypes.PubKey
|
||||
err := unpacker.UnpackAny(any, &pk)
|
||||
if err != nil {
|
||||
return err
|
||||
@ -154,11 +152,11 @@ func (m *LegacyAminoPubKey) UnpackInterfaces(unpacker types.AnyUnpacker) error {
|
||||
return nil
|
||||
}
|
||||
|
||||
func packPubKeys(pubKeys []tmcrypto.PubKey) ([]*types.Any, error) {
|
||||
func packPubKeys(pubKeys []cryptotypes.PubKey) ([]*types.Any, error) {
|
||||
anyPubKeys := make([]*types.Any, len(pubKeys))
|
||||
|
||||
for i := 0; i < len(pubKeys); i++ {
|
||||
any, err := types.NewAnyWithValue(pubKeys[i].(proto.Message))
|
||||
any, err := types.NewAnyWithValue(pubKeys[i])
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
@ -3,19 +3,16 @@ package multisig_test
|
||||
import (
|
||||
"testing"
|
||||
|
||||
tmcrypto "github.com/tendermint/tendermint/crypto"
|
||||
|
||||
"github.com/cosmos/cosmos-sdk/codec/types"
|
||||
crypto "github.com/cosmos/cosmos-sdk/crypto/types"
|
||||
"github.com/cosmos/cosmos-sdk/crypto/types/multisig"
|
||||
"github.com/cosmos/cosmos-sdk/x/auth/legacy/legacytx"
|
||||
|
||||
"github.com/stretchr/testify/require"
|
||||
|
||||
"github.com/cosmos/cosmos-sdk/codec"
|
||||
"github.com/cosmos/cosmos-sdk/codec/types"
|
||||
kmultisig "github.com/cosmos/cosmos-sdk/crypto/keys/multisig"
|
||||
"github.com/cosmos/cosmos-sdk/crypto/keys/secp256k1"
|
||||
cryptotypes "github.com/cosmos/cosmos-sdk/crypto/types"
|
||||
"github.com/cosmos/cosmos-sdk/crypto/types/multisig"
|
||||
"github.com/cosmos/cosmos-sdk/types/tx/signing"
|
||||
"github.com/cosmos/cosmos-sdk/x/auth/legacy/legacytx"
|
||||
)
|
||||
|
||||
func TestAddress(t *testing.T) {
|
||||
@ -30,12 +27,12 @@ func TestEquals(t *testing.T) {
|
||||
pubKey1 := secp256k1.GenPrivKey().PubKey()
|
||||
pubKey2 := secp256k1.GenPrivKey().PubKey()
|
||||
|
||||
multisigKey := kmultisig.NewLegacyAminoPubKey(1, []tmcrypto.PubKey{pubKey1, pubKey2})
|
||||
otherMultisigKey := kmultisig.NewLegacyAminoPubKey(1, []tmcrypto.PubKey{pubKey1, multisigKey})
|
||||
multisigKey := kmultisig.NewLegacyAminoPubKey(1, []cryptotypes.PubKey{pubKey1, pubKey2})
|
||||
otherMultisigKey := kmultisig.NewLegacyAminoPubKey(1, []cryptotypes.PubKey{pubKey1, multisigKey})
|
||||
|
||||
testCases := []struct {
|
||||
msg string
|
||||
other tmcrypto.PubKey
|
||||
other cryptotypes.PubKey
|
||||
expectEq bool
|
||||
}{
|
||||
{
|
||||
@ -255,8 +252,8 @@ func TestPubKeyMultisigThresholdAminoToIface(t *testing.T) {
|
||||
|
||||
ab, err := kmultisig.AminoCdc.MarshalBinaryLengthPrefixed(multisigKey)
|
||||
require.NoError(t, err)
|
||||
// like other crypto.Pubkey implementations (e.g. ed25519.PubKey),
|
||||
// LegacyAminoPubKey should be deserializable into a crypto.LegacyAminoPubKey:
|
||||
// like other cryptotypes.Pubkey implementations (e.g. ed25519.PubKey),
|
||||
// LegacyAminoPubKey should be deserializable into a cryptotypes.LegacyAminoPubKey:
|
||||
var pubKey kmultisig.LegacyAminoPubKey
|
||||
err = kmultisig.AminoCdc.UnmarshalBinaryLengthPrefixed(ab, &pubKey)
|
||||
require.NoError(t, err)
|
||||
@ -264,8 +261,8 @@ func TestPubKeyMultisigThresholdAminoToIface(t *testing.T) {
|
||||
require.Equal(t, multisigKey.Equals(&pubKey), true)
|
||||
}
|
||||
|
||||
func generatePubKeysAndSignatures(n int, msg []byte) (pubKeys []tmcrypto.PubKey, signatures []signing.SignatureData) {
|
||||
pubKeys = make([]tmcrypto.PubKey, n)
|
||||
func generatePubKeysAndSignatures(n int, msg []byte) (pubKeys []cryptotypes.PubKey, signatures []signing.SignatureData) {
|
||||
pubKeys = make([]cryptotypes.PubKey, n)
|
||||
signatures = make([]signing.SignatureData, n)
|
||||
|
||||
for i := 0; i < n; i++ {
|
||||
@ -279,12 +276,12 @@ func generatePubKeysAndSignatures(n int, msg []byte) (pubKeys []tmcrypto.PubKey,
|
||||
}
|
||||
|
||||
func generateNestedMultiSignature(n int, msg []byte) (multisig.PubKey, *signing.MultiSignatureData) {
|
||||
pubKeys := make([]tmcrypto.PubKey, n)
|
||||
pubKeys := make([]cryptotypes.PubKey, n)
|
||||
signatures := make([]signing.SignatureData, n)
|
||||
bitArray := crypto.NewCompactBitArray(n)
|
||||
bitArray := cryptotypes.NewCompactBitArray(n)
|
||||
for i := 0; i < n; i++ {
|
||||
nestedPks, nestedSigs := generatePubKeysAndSignatures(5, msg)
|
||||
nestedBitArray := crypto.NewCompactBitArray(5)
|
||||
nestedBitArray := cryptotypes.NewCompactBitArray(5)
|
||||
for j := 0; j < 5; j++ {
|
||||
nestedBitArray.SetIndex(j, true)
|
||||
}
|
||||
|
||||
@ -4,13 +4,12 @@ import (
|
||||
"io"
|
||||
"testing"
|
||||
|
||||
"github.com/tendermint/tendermint/crypto"
|
||||
|
||||
"github.com/cosmos/cosmos-sdk/crypto/keys/internal/benchmarking"
|
||||
"github.com/cosmos/cosmos-sdk/crypto/types"
|
||||
)
|
||||
|
||||
func BenchmarkKeyGeneration(b *testing.B) {
|
||||
benchmarkKeygenWrapper := func(reader io.Reader) crypto.PrivKey {
|
||||
benchmarkKeygenWrapper := func(reader io.Reader) types.PrivKey {
|
||||
priv := genPrivKey(reader)
|
||||
return &PrivKey{Key: priv}
|
||||
}
|
||||
|
||||
@ -34,7 +34,7 @@ func (privKey *PrivKey) Bytes() []byte {
|
||||
|
||||
// PubKey performs the point-scalar multiplication from the privKey on the
|
||||
// generator point to get the pubkey.
|
||||
func (privKey *PrivKey) PubKey() crypto.PubKey {
|
||||
func (privKey *PrivKey) PubKey() cryptotypes.PubKey {
|
||||
_, pubkeyObject := secp256k1.PrivKeyFromBytes(secp256k1.S256(), privKey.Key)
|
||||
pk := pubkeyObject.SerializeCompressed()
|
||||
return &PubKey{Key: pk}
|
||||
@ -42,7 +42,7 @@ func (privKey *PrivKey) PubKey() crypto.PubKey {
|
||||
|
||||
// Equals - you probably don't need to use this.
|
||||
// Runs in constant time based on length of the
|
||||
func (privKey *PrivKey) Equals(other crypto.PrivKey) bool {
|
||||
func (privKey *PrivKey) Equals(other cryptotypes.LedgerPrivKey) bool {
|
||||
return privKey.Type() == other.Type() && subtle.ConstantTimeCompare(privKey.Bytes(), other.Bytes()) == 1
|
||||
}
|
||||
|
||||
@ -173,7 +173,7 @@ func (pubKey *PubKey) Type() string {
|
||||
return keyType
|
||||
}
|
||||
|
||||
func (pubKey *PubKey) Equals(other crypto.PubKey) bool {
|
||||
func (pubKey *PubKey) Equals(other cryptotypes.PubKey) bool {
|
||||
return pubKey.Type() == other.Type() && bytes.Equal(pubKey.Bytes(), other.Bytes())
|
||||
}
|
||||
|
||||
|
||||
@ -12,9 +12,10 @@ import (
|
||||
"github.com/stretchr/testify/assert"
|
||||
"github.com/stretchr/testify/require"
|
||||
"github.com/tendermint/tendermint/crypto"
|
||||
"github.com/tendermint/tendermint/crypto/sr25519"
|
||||
tmsecp256k1 "github.com/tendermint/tendermint/crypto/secp256k1"
|
||||
|
||||
"github.com/cosmos/cosmos-sdk/codec"
|
||||
"github.com/cosmos/cosmos-sdk/crypto/keys/ed25519"
|
||||
"github.com/cosmos/cosmos-sdk/crypto/keys/secp256k1"
|
||||
cryptotypes "github.com/cosmos/cosmos-sdk/crypto/types"
|
||||
)
|
||||
@ -143,7 +144,7 @@ func TestPubKeyEquals(t *testing.T) {
|
||||
testCases := []struct {
|
||||
msg string
|
||||
pubKey cryptotypes.PubKey
|
||||
other crypto.PubKey
|
||||
other cryptotypes.PubKey
|
||||
expectEq bool
|
||||
}{
|
||||
{
|
||||
@ -163,7 +164,7 @@ func TestPubKeyEquals(t *testing.T) {
|
||||
{
|
||||
"different types",
|
||||
secp256K1PubKey,
|
||||
sr25519.GenPrivKey().PubKey(),
|
||||
ed25519.GenPrivKey().PubKey(),
|
||||
false,
|
||||
},
|
||||
}
|
||||
@ -182,7 +183,7 @@ func TestPrivKeyEquals(t *testing.T) {
|
||||
testCases := []struct {
|
||||
msg string
|
||||
privKey cryptotypes.PrivKey
|
||||
other crypto.PrivKey
|
||||
other cryptotypes.PrivKey
|
||||
expectEq bool
|
||||
}{
|
||||
{
|
||||
@ -202,7 +203,7 @@ func TestPrivKeyEquals(t *testing.T) {
|
||||
{
|
||||
"different types",
|
||||
secp256K1PrivKey,
|
||||
sr25519.GenPrivKey(),
|
||||
ed25519.GenPrivKey(),
|
||||
false,
|
||||
},
|
||||
}
|
||||
@ -267,3 +268,56 @@ func TestMarshalAmino(t *testing.T) {
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
func TestMarshalAmino_BackwardsCompatibility(t *testing.T) {
|
||||
aminoCdc := codec.NewLegacyAmino()
|
||||
// Create Tendermint keys.
|
||||
tmPrivKey := tmsecp256k1.GenPrivKey()
|
||||
tmPubKey := tmPrivKey.PubKey()
|
||||
// Create our own keys, with the same private key as Tendermint's.
|
||||
privKey := &secp256k1.PrivKey{Key: []byte(tmPrivKey)}
|
||||
pubKey := privKey.PubKey().(*secp256k1.PubKey)
|
||||
|
||||
testCases := []struct {
|
||||
desc string
|
||||
tmKey interface{}
|
||||
ourKey interface{}
|
||||
marshalFn func(o interface{}) ([]byte, error)
|
||||
}{
|
||||
{
|
||||
"secp256k1 private key, binary",
|
||||
tmPrivKey,
|
||||
privKey,
|
||||
aminoCdc.MarshalBinaryBare,
|
||||
},
|
||||
{
|
||||
"secp256k1 private key, JSON",
|
||||
tmPrivKey,
|
||||
privKey,
|
||||
aminoCdc.MarshalJSON,
|
||||
},
|
||||
{
|
||||
"secp256k1 public key, binary",
|
||||
tmPubKey,
|
||||
pubKey,
|
||||
aminoCdc.MarshalBinaryBare,
|
||||
},
|
||||
{
|
||||
"secp256k1 public key, JSON",
|
||||
tmPubKey,
|
||||
pubKey,
|
||||
aminoCdc.MarshalJSON,
|
||||
},
|
||||
}
|
||||
|
||||
for _, tc := range testCases {
|
||||
t.Run(tc.desc, func(t *testing.T) {
|
||||
// Make sure Amino encoding override is not breaking backwards compatibility.
|
||||
bz1, err := tc.marshalFn(tc.tmKey)
|
||||
require.NoError(t, err)
|
||||
bz2, err := tc.marshalFn(tc.ourKey)
|
||||
require.NoError(t, err)
|
||||
require.Equal(t, bz1, bz2)
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
@ -6,7 +6,7 @@ import (
|
||||
|
||||
"github.com/stretchr/testify/require"
|
||||
|
||||
tcrypto "github.com/tendermint/tendermint/crypto"
|
||||
cryptotypes "github.com/cosmos/cosmos-sdk/crypto/types"
|
||||
)
|
||||
|
||||
type byter interface {
|
||||
@ -51,12 +51,12 @@ func TestNilEncodings(t *testing.T) {
|
||||
require.EqualValues(t, a, b)
|
||||
|
||||
// Check nil PubKey.
|
||||
var c, d tcrypto.PubKey
|
||||
var c, d cryptotypes.PubKey
|
||||
checkAminoJSON(t, &c, &d, true)
|
||||
require.EqualValues(t, c, d)
|
||||
|
||||
// Check nil PrivKey.
|
||||
var e, f tcrypto.PrivKey
|
||||
var e, f cryptotypes.PrivKey
|
||||
checkAminoJSON(t, &e, &f, true)
|
||||
require.EqualValues(t, e, f)
|
||||
|
||||
|
||||
@ -8,10 +8,10 @@ import (
|
||||
"github.com/pkg/errors"
|
||||
|
||||
tmbtcec "github.com/tendermint/btcd/btcec"
|
||||
tmcrypto "github.com/tendermint/tendermint/crypto"
|
||||
|
||||
"github.com/cosmos/cosmos-sdk/crypto/hd"
|
||||
"github.com/cosmos/cosmos-sdk/crypto/keys/secp256k1"
|
||||
"github.com/cosmos/cosmos-sdk/crypto/types"
|
||||
)
|
||||
|
||||
var (
|
||||
@ -43,7 +43,7 @@ type (
|
||||
// CachedPubKey should be private, but we want to encode it via
|
||||
// go-amino so we can view the address later, even without having the
|
||||
// ledger attached.
|
||||
CachedPubKey tmcrypto.PubKey
|
||||
CachedPubKey types.PubKey
|
||||
Path hd.BIP44Params
|
||||
}
|
||||
)
|
||||
@ -53,7 +53,7 @@ type (
|
||||
// This function is marked as unsafe as it will retrieve a pubkey without user verification.
|
||||
// It can only be used to verify a pubkey but never to create new accounts/keys. In that case,
|
||||
// please refer to NewPrivKeySecp256k1
|
||||
func NewPrivKeySecp256k1Unsafe(path hd.BIP44Params) (tmcrypto.PrivKey, error) {
|
||||
func NewPrivKeySecp256k1Unsafe(path hd.BIP44Params) (types.LedgerPrivKey, error) {
|
||||
device, err := getDevice()
|
||||
if err != nil {
|
||||
return nil, err
|
||||
@ -70,7 +70,7 @@ func NewPrivKeySecp256k1Unsafe(path hd.BIP44Params) (tmcrypto.PrivKey, error) {
|
||||
|
||||
// NewPrivKeySecp256k1 will generate a new key and store the public key for later use.
|
||||
// The request will require user confirmation and will show account and index in the device
|
||||
func NewPrivKeySecp256k1(path hd.BIP44Params, hrp string) (tmcrypto.PrivKey, string, error) {
|
||||
func NewPrivKeySecp256k1(path hd.BIP44Params, hrp string) (types.LedgerPrivKey, string, error) {
|
||||
device, err := getDevice()
|
||||
if err != nil {
|
||||
return nil, "", err
|
||||
@ -86,7 +86,7 @@ func NewPrivKeySecp256k1(path hd.BIP44Params, hrp string) (tmcrypto.PrivKey, str
|
||||
}
|
||||
|
||||
// PubKey returns the cached public key.
|
||||
func (pkl PrivKeyLedgerSecp256k1) PubKey() tmcrypto.PubKey {
|
||||
func (pkl PrivKeyLedgerSecp256k1) PubKey() types.PubKey {
|
||||
return pkl.CachedPubKey
|
||||
}
|
||||
|
||||
@ -102,7 +102,7 @@ func (pkl PrivKeyLedgerSecp256k1) Sign(message []byte) ([]byte, error) {
|
||||
}
|
||||
|
||||
// ShowAddress triggers a ledger device to show the corresponding address.
|
||||
func ShowAddress(path hd.BIP44Params, expectedPubKey tmcrypto.PubKey,
|
||||
func ShowAddress(path hd.BIP44Params, expectedPubKey types.PubKey,
|
||||
accountAddressPrefix string) error {
|
||||
device, err := getDevice()
|
||||
if err != nil {
|
||||
@ -154,7 +154,7 @@ func (pkl PrivKeyLedgerSecp256k1) Bytes() []byte {
|
||||
|
||||
// Equals implements the PrivKey interface. It makes sure two private keys
|
||||
// refer to the same public key.
|
||||
func (pkl PrivKeyLedgerSecp256k1) Equals(other tmcrypto.PrivKey) bool {
|
||||
func (pkl PrivKeyLedgerSecp256k1) Equals(other types.LedgerPrivKey) bool {
|
||||
if otherKey, ok := other.(PrivKeyLedgerSecp256k1); ok {
|
||||
return pkl.CachedPubKey.Equals(otherKey.CachedPubKey)
|
||||
}
|
||||
@ -234,7 +234,7 @@ func sign(device SECP256K1, pkl PrivKeyLedgerSecp256k1, msg []byte) ([]byte, err
|
||||
//
|
||||
// since this involves IO, it may return an error, which is not exposed
|
||||
// in the PubKey interface, so this function allows better error handling
|
||||
func getPubKeyUnsafe(device SECP256K1, path hd.BIP44Params) (tmcrypto.PubKey, error) {
|
||||
func getPubKeyUnsafe(device SECP256K1, path hd.BIP44Params) (types.PubKey, error) {
|
||||
publicKey, err := device.GetPublicKeySECP256K1(path.DerivationPath())
|
||||
if err != nil {
|
||||
return nil, fmt.Errorf("please open Cosmos app on the Ledger device - error: %v", err)
|
||||
@ -258,7 +258,7 @@ func getPubKeyUnsafe(device SECP256K1, path hd.BIP44Params) (tmcrypto.PubKey, er
|
||||
//
|
||||
// Since this involves IO, it may return an error, which is not exposed
|
||||
// in the PubKey interface, so this function allows better error handling.
|
||||
func getPubKeyAddrSafe(device SECP256K1, path hd.BIP44Params, hrp string) (tmcrypto.PubKey, string, error) {
|
||||
func getPubKeyAddrSafe(device SECP256K1, path hd.BIP44Params, hrp string) (types.PubKey, string, error) {
|
||||
publicKey, addr, err := device.GetAddressPubKeySECP256K1(path.DerivationPath(), hrp)
|
||||
if err != nil {
|
||||
return nil, "", fmt.Errorf("address %s rejected", addr)
|
||||
|
||||
@ -6,10 +6,9 @@ import (
|
||||
|
||||
"github.com/stretchr/testify/require"
|
||||
|
||||
tmcrypto "github.com/tendermint/tendermint/crypto"
|
||||
|
||||
cryptoAmino "github.com/cosmos/cosmos-sdk/crypto/codec"
|
||||
"github.com/cosmos/cosmos-sdk/crypto/hd"
|
||||
"github.com/cosmos/cosmos-sdk/crypto/types"
|
||||
"github.com/cosmos/cosmos-sdk/testutil"
|
||||
sdk "github.com/cosmos/cosmos-sdk/types"
|
||||
)
|
||||
@ -58,7 +57,7 @@ func TestPublicKeyUnsafeHDPath(t *testing.T) {
|
||||
|
||||
const numIters = 10
|
||||
|
||||
privKeys := make([]tmcrypto.PrivKey, numIters)
|
||||
privKeys := make([]types.LedgerPrivKey, numIters)
|
||||
|
||||
// Check with device
|
||||
for i := uint32(0); i < 10; i++ {
|
||||
@ -70,8 +69,8 @@ func TestPublicKeyUnsafeHDPath(t *testing.T) {
|
||||
require.NotNil(t, priv)
|
||||
|
||||
// Check other methods
|
||||
require.NoError(t, priv.(PrivKeyLedgerSecp256k1).ValidateKey())
|
||||
tmp := priv.(PrivKeyLedgerSecp256k1)
|
||||
require.NoError(t, tmp.ValidateKey())
|
||||
(&tmp).AssertIsPrivKeyInner()
|
||||
|
||||
pubKeyAddr, err := sdk.Bech32ifyPubKey(sdk.Bech32PubKeyTypeAccPub, priv.PubKey())
|
||||
@ -151,7 +150,7 @@ func TestPublicKeyHDPath(t *testing.T) {
|
||||
|
||||
const numIters = 10
|
||||
|
||||
privKeys := make([]tmcrypto.PrivKey, numIters)
|
||||
privKeys := make([]types.LedgerPrivKey, numIters)
|
||||
|
||||
// Check with device
|
||||
for i := uint32(0); i < 10; i++ {
|
||||
@ -170,8 +169,8 @@ func TestPublicKeyHDPath(t *testing.T) {
|
||||
"Is your device using test mnemonic: %s ?", testutil.TestMnemonic)
|
||||
|
||||
// Check other methods
|
||||
require.NoError(t, priv.(PrivKeyLedgerSecp256k1).ValidateKey())
|
||||
tmp := priv.(PrivKeyLedgerSecp256k1)
|
||||
require.NoError(t, tmp.ValidateKey())
|
||||
(&tmp).AssertIsPrivKeyInner()
|
||||
|
||||
pubKeyAddr, err := sdk.Bech32ifyPubKey(sdk.Bech32PubKeyTypeAccPub, priv.PubKey())
|
||||
|
||||
@ -4,8 +4,6 @@ import (
|
||||
"fmt"
|
||||
"strings"
|
||||
|
||||
"github.com/tendermint/tendermint/crypto"
|
||||
|
||||
"github.com/cosmos/cosmos-sdk/crypto/types"
|
||||
"github.com/cosmos/cosmos-sdk/types/tx/signing"
|
||||
)
|
||||
@ -27,7 +25,7 @@ func NewMultisig(n int) *signing.MultiSignatureData {
|
||||
}
|
||||
|
||||
// GetIndex returns the index of pk in keys. Returns -1 if not found
|
||||
func getIndex(pk crypto.PubKey, keys []crypto.PubKey) int {
|
||||
func getIndex(pk types.PubKey, keys []types.PubKey) int {
|
||||
for i := 0; i < len(keys); i++ {
|
||||
if pk.Equals(keys[i]) {
|
||||
return i
|
||||
@ -60,7 +58,7 @@ func AddSignature(mSig *signing.MultiSignatureData, sig signing.SignatureData, i
|
||||
|
||||
// AddSignatureFromPubKey adds a signature to the multisig, at the index in
|
||||
// keys corresponding to the provided pubkey.
|
||||
func AddSignatureFromPubKey(mSig *signing.MultiSignatureData, sig signing.SignatureData, pubkey crypto.PubKey, keys []crypto.PubKey) error {
|
||||
func AddSignatureFromPubKey(mSig *signing.MultiSignatureData, sig signing.SignatureData, pubkey types.PubKey, keys []types.PubKey) error {
|
||||
if mSig == nil {
|
||||
return fmt.Errorf("value of mSig is nil %v", mSig)
|
||||
}
|
||||
@ -85,6 +83,6 @@ func AddSignatureFromPubKey(mSig *signing.MultiSignatureData, sig signing.Signat
|
||||
return nil
|
||||
}
|
||||
|
||||
func AddSignatureV2(mSig *signing.MultiSignatureData, sig signing.SignatureV2, keys []crypto.PubKey) error {
|
||||
func AddSignatureV2(mSig *signing.MultiSignatureData, sig signing.SignatureV2, keys []types.PubKey) error {
|
||||
return AddSignatureFromPubKey(mSig, sig.Data, sig.PubKey, keys)
|
||||
}
|
||||
|
||||
@ -1,22 +1,21 @@
|
||||
package multisig
|
||||
|
||||
import (
|
||||
"github.com/tendermint/tendermint/crypto"
|
||||
|
||||
"github.com/cosmos/cosmos-sdk/crypto/types"
|
||||
"github.com/cosmos/cosmos-sdk/types/tx/signing"
|
||||
)
|
||||
|
||||
// PubKey defines a type which supports multi-signature verification via MultiSignatureData
|
||||
// which supports multiple SignMode's.
|
||||
type PubKey interface {
|
||||
crypto.PubKey
|
||||
types.PubKey
|
||||
|
||||
// VerifyMultisignature verifies the provide multi-signature represented by MultiSignatureData
|
||||
// using getSignBytes to retrieve the sign bytes to verify against for the provided mode.
|
||||
VerifyMultisignature(getSignBytes GetSignBytesFunc, sig *signing.MultiSignatureData) error
|
||||
|
||||
// GetPubKeys returns the crypto.PubKey's nested within the multi-sig PubKey
|
||||
GetPubKeys() []crypto.PubKey
|
||||
// GetPubKeys returns the types.PubKey's nested within the multi-sig PubKey
|
||||
GetPubKeys() []types.PubKey
|
||||
|
||||
// GetThreshold returns the threshold number of signatures that must be obtained to verify a signature.
|
||||
GetThreshold() uint
|
||||
|
||||
@ -5,26 +5,39 @@ import (
|
||||
tmcrypto "github.com/tendermint/tendermint/crypto"
|
||||
)
|
||||
|
||||
// PubKey interface extends proto.Message
|
||||
// and tendermint crypto.PubKey
|
||||
// PubKey defines a public key and extends proto.Message.
|
||||
type PubKey interface {
|
||||
proto.Message
|
||||
tmcrypto.PubKey
|
||||
|
||||
Address() Address
|
||||
Bytes() []byte
|
||||
VerifySignature(msg []byte, sig []byte) bool
|
||||
Equals(PubKey) bool
|
||||
Type() string
|
||||
}
|
||||
|
||||
// PrivKey interface extends proto.Message
|
||||
// and tendermint crypto.PrivKey
|
||||
// LedgerPrivKey defines a private key that is not a proto message. For now,
|
||||
// LedgerSecp256k1 keys are not converted to proto.Message yet, this is why
|
||||
// they use LedgerPrivKey instead of PrivKey. All other keys must use PrivKey
|
||||
// instead of LedgerPrivKey.
|
||||
// TODO https://github.com/cosmos/cosmos-sdk/issues/7357.
|
||||
type LedgerPrivKey interface {
|
||||
Bytes() []byte
|
||||
Sign(msg []byte) ([]byte, error)
|
||||
PubKey() PubKey
|
||||
Equals(LedgerPrivKey) bool
|
||||
Type() string
|
||||
}
|
||||
|
||||
// PrivKey defines a private key and extends proto.Message. For now, it extends
|
||||
// LedgerPrivKey (see godoc for LedgerPrivKey). Ultimately, we should remove
|
||||
// LedgerPrivKey and add its methods here directly.
|
||||
// TODO https://github.com/cosmos/cosmos-sdk/issues/7357.
|
||||
type PrivKey interface {
|
||||
proto.Message
|
||||
tmcrypto.PrivKey
|
||||
LedgerPrivKey
|
||||
}
|
||||
|
||||
type (
|
||||
Address = tmcrypto.Address
|
||||
)
|
||||
|
||||
// IntoTmPubKey allows our own PubKey types be converted into Tendermint's
|
||||
// pubkey types.
|
||||
type IntoTmPubKey interface {
|
||||
AsTmPubKey() tmcrypto.PubKey
|
||||
}
|
||||
|
||||
@ -72,3 +72,4 @@ Read about the [PROCESS](./PROCESS.md).
|
||||
- [ADR 031: Protobuf Msg Services](./adr-031-msg-service.md)
|
||||
- [ADR 032: Typed Events](./adr-032-typed-events.md)
|
||||
- [ADR 035: Rosetta API Support](./adr-035-rosetta-api-support.md)
|
||||
- [ADR 037: Governance Split Votes](./adr-037-gov-split-vote.md)
|
||||
104
docs/architecture/adr-037-gov-split-vote.md
Normal file
104
docs/architecture/adr-037-gov-split-vote.md
Normal file
@ -0,0 +1,104 @@
|
||||
# ADR 037: Governance split votes
|
||||
|
||||
## Changelog
|
||||
|
||||
- 2020/10/28: Intial draft
|
||||
|
||||
## Status
|
||||
|
||||
Proposed
|
||||
|
||||
## Abstract
|
||||
|
||||
This ADR defines a modification to the the governance module that would allow a staker to split their votes into several voting options. For example, it could use 70% of its voting power to vote Yes and 30% of its voting power to vote No.
|
||||
|
||||
## Context
|
||||
|
||||
Currently, an address can cast a vote with only one options (Yes/No/Abstain/NoWithVeto) and use their full voting power behind that choice.
|
||||
|
||||
However, often times the entity owning that address might not be a single individual. For example, a company might have different stakeholders who want to vote differently, and so it makes sense to allow them to split their voting power. Another example use case is exchanges. Many centralized exchanges often stake a portion of their users' tokens in their custody. Currently, it is not possible for them to do "passthrough voting" and giving their users voting rights over their tokens. However, with this system, exchanges can poll their users for voting preferences, and then vote on-chain proportionally to the results of the poll.
|
||||
|
||||
## Decision
|
||||
|
||||
We modify the vote structs to be
|
||||
|
||||
```
|
||||
type WeightedVoteOption struct {
|
||||
Option string
|
||||
Weight sdk.Dec
|
||||
}
|
||||
|
||||
type Vote struct {
|
||||
ProposalID int64
|
||||
Voter sdk.Address
|
||||
Options []WeightedVoteOption
|
||||
}
|
||||
```
|
||||
|
||||
And for backwards compatibility, we introduce `MsgWeightedVote` while keeping `MsgVote`.
|
||||
```
|
||||
type MsgVote struct {
|
||||
ProposalID int64
|
||||
Voter sdk.Address
|
||||
Option Option
|
||||
}
|
||||
|
||||
type MsgWeightedVote struct {
|
||||
ProposalID int64
|
||||
Voter sdk.Address
|
||||
Options []WeightedVoteOption
|
||||
}
|
||||
```
|
||||
|
||||
The `ValidateBasic` of a `MsgWeightedVote` struct would require that
|
||||
1. The sum of all the Rates is equal to 1.0
|
||||
2. No Option is repeated
|
||||
|
||||
The governance tally function will iterate over all the options in a vote and add to the tally the result of the voter's voting power * the rate for that option.
|
||||
|
||||
```
|
||||
tally() {
|
||||
results := map[types.VoteOption]sdk.Dec
|
||||
|
||||
for _, vote := range votes {
|
||||
for i, weightedOption := range vote.Options {
|
||||
results[weightedOption.Option] += getVotingPower(vote.voter) * weightedOption.Weight
|
||||
}
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
The CLI command for creating a multi-option vote would be as such:
|
||||
```sh
|
||||
simd tx gov vote 1 "yes=0.6,no=0.3,abstain=0.05,no_with_veto=0.05" --from mykey
|
||||
```
|
||||
|
||||
To create a single-option vote a user can do either
|
||||
```
|
||||
simd tx gov vote 1 "yes=1" --from mykey
|
||||
```
|
||||
|
||||
or
|
||||
|
||||
```sh
|
||||
simd tx gov vote 1 yes --from mykey
|
||||
```
|
||||
|
||||
to maintain backwards compatibility.
|
||||
|
||||
|
||||
## Consequences
|
||||
|
||||
### Backwards Compatibility
|
||||
- Previous VoteMsg types will remain the same and so clients will not have to update their procedure unless they want to support the WeightedVoteMsg feature.
|
||||
- When querying a Vote struct from state, its structure will be different, and so clients wanting to display all voters and their respective votes will have to handle the new format and the fact that a single voter can have split votes.
|
||||
- The result of querying the tally function should have the same API for clients.
|
||||
|
||||
### Positive
|
||||
- Can make the voting process more accurate for addresses representing multiple stakeholders, often some of the largest addresses.
|
||||
|
||||
### Negative
|
||||
- Is more complex than simple voting, and so may be harder to explain to users. However, this is mostly mitigated because the feature is opt-in.
|
||||
|
||||
### Neutral
|
||||
- Relatively minor change to governance tally function.
|
||||
@ -1,3 +1,2 @@
|
||||
master master
|
||||
v0.40.x v0.40
|
||||
launchpad/backports v0.39
|
||||
13
go.mod
13
go.mod
@ -11,9 +11,8 @@ require (
|
||||
github.com/btcsuite/btcutil v1.0.2
|
||||
github.com/confio/ics23/go v0.6.3
|
||||
github.com/cosmos/go-bip39 v0.0.0-20180819234021-555e2067c45d
|
||||
github.com/cosmos/iavl v0.15.0-rc4
|
||||
github.com/cosmos/iavl v0.15.0-rc5
|
||||
github.com/cosmos/ledger-cosmos-go v0.11.1
|
||||
github.com/dgraph-io/badger/v2 v2.2007.2 // indirect
|
||||
github.com/dgraph-io/ristretto v0.0.3 // indirect
|
||||
github.com/dgryski/go-farm v0.0.0-20200201041132-a6ae2369ad13 // indirect
|
||||
github.com/enigmampc/btcutil v1.0.3-0.20200723161021-e2fb6adb2a25
|
||||
@ -24,7 +23,7 @@ require (
|
||||
github.com/golang/snappy v0.0.2 // indirect
|
||||
github.com/gorilla/handlers v1.5.1
|
||||
github.com/gorilla/mux v1.8.0
|
||||
github.com/grpc-ecosystem/grpc-gateway v1.15.2
|
||||
github.com/grpc-ecosystem/grpc-gateway v1.16.0
|
||||
github.com/hashicorp/golang-lru v0.5.4
|
||||
github.com/magiconair/properties v1.8.4
|
||||
github.com/mattn/go-isatty v0.0.12
|
||||
@ -46,11 +45,11 @@ require (
|
||||
github.com/tendermint/crypto v0.0.0-20191022145703-50d29ede1e15
|
||||
github.com/tendermint/go-amino v0.16.0
|
||||
github.com/tendermint/tendermint v0.34.0-rc6
|
||||
github.com/tendermint/tm-db v0.6.2
|
||||
golang.org/x/crypto v0.0.0-20201012173705-84dcc777aaee
|
||||
github.com/tendermint/tm-db v0.6.3
|
||||
golang.org/x/crypto v0.0.0-20201016220609-9e8e0b390897
|
||||
golang.org/x/net v0.0.0-20200930145003-4acb6c075d10 // indirect
|
||||
google.golang.org/genproto v0.0.0-20201014134559-03b6142f0dc9
|
||||
google.golang.org/grpc v1.33.0
|
||||
google.golang.org/genproto v0.0.0-20201111145450-ac7456db90a6
|
||||
google.golang.org/grpc v1.33.2
|
||||
google.golang.org/protobuf v1.25.0
|
||||
gopkg.in/yaml.v2 v2.3.0
|
||||
)
|
||||
|
||||
26
go.sum
26
go.sum
@ -121,8 +121,8 @@ github.com/coreos/pkg v0.0.0-20180928190104-399ea9e2e55f/go.mod h1:E3G3o1h8I7cfc
|
||||
github.com/cosmos/go-bip39 v0.0.0-20180819234021-555e2067c45d h1:49RLWk1j44Xu4fjHb6JFYmeUnDORVwHNkDxaQ0ctCVU=
|
||||
github.com/cosmos/go-bip39 v0.0.0-20180819234021-555e2067c45d/go.mod h1:tSxLoYXyBmiFeKpvmq4dzayMdCjCnu8uqmCysIGBT2Y=
|
||||
github.com/cosmos/iavl v0.15.0-rc3.0.20201009144442-230e9bdf52cd/go.mod h1:3xOIaNNX19p0QrX0VqWa6voPRoJRGGYtny+DH8NEPvE=
|
||||
github.com/cosmos/iavl v0.15.0-rc4 h1:P1wmET7BueqCzfxsn+BzVkDWDLY9ij2JNwkbIdM7RG8=
|
||||
github.com/cosmos/iavl v0.15.0-rc4/go.mod h1:5CsecJdh44Uj4vZ6WSPeWq84hNW5BwRI36ZsAbfJvRw=
|
||||
github.com/cosmos/iavl v0.15.0-rc5 h1:AMKgaAjXwGANWv56NL4q4hV+a0puSkLYD6cCQAv3i44=
|
||||
github.com/cosmos/iavl v0.15.0-rc5/go.mod h1:WqoPL9yPTQ85QBMT45OOUzPxG/U/JcJoN7uMjgxke/I=
|
||||
github.com/cosmos/ledger-cosmos-go v0.11.1 h1:9JIYsGnXP613pb2vPjFeMMjBI5lEDsEaF6oYorTy6J4=
|
||||
github.com/cosmos/ledger-cosmos-go v0.11.1/go.mod h1:J8//BsAGTo3OC/vDLjMRFLW6q0WAaXvHnVc7ZmE8iUY=
|
||||
github.com/cosmos/ledger-go v0.9.2 h1:Nnao/dLwaVTk1Q5U9THldpUMMXU94BOTWPddSmVB6pI=
|
||||
@ -284,8 +284,8 @@ github.com/grpc-ecosystem/grpc-gateway v1.9.0/go.mod h1:vNeuVxBJEsws4ogUvrchl83t
|
||||
github.com/grpc-ecosystem/grpc-gateway v1.9.5 h1:UImYN5qQ8tuGpGE16ZmjvcTtTw24zw1QAp/SlnNrZhI=
|
||||
github.com/grpc-ecosystem/grpc-gateway v1.9.5/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY=
|
||||
github.com/grpc-ecosystem/grpc-gateway v1.14.7/go.mod h1:oYZKL012gGh6LMyg/xA7Q2yq6j8bu0wa+9w14EEthWU=
|
||||
github.com/grpc-ecosystem/grpc-gateway v1.15.2 h1:HC+hWRWf+v5zTMPyoaYTKIJih+4sd4XRWmj0qlG87Co=
|
||||
github.com/grpc-ecosystem/grpc-gateway v1.15.2/go.mod h1:vO11I9oWA+KsxmfFQPhLnnIb1VDE24M+pdxZFiuZcA8=
|
||||
github.com/grpc-ecosystem/grpc-gateway v1.16.0 h1:gmcG1KaJ57LophUzW0Hy8NmPhnMZb4M0+kPpLofRdBo=
|
||||
github.com/grpc-ecosystem/grpc-gateway v1.16.0/go.mod h1:BDjrQk3hbvj6Nolgz8mAMFbcEtjT1g+wF4CSlocrBnw=
|
||||
github.com/gsterjov/go-libsecret v0.0.0-20161001094733-a6f4afe4910c h1:6rhixN/i8ZofjG1Y75iExal34USq5p+wiN1tpie8IrU=
|
||||
github.com/gsterjov/go-libsecret v0.0.0-20161001094733-a6f4afe4910c/go.mod h1:NMPJylDgVpX0MLRlPy15sqSwOFv/U1GZ2m21JhFfek0=
|
||||
github.com/gtank/merlin v0.1.1-0.20191105220539-8318aed1a79f/go.mod h1:T86dnYJhcGOh5BjZFCJWTDeTK7XW8uE+E21Cy/bIQ+s=
|
||||
@ -595,12 +595,12 @@ github.com/tendermint/crypto v0.0.0-20191022145703-50d29ede1e15/go.mod h1:z4YtwM
|
||||
github.com/tendermint/go-amino v0.16.0 h1:GyhmgQKvqF82e2oZeuMSp9JTN0N09emoSZlb2lyGa2E=
|
||||
github.com/tendermint/go-amino v0.16.0/go.mod h1:TQU0M1i/ImAo+tYpZi73AU3V/dKeCoMC9Sphe2ZwGME=
|
||||
github.com/tendermint/tendermint v0.34.0-rc4/go.mod h1:yotsojf2C1QBOw4dZrTcxbyxmPUrT4hNuOQWX9XUwB4=
|
||||
github.com/tendermint/tendermint v0.34.0-rc5 h1:2bnQfWyOMfTCbol5pwB8CgM2nxi6/Kz6zqlS6Udm/Cg=
|
||||
github.com/tendermint/tendermint v0.34.0-rc5/go.mod h1:yotsojf2C1QBOw4dZrTcxbyxmPUrT4hNuOQWX9XUwB4=
|
||||
github.com/tendermint/tendermint v0.34.0-rc6 h1:SVuKGvvE22KxfuK8QUHctUrmOWJsncZSYXIYtcnoKN0=
|
||||
github.com/tendermint/tendermint v0.34.0-rc6/go.mod h1:ugzyZO5foutZImv0Iyx/gOFCX6mjJTgbLHTwi17VDVg=
|
||||
github.com/tendermint/tm-db v0.6.2 h1:DOn8jwCdjJblrCFJbtonEIPD1IuJWpbRUUdR8GWE4RM=
|
||||
github.com/tendermint/tm-db v0.6.2/go.mod h1:GYtQ67SUvATOcoY8/+x6ylk8Qo02BQyLrAs+yAcLvGI=
|
||||
github.com/tendermint/tm-db v0.6.3 h1:ZkhQcKnB8/2jr5EaZwGndN4owkPsGezW2fSisS9zGbg=
|
||||
github.com/tendermint/tm-db v0.6.3/go.mod h1:lfA1dL9/Y/Y8wwyPp2NMLyn5P5Ptr/gvDFNWtrCWSf8=
|
||||
github.com/tmc/grpc-websocket-proxy v0.0.0-20170815181823-89b8d40f7ca8/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U=
|
||||
github.com/tmc/grpc-websocket-proxy v0.0.0-20190109142713-0ad062ec5ee5/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U=
|
||||
github.com/tv42/httpunix v0.0.0-20150427012821-b75d8614f926/go.mod h1:9ESjWnEqriFuLhtthL60Sar/7RFoluCcXsuvEwTV5KM=
|
||||
@ -645,8 +645,8 @@ golang.org/x/crypto v0.0.0-20200510223506-06a226fb4e37/go.mod h1:LzIPMQfyMNhhGPh
|
||||
golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
|
||||
golang.org/x/crypto v0.0.0-20200709230013-948cd5f35899/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
|
||||
golang.org/x/crypto v0.0.0-20200820211705-5c72a883971a/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
|
||||
golang.org/x/crypto v0.0.0-20201012173705-84dcc777aaee h1:4yd7jl+vXjalO5ztz6Vc1VADv+S/80LGJmyl1ROJ2AI=
|
||||
golang.org/x/crypto v0.0.0-20201012173705-84dcc777aaee/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
|
||||
golang.org/x/crypto v0.0.0-20201016220609-9e8e0b390897 h1:pLI5jrR7OSLijeIDcmRxNmw2api+jEfxLoykJVice/E=
|
||||
golang.org/x/crypto v0.0.0-20201016220609-9e8e0b390897/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
|
||||
golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
|
||||
golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
|
||||
golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8=
|
||||
@ -694,6 +694,7 @@ golang.org/x/net v0.0.0-20200421231249-e086a090c8fd/go.mod h1:qpuaurCH72eLCgpAm/
|
||||
golang.org/x/net v0.0.0-20200520004742-59133d7f0dd7/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=
|
||||
golang.org/x/net v0.0.0-20200625001655-4c5254603344/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA=
|
||||
golang.org/x/net v0.0.0-20200813134508-3edf25e44fcc/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA=
|
||||
golang.org/x/net v0.0.0-20200822124328-c89045814202/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA=
|
||||
golang.org/x/net v0.0.0-20200930145003-4acb6c075d10 h1:YfxMZzv3PjGonQYNUaeU2+DhAdqOxerQ30JFB6WgAXo=
|
||||
golang.org/x/net v0.0.0-20200930145003-4acb6c075d10/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA=
|
||||
golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=
|
||||
@ -810,8 +811,8 @@ google.golang.org/genproto v0.0.0-20200423170343-7949de9c1215/go.mod h1:55QSHmfG
|
||||
google.golang.org/genproto v0.0.0-20200513103714-09dca8ec2884/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=
|
||||
google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo=
|
||||
google.golang.org/genproto v0.0.0-20200825200019-8632dd797987/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=
|
||||
google.golang.org/genproto v0.0.0-20201014134559-03b6142f0dc9 h1:fG84H9C3EXfuDlzkG+VEPDYHHExklP6scH1QZ5gQTqU=
|
||||
google.golang.org/genproto v0.0.0-20201014134559-03b6142f0dc9/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=
|
||||
google.golang.org/genproto v0.0.0-20201111145450-ac7456db90a6 h1:iRN4+t0lvZX/l9gH14ARF9i58tsVa5a97k6aH95rC3Y=
|
||||
google.golang.org/genproto v0.0.0-20201111145450-ac7456db90a6/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=
|
||||
google.golang.org/grpc v1.17.0/go.mod h1:6QZJwpn2B+Zp71q/5VxRsJ6NXXVCE5NRUHRo+f3cWCs=
|
||||
google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c=
|
||||
google.golang.org/grpc v1.19.1/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c=
|
||||
@ -830,8 +831,9 @@ google.golang.org/grpc v1.29.1/go.mod h1:itym6AZVZYACWQqET3MqgPpjcuV5QH3BxFS3Iji
|
||||
google.golang.org/grpc v1.31.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak=
|
||||
google.golang.org/grpc v1.31.1/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak=
|
||||
google.golang.org/grpc v1.32.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak=
|
||||
google.golang.org/grpc v1.33.0 h1:IBKSUNL2uBS2DkJBncPP+TwT0sp9tgA8A75NjHt6umg=
|
||||
google.golang.org/grpc v1.33.0/go.mod h1:fr5YgcSWrqhRRxogOsw7RzIpsmvOZ6IcH4kBYTpR3n0=
|
||||
google.golang.org/grpc v1.33.1/go.mod h1:fr5YgcSWrqhRRxogOsw7RzIpsmvOZ6IcH4kBYTpR3n0=
|
||||
google.golang.org/grpc v1.33.2 h1:EQyQC3sa8M+p6Ulc8yy9SWSS2GVwyRc83gAbG8lrl4o=
|
||||
google.golang.org/grpc v1.33.2/go.mod h1:JMHMWHQWaTccqQQlmk3MJZS+GWXOdAesneDmEnv2fbc=
|
||||
google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8=
|
||||
google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0=
|
||||
google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM=
|
||||
|
||||
@ -17,8 +17,9 @@ message BaseAccount {
|
||||
|
||||
option (cosmos_proto.implements_interface) = "AccountI";
|
||||
|
||||
string address = 1;
|
||||
google.protobuf.Any pub_key = 2 [(gogoproto.jsontag) = "public_key,omitempty", (gogoproto.moretags) = "yaml:\"public_key\""];
|
||||
string address = 1;
|
||||
google.protobuf.Any pub_key = 2
|
||||
[(gogoproto.jsontag) = "public_key,omitempty", (gogoproto.moretags) = "yaml:\"public_key\""];
|
||||
uint64 account_number = 3 [(gogoproto.moretags) = "yaml:\"account_number\""];
|
||||
uint64 sequence = 4;
|
||||
}
|
||||
@ -29,9 +30,9 @@ message ModuleAccount {
|
||||
option (gogoproto.goproto_stringer) = false;
|
||||
option (cosmos_proto.implements_interface) = "ModuleAccountI";
|
||||
|
||||
BaseAccount base_account = 1 [(gogoproto.embed) = true, (gogoproto.moretags) = "yaml:\"base_account\""];
|
||||
string name = 2;
|
||||
repeated string permissions = 3;
|
||||
BaseAccount base_account = 1 [(gogoproto.embed) = true, (gogoproto.moretags) = "yaml:\"base_account\""];
|
||||
string name = 2;
|
||||
repeated string permissions = 3;
|
||||
}
|
||||
|
||||
// Params defines the parameters for the auth module.
|
||||
|
||||
@ -28,15 +28,15 @@ message MsgSend {
|
||||
}
|
||||
|
||||
// MsgSendResponse defines the Msg/Send response type.
|
||||
message MsgSendResponse { }
|
||||
message MsgSendResponse {}
|
||||
|
||||
// MsgMultiSend represents an arbitrary multi-in, multi-out send message.
|
||||
message MsgMultiSend {
|
||||
option (gogoproto.equal) = false;
|
||||
|
||||
repeated Input inputs = 1 [(gogoproto.nullable) = false];
|
||||
repeated Input inputs = 1 [(gogoproto.nullable) = false];
|
||||
repeated Output outputs = 2 [(gogoproto.nullable) = false];
|
||||
}
|
||||
|
||||
// MsgMultiSendResponse defines the Msg/MultiSend response type.
|
||||
message MsgMultiSendResponse { }
|
||||
message MsgMultiSendResponse {}
|
||||
|
||||
@ -58,7 +58,7 @@ message ABCIMessageLog {
|
||||
message StringEvent {
|
||||
option (gogoproto.stringer) = true;
|
||||
|
||||
string type = 1;
|
||||
string type = 1;
|
||||
repeated Attribute attributes = 2 [(gogoproto.nullable) = false];
|
||||
}
|
||||
|
||||
|
||||
@ -8,7 +8,7 @@ option go_package = "github.com/cosmos/cosmos-sdk/store/types";
|
||||
// CommitInfo defines commit information used by the multi-store when committing
|
||||
// a version/height.
|
||||
message CommitInfo {
|
||||
int64 version = 1;
|
||||
int64 version = 1;
|
||||
repeated StoreInfo store_infos = 2 [(gogoproto.nullable) = false];
|
||||
}
|
||||
|
||||
|
||||
@ -22,4 +22,4 @@ message MsgVerifyInvariant {
|
||||
}
|
||||
|
||||
// MsgVerifyInvariantResponse defines the Msg/VerifyInvariant response type.
|
||||
message MsgVerifyInvariantResponse { }
|
||||
message MsgVerifyInvariantResponse {}
|
||||
|
||||
@ -11,12 +11,12 @@ option go_package = "github.com/cosmos/cosmos-sdk/crypto/keys/ed25519";
|
||||
// the x-coordinate. Otherwise the first byte is a 0x03.
|
||||
// This prefix is followed with the x-coordinate.
|
||||
message PubKey {
|
||||
option (gogoproto.goproto_stringer) = false;
|
||||
option (gogoproto.goproto_stringer) = false;
|
||||
|
||||
bytes key = 1 [(gogoproto.casttype) = "crypto/ed25519.PublicKey"];
|
||||
bytes key = 1 [(gogoproto.casttype) = "crypto/ed25519.PublicKey"];
|
||||
}
|
||||
|
||||
// PrivKey defines a ed25519 private key.
|
||||
message PrivKey {
|
||||
bytes key = 1 [(gogoproto.casttype) = "crypto/ed25519.PrivateKey"];
|
||||
bytes key = 1 [(gogoproto.casttype) = "crypto/ed25519.PrivateKey"];
|
||||
}
|
||||
|
||||
@ -9,7 +9,7 @@ import "cosmos/base/v1beta1/coin.proto";
|
||||
|
||||
// Msg defines the distribution Msg service.
|
||||
service Msg {
|
||||
// SetWithdrawAddress defines a method to change the withdraw address
|
||||
// SetWithdrawAddress defines a method to change the withdraw address
|
||||
// for a delegator (or validator self-delegation).
|
||||
rpc SetWithdrawAddress(MsgSetWithdrawAddress) returns (MsgSetWithdrawAddressResponse);
|
||||
|
||||
@ -17,7 +17,7 @@ service Msg {
|
||||
// from a single validator.
|
||||
rpc WithdrawDelegatorReward(MsgWithdrawDelegatorReward) returns (MsgWithdrawDelegatorRewardResponse);
|
||||
|
||||
// WithdrawValidatorCommission defines a method to withdraw the
|
||||
// WithdrawValidatorCommission defines a method to withdraw the
|
||||
// full commission to the validator address.
|
||||
rpc WithdrawValidatorCommission(MsgWithdrawValidatorCommission) returns (MsgWithdrawValidatorCommissionResponse);
|
||||
|
||||
@ -37,7 +37,7 @@ message MsgSetWithdrawAddress {
|
||||
}
|
||||
|
||||
// MsgSetWithdrawAddressResponse defines the Msg/SetWithdrawAddress response type.
|
||||
message MsgSetWithdrawAddressResponse { }
|
||||
message MsgSetWithdrawAddressResponse {}
|
||||
|
||||
// MsgWithdrawDelegatorReward represents delegation withdrawal to a delegator
|
||||
// from a single validator.
|
||||
@ -50,7 +50,7 @@ message MsgWithdrawDelegatorReward {
|
||||
}
|
||||
|
||||
// MsgWithdrawDelegatorRewardResponse defines the Msg/WithdrawDelegatorReward response type.
|
||||
message MsgWithdrawDelegatorRewardResponse { }
|
||||
message MsgWithdrawDelegatorRewardResponse {}
|
||||
|
||||
// MsgWithdrawValidatorCommission withdraws the full commission to the validator
|
||||
// address.
|
||||
@ -62,7 +62,7 @@ message MsgWithdrawValidatorCommission {
|
||||
}
|
||||
|
||||
// MsgWithdrawValidatorCommissionResponse defines the Msg/WithdrawValidatorCommission response type.
|
||||
message MsgWithdrawValidatorCommissionResponse { }
|
||||
message MsgWithdrawValidatorCommissionResponse {}
|
||||
|
||||
// MsgFundCommunityPool allows an account to directly
|
||||
// fund the community pool.
|
||||
@ -76,4 +76,4 @@ message MsgFundCommunityPool {
|
||||
}
|
||||
|
||||
// MsgFundCommunityPoolResponse defines the Msg/FundCommunityPool response type.
|
||||
message MsgFundCommunityPoolResponse { }
|
||||
message MsgFundCommunityPoolResponse {}
|
||||
|
||||
@ -7,7 +7,7 @@ import "cosmos_proto/cosmos.proto";
|
||||
import "gogoproto/gogo.proto";
|
||||
import "google/protobuf/any.proto";
|
||||
|
||||
option go_package = "github.com/cosmos/cosmos-sdk/x/gov/types";
|
||||
option go_package = "github.com/cosmos/cosmos-sdk/x/gov/types";
|
||||
|
||||
// Msg defines the bank Msg service.
|
||||
service Msg {
|
||||
@ -27,7 +27,7 @@ service Msg {
|
||||
// MsgSubmitProposal defines an sdk.Msg type that supports submitting arbitrary
|
||||
// proposal Content.
|
||||
message MsgSubmitProposal {
|
||||
option (gogoproto.equal) = false;
|
||||
option (gogoproto.equal) = false;
|
||||
option (gogoproto.goproto_stringer) = false;
|
||||
option (gogoproto.stringer) = false;
|
||||
option (gogoproto.goproto_getters) = false;
|
||||
@ -43,12 +43,12 @@ message MsgSubmitProposal {
|
||||
|
||||
// MsgSubmitProposalResponse defines the Msg/SubmitProposal response type.
|
||||
message MsgSubmitProposalResponse {
|
||||
uint64 proposal_id = 1 [(gogoproto.jsontag) = "proposal_id", (gogoproto.moretags) = "yaml:\"proposal_id\""];
|
||||
uint64 proposal_id = 1 [(gogoproto.jsontag) = "proposal_id", (gogoproto.moretags) = "yaml:\"proposal_id\""];
|
||||
}
|
||||
|
||||
// MsgVote defines a message to cast a vote.
|
||||
message MsgVote {
|
||||
option (gogoproto.equal) = false;
|
||||
option (gogoproto.equal) = false;
|
||||
option (gogoproto.goproto_stringer) = false;
|
||||
option (gogoproto.stringer) = false;
|
||||
option (gogoproto.goproto_getters) = false;
|
||||
@ -78,7 +78,7 @@ message MsgWeightedVoteResponse {}
|
||||
|
||||
// MsgDeposit defines a message to submit a deposit to an existing proposal.
|
||||
message MsgDeposit {
|
||||
option (gogoproto.equal) = false;
|
||||
option (gogoproto.equal) = false;
|
||||
option (gogoproto.goproto_stringer) = false;
|
||||
option (gogoproto.stringer) = false;
|
||||
option (gogoproto.goproto_getters) = false;
|
||||
|
||||
@ -11,9 +11,9 @@ message ParameterChangeProposal {
|
||||
option (gogoproto.goproto_getters) = false;
|
||||
option (gogoproto.goproto_stringer) = false;
|
||||
|
||||
string title = 1;
|
||||
string description = 2;
|
||||
repeated ParamChange changes = 3 [(gogoproto.nullable) = false];
|
||||
string title = 1;
|
||||
string description = 2;
|
||||
repeated ParamChange changes = 3 [(gogoproto.nullable) = false];
|
||||
}
|
||||
|
||||
// ParamChange defines an individual parameter change, for use in
|
||||
|
||||
@ -18,7 +18,7 @@ option go_package = "github.com/cosmos/cosmos-sdk/x/staking/types";
|
||||
// (`n` is set by the staking module's `historical_entries` parameter).
|
||||
message HistoricalInfo {
|
||||
tendermint.types.Header header = 1 [(gogoproto.nullable) = false];
|
||||
repeated Validator valset = 2 [(gogoproto.nullable) = false];
|
||||
repeated Validator valset = 2 [(gogoproto.nullable) = false];
|
||||
}
|
||||
|
||||
// CommissionRates defines the initial commission rates to be used for creating
|
||||
@ -75,13 +75,12 @@ message Validator {
|
||||
option (gogoproto.goproto_stringer) = false;
|
||||
option (gogoproto.goproto_getters) = false;
|
||||
|
||||
string operator_address = 1 [(gogoproto.moretags) = "yaml:\"operator_address\""];
|
||||
google.protobuf.Any consensus_pubkey = 2 [
|
||||
(cosmos_proto.accepts_interface) = "cosmos.crypto.PubKey",
|
||||
(gogoproto.moretags) = "yaml:\"consensus_pubkey\""];
|
||||
bool jailed = 3;
|
||||
BondStatus status = 4;
|
||||
string tokens = 5 [(gogoproto.customtype) = "github.com/cosmos/cosmos-sdk/types.Int", (gogoproto.nullable) = false];
|
||||
string operator_address = 1 [(gogoproto.moretags) = "yaml:\"operator_address\""];
|
||||
google.protobuf.Any consensus_pubkey = 2
|
||||
[(cosmos_proto.accepts_interface) = "cosmos.crypto.PubKey", (gogoproto.moretags) = "yaml:\"consensus_pubkey\""];
|
||||
bool jailed = 3;
|
||||
BondStatus status = 4;
|
||||
string tokens = 5 [(gogoproto.customtype) = "github.com/cosmos/cosmos-sdk/types.Int", (gogoproto.nullable) = false];
|
||||
string delegator_shares = 6 [
|
||||
(gogoproto.moretags) = "yaml:\"delegator_shares\"",
|
||||
(gogoproto.customtype) = "github.com/cosmos/cosmos-sdk/types.Dec",
|
||||
@ -177,8 +176,8 @@ message UnbondingDelegation {
|
||||
option (gogoproto.goproto_getters) = false;
|
||||
option (gogoproto.goproto_stringer) = false;
|
||||
|
||||
string delegator_address = 1 [(gogoproto.moretags) = "yaml:\"delegator_address\""];
|
||||
string validator_address = 2 [(gogoproto.moretags) = "yaml:\"validator_address\""];
|
||||
string delegator_address = 1 [(gogoproto.moretags) = "yaml:\"delegator_address\""];
|
||||
string validator_address = 2 [(gogoproto.moretags) = "yaml:\"validator_address\""];
|
||||
repeated UnbondingDelegationEntry entries = 3 [(gogoproto.nullable) = false]; // unbonding delegation entries
|
||||
}
|
||||
|
||||
@ -222,10 +221,10 @@ message Redelegation {
|
||||
option (gogoproto.goproto_getters) = false;
|
||||
option (gogoproto.goproto_stringer) = false;
|
||||
|
||||
string delegator_address = 1 [(gogoproto.moretags) = "yaml:\"delegator_address\""];
|
||||
string validator_src_address = 2 [(gogoproto.moretags) = "yaml:\"validator_src_address\""];
|
||||
string validator_dst_address = 3 [(gogoproto.moretags) = "yaml:\"validator_dst_address\""];
|
||||
repeated RedelegationEntry entries = 4 [(gogoproto.nullable) = false]; // redelegation entries
|
||||
string delegator_address = 1 [(gogoproto.moretags) = "yaml:\"delegator_address\""];
|
||||
string validator_src_address = 2 [(gogoproto.moretags) = "yaml:\"validator_src_address\""];
|
||||
string validator_dst_address = 3 [(gogoproto.moretags) = "yaml:\"validator_dst_address\""];
|
||||
repeated RedelegationEntry entries = 4 [(gogoproto.nullable) = false]; // redelegation entries
|
||||
}
|
||||
|
||||
// Params defines the parameters for the staking module.
|
||||
@ -268,8 +267,8 @@ message RedelegationEntryResponse {
|
||||
message RedelegationResponse {
|
||||
option (gogoproto.equal) = false;
|
||||
|
||||
Redelegation redelegation = 1 [(gogoproto.nullable) = false];
|
||||
repeated RedelegationEntryResponse entries = 2 [(gogoproto.nullable) = false];
|
||||
Redelegation redelegation = 1 [(gogoproto.nullable) = false];
|
||||
repeated RedelegationEntryResponse entries = 2 [(gogoproto.nullable) = false];
|
||||
}
|
||||
|
||||
// Pool is used for tracking bonded and not-bonded token supply of the bond
|
||||
|
||||
@ -51,7 +51,7 @@ message MsgCreateValidator {
|
||||
}
|
||||
|
||||
// MsgCreateValidatorResponse defines the Msg/CreateValidator response type.
|
||||
message MsgCreateValidatorResponse { }
|
||||
message MsgCreateValidatorResponse {}
|
||||
|
||||
// MsgEditValidator defines a SDK message for editing an existing validator.
|
||||
message MsgEditValidator {
|
||||
@ -77,7 +77,7 @@ message MsgEditValidator {
|
||||
}
|
||||
|
||||
// MsgEditValidatorResponse defines the Msg/EditValidator response type.
|
||||
message MsgEditValidatorResponse { }
|
||||
message MsgEditValidatorResponse {}
|
||||
|
||||
// MsgDelegate defines a SDK message for performing a delegation of coins
|
||||
// from a delegator to a validator.
|
||||
@ -91,7 +91,7 @@ message MsgDelegate {
|
||||
}
|
||||
|
||||
// MsgDelegateResponse defines the Msg/Delegate response type.
|
||||
message MsgDelegateResponse { }
|
||||
message MsgDelegateResponse {}
|
||||
|
||||
// MsgBeginRedelegate defines a SDK message for performing a redelegation
|
||||
// of coins from a delegator and source validator to a destination validator.
|
||||
|
||||
@ -37,43 +37,43 @@ message SignatureDescriptors {
|
||||
// signature itself. It is primarily used for coordinating signatures between
|
||||
// clients.
|
||||
message SignatureDescriptor {
|
||||
// public_key is the public key of the signer
|
||||
google.protobuf.Any public_key = 1;
|
||||
// public_key is the public key of the signer
|
||||
google.protobuf.Any public_key = 1;
|
||||
|
||||
Data data = 2;
|
||||
Data data = 2;
|
||||
|
||||
// sequence is the sequence of the account, which describes the
|
||||
// number of committed transactions signed by a given address. It is used to prevent
|
||||
// replay attacks.
|
||||
uint64 sequence = 3;
|
||||
// sequence is the sequence of the account, which describes the
|
||||
// number of committed transactions signed by a given address. It is used to prevent
|
||||
// replay attacks.
|
||||
uint64 sequence = 3;
|
||||
|
||||
// Data represents signature data
|
||||
message Data {
|
||||
// sum is the oneof that specifies whether this represents single or multi-signature data
|
||||
oneof sum {
|
||||
// single represents a single signer
|
||||
Single single = 1;
|
||||
// Data represents signature data
|
||||
message Data {
|
||||
// sum is the oneof that specifies whether this represents single or multi-signature data
|
||||
oneof sum {
|
||||
// single represents a single signer
|
||||
Single single = 1;
|
||||
|
||||
// multi represents a multisig signer
|
||||
Multi multi = 2;
|
||||
}
|
||||
|
||||
// Single is the signature data for a single signer
|
||||
message Single {
|
||||
// mode is the signing mode of the single signer
|
||||
SignMode mode = 1;
|
||||
|
||||
// signature is the raw signature bytes
|
||||
bytes signature = 2;
|
||||
}
|
||||
|
||||
// Multi is the signature data for a multisig public key
|
||||
message Multi {
|
||||
// bitarray specifies which keys within the multisig are signing
|
||||
cosmos.crypto.multisig.v1beta1.CompactBitArray bitarray = 1;
|
||||
|
||||
// signatures is the signatures of the multi-signature
|
||||
repeated Data signatures = 2;
|
||||
}
|
||||
// multi represents a multisig signer
|
||||
Multi multi = 2;
|
||||
}
|
||||
|
||||
// Single is the signature data for a single signer
|
||||
message Single {
|
||||
// mode is the signing mode of the single signer
|
||||
SignMode mode = 1;
|
||||
|
||||
// signature is the raw signature bytes
|
||||
bytes signature = 2;
|
||||
}
|
||||
|
||||
// Multi is the signature data for a multisig public key
|
||||
message Multi {
|
||||
// bitarray specifies which keys within the multisig are signing
|
||||
cosmos.crypto.multisig.v1beta1.CompactBitArray bitarray = 1;
|
||||
|
||||
// signatures is the signatures of the multi-signature
|
||||
repeated Data signatures = 2;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@ -4,46 +4,74 @@ package cosmos.tx.v1beta1;
|
||||
import "google/api/annotations.proto";
|
||||
import "cosmos/base/abci/v1beta1/abci.proto";
|
||||
import "cosmos/tx/v1beta1/tx.proto";
|
||||
import "cosmos/base/query/v1beta1/pagination.proto";
|
||||
|
||||
option go_package = "github.com/cosmos/cosmos-sdk/types/tx";
|
||||
|
||||
// Service defines a gRPC service for interacting with transactions.
|
||||
service Service {
|
||||
// Simulate simulates executing a transaction for estimating gas usage.
|
||||
rpc Simulate(SimulateRequest) returns (SimulateResponse) {
|
||||
option (google.api.http).post = "/cosmos/tx/v1beta1/simulate";
|
||||
}
|
||||
// GetTx fetches a tx by hash.
|
||||
rpc GetTx(GetTxRequest) returns (GetTxResponse) {
|
||||
option (google.api.http).get = "/cosmos/tx/v1beta1/tx/{hash}";
|
||||
}
|
||||
// Simulate simulates executing a transaction for estimating gas usage.
|
||||
rpc Simulate(SimulateRequest) returns (SimulateResponse) {
|
||||
option (google.api.http).post = "/cosmos/tx/v1beta1/simulate";
|
||||
}
|
||||
// GetTx fetches a tx by hash.
|
||||
rpc GetTx(GetTxRequest) returns (GetTxResponse) {
|
||||
option (google.api.http).get = "/cosmos/tx/v1beta1/tx/{hash}";
|
||||
}
|
||||
|
||||
// GetTxsEvent fetches txs by event.
|
||||
rpc GetTxsEvent(GetTxsEventRequest) returns (GetTxsEventResponse) {
|
||||
option (google.api.http).get = "/cosmos/tx/v1beta1/txs";
|
||||
}
|
||||
}
|
||||
|
||||
// GetTxsEventRequest is the request type for the Service.TxsByEvents
|
||||
// RPC method.
|
||||
message GetTxsEventRequest {
|
||||
// event is the transaction event type.
|
||||
string event = 1;
|
||||
// pagination defines an pagination for the request.
|
||||
cosmos.base.query.v1beta1.PageRequest pagination = 2;
|
||||
}
|
||||
|
||||
// GetTxsEventResponse is the response type for the Service.TxsByEvents
|
||||
// RPC method.
|
||||
message GetTxsEventResponse {
|
||||
// txs is the list of queried transactions.
|
||||
repeated cosmos.tx.v1beta1.Tx txs = 1;
|
||||
// tx_responses is the list of queried TxResponses.
|
||||
repeated cosmos.base.abci.v1beta1.TxResponse tx_responses = 2;
|
||||
// pagination defines an pagination for the response.
|
||||
cosmos.base.query.v1beta1.PageResponse pagination = 3;
|
||||
}
|
||||
|
||||
// SimulateRequest is the request type for the Service.Simulate
|
||||
// RPC method.
|
||||
message SimulateRequest {
|
||||
// tx is the transaction to simulate.
|
||||
cosmos.tx.v1beta1.Tx tx = 1;
|
||||
// tx is the transaction to simulate.
|
||||
cosmos.tx.v1beta1.Tx tx = 1;
|
||||
}
|
||||
|
||||
|
||||
// SimulateResponse is the response type for the
|
||||
// Service.SimulateRPC method.
|
||||
message SimulateResponse {
|
||||
// gas_info is the information about gas used in the simulation.
|
||||
cosmos.base.abci.v1beta1.GasInfo gas_info = 1;
|
||||
// result is the result of the simulation.
|
||||
cosmos.base.abci.v1beta1.Result result = 2;
|
||||
// gas_info is the information about gas used in the simulation.
|
||||
cosmos.base.abci.v1beta1.GasInfo gas_info = 1;
|
||||
// result is the result of the simulation.
|
||||
cosmos.base.abci.v1beta1.Result result = 2;
|
||||
}
|
||||
|
||||
// GetTx is the request type for the Service.GetTx
|
||||
// GetTxRequest is the request type for the Service.GetTx
|
||||
// RPC method.
|
||||
message GetTxRequest {
|
||||
// hash is the tx hash to query, encoded as a hex string.
|
||||
string hash = 1;
|
||||
// hash is the tx hash to query, encoded as a hex string.
|
||||
string hash = 1;
|
||||
}
|
||||
|
||||
|
||||
// GetTxResponse is the response type for the Service.GetTx method.
|
||||
message GetTxResponse {
|
||||
// tx is the queried transaction.
|
||||
cosmos.tx.v1beta1.Tx tx = 1;
|
||||
}
|
||||
// tx is the queried transaction.
|
||||
cosmos.tx.v1beta1.Tx tx = 1;
|
||||
// tx_response is the queried TxResponses.
|
||||
cosmos.base.abci.v1beta1.TxResponse tx_response = 2;
|
||||
}
|
||||
@ -39,7 +39,8 @@ message Plan {
|
||||
// so that connecting chains can verify that the new upgraded client is valid by verifying a proof on the
|
||||
// previous version of the chain.
|
||||
// This will allow IBC connections to persist smoothly across planned chain upgrades
|
||||
google.protobuf.Any upgraded_client_state = 5 [(gogoproto.moretags) = "yaml:\"upgraded_client_state\""];;
|
||||
google.protobuf.Any upgraded_client_state = 5 [(gogoproto.moretags) = "yaml:\"upgraded_client_state\""];
|
||||
;
|
||||
}
|
||||
|
||||
// SoftwareUpgradeProposal is a gov Content type for initiating a software
|
||||
|
||||
@ -6,7 +6,6 @@ import "cosmos/base/v1beta1/coin.proto";
|
||||
|
||||
option go_package = "github.com/cosmos/cosmos-sdk/x/auth/vesting/types";
|
||||
|
||||
|
||||
// Msg defines the bank Msg service.
|
||||
service Msg {
|
||||
// CreateVestingAccount defines a method that enables creating a vesting
|
||||
@ -14,7 +13,6 @@ service Msg {
|
||||
rpc CreateVestingAccount(MsgCreateVestingAccount) returns (MsgCreateVestingAccountResponse);
|
||||
}
|
||||
|
||||
|
||||
// MsgCreateVestingAccount defines a message that enables creating a vesting
|
||||
// account.
|
||||
message MsgCreateVestingAccount {
|
||||
@ -30,4 +28,4 @@ message MsgCreateVestingAccount {
|
||||
}
|
||||
|
||||
// MsgCreateVestingAccountResponse defines the Msg/CreateVestingAccount response type.
|
||||
message MsgCreateVestingAccountResponse { }
|
||||
message MsgCreateVestingAccountResponse {}
|
||||
@ -12,17 +12,17 @@ option go_package = "github.com/cosmos/cosmos-sdk/x/ibc/applications/transfer/ty
|
||||
service Query {
|
||||
// DenomTrace queries a denomination trace information.
|
||||
rpc DenomTrace(QueryDenomTraceRequest) returns (QueryDenomTraceResponse) {
|
||||
option (google.api.http).get = "/ibc_transfer/v1beta1/denom_traces/{hash}";
|
||||
option (google.api.http).get = "/ibc/applications/transfer/v1beta1/denom_traces/{hash}";
|
||||
}
|
||||
|
||||
// DenomTraces queries all denomination traces.
|
||||
rpc DenomTraces(QueryDenomTracesRequest) returns (QueryDenomTracesResponse) {
|
||||
option (google.api.http).get = "/ibc_transfer/v1beta1/denom_traces";
|
||||
option (google.api.http).get = "/ibc/applications/transfer/v1beta1/denom_traces";
|
||||
}
|
||||
|
||||
// Params queries all parameters of the ibc-transfer module.
|
||||
rpc Params(QueryParamsRequest) returns (QueryParamsResponse) {
|
||||
option (google.api.http).get = "/ibc_transfer/v1beta1/params";
|
||||
option (google.api.http).get = "/ibc/applications/transfer/v1beta1/params";
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@ -40,4 +40,4 @@ message MsgTransfer {
|
||||
}
|
||||
|
||||
// MsgTransferResponse defines the Msg/Transfer response type.
|
||||
message MsgTransferResponse { }
|
||||
message MsgTransferResponse {}
|
||||
|
||||
@ -8,11 +8,11 @@ import "ibc/core/channel/v1/channel.proto";
|
||||
|
||||
// GenesisState defines the ibc channel submodule's genesis state.
|
||||
message GenesisState {
|
||||
repeated IdentifiedChannel channels = 1 [(gogoproto.casttype) = "IdentifiedChannel", (gogoproto.nullable) = false];
|
||||
repeated PacketState acknowledgements = 2 [(gogoproto.nullable) = false];
|
||||
repeated PacketState commitments = 3 [(gogoproto.nullable) = false];
|
||||
repeated PacketState receipts = 4 [(gogoproto.nullable) = false];
|
||||
repeated PacketSequence send_sequences = 5
|
||||
repeated IdentifiedChannel channels = 1 [(gogoproto.casttype) = "IdentifiedChannel", (gogoproto.nullable) = false];
|
||||
repeated PacketState acknowledgements = 2 [(gogoproto.nullable) = false];
|
||||
repeated PacketState commitments = 3 [(gogoproto.nullable) = false];
|
||||
repeated PacketState receipts = 4 [(gogoproto.nullable) = false];
|
||||
repeated PacketSequence send_sequences = 5
|
||||
[(gogoproto.nullable) = false, (gogoproto.moretags) = "yaml:\"send_sequences\""];
|
||||
repeated PacketSequence recv_sequences = 6
|
||||
[(gogoproto.nullable) = false, (gogoproto.moretags) = "yaml:\"recv_sequences\""];
|
||||
|
||||
@ -14,79 +14,82 @@ option go_package = "github.com/cosmos/cosmos-sdk/x/ibc/core/04-channel/types";
|
||||
service Query {
|
||||
// Channel queries an IBC Channel.
|
||||
rpc Channel(QueryChannelRequest) returns (QueryChannelResponse) {
|
||||
option (google.api.http).get = "/ibc/channel/v1beta1/channels/{channel_id}/ports/{port_id}";
|
||||
option (google.api.http).get = "/ibc/core/channel/v1beta1/channels/{channel_id}/ports/{port_id}";
|
||||
}
|
||||
|
||||
// Channels queries all the IBC channels of a chain.
|
||||
rpc Channels(QueryChannelsRequest) returns (QueryChannelsResponse) {
|
||||
option (google.api.http).get = "/ibc/channel/v1beta1/channels";
|
||||
option (google.api.http).get = "/ibc/core/channel/v1beta1/channels";
|
||||
}
|
||||
|
||||
// ConnectionChannels queries all the channels associated with a connection
|
||||
// end.
|
||||
rpc ConnectionChannels(QueryConnectionChannelsRequest) returns (QueryConnectionChannelsResponse) {
|
||||
option (google.api.http).get = "/ibc/channel/v1beta1/connections/{connection}/channels";
|
||||
option (google.api.http).get = "/ibc/core/channel/v1beta1/connections/{connection}/channels";
|
||||
}
|
||||
|
||||
// ChannelClientState queries for the client state for the channel associated
|
||||
// with the provided channel identifiers.
|
||||
rpc ChannelClientState(QueryChannelClientStateRequest) returns (QueryChannelClientStateResponse) {
|
||||
option (google.api.http).get = "/ibc/channel/v1beta1/channels/{channel_id}/ports/{port_id}/client_state";
|
||||
option (google.api.http).get = "/ibc/core/channel/v1beta1/channels/{channel_id}/ports/{port_id}/client_state";
|
||||
}
|
||||
|
||||
// ChannelConsensusState queries for the consensus state for the channel
|
||||
// associated with the provided channel identifiers.
|
||||
rpc ChannelConsensusState(QueryChannelConsensusStateRequest) returns (QueryChannelConsensusStateResponse) {
|
||||
option (google.api.http).get = "/ibc/channel/v1beta1/channels/{channel_id}/ports/{port_id}/consensus_state/version/"
|
||||
"{version_number}/height/{version_height}";
|
||||
option (google.api.http).get =
|
||||
"/ibc/core/channel/v1beta1/channels/{channel_id}/ports/{port_id}/consensus_state/version/"
|
||||
"{version_number}/height/{version_height}";
|
||||
}
|
||||
|
||||
// PacketCommitment queries a stored packet commitment hash.
|
||||
rpc PacketCommitment(QueryPacketCommitmentRequest) returns (QueryPacketCommitmentResponse) {
|
||||
option (google.api.http).get =
|
||||
"/ibc/channel/v1beta1/channels/{channel_id}/ports/{port_id}/packet_commitments/{sequence}";
|
||||
"/ibc/core/channel/v1beta1/channels/{channel_id}/ports/{port_id}/packet_commitments/{sequence}";
|
||||
}
|
||||
|
||||
// PacketCommitments returns all the packet commitments hashes associated
|
||||
// with a channel.
|
||||
rpc PacketCommitments(QueryPacketCommitmentsRequest) returns (QueryPacketCommitmentsResponse) {
|
||||
option (google.api.http).get = "/ibc/channel/v1beta1/channels/{channel_id}/ports/{port_id}/packet_commitments";
|
||||
option (google.api.http).get = "/ibc/core/channel/v1beta1/channels/{channel_id}/ports/{port_id}/packet_commitments";
|
||||
}
|
||||
|
||||
// PacketReceipt queries if a given packet sequence has been received on the queried chain
|
||||
rpc PacketReceipt(QueryPacketReceiptRequest) returns (QueryPacketReceiptResponse) {
|
||||
option (google.api.http).get = "/ibc/channel/v1beta1/channels/{channel_id}/ports/{port_id}/packet_receipts/{sequence}";
|
||||
option (google.api.http).get =
|
||||
"/ibc/core/channel/v1beta1/channels/{channel_id}/ports/{port_id}/packet_receipts/{sequence}";
|
||||
}
|
||||
|
||||
// PacketAcknowledgement queries a stored packet acknowledgement hash.
|
||||
rpc PacketAcknowledgement(QueryPacketAcknowledgementRequest) returns (QueryPacketAcknowledgementResponse) {
|
||||
option (google.api.http).get = "/ibc/channel/v1beta1/channels/{channel_id}/ports/{port_id}/packet_acks/{sequence}";
|
||||
option (google.api.http).get =
|
||||
"/ibc/core/channel/v1beta1/channels/{channel_id}/ports/{port_id}/packet_acks/{sequence}";
|
||||
}
|
||||
|
||||
// PacketAcknowledgements returns all the packet acknowledgements associated
|
||||
// with a channel.
|
||||
rpc PacketAcknowledgements(QueryPacketAcknowledgementsRequest) returns (QueryPacketAcknowledgementsResponse) {
|
||||
option (google.api.http).get = "/ibc/channel/v1beta1/channels/{channel_id}/ports/{port_id}/packet_acknowledgements";
|
||||
option (google.api.http).get =
|
||||
"/ibc/core/channel/v1beta1/channels/{channel_id}/ports/{port_id}/packet_acknowledgements";
|
||||
}
|
||||
|
||||
|
||||
// UnreceivedPackets returns all the unreceived IBC packets associated with a
|
||||
// channel and sequences.
|
||||
rpc UnreceivedPackets(QueryUnreceivedPacketsRequest) returns (QueryUnreceivedPacketsResponse) {
|
||||
option (google.api.http).get = "/ibc/channel/v1beta1/channels/{channel_id}/ports/{port_id}/packet_commitments/"
|
||||
option (google.api.http).get = "/ibc/core/channel/v1beta1/channels/{channel_id}/ports/{port_id}/packet_commitments/"
|
||||
"{packet_commitment_sequences}/unreceived_packets";
|
||||
}
|
||||
|
||||
// UnreceivedAcks returns all the unreceived IBC acknowledgements associated with a
|
||||
// channel and sequences.
|
||||
rpc UnreceivedAcks(QueryUnreceivedAcksRequest) returns (QueryUnreceivedAcksResponse) {
|
||||
option (google.api.http).get = "/ibc/channel/v1beta1/channels/{channel_id}/ports/{port_id}/packet_commitments/"
|
||||
option (google.api.http).get = "/ibc/core/channel/v1beta1/channels/{channel_id}/ports/{port_id}/packet_commitments/"
|
||||
"{packet_ack_sequences}/unreceived_acks";
|
||||
}
|
||||
|
||||
// NextSequenceReceive returns the next receive sequence for a given channel.
|
||||
rpc NextSequenceReceive(QueryNextSequenceReceiveRequest) returns (QueryNextSequenceReceiveResponse) {
|
||||
option (google.api.http).get = "/ibc/channel/v1beta1/channels/{channel_id}/ports/{port_id}/next_sequence";
|
||||
option (google.api.http).get = "/ibc/core/channel/v1beta1/channels/{channel_id}/ports/{port_id}/next_sequence";
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@ -148,7 +148,7 @@ message MsgRecvPacket {
|
||||
option (gogoproto.goproto_getters) = false;
|
||||
|
||||
Packet packet = 1 [(gogoproto.nullable) = false];
|
||||
bytes proof = 2;
|
||||
bytes proof_commitment = 2 [(gogoproto.moretags) = "yaml:\"proof_commitment\""];
|
||||
ibc.core.client.v1.Height proof_height = 3
|
||||
[(gogoproto.moretags) = "yaml:\"proof_height\"", (gogoproto.nullable) = false];
|
||||
string signer = 4;
|
||||
@ -163,7 +163,7 @@ message MsgTimeout {
|
||||
option (gogoproto.goproto_getters) = false;
|
||||
|
||||
Packet packet = 1 [(gogoproto.nullable) = false];
|
||||
bytes proof = 2;
|
||||
bytes proof_unreceived = 2 [(gogoproto.moretags) = "yaml:\"proof_unreceived\""];
|
||||
ibc.core.client.v1.Height proof_height = 3
|
||||
[(gogoproto.moretags) = "yaml:\"proof_height\"", (gogoproto.nullable) = false];
|
||||
uint64 next_sequence_recv = 4 [(gogoproto.moretags) = "yaml:\"next_sequence_recv\""];
|
||||
@ -179,7 +179,7 @@ message MsgTimeoutOnClose {
|
||||
option (gogoproto.goproto_getters) = false;
|
||||
|
||||
Packet packet = 1 [(gogoproto.nullable) = false];
|
||||
bytes proof = 2;
|
||||
bytes proof_unreceived = 2 [(gogoproto.moretags) = "yaml:\"proof_unreceived\""];
|
||||
bytes proof_close = 3 [(gogoproto.moretags) = "yaml:\"proof_close\""];
|
||||
ibc.core.client.v1.Height proof_height = 4
|
||||
[(gogoproto.moretags) = "yaml:\"proof_height\"", (gogoproto.nullable) = false];
|
||||
@ -197,7 +197,7 @@ message MsgAcknowledgement {
|
||||
|
||||
Packet packet = 1 [(gogoproto.nullable) = false];
|
||||
bytes acknowledgement = 2;
|
||||
bytes proof = 3;
|
||||
bytes proof_acked = 3 [(gogoproto.moretags) = "yaml:\"proof_acked\""];
|
||||
ibc.core.client.v1.Height proof_height = 4
|
||||
[(gogoproto.moretags) = "yaml:\"proof_height\"", (gogoproto.nullable) = false];
|
||||
string signer = 5;
|
||||
|
||||
@ -6,91 +6,6 @@ option go_package = "github.com/cosmos/cosmos-sdk/x/ibc/core/02-client/types";
|
||||
import "gogoproto/gogo.proto";
|
||||
import "google/protobuf/any.proto";
|
||||
|
||||
// Msg defines the ibc/client Msg service.
|
||||
service Msg {
|
||||
// CreateClient defines a rpc handler method for MsgCreateClient.
|
||||
rpc CreateClient(MsgCreateClient) returns (MsgCreateClientResponse);
|
||||
|
||||
// UpdateClient defines a rpc handler method for MsgUpdateClient.
|
||||
rpc UpdateClient(MsgUpdateClient) returns (MsgUpdateClientResponse);
|
||||
|
||||
// UpgradeClient defines a rpc handler method for MsgUpgradeClient.
|
||||
rpc UpgradeClient(MsgUpgradeClient) returns (MsgUpgradeClientResponse);
|
||||
|
||||
// SubmitMisbehaviour defines a rpc handler method for MsgSubmitMisbehaviour.
|
||||
rpc SubmitMisbehaviour(MsgSubmitMisbehaviour) returns (MsgSubmitMisbehaviourResponse);
|
||||
}
|
||||
|
||||
// MsgCreateClient defines a message to create an IBC client
|
||||
message MsgCreateClient {
|
||||
option (gogoproto.equal) = false;
|
||||
option (gogoproto.goproto_getters) = false;
|
||||
|
||||
// client unique identifier
|
||||
string client_id = 1 [(gogoproto.moretags) = "yaml:\"client_id\""];
|
||||
// light client state
|
||||
google.protobuf.Any client_state = 2 [(gogoproto.moretags) = "yaml:\"client_state\""];
|
||||
// consensus state associated with the client that corresponds to a given
|
||||
// height.
|
||||
google.protobuf.Any consensus_state = 3 [(gogoproto.moretags) = "yaml:\"consensus_state\""];
|
||||
// signer address
|
||||
string signer = 4;
|
||||
}
|
||||
|
||||
// MsgCreateClientResponse defines the Msg/CreateClient response type.
|
||||
message MsgCreateClientResponse { }
|
||||
|
||||
// MsgUpdateClient defines an sdk.Msg to update a IBC client state using
|
||||
// the given header.
|
||||
message MsgUpdateClient {
|
||||
option (gogoproto.equal) = false;
|
||||
option (gogoproto.goproto_getters) = false;
|
||||
|
||||
// client unique identifier
|
||||
string client_id = 1 [(gogoproto.moretags) = "yaml:\"client_id\""];
|
||||
// header to update the light client
|
||||
google.protobuf.Any header = 2;
|
||||
// signer address
|
||||
string signer = 3;
|
||||
}
|
||||
|
||||
// MsgUpdateClientResponse defines the Msg/UpdateClient response type.
|
||||
message MsgUpdateClientResponse { }
|
||||
|
||||
// MsgUpgradeClient defines an sdk.Msg to upgrade an IBC client to a new client state
|
||||
message MsgUpgradeClient {
|
||||
// client unique identifier
|
||||
string client_id = 1 [(gogoproto.moretags) = "yaml:\"client_id\""];
|
||||
// upgraded client state
|
||||
google.protobuf.Any client_state = 2 [(gogoproto.moretags) = "yaml:\"client_state\""];
|
||||
// height at which old chain halts and upgrades (i.e last block executed)
|
||||
Height upgrade_height = 3 [(gogoproto.moretags) = "yaml:\"upgrade_height\""];
|
||||
// proof that old chain committed to new client
|
||||
bytes proof_upgrade = 4 [(gogoproto.moretags) = "yaml:\"proof_upgrade\""];
|
||||
// signer address
|
||||
string signer = 5;
|
||||
}
|
||||
|
||||
// MsgUpgradeClientResponse defines the Msg/UpgradeClient response type.
|
||||
message MsgUpgradeClientResponse { }
|
||||
|
||||
// MsgSubmitMisbehaviour defines an sdk.Msg type that submits Evidence for
|
||||
// light client misbehaviour.
|
||||
message MsgSubmitMisbehaviour {
|
||||
option (gogoproto.equal) = false;
|
||||
option (gogoproto.goproto_getters) = false;
|
||||
|
||||
// client unique identifier
|
||||
string client_id = 1 [(gogoproto.moretags) = "yaml:\"client_id\""];
|
||||
// misbehaviour used for freezing the light client
|
||||
google.protobuf.Any misbehaviour = 2;
|
||||
// signer address
|
||||
string signer = 3;
|
||||
}
|
||||
|
||||
// MsgSubmitMisbehaviourResponse defines the Msg/SubmitMisbehaviour response type.
|
||||
message MsgSubmitMisbehaviourResponse { }
|
||||
|
||||
// IdentifiedClientState defines a client state with an additional client
|
||||
// identifier field.
|
||||
message IdentifiedClientState {
|
||||
@ -151,3 +66,9 @@ message Height {
|
||||
// the height within the given version
|
||||
uint64 version_height = 2 [(gogoproto.moretags) = "yaml:\"version_height\""];
|
||||
}
|
||||
|
||||
// Params defines the set of IBC light client parameters.
|
||||
message Params {
|
||||
// allowed_clients defines the list of allowed client state types.
|
||||
repeated string allowed_clients = 1 [(gogoproto.moretags) = "yaml:\"allowed_clients\""];
|
||||
}
|
||||
|
||||
@ -9,13 +9,15 @@ import "gogoproto/gogo.proto";
|
||||
// GenesisState defines the ibc client submodule's genesis state.
|
||||
message GenesisState {
|
||||
// client states with their corresponding identifiers
|
||||
repeated IdentifiedClientState clients = 1 [(gogoproto.nullable) = false];
|
||||
repeated IdentifiedClientState clients = 1
|
||||
[(gogoproto.nullable) = false, (gogoproto.castrepeated) = "IdentifiedClientStates"];
|
||||
// consensus states from each client
|
||||
repeated ClientConsensusStates clients_consensus = 2 [
|
||||
(gogoproto.nullable) = false,
|
||||
(gogoproto.castrepeated) = "ClientsConsensusStates",
|
||||
(gogoproto.moretags) = "yaml:\"clients_consensus\""
|
||||
];
|
||||
Params params = 3 [(gogoproto.nullable) = false];
|
||||
// create localhost on initialization
|
||||
bool create_localhost = 3 [(gogoproto.moretags) = "yaml:\"create_localhost\""];
|
||||
bool create_localhost = 4 [(gogoproto.moretags) = "yaml:\"create_localhost\""];
|
||||
}
|
||||
|
||||
@ -13,25 +13,30 @@ option go_package = "github.com/cosmos/cosmos-sdk/x/ibc/core/02-client/types";
|
||||
service Query {
|
||||
// ClientState queries an IBC light client.
|
||||
rpc ClientState(QueryClientStateRequest) returns (QueryClientStateResponse) {
|
||||
option (google.api.http).get = "/ibc/client/v1beta1/client_states/{client_id}";
|
||||
option (google.api.http).get = "/ibc/core/client/v1beta1/client_states/{client_id}";
|
||||
}
|
||||
|
||||
// ClientStates queries all the IBC light clients of a chain.
|
||||
rpc ClientStates(QueryClientStatesRequest) returns (QueryClientStatesResponse) {
|
||||
option (google.api.http).get = "/ibc/client/v1beta1/client_states";
|
||||
option (google.api.http).get = "/ibc/core/client/v1beta1/client_states";
|
||||
}
|
||||
|
||||
// ConsensusState queries a consensus state associated with a client state at
|
||||
// a given height.
|
||||
rpc ConsensusState(QueryConsensusStateRequest) returns (QueryConsensusStateResponse) {
|
||||
option (google.api.http).get = "/ibc/client/v1beta1/consensus_states/{client_id}/version/{version_number}/"
|
||||
option (google.api.http).get = "/ibc/core/client/v1beta1/consensus_states/{client_id}/version/{version_number}/"
|
||||
"height/{version_height}";
|
||||
}
|
||||
|
||||
// ConsensusStates queries all the consensus state associated with a given
|
||||
// client.
|
||||
rpc ConsensusStates(QueryConsensusStatesRequest) returns (QueryConsensusStatesResponse) {
|
||||
option (google.api.http).get = "/ibc/client/v1beta1/consensus_states/{client_id}";
|
||||
option (google.api.http).get = "/ibc/core/client/v1beta1/consensus_states/{client_id}";
|
||||
}
|
||||
|
||||
// ClientParams queries all parameters of the ibc client.
|
||||
rpc ClientParams(QueryClientParamsRequest) returns (QueryClientParamsResponse) {
|
||||
option (google.api.http).get = "/ibc/client/v1beta1/params";
|
||||
}
|
||||
}
|
||||
|
||||
@ -65,7 +70,8 @@ message QueryClientStatesRequest {
|
||||
// method.
|
||||
message QueryClientStatesResponse {
|
||||
// list of stored ClientStates of the chain.
|
||||
repeated IdentifiedClientState client_states = 1;
|
||||
repeated IdentifiedClientState client_states = 1
|
||||
[(gogoproto.nullable) = false, (gogoproto.castrepeated) = "IdentifiedClientStates"];
|
||||
// pagination response
|
||||
cosmos.base.query.v1beta1.PageResponse pagination = 2;
|
||||
}
|
||||
@ -113,3 +119,12 @@ message QueryConsensusStatesResponse {
|
||||
// pagination response
|
||||
cosmos.base.query.v1beta1.PageResponse pagination = 2;
|
||||
}
|
||||
|
||||
// QueryClientParamsRequest is the request type for the Query/ClientParams RPC method.
|
||||
message QueryClientParamsRequest {}
|
||||
|
||||
// QueryClientParamsResponse is the response type for the Query/ClientParams RPC method.
|
||||
message QueryClientParamsResponse {
|
||||
// params defines the parameters of the module.
|
||||
Params params = 1;
|
||||
}
|
||||
|
||||
93
proto/ibc/core/client/v1/tx.proto
Normal file
93
proto/ibc/core/client/v1/tx.proto
Normal file
@ -0,0 +1,93 @@
|
||||
syntax = "proto3";
|
||||
package ibc.core.client.v1;
|
||||
|
||||
option go_package = "github.com/cosmos/cosmos-sdk/x/ibc/core/02-client/types";
|
||||
|
||||
import "gogoproto/gogo.proto";
|
||||
import "google/protobuf/any.proto";
|
||||
import "ibc/core/client/v1/client.proto";
|
||||
|
||||
// Msg defines the ibc/client Msg service.
|
||||
service Msg {
|
||||
// CreateClient defines a rpc handler method for MsgCreateClient.
|
||||
rpc CreateClient(MsgCreateClient) returns (MsgCreateClientResponse);
|
||||
|
||||
// UpdateClient defines a rpc handler method for MsgUpdateClient.
|
||||
rpc UpdateClient(MsgUpdateClient) returns (MsgUpdateClientResponse);
|
||||
|
||||
// UpgradeClient defines a rpc handler method for MsgUpgradeClient.
|
||||
rpc UpgradeClient(MsgUpgradeClient) returns (MsgUpgradeClientResponse);
|
||||
|
||||
// SubmitMisbehaviour defines a rpc handler method for MsgSubmitMisbehaviour.
|
||||
rpc SubmitMisbehaviour(MsgSubmitMisbehaviour) returns (MsgSubmitMisbehaviourResponse);
|
||||
}
|
||||
|
||||
// MsgCreateClient defines a message to create an IBC client
|
||||
message MsgCreateClient {
|
||||
option (gogoproto.equal) = false;
|
||||
option (gogoproto.goproto_getters) = false;
|
||||
|
||||
// client unique identifier
|
||||
string client_id = 1 [(gogoproto.moretags) = "yaml:\"client_id\""];
|
||||
// light client state
|
||||
google.protobuf.Any client_state = 2 [(gogoproto.moretags) = "yaml:\"client_state\""];
|
||||
// consensus state associated with the client that corresponds to a given
|
||||
// height.
|
||||
google.protobuf.Any consensus_state = 3 [(gogoproto.moretags) = "yaml:\"consensus_state\""];
|
||||
// signer address
|
||||
string signer = 4;
|
||||
}
|
||||
|
||||
// MsgCreateClientResponse defines the Msg/CreateClient response type.
|
||||
message MsgCreateClientResponse {}
|
||||
|
||||
// MsgUpdateClient defines an sdk.Msg to update a IBC client state using
|
||||
// the given header.
|
||||
message MsgUpdateClient {
|
||||
option (gogoproto.equal) = false;
|
||||
option (gogoproto.goproto_getters) = false;
|
||||
|
||||
// client unique identifier
|
||||
string client_id = 1 [(gogoproto.moretags) = "yaml:\"client_id\""];
|
||||
// header to update the light client
|
||||
google.protobuf.Any header = 2;
|
||||
// signer address
|
||||
string signer = 3;
|
||||
}
|
||||
|
||||
// MsgUpdateClientResponse defines the Msg/UpdateClient response type.
|
||||
message MsgUpdateClientResponse {}
|
||||
|
||||
// MsgUpgradeClient defines an sdk.Msg to upgrade an IBC client to a new client state
|
||||
message MsgUpgradeClient {
|
||||
// client unique identifier
|
||||
string client_id = 1 [(gogoproto.moretags) = "yaml:\"client_id\""];
|
||||
// upgraded client state
|
||||
google.protobuf.Any client_state = 2 [(gogoproto.moretags) = "yaml:\"client_state\""];
|
||||
// height at which old chain halts and upgrades (i.e last block executed)
|
||||
Height upgrade_height = 3 [(gogoproto.moretags) = "yaml:\"upgrade_height\""];
|
||||
// proof that old chain committed to new client
|
||||
bytes proof_upgrade = 4 [(gogoproto.moretags) = "yaml:\"proof_upgrade\""];
|
||||
// signer address
|
||||
string signer = 5;
|
||||
}
|
||||
|
||||
// MsgUpgradeClientResponse defines the Msg/UpgradeClient response type.
|
||||
message MsgUpgradeClientResponse {}
|
||||
|
||||
// MsgSubmitMisbehaviour defines an sdk.Msg type that submits Evidence for
|
||||
// light client misbehaviour.
|
||||
message MsgSubmitMisbehaviour {
|
||||
option (gogoproto.equal) = false;
|
||||
option (gogoproto.goproto_getters) = false;
|
||||
|
||||
// client unique identifier
|
||||
string client_id = 1 [(gogoproto.moretags) = "yaml:\"client_id\""];
|
||||
// misbehaviour used for freezing the light client
|
||||
google.protobuf.Any misbehaviour = 2;
|
||||
// signer address
|
||||
string signer = 3;
|
||||
}
|
||||
|
||||
// MsgSubmitMisbehaviourResponse defines the Msg/SubmitMisbehaviour response type.
|
||||
message MsgSubmitMisbehaviourResponse {}
|
||||
@ -4,7 +4,7 @@ package ibc.core.commitment.v1;
|
||||
option go_package = "github.com/cosmos/cosmos-sdk/x/ibc/core/23-commitment/types";
|
||||
|
||||
import "gogoproto/gogo.proto";
|
||||
import "tendermint/crypto/proof.proto";
|
||||
import "confio/proofs.proto";
|
||||
|
||||
// MerkleRoot defines a merkle root hash.
|
||||
// In the Cosmos SDK, the AppHash of a block header becomes the root.
|
||||
@ -23,42 +23,18 @@ message MerklePrefix {
|
||||
|
||||
// MerklePath is the path used to verify commitment proofs, which can be an
|
||||
// arbitrary structured object (defined by a commitment type).
|
||||
// MerklePath is represented from root-to-leaf
|
||||
message MerklePath {
|
||||
option (gogoproto.goproto_stringer) = false;
|
||||
|
||||
KeyPath key_path = 1 [(gogoproto.nullable) = false, (gogoproto.moretags) = "yaml:\"key_path\""];
|
||||
repeated string key_path = 1 [(gogoproto.moretags) = "yaml:\"key_path\""];
|
||||
}
|
||||
|
||||
// MerkleProof is a wrapper type that contains a merkle proof.
|
||||
// MerkleProof is a wrapper type over a chain of CommitmentProofs.
|
||||
// It demonstrates membership or non-membership for an element or set of
|
||||
// elements, verifiable in conjunction with a known commitment root. Proofs
|
||||
// should be succinct.
|
||||
// MerkleProofs are ordered from leaf-to-root
|
||||
message MerkleProof {
|
||||
tendermint.crypto.ProofOps proof = 1;
|
||||
}
|
||||
|
||||
// KeyPath defines a slice of keys
|
||||
message KeyPath {
|
||||
option (gogoproto.goproto_stringer) = false;
|
||||
option (gogoproto.goproto_getters) = false;
|
||||
|
||||
repeated Key keys = 1;
|
||||
}
|
||||
|
||||
// Key defines a proof Key
|
||||
message Key {
|
||||
option (gogoproto.goproto_getters) = false;
|
||||
|
||||
bytes name = 1;
|
||||
KeyEncoding enc = 2;
|
||||
}
|
||||
|
||||
// KeyEncoding defines the encoding format of a key's bytes.
|
||||
enum KeyEncoding {
|
||||
option (gogoproto.goproto_enum_prefix) = false;
|
||||
|
||||
// URL encoding
|
||||
KEY_ENCODING_URL_UNSPECIFIED = 0 [(gogoproto.enumvalue_customname) = "URL"];
|
||||
// Hex encoding
|
||||
KEY_ENCODING_HEX = 1 [(gogoproto.enumvalue_customname) = "HEX"];
|
||||
}
|
||||
repeated ics23.CommitmentProof proofs = 1;
|
||||
}
|
||||
@ -14,30 +14,30 @@ option go_package = "github.com/cosmos/cosmos-sdk/x/ibc/core/03-connection/types
|
||||
service Query {
|
||||
// Connection queries an IBC connection end.
|
||||
rpc Connection(QueryConnectionRequest) returns (QueryConnectionResponse) {
|
||||
option (google.api.http).get = "/ibc/connection/v1beta1/connections/{connection_id}";
|
||||
option (google.api.http).get = "/ibc/core/connection/v1beta1/connections/{connection_id}";
|
||||
}
|
||||
|
||||
// Connections queries all the IBC connections of a chain.
|
||||
rpc Connections(QueryConnectionsRequest) returns (QueryConnectionsResponse) {
|
||||
option (google.api.http).get = "/ibc/connection/v1beta1/connections";
|
||||
option (google.api.http).get = "/ibc/core/connection/v1beta1/connections";
|
||||
}
|
||||
|
||||
// ClientConnections queries the connection paths associated with a client
|
||||
// state.
|
||||
rpc ClientConnections(QueryClientConnectionsRequest) returns (QueryClientConnectionsResponse) {
|
||||
option (google.api.http).get = "/ibc/connection/v1beta1/client_connections/{client_id}";
|
||||
option (google.api.http).get = "/ibc/core/connection/v1beta1/client_connections/{client_id}";
|
||||
}
|
||||
|
||||
// ConnectionClientState queries the client state associated with the
|
||||
// connection.
|
||||
rpc ConnectionClientState(QueryConnectionClientStateRequest) returns (QueryConnectionClientStateResponse) {
|
||||
option (google.api.http).get = "/ibc/connection/v1beta1/connections/{connection_id}/client_state";
|
||||
option (google.api.http).get = "/ibc/core/connection/v1beta1/connections/{connection_id}/client_state";
|
||||
}
|
||||
|
||||
// ConnectionConsensusState queries the consensus state associated with the
|
||||
// connection.
|
||||
rpc ConnectionConsensusState(QueryConnectionConsensusStateRequest) returns (QueryConnectionConsensusStateResponse) {
|
||||
option (google.api.http).get = "/ibc/connection/v1beta1/connections/{connection_id}/consensus_state/"
|
||||
option (google.api.http).get = "/ibc/core/connection/v1beta1/connections/{connection_id}/consensus_state/"
|
||||
"version/{version_number}/height/{version_height}";
|
||||
}
|
||||
}
|
||||
|
||||
@ -18,7 +18,7 @@ service Msg {
|
||||
|
||||
// ConnectionOpenAck defines a rpc handler method for MsgConnectionOpenAck.
|
||||
rpc ConnectionOpenAck(MsgConnectionOpenAck) returns (MsgConnectionOpenAckResponse);
|
||||
|
||||
|
||||
// ConnectionOpenConfirm defines a rpc handler method for MsgConnectionOpenConfirm.
|
||||
rpc ConnectionOpenConfirm(MsgConnectionOpenConfirm) returns (MsgConnectionOpenConfirmResponse);
|
||||
}
|
||||
@ -37,7 +37,7 @@ message MsgConnectionOpenInit {
|
||||
}
|
||||
|
||||
// MsgConnectionOpenInitResponse defines the Msg/ConnectionOpenInit response type.
|
||||
message MsgConnectionOpenInitResponse { }
|
||||
message MsgConnectionOpenInitResponse {}
|
||||
|
||||
// MsgConnectionOpenTry defines a msg sent by a Relayer to try to open a
|
||||
// connection on Chain B.
|
||||
@ -48,9 +48,9 @@ message MsgConnectionOpenTry {
|
||||
string client_id = 1 [(gogoproto.moretags) = "yaml:\"client_id\""];
|
||||
string desired_connection_id = 2 [(gogoproto.moretags) = "yaml:\"desired_connection_id\""];
|
||||
string counterparty_chosen_connection_id = 3 [(gogoproto.moretags) = "yaml:\"counterparty_chosen_connection_id\""];
|
||||
google.protobuf.Any client_state = 4 [(gogoproto.moretags) = "yaml:\"client_state\""];
|
||||
Counterparty counterparty = 5 [(gogoproto.nullable) = false];
|
||||
repeated Version counterparty_versions = 6 [(gogoproto.moretags) = "yaml:\"counterparty_versions\""];
|
||||
google.protobuf.Any client_state = 4 [(gogoproto.moretags) = "yaml:\"client_state\""];
|
||||
Counterparty counterparty = 5 [(gogoproto.nullable) = false];
|
||||
repeated Version counterparty_versions = 6 [(gogoproto.moretags) = "yaml:\"counterparty_versions\""];
|
||||
ibc.core.client.v1.Height proof_height = 7
|
||||
[(gogoproto.moretags) = "yaml:\"proof_height\"", (gogoproto.nullable) = false];
|
||||
// proof of the initialization the connection on Chain A: `UNITIALIZED ->
|
||||
@ -66,7 +66,7 @@ message MsgConnectionOpenTry {
|
||||
}
|
||||
|
||||
// MsgConnectionOpenTryResponse defines the Msg/ConnectionOpenTry response type.
|
||||
message MsgConnectionOpenTryResponse { }
|
||||
message MsgConnectionOpenTryResponse {}
|
||||
|
||||
// MsgConnectionOpenAck defines a msg sent by a Relayer to Chain A to
|
||||
// acknowledge the change of connection state to TRYOPEN on Chain B.
|
||||
@ -93,7 +93,7 @@ message MsgConnectionOpenAck {
|
||||
}
|
||||
|
||||
// MsgConnectionOpenAckResponse defines the Msg/ConnectionOpenAck response type.
|
||||
message MsgConnectionOpenAckResponse { }
|
||||
message MsgConnectionOpenAckResponse {}
|
||||
|
||||
// MsgConnectionOpenConfirm defines a msg sent by a Relayer to Chain B to
|
||||
// acknowledge the change of connection state to OPEN on Chain A.
|
||||
@ -110,4 +110,4 @@ message MsgConnectionOpenConfirm {
|
||||
}
|
||||
|
||||
// MsgConnectionOpenConfirmResponse defines the Msg/ConnectionOpenConfirm response type.
|
||||
message MsgConnectionOpenConfirmResponse { }
|
||||
message MsgConnectionOpenConfirmResponse {}
|
||||
|
||||
@ -49,7 +49,6 @@ message Header {
|
||||
// of a sequence and two signatures over different messages at that sequence.
|
||||
message Misbehaviour {
|
||||
option (gogoproto.goproto_getters) = false;
|
||||
option (gogoproto.goproto_stringer) = false;
|
||||
string client_id = 1 [(gogoproto.moretags) = "yaml:\"client_id\""];
|
||||
uint64 sequence = 2;
|
||||
SignatureAndData signature_one = 3 [(gogoproto.moretags) = "yaml:\"signature_one\""];
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue
Block a user