---
# System prepended metadata

title: Kratos 激励系统

---

Kratos distribution

# Kratos 激励系统

激励系统是kuchain链上进行激励管理的一套机制。kuchain的激励系统通过分配代币给验证者和出块者，从而鼓励积极参与链上活动。激励系统实现了一种在验证者和委托者之间分配奖励的功能。

这种分配奖励机制如下操作。所有的出块奖励在激励系统内汇总，并分配给验证者和委托人。每个验证者代替它的委托者收取的奖励和佣金。奖励直接发送到验证者奖励池中。

- 每当发生影响奖励分配率的参数更改时，会触发委托者领取奖励。
- 每当触发委托者领取奖励时，都必须领取获得的最大金额。
- 每当委托者创建委托抵押，解除委托抵押或重新委托抵押时，都必须完全领取奖励。
- 每当验证者选择更改奖励佣金时，必须同时领取所有累积的佣金奖励。




## 领取奖励

委托者领取奖励，首先要建立委托关系。一个委托者对验证者进行抵押一定数额的代币就建立了委托关系，详细介绍在验证者章节。从所有建立完成的委托关系中领取奖励，例如alice 投票给validator，这命令从validator 领取奖励

```
Example:
$ kucli tx kudistribution withdraw-rewards validator  Delegator --from jack
$ kucli tx kudistribution withdraw-rewards validator  Delegator --from jack --commission

Usage:
  kucli tx kudistribution withdraw-rewards [validator]  --from delegator [flags]

Flags:
  -a, --account-number uint      The account number of the signing account (offline mode only)
  -b, --broadcast-mode string    Transaction broadcasting mode (sync|async|block) (default "sync")
      --commission               also withdraw validator's commission
      --dry-run                  ignore the --gas flag and perform a simulation of a transaction, but don't broadcast it
      --fee-payer string         fee payer for tx
      --fees string              Fees to pay along with transaction; eg: 10uatom
      --from string              Name or address of private key with which to sign
      --gas string               gas limit to set per-transaction; set to "auto" to calculate required gas automatically (default 200000) (default "200000")
      --gas-adjustment float     adjustment factor to be multiplied against the estimate returned by the tx simulation; if the gas limit is set manually this flag is ignored  (default 1)
      --gas-prices string        Gas prices to determine the transaction fee (e.g. 10uatom)
      --generate-only            Build an unsigned transaction and write it to STDOUT (when enabled, the local Keybase is not accessible and the node operates offline)
  -h, --help                     help for withdraw-rewards
      --indent                   Add indent to JSON response
      --keyring-backend string   Select keyring's backend (os|file|test) (default "os")
      --ledger                   Use a connected Ledger device
      --memo string              Memo to send along with transaction
      --node string              <host>:<port> to tendermint rpc interface for this chain (default "tcp://localhost:26657")
  -s, --sequence uint            The sequence number of the signing account (offline mode only)
      --trust-node               Trust connected full node (don't verify proofs for responses) (default true)
  -y, --yes                      Skip tx broadcasting prompt confirmation

Global Flags:
      --chain-id string   Chain ID of tendermint node
  -e, --encoding string   Binary encoding (hex|b64|btc) (default "hex")
      --home string       directory for config and data (default "/root/.kucli")
  -o, --output string     Output format (text|json) (default "text")
      --trace             print out full stack trace on errors

```

常用参数说明：

- --commission 佣金一并领取
- --from 参数需要制定地址本身, 在生成事务数据时, 命令行假定并不和钱包与链通信, 所以需要输入原始数据.
- --home 和 --keyring-backend 对应的钱包不同, 在使用时, 可以先使用 keys list 命令查询对应的钱包中的key, 可以对应看是否是正确的钱包

- --chain-id 表示链 id, 这个对于一条链来说是常量, 如果 chain-id 不正确, 签名必然失败.
- flags 是一些额外的参数,文本提案有它需要的参数

例子：

先是准备，alice 投票给验证者账户validator：

```
./kucli tx kustaking delegate alice validator 800000000000000000000kuchain/sys --from alice --chain-id=testing --keyring-backend test
```

领取之前, 查询alice账户：

```
./kucli query asset coins  alice
- denom: kuchain/sys
  amount: "1199999999999999998000"
  
./kucli query asset coinpowers alice
[]
```

领取执行：

```
./kucli tx kudistribution withdraw-rewards validator alice --from alice --chain-id=testing --keyring-backend test	--commission
```

领取之后查询alice账户：

