From 31d6f4fcd43b008287471eaa143703045d660d39 Mon Sep 17 00:00:00 2001 From: Robert Zaremba Date: Fri, 26 Mar 2021 13:02:26 +0100 Subject: [PATCH 1/2] docs: update bech32 account docs --- docs/basics/accounts.md | 23 +++++++++++++---------- 1 file changed, 13 insertions(+), 10 deletions(-) diff --git a/docs/basics/accounts.md b/docs/basics/accounts.md index f19240b95d37..73a8a0783237 100644 --- a/docs/basics/accounts.md +++ b/docs/basics/accounts.md @@ -4,7 +4,7 @@ order: 4 # Accounts -This document describes the in-built accounts system of the Cosmos SDK. {synopsis} +This document describes the in-built account and public key system of the Cosmos SDK. {synopsis} ### Pre-requisite Readings @@ -14,7 +14,7 @@ This document describes the in-built accounts system of the Cosmos SDK. {synopsi In the Cosmos SDK, an _account_ designates a pair of _public key_ `PubKey` and _private key_ `PrivKey`. The `PubKey` can be derived to generate various `Addresses`, which are used to identify users (among other parties) in the application. `Addresses` are also associated with [`message`s](../building-modules/messages-and-queries.md#messages) to identify the sender of the `message`. The `PrivKey` is used to generate [digital signatures](#signatures) to prove that an `Address` associated with the `PrivKey` approved of a given `message`. -For HD key derivation the Cosmos SDK uses a standard called [BIP32](https://github.com/bitcoin/bips/blob/master/bip-0032.mediawiki). The BIP32 allows users to create an HD wallet (as specified in [BIP44(https://github.com/bitcoin/bips/blob/master/bip-0044.mediawiki)]) - a set of accounts derived from an initial secret seed. A seed is usually created from a 12- or 24-word mnemonic. A single seed can derive any number of `PrivKey`s using a one-way cryptographic function. Then, a `PubKey` can be derived from the `PrivKey`. Naturally, the mnemonic is the most sensitive information, as private keys can always be re-generated if the mnemonic is preserved. +For HD key derivation the Cosmos SDK uses a standard called [BIP32](https://github.com/bitcoin/bips/blob/master/bip-0032.mediawiki). The BIP32 allows users to create an HD wallet (as specified in [BIP44](https://github.com/bitcoin/bips/blob/master/bip-0044.mediawiki)) - a set of accounts derived from an initial secret seed. A seed is usually created from a 12- or 24-word mnemonic. A single seed can derive any number of `PrivKey`s using a one-way cryptographic function. Then, a `PubKey` can be derived from the `PrivKey`. Naturally, the mnemonic is the most sensitive information, as private keys can always be re-generated if the mnemonic is preserved. ``` Account 0 Account 1 Account 2 @@ -63,6 +63,8 @@ In the Cosmos SDK, keys are stored and managed by using an object called a [`Key The principal way of authenticating a user is done using [digital signatures](https://en.wikipedia.org/wiki/Digital_signature). Users sign transactions using their own private key. Signature verification is done with the associated public key. For on-chain signature verification purposes, we store the public key in an `Account` object (alongside other data required for a proper transaction validation). +In the node, all data is stored using Protocol Buffers serialization. + The Cosmos SDK supports the following digital key schemes for creating digital signatures: - `secp256k1`, as implemented in the [SDK's `crypto/keys/secp256k1` package](https://github.com/cosmos/cosmos-sdk/blob/v0.42.1/crypto/keys/secp256k1/secp256k1.go). @@ -102,16 +104,16 @@ sdk.AccAddress(pub.Address().Bytes()) Of note, the `Marshal()` and `Bytes()` method both return the same raw `[]byte` form of the address. `Marshal()` is required for Protobuf compatibility. -Addresses and public keys are formatted using [Bech32](https://en.bitcoin.it/wiki/Bech32) and implemented by the `String` method. The Bech32 method is the only supported format to use when interacting with a blockchain. The Bech32 human-readable part (Bech32 prefix) is used to denote an address type. Example: +For user interaction, addresses are formatted using [Bech32](https://en.bitcoin.it/wiki/Bech32) and implemented by the `String` method. The Bech32 method is the only supported format to use when interacting with a blockchain. The Bech32 human-readable part (Bech32 prefix) is used to denote an address type. Example: +++ https://github.com/cosmos/cosmos-sdk/blob/v0.42.1/types/address.go#L230-L244 -| | Address bech32 Prefix | Pubkey bech32 Prefix | -| ------------------ | --------------------- | -------------------- | -| Accounts | cosmos | cosmospub | -| Validator Operator | cosmosvaloper | cosmosvaloperpub | -| Consensus Nodes | cosmosvalcons | cosmosvalconspub | +| | Address bech32 Prefix | +| ------------------ | --------------------- | +| Accounts | cosmos | +| Validator Operator | cosmosvaloper | +| Consensus Nodes | cosmosvalcons | ### Public Keys @@ -126,9 +128,10 @@ A compressed format is used for `secp256k1` and `secp256r1` serialization. This prefix is followed by the `x`-coordinate. -Like `Address`, Bech32 is used to format `PubKey` and for all communication with a blockchain: +Public Keys are not used to reference accounts (or users) and in general are not used when composing transaction messages (with few exceptions: `MsgCreateValidator`, `Validator` and `Multisig` messages). +For user interactions, `PubKey` is formatted using Protobufs JSON ([ProtoMarshalJSON](https://github.com/cosmos/cosmos-sdk/blob/release/v0.42.x/codec/json.go#L12) function). Example: -+++ https://github.com/cosmos/cosmos-sdk/blob/v0.40.0-rc3/types/address.go#L579-L729 ++++ https://github.com/cosmos/cosmos-sdk/blob/7568b66/crypto/keyring/output.go#L23-L39 ## Keyring From 37b88d080e12ad8cda56d18123af0065610ca7de Mon Sep 17 00:00:00 2001 From: Robert Zaremba Date: Fri, 26 Mar 2021 13:19:38 +0100 Subject: [PATCH 2/2] docs: update other places for bech32 and pubkeys --- docs/architecture/adr-028-public-key-addresses.md | 2 +- docs/basics/accounts.md | 2 +- docs/core/node.md | 4 ++-- docs/migrations/rest.md | 2 +- docs/spec/addresses/bech32.md | 9 +++------ 5 files changed, 8 insertions(+), 11 deletions(-) diff --git a/docs/architecture/adr-028-public-key-addresses.md b/docs/architecture/adr-028-public-key-addresses.md index bacaec79cb7d..91c52e810d5e 100644 --- a/docs/architecture/adr-028-public-key-addresses.md +++ b/docs/architecture/adr-028-public-key-addresses.md @@ -69,7 +69,7 @@ In the issue we discussed various modifications: ### Scope This ADR only defines a process for the generation of address bytes. For end-user interactions with addresses (through the API, or CLI, etc.), we still use bech32 to format these addresses as strings. This ADR doesn't change that. -Using bech32 for string encoding gives us support for checksum error codes and handling of user typos. +Using Bech32 for string encoding gives us support for checksum error codes and handling of user typos. ## Decision diff --git a/docs/basics/accounts.md b/docs/basics/accounts.md index 73a8a0783237..0e06c9c86f81 100644 --- a/docs/basics/accounts.md +++ b/docs/basics/accounts.md @@ -109,7 +109,7 @@ For user interaction, addresses are formatted using [Bech32](https://en.bitcoin. +++ https://github.com/cosmos/cosmos-sdk/blob/v0.42.1/types/address.go#L230-L244 -| | Address bech32 Prefix | +| | Address Bech32 Prefix | | ------------------ | --------------------- | | Accounts | cosmos | | Validator Operator | cosmosvaloper | diff --git a/docs/core/node.md b/docs/core/node.md index 4a4fec9a3177..132b6a8a84ef 100644 --- a/docs/core/node.md +++ b/docs/core/node.md @@ -17,11 +17,11 @@ The full-node client of any SDK application is built by running a `main` functio In general, developers will implement the `main.go` function with the following structure: - First, an [`appCodec`](./encoding.md) is instantiated for the application. -- Then, the `config` is retrieved and config parameters are set. This mainly involves setting the bech32 prefixes for [addresses and pubkeys](../basics/accounts.md#addresses-and-pubkeys). +- Then, the `config` is retrieved and config parameters are set. This mainly involves setting the Bech32 prefixes for [addresses](../basics/accounts.md#addresses). +++ https://github.com/cosmos/cosmos-sdk/blob/v0.40.0-rc3/types/config.go#L13-L24 - Using [cobra](https://github.com/spf13/cobra), the root command of the full-node client is created. After that, all the custom commands of the application are added using the `AddCommand()` method of `rootCmd`. - Add default server commands to `rootCmd` using the `server.AddCommands()` method. These commands are separated from the ones added above since they are standard and defined at SDK level. They should be shared by all SDK-based applications. They include the most important command: the [`start` command](#start-command). -- Prepare and execute the `executor`. +- Prepare and execute the `executor`. +++ https://github.com/tendermint/tendermint/blob/v0.34.0-rc6/libs/cli/setup.go#L74-L78 See an example of `main` function from the `simapp` application, the SDK's application for demo purposes: diff --git a/docs/migrations/rest.md b/docs/migrations/rest.md index b3ff87ba90ec..93f890a7718b 100644 --- a/docs/migrations/rest.md +++ b/docs/migrations/rest.md @@ -25,7 +25,7 @@ Some important information concerning all legacy REST endpoints: | `GET /txs/{hash}` | Query tx by hash | Endpoint will error when trying to output transactions that don't support Amino serialization (e.g. IBC txs)1. | | `GET /txs` | Query tx by events | Endpoint will error when trying to output transactions that don't support Amino serialization (e.g. IBC txs)1. | | `GET /gov/proposals/{id}/votes`, `GET /gov/proposals/{id}/votes/{voter}` | Gov endpoints for querying votes | All gov endpoints which return votes return int32 in the `option` field instead of string: `1=VOTE_OPTION_YES, 2=VOTE_OPTION_ABSTAIN, 3=VOTE_OPTION_NO, 4=VOTE_OPTION_NO_WITH_VETO`. | -| `GET /staking/*` | Staking query endpoints | All staking endpoints which return validators have two breaking changes. First, the validator's `consensus_pubkey` field returns an Amino-encoded struct representing an `Any` instead of a bech32-encoded string representing the pubkey. The `value` field of the `Any` is the pubkey's raw key as base64-encoded bytes. Second, the validator's `status` field now returns an int32 instead of string: `1=BOND_STATUS_UNBONDED`, `2=BOND_STATUS_UNBONDING`, `3=BOND_STATUS_BONDED`. | +| `GET /staking/*` | Staking query endpoints | All staking endpoints which return validators have two breaking changes. First, the validator's `consensus_pubkey` field returns an Amino-encoded struct representing an `Any` instead of a Bech32-encoded string representing the pubkey. The `value` field of the `Any` is the pubkey's raw key as base64-encoded bytes. Second, the validator's `status` field now returns an int32 instead of string: `1=BOND_STATUS_UNBONDED`, `2=BOND_STATUS_UNBONDING`, `3=BOND_STATUS_BONDED`. | | `GET /staking/validators` | Get all validators | BondStatus is now a protobuf enum instead of an int32, and JSON serialized using its protobuf name, so expect query parameters like `?status=BOND_STATUS_{BONDED,UNBONDED,UNBONDING}` as opposed to `?status={bonded,unbonded,unbonding}`. | 1: Transactions that don't support Amino serialization are the ones that contain one or more `Msg`s that are not registered with the Amino codec. Currently in the SDK, only IBC `Msg`s fall into this case. diff --git a/docs/spec/addresses/bech32.md b/docs/spec/addresses/bech32.md index 7f0babb144b3..0fc5311fd99c 100644 --- a/docs/spec/addresses/bech32.md +++ b/docs/spec/addresses/bech32.md @@ -1,6 +1,6 @@ # Bech32 on Cosmos -The Cosmos network prefers to use the Bech32 address format wherever users must handle binary data. Bech32 encoding provides robust integrity checks on data and the human readable part(HRP) provides contextual hints that can assist UI developers with providing informative error messages. +The Cosmos network prefers to use the Bech32 address format wherever users must handle binary data. Bech32 encoding provides robust integrity checks on data and the human readable part (HRP) provides contextual hints that can assist UI developers with providing informative error messages. In the Cosmos network, keys and addresses may refer to a number of different roles in the network like accounts, validators etc. @@ -9,16 +9,13 @@ In the Cosmos network, keys and addresses may refer to a number of different rol | HRP | Definition | | ---------------- | ------------------------------------- | | cosmos | Cosmos Account Address | -| cosmospub | Cosmos Account Public Key | | cosmosvalcons | Cosmos Validator Consensus Address | -| cosmosvalconspub | Cosmos Validator Consensus Public Key | | cosmosvaloper | Cosmos Validator Operator Address | -| cosmosvaloperpub | Cosmos Validator Operator Public Key | ## Encoding While all user facing interfaces to Cosmos software should exposed Bech32 interfaces, many internal interfaces encode binary value in hex or base64 encoded form. -To covert between other binary representation of addresses and keys, it is important to first apply the Amino encoding process before bech32 encoding. +To covert between other binary representation of addresses and keys, it is important to first apply the Amino encoding process before Bech32 encoding. -A complete implementation of the Amino serialization format is unnecessary in most cases. Simply prepending bytes from this [table](https://github.com/tendermint/spec/blob/master/spec/blockchain/encoding.md#public-key-cryptography) to the byte string payload before bech32 encoding will sufficient for compatible representation. +A complete implementation of the Amino serialization format is unnecessary in most cases. Simply prepending bytes from this [table](https://github.com/tendermint/spec/blob/master/spec/blockchain/encoding.md#public-key-cryptography) to the byte string payload before Bech32 encoding will sufficient for compatible representation.