Qtum改进提案(QIP)是社区对Qtum量子链的新特性和新功能的提案,存放在GitHub上的一个代码仓库中。QIP的内容包括但不限于用户界面的改进、技术参数的改变、新命令、新操作码等等。QIP-25的是关于从离线地址进行Staking的提案,详细描述了Qtum量子链离线Staking的动机、技术设计等内容。值得注意的是,QIP-25中包括一些与开发者的设计讨论和一些对于离线Staking的额外建议,这些内容可能不会在上线时完全实现。
离线Staking是Qtum社区呼声最高的改进之一。实现离线Staking将需要区块/转账协议和共识机制的改变,也就意味着需要区块链硬分叉才能实现。下文是QIP-25的详细内容,原文也在GitHub相应位置【1】贴出。
QIP-25 离线Staking
QIP: 25
层级:区块链协议
主题:离线Staking
作者:Jackson Belove
邮箱:[email protected]
提议修改区块和转账协议以提供离线Staking功能。该功能将允许钱包地址通过智能合约将UTXO委托给能为该地址进行Stake的在线节点。接受委托的在线节点将收取一定费用。
评论链接:
https://github.com/qtumproject/qips/issues/25
状态:草稿
创建时间:2020-03-19
许可:GPLv3
摘要
本QIP描述了一种区块链协议改进和智能合约实施方式,该改进将允许离线地址委托提供Staking服务的在线节点进行Stake。
自从上线开始,Qtum量子链的PoS共识机制只允许能安全地为区块链提供服务的在线节点进行Staking。QIP-25的改进将允许离线钱包里的地址将它们的UTXO安全地委托给在线节点,接受委托的在线节点将会使用离线节点委托的UTXO进行PoS共识过程。
地址的委托将通过一个只能合约进行。新的区块头和转账协议将提供验证委托的方法,并支持实时地给在线节点支付费用。Qtum的核心节点和轻节点将可以通过调用智能合约轻松地进行委托和解除委托。委托将以非托管的形式进行,离线地址的所有者将保持自己对私钥的控制权,被委托的UTXO将不会被锁定。
动机
Qtum社区呼声最高的一个需求就是离线Staking。自从上线以来,Qtum主网的在线Staking机制需要Staker维持Qtum核心钱包在线作为全节点。这些Staking的钱包同步整个Qtum区块链,必须7*24小时地在线,维护网络的安全运行,成为合格的区块生成者,才有可能取得奖励。
那些不想运行全节点的QTUM持有者,或者处于安全考虑无法运行全节点的人,就无法参与Staking。
社区成员的第二个担心在于运行全节点进行Staking的资源与能源成本。安全角度最好的Stake方式是使用一台专用计算机,不适用这台计算机进行上网、收发邮件等别的操作,以免恶意软件的危害。但这就牵涉到资源利用的问题,尤其对于持有QTUM数量不多的持有者来说,保持电脑7*24小时运行在经济上可能并不划算。
虽然7*24小时运行一个Qtum全节点并不困难,但这也确实需要占用一些资源,即使在云上运行也是如此。而且这也需要消耗一定的运维成本,来应对节点升级、硬分叉、操作系统升级等等问题。
名词解释
Staking service:是指一个节点提供的接受别的地址委托,为那些地址进行Stake的服务,并因此收取一定的费用。
Solo Staker:是指传统形式在线的、使用其UTXO进行Stake的Qtum全节点钱包。
Staking Service Fee:指因提供Staking服务而收取的费用。该费用由委托者设定,范围在0-100%之间。
Super Staker:指以为委托地址提供Staking服务运行的Qtum核心钱包节点。
离线Staking:委托者能够将UTXO从一个离线钱包地址委托给一个在线的Super Staker节点的功能。
离线Staking
离线Staking的上层设计目标有以下几点:
· 非托管的Staking方案。使用者保持对其私钥的独家控制权;
· 被委托地址的UTXO不被锁定,能够随时被发送出去或改为Solo Stake模式;
· 被委托的UTXO遵循500个区块成熟期的Staking周期模式;
· 使用者可以设定给Staking Service的提供者的费用,相应的服务提供者能够收取费用;
· 修改Coinstake协议,便于即时地使用区块奖励支付费用;
· Staking Service提供者必须在线,并且进行Stake以避免”nothing at stake“攻击;
· 开发多客户端的方案,提供方便的委托与解除委托功能。
因为离线Staking会将一个地址要Stake的UTXO集委托给另一个在线节点,区块奖励的”预计时间“将基本与现在的方式相同(会有一些细节的改变)。委托Staking不是Staking矿池。
Coinstake Vouts
Coinstake是每个区块的第二笔转账,包含Stake的UTXO和区块奖励。区块奖励包括两部分:1. 新生成的QTUM(现在是每个区块4.0QTUM);2. 该区块内的转账费和Gas。
对于离线Staking,区块奖励的支付方式如下:
· 委托地址收到:100% – StakingServiceFee;
· Super Staker地址收到:StakingServiceFee。
对于离线Staking,Coinstake转账协议的修改可以用以下例子表示。例子中,Alice将她的离线地址委托给提供离线Staking服务的Bob。”变化?“一列表示与现行协议相比有所变化。
下面给一个更具体的例子。假设Alice是一个离线Staking服务的使用者,她选择支付20%的委托费给Staking服务提供者Bob。同时,另一个离线Staking用户Carol悬着支付15%的委托费给Staking服务提供者David。他们区块奖励中的转账费和Gas为0.1QTUM。因此每个区块总的区块奖励是4.1QTUM。这个情境下,Coinstake的Vout将如下表:
Alice的区块奖励:
注意:
Coinstake转账本身无需支付费用,如果委托费设定为0或100%,将只有一个Vout(为零的Vout将不被发送)。以上例子仅供解释用途。Qtum目前使用的MPoS会将部分区块奖励放在500区块之后发送。
新RPC命令
Super Staker节点运行过程中需要发出远程过程调用(RPC)。这些命令可以通过RPC调用、Qtum-Qt GUI钱包控制台等方式发出,也可以由qtumd deamon服务器钱包通过qtum-cli命令号界面发送。为了Qtum核心钱包能够管理离线Staking,将会添加如下的新命令:
新命令行参数
Super Staker登录时会读取命令行参数。这些命令会在命令行中列出,比如登录qtumd deamon服务器钱包:./qtumd -parameter1 -parameter2=nn -parameter3=nn 将会添加以下命令行参数:
Super Staker的节点操作
Super Staker是一个设置为能够Stake委托地址的UTXO的Qtum核心钱包(全节点)。设置与新命令将提供以下操作:
· 使用新命令getdelegationsforstaker取得委托地址列表;
· 使用新命令getaddressutxos取得该地址委托的UTXO列表;
· 根据新命令stakingminutxovalue或stakingminfee将列表内的UTXO排序并选取最小的UTXO或委托费最低的UTXO;
· 运行Qtum的PoS算法以生成kernel solution并提交区块;
· 当发现一个kernel solution时,验证现有的委托,并生成有支付费用的Coinstake新区块;
· 提交新区块并提交一个Super Staker拥有的UTXO Stake。
钱包客户端操作
客户端是操作生成委托的钱包。客户端必须提供简单明了的方式让用户将UTXO委托给提供Staking服务的UTXO。
下面是一个离线Staking的示例页面:
客户端的离线Staking委托功能将需要智能合约调用。目前Qtum钱包提供了这类功能。Qtum核心钱包将首先提供离线Staking功能,Qtum网页钱包和安卓移动端钱包也将陆续推出该功能。集成了智能合约调用功能的第三方钱包也将可以提供这项功能。
Qtum网页钱包目前提供了”从Ledger恢复“的选项,当页面升级为能提供简化离线Staking功能的版本后,将允许用户从Ledger硬件钱包地址进行离线Staking委托。
委托智能合约
将由一个智能合约来管理委托事务。主要功能包括添加、更新委托信息,删除委托,取得特定地址的委托等。
该智能合约将维护一张委托信息表,记录内容包括委托用户地址、被委托Super Staker地址、委托费、委托区块高度等。具体例子如下:
兼容性
因为离线Staking需要更改区块与转账协议,因此节点与客户端将无法向后兼容,实施时将需要进行硬分叉。在部署新节点和客户端之前可能需要运行一个单独的测试网,该测试网将遵循Qtum Core v0.18.1硬分叉的模式,即先启动测试网,后启动主网。
暂时不会实现的功能
离线Staking的上线版本将是一个最小可用版本,注重安全性与简洁度。待离线Staking在社区建议下更加成熟之后,可以再陆续添加一些额外功能。
以下功能并不列为目标,不会在初始版本中实现:
1. 从多签地址委托;
2. 从SegWit地址委托(不支持p2sh-segwit或bech32地址,仅支持”Q”开头的地址);
3. Staking服务节点Stake自己的UTXO;
4. Staking服务节点重组小的UTXO;
5. 为委托地址重组小的UTXO(必须手动处理)。
致谢
感谢Qtum开发团队设计并审核了Qtum离线Staking,尤其感谢Neil Mahi的原型设计。
参考文献
QIP-25 https://github.com/qtumproject/qips/issues/25
开发者指南 http://book.qtum.site/en/
Qtum文档 https://docs.qtum.site/en/
Qtum核心协议代码 https://github.com/qtumproject/qtum
著作权
Qtum及本QIP使用GNU通用公共授权第三版。