今年,qtum量子链的开发者们的工作中重要的一部分是实现量子链离线staking功能。离线staking是什么?将有哪些使用场景?本系列将从设计、测试、部署等角度陆续为你揭晓量子链离线staking的方方面面。量子链离线staking的顶层设计还在不断完善之中,而作为系列的第一篇,本文将首先为你剖析utxo在量子链现行的在线staking中是怎么工作的。等离线staking的设计完成,我们将进一步展示utxo在量子链离线staking中的重要性。毕竟说到qtum量子链的pos,最重要的就是utxo。区块链聚合
摘要
utxo(未花费输出)是qtum量子链的基础价值单位,并且在qtum pos的staking中起到重要作用,因此有很多相关操作。大的stake会被分成两个utxo,小的stake可以汇聚成多个utxo。我们在文中回顾了现行的在线staking中使用utxo的方式,这也是将来离线staking的基础。
简介utxo
你可能已经了解qtum量子链在发送“币”的时候使用了比特币的utxo(未花费输出)模型。通过使用utxo模型,qtum的价值就是一个或多个存储在区块链上的之前发生的转账。未花费的转账在新的转账中可以作为“输入”被发送出去,而同笔转账中的接收地址就会收到一个或多个“输出”。这就是“未花费输出”名字的由来。
为了更好地理解utxo在钱包中是怎么工作的,我们用下图中的例子展示了一个钱包如何管理两个地址中的6个utxo(共300qtum)。因为这些utxo是“成熟”utxo(经过了500个以上的区块确认),所以它们能在这个钱包里被用来staking。这些utxo以转账的形式存储在区块链上(而不是钱包里)。这个钱包存着这两个地址的私钥,所以它“拥有”这些utxo,可以把它们发送出去或者去stake(而任何其他没有这些地址私钥的钱包不能操作这些地址的utxo)。
“我的utxo”按钮只存在在以上ps的钱包图片中,实际钱包中在“转账”页面会显示该钱包所有转账的细节。
utxo是怎么被选中进行stake的?
pos共识算法会对每个被stake的成熟utxo进行单独计算。如果某个utxo提供了一个kernel solution(sha256哈希值小于“目标值”,可以取得出块权),该utxo就有权stake下一个区块。当然,这个过程中还有很多细节【1】。找到kernel solution的概率也会根据utxo的大小调整权重,更大的utxo将能更频繁地找到kernel solution。所有的成熟utxo之和将作为“钱包权重”,这将决定一个钱包获得区块奖励的概率。
staked utxos
当一个utxo被选为kernel solution之后,下一步是去区块链上进行stake。每个区块中的第二个转账是coinstake转账,在这个转账中将确认stake并支付区块奖励。钱包将给自己发送stake转账,这会将stake锁定,直到经过500个区块确认(也就是说着将锁定stake大约18小时)。下图展示的是一个简单的coinstake转账:
coinstake转账背后发生了什么?
一个有300qtum的utxo被选为kernel solution(pos共识算法的正确结果)来stake下个区块。因此300qtum的基础上会再加上40个qtum作为新铸造的区块奖励。任何大于或等于200qtum的coinstake输入都会被自动分成两个utxo,每一半都会收到04qtum起始区块奖励的一半,因此有两个1502qtum的输出。同时还有9个04qtum的输出被发送给之前的区块奖励获得者。
钱包将stake输出发送给自己(在这个例子中是两个1502qtum的输出),这些币将stake 500个区块确认的时间,然后些币就可以被发送给别人或者等成熟后继续stake。coinstake转账不需要支付转账费或gas。而且,上图中没有显示的是,coinstake转账会收集转账费和gas,分成十份发送出去给当前和之前的区块奖励获得者,这就是qtum mutualized pos中mutualized(互助)的部分。
stake中的utxo重新组合
生成stake的另一个特点是钱包总是会将小额的utxo重组,来清理小额utxo。下图表示一个有150qtum的utxo的kernel solution,随后将9个04qtum区块奖励组合了起来。这个coinstake转账有10个输入和9个输出。因为stake小于200qtum,所以没有被分割,最后的stake将是一开始的150qtum加上9个04qtum的重组,再加上04qtum的初始区块奖励,总共是154qtum。
在区块500847发生了一个极端的例子,一个只有04qtum的utxo给出了kernel solution,然后跟其他99个04qtum的奖励组合了起来,生成了一个stake。
创建stake
创建stake过程中,分割和重组utxo的规则会遵照下面这个流程图中的过程。大于200qtum的utxo将被平分,钱包将重新组合utxo以达到100qtum。当然,最后的stake取决于钱包中可用的utxo。
建og钱包的utxo大小
我们可以看看一些og(original gangster)staking钱包上个月最大的8位staker的utxo大小。这些钱包已经持续stake了至少一年半,他们的stake的utxo不断通过以上规则进行分裂和重组。我们从qtuminfo的api中获取了这些信息:
平均utxo大小是取了大于05qtum的utxo(不包括那些04qtum的区块奖励)。上表显示这些og staker们在逐渐向大约150-180qtum的staking utxo进行转变。
重新组合算法随着v0180的发布而被执行得更多。我们现在能看到许多重新组合是9的倍数,因为一个典型的stake utxo能够由核心的utxo加上9个04qtum区块奖励组成。
我们也可以观察真实的stake大小。通过使用python脚本抓取二月过去两周的区块链数据(区块高度543792-553241),有9450个区块的stake范围在4至1000024qtum之间。463%的stake在小于200qtum的范围内(所以不会被分割)。具体的stake大小分布如下(这里选取了0-1000qtum的stake,以50qtum为单位间隔):
这个图要怎么看?在统计的时间段内,大小在100至150qtum(灰色)之间的stake占总stake数量的266%,大小在150至200qtum(黄色)之间的stake占总stake数量的167%,以此类推。100-200qtum之间的两类清晰地显示了200qtum以上的stake会被钱包分割开,以及utxo重新组合的现象。
在统计的两周内,有五个04qtum的utxo以及一个2qtum的utxo(钱包总权重为6qtum)提供过kernel solution。这些小型staker很幸运,但也很少见,因为理论上他们的等待时间可以长达数十年。
设置你的utxo大小——sendmanywithdupes
为了效果最优,staking钱包应该预先将它们的utxo分割成100-150qtum的大小。为了将大的utxo分割成staking的理想大小,可以使用sendmanywithdupes命令。一个好的方式是每个转账发送100个utxo,这样能够最容易地发送到一个新的staking地址。可以像【2】中一样,使用任意文字处理器将其中的占位符替换成您的staking地址。
结论
utxo是staking操作的关键,在作为stake使用时,utxo遵循严格的分割与重组算法。当qtum的委托staking方案公布后,我们将重新考虑utxo在新设计中的影响。
参考文献
1 an introduction to qtum proof-of-stake mining — a racing story mediumcom@jb395officialan-introduction-to-qtum-proof-of-stake-mining-a-racing-story-f11a3f48009f
2 sendmanywithdupes
这个命令允许向一个地址发送多个转账,是理想的将大utxo分割成适合staking的工具。下面的命令将产生10个新utxo。您可以按照这个模式扩展到最多100个utxo,并使用“全部替换”来输入您的staking地址。
sendmanywithdupes “” “{
\”q_my_address\”:100,\”q_my_address\”:100,\”q_my_address\”:100,\”q_my_address\”:100,\”q_my_address\”:100,\”q_my_address\”:100,\”q_my_address\”:100,\”q_my_address\”:100,\”q_my_address\”:100,\”q_my_address\”:100}”