Skip to content

Commit

Permalink
Merge branch 'master' into am-6213-xauthante
Browse files Browse the repository at this point in the history
  • Loading branch information
amaury1093 committed Jul 17, 2020
2 parents 887cab8 + f208b9b commit 9094a39
Show file tree
Hide file tree
Showing 20 changed files with 380 additions and 440 deletions.
23 changes: 9 additions & 14 deletions docs/cn/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -7,30 +7,25 @@ parent:

## 开始

- **[SDK 介绍](./intro/README.md)**:Cosmos SDK的总体概览
- **[快速开始](./using-the-sdk/quick-start.md)**:构建一个标准的基于cosmos sdk的app并启动节点
- **[SDK 开发教程](https://github.com/cosmos/sdk-application-tutorial)**: 一个学习 SDK 的教程。它展示了如何从头开始基于 sdk 构建区块链, 并在此过程中解释了 SDK 的基本原理。


- **[SDK 介绍](./intro/README.md)**:Cosmos SDK 的总体概览
- **[快速开始](./using-the-sdk/quick-start.md)**:构建一个标准的基于 cosmos sdk 的 app 并启动节点
- **[SDK 开发教程](https://github.com/cosmos/sdk-application-tutorial)**: 一个学习 SDK 的教程。它展示了如何从头开始基于 sdk 构建区块链, 并在此过程中解释了 SDK 的基本原理。

## 索引

- **[基础文档](./basics/)**:cosmos sdk的基础概念文档,例如应用结构、交易的生命周期、账户管理等
- **[核心文档](./core/)**: cosmos sdk的核心文档,例如`baseapp``store``server`
- **[基础文档](./basics/)**:cosmos sdk 的基础概念文档,例如应用结构、交易的生命周期、账户管理等
- **[核心文档](./core/)**: cosmos sdk 的核心文档,例如`baseapp``store``server`
- **[构建模块](./building-modules/)**: 对于模块开发者来说的一些重要概念,例如`message``keeper``handler``querier`
- **[接口](./interfaces/)**: 为cosmos应用设计接口的文档


- **[接口](./interfaces/)**: 为 cosmos 应用设计接口的文档

## 开发资源

- **[模块目录](../../x/)**: 模块的实现和文档

- **[规范](./spec/):** Cosmos SDK 的模块及其他规范。
- **[模块目录](../../x/)**:模块的实现和文档
- **[规范](./spec/):** Cosmos SDK 的模块及其他规范。
- **[SDK API 参考](https://godoc.org/github.com/cosmos/cosmos-sdk):** Cosmos SDK Godocs 文档 。
- **[REST API 规范](https://cosmos.network/rpc/):** 通过 REST 与 `gaia` 全节点交互的 API 列表。

## Cosmos Hub
## Cosmos Hub

Cosmos Hub (名为 `gaia`) 文档已经迁移到[这里](https://github.com/cosmos/gaia/tree/master/docs).

Expand Down
6 changes: 3 additions & 3 deletions docs/cn/basics/README.md
Original file line number Diff line number Diff line change
@@ -1,10 +1,10 @@
# 基础文档

此目录包含对cosmos sdk的基础概念介绍
此目录包含对 cosmos sdk 的基础概念介绍

1. [SDK应用解析](./app-anatomy.md)
1. [SDK 应用解析](./app-anatomy.md)
2. [交易的生命周期](./tx-lifecycle.md)
3. [账户系统](./accounts.md)
4. [Gas 和 Fees](./gas-fees.md)

阅读完基础文档后,可以阅读 [核心文档](../core/README.md) 进一步加深对cosmos的理解
阅读完基础文档后,可以阅读 [核心文档](../core/README.md) 进一步加深对 cosmos 的理解
60 changes: 30 additions & 30 deletions docs/cn/basics/accounts.md
Original file line number Diff line number Diff line change
@@ -1,16 +1,16 @@
**原文路径:https://github.com/cosmos/cosmos-sdk/blob/master/docs/basics/accounts.md**

# 账户系统

# 必备阅读 {hide}

- [一个SDK程序的剖析](./app-anatomy.md) {prereq}
- [一个 SDK 程序的剖析](./app-anatomy.md) {prereq}

## 账户定义

在Cosmos SDK中,一个账户是指定的一个公私钥对.公钥可以用于派生出`Addresses`,`Addresses`可以在程序里面的各个模块间区分不同的用户.`Addresses`同样可以和[消息](../building-modules/messages-and-queries.md#messages)进行关联用于确定发消息的账户.私钥一般用于生成签名来证明一个消息是被一个`Addresses`(和私钥关联的`Addresses`)所发送.
在 Cosmos SDK 中,一个账户是指定的一个公私钥对公钥可以用于派生出 `Addresses``Addresses` 可以在程序里面的各个模块间区分不同的用户`Addresses` 同样可以和[消息](../building-modules/messages-and-queries.md#messages)进行关联用于确定发消息的账户私钥一般用于生成签名来证明一个消息是被一个 `Addresses`(和私钥关联的`Addresses`) 所发送

Cosmos SDK使用一套称之为 [BIP32](https://github.com/bitcoin/bips/blob/master/bip-0032.mediawiki)的标准来生成公私钥.这个标准定义了怎么去创建一个HD钱包(钱包就是一批账户的集合).每一个账户的核心,都有一个种子,每一个种子都有一个12或24个字的助记符.使用这个助记符,使用一种单向的加密方法可以派生出任意数量的私钥.公钥可以通过私钥推导出来.当然,助记符是最敏感的信息,因为可以不停通过助记符来重新生成私钥.
Cosmos SDK 使用一套称之为 [BIP32](https://github.com/bitcoin/bips/blob/master/bip-0032.mediawiki) 的标准来生成公私钥。这个标准定义了怎么去创建一个 HD 钱包(钱包就是一批账户的集合)每一个账户的核心都有一个种子,每一个种子都有一个 12 或 24 个字的助记符。使用这个助记符使用一种单向的加密方法可以派生出任意数量的私钥公钥可以通过私钥推导出来。当然,助记符是最敏感的信息因为可以不停通过助记符来重新生成私钥

```
Account 0 Account 1 Account 2
Expand Down Expand Up @@ -52,66 +52,66 @@ Cosmos SDK使用一套称之为 [BIP32](https://github.com/bitcoin/bips/blob/mas
+-------------------+
```

在Cosmos SDK中,账户可以在[`Keybase`](#keybase)中作为一个对象来储存和管理.
在 Cosmos SDK 中,账户可以在 [`Keybase`](#keybase) 中作为一个对象来储存和管理

## Keybase

`Keybase` 是储存和管理账户的对象,在Cosmos SDK中,`Keybase`要实现以下接口
`Keybase` 是储存和管理账户的对象,在 Cosmos SDK 中,`Keybase` 要实现以下接口

+++ https://github.com/cosmos/cosmos-sdk/blob/7d7821b9af132b0f6131640195326aa02b6751db/crypto/keys/types.go#L13-L86
+++ https://githubcom/cosmos/cosmos-sdk/blob/7d7821b9af132b0f6131640195326aa02b6751db/crypto/keys/types.go#L13-L86

在Cosmos SDK中,`Keybase`接口的默认实现对象是`dbKeybase`.
在 Cosmos SDK 中,`Keybase` 接口的默认实现对象是 `dbKeybase`

+++ https://github.com/cosmos/cosmos-sdk/blob/7d7821b9af132b0f6131640195326aa02b6751db/crypto/keys/keybase.go

`dbKeybase`上面对`Keybase`接口中方法实现的笔记:
`dbKeybase` 上面对 `Keybase` 接口中方法实现的笔记:

- `Sign(name, passphrase string, msg []byte) ([]byte, crypto.PubKey, error)``message` 字节进行签名.需要做一些准备工作将`message`编码成 [] byte类型,可以参考`auth`模块`message`准备的例子.注意,SDK上面没有实现签名的验证,签名验证被推迟到[`anteHandler`](#antehandler)中进行
+++ https://github.com/cosmos/cosmos-sdk/blob/7d7821b9af132b0f6131640195326aa02b6751db/x/auth/types/txbuilder.go#L176-L209
- `CreateMnemonic(name string, language Language, passwd string, algo SigningAlgo) (info Info, seed string, err error)`创建一个新的助记符并打印在日志里,但是**并不保存在磁盘上**
- `CreateAccount(name, mnemonic, bip39Passwd, encryptPasswd string, account uint32, index uint32) (Info, error)` 基于[`bip44 path`](https://github.com/bitcoin/bips/blob/master/bip-0044.mediawiki)创建一个新的账户并将其保存在磁盘上.注意私钥在[保存前用密码加密](https://github.com/cosmos/cosmos-sdk/blob/7d7821b9af132b0f6131640195326aa02b6751db/crypto/keys/mintkey/mintkey.go),**永远不会储存未加密的私钥**.在这个方法的上下文中, `account`和 `address` 参数指的是BIP44派生路径的段(例如`0`, `1`, `2`, ...)用于从助记符派生出私钥和公钥(注意:给相同的助记符和 `account`将派生出相同的私钥,给相同的`account``address`也会派生出相同的公钥和`Address`).最后注意`CreateAccount` 方法使用在[Tendermint library](https://github.com/tendermint/tendermint/tree/bc572217c07b90ad9cee851f193aaa8e9557cbc7/crypto/secp256k1)中的`secp256k1` 派生出公私钥和`Address`.总之,这个方法是用来创建用户的钥匙和地址的,并不是共识秘钥,参见[`Addresses`](#addresses) 获取更多信息
- `Sign(name, passphrase string, msg []byte) ([]byte, crypto.PubKey, error)``message` 字节进行签名需要做一些准备工作将 `message` 编码成 []byte 类型,可以参考 `auth` 模块 `message` 准备的例子。注意,SDK 上面没有实现签名的验证,签名验证被推迟到[`anteHandler`](#antehandler)中进行
+++ https://github.com/cosmos/cosmos-sdk/blob/7d7821b9af132b0f6131640195326aa02b6751db/x/auth/types/txbuilder.go#L176-L209
- `CreateMnemonic(name string, language Language, passwd string, algo SigningAlgo) (info Info, seed string, err error)`创建一个新的助记符并打印在日志里但是**并不保存在磁盘上**
- `CreateAccount(name, mnemonic, bip39Passwd, encryptPasswd string, account uint32, index uint32) (Info, error)` 基于[`bip44 path`](https://github.com/bitcoin/bips/blob/master/bip-0044.mediawiki)创建一个新的账户并将其保存在磁盘上注意私钥在[保存前用密码加密](https://github.com/cosmos/cosmos-sdk/blob/7d7821b9af132b0f6131640195326aa02b6751db/crypto/keys/mintkey/mintkey.go),**永远不会储存未加密的私钥**.在这个方法的上下文中, `account`和 `address` 参数指的是 BIP44 派生路径的段(例如`0`, `1`, `2`, ...)用于从助记符派生出私钥和公钥(注意给相同的助记符和 `account` 将派生出相同的私钥给相同的 `account``address` 也会派生出相同的公钥和 `Address`)最后注意 `CreateAccount` 方法使用在 [Tendermint library](https://github.com/tendermint/tendermint/tree/bc572217c07b90ad9cee851f193aaa8e9557cbc7/crypto/secp256k1) 中的 `secp256k1` 派生出公私钥和 `Address`。总之,这个方法是用来创建用户的钥匙和地址的并不是共识秘钥参见[`Addresses`](#addresses) 获取更多信息

`dbKeybase`的实现是最基本的,并没有根据需求提供锁定功能.锁定功能指如果一个`dbKeybase`实例被创建,底层的`db`就被锁定意味着除了实例化它的程序其他程序无法访问它.这就是SDK程序使用另外一套`Keybase` 接口的实现`lazyKeybase`的原因
`dbKeybase` 的实现是最基本的并没有根据需求提供锁定功能锁定功能指如果一个`dbKeybase`实例被创建底层的`db`就被锁定意味着除了实例化它的程序其他程序无法访问它。这就是 SDK 程序使用另外一套 `Keybase` 接口的实现 `lazyKeybase` 的原因

+++ https://github.com/cosmos/cosmos-sdk/blob/7d7821b9af132b0f6131640195326aa02b6751db/crypto/keys/lazy_keybase.go

`lazyKeybase``dbKeybase`的一个简单包装,它仅在要执行操作时锁定数据库,并在之后立即将其解锁。使用`lazyKeybase`[命令行界面](../interfaces/cli.md)可以在 [rest server](../interfaces/rest.md)运行时创建新的账户,它也可以同时传递多个CLI命令
`lazyKeybase``dbKeybase` 的一个简单包装它仅在要执行操作时锁定数据库,并在之后立即将其解锁。使用 `lazyKeybase`[命令行界面](../interfaces/cli.md) 可以在 [rest server](../interfaces/rest.md)运行时创建新的账户,它也可以同时传递多个 CLI 命令

## 地址和公钥

`Addresses``PubKey`在程序里面都是标识一个参与者的公共信息.Cosmos SDK默认提供3中类型的`Addresses``PubKey`
`Addresses` `PubKey` 在程序里面都是标识一个参与者的公共信息Cosmos SDK 默认提供 3 种类型的 `Addresses` `PubKey`

- 基于用户的`Addresses``PubKey`,用于指定用户(例如`message`的发送者).它们通过 **`secp256k1`**曲线推导出来
- 基于验证节点的`Addresses``PubKey`用于指定验证者的操作员,它们通过 **`secp256k1`**曲线推导出来
- 基于共识节点的`Addresses``PubKey`用于指定参与共识的验证着节点,它们通过 **`ed25519`**曲线推导出来
- 基于用户的 `Addresses` `PubKey`用于指定用户(例如 `message` 的发送者)它们通过 **`secp256k1`** 曲线推导出来
- 基于验证节点的 `Addresses` `PubKey` 用于指定验证者的操作员它们通过 **`secp256k1`** 曲线推导出来
- 基于共识节点的 `Addresses` `PubKey` 用于指定参与共识的验证着节点它们通过 **`ed25519`** 曲线推导出来

| | Address bech32 Prefix | Pubkey bech32 Prefix | Curve | Address byte length | Pubkey byte length |
|--------------------|-----------------------|----------------------|-------------|---------------------|--------------------|
| ------------------ | --------------------- | -------------------- | ----------- | ------------------- | ------------------ |
| Accounts | cosmos | cosmospub | `secp256k1` | `20` | `33` |
| Validator Operator | cosmosvaloper | cosmosvaloperpub | `secp256k1` | `20` | `33` |
| Consensus Nodes | cosmosvalcons | cosmosvalconspub | `ed25519` | `20` | `32` |
| Consensus Nodes | cosmosvalcons | cosmosvalconspub | `ed25519` | `20` | `32` |

### 公钥

在Cosmos SDK里面`PubKey`遵循在 tendermint的`crypto`包中定义的`Pubkey`接口
在 Cosmos SDK 里面 `PubKey` 遵循在 tendermint 的 `crypto` 包中定义的 `Pubkey` 接口

+++ https://github.com/tendermint/tendermint/blob/bc572217c07b90ad9cee851f193aaa8e9557cbc7/crypto/crypto.go#L22-L27
+++ https://githubcom/tendermint/tendermint/blob/bc572217c07b90ad9cee851f193aaa8e9557cbc7/crypto/crypto.go#L22-L27

对于`secp256k1` 类型的秘钥,具体的实现可以在[这里](https://github.com/tendermint/tendermint/blob/bc572217c07b90ad9cee851f193aaa8e9557cbc7/crypto/secp256k1/secp256k1.go#L140)找到.对于`ed25519`类型的密钥,具体实现可以在[这里](https://github.com/tendermint/tendermint/blob/bc572217c07b90ad9cee851f193aaa8e9557cbc7/crypto/ed25519/ed25519.go#L135)找到.
对于 `secp256k1` 类型的秘钥具体的实现可以在[这里](https://github.com/tendermint/tendermint/blob/bc572217c07b90ad9cee851f193aaa8e9557cbc7/crypto/secp256k1/secp256k1.go#L140)找到对于`ed25519`类型的密钥具体实现可以在[这里](https://github.com/tendermint/tendermint/blob/bc572217c07b90ad9cee851f193aaa8e9557cbc7/crypto/ed25519/ed25519.go#L135)找到

请注意,在Cosmos SDK中`Pubkeys`并非以其原始格式进行操作。它使用[`Amino`](../core/encoding.md#amino)[`bech32`](https://en.bitcoin.it/wiki/Bech32)进行2次编码.在SDK里面,`Pubkeys`首先调用`Bytes()`方法在原始的 `Pubkey`中(这里面提供amino编码),然后使用`bech32``ConvertAndEncode` 方法
请注意,在 Cosmos SDK 中`Pubkeys` 并非以其原始格式进行操作。它使用 [`Amino`](../core/encoding.md#amino)[`bech32`](https://en.bitcoin.it/wiki/Bech32) 进行 2 次编码。在 SDK 里面,`Pubkeys` 首先调用 `Bytes()` 方法在原始的 `Pubkey` 中(这里面提供 amino 编码),然后使用 `bech32``ConvertAndEncode` 方法

+++ https://github.com/cosmos/cosmos-sdk/blob/7d7821b9af132b0f6131640195326aa02b6751db/types/address.go#L579-L729

### 地址

在Cosmos SDK默认提送3种类型的地址
在 Cosmos SDK 默认提送 3 种类型的地址

- `AccAddress` 用于账户
- `ValAddress` 用于验证者操作员
- `ConsAddress` 用于验证着节点
- `ConsAddress` 用于验证者节点

这些地址类型都是一种长度为20的十六进制编码的`[]byte`数组的别名,这里有一种标准方法从`Pubkey pub`中获取到地址`aa`.
这些地址类型都是一种长度为 20 的十六进制编码的 `[]byte` 数组的别名这里有一种标准方法从`Pubkey pub`中获取到地址`aa`.

```go
aa := sdk.AccAddress(pub.Address().Bytes())
Expand All @@ -121,10 +121,10 @@ aa := sdk.AccAddress(pub.Address().Bytes())

+++ https://github.com/cosmos/cosmos-sdk/blob/7d7821b9af132b0f6131640195326aa02b6751db/types/address.go#L71-L80

值得注意的是,`Marhsal()``Bytes()`方法都返回相同的`[]byte`类型的地址,根据protobuff的兼容性要求我们需要前者.同样,`String()`也被用来返回`bech32`编码类型的地址,这个应该是用户看到的最终编码形式.下面是一个例子:
值得注意的是`Marhsal()``Bytes()` 方法都返回相同的 `[]byte` 类型的地址,根据 protobuf 的兼容性要求我们需要前者。同样,`String()` 也被用来返回 `bech32` 编码类型的地址这个应该是用户看到的最终编码形式下面是一个例子:

+++ https://github.com/cosmos/cosmos-sdk/blob/7d7821b9af132b0f6131640195326aa02b6751db/types/address.go#L229-L243

## 接下来 {hide}

学习[gas and fees](./gas-fees.md) {hide}
学习[gas and fees](./gas-fees.md) {hide}
Loading

0 comments on commit 9094a39

Please sign in to comment.