---
# System prepended metadata

title: Kratos 验证人操作手册

---

# Kratos 验证人操作手册



- Kratos [源代码](https://github.com/KuChainNetwork/kratos)
- release 版本号 v0.5.3 [Release Kratos v0.5.3-RC Release](https://github.com/KuChainNetwork/kratos/releases/tag/v0.5.3)
- 区块浏览器: [KuChain Explorer](https://explorer.kuchain.network/)
- 推荐机器配置：
  - Linux Ubuntu 18.04 lts
  - 4 核 16G 内存
  - cpu 主频 3.1以上
  - 带宽 5M
  - 500GB 硬盘



## 部署脚本

参考此脚本文档快速构建 Kratos 同步节点。



## 操作步骤

1. 安装相关工具，下载kratos源码到本地，编译源码。
2. 下载 genesis 文件，更新配置，启动节点。
3. 生成钱包并创建链上用户名（链上用户名需符合格式：12个字符）。
4. 给用户名转账，注册验证人身份。
5. 为验证节点抵押投票。



## 1. 安装相关工具，下载kratos源码到本地，编译源码

```
#!/usr/bin/env bash

# 安装相关工具
sudo apt-get update
sudo apt-get upgrade -y
sudo apt-get install git -y
sudo apt-get install build-essential -y
sudo apt-get install curl -y
curl -O https://dl.google.com/go/go1.14.4.linux-amd64.tar.gz
sudo tar -xvf go1.14.4.linux-amd64.tar.gz -C /opt/
rm go1.14.4.linux-amd64.tar.gz

# 设置 `$PATH` 环境变量:
sudo mkdir /opt/gopath
sudo chmod 0777 /opt/gopath
echo "export GOROOT=/opt/go" >> ~/.profile
echo "export GOPATH=/opt/gopath" >> ~/.profile
echo "export PATH=\$PATH:\$GOROOT/bin:\$GOPATH/bin" >> ~/.profile
source ~/.profile

# 从github复制kratos文件到本地
git clone https://github.com/KuChainNetwork/kratos.git 

# 定位到下载好的kratos文件夹
cd kratos 

git pull

# 切换到当前的发布分支
git checkout v0.5.3

# 编译源码
make all -e CORE_SYMBOL=kts -e MAIN_SYMBOL=kratos

```



## 2. 下载 genesis 文件，更新配置，启动节点

```
# 初始化节点信息 —— moniker 为节点名称
kucd init --chain-id=kratos <moniker>

# 下载 genesis 文件并覆盖默认的 genesis 配置
curl -O https://gist.githubusercontent.com/cain42/962c3f265cc258bc4f39aa594b517f1f/raw/a62c539f4ced3c70cef58b5d3afae37afb766935/genesis.json
mv genesis.json ~/.kucd/config/

# 更新 config 文件 seeds 配置信息
sed -i "s/seeds = \"\"/seeds = \"3192fada5783c4094c5f1e34998d22c28ae17b3c@54.250.252.137:26656,035ec954c47f0b40c02491fc9abd4ce398bfec70@39.99.233.130:26656,31fc3d7e406c4869af4d008746a2f72180e92c7b@39.99.154.141:26656,0f4d7149fbe35d7114630a17d545d584915ec856@147.139.31.48:26656,5434d9687037f732720cb3e607c8ab4eab192ae4@47.254.66.202:26656,72861902a218d37407891e2aaff75ce79ed8d1bd@47.252.75.40:26656\"/g" "${HOME}/.kucd/config/config.toml"

# 启动节点
kucd start
# 或后台启动
nohup kucd start &
```



启动节点后，你可以通过日志来查看节点的记录

```
tail -f ./log/node.log
```

> **注意** : 脚本会在 ~/.kucd/config/priv_validator_key.json 位置初始化节点的私钥，请将其备份。



### 验证人手册

##### 验证节点须知

Kratos 重构了资产与账户模块，在分红领取的模块也做了相应的重构，需要验证人节点需要了解一些基本的操作命令来完成账号注册，节点抵押，分红领取，资权确认等常规操作。

##### 账户与地址

在 Kratos 中，账户作为权限管理的基本单位，其所有权通过 Auth 来确权，当我们生成过私钥之后，将会获得一个唯一的地址，如果想成为验证人，需要在区块链上注册一个用户名，这里的用户名相当于一个和地址账务平行的账户，也就是说用户名的账本信息与其 Auth 绑定的地址余额隔离，假如 kratosxxx 地址有 10 KTSt ，与这个地址绑定的账户名 accountnamexxxx下并不拥有这 10 KTSt，同理，accountnamexxxx 账户作为收款方接收到的资产，不会出现在 kratosxxx 中，而是在账户名的账本下。

##### 用户名格式：

- 12 位
- 字母a-z （只有小写）
- 数字0-9
- 符号支持`@`和`.`, `@`作为账户分隔符只能有一个

`Kratos`中`@`视为账户分隔符, 具有`@`的账户名称可分隔为在前的标识名和在后的组织名, 其中若组织名为链主符号的账户为系统保留账户, 只作为系统机制使用, 包括系统账户或root账户在内的账户都不能主动创建系统账户.



## 3. 生成钱包并创建链上用户名

```
# 生成钱包，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 --chain-id kratos --keyring-backend test 
```



## 4. 给用户名转账，注册验证人身份

#### 给用户名转账

```
# <address of localkey> 是localkey的地址，testvalidaor为账户名，第二个<address of localkey>为Auth绑定的地址
./kucli tx asset transfer <address of localkey> testvalidaor 1000000000kratos/kts --fee-payer <address of localkey> --from localkey --chain-id kratos --keyring-backend test
```



##### 查询账户

```
# 查询账户信息
kucli query account get testvalidaor

# 查询绑定了地址为 Auth 的账户
kucli query account auth <address of localkey>

# 查询账户余额，这里的用户名也可以替换为地址，但查询到的账户信息是不同
kucli query asset coins testvalidaor
```

> 账户的权限(Auth)指向了一个地址, 多个账户可以有相同地址的权限, 但这些账户在逻辑上是没有关联，且资产独立

 

#### 注册验证人身份

在Kratos中如果想要成为验证者,首先需要有一个节点能同步区块的信息,这个节点同时可以提供节点的公钥,节点公钥的作用是验证某一个区块的签名是否属于该节点.其次需要有一个在Kratos链上注册的账户,作为该节点的操作员.然后是两个常规的参数:moniker和commission-rate,moniker是节点的名字,commission-rate是佣金比例,这两个参数在节点创建以后是可以进行修改的.

```
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 账户进行付费.

  

##### 查询验证人

```
kucli query kustaking validator testvalidaor --chain-id kratos --keyring-backend test

{
  "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 表示没有被惩罚.

- 正在被惩罚的验证者无论抵押数多少都不会成为有效验证者
- 没有被惩罚的验证者可以凭自身的抵押数目来竞选有效验证者



## 5. 为验证节点抵押投票

```
kucli tx kustaking delegate delegator testvalidaor 98760540321kratos/kts --from localkey
```

- delegator 是进行抵押的链上用户名
- testvalidaor 是验证者的账户
- amount 是进行抵押的数量，这里的数值需要附带精度信息，Kratos 中的精度为 18 位，** Kratos 上 1 个代币是100000000000000000kratos/kts**
- –from 来确定用哪个本地私钥进行签名



##### 赎回抵押

```
 kucli tx kustaking unbond delegator testvalidaor 100kratos/kts --from localkey
```

- delegator 抵押主代币的链上账户名
- testvalidaor 验证者的操作账户
- amount 是需要赎回的数量,如果这个数量比抵押的数量大的话则 txmsg 会报错
- –from 来确定用哪个本地的私钥进行签名



##### 验证者的惩罚

当出现以下情况的时候,Kratos会对验证者进行惩罚:

- 当验证者出现双签的时候
- 当验证者在连续100个块内漏块个数超过50个的时候.

相关惩罚情况

- 当验证者出现双签的时候,Kratos会将验证者的`Jailed`状态设置为true,将其从有效验证者队列中踢出,并扣除该验证者上面总抵押数量的5%.验证者可以在14天以后通过`unjail`操作将`Jailed`状态设置为False,并继续竞争有效验证者.
- 当验证者在连续100个块内漏块个数超过50个的时候,Kratos会将验证者的`Jailed`状态设置为true,将其从有效验证人队列中踢出,并扣除该验证人总抵押数量的0.01%.验证人可以在10分钟以后通过`unjail`操作将`Jailed`状态设置为False,并继续竞争有效验证者.

用户的出块以及惩罚情况可以通过kuslashing模块进行查询

```
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 命令的相关参数



##### 恢复惩罚节点

```
kucli tx kuslashing unjail testvalidaor --from localkey --keyring-backend test --chain-id kratos
```

- testvalidaor 被惩罚的验证者的操作员的账户
- –from 来确定用哪个本地私钥进行签名



##### 节点收益领取

[Kratos 激励系统](https://hackmd.io/@KuChain/distribution)



##### 资权(Coinpower)

为了支持可编程资产, Kratos定义了资权(Coinpower), 资权可以转为资产, 但资产不能主动转为资权.



当用户有coinpower时, 可以通过`exercise`确权而获取coin:

首先确认coinpower:

```
./build/kucli query asset coinpowers validator1
- denom: kratos/kts
  amount: "8123569779369697717424050"
```



确权:

```
./kucli tx asset exercise testvalidator kratos/kts --from localkey --chain-id kratos --keyring-backend test --fee-payer testvalidator
```



此时用户就可以获取到coin