```
./kucli query asset coinpowers alice
- denom: kuchain/sys
  amount: "10678830653166400"
```



## 委托者领取所有奖励

委托者领取奖励，从所有建立完成的委托关系中领取奖励，例如alice 投票给validator1和validator2，这命令从validator1和validator2 领取奖励

```
Example:
$ kucli tx kudistribution withdraw-all-rewards  --from jack

Usage:
  kucli tx kudistribution withdraw-all-rewards [delegator] --from [delegator] [flags]

Flags:
  -a, --account-number uint      The account number of the signing account (offline mode only)
  -b, --broadcast-mode string    Transaction broadcasting mode (sync|async|block) (default "sync")
      --dry-run                  ignore the --gas flag and perform a simulation of a transaction, but don't broadcast it
      --fee-payer string         fee payer for tx
      --fees string              Fees to pay along with transaction; eg: 10uatom
      --from string              Name or address of private key with which to sign
      --gas string               gas limit to set per-transaction; set to "auto" to calculate required gas automatically (default 200000) (default "200000")
      --gas-adjustment float     adjustment factor to be multiplied against the estimate returned by the tx simulation; if the gas limit is set manually this flag is ignored  (default 1)
      --gas-prices string        Gas prices to determine the transaction fee (e.g. 10uatom)
      --generate-only            Build an unsigned transaction and write it to STDOUT (when enabled, the local Keybase is not accessible and the node operates offline)
  -h, --help                     help for withdraw-all-rewards
      --indent                   Add indent to JSON response
      --keyring-backend string   Select keyring's backend (os|file|test) (default "os")
      --ledger                   Use a connected Ledger device
      --max-msgs int             Limit the number of messages per tx (0 for unlimited) (default 5)
      --memo string              Memo to send along with transaction
      --node string              <host>:<port> to tendermint rpc interface for this chain (default "tcp://localhost:26657")
  -s, --sequence uint            The sequence number of the signing account (offline mode only)
      --trust-node               Trust connected full node (don't verify proofs for responses) (default true)
  -y, --yes                      Skip tx broadcasting prompt confirmation

Global Flags:
      --chain-id string   Chain ID of tendermint node
  -e, --encoding string   Binary encoding (hex|b64|btc) (default "hex")
      --home string       directory for config and data (default "/root/.kucli")
  -o, --output string     Output format (text|json) (default "text")
      --trace             print out full stack trace on errors
      
```

例子：

准备环境，创建多个节点，使得环境有多个验证者。

```
 ./kucli tx kustaking create-validator jack  --pubkey=$(./kucd tendermint show-validator --home "./slave")   --moniker="create new node"   --from=jack   --commission-rate="0.40"    --chain-id=testing --keyring-backend test
 
 ./kucli tx kustaking delegate alice validator 800000000000000000000kuchain/sys --from alice --chain-id=testing --keyring-backend test
 
 ./kucli tx kustaking delegate alice jack 800000000000000000000kuchain/sys --from alice --chain-id=testing --keyring-backend test
 
```

