编者的话:本提案为Qtum联合创始人以及核心开发工程师Jordan Earls发布在Github 的新的技术提案,旨在帮助质押人(Staker,可理解为PoS中的“矿工”)通过实施这个QIP,可以将他们的代币设置一定的锁仓时间,并在锁仓期间提高获得区块奖励的可能性。
动机
随着区块链技术的发展,权益证明(PoS)共识机制变得越来越流行。权益证明的区块链允许代币持有者质押他们的代币,作为权益证明的一部分参与区块的验证,并因此获得相应的奖励回报。
一些大型服务商和企业被认为质押了那些严格上来说并不属于他们的代币(从而获得区块奖励)。这其中包括交易所和中心化的钱包提供商等。由于这些服务商需要确保为用户提供服务的及时性,而用户又可以随时提取代币,因此服务商无法将用户的代币锁定太长时间。
虽然这些服务商对代币进行质押的行为对整个网络的安全和生态系统都不会带来什么害处,然而,他们所控制的大量的代币却增加了整个网络Staking的难度。
这使得个人通过质押少量代币所能获得的奖励的可能性变得非常之低。这一提案将有助于提高个人质押人获取奖励的概率。此外,该提案还有助于激励用户对节点进行定期更新升级,因为为了获得更多奖励,用户需要重新锁定正在质押中的代币,这将鼓励这些质押人检查他们的质押节点,并定期进行更新。
本提案还提供了一个选项,可使用户进行超长期质押。那些帮助保障网络安全的质押人可以获得额外的奖励,但这将会限制他们提取代币的能力。现如今,越来越多的父母选择买银行的教育储蓄基金,孩子可以在他的整个学年里从这笔基金里获取质押奖励,但他只有到了18岁时才能花费实际奖励的这些币。请参见“风险”一节,了解为什么最好不去实施这个操作的原因(即最好限制质押币的锁定时间)。
详述
本提案理论上不需要进行任何特殊的交易格式的修改,也不需要添加操作码。 比特币以及 Qtum 生态系统可以很好地支持操作码 OP_CHECKLOCKTIME,并且可以很容易地用于查看锁仓时间。锁定代币的输出脚本示例如下:
<lock time>
OP_CHECKLOCKTIMEVERIFY
OP_DROP
OP_DUP
OP_HASH160
<pubKeyHash>
OP_EQUALVERIFY
OP_CHECKSIG
这只是一个标准的pubkeyhash交易,但有一个前提是无法在锁定时间到期前花费代币。这个交易类型的提议名称为“pay-to-lockedpubkeyhash”
在锁定时间到期前,该交易将无法正常花费。但在本提案中,该交易能够用于质押。这个 UTXO 能够在特殊的 coinstake 交易中被“花费”。实际中需要添加共识规则以确保已花费的这些已被锁定的代币相应地会有一个新的输出(或者多个),且有着与其相同的数量、相同的锁定时间以及有效的 pubkeyhash 地址。
例如,在coinstake中给出以下这些输入:
10 Qtum 发给A, 锁到2019年
10 Qtum 发给A, 锁到2019年
10 Qtum 发给A, 锁到2021年
5 Qtum 发给B, 锁到2018年 (已经是可花费的状态)
coinstake 交易的输出将会是:
20 Qtum 发给A, 锁到2019年
10 Qtum 发给A, 锁到2021年
5 Qtum 发给B, 锁到2018年
4 Qtum 发给A, 不锁定 (区块奖励)
当然,输出也可能是:
20 Qtum 发给A, 锁到2019年
5 Qtum 发给A, 锁到2021年
5 Qtum 发给A, 锁到2021年
2 Qtum 发给B, 锁到2018年
3 Qtum 发给B, 锁到2018年
4 Qtum 发给A, 不锁定(区块奖励)
请注意:为简单起见,此处未体现MPoS的拆分奖励/费用,但通过MPoS所获得奖励的总输出仍是发送给“A”地址并是解锁状态。
任何锁定的代币都可以在 coinstake 中花费(当然,前提是要提供私钥的所有权),但是锁定的代币必须在每个独特的锁定期内以相同的总数量输出。
锁定代币的影响在于代币的“加权”难度上。目前,算法类似于:
if ( stakeHash < difficulty * actualCoins ) then 满足条件,创建区块
新的算法如下所示:
coins = actualCoins + (actualCoins * lockBenefit)
if ( stakeHash < difficulty * coins ) then 满足条件,创建区块
例如,如果某个输出有0.5 QTUM的锁定增益(lockBenefit),加上该输出中原有的 1QTUM真实代币,就相当于用户有 1.5 QTUM 用于质押(虽然实际他只有 1QTUM),即相当于50%的“锁定增益”。
建议锁定增益按照层级进行划分,例如:
7 天- 20% 锁定增益
15 天- 50% 锁定增益
30 天- 100% 锁定增益
90 天- 200% 锁定增益
重要的是,锁定增益不应该按连续比例发放,并且必须有硬性限制。如果没有限制且比例为每天1%,那么1个代币被锁定20,000,000天后,将可以用来发起对网络的51%攻击。
用“天”作为时间单位描述上述问题是为了帮助人们理解,但是在实际程序实现中,使用区块高度作为度量将大大降低实现的复杂性。现有数据库中已经具有在打包交易时查询锁定时间的功能。因此,上述按“天”的数字应改为基于标准的2分钟出一个新区块的区块高度差来计算。
LockedPubKeyHash交易类型需要成为一个标准交易,这样,那些平均一个月才能获得一次区块奖励的用户才能立即获取锁定的质押收益。
如果该提案确定值得进一步研究,那么之后将设计如何将锁定的资金公开给钱包用户。
原理
这种允许在 coinstake 交易中花费任何已锁定的输出的设计可以兼容现有的代币组合和代币分割算法。
设计上要力求在尽可能少的更改共识的情况下实现此功能。locktime和checklocktime功能在比特币和 Qtum 中得到了很长时间的验证,因此非常适合用于实现此功能。对共识的唯一更改将是让质押者允许用这些锁定的代币进行质押(staking),并确保将已花费的锁定代币输出为相同类型的锁定代币。
升级策略
对共识更改实际上非常简单,然而对钱包的更改会稍显复杂。如果在测试和分析设计时没有遇到任何问题,那么可以将这个共识更改(可能钱包功能有一定限制)包括在计划中的QIP-8硬分叉中。如果事实证明它比预期的要困难,那么最好在x86的硬分叉中再实现这一提案。
风险
首先,必须进行仔细的经济模型分析,以便评估该提案可能导致的通胀率提高,以及其他“超出协议之外”的影响。这一升级可能会引起社区的争议,因此需要在社区内进行投票,以确定社区对这一提案的支持程度,建议在获得大多数支持后再进行具体的实现工作。
使用已有的OP_CHECKLOCKTIMEVERIFY操作码可能会对某些现有的非标准交易类型的范例带来意想不到的后果,包括可能对已部署的交易引入有追溯效力(且危险)的改变。比较好的方式是创建一个具有相同功能但ID不同的新操作码(opcode),这个新操作码只在质押上下文中(即Staking的时候)才有效。
如果泄露了锁定代币的私钥,将很难阻止攻击者将这些代币进行质押,并与用户竞争获取奖励,当然也很难保证用户在代币解锁后可以将代币提取到新地址。
Qtum 核心开发者Djaen表示,本提案还存在一些理论上的潜在风险,即稍微增加了用于发起 stake grinding攻击(即预测后续的区块生产者)的数据集。实际上,目前这个数据集已经非常庞大,不可能在超过50个区块后发起stake grinding攻击。要想成功的进行攻击,需要达到500个区块才能使代币“成熟”。尽管这个提案在理论上降低了的攻击难度,但成功发起攻击仍然需要比宇宙中存在的计算更多的计算。因此这个问题并不大,但仍需要进一步分析。
本提案将鼓励用户持有代币,而不是使用代币参与生态系统。然而,许多质押中的人并不打算在短期内花掉他们的代币,除非是发生重大的市场事件(即,坚定持有者)。尚不清楚是否会对生态造成影响。
质押者往往对竞争者不大友好,他们可能会拒绝打包手续费较低的锁定交易,或者根本不进行打包。恶意的质押者可以利用其作恶,从而导致竞争者由于错过1个区块而落入较低层级的锁定增益。例如,如果第一层是锁定1000个区块,那么质押者可以拒绝将竞争者的交易打包到区块中,直到交易仅能被锁定到999个区块,从而降低竞争者的收益率。要缓解这一问题,可以使钱包在默认情况下设置一个“经验系数”,比如说100个区块,以使该区块更有可能被网络中其他的质押者打包,但这种方法会使交易被锁定额外100个区块。另一种方法是采用带限制的浮动收益率,比如每天最多只允许1%的锁定代币享受上述90天锁仓期的收益增益。
超长期质押(可选)
超长时间质押的最大风险在于用户的误操作,比如有人不小心将质押的币锁了10年以上。即使决定实现该功能,也最好不要公开任何使用这个功能的“简单”方法,应该强制用户通过发送原始交易(rawtransaction)触发该功能,以确保他们完全理解正在执行的操作。
此外,这限制了用户在Qtum发展方向上通过市场进行“投票”的能力。如果用户不同意计划中的硬分叉的决定,他们应该能够通过出售手中代币等方式“退出”区块链(但锁定中的币无法进行转移和出售)。这一问题可能可以通过允许转移锁定的代币来缓解。从而可以基于锁定的代币创建二级市场,但这种功能可能会有更大的风险,难以实现和正确分析,并可能对整个生态产生不可预见的后果。此外,如果锁定的代币可以转移,那“锁定”本身就没有任何意义了。
币搜:比特币领域的搜索引擎www.btcsearch.com