简介

YOUChain 支持验证者(validator)以及委托(delegation)。

所谓验证者,可以认为是所谓的节点,需要做 Token 抵押和运行节点程序进行链上共识,以获得区块奖励。

有一类验证者可以设置接收委托、设置一定的佣金比率。Token 委托人可以将 Token 委托给某个验证者,后者代为进行链上共识,委托人分得相应的奖励。

为了支持大规模的验证者及其委托,我们设计了 YOU-Staking 机制。

下面将介绍 YOU-Staking 的相关概念。

概念列表

验证者与委托人

验证者跟接受委托相关的有以下属性:

acceptDelegation number 是否接受委托 0 不接受,1 接受
commissionRate number 佣金率,万分数
riskObligation number 风险承担比例,万分数

Staking 操作生效周期

我们定义了如下链上参数:

StakingTrieFrequency:      128

定义StakingTrieFrequency个区块作为一个周期,在周期内提交的 staking 操作交易,将会经历暂存与生效阶段。立即暂存(可获得交易哈希),交易将会在该周期的最后一个区块生效。

注意,staking api,如果是涉及到操作的数据的,将是返回结构编码,需要将这个数据,作为交易信息的一部分,广播到链上,才会真正完成。

奖励的流向以及时机

总体来讲,区块奖励的流向如下:

区块奖励-》验证者集合池-》验证者奖励池-》验证者coinbase及委托人账号到账

每个区块打包时,对于参议(议长)节点,当产生区块时,它将会立即获得该区块的 30%奖励(影响验证者的rewardsDistributable字段),其余的 30%分配给议长(参议)节点集合,40%分配给众议节点集合(影响集合的rewardsDistributable字段)。

区块奖励

每个区块,都会产生奖励,分配到验证者集合

验证者集合中的奖励分配

在周期结束时(n * 128 -1 区块号上),将会分配给集合内当前在线的验证者(记录在验证者的 rewardsDistributable 字段)。

验证者内部奖励分配到账

奖励从 rewardsDistributable 发放到 coinbase

  1. 主动:有验证者有关的 staking 操作
  2. 被动:第 n * 128 + 1 周期结束

周期结束时(n * 128 -1),处理顺序:

  1. 分配集合奖励
  2. 处理验证者的内部分配
  3. 处理暂存验证者操作

奖励分配比例

三类验证者最终奖励分配比例

   RewardsDistRatio: map[ValidatorRole]uint64{
      RoleChancellor: 3,
      RoleSenator:    3,
      RoleHouse:      4,
   },

议长:参议:众议
334

奖励有关信息获取:

you_validatorsStat(height)

对于集合,获取指定高度上的数据

rewardsDistributable string 角色奖励池,当前尚未分配到validator的奖励

在同一个周期内,随着区块的增长,rewardsDistributable将会增长

you_validatorByMainAddress(height, mainAddress)

对于验证者,获取指定高度上指定的mainAddress 的信息

rewardsLastSettled    number    最后一次奖励分配到coinbase的区块高度
rewardsDistributable string 当前可分配奖励
rewardsTotal string 节点加入后累计获得收益,会单调增长

验证者奖励分配条件:

主动触发:验证者操作类交易发送,将会触发奖励分配,如:

you_createValidator
you_changeStatusValidator
you_depositValidator
you_withdrawValidator
you_settleValidator
you_updateValidator
you_getDelegationAddData
you_getDelegationSubData
you_getDelegationSettleData

被动触发:

MaxRewardsPeriod: 128, 这个参数定义的周期数量,将会强制触发一次

区块奖励构成

gasfee + subsidy

补贴系数:

SubsidyThreshold:   9 * YOU, // 从YouV3开始调整为 15YOU
SubsidyCoeff:       5,

奖励和补贴公式(SubsidyThreshold 调整为 15YOU之后,下面的 4.5 就变成 7.5, 9 变为 15):

$subsidy= \begin{cases} 4.5 - gasfee * 0.5 & \text{gasfee<=9} \\ 0& \text{gasfee>9} \end{cases}$

$incentives= \begin{cases} 4.5 + gasfee * 0.5 & \text{gasfee<=9} \\ gasfee& \text{gasfee>9} \end{cases}$

区块头记录: header.gasRewards 交易费总计,单位 wei

header.subsidy 该区块的补贴总计

补贴来源池

0x0000000000000000000000000000001111111111

创世区块中预存了 5.6 亿 Token 作为补贴池。需要区块补贴的时候,从中支取,取完即止。

验证者准入签名

三类验证者都有准入(需要模块管理员签名)

需要准入的 API,通常会包含 nonce 字段:

you_createValidator
you_changeStatusValidator
you_depositValidator
you_withdrawValidator
you_updateValidator

验证者最低自抵押 > 0 在调用you_createValidator时,value 必须大于 0

角色的最低抵押:

MinStakes: map[ValidatorRole]uint64{
    RoleChancellor: 8880000,
    RoleSenator:    1580000,
    RoleHouse:      49283,
},

达到这个最低抵押要求,才可以上线 低于这个抵押要求,将会下线

角色最高抵押

MaxStakes: map[ValidatorRole]uint64{
    RoleChancellor: 10000000,
    RoleSenator:    1800000,
    RoleHouse:      1500000,
},

角色最大总抵押,不能超过这个值

最小委托

MinDelegationTokens:       new(big.Int).Mul(big.NewInt(1000), StakeUint) // 1000 YOU

抵押取回延后到账区块数

WithdrawDelay:           259200, // ≍15 days

双签惩罚

PenaltyFractionForDoubleSign: 2, 扣减 2%