# Kratos 部署脚本
- Kratos [源代码](https://github.com/KuChainNetwork/kratos)
- release 版本号 v0.5.1 [Release Kratos v0.5.1-RC Release](https://github.com/KuChainNetwork/kratos/releases/tag/v0.5.1)
- 区块浏览器: [KuChain Explorer](https://explorer.kuchain.network/)
- 推荐机器配置:
- Linux Ubuntu 18.04 lts
- 4 核 16G 内存
- cpu 主频 3.1以上
- 带宽 5M
- 500GB 硬盘
## 部署脚本
我们可以使用这个脚本快速的构建 kratos 同步节点
## Usage
运行脚本之前需要安装相关的依赖
OS X:
```bash
brew install curl
```
Ubuntu:
```bash
sudo apt-get install curl -y
```
创建节点:
```bash
mkdir kratos-node
cd kratos-node
curl -O https://raw.githubusercontent.com/KuChainNetwork/kratos-genesis/master/scripts/boot-node.sh
bash boot-node.sh
```
脚本会在创建 kratos-node/ 目录, 然后自动启动节点.
脚本从 github 下载二进制文件,然后启动节点
你可以通过日志来查看节点的记录:
```bash
tail -n 10 ./log/node.log
```
> **注意** : 脚本会在 node/config/priv_validator_key.json 位置初始化节点的私钥,请将其备份。
为了操作简便,可以将 bin/ 目录下的二进制文件重命名为 kucd 与 kucli
## 验证人手册
### 验证节点须知
Kratos 重构了资产与账户模块,在分红领取的模块也做了相应的重构,需要验证人节点需要了解一些基本的操作命令来完成账号注册,节点抵押,分红领取,资权确认等常规操作。
#### 账户与地址
在 Kratos 中,账户作为权限管理的基本单位,其所有权通过 Auth 来确权,当我们生成过私钥之后,将会获得一个唯一的地址,如果想成为验证人,需要在区块链上注册一个用户名,这里的用户名相当于一个和地址账务平行的账户,也就是说用户名的账本信息与其 Auth 绑定的地址余额隔离,假如 kratosxxx 地址有 10 kts ,与这个地址绑定的账户名 accountnamexxxx下并不拥有这 10 kts,同理,accountnamexxxx 账户作为收款方接收到的资产,不会出现在 kratosxxx 中,而是在账户名的账本下。
用户名格式:
- 12 位
- 字母a-z (只有小写)
- 数字0-9
- 符号支持`@`和`.`, `@`作为账户分隔符只能有一个
`Kuchain`中`@`视为账户分隔符, 具有`@`的账户名称可分隔为在前的标识名和在后的组织名, 其中若组织名为链主符号的账户为系统保留账户, 只作为系统机制使用, 包括系统账户或root账户在内的账户都不能主动创建系统账户.
##### 创建账户名
```shell
# localkey 是本地管理的私钥别名
kucli keys add localkey --chain-id kratos --keyring-backend test
# 创建账户名 <address of localkey> localkey 的地址 testvalidaor 为账户名 第二个 <address of localkey> 为 Auth 绑定的地址
kucli tx account create <address of localkey> testvalidaor <address of localkey> --fee-payer <address of localkey> --from localkey
```
#### 转账
```
./kucli tx asset transfer <address of localkey> testvalidaor 1000000000kratos/kts --fee-payer <address of localkey> --from localkey --chain-id kratos --keyring-backend test
```
##### 查询账户
```shell
# 查询账户信息
kucli query account get testvalidaor
# 查询绑定了地址为 Auth 的账户
kucli query account auth <address of localkey>
# 查询账户余额,这里的用户名也可以替换为地址,但查询到的账户信息是不同
kucli query asset coins testvalidaor
```
> 账户的权限(Auth)指向了一个地址, 多个账户可以有相同地址的权限, 但这些账户在逻辑上是没有关联,且资产独立
#### 验证人
##### 注册验证人
在kuchain中如果想要成为验证者,首先需要有一个节点能同步区块的信息,这个节点同时可以提供节点的公钥,节点公钥的作用是验证某一个区块的签名是否属于该节点.其次需要有一个在kuchain链上注册的账户,作为该节点的操作员.然后是两个常规的参数:moniker和commission-rate,moniker是节点的名字,commission-rate是佣金比例,这两个参数在节点创建以后是可以进行修改的.
```shell
kucli tx kustaking create-validator testvalidaor\
--pubkey=$(./kucd tendermint show-validator) \
--moniker="secode test" \
--from=localkey \ # 本地钱包的别名
--commission-rate="0.10" # 10%
--chain-id kratos
--keyring-backend test
```
- pubkey 是节点的公钥,这里通过`./kucd tendermint show-validator`命令获取
- testvalidaor 是之前我们注册的链上账户
- moniker 是节点的名字,节点的名字不能超过 70 个字符
- commission-rate 是佣金比例,这里是 0.10 ,佣金比例的范围在 0~1 之间
- from 是 kucli 调用钱包进行签名所使用的参数,这里用钱包中 localkey 的私钥进行签名
- 缺省的参数是 fee-payer ,这里默认使用了localkey 账户进行付费.
##### 查询验证人
```shell
kucli query kustaking validator testvalidaor
{
"operator_account": "testvalidaor",
"consensus_pubkey": "kratosvalconspubxxxxxx",
"status": 1,
"tokens": "0",
"delegator_shares": "0.000000000000000000",
"description": {
"moniker": "secode test"
},
"unbonding_time": "1970-01-01T00:00:00Z",
"commission": {
"commission_rates": {
"rate": "0.100000000000000000",
"max_rate": "1.000000000000000000",
"max_change_rate": "1.000000000000000000"
},
"update_time": "2020-09-15T03:23:07.823072717Z"
},
"min_self_delegation": "1"
}
```
`status` 这个字段的含义如下:
- 1 代表的是 unbonding 状态,这个状态是一个候选节点的状态,一般当一个节点上面的抵押不足以使它成为一个有效的验证者的时候,该验证者是 unbonding 状态
- 2 代表的是 unbonded 状态,这个状态是当一个验证者之前是 bonded 状态,但是由于一些原因被链惩罚的时候会将状态置为 unbonded 状态
- 3 代表的是 bonded 状态,也就是有效验证者的状态
除了`status`字段,验证者还有一个很重要的状态字段是`Jailed`,这是一个 bool 类型的字段, true 表示正在被惩罚, false 表示没有被惩罚.
- 正在被惩罚的验证者无论抵押数多少都不会成为有效验证者
- 没有被惩罚的验证者可以凭自身的抵押数目来竞选有效验证者
##### 为节点抵押投票
```shell
kucli tx kustaking delegate delegator testvalidaor 98760540321kratos/kts --from localkey
```
- delegator 是进行抵押的链上用户名
- testvalidaor 是验证者的账户
- amount 是进行抵押的数量,这里的数值需要附带精度信息,kratos 中的精度为 18 位,** kratos 上 1 个代币是100000000000000000kratos/kts**
- --from 来确定用哪个本地私钥进行签名
##### 赎回抵押
```shell
kucli tx kustaking unbond delegator testvalidaor 100kratos/kts --from localkey
```
- delegator 抵押主代币的链上账户名
- testvalidaor 验证者的操作账户
- amount 是需要赎回的数量,如果这个数量比抵押的数量大的话则 txmsg 会报错
- --from 来确定用哪个本地的私钥进行签名
##### 验证者的惩罚
当出现以下情况的时候,kuchain会对验证者进行惩罚:
- 当验证者出现双签的时候
- 当验证者在连续100个块内漏块个数超过50个的时候.
相关惩罚情况
- 当验证者出现双签的时候,kuchain会将验证者的`Jailed`状态设置为true,将其从有效验证者队列中踢出,并扣除该验证者上面总抵押数量的5%.验证者可以在14天以后通过`unjail`操作将`Jailed`状态设置为False,并继续竞争有效验证者.
- 当验证者在连续100个块内漏块个数超过50个的时候,kuchain会将验证者的`Jailed`状态设置为true,将其从有效验证人队列中踢出,并扣除该验证人总抵押数量的0.01%.验证人可以在10分钟以后通过`unjail`操作将`Jailed`状态设置为False,并继续竞争有效验证者.
用户的出块以及惩罚情况可以通过kuslashing模块进行查询
```shell
kucli query kuslashing signing-info [validator-conspub] [flags]
{
"address": "kratosvalconsxxxxx",
"start_height": "7192",
"index_offset": "2",
"jailed_until": "2020-09-15T08:32:16.653850079Z",
"missed_blocks_counter": "2"
}
```
- validator-conspub 是验证者的公钥
- flags 是通用的参数
上面是 testvalidaor 账户的相关查询情况,这里是等待 testvalidaor 漏块超过 50 个以后的查询,上面有一个 jailed_until 是可以通过 unjail 操作进行解除惩罚的一个时间节点.下面是 unjail 命令的相关参数
##### 恢复惩罚节点
```shell
kucli tx kuslashing unjail testvalidaor --from localkey --keyring-backend test --chain-id kratos
```
- testvalidaor 被惩罚的验证者的操作员的账户
- --from 来确定用哪个本地私钥进行签名
#### 节点收益领取
[Kratos 激励系统 ](https://hackmd.io/@KuChain/distribution)
#### 资权(Coinpower)
为了支持可编程资产, Kuchain定义了资权(Coinpower), 资权可以转为资产, 但资产不能主动转为资权.
当用户有coinpower时, 可以通过`exercise`确权而获取coin:
首先确认coinpower:
```bash
./build/kucli query asset coinpowers validator1
- denom: kuchain/sys
amount: "8123569779369697717424050"
```
确权:
```bash
./kucli tx asset exercise testvalidator kratos/kts --from localkey --chain-id kratos --keyring-backend test --fee-payer testvalidator
```
此时用户就可以获取到coin