查看原文
其他

Subdev分享 ▏Substrate Staking代币经济系统讲解

黄志光 一块Plus社区 2020-11-11
作者:黄志光,一块链习《Substrate 快速入门与开发实战》第一期学员,第三期助教。区块链开发工程师,连续创业者,曾任多家公司联合创始人&CTO。
 

《Substrate 快速入门与开发实战》 是一块链习联合 Laminar CTO 、Substrate、Polkadot 贡献代码者、 Polkadot 社区大使陈锡亮老师共同打造的全球第一门 Substrate 开发实战指南课程。

         


目前第三期课程已经进行到第三周,我们希望通过这门精心打磨的课程,在这一年内为全球区块链行业培养 200 位最顶尖的 Substrate 开发者。
 
每周日晚 8 点,都会进行《Substrate 快速入门与开发实战》开发课的内容知识拓展——助教技术分享会。昨晚,由黄志光助教给我们带来「助教技术分享会」第 2 讲,题为「Substrate Staking代币经济系统讲解」
 

以下为黄志光助教分享的复盘内容。


对公有区块链来说,代码是肉身,代币经济是灵魂。

Substrate的前身是Polkadot,Staking模块是Polkadot所设计的NPoS共识中代币经济部分的抽象,同时也适用于其他采用PoS共识区块链项目。

出于工作原因,我对Staking模块和Polkadot的代币经济系统有过一些定制和研究,作此分享,希望能帮助大家了解Substrate的Staking模块和Polkadot的代币经济系统。

代币经济系统原理

 
在经济学的各个流派中,奥地利学派为理解代币经济学提供了更多理论支持,奥派经济学认为:人是自利的,经济规律符合人的行为规则。
 
奥派经济学关于代币经济学的理论中也提到:代币相当于质押品,任何参与代币经济活动的人,都需要拿出代币进行抵押,以约束自己的行为。
 
采用PoW共识的区块链,质押品是矿机的算力。拥有算力的人,维护区块链运行的行为能够得到代币的奖励。
 
采用PoS共识的区块链,质押品是代币本身。拥有代币的人,维护区块链运行的行为能够得到代币的奖励。
 
这里可能会有个问题:我拥有质押品(算力或代币),我不抵押会怎么样?
 
一个经济学观点可以很好回答这个问题:成本就是放弃了的最大收益。
 
如果拥有质押品的人不进行抵押,他们所付出成本是用质押品来维护区块链安全所获的收益。
 
当然,如果进行了抵押,他们付出的成本就是这些质押品在其他用途上能获得的最大收益,比如说交易、理财收益。
 
自利之心促使人们选择成本最低/收益最高的方式来处理质押品,我认为这是代币经济系统的基础。 

Inflation通胀模型

 
通胀主要来源于代币增发。
 
比特币的代币增发模型中,最初每个区块(10分钟)增发50枚代币,每4年减半。比特币发展到现在已经经历了2次减半,目前每个区块增发12.5枚比特币。进一步计算,当前比特币每年增发约65.7万枚,当前发行量约1812.27万枚,比特币的年通胀率约为3.6%
 
相比之下,Polkadot的代币增发要复杂很多。
 
要理解Polkadot的通胀模型,首先需要介绍一些基本的概念以及其关系:
 
年通胀率 = 年增发数量 / 年初总发行量
抵押率 = 抵押总数 / 总发行量
抵押平均年收益率 = 年增发数量 / 抵押总数
 
以上抵押率的计算公式非常好理解,但实际上Staking模块中计算通胀用到的抵押率使用slot_stake * validator_len作为有效抵押总数计算。其中slot_stake是验证人插槽的中的最小抵押数,validator_len是验证人插槽数量。所以我把这个抵押率称为插槽抵押率。
 
插槽抵押率 = (插槽最小抵押数 * 插槽数)/ 总发行量
               
Web3基金会所设想的Polkadot代币经济中,有50%代币用于抵押验证/提名。抵押多了,代币流动性不足,抵押少了,共识安全性会受到影响。
 
Polkadot通胀算法根据插槽抵押率调整通胀率,从而动态改变平均收益率,用经济手段实现50%的插槽抵押率。
 
下图来源于W3F Reserch网站的对Polkadot代币经济介绍,我这里不会讲具体的计算公式,而是着重讲一下它的设计思想,对计算公式感兴趣的话可以直接去看介绍文档。
网址:
https://research.web3.foundation/en/latest/polkadot/Token%20Economics.html
              
图中,横坐标是插槽抵押率,纵坐标的两条曲线,下方蓝色的是年通胀率曲线,上方绿色的是平均年收益率曲线。
 
这里有一个很重要的概念:边际收益。
 
边际收益是指每增加一个单位成本的投入所增加的收益,在这里是指每增加一个代币抵押所增加的收益。
 
边际收益是现实社会中指导生产投入的重要指标,当边际收益递增的时候,人们就会加快生产投入,当边际收益递减的时候,人们就会延缓生产投入,当边际收益小于0的时候,人们就会减少生产投入。
 
