Merge PR #3955: update docs chinese translation

This commit is contained in:
wangjj9219 2019-03-23 03:06:55 +08:00 committed by Jack Zampolin
parent 9b27901b2a
commit 160928b8f3
18 changed files with 2310 additions and 0 deletions

View File

@ -0,0 +1,23 @@
# gaia文档
欢迎阅读`Gaia`文档。 `Gaia`是Cosmos Hub目前的应用程序名。
## 加入Cosmos Hub主网
- [安装`gaia`程序](./installation.md)
- [启动一个全节点并加入主网](./join-mainnet.md)
- [升级成一个验证人节点](./validators/validator-setup.md)
## 加入Cosmos Hub公共测试网
- [加入测试网](./join-testnet.md)
## 部署你自己的`gaia`测试网络
- [部署你自己的`gaia`测试网](./deploy-testnet.md)
## 额外资源
- [验证人介绍](./validators/overview.md)
- [验证人问答](./validators/validator-faq.md)
- [验证人安全性考量](./validators/security.md)

View File

@ -0,0 +1,258 @@
# 部署你自己的测试网
这篇文章介绍了三种创建`gaiad`节点的测试网的方式,每种针对不同的使用场景:
1. 单节点,本地的,手动的测试网
2. 多节点,本地的,自动的测试网
3. 多节点,远程的,自动的测试网
支持代码可以在[networks目录](https://github.com/cosmos/cosmos-sdk/tree/develop/networks)中找到,还可以在`local`或`remote`子目录中找到。
> 注意:`remote`网络引导教程可能与最新版本不同步,不可完全依赖。
## 可获取的Docker镜像
如果你需要使用或部署gaia作为容器你可以跳过`build`步骤并使用官方镜像,$TAG标识你感兴趣的版本
+ `docker run -it -v ~/.gaiad:/root/.gaiad -v ~/.gaiacli:/root/.gaiacli tendermint:$TAG gaiad init`
+ `docker run -it -p 26657:26657 -p 26656:26656 -v ~/.gaiad:/root/.gaiad -v ~/.gaiacli:/root/.gaiacli tendermint:$TAG gaiad start`
+ ...
+ `docker run -it -v ~/.gaiad:/root/.gaiad -v ~/.gaiacli:/root/.gaiacli tendermint:$TAG gaiacli version`
相同的镜像也可以用于构建你自己的docker-compose栈
## 单节点,本地的,手动的测试网
本教程可帮助你创建一个在本地运行网络的验证人节点,以进行测试和其他相关的用途。
### 需要
+ [安装gaia](./installation.md)
+ [安装`jq`](https://stedolan.github.io/jq/download/)(可选的)
### 创建genesis文件并启动网络
```bash
# You can run all of these commands from your home directory
cd $HOME
# Initialize the genesis.json file that will help you to bootstrap the network
gaiad init --chain-id=testing testing
# Create a key to hold your validator account
gaiacli keys add validator
# Add that key into the genesis.app_state.accounts array in the genesis file
# NOTE: this command lets you set the number of coins. Make sure this account has some coins
# with the genesis.app_state.staking.params.bond_denom denom, the default is staking
gaiad add-genesis-account $(gaiacli keys show validator -a) 1000000000stake,1000000000validatortoken
# Generate the transaction that creates your validator
gaiad gentx --name validator
# Add the generated bonding transaction to the genesis file
gaiad collect-gentxs
# Now its safe to start `gaiad`
gaiad start
```
启动将会把`gaiad`相关的所有数据放在`~/.gaiad`目录。你可以检查所创建的genesis文件——`~/.gaiad/config/genesis.json`。同时`gaiacli`也已经配置完成并且有了一个拥有token的账户(stake和自定义的代币)。
## 多节点,本地的,自动的测试网
在[networks/local目录](https://github.com/cosmos/cosmos-sdk/tree/develop/networks/local)中运行如下命令:
### 需要
+ [安装gaia](./installation.md)
+ [安装docker](https://docs.docker.com/install/)
+ [安装docker-compose](https://docs.docker.com/compose/install/)
### 编译
编译`gaiad`二进制文件(linux)和运行`localnet`命令所需的`tendermint/gaianode` docker images。这个二进制文件将被安装到container中并且可以更新重建image因此您只需要构建一次image。
```
# Work from the SDK repo
cd $GOPATH/src/github.com/cosmos/cosmos-sdk
# Build the linux binary in ./build
make build-linux
# Build tendermint/gaiadnode image
make build-docker-gaiadnode
```
### 运行你的测试网
运行一个拥有4个节点的测试网络:
```bash
make localnet-start
```
此命令使用gaiadnode image创建了一个4节点网络。每个节点的端口可以在下表中找到
| `Node ID` | `P2P Port` | `RPC Port` |
| ----- | ----- | ---- |
| `gaianode0` | `26656` | `26657` |
| `gaianode1` | `26659` | `26660` |
| `gaianode2` | `26661` | `26662` |
| `gaianode3` | `26663` | `26664` |
更新可执行程序,只需要重新编译并重启节点:
```bash
make build-linux localnet-start
```
### 配置
`make localnet-start`命令通过调用`gaiad testnet`命令在`./build`中创建了一个4节点测试网络的文件。输出`./build`目录下一些文件:
```bash
$ tree -L 2 build/
build/
├── gaiacli
├── gaiad
├── gentxs
│ ├── node0.json
│ ├── node1.json
│ ├── node2.json
│ └── node3.json
├── node0
│ ├── gaiacli
│ │ ├── key_seed.json
│ │ └── keys
│ └── gaiad
│ ├── ${LOG:-gaiad.log}
│ ├── config
│ └── data
├── node1
│ ├── gaiacli
│ │ └── key_seed.json
│ └── gaiad
│ ├── ${LOG:-gaiad.log}
│ ├── config
│ └── data
├── node2
│ ├── gaiacli
│ │ └── key_seed.json
│ └── gaiad
│ ├── ${LOG:-gaiad.log}
│ ├── config
│ └── data
└── node3
├── gaiacli
│ └── key_seed.json
└── gaiad
├── ${LOG:-gaiad.log}
├── config
└── data
```
每个`./build/nodeN`目录被挂载到对应container的`/gaiad`目录。
### 日志输出
日志被保存在每个`./build/nodeN/gaiad/gaia.log`文件中。你也可以直接通过Docker来查看日志
```bash
docker logs -f gaiadnode0
```
### 密钥&账户
你需要使用指定节点的`gaiacli`目录作为你的`home`来同`gaiacli`交互,并执行查询或者创建交易:
```bash
gaiacli keys list --home ./build/node0/gaiacli
```
现在账户已经存在了,你可以创建新的账户并向其发送资金!
::: 提示
注意:每个节点的密钥种子放在`./build/nodeN/gaiacli/key_seed.json`中,可以通过`gaiacli keys add --restore`命令来回复。
:::
### 特殊的可执行程序
如果你拥有多个不同名称的可执行程序则可以使用BINARY环境变量指定要运行的可执行程序。可执行程序的路径是相对于挂载的卷。例如
```
# Run with custom binary
BINARY=gaiafoo make localnet-start
```
## 多节点,远程的,自动的测试网
应该从[networks目录](https://github.com/cosmos/cosmos-sdk/tree/develop/networks)运行下面的命令。
### Terraform & Ansible
使用[Terraform](https://www.terraform.io/)在AWS上创建服务器然后用[Ansible](https://www.ansible.com/)创建并管理这些服务器上的测试网来完成自动部署。
### 前提
+ 在一台Linux机器上安装[Terraform](https://www.terraform.io/downloads.html)和[Ansible](https://docs.ansible.com/ansible/latest/installation_guide/intro_installation.html)
+ 创建一个具有EC2实例创建能力的[ASW API token](https://docs.aws.amazon.com/general/latest/gr/managing-aws-access-keys.html)
+ 创建SSH密钥
```
export AWS_ACCESS_KEY_ID="2345234jk2lh4234"
export AWS_SECRET_ACCESS_KEY="234jhkg234h52kh4g5khg34"
export TESTNET_NAME="remotenet"
export CLUSTER_NAME= "remotenetvalidators"
export SSH_PRIVATE_FILE="$HOME/.ssh/id_rsa"
export SSH_PUBLIC_FILE="$HOME/.ssh/id_rsa.pub"
```
`terraform`和`ansible`都会使用到。
### 创建一个远程网络
```
SERVERS=1 REGION_LIMIT=1 make validators-start
```
测试网络的名称将由`--chain-id`定义集群的名称则是AWS中服务器管理标识。该代码将在每个可用区中创建服务器数量的服务器最多为REGION_LIMIT从us-east-2开始。us-east-1被排除在外下面的BaSH脚本也是如此但更便于输入。
```
./new-testnet.sh "$TESTNET_NAME" "$CLUSTER_NAME" 1 1
```
### 快速查询状态入口
```
make validators-status
```
### 删除服务器
```
make validators-stop
```
### 日志输出
你可以将日志发送到Logz.io一个Elastic栈Elastic搜索Logstash和Kibana服务提供商。你可以将节点设置为自动登录。创建一个帐户并从此页面上的说明中获取你的API密钥然后
```
yum install systemd-devel || echo "This will only work on RHEL-based systems."
apt-get install libsystemd-dev || echo "This will only work on Debian-based systems."
go get github.com/mheese/journalbeat
ansible-playbook -i inventory/digital_ocean.py -l remotenet logzio.yml -e LOGZIO_TOKEN=ABCDEFGHIJKLMNOPQRSTUVWXYZ012345
```
### 监控
你可以安装DataDog代理
```
make datadog-install
```

View File

@ -0,0 +1,723 @@
# Gaia客户端
## Gaia CLI
::: 注意
如果你收到了下面这条错误消息:
```bash
Must specify these options: --chain-id when --trust-node is false
```
你必须选择是否要验证轻客户端的证明。如果你信任要查询的节点,则可以简单地传递`--trust-node=true` -- 否则你需要指定`--chain-id`。
:::
`gaiacli`是管理Cosmos测试网上的帐户和交易的命令行操作界面。它的配置文件位于`$HOME/.gaiacli/config/config.toml`中,可以手动编辑或通过`gaiacli config`命令编辑:
```bash
gaiacli config chain-id cosmoshub-1
```
有关命令用法的更多信息,请参阅其帮助信息:`gaiacli config --help`。
以下是有用的`gaiacli`命令列表,包括用法示例。
### Key
#### Key类型
有如下类型的key
+ `cosmos` :通过`gaiacli keys add`
+ 从通过`gaiacli keys add`生成的账户私钥中产生
+ 用于接收资金
+ 例如 `cosmos15h6vd5f0wqps26zjlwrc6chah08ryu4hzzdwhc`
+ `cosmosvaloper`
+ 用于关联一个验证人和其操作者
+ 用于发起staking操作命令
+ 例如 `cosmosvaloper1carzvgq3e6y3z5kz5y6gxp3wpy3qdrv928vyah`
+ `cosmospub`
+ 从通过`gaiacli keys add`生成的账户私钥中产生
+ 例如 `cosmospub1zcjduc3q7fu03jnlu2xpl75s2nkt7krm6grh4cc5aqth73v0zwmea25wj2hsqhlqzm`
+ `cosmosvalconspub`
+ 在使用`gaiad init`创建节点时生成
+ 使用`gaiad tendermint show-validator`获得该值
+ 例如 `cosmosvalconspub1zcjduepq0ms2738680y72v44tfyqm3c9ppduku8fs6sr73fx7m666sjztznqzp2emf`
#### 生成key
你需要一个帐户的私钥公钥对(分别称作`sk``pk`)才能接收资金,发送交易,绑定交易等等。
生成一个新的*secp256k1*密钥:
```bash
gaiacli keys add <account_name>
```
接下来,你必须创建一个密码来保护磁盘上的密钥。上述命令的输出将包含种子短语。建议将种子短语保存在安全的地方,以便在忘记密码的情况下,最终可以使用以下命令从种子短语重新生成密钥:
```bash
gaiacli keys add --recover
```
如果你检查你的私钥,你会看到`<account_name>` :
```bash
gaiacli keys show <account_name>
```
通过下面的命令查看验证人操作者的地址:
```bash
gaiacli keys show <account_name> --bech=val
```
你可以查看你所有的可以使用的密钥:
```bash
gaiacli keys list
```
查看你节点的验证人公钥:
```bash
gaiad tendermint show-validator
```
请注意这是Tendermint的签名密钥而不是你在委托交易中使用的操作员密钥。
::: 警告
我们强烈建议不要对多个密钥使用相同的密码。Tendermint团队和Interchain Foundation将不承担资金损失的责任。
:::
#### 生成多签公钥
你可以生成一个多签公钥并将其打印:
```bash
gaiacli keys add --multisig=name1,name2,name3[...] --multisig-threshold=K new_key_name
```
`K`是将要对多签公钥发起的交易进行签名的最小私钥数。
`--multisig`标识必须包含要将组合成一个公钥的那些子公钥的名称,该公钥将在本地数据库中生成并存储为`new_key_name`。通过`--multisig`提供的所有名称必须已存在于本地数据库中。除非设置了`--nosort`标识,否则在命令行上提供密钥的顺序无关紧要,即以下命令生成两个相同的密钥:
```bash
gaiacli keys add --multisig=foo,bar,baz --multisig-threshold=2 multisig_address
gaiacli keys add --multisig=baz,foo,bar --multisig-threshold=2 multisig_address
```
多签地址也可以在运行中生成并通过以下命令打印:
```bash
gaiacli keys show --multisig-threshold K name1 name2 name3 [...]
```
有关如何生成多签帐户,使用其签名和广播多签交易的详细信息,请参阅[多签交易]()
### fee和gas
每笔交易可能会提供fee或gas price但不能同时提供。大多数用户通常会提供fee因为这是你将为最终被记入帐本中的交易提供的费用。
验证人可以配置最低gas price多币种的并且在决定它们是否能被包含在区块中的`CheckTx`期间使用改值,其中 `gasPrices >= minGasPrices`。请注意,你的交易必须提供大于或等于验证人要求的任何接受币种的费用。
注意有了这样的机制验证人可能会开始在mempool中通过gasPrice来优先处理某些txs因此提供更高fee或gas price可能会产生更高的tx优先级。
比如:
```bash
gaiacli tx send ... --fees=100photino
```
或:
```bash
gaiacli tx send ... --gas-prices=0.000001stake
```
### 账户
#### 获取token
获取token的最佳方式是通过[Cosmos测试网水龙头](https://faucetcosmos.network)。如果水龙头对你不生效,尝试在[#cosmos-validator](https://riot.im/app/#/room/#cosmos-validators:matrix.org)上向人索要。水龙头需要你打算用于抵押股权的`cosmos`开头的地址。
#### 查询账户余额
在你的地址收到token后你可以通过以下命令查看账户的余额
```bash
gaiacli query account <account_cosmos>
```
::: 注意
当你查询余额为零的帐户时,你将收到以下错误:`No account with address <account_cosmos> was found in the state.` 如果你在节点与区块链完全同步之前就查询,也会发生这种情况。这些都很正常。
:::
#### 发送token
你可以通过如下命令从一个账户发送资金到另一个账户:
```bash
gaiacli tx send <destination_cosmos> 10faucetToken \
--chain-id=<chain_id> \
--from=<key_name> \
```
::: 注意
`--amount`标识接收格式:`--amount=<value|coin_name>`
:::
::: 注意
你可能希望通过`--gas`标识限制交易可以消耗的最大燃料。如果你通过`--gas=auto`将在执行交易前自动估gas。gas估算可能是不准确的因为状态变化可能发生在模拟结束和交易的实际执行之间因此在原始估计之上应用调整以确保能够成功地广播交易。可以通过`--gas-adjustment`标识控制调整其默认值为1.0。
:::
现在,查看源账户和目标账户的更新后的余额:
```bash
gaiacli query account <account_cosmos>
gaiacli query account <destination_cosmos>
```
你还可以使用`--block`标识查询在特定高度区块下你的余额:
```bash
gaiacli query account <account_cosmos> --block=<block_height>
```
你可以通过在命令行中附加`--dry-run`标识来模拟交易而不实际广播它:
```bash
gaiacli tx send <destination_cosmosaccaddr> 10faucetToken \
--chain-id=<chain_id> \
--from=<key_name> \
--dry-run
```
此外,你可以通过将`--generate-only`附加到命令行参数列表来构建交易并将其JSON格式打印到STDOUT
```bash
gaiacli tx send <destination_cosmosaccaddr> 10faucetToken \
--chain-id=<chain_id> \
--from=<key_name> \
--generate-only > unsignedSendTx.json
```
```bash
gaiacli tx sign \
--chain-id=<chain_id> \
--from=<key_name>
unsignedSendTx.json > signedSendTx.json
```
你可以通过下面的命令验证交易的签名:
```bash
gaiacli tx sign --validate-signatures signedSendTx.json
```
你可以将由JSON文件提供的已签名的交易广播至指定节点
```bash
gaiacli tx broadcast --node=<node> signedSendTx.json
```
### 查询交易
#### 匹配一组tag
你可以使用交易搜索命令查询与每个交易上添加的特定`标签集`匹配的交易。
每个标签都由`<tag>:<value>`形式的键值对形成。还可以使用``符号组合标签来查询更具体的结果。
使用`标签`查询交易的命令如下:
```bash
gaiacli query txs --tags='<tag>:<value>'
```
使用多个`标签`:
```bash
gaiacli query txs --tags='<tag1>:<value1>&<tag2>:<value2>'
```
通过`page`和`limit`来实现分页:
```bash
gaiacli query txs --tags='<tag>:<value>' --page=1 --limit=20
```
::: 注意
action标签始终等于相关message的Type()函数返回的消息类型。
你可以在每个SDK的模块中找到目前的标签列表
+ [Common tags](https://github.com/cosmos/cosmos-sdk/blob/d1e76221d8e28824bb4791cb4ad8662d2ae9051e/types/tags.go#L57-L63)
+ [Staking tags](https://github.com/cosmos/cosmos-sdk/blob/master/x/staking/tags/tags.go#L8-L24)
+ [Governance tags](https://github.com/cosmos/cosmos-sdk/blob/master/x/gov/tags/tags.go#L8-L24)
+ [Slashing tags](https://github.com/cosmos/cosmos-sdk/blob/master/x/slashing/tags/tags.go#L8-L24)
+ [Distribution tags](https://github.com/cosmos/cosmos-sdk/blob/master/x/distribution/tags/tags.go#L8-L24)
+ [Bank tags](https://github.com/cosmos/cosmos-sdk/blob/master/x/bank/tags.go#L8-L24)
:::
#### 匹配一笔交易的hash
你一可以通过指定hash值查询该笔交易
```bash
gaiacli query tx [hash]
```
### Slashing
#### Unjailing
将你入狱的验证人释放出狱:
```bash
gaiacli tx slashing unjail --from <validator-operator-addr>
```
#### Signing Info
检索一个验证人的签名信息:
```bash
gaiacli query slashing signing-info <validator-pubkey>
```
#### 查询参数
你可以查询当前的slashing参数
```bash
gaiacli query slashing params
```
### Staking
#### 设置一个验证人
有关如何设置验证人候选者的完整指南,请参阅[验证人设置]()章节
#### 向一个验证人委托
一旦主网上线,你可以把`atom`委托给一个验证人。这些委托人可以收到部分验证人的收益。阅读[Cosmos Token Model](https://github.com/cosmos/cosmos/raw/master/Cosmos_Token_Model.pdf)了解更多信息。
#### 查询验证人
你可以查询指定链的验证人:
```bash
gaiacli query staking validators
```
如果你想要获得单个验证人的信息,你可以使用下面的命令:
```bash
gaiacli query staking validator <account_cosmosval>
```
#### 绑定token
在Cosmos Hub主网中我们绑定`uatom``1atom = 1000000uatom`。你可以把token绑定在一个测试网验证人节点上即委托
```bash
gaiacli tx staking delegate \
--amount=10000000uatom \
--validator=<validator> \
--from=<key_name> \
--chain-id=<chain_id>
```
`<validator>`是你要委托的验证人的操作者地址。如果你运行的是本地testnet可以通过以下方式找到
```bash
gaiacli keys show [name] --bech val
```
其中`[name]`是初始化`gaiad`时指定的键的名称。
虽然token是绑定的但它们与网络中的所有其他绑定的token汇集在一起。验证人和委托人获得一定比例的股权这些股权等于他们在这个资产池中的抵押。
#### 查询委托
一旦提交了一笔对验证人的委托,你可以使用下面的命令查看委托详情:
```bash
gaiacli query staking delegation <delegator_addr> <validator_addr>
```
或者你想查看所有当前的委托:
```bash
gaiacli query staking delegations <delegator_addr>
```
你还可以通过添加`--height`标识来获取先前的委托状态。
#### 解绑token
如果出于一些原因验证人行为异常或者你想解绑一定数量的token请使用以下命令。你可以使用相应的`shares-amount`标识(例如:`12.1`)或`shares-fraction`(例如:`0.25`)来解绑。
```bash
gaiacli tx staking unbond \
--validator=<account_cosmosval> \
--shares-fraction=0.5 \
--from=<key_name> \
--chain-id=<chain_id>
```
经过解绑期后,解绑自动完成。
#### 查询Unbonding-Delegations
一旦你开始了一笔unbonding-delegation你可以使用以下命令查看信息
```bash
gaiacli query staking unbonding-delegation <delegator_addr> <validator_addr>
```
或者你可以查看当前你所有的unbonding-delegation:
```bash
gaiacli query staking unbonding-delegations <account_cosmos>
```
此外你可以从特定验证人获取所有unbonding-delegation
```bash
gaiacli query staking unbonding-delegations-from <account_cosmosval>
```
要获取指定区块时的unbonding-delegation状态请尝试添加`--height`标识。
#### 重新委托token
重新授权是一种委托类型允许你将非流动token从一个验证人上绑定到另一个验证人
```bash
gaiacli tx staking redelegate \
--addr-validator-source=<account_cosmosval> \
--addr-validator-dest=<account_cosmosval> \
--shares-fraction=50 \
--from=<key_name> \
--chain-id=<chain_id>
```
这里,你还可以使用`shares-amount`或`shares-fraction`标识重新委托。
经过解绑期后,重新委托自动完成。
#### 查询重新委托
开始重新授权后,你可以使用以下命令查看其信息:
```bash
gaiacli query staking redelegation <delegator_addr> <src_val_addr> <dst_val_addr>
```
或者如果你可以检查所有当前的unbonding-delegation
```bash
gaiacli query staking redelegations <account_cosmos>
```
此外,你可以查询某个特定验证人的所有转出的重新绑定:
```bash
gaiacli query staking redelegations-from <account_cosmosval>
```
添加`--height`标识来查询之前某个特定区块的redelegation。
#### 查询参数
参数定义了staking的高级参数。你可以使用以下方法获取
```bash
gaiacli query staking params
```
使用上面的命令,你将获得以下值:
+ unbonding时间
+ 验证人的最大数量
+ 用于抵押的币种
所有这些值都将通过对一个`ParameterChange`提案的`governance`流程进行更新。
#### 查询抵押池
一个抵押池定义了当前状态的动态参数。你可以通过以下命令查询:
```bash
gaiacli query staking pool
```
使用`pool`命令,你将获得以下值:
+ 未绑定和已绑定的token
+ token总量
+ 当前的年度通货膨胀率以及上次发生通货膨胀的区块
+ 最后记录的绑定股权
#### 查询对验证人的绑定
你可以查询对某个验证人的所有绑定:
```bash
gaiacli query delegations-to <account_cosmosval>
```
### 治理
治理是Cosmos Hub的用户可以就软件升级主网的参数或自定义文本提案并达成共识的过程。这是通过对提案进行投票来完成的提案将由主要网络上的`Atom`持有者提交。
关于投票过程的一些考虑因素:
+ 投票由绑定`Atom`的持有者以1个绑定的`Atom`对应1票方式投出
+ 委托人不投票的话会将票权继承给其验证人
+ **验证人必须对每个提案进行投票**。如果验证人未对提案进行投票,则会对其进行削减处罚。
+ 投票期结束时主网上是2周统计投票。每个地址可以多次投票以更新其`Option`值(每次支付交易费用),只有最后一次投票将被视为有效。
+ 选民可以选择`Yes``No``NoWithVeto`和`Abstain`选项。在投票结束时,如果`( YesVotes / ( YesVotes + NoVotes + NoWithVetoVotes ) ) > 1/2`且`( NoWithVetoVotes / ( YesVotes + NoVotes + NoWithVetoVotes )) < 1/3`提案通过否则就拒绝
有关治理流程及其工作原理的更多信息请查看Governance模块[规范]()。
#### 创建一个治理提案
要创建治理提案,你必须提交初始存款以及提案详细信息:
+ `title` : 提案的标题
+ `description` : 提案的描述
+ `type` : 提案类型。值必须是 *Text*(目前还不支持*SoftwareUpgrade*和*ParameterChange*类型)。
```bash
gaiacli tx gov submit-proposal \
--title=<title> \
--description=<description> \
--type=<Text/ParameterChange/SoftwareUpgrade> \
--deposit=<40steak> \
--from=<name> \
--chain-id=<chain_id>
```
#### 查询提案
一旦创建,你就可以查询提案的信息:
```bash
gaiacli query gov proposal <proposal_id>
```
或者查询所有的有效提案:
```bash
gaiacli query gov proposals
```
你还可以使用`voter`或`depositor`标识来过滤查询提案。
要查询特定提案的提议人:
```bash
gaiacli query gov proposer <proposal_id>
```
#### 增加存入金
为了将提案广播到网络,存入的金额必须高于`minDeposit`值(默认值:`10steak`)。如果你之前创建的提案不符合此要求,你仍可以增加存入的总金额以激活它。达到最低存入金后,提案进入投票期:
```bash
gaiacli tx gov deposit <proposal_id> <200steak> \
--from=<name> \
--chain-id=<chain_id>
```
> 注意:达到`MaxDepositPeriod`后,将删除不符合此要求的提案。
#### 查询存入金
创建新提案后,你可以查询提交其所有存款:
```bash
gaiacli query gov deposits <proposal_id>
```
你还可以查询特定地址提交的存入金:
```bash
gaiacli query gov deposit <proposal_id> <depositor_address>
```
#### 投票给一个提案
在提案的存入金达到`MinDeposit`后,投票期将开放。抵押了`Atom`的持有人可以投票:
```bash
gaiacli query gov vote <proposal_id> <voter_address>
```
你还可以查询提交给所有此前投给指定提案的投票:
```bash
gaiacli query gov votes <proposal_id>
```
#### 查询提案的计票结果
要检查指定提案的当前计票,你可以使用`tally`命令:
```bash
gaiacli query gov tally <proposal_id>
```
#### 查询治理参数
要检查当前的治理参数,请运行:
```bash
gaiacli query gov params
```
查询运行的治理参数的子集:
```bash
gaiacli query gov param voting
gaiacli query gov param tallying
gaiacli query gov param deposit
```
### 费用分配
#### 查询分配参数
查询当前的分配参数:
```bash
gaiacli query distr params
```
#### 查询
查询当前未结算的(未提取)的奖励:
```bash
gaiacli query distr outstanding-rewards
```
#### 查询验证人佣金
查询对一个验证人的未结算的佣金:
```bash
gaiacli query distr commission <validator_address>
```
#### 查询验证人的削减处罚
查询一个验证人的处罚历史记录:
```bash
gaiacli query distr slashes <validator_address> <start_height> <end_height>
```
#### 查询委托人奖励
查询某笔委托当前的奖励(如果要取回):
```bash
gaiacli query distr rewards <delegator_address> <validator_address>
```
#### 查询所有的委托人奖励
要查询委托人的所有当前奖励(如果要取回),请运行:
```bash
gaiacli query distr rewards <delegator_address>
```
### 多签交易
多签交易需要多个私钥的签名。因此,从多签账户生成和签署交易涉及有关各方之间的合作。密钥持有者的任何一方都可以发起多签,并且至少要有其中一方需要将其他账户的公钥导入到本地的数据库并生成多签公钥来完成和广播该笔交易。
例如,给定包含密钥`p1``p2`和`p3`的多签密钥,每个密钥由不同方持有,持有`p1`的用户将需要导入`p2`和`p3`的公钥以生成多签帐户公钥:
```bash
gaiacli keys add \
--pubkey=cosmospub1addwnpepqtd28uwa0yxtwal5223qqr5aqf5y57tc7kk7z8qd4zplrdlk5ez5kdnlrj4 \
p2
gaiacli keys add \
--pubkey=cosmospub1addwnpepqgj04jpm9wrdml5qnss9kjxkmxzywuklnkj0g3a3f8l5wx9z4ennz84ym5t \
p3
gaiacli keys add \
--multisig-threshold=2
--multisig=p1,p2,p3
p1p2p3
```
已存储新的多签公钥`p1p2p3`,其地址将用作多签交易的签名者:
```bash
gaiacli keys show --address p1p2p3
```
创建多签交易的第一步是使用上面创建的多签地址初始化:
```bash
gaiacli tx send cosmos1570v2fq3twt0f0x02vhxpuzc9jc4yl30q2qned 10000000uatom \
--from=<multisig_address> \
--generate-only > unsignedTx.json
```
`unsignedTx.json`文件包含以JSON编码的未签署交易。`p1`现在可以使用自己的私钥对交易进行签名:
```bash
gaiacli tx sign \
--multisig=<multisig_address> \
--name=p1 \
--output-document=p1signature.json \
unsignedTx.json
```
生成签名后,`p1`将`unsignedTx.json`和`p1signature.json`都发送到`p2`或`p3`,然后`p2`或`p3`将生成它们各自的签名:
```bash
gaiacli tx multisign \
unsignedTx.json \
p1p2p3 \
p1signature.json p2signature.json > signedTx.json
```
现在可以把交易发送给节点:
```bash
gaiacli tx broadcast signedTx.json
```
## shell完全脚本
可以通过完全命令生成主流的UNIX shell解释器如`Bash`和`Zsh`)的`completion`命令,该命令可用于`gaiad`和`gaiacli`。
如果要生成Bash完成脚本请运行以下命令
```bash
gaiad completion > gaiad_completion
gaiacli completion > gaiacli_completion
```
如果要生成Zsh完成脚本请运行以下命令
```bash
gaiad completion --zsh > gaiad_completion
gaiacli completion --zsh > gaiacli_completion
```
::: 注意
在大多数UNIX系统上可以在`.bashrc`或`.bash_profile`中加载此类脚本以启用Bash自动完成
```
echo '. gaiad_completion' >> ~/.bashrc
echo '. gaiacli_completion' >> ~/.bashrc
```
有关如何启用shell自动完成的信息请参阅操作系统提供的解释器用户手册。
:::

View File

@ -0,0 +1,48 @@
# Gaia的创世状态
`GenesisState`是Gaia的创世状态由账户不同模块的状态和例如创世交易这样的数据组成。每个模块可以指定自己的`GenesisState`,还有每个模块可以指定对创世状态的验证,导入和导出。
Gaia的创世状态有如下定义:
```go
type GenesisState struct {
Accounts []GenesisAccount `json:"accounts"`
AuthData auth.GenesisState `json:"auth"`
BankData bank.GenesisState `json:"bank"`
StakingData staking.GenesisState `json:"staking"`
MintData mint.GenesisState `json:"mint"`
DistrData distr.GenesisState `json:"distr"`
GovData gov.GenesisState `json:"gov"`
SlashingData slashing.GenesisState `json:"slashing"`
GenTxs []json.RawMessage `json:"gentxs"`
}
```
在gaia的ABCI接口`initChainer`的定义中`initFromGenesisState`被调用,它在内部调用每个模块的`InitGenesis`,提供各自的`GenesisState`作为参数
## 账户
`GenesisState`中的创世账户有如下定义:
```go
type GenesisAccount struct {
Address sdk.AccAddress `json:"address"`
Coins sdk.Coins `json:"coins"`
Sequence uint64 `json:"sequence_number"`
AccountNumber uint64 `json:"account_number"`
// vesting account fields
OriginalVesting sdk.Coins `json:"original_vesting"` // total vesting coins upon initialization
DelegatedFree sdk.Coins `json:"delegated_free"` // delegated vested coins at time of delegation
DelegatedVesting sdk.Coins `json:"delegated_vesting"` // delegated vesting coins at time of delegation
StartTime int64 `json:"start_time"` // vesting start time (UNIX Epoch time)
EndTime int64 `json:"end_time"` // vesting end time (UNIX Epoch time)
}
```
每个账户必须有一个合理的并唯一的account number还要有sequence number和address。
账户也可以是锁定账户,必须提供必要的锁定信息。锁定账户必须提供一个最小的`OriginalVesting`和`EndTime`。如果`StartTime`也提供了,这个账户将会被当做一个连续的锁定账户,将按照预定的时间线锁定代币。提供的`StartTime`必须小于`EndTime`,但可以是将来的某个时间。换句话说,`StartTime`不必小于创世时间。当一条新链从一个新状态(不是到处的)生成时,`OriginalVesting` 必须要小于`Coins`
<!-- TODO: Remaining modules and components in GenesisState -->

View File

@ -0,0 +1,65 @@
## 安装Gaia
本教程将详细说明如何在你的系统上安装`gaiad`和`gaiacli`。安装后,你可以作为[全节点](./join-mainnet.md)或是[验证人节点](./validators/validator-setup.md)加入到主网。
### 安装Go
按照[官方文档](https://golang.org/doc/install)安装`go`。记得设置环境变量`$GOPATH`,`$GOBIN`和`$PATH`:
```bash
mkdir -p $HOME/go/bin
echo "export GOPATH=$HOME/go" >> ~/.bash_profile
echo "export GOBIN=$GOPATH/bin" >> ~/.bash_profile
echo "export PATH=$PATH:$GOBIN" >> ~/.bash_profile
```
::: 提示
Cosmos SDK需要安装**Go 1.12.1+**
:::
### 安装二进制执行程序
接下来安装最新版本的Gaia。这里我们使用`master`分支,包含了最新的稳定发布版本。如果需要,请通过`git checkout`命令确定是正确的[发布版本](https://github.com/cosmos/cosmos-sdk/releases)。
::: 警告
对于主网,请确保你的版本大于或等于`v0.33.0`
:::
```bash
mkdir -p $GOPATH/src/github.com/cosmos
cd $GOPATH/src/github.com/cosmos
git clone https://github.com/cosmos/cosmos-sdk
cd cosmos-sdk && git checkout master
make tools install
```
> *注意*: 如果在这一步中出现问题请检查你是否安装的是Go的最新稳定版本。
等`gaiad`和`gaiacli`可执行程序安装完之后,请检查:
```bash
$ gaiad version --long
$ gaiacli version --long
```
`gaiacli`的返回应该类似于:
```
cosmos-sdk: 0.33.0
git commit: 7b4104aced52aa5b59a96c28b5ebeea7877fc4f0
vendor hash: 5db0df3e24cf10545c84f462a24ddc61882aa58f
build tags: netgo ledger
go version go1.12 linux/amd64
```
##### Build Tags
build tags指定了可执行程序具有的特殊特性。
| Build Tag | Description |
| --------- | ----------------------------------------------- |
| netgo | Name resolution will use pure Go code |
| ledger | 支持Ledger设备(硬件钱包) |
### 接下来
然后你可以选择 加入公共测试网 或是 创建私有测试网。

View File

@ -0,0 +1,148 @@
## 加入主网
::: 提示
请查看[launch repo](https://github.com/cosmos/launch)获取主网信息包含了所使用的Cosmos-SDK的正确版本和genesis文件。
:::
::: 警告
**在更进一步之前你需要[安装gaia](./installation.md)**
:::
## 创建一个新节点
这些指令适用于从头开始设置一个全节点。
首先,初始化节点并创建必要的配置文件:
```bash
gaiad init <your_custom_moniker>
```
::: 注意
moniker只能包含ASCII字符。使用Unicode字符会使得你的节点不可访问
:::
你可以稍后在`~/.gaiad/config/config.toml`文件中编辑`moniker`:
```toml
# A custom human readable name for this node
moniker = "<your_custom_moniker>"
```
你可以编辑`~/.gaiad/config/config.toml`文件来开启垃圾交易过滤机制以拒绝收到的手续费过低的交易:
```
# This is a TOML config file.
# For more information, see https://github.com/toml-lang/toml
##### main base config options #####
# The minimum gas prices a validator is willing to accept for processing a
# transaction. A transaction's fees must meet the minimum of any denomination
# specified in this config (e.g. 10uatom).
minimum-gas-prices = ""
```
你的全节点已经初始化成功!
## Genesis & Seeds
### 复制genesis文件
将主网的`genesis.json`文件放置在`gaiad`的配置文件夹中
```bash
mkdir -p $HOME/.gaiad/config
curl https://raw.githubusercontent.com/cosmos/launch/master/genesis.json > $HOME/.gaiad/config/genesis.json
```
注意我们使用了[launch repo](https://github.com/cosmos/launch)中的`latest`文件夹,该文件夹包含了最新版本主网的详细信息。
::: 提示
如果你想加入的是公共测试网,点击[这里](./join-testnet.md)
:::
运行命令验证配置的正确性:
```bash
gaiad start
```
### 添加种子节点
你的节点需要知道如何寻找伙伴节点。你需要添加有用的种子节点到`$HOME/.gaiad/config/config.toml`文件中。[`launch`](https://github.com/cosmos/launch) repo包含了一些种子节点的链接。
如果这些种子节点不再运行你可以在Cosmos Hub浏览器(可以在[launch page](https://cosmos.network/launch)中找到)发现种子节点和持久节点。
你还可以到[验证人Riot聊天室](https://riot.im/app/#/room/#cosmos-validators:matrix.org)里询问可用节点。
你可以阅读[这里](https://github.com/tendermint/tendermint/blob/develop/docs/tendermint-core/using-tendermint.md#peers)了解更多伙伴节点和种子节点的信息。
::: 警告
在Cosmos Hub主网中可接受的币种是`uatom`,`1atom = 1.000.000uatom`
:::
Cosmos Hub网络中的交易需要支付一笔交易手续费以得到处理。手续费支付执行交易所消耗的gas。计算公式如下
```
fees = gas * gasPrices
```
`gas`由交易本身决定。不同的交易需要不同数量的`gas`。一笔交易的`gas`数量在它被执行时计算,但有一种方式可以提前估算,那就是把标识`gas`
的值设置为`auto`。当然这只是给出一个预估值。如果你想要确保为交易提供足够的gas你可以使用`--gas-adjustment`标识来调整预估值(默认是`1.0`)。
`gasPrice`是每个单位`gas`的单价。每个验证人节点可以设置`min-gas-price`,只会把那些`gasPrice`高于自己设置的`min-gas-price`的交易打包。
交易的`fees`是`gas`与`gasPrice`的结果。作为一个用户,你必须输入三者中的两者。更高的`gasPrice`/`fees`,将提高你的交易被打包的机会。
::: 提示
主网中推荐的`gas-prices`是`0.025uatom`
:::
## 设置`minimum-gas-prices`
你的全节点可以在交易池中放入未确认的交易。为了保护其免受Spam攻击最好设置一个`minimum-gas-prices`来过滤交易以决定是否要放入交易池。这个参数可以在`~/.gaiad/config/gaiad.toml`文件中配置。
推荐的初始`minimum-gas-prices`是`0.025uatom`,如果你愿意可以稍后再修改它。
## 运行一个全节点
通过这条命令开始运行全节点:
```bash
gaiad start
```
检查一切是否平稳运行中:
```bash
gaiacli status
```
使用[Cosmos Explorer](https://cosmos.network/launch)查看网络状态。
## 导出状态
Gaia能够将整个应用程序的状态转存到一个JSON文件中该文件可以用于分析还可以用作一个新网络的genesis文件。
导出状态:
```bash
gaiad export > [filename].json
```
你还可以导出指定高度的状态(处理完指定高度后的状态):
```bash
gaiad export --height [height] > [filename].json
```
如果你计划使用导出的状态文件启动一个新网络,导出时要加上`--for-zero-height`标识:
```bash
gaiad export --height [height] --for-zero-height > [filename].json
```
## 升级成为验证人节点
你现在有了一个运行状态的全节点。接下来你可以升级你的全节点成为一个Cosmos验证人。排名前100的验证人节点可以向Cosmos Hub提议新的区块。请查看[创建验证人节点](./validators/validator-setup.md)。

View File

@ -0,0 +1,59 @@
# 加入公共测试网
::: 提示 当前测试网
请查看[testnet repo](https://github.com/cosmos/testnets)获取最新的公共测试网信息包含了所使用的Cosmos-SDK的正确版本和genesis文件。
:::
::: 警告
你需要先完成[安装`gaia`](./installation.md)
:::
## 创建一个新节点
> 注意:如果你在之前的测试网中运行过一个全节点,请跳至[升级之前的Testnet](#upgrading-from-previous-testnet)。
要创建一个新节点,主网的指令同样适用:
+ [加入mainnet](./join-mainnet.md)
+ [部署验证人节点](./validators/validator-setup.md)
只有SDK的版本和genesis文件不同。查看[testnet repo](https://github.com/cosmos/testnets)
获取测试网的信息包括Cosmos-SDK正确的版本和genesis文件。
## 升级之前的Testnet
这些指令用以把运行过以前测试网络的全节点升级至最新的测试网络。
### 重置数据
首先,移除过期的文件并重置数据:
```bash
rm $HOME/.gaiad/config/addrbook.json $HOME/.gaiad/config/genesis.json
gaiad unsafe-reset-all
```
你的节点现在处于原始状态并保留了最初的`priv_validator.json`文件和`config.toml`文件。如果之前你还有其他的哨兵节点或者全节点,你的节点仍然会连接他们,但是会失败,因为他们还没有升级。
::: 警告
确保每个节点有一个独一无二的`priv_validator.json`文件。不要从一个旧节点拷贝`priv_validator.json`到多个新的节点。运行两个有着相同`priv_validator.json`文件的节点会导致双签。
:::
### 升级软件
现在升级软件:
```bash
cd $GOPATH/src/github.com/cosmos/cosmos-sdk
git fetch --all && git checkout master
make update_tools install
```
::: 提示
*注意*如果在这一步出现问题请检查是否安装了最新稳定版本的Go。
:::
注意这里我们使用的是包含最新稳定发布版本的`master`分支。请查看[testnet repo](https://github.com/cosmos/testnets)查看哪个版本的测试网需要哪一个Cosmos-SDK版本在[SDK发布版](https://github.com/cosmos/cosmos-sdk/releases)中对应的详细信息。
你的全节点已经升级成功!

View File

View File

@ -0,0 +1,77 @@
# Ledger Nano支持
## 关于HD钱包
HD钱包分层确定性钱包, 最初是在比特币的[BIP32](https://github.com/bitcoin/bips/blob/master/bip-0032.mediawiki)提案中提出,
是一种特殊的钱包类型,可以让用户从单个种子派生任意数量的账户。为了更好的理解, 让我们定义以下术语:
- **钱包**: 从一个给定的seed中获得的一组账户。
- **账户**: 一组公钥/私钥对。
- **私钥**: 私钥是用于签署消息的私密信息。在区块链领域, 一个私钥就是一个账户的所有者。永远不要想他人透露用户的私钥。
- **公钥**: 公钥是通过对私钥上使用不可逆的加密函数而获得的一条信息。从公钥中可以导出地址。但无法从公钥中逆向获得私钥。
- **地址**: 地址是一个公开的用于标识账户的,带着可读前缀的字符串。通过对公钥使用加密函数获得。
- **数字签名**: 数字签名是一段加密信息,证明了指定私钥的所有者在不泄露其私钥的情况下,批准了指定消息。
- **种子**: 同助记词。
- **助记词**: 助记符是一串单词,用作种子来派生私钥。助记符是每个钱包的核心。永远不要丢失你的助记词。把它写在一张纸上,然后把它存放在安全的地方。如果你失去了它,那就没有办法去重新获取它了。如果某人获得了助记词访问权限,他们将获得所有相关帐户的访问权限。
HD钱包的核心是种子。用这个种子用户可以确定地生成子帐户。要从种子生成子帐户使用了单向的数学转换。要决定生成哪个帐户用户指定`path`,通常是`integer``0``1``2`...)。
例如,通过将`path`指定为`0`,钱包将从种子生成`0号私钥`。然后,可以从`0号私钥`生成“`号公钥`。最后,可以从`0号公钥`生成`0号地址`。所有这些步骤都是单向的,这意味着`公钥`无法从`地址`中获得,`私钥`无法从`公钥`中获得,......
```
Account 0 Account 1 Account 2
+------------------+ +------------------+ +------------------+
| | | | | |
| Address 0 | | Address 1 | | Address 2 |
| ^ | | ^ | | ^ |
| | | | | | | | |
| | | | | | | | |
| | | | | | | | |
| + | | + | | + |
| Public key 0 | | Public key 1 | | Public key 2 |
| ^ | | ^ | | ^ |
| | | | | | | | |
| | | | | | | | |
| | | | | | | | |
| + | | + | | + |
| Private key 0 | | Private key 1 | | Private key 2 |
| ^ | | ^ | | ^ |
+------------------+ +------------------+ +------------------+
| | |
| | |
| | |
+--------------------------------------------------------------------+
|
|
+---------+---------+
| |
| Mnemonic (Seed) |
| |
+-------------------+
```
从种子中推导出帐户的过程是确定性的。这意味着给定相同的路径,派生出私钥将始终相同。
存储在帐户中的资金由私钥控制。此私钥对助记词使用单向函数生成的。如果丢失了私钥,则可以使用助记词恢复它。但是,如果丢失了助记词,则将无法访问所有派生的私钥。同样,如果有人获得了你的助记词访问权限,他们就可以访问所有相关帐户。
## Ledger支持HD钱包
在Ledger钱包的内核有一个用于生成私钥的助记词。初始化Ledger时会生成助记词。
::: 危险
**不要遗失或与任何人分享你的12/24个单词。为防止盗窃或资金损失最好确保备份多个助记词拷贝并将其存放在安全可靠的地方并且只有你知道如何访问。如果有人能够访问你的助记词他们将能够访问你的私钥并控制与其关联的帐户**
:::
助记词与Cosmos帐户体系兼容。用于在Cosmos Hub网络上生成地址和交易的工具称为`gaiacli`它支持从Ledger种子派生帐户私钥。请注意Ledger钱包充当种子和私钥的沙盒并且对交易进行签名的过程完全在内部进行。没有任何私人信息会离开Ledger钱包。
要将`gaiacli`与Ledger钱包一起使用你需要具备以下条件
- [在Ledger Nano中安装`COSMOS`应用并生成账户](./delegator-guide-cli.md#using-a-ledger-device)
- [有一个你打算连接的可访问的并处于运行状态的`gaiad`实例](./delegator-guide-cli.md#accessing-the-cosmos-hub-network)
- [一个同你所选的`gaiad`实例相连接的`gaiacli`实例](./delegator-guide-cli.md#setting-up-gaiacli)
现在,你都准备好去[发送交易到网络](./delegator-guide-cli.md#sending-transactions).

View File

@ -0,0 +1,38 @@
# 验证人概览
## 介绍
Cosmos Hub基于Tendermint它依赖于一组负责在区块链中提交新区块的验证人。这些验证人通过广播投票来参与共识协议投票包含由每个验证人的私钥签名的加密签名。
验证人候选者可以绑定他们自己的Atoms=还能让token持有者将Atoms=“委托”或“抵押”给他们。Cosmos Hub将有100个验证人但随着时间的推移将根据预定义的时间表增加到300个验证人。验证人根据谁拥有最多的投票权来确定——拥有最多股权的前100名验证人候选者将成为Cosmos的验证人。
验证人及其委托人能通过执行Tendermint共识协议赚取Atom作为区块增发奖励和作为交易手续费的其他token。最初交易费用将以Atom支付但在将来Cosmos生态中的任何token如果通过治理加入到白名单中就能作为有效的交易手续费。请注意验证人可以设置从他们的委托人身上收取的佣金作为额外奖励。
如果验证人双签频繁下线或不参与治理则可以削减其抵押的Atom包括那些用户委托给他们的Atom。处罚取决于违规的严重程度。
## 硬件
目前还没有合适的针对验证人密钥管理的云解决方案。这可能会等到2018年云解决方案SGX变得更加普及时才会有所改善。由于这个原因验证人必须设置一个受限访问的物理操作。例如安置在安全的数据中心。
验证人期望为他们的数据中心装备充足的电力,带宽及存储备份。期望有数个充足的对应光纤,防火墙还有路由的需求的网络设备,一台有着足够硬盘和容错能力的小型服务器。硬件可以先从低端的数据中心配置开始。
我们预计最初的网络需求是比较低的。当前的测试网络只需要极小的资源。之后带宽CPU和内存的需求将会随着网络的发展而增长。要存储数年区块链的历史信息的话推荐配置足够大的的硬盘。
## 创建一个网站
建立一个专门的用以显示验证人信息网站,并在我们的[论坛](https://forum.cosmos.network/t/validator-candidates/127/3)上表明您想成为验证人的意图。这非常重要因为委托人希望获得关于他们予以Atom委托的验证人的信息。
## 寻求法律建议
如果您打算成为一个验证人,请寻求法律建议
## 社区
在我们的社区聊天频道和论坛上讨论有关成为验证人的更多细节:
+ [Validator Chat](https://riot.im/app/#/room/#cosmos_validators:matrix.org)
+ [Validator Forum](https://forum.cosmos.network/c/validating)

View File

@ -0,0 +1,55 @@
# 验证人安全
我们鼓励每一个验证人候选者独立运行其操作,因为不同的设置增加了网络的抵抗能力。为了能按时启动主网,验证人候选者现在就应该开始设置了。
## 密钥管理 - HSM
让攻击者无法盗取验证人的密钥是至关重要的任务。如果可能发生盗取,这将会使委托给抵抗力脆弱的验证人的所有股权都处于风险之中。硬件安全模块是防范该风险的一个重要策略。
为了支持Cosmos HubHSM模块必须要支持`ed25519`签名。YubiHSM2支持了`ed25519`我们期望在2017年12月时能有一个可以使用的库。YubiHSM可以保护私钥但是不能确保它不会去重复签署一个区块。
Tendermint团队也在为拓展Ledger Nano S应用以支持验证人签名做贡献。这个应用将会储存最近的区块并能降低双重签名攻击的风险。
我们会在有更多关于密钥保存安全的可行的解决方案出现时更新这个文档。
## 哨兵节点DDOS防御
验证人有责任确保网络能够经受住DDOS攻击。
降低这种风险的一个推荐方案是验证人要在成为哨兵节点的网络拓扑结构上去精心搭建他们的网络结构。
因为验证人节点可以操作自身也可以被其熟知的其它验证人运行验证人节点应该只连接到其所信任的全节点上。一个验证人节点通常会运行在一个数据中心。大部分数据中心提供对主流云服务提供商的直接网络连接服务。验证人可以去连接云服务中上的哨兵节点。验证人节点直接连接到其哨兵节点减缓了DDOS攻击带来的压力还可以添加多个新的哨兵节点用以轮换来减轻已存在哨兵节点所遭受到的攻击。
哨兵节点能够迅速轮换或者改变它们的IP地址。因为与哨兵节点的连接是在私有的IP网段基于因特网的攻击不可能直接骚扰到验证人节点。这将确保验证人区块的提交和投票总是能广播至网络中的其余节点。
你可以按照下面的指令去设置你的哨兵节点架构:
验证人节点必须编辑它们的config.toml文件
```bash
# Comma separated list of nodes to keep persistent connections to
# Do not add private peers to this list if you don't want them advertised
persistent_peers =[list of sentry nodes]
# Set true to enable the peer-exchange reactor
pex = false
```
哨兵节点应该编辑它们的config.toml文件:
```bash
# Comma separated list of peer IDs to keep private (will not be gossiped to other peers)
private_peer_ids = "ipaddress of validator nodes"
```
## 环境变量
默认情况下,具有以下前缀的大写环境变量将替换小写命令行标志:
+ `GA`对应Gaia的标识
+ `TM`对应Tendermint的标识
+ `BC`对应democli或basecli的标识
例如,环境变量`GA_CHAIN_ID`将映射到命令行标识`--chain-id`。注意虽然显式命令行标识优先于环境变量但环境变量优先于任何配置文件。因此必须锁定环境以便在CLI上将任何关键参数定义为标识或防止修改任何环境变量。

View File

@ -0,0 +1,328 @@
# 验证人相关问题
::: 声明
这项工作正在进行中。机制和具体值都容易发生变化。
:::
## 基本概念
### 什么是验证人?
[Cosmos Hub](../what-is-gaia.md)基于[Tendermint](https://tendermint.com/docs/introduction/what-is-tendermint.html),它依靠一组验证人来保障网络的安全。验证人的作用是通过广播包含由验证人的私钥签名的加密签名的投票来运行全节点并参与共识。验证人在区块链中提交新的区块并获得收益作为报酬。他们还必须通过对提案进行投票来参与治理。验证人根据他们的总抵押股权来排位。
### 什么是'抵押'?
Cosmos Hub是一个权益证明PoS区块链意味着验证人的权重由其抵押的用作担保金的代币Atom的数量决定。这些Atom可以直接由验证人抵押或者由Atom持有者委托给验证人。
系统中的任何用户都可以通过发送`create-validator`交易来表明其想成为验证人的意图。从那里,他们成为验证者。从这开始,才能成为验证人。
验证人的权重即总抵押决定其是否能成为有效验证人还有该节点提议区块的频率以及它将获得多少收益。一开始只有权重最多的100个验证人才是有效验证人。如果验证者双重签名经常脱机或不参与治理如果验证人双签频繁掉线或者不参加治理他们抵押的Atom(包括那些委托给他们的Atom)会被销毁,也就是‘削减处罚’。
### 什么是全节点?
全节点是一个全程验证区块链的交易和区块的程序。区别于只处理区块头信息和小部分交易的轻节点。运行一个全节点比轻节点需要更多的资源,这也是成为验证人必须要具备的。实际上,运行全节点意味着运行网络延迟较低且不掉线的软件的最新版本。
当然,我们鼓励任何用户都去运行一个全节点,即使他们并不打算成为验证人。
### 什么是委托人?
委托人是那些没有能力或者不想执行验证人操作的Atom持有者。通过[Cosmos Voyager](https://cosmos.network/docs/getting-started/voyager.html)一个用户可以把Atom委托给一个验证人并获取一部分交易收益关于收益是如何分配的查看下面的[**抵押有什么激励?**](#抵押有什么激励?)和[**运行一个验证人有什么激励?**](#运行一个验证人有什么激励?)
委托人与他们的验证人分享收益,所以委托人也要共担责任。如果一个验证人行为不端,每一个相关的委托人也会按比例遭受股权的部分削减处罚。这就是为什么委托人在委托之前应该履行调查职责,还要尽量把股权分散给多个验证人。
委托人在系统里扮演了一个关键角色,因为他们负责选举验证人。委托人也并不是一个消极的角色:委托人应该积极监控验证人的行为,并参与到治理当中。
## 成为一个验证人
### 如何成为一个验证人?
网络中的任何参与者都可以通过发送一笔`create-validator`交易来表明他们想成为一个验证人,必须要填写下列参数:
+ **验证人的公钥:**用于签名**投票**和**提交**的私钥对应的公钥。通过这种方式,验证人可以用不同的账户分别去做验证和持有流动资金。
+ **验证人的地址:**应用程序级别的地址。这是用于外界识别验证人的地址。与此地址关联的私钥用于绑定取消绑定声明奖励和参与治理仅限MVP
+ **验证人的名称(moniker)**
+ **验证人的网站(可选的)**
+ **验证人的描述信息(可选的)**
+ **初始佣金比例:**区块增发奖励,区块奖励,交易手续费中抽成给验证人的初始比例
+ **最大佣金:**该验证人保证的最大佣金率
+ **佣金变化率:**验证人候选者的最大每日佣金增长率
+ **最小自抵押数量:**验证人在任何时候所要的抵押的最小Atom数量。如果验证人的自抵押股权数量跌破了这个限制其整个抵押池都会被释放。
+ **初始自抵押数量:**验证人最初的自抵押的Atom数量
一旦创建了验证人Atom持有者可以向其委托Atom有效地向股权池里增加股权。一个地址的总股权是验证人自抵押的Atom和委托人委托的Atom的总和。
在所有表明的验证人中股权最多的100名被任命为有效验证人。如果某个验证人的股权总量跌出了前100名就会失去验证人权利。随着时间的推移验证人的最大数量会依照计划逐渐增加
+ **Year 0:** 100
+ **Year 1:** 113
+ **Year 2:** 127
+ **Year 3:** 144
+ **Year 4:** 163
+ **Year 5:** 184
+ **Year 6:** 208
+ **Year 7:** 235
+ **Year 8:** 265
+ **Year 9:** 300
+ **Year 10:** 300
## 测试网
### 我要怎样加入到测试网?
测试网络是一个在主网上线之前很好的测试验证人设置的环境。
我们将参与测试网络视为一个向社区展示你是有准备且有能力去运行验证人节点的方式。你可以在[这里](https://github.com/cosmos/cosmos-sdk/tree/develop/cmd/gaia/testnets)和[这里](https://github.com/cosmos/testnets)找到有关测试网的更多内容。
### 密钥的不同类型?
简而言之有两种密钥:
+ **Tendermint Key** :这是用于对区块哈希进行签名的唯一密钥。它与一个公钥`cosmosvalconspub`相关联。
+ 使用`gaiad init`创建节点时生成。
+ 使用`gaiad tendermint show-validator`查看,如`cosmosvalconspub1zcjduc3qcyj09qc03elte23zwshdx92jm6ce88fgc90rtqhjx8v0608qh5ssp0w94c`。
+ **Application keys** :这些密钥是由应用程序创建的,用于签名交易。作为验证人,你可能会使用一个密钥来签名与抵押相关的交易,另一个密钥用于签署与治理相关的交易。应用程序私钥和公钥`cosmospub`及地址`cosmos`相关联。两者都来自`gaiacli keys add`生成的帐户私钥。
+ 注意:验证人的操作员的私钥直接绑定到应用程序私钥,但为此目的保留前缀:`cosmosvaloper`和`cosmosvaloperpub`
### 验证人可以具有哪些不同的状态
使用`create-validator`交易创建验证人后,它可以处于三种状态:
+ `bonded` : 验证人在活跃集合中并参与共识。验证人正在获得奖励,并且可能因为不当行为而遭到削减处罚。
+ `unbonding` : 验证人不在活跃集合中,也不参与共识。验证人没有获得奖励,但仍然可能因为不当行为而遭到削减处罚。这是从`bonded`到`unbonding`的过渡状态。如果验证人在`unbonding`模式下未发送`rebond`交易,则状态转换将需要三周时间才能完成。
+ `unbonded` : 验证人不在活跃集合中因此不签署区块。验证人不能遭到削减处罚也不会获得任何奖励。仍然可以将Atom委托给此验证人。从`unbonded`状态的验证人取消委托是立即的。
委托人与其验证人具有相同的状态。
请注意委托不一定是绑定的。Atom可以是delegated和bonded状态delegated和unbonding状态delegated和unbonded状态或流通状态。
### 什么是`self-bond`?怎样增加我的`self-bond`?有水龙头吗?
如果你想获得测试网的测试币,你可以使用这个[水龙头](https://faucet.cosmos.network/)。
### 成为一个活跃的(=bonded验证人必须要抵押最小数量的Atom吗
没有最小限制。总股权(总股权=自抵押股权+委托股权最高的前100名是活跃验证人。
#### 委托人要怎样选择验证人?
委托人可以根据他们的主观判断随意去选择验证人。也就是说,包括对以下内容的判断相当重要:
+ **自抵押的Atom数量**一个验证人在股权池里自抵押的Atom数量。有着更多自抵押Atom的验证人承担了更大的风险将促使其对自己的行为更加负责。
+ **委托的Atom总量**: 委托给某个验证人的Atom总量。大量的股权显示社区对该验证人的信任但这也意味着该验证人更容易成为黑客们的目标。实际上黑客更倾向攻击更大的验证人这样他们可能会从不能抵御攻击的验证人那里获得更多。随着委托的Atom的增长验证人也被期待不要太过引人注目。
+ **佣金比率** 在把奖励分散给委托人之前抽成一部分佣金来奖励验证人。
+ **跟踪记录**:委托人很可能去查看他们计划去委托的验证人的行为记录。包括资历,过去对提议的投票,历史的平均运行时长和验证人节点掉线的频率。
除去这些会展示在Cosmos Voyager上的评判标准验证人还可能向公众展示一个网站来完善他们的简历。验证人需要通过多种方式去树立良好的声誉来吸引委托人。比如验证人让第三方来审计他们的设置就是一个很好的实践。注意Tendermint团队将不会批准和引导任何对自身的审计。有关尽职调查的更多信息请参阅此[博客](https://medium.com/@interchain_io/3d0faf10ce6f)
## 责任
### 验证人需要公开表明身份吗?
不需要。每个委托人会用他们自己的评判标准去衡量验证人的价值。验证人可以(也被推荐)在他们提名自己时注册一个网站,以便他们可以按照自己的意愿宣传自己的行动。一些委托人可能更喜欢通过一个清楚展示团队是如何去运行验证人节点以及团队成员的简历的网站来帮助选择,尽管其他一些委托人更偏好那些隐藏了行为记录的匿名验证人。最有可能的是身份明确的验证人和匿名的验证人都会存在于验证人集合中。
### 一个验证人要担负哪些责任?
验证人有两个主要的职责:
+ **能够不断运行软件的正确版本**:验证人需要去保证他们的服务器任何时刻都在线,保护其私钥避免遭到窃取。
+ **积极地参与治理**:验证人需要对每个提案投票表决。
此外,验证人应该是社区的活跃成员。他们应该始终与生态系统的当前状态保持同步,以便他们能够轻松适应任何变化。
### "参与治理"需要?
Cosmos Hub中的验证人员和委托人可以就改变运行参数例如区块燃料限制协调升级以及对治理Cosmos Hub的宪法的修正方案进行投票表决。
验证人在治理系统中发挥着特殊作用。身为系统的支柱他们需要对每一个提案进行投票表决。这是尤其重要的,因为委托人把票权给了验证人而自己无法直接去投票。每次当某个验证人不去对一个提案投票表决时,他就会遭受削减处罚。
### 抵押是指?
抵押Atom可以被认为是一种在验证活动中进行的安全储蓄。当一个验证人或者委托人想要拿回部分甚至所有的存款时他们就发送一笔unbonding交易。然后Atom会经历一个*3周的解绑周期*在unbonding开始前他们容易因错误提交而遭到削减处罚。
验证人和与其形成联盟的委托人得到区块增发奖励区块奖励和手续费奖励还有参与治理的权利。如果一个验证人行为不端它的总股份的一部分会遭削减处罚处罚的严厉性取决于错误行为的类型。这意味着每一个往验证人委托Atom的用户也会受到一定比例的处罚。因此委托人倾向于把Atom委托给那些规范安全运作的验证人。
### 验证人可以卷走委托人的Atom跑路吗?
向一个验证人委托用户只是委托了他的股权。验证人有更多的股权在共识和治理工程中也就有了更大的权重。这不意味着验证人可以扣押其委托人的Atom。一个验证人是绝不可能带着委托人的Atom跑路的。
尽管委托资金不可能被验证人盗取,委托人仍然要对他们的验证人做出的不端行为负责。这种情况下,每个委托人的股权也会按其股权比例遭到部分的削减处罚。
### 一个验证人多久被选择提议下一个区块会随着抵押的Atom数量上升吗
被选作提议下一个区块的验证人称为提案人。每个提案人都是由明确的方式选出来的,被选的频率也与他们的总股权相等(总股权=自抵押股权+委托股权。比如如果所有验证人总的抵押股权是100个Atom一个验证人的总股权是10个Atom那么有10%的时间该验证人会被选作下一个提案人。
### Cosmos Hub的验证人需要去验证Cosmos生态中的其他分区吗
是的他们会如此。最初Cosmos Hub的验证人还会验证第一个公共Ethermint分区。如果通过治理决定这么做Cosmos Hub的验证人可能需要去验证Cosmos生态系统里的其它分区。就Ethermint分区而言对每个额外的分区奖励都会以区块奖励和交易手续费的形式来提供。
## 激励
### 抵押有什么激励?
一个验证人股权池里的每个成员赚取不同类型的收益:
+ **区块增发奖励** 验证人运行的应用里的原生的token例如Cosmos Hub中的Atom会是通胀的用作区块增发奖励。这些增发奖励激励Atom持有者去抵押他们的股权所以未绑定的Atom会随着时间的流逝而稀释。
+ **区块奖励** 对于Ethermint分区区块奖励会以Photon来支付。对Ethereum进行硬分叉来完成初始的分配。这意味着Photon会按和Ether的比例11发放。
+ **交易手续费**Cosmos Hub维持一个token的白名单上面的token都能作为手续费。
这些总收益会按验证人股权池中每个验证人所占的权重来进行分配。然后,每个验证人的股权池的收益又会根据其每一个委托人的股权来分配。注意,会在分配前从委托人所得中抽取佣金给予验证人。
### 运行一个验证人有什么激励?
由于能抽成佣金,验证人比起他们的委托人能按比例赚取更多的收益。
验证人在治理中充当一个重要角色。如果一个委托人没有投票,他也能从他的验证人那里继承到投票权。这样验证人在生态里承担主要的责任。
### 什么是验证人的佣金?
一个验证人的股权池收到的收益会被拆分为给验证人的部分和给委托人的部分。验证人可以从给其委托人的收益中抽取一部分作为给自己佣金奖励。这个佣金被设置成一个百分比。每个验证人可以随意设置初始佣金最大每日佣金变化率和最大佣金。Cosmos Hub强制每个验证人都要明确设置这些参数。这些参数只能在一开始声明竞选时设置也只可能在声明之后被进一步限制。
### 区块增发奖励怎么分配?
区块增发奖励会按验证人的总股权来成比例地发放。这意味着即使每个验证人每次增发奖励时都获得了Atom但所有验证人仍然会维持相等的权重。
让我们举一个例子我们有着股权相等的10个验证人佣金比例是1%。然后我们假设一个区块的增发奖励是1000个Atom每一个验证人有20%的自抵押Atom。这些token不会直接分给提案人。而是被均匀地分发给验证人。所以现在每个验证人的股权池获得100个Atom。这100个Atom会依据每个参与者的股权来分发
+ 佣金:` 100*80%*1% = 0.8 Atoms `
+ 验证人获得部分: ` 100*20% + 佣金 = 20.8 Atoms `
+ 委托人获得部分: ` 100*80% - 佣金 = 79.2 Atoms `
然后每个委托人可以按照他们在验证人股权池中的股权从79.2个Atom中等比例地索要属于他们应得的那一份。注意验证人的佣金不仅只适用于区块增发奖励也适用于区块奖励使用Photon支付
### 交易手续费怎么分配?
手续费以类似的方式分发,不同之处在于,如果区块的提案人有多于明确的提交所需的最小值,区块提案人就可以在由其提议的区块手续费中获得一笔奖励。
当一个验证人被选作去提议下一个区块时必须要含有对当前区块至少2/3的验证人签名许可。尽管如此仍然存在有一个激励去奖励那些超过2/3的验证人签名许可。这个奖励是线性的如果提案人含有2/3的签名许可区块有效的最小值比例是1% 如果提案人含有100%的签名许可比例是5%。当然,提案人不应该等待太久去做提案,或许其他的验证人有可能超时,长时间的等待容易造成提案的延误。这样的话,验证人不得不在获取最多签名的等待时间和失去对下个区块的提案之间寻找一个平衡点。这个机制旨在提案人不要去提案空块,维护验证人之间更好的网络,还有减轻审查。
让我们举一个实际的例子来说明上面的概念。在这个例子中有着10个股权相等的验证人。每个验证人采用1%的佣金比例有20%的自抵押Atom。现在产出了一个有着1025.51020408个Atom手续费的区块。
首先,一个 2% 的税是必须的。这部分Atom会进入贮存池中。贮存池里的资金会通过治理来分配用来作奖赏和更新升级的花费。
+ ` 2% * 1025.51020408 = 20.51020408 Atoms ` 进入到贮存池中
现在只剩下了1005个Atom。让我们假设提案人提案的区块包含了100%的验证人签名。因此提案人能获得手续费奖励中的5%的额外奖励。
我们解这个简单的算式得出给每一个验证人的奖励R :
` 9*R + R + R*5% = 1005 ⇔ R = 1005/10.05 = 100 `
+ 对于发起提案的验证人:
+ 奖金池获得 ` R + R * 5% = 105 Atoms `
+ 佣金: ` 105 * 80% * 1% = 0.84 Atoms `
+ 验证人的奖励: ` 105 * 20% + 佣金 = 21.84 Atoms `
+ 委托人的奖励: ` 105 * 80% - 佣金 = 83.16 Atoms `(每个委托人可以按照他们的股权占比等比例地索要这部分奖励)
+ 对于每个非提案验证人:
+ 奖金池获得 ` R = 100 Atoms `
+ 佣金: ` 100 * 80% * 1% = 0.8 Atoms `
+ 验证人的奖励: ` 100 * 20% + 佣金 = 20.8 Atoms `
+ 委托人的奖励: ` 100 * 80% - 佣金 = 79.2 Atoms `(每个委托人可以按照他们的股权占比等比例地索要这部分奖励)
### 遭到削减处罚的原因?
如果一个验证人行为不端其抵押的股权连同其委托人的股权都会遭到削减处罚。处罚的严重性依据错误的类型来定。有3个主要的错误会导致验证人和其委托人的资金遭到削减处罚
+ **双签**如果某人反馈在A链上一个验证人在相同高度的A链和B链上签署了两个区块这个验证人会被A链处罚。
+ **不在线** 如果一个验证人的签名没有被最近的X个区块包含对该验证人会按与X成比例的最低额度来处罚。如果X高于某个限制Y这个验证人会被赎回下线。
+ **不投票** 如果一个验证人没有对某个提案投票表决,一旦被某个人举报,他的股权会受到削减处罚。
请注意即使一个验证人并不是有意作恶在出现节点崩溃失去连接被DDOS攻击或者是私钥泄露的情况时仍然会被遭受削减处罚。
### 验证人需要去自抵押一些Atom吗?
不,他们不必。一个验证人的总股权等于其自抵押股权和受委托股权的总和。这意味着一个验证人可以通过吸引更多委托人来补偿其低额的自抵押股权。这也是为何对验证人而言,良好的声誉是极其重要的。
尽管对验证人来说是并没有义务去自抵押Atom委托人还是希望他们的验证人在其股权池里有一定的自抵押Atom。换句话说验证人应该共担风险。
为了委托人能获得一些与之共担风险的验证人给予的保证验证人可以声明一个最小数量的自抵押Atom额度。如果一个验证人的自抵押额度低于预先定义的限制该验证人和其所有的委托人的股权都会被赎回。
### 怎样预防股权集中到少数的验证人手中?
目前我们期望社区能有更明智的和有自我保护意识的行为表现。当一个Bitcoin的矿池获得过多的算力时社区通常会停止向该矿池贡献算力。Cosmos Hub在初期也将会依赖同样的方式。之后其他的机制会被应用来尽可能地使这个过程更顺畅
+ **免处罚的重新委托** :这允许委托人轻易地从一个验证人切换到另一个验证人,从而降低对验证人的粘性
+ **黑客赏金** 激励社区去攻击验证人。攻击者将获得与所攻击的验证人规模成比例的赏金,促使一个验证人随着其总股权的增长,成为一个受人关注的攻击目标。
+ **UI警告** 如果用户想要去委托股权给一个已经有了大量股权的验证人的话用户会收到来自Cosmos Voyager的警告。
## 技术要求
### 对硬件的要求是什么?
我们期望验证人供应一个或多个的有着充足电力网络资源防火墙安全HSM和服务器的数据中心。
我们期望初期能有一个适度级别的硬件规格说明书,会随着网络使用的增长而逐步提高标准。参与到测试网络是了解更多情况的不错方式。
### 对软件有什么要求?
除了能运行一个Cosmos Hub节点验证人还应该开发相关的监控预警和管理工具。
### 对带宽有什么要求?
与像Ethereum或Bitcoin这样的区块链相比Cosmos网络要有高吞吐量的性能。
我们建议数据中心只在云服务上连接信任的全节点或者是熟知的验证人节点这会减轻数据中心遭受DDOS攻击的压力。
最后随着网络越来越被重度使用具有单日GB级别的带宽是可能的。
### 运行一个验证人节点意味着什么?
运行一个成功的验证人节点需要多方面的高超技艺的和持久关注的共同努力。相比运行一个Bitcoin矿工节点要付出更多。
### 怎样去进行密钥管理?
我们期望验证人去运行一个HSM来支持ed25519密钥。下面是可能的选择
+ YubiHSM 2
+ Ledger Nano S
+ Ledger BOLOS SGX enclave
+ Thales nShield support
Tendermint团队不会推荐上面的其中之一。鼓励社区最好加强改进HSM和密钥管理的安全性。
### 在操作上我们期望验证人可以做到哪些?
进行有效率的操作是避免验证人节点的意外掉线或遭到削减处罚的关键所在。这包括良好的攻击应对方法,断电情况,还有维持数据中心的安全性和独立性。
### 维护需要什么?
验证人应该去执行常规的软件升级以适应更新和修复漏洞。在启动阶段的前期阶段不可避免的会出现一些网络问题,这需要大量的警觉。
### 验证人怎样保护自己免于DDOS攻击
当一个攻击者向一个IP地址发送海量的因特网流量来阻止该IP地址上的网络服务时这就是DDOS攻击。
一个攻击者扫描网络尽量去获得多个验证人节点的IP地址然后通过向他们发送海量流量来阻断他们之间的连接。
一个降低这样的风险的推荐做法是验证人在所谓的哨兵节点的架构中精心去构建他们的网络拓扑结构。
验证人节点应该只连接到他们所信任的全节点上因为他们可以操作自身也可以被他们熟知的其他验证人运行。一个验证人节点通常会运行在一个数据中心。大部分数据中心提供对主流云服务提供商的直接网络连接服务。验证人可以使用去连接云服务中的哨兵节点。验证人节点直接连接到他们的哨兵节点这样减缓了DOS攻击带来的压力可能需要新的哨兵节点被激活去减轻已存在的哨兵节点所遭受到的攻击。
哨兵节点能够迅速地被轮换或者改变它们的IP地址。因为与哨兵节点的连接是私有的IP网段基于因特网的攻击不可能直接骚扰到它们。这将确保验证人区块的提交和投票总是能传播到网络中的其余节点。
期待验证人在这方面良好的操作将完全消除这些威胁。
了解哨兵节点架构的更多信息请看[这里](https://forum.cosmos.network/t/sentry-node-architecture-overview/454)。

View File

@ -0,0 +1,216 @@
# 在主网上运行一个验证人
::: 提示
加入主网所需的信息(`genesis.json`和种子节点)在[`lauch` repo](https://github.com/cosmos/launch/tree/master/latest)中可以找到。
:::
在启动你验证人节点前,确定你已经完成了[启动全节点](../join-mainnet.md)教程。
## 什么是验证人?
[验证人](./overview.md)负责通过投票来向区块链提交新区块。如果验证人不可访问或者对多个相同高度的区块签名将会遭受到削减处罚。如果变得不可用或者在同一高度上签名则会被削减。请阅读有关Sentry节点架构的信息以保护您的节点免受DDOS攻击并确保高可用性。请阅读[哨兵节点网络架构]()来保护你的节点免于DDOS攻击并保证高的可访问性。
::: 警告
如果你想要成为Cosmos Hub主网的验证人你应该[安全研究](./security.md)。
:::
如果你已经[启动了一个全节点](../join-mainnet.md),可以跳过下一节的内容。
## 创建你的验证人
你的`cosmosvalconspub`可以用于通过抵押token来创建一个新的验证人。你可以通过运行下面的命令来查看你的验证人公钥
```bash
gaiad tendermint show-validator
```
使用下面的命令创建你的验证人:
::: 注意
不要使用多于你所拥有的`uatom`!
:::
```bash
gaiacli tx staking create-validator \
--amount=1000000uatom \
--pubkey=$(gaiad tendermint show-validator) \
--moniker="choose a moniker" \
--chain-id=<chain_id> \
--commission-rate="0.10" \
--commission-max-rate="0.20" \
--commission-max-change-rate="0.01" \
--min-self-delegation="1" \
--gas="auto" \
--gas-prices="0.025uatom" \
--from=<key_name>
```
::: 提示
在指定commission参数时`commission-max-change-rate`用于度量`commission-rate`的百分比点数的变化。比如1%到2%增长了100%,但反映到`commission-rate`上只有1个百分点。
:::
::: 提示
如果没有指定,`consensus_pubkey`将默认为`gaiad tendermint show-validator`命令的输出。`key_name`是将用于对交易进行签名的私钥的名称。
:::
你可以在第三方区块链浏览器上确定你是否处于验证人行列。
## 以初始验证人的形式加入到genesis文件
::: 警告
这一节内容只针对想要在Cosmos Hub主网启动前就作为初始验证人身份的节点。如果主网已经启动请跳过这一节。
:::
如果你想作为初始验证人被写入到genesis.json文件你需要证明你在创世状态中有一些权益代币创建一个或多个交易以将股权与你的验证人地址联系起来并将此交易包含在genesis文件中。
你的`cosmosvalconspub`可以用于通过抵押token来创建一个新的验证人。运行如下命令来获取你的验证人节点公钥
```bash
gaiad tendermint show-validator
```
然后执行`gaiad gentx`命令:
::: 提示
`gentx`是持有self-delegation的JSON文件。所有的创世交易会被`创世协调员`收集起来验证并初始化成一个`genesis.json`
:::
::: 注意
不要使用多于你所拥有的`uatom`!
:::
```bash
gaiad gentx \
--amount <amount_of_delegation_uatom> \
--commission-rate <commission_rate> \
--commission-max-rate <commission_max_rate> \
--commission-max-change-rate <commission_max_change_rate> \
--pubkey <consensus_pubkey> \
--name <key_name>
```
::: 提示
在指定佣金相关的参数时,`commission-max-change-rate`用于标识`commission-rate`每日变动的最大百分点数。比如从1%到2%按比率是增长了100%但只增加了1个百分点。
:::
你可以提交你的`gentx`到[launch repository](https://github.com/cosmos/launch). 这些`gentx`将会组成最终的genesis.json.
## 编辑验证人的描述信息
你可以编辑验证人的公开说明。此信息用于标识你的验证人节点,委托人将根据此信息来决定要委托的验证人节点。确保为下面的每个标识提供输入,否则该字段将默认为空( `--moniker`默认为机器名称)。
<key_name>指定你要编辑的验证人。如果你选择不包含此标识,记住必须要含有--from标识来指定你要更新的验证人。
`--identity`可用于验证和Keybase或UPort这样的系统一起验证身份。与Keybase一起使用时`--identity`应使用由一个[keybase.io](https://keybase.io/)帐户生成的16位字符串。它是一种加密安全的方法可以跨多个在线网络验证您的身份。 Keybase API允许我们检索你的Keybase头像。这是你可以在验证人配置文件中添加徽标的方法。
```bash
gaiacli tx staking edit-validator
--moniker="choose a moniker" \
--website="https://cosmos.network" \
--identity=6A0D65E29A4CBC8E \
--details="To infinity and beyond!" \
--chain-id=<chain_id> \
--gas="auto" \
--gas-prices="0.025uatom" \
--from=<key_name> \
--commission-rate="0.10"
```
**注意** : `commission-rate`的值必须符合如下的不变量检查:
+ 必须在 0 和 验证人的`commission-max-rate` 之间
+ 不得超过 验证人的`commission-max-change-rate`, 该参数标识**每日**最大的百分点变化数。也就是,一个验证人在`commission-max-change-rate`的界限内每日一次可调整的最大佣金变化。
## 查看验证人的描述信息
通过该命令查看验证人的描述信息:
```bash
gaiacli query staking validator <account_cosmos>
```
## 跟踪验证人的签名信息
你可以通过`signing-info`命令跟踪过往的验证人签名:
```bash
gaiacli query slashing signing-info <validator-pubkey>\
--chain-id=<chain_id>
```
## unjail验证人
当验证人因停机而"jailed"(入狱)时,你必须用节点操作人帐户提交一笔`Unjail`交易使其再次能够获得区块提交的奖励奖励多少取决于分区的fee分配
```bash
gaiacli tx slashing unjail \
--from=<key_name> \
--chain-id=<chain_id>
```
## 确认你的验证人节点正在运行
如果下面的命令返回有内容就证明你的验证人正处于活跃状态:
```bash
gaiacli query tendermint-validator-set | grep "$(gaiad tendermint show-validator)"
```
你必须要在[区块浏览器](https://explorecosmos.network/validators)中看见你的验证人节点信息。你可以在`~/.gaiad/config/priv_validator.json`文件中找到`bech32`编码格式的`address`。
::: 注意
为了能进入验证人集合你的权重必须超过第100名的验证人。
:::
## 常见问题
### 问题 #1 : 我的验证人的`voting_power: 0`
你的验证人已经是jailed状态。如果验证人在最近`10000`个区块中有超过`500`个区块没有进行投票或者被发现双签就会被jail掉。
如果被因为掉线而遭到jail你可以重获你的投票股权以重回验证人队伍。首先如果`gaiad`没有运行,请再次启动:
```
gaiad start
```
等待你的全节点追赶上最新的区块。接下来,运行以下命令。请注意,`<cosmos>`是你的验证人帐户的地址,`<name>`是验人帐户的名称。你可以通过运行`gaiacli keys list`找到此信息。
```bash
gaiad start
```
等待你的全节点追赶上最新的区块高度。然后,运行如下命令。接着,你可以[unjail你的验证人]()。
最后,检查你的验证人看看投票股权是否恢复:
```bash
gaiacli status
```
你可能会注意到你的投票权比之前要少。这是由于你的下线受到的削减处罚!
### 问题 #2 : 我的`gaiad`由于`too many open files`而崩溃
Linux可以打开的默认文件数每个进程是1024。已知`gaiad`可以打开超过1024个文件。这会导致进程崩溃。快速修复运行`ulimit -n 4096`(增加允许的打开文件数)来快速修复,然后使用`gaiad start`重新启动进程。如果你使用`systemd`或其他进程管理器来启动`gaiad`,则可能需要在该级别进行一些配置。解决此问题的示例`systemd`文件如下:
```toml
# /etc/systemd/system/gaiad.service
[Unit]
Description=Cosmos Gaia Node
After=network.target
[Service]
Type=simple
User=ubuntu
WorkingDirectory=/home/ubuntu
ExecStart=/home/ubuntu/go/bin/gaiad start
Restart=on-failure
RestartSec=3
LimitNOFILE=4096
[Install]
WantedBy=multi-user.target
```

View File

@ -0,0 +1,22 @@
# Gaia是什么
`gaia`是作为Cosmos SDK应用程序的Cosmos Hub的名称。它有两个主要的入口
+ `gaiad` : Gaia的服务进程运行着`gaia`程序的全节点。
+ `gaiacli` : Gaia的命令行界面用于同一个Gaia的全节点交互。
`gaia`基于Cosmos SDK构建使用了如下模块:
+ `x/auth` : 账户和签名
+ `x/bank` : token转账
+ `x/staking` : 抵押逻辑
+ `x/mint` : 增发通胀逻辑
+ `x/distribution` : 费用分配逻辑
+ `x/slashing` : 处罚逻辑
+ `x/gov` : 治理逻辑
+ `x/ibc` : 跨链交易
+ `x/params` : 处理应用级别的参数
> 关于Cosmos Hub : Cosmos Hub是第一个在Cosmos Network中上线的枢纽。枢纽的作用是用以跨链转账。如果区块链通过IBC协议连接到枢纽它会自动获得对其它连接至枢纽的区块链的访问能力。Cosmos Hub是一个公开的PoS区块链。它的权益代币称为Atom。
接着,学习如何[安装Gaia](./installation.md)

View File

@ -0,0 +1,11 @@
## SDK介绍
[Cosmos-SDK](https://github.com/cosmos/cosmos-sdk) 是一个架构,用于构建多资产股权证明(PoS)的区块链比如Cosmos Hub以及权益证明(PoA)的区块链。
Cosmos SDK的目标是允许开发者从头开始轻松创建原生就能同其他区块链相互操作的自定义区块链。我们设想SDK是类似于npm这样的框架以在[Tendermint](https://github.com/tendermint/tendermint)之上构建安全的区块链应用程序。
它基于两个主要原则:
+ **可组合性** 任何人都可以为Cosmos-SDK创建模块并且集成已经构建的模块就像将它们导入你的区块链应用程序那样简单。
+ **能力** SDK受基于功能的安全性的启发及多年来解决区块链状态机的经验。大多数开发人员在构建自己的模块时需要访问其他第三方模块。鉴于Cosmos-SDK是一个开放框架一些模块可能是恶意的这意味着需要安全原则来推理模块间的交互。这些原则基于对象能力。实际上这意味着不是让每个模块保留其他模块的访问控制列表而是每个模块都实现称为keeper的特殊对象这些对象可以传递给其他模块以授予预先定义的一组功能。例如如果模块A的keeper的实例被传递给模块B则后者将能够调用一些受限制的模块A的函数。每个keeper的功能由模块的开发人员定义开发人员需要根据传递到每个第三方模块的功能来理解和审计第三方模块外部代码的安全性。要深入了解请跳转到[本节](./ocap.md)。
### 接着,学习[SDK应用程序架构](./sdk-app-architecture.md)

View File

@ -0,0 +1,60 @@
# Object-Capability Model
## 介绍
在考虑安全性时,最好从特定的威胁模型开始。我们的威胁模型如下:
> 我们假设蓬勃发展的Cosmos-SDK模块生态中会包含错误或恶意的模块。
Cosmos SDK旨在通过以对象能力系统作为基础来解决此威胁。
> 对象能力系统的结构特性有利于代码设计中的模块化,并确保代码实现中的可靠封装。
>
> 这些结构上的特性便于分析一个对象能力程序或操作系统的某些安全属性。其中一些 - 特别是信息流属性 - 可以在对象引用和连接级别进行分析,而不依赖于对决定对象行为的代码的任何了解或分析。
>
> 因此,可以在存在包含未知或恶意代码的新对象的情况下建立和维护这些安全属性。
>
> 这些结构属性源于管理对现有对象的访问的两个规则:
> 1. 只要对象A持有对象B的引用A可以向B发送一条消息
> 2. 只要对象A收到了一条包含对象C引用的消息A可以获得C的引用。根据这两条规则一个对象只有通过一条先前存在的引用链获得另一个对象的引用简而言之“只有连接才能产生连接”。
查看关于[object-capabilities](http://habitatchronicles.com/2017/05/what-are-capabilities/)的文章了解更多。
严格来说Golang由于几个问题没有完全实现object-capabilities
+ 普遍有引入原始模块比如unsafe, os
+ 普遍重写模块的变量
+ 存在2个以上goroutine时的数据竞态漏洞可以创建非法的接口值
第一点很容易通过审计import和使用适当的依赖版本控制系统如Dep来捕获。但第二点和第三点就不容易了需要成本进行代码审核。
## 实践中的对象能力模式
想法就是只暴露完成工作所需要的部分。
比如,下面的代码片段违反了对象能力原则:
```go
type AppAccount struct {...}
var account := &AppAccount{
Address: pub.Address(),
Coins: sdk.Coins{sdk.NewInt64Coin("ATM", 100)},
}
var sumValue := externalModule.ComputeSumValue(account)
```
方法名`ComputeSumValue`暗示了这是一个不修改状态的纯函数,但传入指针值意味着函数可以修改其值。更好的函数定义是使用一个拷贝来替代:
```go
var sumValue := externalModule.ComputeSumValue(*account)
```
在Cosmos SDK中你可以看到[gaia app](https://github.com/cosmos/cosmos-sdk/blob/develop/cmd/gaia/app/app.go)中对该原则的实践。
```go
// register message routes
app.Router().
AddRoute(bank.RouterKey, bank.NewHandler(app.bankKeeper)).
AddRoute(staking.RouterKey, staking.NewHandler(app.stakingKeeper)).
AddRoute(distr.RouterKey, distr.NewHandler(app.distrKeeper)).
AddRoute(slashing.RouterKey, slashing.NewHandler(app.slashingKeeper)).
AddRoute(gov.RouterKey, gov.NewHandler(app.govKeeper))
```

View File

@ -0,0 +1,94 @@
# SDK应用程序架构
## 状态机
区块链应用的核心是[具有最终确定性的复制状态机](https://en.wikipedia.org/wiki/State_machine_replication)。
状态机是计算机科学概念,一台机器可以具有多个状态,但在任何给定时间只有一个状态,其描述了系统的当前状态,及触发这些状态转变的事务。
给定一个状态S和交易T状态机会返回一个新的状态S'。
```
+--------+ +--------+
| | | |
| S +---------------->+ S' |
| | apply(T) | |
+--------+ +--------+
```
实际上交易以区块的形式打包在一起以提高过程的效率。给定状态S和包含交易的区块B状态机将返回新状态S'。
```
+--------+ +--------+
| | | |
| S +----------------------------> | S' |
| | For each T in B: apply(T) | |
+--------+ +--------+
```
在区块链上下文环境中,状态机是确定性的。这意味着如果你从一个给定的状态开始,重放相同顺序的交易,将始终以相同的最终状态结束。
Cosmos SDK为你提供了最大的灵活性用以定义应用程序的状态交易类型和状态转变函数。使用SDK构建状态机的过程将在接下来的章节中进行更深入细致的描述。但首先让我们看看状态机是如何使用**Tendermint**进行复制的。
### Tendermint
作为一个开发者你只需要使用Cosmos-SDK定义状态机[Tendermint](https://tendermint.com/docs/introduction/introduction.html)将会为你处理网络层上的复制。
```
^ +-------------------------------+ ^
| | | | Built with Cosmos SDK
| | State-machine = Application | |
| | | v
| +-------------------------------+
| | | ^
Blockchain node | | Consensus | |
| | | |
| +-------------------------------+ | Tendermint Core
| | | |
| | Networking | |
| | | |
v +-------------------------------+ v
```
Tendermint是一个与应用程序无关的引擎负责处理区块链的网络层和共识层。实际上这意味着Tendermint负责传播和排序交易字节。Tendermint Core依赖于拜占庭容错BFT算法来达成交易顺序的共识。
Tendermint一致性算法同一组称为**验证人**的特殊节点一起运作。验证人负责向区块链添加交易区块。对于任何给定的区块有一组验证人V。通过算法选择V中的验证人A作为下一个区块的提议人。如果超过三分之二的V签署了[prevote](https://tendermint.com/docs/spec/consensus/consensus.html#state-machine-spec)和[precommit](https://tendermint.com/docs/spec/consensus/consensus.html#state-machine-spec),并且区块包含的所有交易都是有效的,则该区块被认为是有效的。验证人集合可以通过状态机中编写的规则进行更改。要深入了解算法,[点击](https://tendermint.com/docs/introduction/what-is-tendermint.html#consensus-overview)。
Cosmos SDK应用程序的主要部分是一个区块链服务程序它由网络中的每个节点在其本地运行。如果验证人集合中三分之一以下的是拜占庭即恶意的则每个节点在同时查询状态时应获得相同的结果。
## ABCI
Tendermint通过名为[ABCI](https://github.com/tendermint/tendermint/tree/master/abci)的接口将交易从网络层传递给应用程序,这是应用程序必须要实现的。
```
+---------------------+
| |
| Application |
| |
+--------+---+--------+
^ |
| | ABCI
| v
+--------+---+--------+
| |
| |
| Tendermint |
| |
| |
+---------------------+
```
注意Tendermint仅处理交易字节。它不知道这些字节究竟是什么意思。Tendermint所做的只是对交易确定性地排序。赋予这些字节意义是应用程序的工作。Tendermint通过ABCI将交易字节传递给应用程序并期望返回代码以知晓消息是否成功。
以下是ABCI中最重要的消息类型
+ `CheckTx` : 当Tendermint Core收到交易时会将其传递给应用程序以检查其有效性。一个名为“Ante Handler预处理”的特殊handler用于执行一系列验证步骤例如检查手续费用是否足够和验证签名是否合法。如果交易有效则将交易添加到[mempool交易池](https://tendermint.com/docs/spec/reactors/mempool/functionality.html#mempool-functionality)中并广播到对等节点。注意,`CheckTx`不会处理交易(即不会对状态进行修改),因为它们尚未包含在区块中。
+ `DeliverTx` : 当Tendermint Core接收到[有效区块](https://tendermint.com/docs/spec/blockchain/blockchain.html#validation)时,其中的每条交易都将通过`DeliverTx`传递给应用程序进行处理。正是在这一阶段发生了状态转换。“Ante Handler”将再次执行连同对交易中每条message进行实际处理的handler一起执行。
+ `BeginBlock`/`EndBlock` : 无论区块是否包含交易,这两个消息都将在每个区块的开头和结尾执行。触发自动的逻辑执行是很有用的。过程中要足够小心,因为计算成本高昂的循环运算可能会减慢区块链的速度,甚至在无限循环时区块链本身停滞。
有关ABCI方法和类型的详细介绍请[点击](https://tendermint.com/docs/spec/abci/abci.html#overview)。
在Tendermint上构建的任何应用程序都需要实现ABCI接口来同底层的本地Tendermint引擎进行通信。幸运的是你不必实现ABCI接口。Cosmos SDK以[baseapp]()的形式提供了样板实现。
### 接下来,学习[SDK的高级设计原则](./sdk-design.md)

View File

@ -0,0 +1,85 @@
# Cosmos SDK设计概览
Cosmos SDK是一个方便开发者开发基于Tendermint的安全可靠状态机的一套框架。其核心是Golang版的ABCI的实现。它附带一个`multistore`来持久化存储数据还有一个`router`来处理事务。
下面是一个简单的视图展示了当从Tendermint的`DeliverTx`请求(`CheckTx`的处理流程与其相同除了不会执行状态的改变中接收到一笔交易时基于Cosmos SDK构建的应用程序是如何处理交易的
1. 解码从Tendermint共识引擎接收到的交易记住Tendermint只处理`[]bytes`
2. 从交易中提取消息并进行基本的合理性检查。
3. 将每条消息路由至对应的模块进行处理。
4. 提交状态变更。
该应用程序能让你生成交易编码它们并传递给地城的Tendermint来进行广播
## `baseapp`
`baseApp`是Cosmos SDK的ABCI的实现样板。它有一个`router`用作把交易路由到对应的模块。你的应用程序的的主体`app.go`文件将定义你自定义的`app`类型,将嵌入`baseapp`。这样,你自定义的`app`类型将自动继承`baseapp`的所有方法。阅览[SDK应用程序教程](https://github.com/cosmos/sdk-application-tutorial/blob/master/app.go#L27)。
`baseapp`的目的是在存储和可扩展状态机之间提供安全接口同时尽可能少地定义该状态机保持对ABCI的真实性
有关`baseapp`的更多信息,请点击[这里](../concepts/baseapp.md)。
## Multistore
Cosmos SDK为将状态持久化提供了multistore。multistore允许开发者声明任意数量的[`KVStores`](https://github.com/blocklayerhq/chainkit)。`KVStores`只接受`[]byte`类型作为值,因此任何自定义的类型都需要在存储之前使用[go-amino](https://github.com/tendermint/go-amino)进行编码。
multistore用于区分不同的模块的状态每个都有其模块管理。要了解更多关于multistore的信息点击[这里](../concepts/store.md)
## Modules
Cosmos SDK的强大之处在于其模块发开发的理念。SDK应用程序通过把一组可以互相操作的模块组合起来生成。每个模块定义状态的自己并包含其自己的消息/交易处理器而SDK负责将每条消息路由到其各自归属的模块。
```
+
|
| Transaction relayed from Tendermint
| via DeliverTx
|
|
+---------------------v--------------------------+
| APPLICATION |
| |
| Using baseapp's methods: Decode the Tx, |
| extract and route the message(s) |
| |
+---------------------+--------------------------+
|
|
|
+---------------------------+
|
|
|
| Message routed to the correct
| module to be processed
|
|
+----------------+ +---------------+ +----------------+ +------v----------+
| | | | | | | |
| AUTH MODULE | | BANK MODULE | | STAKING MODULE | | GOV MODULE |
| | | | | | | |
| | | | | | | Handles message,|
| | | | | | | Updates state |
| | | | | | | |
+----------------+ +---------------+ +----------------+ +------+----------+
|
|
|
|
+--------------------------+
|
| Return result to Tendermint
| (0=Ok, 1=Err)
v
```
每个模块都可以看做一个小型的状态机。开发人员需要定义模块所处理的状态的自己已经用作修改状态的message类型(*注意*:message是由`baseapp`的方法从交易中提取的)。通常每个模块在multistore声明它自己的`KVStore`来持久化保存它所定义的状态子集。大多数开发者在构建自己的模块时也需要访问其他的第三方模块。鉴于Cosmos-SDK是一个开源的框架一些模块可能是恶意的这就意味着需要安全原则来合理化模块之间的交互。这些原则基于[object-capabilities](./ocap.md)。实际上这意味着不是让每个模块保留其他模块的访问控制列表而是每个模块都实现称作keeper的特殊对象这些对象可以传递给其他模块并授予预先定义的一组功能。
SDK模块在SDK的`x/`目录下定义。一些核心模块包括:
+ `x/auth`: 用于管理账户和签名.
+ `x/bank`: 用于实现token和token转账.
+ `x/staking` + `x/slashing`: 用于构建POS区块链.
除了`x/`中已有的模块,任何人都可以在他们的应用程序中使用它们自己定义的模块。你可以查看[示例教程](https://cosmos.network/docs/tutorial/keeper.html)。
### 接下来 学习Cosmos SDK的安全模型[ocap](./ocap.md)