!!! warning "注意"

    --pubkey=$(./kucd tendermint show-validator --home "./slave" ， --home 路径是新节点路径

查询验证环境，当前环境中有两个验证人账户，分别是 validaor和jack 

```
./kucli query kustaking validators
- operator_account: jack
  consensus_pubkey: kuchainvalconspub1zcjduepqnxrr955j0yra8al0knhfpzg9xamyrdnuraz5t099qwgsp22vf2jqh8vd0x
  jailed: false
  status: 3
  tokens: "800000000000000000000"
  delegator_shares: "800000000000000000000.000000000000000000"
  description:
    moniker: create new node
    identity: ""
    website: ""
    security_contact: ""
    details: ""
  unbonding_height: 0
  unbonding_time: 1970-01-01T00:00:00Z
  commission:
    commission_rates:
      rate: "0.400000000000000000"
      max_rate: "1.000000000000000000"
      max_change_rate: "1.000000000000000000"
    update_time: 2020-08-12T05:42:42.507884859Z
  min_self_delegation: "1"
- operator_account: validator
  consensus_pubkey: kuchainvalconspub1zcjduepqu62j0eud0sllvwfe9h4t3knnzl334ntz9kq38h46lzafm4qgqdrqjmguk4
  jailed: false
  status: 3
  tokens: "100000000000000000000"
  delegator_shares: "100000000000000000000.000000000000000000"
  description:
    moniker: testing
    identity: ""
    website: ""
    security_contact: ""
    details: ""
  unbonding_height: 0
  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-08-12T05:41:39.22248249Z
  min_self_delegation: "1"

```

领取之前，alice 账户状态：

```
 ./kucli query asset coins  alice
- denom: kuchain/sys
  amount: "1199999999999999998000"

./kucli query asset coinpowers alice
[]
```

触发领取:

```
./kucli tx kudistribution withdraw-all-rewards alice --from alice  --chain-id=testing --keyring-backend test
```

领取之后，alice 账户状态：

```
./kucli query asset coins  alice

- denom: kuchain/sys
	amount: "1199999999999999998000"

./kucli query asset coinpowers alice

- denom: kuchain/sys
	amount: "885936749122400"
```



## 设置领取奖励账户

一个委托者投票抵押给一个验证者，建立了委托收益关系。当委托者触发领取出块奖励时，系统会转账到委托账户。委托者可以设置接收奖励的账户，当委托者触发领取出块奖励时，激励系统会把奖励转账到这个设置账户

```
Example:
$ kucli tx kudistribution set-withdraw withdrawacc  account --from account

Usage:
  kucli tx kudistribution set-withdraw [withdrawAccount] --from account [flags]

Flags:
  -a, --account-number uint      The account number of the signing account (offline mode only)
  -b, --broadcast-mode string    Transaction broadcasting mode (sync|async|block) (default "sync")
      --dry-run                  ignore the --gas flag and perform a simulation of a transaction, but don't broadcast it
      --fee-payer string         fee payer for tx
      --fees string              Fees to pay along with transaction; eg: 10uatom
      --from string              Name or address of private key with which to sign
      --gas string               gas limit to set per-transaction; set to "auto" to calculate required gas automatically (default 200000) (default "200000")
      --gas-adjustment float     adjustment factor to be multiplied against the estimate returned by the tx simulation; if the gas limit is set manually this flag is ignored  (default 1)
      --gas-prices string        Gas prices to determine the transaction fee (e.g. 10uatom)
      --generate-only            Build an unsigned transaction and write it to STDOUT (when enabled, the local Keybase is not accessible and the node operates offline)
  -h, --help                     help for set-withdraw
      --indent                   Add indent to JSON response
      --keyring-backend string   Select keyring's backend (os|file|test) (default "os")
      --ledger                   Use a connected Ledger device
      --memo string              Memo to send along with transaction
      --node string              <host>:<port> to tendermint rpc interface for this chain (default "tcp://localhost:26657")
  -s, --sequence uint            The sequence number of the signing account (offline mode only)
      --trust-node               Trust connected full node (don't verify proofs for responses) (default true)
  -y, --yes                      Skip tx broadcasting prompt confirmation

Global Flags:
      --chain-id string   Chain ID of tendermint node
  -e, --encoding string   Binary encoding (hex|b64|btc) (default "hex")
      --home string       directory for config and data (default "/root/.kucli")
  -o, --output string     Output format (text|json) (default "text")
      --trace             print out full stack trace on errors
```

例子：

准备环境设置委托关系，alice 投票给validator账户，查询alice 账户状态如下

	 ./kucli tx kustaking delegate alice validator 800000000000000000000kuchain/sys --from alice --chain-id=testing --keyring-backend test
	
	./kucli query asset coins  test1
	- denom: kuchain/sys
	  amount: "2000000000000000000000"
	
	./kucli query asset coinpowers test1
	[]
	
	./kucli query asset coins  alice
	- denom: kuchain/sys
	  amount: "1199999999999999998000"
	  
	./kucli query asset coinpowers alice
	[]

触发设置新的领取账户

```
./kucli tx kudistribution set-withdraw test1  alice --from alice  --chain-id=testing --keyring-backend test
```

触发领取

```
./kucli tx kudistribution withdraw-rewards validator alice --from alice --chain-id=testing --keyring-backend test
```

领取之后，查询alice 账户状态

```
./kucli query asset coinpowers test1
- denom: kuchain/sys
  amount: "1609862043449600"
./kucli query asset coinpowers alice
[]

./kucli query asset coins  test1
- denom: kuchain/sys
  amount: "2000000000000000000000"
./kucli query asset coins  alice
- denom: kuchain/sys
  amount: "1199999999999999994000"
```



## 查询分配系统参数

查询分配系统计算奖励的部分参数

```
Usage:
  kucli query kudistribution params [flags]

Flags:
      --height int    Use a specific height to query state at (this can error if the node is pruning state)
  -h, --help          help for params
      --indent        Add indent to JSON response
      --ledger        Use a connected Ledger device
      --node string   <host>:<port> to Tendermint RPC interface for this chain (default "tcp://localhost:26657")
      --trust-node    Trust connected full node (don't verify proofs for responses)

Global Flags:
      --chain-id string   Chain ID of tendermint node
  -e, --encoding string   Binary encoding (hex|b64|btc) (default "hex")
      --home string       directory for config and data (default "/root/.kucli")
  -o, --output string     Output format (text|json) (default "text")
      --trace             print out full stack trace on errors
```

查询：

```
./kucli query kudistribution params
community_tax: "0.020000000000000000"
base_proposer_reward: "0.010000000000000000"
bonus_proposer_reward: "0.040000000000000000"
withdraw_addr_enabled: true
```

- community_tax：佣金比率
- base_proposer_reward：基础出块奖励比率
- bonus_proposer_reward：绑定出块奖励比率



## 查询验证者未提取奖励

查询验证者及其代表的所有委托者未提取奖励。分配系统会把一个验证者的收益分配给验证者，这收益包含了这个验证者的所有未领取的收益。

```
Example:
$ kucli query kudistribution validator-outstanding-rewards validatorName

Usage:
  kucli query kudistribution validator-outstanding-rewards [validator] [flags]

Flags:
      --height int    Use a specific height to query state at (this can error if the node is pruning state)
  -h, --help          help for validator-outstanding-rewards
      --indent        Add indent to JSON response
      --ledger        Use a connected Ledger device
      --node string   <host>:<port> to Tendermint RPC interface for this chain (default "tcp://localhost:26657")
      --trust-node    Trust connected full node (don't verify proofs for responses)

Global Flags:
      --chain-id string   Chain ID of tendermint node
  -e, --encoding string   Binary encoding (hex|b64|btc) (default "hex")
      --home string       directory for config and data (default "/root/.kucli")
  -o, --output string     Output format (text|json) (default "text")
      --trace             print out full stack trace on errors

```

- validator：验证者账户
- flags：其他参数

查询执行前：

```
./kucli query kudistribution validator-outstanding-rewards validator
rewards:
- denom: kuchain/sys
  amount: "6640698428332862.400000000000000000"
```

委托者领取：

```
./kucli tx kudistribution withdraw-rewards validator alice --from alice --chain-id=testing --keyring-backend test
```

委托者领取后，查询后，alice领取了他的收益：

```
./kucli query kudistribution validator-outstanding-rewards validator
rewards:
- denom: kuchain/sys
  amount: "3206312390075289.140000000000000000"
```



## 查询验证人的佣金收益


查询验证者佣金从委托者到该验证者的奖励。

```
Example:
$ kucli query kudistribution commission validatorName

Usage:
  kucli query kudistribution commission [validator] [flags]

Flags:
      --height int    Use a specific height to query state at (this can error if the node is pruning state)
  -h, --help          help for commission
      --indent        Add indent to JSON response
      --ledger        Use a connected Ledger device
      --node string   <host>:<port> to Tendermint RPC interface for this chain (default "tcp://localhost:26657")
      --trust-node    Trust connected full node (don't verify proofs for responses)

Global Flags:
      --chain-id string   Chain ID of tendermint node
  -e, --encoding string   Binary encoding (hex|b64|btc) (default "hex")
      --home string       directory for config and data (default "/root/.kucli")
  -o, --output string     Output format (text|json) (default "text")
      --trace             print out full stack trace on errors
```

- validator： 验证者账户
- flags：其他参数

例子，查询验证人账户validator的佣金累计收益：

```
./kucli query kudistribution commission validator
commission:
- denom: kuchain/sys
  amount: "1066537555116439.476000000000000000"
```

## 查询削减（slashes）

查询给定块范围的验证器的所有削减。如果验证人，参与验证过程有失误，验证者收益将会受到削减

```
Example:
$ kucli query kudistribution slashes validatorName 0 100

Usage:
  kucli query kudistribution slashes [validator] [start-height] [end-height] [flags]

Flags:
      --height int    Use a specific height to query state at (this can error if the node is pruning state)
  -h, --help          help for slashes
      --indent        Add indent to JSON response
      --ledger        Use a connected Ledger device
      --node string   <host>:<port> to Tendermint RPC interface for this chain (default "tcp://localhost:26657")
      --trust-node    Trust connected full node (don't verify proofs for responses)

Global Flags:
      --chain-id string   Chain ID of tendermint node
  -e, --encoding string   Binary encoding (hex|b64|btc) (default "hex")
      --home string       directory for config and data (default "/root/.kucli")
  -o, --output string     Output format (text|json) (default "text")
      --trace             print out full stack trace on errors
```

- validator： 验证者账户
- start-height ：起始出块高度
- end-height：结束出块高度
- flags：其他参数

查询显示，验证人账户在0-100区块之间的收益没有受到削减

```
./kucli query kudistribution slashes validator 0 100
validator_slash_events: []
```



## 查询收益奖励

查询委托者的全部收益奖励或对一个委托关系收益奖励

```
Example:
$ kucli query kudistribution rewards jack
$ kucli query kudistribution rewards jack validatorName

Usage:
  kucli query kudistribution rewards [delegator] [<validator>] [flags]

Flags:
      --height int    Use a specific height to query state at (this can error if the node is pruning state)
  -h, --help          help for rewards
      --indent        Add indent to JSON response
      --ledger        Use a connected Ledger device
      --node string   <host>:<port> to Tendermint RPC interface for this chain (default "tcp://localhost:26657")
      --trust-node    Trust connected full node (don't verify proofs for responses)

Global Flags:
      --chain-id string   Chain ID of tendermint node
  -e, --encoding string   Binary encoding (hex|b64|btc) (default "hex")
      --home string       directory for config and data (default "/root/.kucli")
  -o, --output string     Output format (text|json) (default "text")
      --trace             print out full stack trace on errors
```

- delegator： 委托者账户
- validator： 验证者账户
- flags：其他参数

例子：

建立委托，alice 投票给validator 和jack

```
./kucli tx kustaking delegate alice validator 800000000000000000000kuchain/sys --from alice --chain-id=testing --keyring-backend test
./kucli tx kustaking delegate alice jack 800000000000000000000kuchain/sys --from alice --chain-id=testing --keyring-backend test
```

查询alice 账户所有奖励

```
./kucli query kudistribution rewards alice
rewards:
- validator_account: jack
  reward:
  - denom: kuchain/sys
    amount: "35946433164800.000000000000000000"
- validator_account: validator
  reward:
  - denom: kuchain/sys
    amount: "274043189720000.000000000000000000"
total:
- denom: kuchain/sys
  amount: "309989622884800.000000000000000000"
```

```
./kucli query kudistribution rewards alice jack
- denom: kuchain/sys
  amount: "35946433164800.000000000000000000"

```

领取对验证者账户validator的收益奖励

```
./kucli tx kudistribution withdraw-rewards validator alice --from alice --chain-id=testing --keyring-backend test
```

立即查询，对验证者账户validator的收益奖励已经为空：

```
 validator_account: jack
  reward:
  - denom: kuchain/sys
    amount: "2213758843697600.000000000000000000"
- validator_account: validator
  reward: []
total:
- denom: kuchain/sys
  amount: "2213758843697600.000000000000000000"

```

## 查询领取账户

查询领取收益的账户，分配系统支持设置领取收益的账户。委托账户和接收奖励账户可以不一样

```
Example:
$ kucli query kudistribution whithdraw-addr jack --from jack

Usage:
  kucli query kudistribution whithdraw-addr [flags]

Flags:
      --height int    Use a specific height to query state at (this can error if the node is pruning state)
  -h, --help          help for whithdraw-addr
      --indent        Add indent to JSON response
      --ledger        Use a connected Ledger device
      --node string   <host>:<port> to Tendermint RPC interface for this chain (default "tcp://localhost:26657")
      --trust-node    Trust connected full node (don't verify proofs for responses)

Global Flags:
      --chain-id string   Chain ID of tendermint node
  -e, --encoding string   Binary encoding (hex|b64|btc) (default "hex")
      --home string       directory for config and data (default "/root/.kucli")
  -o, --output string     Output format (text|json) (default "text")
      --trace             print out full stack trace on errors

```

例子：

查询alice领取账户：

```
./kucli query kudistribution   whithdraw-addr   alice
|-
  withdraw info:
  WithDrawAddress:alice ,DelegatorAddress:alice
```

设置test1为alice领取收益奖励的账户

```
./kucli tx kudistribution set-withdraw test1  alice --from alice  --chain-id=testing --keyring-backend test
```

查询alice领取账户：

```
./kucli query kudistribution   whithdraw-addr   alice
|-
  withdraw info:
  WithDrawAddress:test1 ,DelegatorAddress:alice
```