从曲线图中绿色的收益率曲线看出,边际收益只会递减。注意曲线中的转折点(插槽抵押率50%,通胀率10%,平均年收益率20%),转折点之前的曲线边际收益的递减率越来越低(边际收益的影响越来约小),转折点之后的曲线边际收益边际收益迅速下降到0以下。
 
那么为何不在20%收益率之前设计边际收益递增的模型?
 
首先,这里面的边际收益对个体和散户的影响微乎其微,对整体和大户的影响却很大,边际收益递增会直接鼓励大户进一步投入,导致代币集中化,严重影响PoS共识安全
 
其次,边际收益的影响也需要建立在基础收益率之上,插槽抵押率低于50%时,过低的收益率无法有效吸引更多抵押。
 
Staking模块中,每个era开始(上一个era结束)时会计算当前的年通胀率,然后根据上一个era的时间计算应该增发出来的代币数量,进行增发和奖励分配。

Reward奖励分配

 
Polkadot NPoS共识中的代币增发奖励首先会分到验证人插槽,扣除验证人手续费后,根据抵押代币比例进行分配。
 
Staking模块中内置一个验证人积分(point)系统,验证人在每个era进行中累计积分。在一个era结束时,验证人间通过积分比例分配这个era增发出来的代币。
 
W3F建议的积分系统如下:
1) 20分给一个对平行链区块的有效性声明,目前这部分还没有具体实现。
2) 20分给一个中继链区块(不是叔块,最终被确认的有效区块)生产者;
3) 2 分给一个中继链区块生产者,当它生产的区块引用了一个之前未被引用的叔块;
4) 1 分给一个中继链区块生产者,当它生产的区块引用了一个之前已被引用的叔块。
           
积分分配的规则设计诠释了一个基本观点:增发的代币奖励给生产区块、验证区块等行为,而不是奖励给抵押提名的行为。
 
完全根据代币权益公平分配的规则并没有考虑验证人节点的“劳动成果”,“按劳分配,多劳多得”的分配规则可以激励验证人提供更高效、稳定的验证服务。
 

Slashing作恶惩罚


Slashing是在验证人作恶的时候,对验证人进行惩罚,惩罚形式大致包含3种:
1) 把验证人踢出验证人列表
2) 把验证人从提名人的提名列表中删除
3) 按比例罚没抵押代币(验证人+提名人)
 
Slashing的规则很简单,但要实现起来是相当复杂。
 
在规则上,系统根据危害程度把验证人的不当行为分成4个等级并进行相应的惩罚:
 
等级1:偶尔掉线,罚没0.1%或仅仅踢出入选列表;
等级2:经常掉线或偶尔模棱两可(因为在多台服务器上运行同一验证人导致的在同一个高度同时签名投票两个或以上不同的块等等),罚没1%;
等级3:运行错误的节点软件,罚没10%;
等级4:多验证人串通作恶,造成严重安全风险,需要花费大量资源应对,罚没100%;
 
在实现上,Slashing需要考虑很多额外的问题:
 
时延性:验证人的不当行为无法被立即发现,需要有额外的数据库保存近期的验证人行为,以保证在抵押赎回周期内发现并惩罚验证人。
 
防止回滚:验证人产生不当行为的块被验证人回滚(类似于分叉、双花攻击等),依然需要提供数据以惩罚验证人。
 
证明机制:对于链上可证明的不当行为(如掉线、同时签名投票多个块等)可以实现链上Slash,链上不可证明的不当行为需要验证人链下投票,然后把投票签名上链。
 
防止恶意检举:检举不当行为可以获得奖励,为了防止验证人故意作恶获取其他提名人罚没的代币,奖励首先不能超过中罚没金额的10%。其次,级别4的作恶行为需要钓鱼人抵押保证金进行检举,奖励不能超过验证人自身抵押,不能超过钓鱼人检举保证金的10倍。
 
罚没抵押代币大大增加了作恶成本,可以更有效的防止验证人作恶。
 

总结


Polkadot的代币经济系统是目前为止我见过最复杂的代币经济系统,设计涵盖了经济学、人类行为学、犯罪学等学科思想,综合考虑了代币流动性、共识安全性、奖励公平性、罚款合理性等方面因素。
 
无论成败,这都会是一次相当伟大的实验,我们拭目以待。
 
 
参考资料:
https://research.web3.foundation/en/latest/polkadot/Token%20Economics.html
https://research.web3.foundation/en/latest/polkadot/slashing.html
https://github.com/paritytech/substrate



更多阅读:
Subdev 讨论|从命令频繁报错开始的第一个Substrate 项目
▎为什么Rust已成为最先进的主流通用语言之一?
▎Subdev分享|Substrate背后的密码学选择
 

 

    您可能也对以下帖子感兴趣

    文章有问题?点此查看未经处理的缓存