ChainX节点收益来源三部分,块奖励+充值渠道奖励+打包手续费。
1.关于块奖励。块奖励是根据节点的总得票数占比分配的。每个块的PCX奖励是固定的,如果你的节点得票占比高,你的节点分得的奖励就会高。 ChainX的模型和其他公链不太一样的地方在于。ChainX节点奖励分配只有一个维度,就是节点的总得票。收益和总得票占比正相关。其他的公有链可能有类似出块奖励,出一个块得到一个固定工资这样的设计。但ChainX上是没有这种占一个坑位就躺赚固定工资的机制。所有的节点都在一个维度上公平竞争。就是总得票。得票越多,收益越多。
2.另外节点的收益还有一部分来自于渠道奖励,有社区基础,有流量入口,有技术能力支持的节点可以让用户跨链绑定的时候填上推荐节点,这样被绑定的节点会自动得到该用户永久10%充值挖矿奖励。用户越多,充值越多,节点获得收益越多。
3.节点还有另外收益来源是打包区块获得交易手续费。交易越多,收益越多。
所以积极投身社区建设,获得最广大社区用户认可,得到最多用户投票支持的那些节点,最终会成为大赢家。
出块节点每漏 1 个块,惩罚该轮平均块奖励的 3 倍(该参数可通过议会调整), 罚金从节点奖池打入议会账户。平均块奖励具体计算方式如下:
- 根据节点总得票数,计算每个分红周期该出块节点应得分红奖励
节点应得奖励 = 节点总得票数/所有参选节点总得票数 * 每个分红周期所有节点分红奖励总数
- 每个分红周期所有节点总奖励见: 投票选举
- 目前采用 aura 轮流出块的方式,故每个分红周期出块节点平均应出的块数:
节点应出块数 = 分红周期总块数/验证节点数
当前分红周期总块数为 150 个块。网络初期,验证人上限为 30,该限制后期可通过议会调整。
- 节点平均块奖励:
节点平均块奖励 = 节点应得奖励/节点应出块数
所以漏一个块的惩罚金额为:
漏一个块的惩罚金额 = 节点平均块奖励 * 漏块惩罚力度(当前为 3, 该参数可通过议会调整)
除此以外,我们还有最小惩罚阈值(当前为 0.01 PCX,该参数可通过议会调整)。当上面算出来的一个块惩罚金额小于最小惩罚阈值时,使用最小惩罚阈值,即每个分红周期漏块节点的惩罚总额为:
漏块惩罚总额 = max(通过计算平均块奖励得出的单块漏块惩罚金额,最小惩罚阈值) * 漏块总数
用户的待领利息是动态实时计算的,计算规则详情见: 投票选举,社区也有相关的资产挖矿介绍文章,点击阅读.
当出现有人进行大额投票或者大额充值时,就会出现降低你在奖池的占比,也就是待领利息被稀释的情况。
漏块的意思是轮到某个节点出块的slot时,节点因自身原因没有出块,或者是出了块没有被大部分节点同步到,会导致在链上认为该节点没有在该slot出块,俗称漏块。
漏块统计以分红周期(150个块)进行统计
节点可从ChainX的区块链浏览器https://scan.chainx.org/validators/all看到自己的漏块情况,点击节点名称可进入该验证节点的详细页面,其中漏块列表页会单独列出该节点的漏块情况。
影响漏块的主要因素与网络状况强相关,简单的说就是能够与别的节点通信越顺畅(通信带宽,通信速度),越不容易漏块。因此影响漏块的主要因素为:
- 通信带宽越大越好
- 通信线路质量越高越好
通信带宽越大越好
我们推荐运行验证者节点的带宽为10M,见devops#推荐机器配置
通信线路质量越高越好
-
国内节点
国内很多云服务商近年出现了很多廉价服务,请注意对于vps而言,基本上是一分钱一分货,因此廉价的机器很可能在硬盘质量,网络通信方面有缩水,建议选用大厂商的云服务。
-
国外节点(包含香港,台湾)
由于众所周知的原因,我国国内网络与国外网络相连实际上是有一定限制的,因此实际上国内网络与国外网络相连最重要的是网络通信线路。 线路是对通信质量的影响核心因素,我们强烈建议国外的节点使用能和国内网络进行“三网直连,CN2, GIA”的vps服务提供商(具体请google/bing)
目前ChainX的出块速度为2s一个块,且运行大量的验证者节点。因为节点之间不是由专线互连,因此网络波动是难免的,少量的漏块属于正常的现象。目前我们认为近10个周期内漏块小于5%都属于正常的水平,无需当心。
由漏块这一节可知,漏块导致的原因由网络因素引起
因此减少漏块可从一下2点提升
- 提升自己的p2p连接数
- 由于目前ChainX使用
Aura
控制出块流程,因此检查与自己的前置出块节点保持强连接
对于第1点,可以采取一下方式:
- 在启动参数中添加上
out-peers
与in-peers
让自己的连接上限提升(需要与自己提升带宽相配合) - rpc接口
system_health
,system_peers
,system_networkState
均可用来分析自己当前的网络状态,优化自己的网络拓扑
对于第2点比较高阶,需要有较高运维与技术水平,需要一定分析能力:
- 由于使用
Aura
出块,因此出块节点实际上是顺序轮换的,按投票数排序,按换届周期替换,简单来说比如A
,B
,C
三个节点若一直稳定,则出块顺序一直按照A
,B
,C
进行轮换,那么若防止自己不漏块,比如C
不漏块,那么C
一定要能实时接受到A
,B
的区块 - 日志
INFO [runtime|xrml_xsystem] height:<块高>, blockproducer: <验证者公钥>|name:<出块节点的名字>
展示了出这个块高时的块的出块者是谁,因此跟随这条日志,可以找出自己这个节点的前置几个出块者,也就是2中举例的A
,B
(当然前置节点越多越好) - 观察自己接受这些前置节点出的块是否顺利。如果自己同步前几个前置出块节点存在延迟较高情况,请给想办法投自己的节点,让自己的排序变化,一般情况下投票越靠前的越稳定。
由漏块这一节可知,漏块只能尽可能减少,但无法避免。
退选和PCX投票奖池的钱(有足够的钱)直接相关,又因为由于分红周期的10%打给节点账户,90%打入奖池,每次漏块惩罚都是扣奖池的钱,只要奖池一被扣空就会罚成退选。
漏块惩罚有最低阈值,目前是0.01。
因此防止退选的方法从2个方面考虑
- 直接方式,尽可能保持奖池中有钱
- 附加方式,尽可能保证节点不漏块,不受惩罚
由于ChainX上线后十分火爆,有大量比特币跨链进入ChainX,又由于PCX是从0开始挖,因此比特币在ChainX项目早期(PCX还未挖出很多)占据了大量比重,截止ChainX上线第4天,折合PCX投票票数已达82万票,而用户与节点抵押的总PCX仅有4万左右,有压倒性差距,因此投票PCX给奖池的奖励大部分被比特币充值挖矿分取,仅有少量分给了PCX投票的奖池,因此PCX奖池收益比较少,进一步加剧了漏块惩罚导致退选的现象。
因此防止退选可从以下方面考虑
-
在启动初期直接给自己的奖池地址打PCX,注意如果有人提息,会瓜分打入奖池的钱
- 奖池地址可从浏览器验证者节点页面https://scan.chainx.org/validators,找到自己的节点点击跳转到验证者详细界面获取
- 该方法只能用于初期,为了保护奖池还未有钱的情况下的简单保护措施
-
使用一个小号,给自己的节点投票,但是不领取利息。
- 由于小号不领取利息,因此可将此利息看做是防止退选的防御资金,只要票数足够,票龄够长,收到的奖励足够应对一两次漏块带来的惩罚,那么节点就会一直稳定不掉线
-
(最有效方式)维护好自己的社区,吸引别人投票给自己。ChainX是一个倡导社区化的项目,节点获取的投票越多,代表支持自己的群众力量越大,受认可度越高,投票的人越多,奖池分给的比重也越大,漏块带来的惩罚分配于所有投票者身上后就变得很微小,节点只要保证自己出块正常不掉线,几乎永远不会退选!
-
由于目前大量的比特币充值挖矿瓜分了分红,因此可以等到1-2个月后大量PCX被挖出,奖池收益变大后再来参与PCX挖矿。
充值渠道是对验证者推广的一种奖励,其机制类似于推广常用的“邀请码”的机制。用户在充值BTC或做SDOT的映射时,可以选择与一个验证者节点建立关联关系,当用户领取充值挖矿的分红时,会将其中10%分予一开始进行关联的验证者作为奖励。若该用户没有关联关系,则这笔钱会归入议会基金。
关联关系仅在用户第一次充值时建立,当且仅当用户再次使用第一次充值时的地址建立新渠道的绑定关系时才会替换,否则其他方式不会替换绑定关系,也不会生效。
被跨链的地址(如Bitcoin地址)与ChainX地址的关联关系如下:
btc_addr -> chainx_addr(Option<channel>) # 1 对 1 关系 channel 是渠道,Option是可选的意思
chainx_addr -> [btc_addr1(Option<channel>), btc_addr2(Option<channel>), ...] # 1 对 n 关系,按照绑定(充值)顺序排序,也就是说第一个btc_addr1是用户的第一个充值地址
充值渠道绑定关系是选择chainx_addr -> [btc_addr, btc_addr, ...]
中的第一个地址关联的渠道
关联关系的机制使用如下举例进行说明:
# 第一次充值建立关联关系:
btc_addr1 -> chainx_addr1 <-> channel1(渠道1) # 第一次充值使用的 btc_addr1 与 channel1 建立了关联关系
# 第二次充值使用新的地址
btc_addr2 -> chainx_addr1 <-> channel2(渠道2) # 第二次充值使用新的 btc_addr2 与 channel2 建立关联关系,但是这个关联 **不会生效**
# 第三次充值使用第一次充值中的地址建立新的关联关系
btc_addr1 -> chainx_addr1 <-> channel3(渠道3) # 第三次充值使用 btc_addr1 与 channel3 建立新的关联关系,这个关联关系替换了第一次充值建立的关联关系,后续用户再次领取粉红时,使用channel3发放验证者的推广奖励
## 其他(很少发生) -> 同一个Bitcoin地址关联两个ChainX地址
btc_addr1 -> chainx_addr1 <-> channel1(渠道1)
btc_addr2 -> chainx_addr1 <-> channel1(渠道1) # 此时 chainx_add1 -> [btc_addr1, btc_addr2]
btc_addr1 -> chainx_addr2 <-> channel2(渠道1) # chainx_addr2 -> [btc_add1], 此时 btc_add1 和 chainx_add1 的绑定关系被解除 变为 chainx_add1 -> [btc_addr2] (若 chainx_add1 只映射了 一个地址,那么此时 chainx_add1的关系关系被清除 )
(对于Bitcoin的关联而言,关联关系的建立只和第一笔充值交易中的第一个input相关联,对于SDOT而言,则与发送映射SDOT的eth公钥地址相关联,且这个关系将会在将来用于ETH的关联关系中)
验证者节点可以通过rpc接口 RPC#chainx_getaddressbyaccount (对应于 js sdk 为 JS-SDK#chainxassetgetaddressbyaccountwho-chain)获取当前用户绑定地址的状况。
该返回值为一个列表
- 若列表为空,表示该用户对于该链还未进行任何绑定关系
- 若列表不为空,表示该用户已经有过关联关系,用户只有使用列表中的第一个地址发送关联关系才可替换绑定关系,否则其他地址发送的绑定关系不会生效。
因此钱包开发商可以首先检查一下该用户是否具备了关联关系,若已有关联关系,则无需引导用户再次建立关联关系。