為了更好地理解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}”