Loading...

UTXO的作用——通往 Qtum 离线Staking之路(一)

2020-03-12 10:30

作者:Jackson Belove 译者:徐锦程

今年,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的基础上会再加上4.0个QTUM作为新铸造的区块奖励。任何大于或等于200QTUM的Coinstake输入都会被自动分成两个UTXO,每一半都会收到0.4QTUM起始区块奖励的一半,因此有两个150.2QTUM的输出。同时还有9个0.4QTUM的输出被发送给之前的区块奖励获得者。

钱包将Stake输出发送给自己(在这个例子中是两个150.2QTUM的输出),这些币将Stake 500个区块确认的时间,然后些币就可以被发送给别人或者等成熟后继续Stake。Coinstake转账不需要支付转账费或Gas。而且,上图中没有显示的是,Coinstake转账会收集转账费和Gas,分成十份发送出去给当前和之前的区块奖励获得者,这就是Qtum Mutualized PoS中Mutualized(互助)的部分。

Stake中的UTXO重新组合

生成Stake的另一个特点是钱包总是会将小额的UTXO重组,来清理小额UTXO。下图表示一个有150QTUM的UTXO的kernel solution,随后将9个0.4QTUM区块奖励组合了起来。这个Coinstake转账有10个输入和9个输出。因为Stake小于200QTUM,所以没有被分割,最后的Stake将是一开始的150QTUM加上9个0.4QTUM的重组,再加上0.4QTUM的初始区块奖励,总共是154QTUM。

在区块500847发生了一个极端的例子,一个只有0.4QTUM的UTXO给出了kernel solution,然后跟其他99个0.4QTUM的奖励组合了起来,生成了一个Stake。

创建Stake

创建Stake过程中,分割和重组UTXO的规则会遵照下面这个流程图中的过程。大于200QTUM的UTXO将被平分,钱包将重新组合UTXO以达到100QTUM。当然,最后的Stake取决于钱包中可用的UTXO。

建OG钱包的UTXO大小

我们可以看看一些OG(Original Gangster)Staking钱包上个月最大的8位Staker的UTXO大小。这些钱包已经持续Stake了至少一年半,他们的Stake的UTXO不断通过以上规则进行分裂和重组。我们从qtum.info的API中获取了这些信息:

平均UTXO大小是取了大于0.5QTUM的UTXO(不包括那些0.4QTUM的区块奖励)。上表显示这些OG Staker们在逐渐向大约150-180QTUM的Staking UTXO进行转变。

重新组合算法随着v0.18.0的发布而被执行得更多。我们现在能看到许多重新组合是9的倍数,因为一个典型的Stake UTXO能够由核心的UTXO加上9个0.4QTUM区块奖励组成。

我们也可以观察真实的Stake大小。通过使用Python脚本抓取二月过去两周的区块链数据(区块高度543792-553241),有9450个区块的Stake范围在4至100002.4Qtum之间。46.3%的Stake在小于200QTUM的范围内(所以不会被分割)。具体的Stake大小分布如下(这里选取了0-1000QTUM的Stake,以50QTUM为单位间隔):

这个图要怎么看?在统计的时间段内,大小在100至150QTUM(灰色)之间的Stake占总Stake数量的26.6%,大小在150至200QTUM(黄色)之间的Stake占总Stake数量的16.7%,以此类推。100-200QTUM之间的两类清晰地显示了200QTUM以上的Stake会被钱包分割开,以及UTXO重新组合的现象。

在统计的两周内,有五个0.4QTUM的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 https://medium.com/@jb395official/an-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}”