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