Decred 是一種類似于比特幣的加密貨幣,通過工作量證明與權益證明的混合挖礦系統(tǒng),確保少數(shù)組織無法主導交易流程,且無法在沒有社區(qū)投入的情
Decred 是一種類似于比特幣的加密貨幣,通過工作量證明與權益證明的混合挖礦系統(tǒng),確保少數(shù)組織無法主導交易流程,且無法在沒有社區(qū)投入的情況下擅自更改 Decred。相應地,Decred 的出塊獎勵60%為 PoW 礦工所有,30%歸 PoS 投票者所有,其余10%則屬于 Decred 財庫,由持票者投票決定如何使用。Decred 的代幣為 DCR,總量為 2100萬枚。
不同于 Cosmos 直接抵押代幣的設計,Decred 網(wǎng)絡的 Staking 是通過“買票”的方式進行的:用戶通過錢包購買 Staking 所需票,等待票被選中,選中后即可獲得收益。由于票被選中時要求錢包在線,因此對于多數(shù)普通用戶而言,通過支付少量手續(xù)費來委托“投票服務提供商”代為 Staking 無疑是更為穩(wěn)妥的選擇。HashQuark 現(xiàn)已開放 DCR 投票,歡迎前來投票(https://dcr.hashquark.io)!
在項目實現(xiàn)方面,Decred 是以比特幣的 go 語言實現(xiàn) BTCD 的代碼為基礎擴展 PoS 相關特性。本文從比較 Decred 和比特幣的數(shù)據(jù)結構入手,逐步探究其如何通過不同的“交易”類型來實現(xiàn)買票、中票和退票的機制。
數(shù)據(jù)結構
Decred 的區(qū)塊和交易數(shù)據(jù)結構沿用于比特幣,賬戶也采用了 UTXO 模型。本文將依次對比 Decred 與比特幣的區(qū)塊、交易等結構。
區(qū)塊結構
Decred 和比特幣的區(qū)塊結構都由兩部分構成:區(qū)塊頭(BlockHeader)——包含一些元數(shù)據(jù);區(qū)塊體(BlockBody)——包含交易信息。
區(qū)塊頭部結構
Decred 的頭部多記錄了一些 Staking 相關的數(shù)據(jù):
1. StakeRoot 類似于 MerkleRoot,MerkleRoot 負責記錄普通交易相關的默克爾樹的根值,StakeRoot 記錄的則是 Staking 相關交易的默克爾樹的根值。
2. FreshStake、Revocations 和 PoolSize 記錄的則是在此區(qū)塊中有多少新買的票、撤回的票以及票池的大小。
3. Sbits 與 Bits 類似,Bits 記錄 PoW 挖礦的難度,Sbits 記錄的則是 Staking 的難度。
區(qū)塊體結構
Decred 的區(qū)塊體中多了一些 Staking 相關的交易記錄。在 Decred 中,Staking 相關的交易包括買票、中票和退票。
交易結構
通過上圖可知,比特幣和 Decred 的交易結構大體上是一致的,包括了多個輸入(TxIn)和多個輸出(TxOut)。每個輸入包含了指向上一個區(qū)塊和索引的引用,輸出則包含了鎖定金額和鎖定腳本。
票
在 Decred 的設計中,一張票會經(jīng)歷如下生命周期:
- 通過錢包支付“票價+買票手續(xù)費”購買一張票
- 買票交易進入內存池,等待 PoW 礦工打包
- 若買票交易被打包,則該票變成“未成熟”狀態(tài),等待256個區(qū)塊(約20小時)成熟。在此期間,該票無法被撤回。若該買票交易未被打包,買票的票價+買票手續(xù)費會被退回賬戶
- 等待256個區(qū)塊后,該票成熟,進入票池等待被選中
- 被選中平均需要28天,概率符合泊松分布。目標票池有40960張票,任何一張票在40960個區(qū)塊(約142天)中有99.5%的概率被選中。如未被選中,則該票“過期”,將退回購買時的票價
- 若票被選中、錯過(被選中投票未響應或兩個區(qū)塊間隔時間過短)或過期,鎖定的資金需等待256個區(qū)塊成熟才能釋放
- 若票被錯過或過期,需要錢包發(fā)起退票交易以取回資金
Decred 是如何設計買票、中票、撤回票等邏輯的?答:通過定義不同的“交易”來進行。
Dcered 支持兩種方式的 Staking——用戶 solo或 VSP(投票服務提供商)。前者要求用戶錢包長期在線,后者則是借助第三方服務。下文將從 VSP 質押的方式入手,探究買票、中票和退票是如何進行的。
前置操作
用戶在購買票前需要先綁定對應的 VSP。可通過登錄 VSP 網(wǎng)站獲取 API token 填入錢包來進行。綁定記錄了以下數(shù)據(jù):VSP 手續(xù)費、VSP 地址、與 VSP 共同生成一個1-2多簽地址等。
買票
在 Decred 的設計中,用戶通過錢包買票,票價會隨著需求量波動,每144個區(qū)塊(約12小時)動態(tài)調節(jié)一次,以維持票池數(shù)量40960票的目標。
在買票前,錢包會計算出下列數(shù)值:
票價(TicketPrice)
小費(TicketFee)
VSP 的手續(xù)費(poolAmt)
用戶應分得的金額(userAmt)
買票交易的輸入輸出如下圖所示:
買票交易用兩個 UTXO 作為輸入,分別是此前計算出的 poolAmt 和 userAmt。輸出主要分為三部分:
· 第一個輸出值為票價,輸出地址是一個票池和用戶二選一的多簽地址,表示用戶或票池二選一能花費這筆輸出
· 第二個輸出值為0,使用“OP_RETURN”記錄了 VSP 地址和貢獻值,之后需要根據(jù)該貢獻值計算中票后分得的獎勵
· 第三個輸出值為0,地址為空地址。其設計本意為找零地址,但在實際操作中,錢包會在買票交易前構造一筆交易,創(chuàng)造數(shù)量合適的兩個的輸入
· 第四個輸出類似第二個輸出,記錄的是用戶的獎勵地址與貢獻值
· 第五個輸出類似第三個輸出,本意是用戶找零地址,實際設置為零。
· 輸入值和輸出值之差為此前計算的買票費(TicketFee),這筆費用即礦工打包買票交易的費用。
買票的本質是在計算票價和買票費后構造一筆交易,輸入是用戶要付的完票價和買票費,輸出最主要的是用戶和票池的二選一多簽地址,其他輸出則記錄票池和用戶之后分配資金的比例。
中票
當一張買票交易被 PoW 礦工包含進區(qū)塊成功挖出后,等待256個區(qū)塊后即可“成熟”,此時該票有一定概率被選中。選中后,由 VSP 發(fā)起對應的中票交易,交易發(fā)起成功,等待256個區(qū)塊成熟,用戶即可獲得收益。
中票交易如下圖所示:
中票交易的輸入分為兩部分:
- 第一部分為中票獎勵,類似于 PoW 挖礦的鑄幣獎勵,這一輸入是“憑空”產(chǎn)生的。中票交易獎勵的計算方式為中票獎勵 = 該區(qū)塊獎勵 * PoS獎勵占比(30%)/ 5張票。
- 第二個輸入是買票交易的第一個輸出,即此前產(chǎn)生的二選一多簽、值為票價的輸出?,F(xiàn)在由票池來花費這筆輸出,構造一個中票交易。
中票交易的輸出大體分為三部分:
第一部分:記錄一些驗證信息,如前一個區(qū)塊的哈希、高度以及用戶相應的投票等信息。
第二部分:根據(jù)買票交易里的礦池貢獻值(poolAmt)計算中票后礦池分得的手續(xù)費,這部分輸出歸礦池所有。
第三部分:根據(jù)買票交易里的用戶貢獻值(userAmt)計算用戶分得的金額,這部分輸出歸用戶所有。
既然中票交易不含交易費,那么 PoW 礦工會不會不打包或降低這些交易的優(yōu)先級呢?并不。在 Decred 的設計中,PoW 挖出的塊必須包含3-5張中的票,也就是中票交易,如礦工故意漏票,則會導致其收益降低或生成的區(qū)塊無效。
退票
用戶買的票在40960個區(qū)塊里有99.5%的概率被選中。若未被選中,則該票“過期”。另有一種情況,即某張票雖被選中,但由于某些問題(如票池宕機)或兩個區(qū)塊間隔較短,也會出現(xiàn)該票“錯失”的情況。在上述情況下,錢包會發(fā)起“退票”交易來取回買票的票價金額,但小費(TicketFee)無法返回。
與中票交易類似,退票交易采用買票交易的二選一多簽輸出為輸入,由于未中票,因此沒有額外的質押獎勵作為輸入。
退票交易的輸出分為兩部分,根據(jù)買票交易的貢獻值在礦池和用戶之間分配撤回的金額,與中票交易類似。若用戶未中票, 票池也會分得少量手續(xù)費——當然,退票交易在實際情況中是極為少見的。
總結
至此,我們分析了 Decred 是如何實現(xiàn) Staking 的核心——買票、中票和退票的。在比特幣的數(shù)據(jù)結構基礎上,擴展 PoS 相關的存儲結構,通過構造和解釋不同的交易類型和腳本語言,利用多簽地址和 OP_RETURN 操作符記錄 Staking 相關信息, 巧妙地實現(xiàn)了質押的相關邏輯。由于在買票等過程中,用戶的資產(chǎn)并不屬于票池,其安全性也因此得到了保證。(HashQuark)
關鍵詞: Decred 挖礦系統(tǒng) Staking