符合要求的委託資訊將會被記錄到合約中。同時,為了避免攻擊者過於頻繁地呼叫該合約,新增委託資訊的函式設定了較高的 Gas 費用,在當前網路狀態下,每次合約呼叫需要消耗約 0.9 QTUM 作為 gas 費用。這一部分gas費用以硬編碼的方式寫入合約。
典型的委託過程如上圖所示:
1. 委託人確定 Super Staker 的地址,並用自己的地址(記為 Addr_d)和 Super Staker 地址(Addr_s)生成對應的委託證明 PoD;
2. 委託人用 Addr_d 呼叫代理合約 addDelegation() 函式,呼叫引數須包含 Super Staker 的地址 Addr_s,委託人願意支付的手續費率 f,以及上述步驟1中的委託證明 PoD,合約的呼叫地址即為該委託的委託人地址;
3. addDelegation()函式會驗證委託資訊的有效性:
· 若委託人和代理人地址相同,結束;
· 若手續費率超過 100%,結束;
· 若委託證明 PoD 簽名驗證不透過,結束;
· 若相同的委託資訊已存在,結束;
4. 上述檢查透過後,addDelegation() 會在代理合約中新增新的委託資訊,若合約中已有當前委託人地址對應的委託資訊,該舊委託資訊將會被最新的委託資訊取代,以保證每一個委託地址始終只有一條合法的委託。
刪除委託資訊的過程基本類似,這裡不再贅述。委託合約呼叫完成並獲得區塊確認後即生效,供後續 Super Staking 和區塊驗證使用。
Super Staking
Super Staking 指的是在 Qtum 離線 Staking 協議中,Super Staker 可以用委託人地址的 UTXO 進行 Staking 的機制。Super Staker 雖然不擁有委託人的 UTXO,但可以透過展示委託證明 PoD 證明其有權使用對應 UTXO 生成符合共識要求的新區塊,並獲取部分割槽塊獎勵。
由於 Qtum 離線 Staking 的鏈上委託是委託人單方面發起的,Super Staker 在進行 Offline Staking 前,需要監聽鏈上代理合約的呼叫歷史,篩選出與自己相關的所有委託資訊,並在本地建立委託地址庫。Super Staker 需要保證本地的委託地址庫始終與最新鏈上資料同步,否則有可能無法產生合法的離線 Staking 區塊。Super Staker 可以對本地委託地址庫進行篩選,濾除手續費過低,或者餘額過低的地址,因為這些地址為 Super Staker 帶來的收益可能非常有限。具體的篩選規則可以由 Super Staker 自己決定。
Super Staker 進行離線 Staking 的基本過程如上圖所示:
1. 首先根據篩選後的委託地址資訊獲取所有委託 UTXO 列表;
2. 根據餘額從大到小對委託 UTXO 進行排列,並篩選掉手續費和餘額不符合 Super Staker 要求的 UTXO;
3. 依次用列表中的 UTXO 進行常規的 Staking,尋找符合要求的區塊;
4. 一旦找到符合要求的區塊(對應的 UTXO 記為 UTXO_1,其對應地址記為 Addr_1, 對應的委託證明記為 PoD_1),Super Staker 需要先讀取代理合約中的委託資訊(委託地址,Super Staker 地址,手續費率 f,委託證明 PoD 等資訊),確認該符合要求的 UTXO_1 對應的地址 Addr_1 的委託資訊與 Super Staker 自身的地址(Addr_2)相符:
a. 若不相符,Super Staker 可以更新本地委託資訊,並繼續返回繼續用 UTXO 列表中其他 UTXO 進行 Staking;
b. 若委託資訊相符,則繼續建立 Offline Staking 新區塊;
5. Offline Staking 新區塊的建立規則和普通 Qtum PoS 區塊基本相同,但需要遵守如下規則:
a. 新區塊頭中 prevoutStake 欄位應該填入上述 UTXO_1 的 prevout,根據標準 PoS 協議,這麼做相當於用 UTXO_1 的權益進行 PoS 驗證;
b. 新區塊頭中新增了 proofOfDelegation 欄位,填入對應的委託證明 PoD_1;
c. CoinStake 交易的輸入必須為 Super Staker 地址 Addr_2 對應的一個 UTXO_2,且其餘額不低於 100 QTUM,該 UTXO 將會被鎖定 500 區塊。這麼做是為了防止 Super Staker 利用委託的 UTXO 進行 nothing-at-stake 攻擊;
d. CoinStake 的第二個輸出必鬚髮送給代理地址 Addr_1,金額為 (區塊獎勵 + 區塊手續費)*(1 - f%);
e. CoinStake 的第三個輸出必鬚髮送給 Super Staker 地址 Addr_2,金額為(區塊獎勵 + 區塊手續費)* f%;
6. 廣播新區塊,等待確認。
去中心化共識驗證
1)區塊頭修改
為了讓驗證節點辨別普通 PoS 區塊和 離線 Staking 產生的區塊,需要在區塊頭中引入額外標識欄位。同時,由於離線 Staking 區塊需要驗證 PoD 的正確性,需要在區塊頭中引入對應的委託證明 PoD,供網路中其他節點進行驗證。Qtum 離線 Staking 協議在區塊頭中增加了 ProofOfDelegation 欄位,同時滿足以上兩個需求。
2)共識規則升級
區塊鏈中的所有參與者都可以對上述新區塊進行驗證,以達成全網共識。
除標準的權益證明共識驗證外,支援Qtum 離線 Staking的節點還需要在共識驗證階段增加以下驗證:
1. 獲取新區塊的區塊頭,根據區塊頭中的proofOfDelegation欄位判斷該區塊是否為透過代理Staking產生的區塊;若不是,則採用標準PoS驗證流程進行驗證;若是代理Staking區塊,則繼續進行如下額外驗證;
2. 驗證區塊頭中 prevoutStake 欄位中用於 Staking 的 UTXO 在過去 500 區塊中沒有用於 Staking 或 Super Staking;
3. 從新區塊的簽名中恢復區塊生產者的地址,即 Super Staker 的地址;
4. 從新區塊的區塊頭的 prevoutStake 欄位獲取用於 Staking 的幣的地址,即委託人的地址;
5. 利用 ProofOfDelegation 中對應的 PoD,以及上述獲取的 Super Staker 地址和委託人地址進行數字簽名驗證;若驗證失敗,則拒絕區塊頭;若驗證成功,則繼續;
6. 驗證區塊頭中的 PoD 與代理合約中對應地址的 PoD 是否相符;若驗證失敗,則拒絕新區塊;若成功,則繼續;
7. 繼續獲取新區塊的資料,驗證其中的 CoinStake 交易:
a.第一個輸入必須為Super Staker地址的 UTXO,且 UTXO 的值大於 100 QTUM;
b.第二個輸出的接收方必須為上述 Super Staker 地址(注意,CoinStake 交易的第一個輸出為空),且金額必須為 (區塊獎勵 + 區塊手續費)* f%,其中,f 為代理合約中對應委託資訊記錄的費率;
c. 第三個輸出的接收方必須為上述委託人地址,且金額必須為 (區塊獎勵 + 區塊手續費)* (1 - f)%;
8. 驗證透過,接收新區塊。
透過引入上述額外的共識規則,Qtum 離線 Staking 產生的區塊可以被網路中任意節點驗證,從而保證委託雙方地址,委託手續費以及區塊獎勵的分配都與委託合約中保持一致。
3. 系統安全性
Qtum 離線 Staking 機制對 Qtum 原有的共識機制進行了補充,引入新的共識規則使代幣能夠被代理人用於 Staking。本節主要討論由 離線 Staking 引入的新共識規則的安全性,確保沒有引入新的安全問題。
代幣安全性
在前文提到的 Qtum 離線 Staking 解決方案中,委託人用於 Staking 的所有權從未發生轉移,其私鑰始終掌握在委託人手中,其安全性等同於普通地址上代幣的安全性。在發起或修改委託資訊階段,委託人需要用其私鑰生成對應的 PoD,並對呼叫代理合約的智慧合約交易簽名。而隨後的離線 Staking 和驗證過程均無需委託人參與,即對應私鑰無需再被使用。根據數字簽名的特性,對 PoD 和智慧合約交易簽名並不會暴露私鑰,因此無論 Super Staker 還是其他節點,都無法透過 PoD 和代理合約中的委託資訊恢復出委託人的私鑰,保證了離線 Staking 過程中代幣的安全性。
PoD 的安全性
PoD 決定了 Super Staker 是否有權利使用委託人的代幣進行 Staking。為了保證安全性,協議必須確保滿足以下條件:
1. 只有委託人可以發起和修改委託資訊;
2. 只有被委託的 Super Staker 可以用委託地址進行 Staking;
3. 委託資訊被刪除或過期後,Super Staker 無法再對已過期的委託地址進行 Staking。
上述三點均由智慧合約的具體實現邏輯和共識規則共同保證。首先,合約的呼叫地址預設為委託人地址,而發起呼叫合約的交易必須用該地址私鑰對交易進行簽名,因此只有委託人可以成功建立和修改對應地址的委託資訊;其次,代理合約中一個地址都對應一個 Super Staker 地址,且該對應關係透過包含委託人和Super Staker 地址的數字簽名 PoD 體現,因此只有被委託的 Super Staker 地址可以進行合法的離線 Staking;最後,對於已經失效的委託資訊(例如被替換,被刪除,或已超過規定區塊高度),由於委託資訊已從代理合約的狀態中刪除,無法被其他節點驗證,因此也無法繼續被 Super Staker 用於 Staking。
防止“雙挖”
在以往標準的 Qtum PoS 過程中,作為 Stake 獲得區塊獎勵的 UTXO 總是被作為 CoinStake 交易的輸入,每次都產生一個新的 UTXO,共識規則規定新產生的 UTXO 達到成熟條件(即 500 個區塊)前,無法繼續被用於 Staking。這種設計保證了 Stake 的唯一性。
然而,在離線 Staking 機制中,雖然 Super Staker 用委託人的 UTXO 進行 Staking,但委託人的 UTXO 在成功 Staking 時不會產生新的 UTXO,因此舊的共識規則無法確保委託人的 UTXO 在 500 個區塊內的唯一性。這將導致一些餘額較高的委託 UTXO 連續獲得區塊獎勵,進而壟斷整個網路。同時,委託人可能在進行委託 Staking 的同時,自己也進行線上 Staking,透過這種“雙挖”的方式獲得超出自身權益的獎勵。
Qtum 離線 Staking 機制對此的解決方案是引入新的共識規則,驗證節點在驗證新區塊時,需要對記錄在區塊頭中的委託人 UTXO 進行驗證,確保其在 500 個區塊內沒有被用於 Staking 或是 Offline Staking,從而保證離線 Stake 與原有常規 Stake 具有一致的唯一性。
獎勵分配的安全性
在離線 Staking 場景下,Super Staker 是區塊的實際生產者,負責建立區塊。這意味著 Super Staker 可以決定新區塊中區塊獎勵的分配。
為了避免 Super Staker 作惡,Qtum 離線 Staking 引入額外的共識機制確保獎勵的合理分配。首先,獎勵的分配規則由委託人決定並進行簽名確認,記錄在代理合約中。其次,只有與代理合約中獎勵分配規則完全一致的新區塊才能被其他節點驗證透過。因此,Super Staker 只能按照委託人給定的比例獲得獎勵的一部分,而其餘獎勵必須全部傳送到委託人地址。
另外,委託人也無法影響 Super Staker 獲得與委託資訊相符的收益。因為委託人的委託資訊必須透過呼叫代理合約進行修改,需要在下一個區塊生效。委託人無法透過修改當前的委託資訊來降低 Super Staker 本應獲得的收益。試圖以高回報吸引 Super Staker,再透過快速修改委託資訊以避免支付服務手續費的行為,在理論上是不可行的。
綜上,委託人和 Super Staker 的收益權都得到了保障。
Nothing at stake 問題
離線 Staking 機制的引入,會使 Super Staker 獲得極大的權益,更容易產生新區塊。同時,由於 Super Staker 只使用委託人的 UTXO 進行 Staking,nothing-at-stake 問題將會進一步惡化。Super Staker 為了最大化獲取收益,可以在不同分叉鏈上進行離線 Staking,但卻不用付出任何成本。Nothing-at-stake 問題是 PoS 機制中暫時無法完全解決的問題,但 Qtum 離線 Staking 引入了獨特的機制緩解這一問題。Super Staker 在建立離線 Staking 的新區塊時,必須以自己持有的 UTXO 作為 CoinStake 交易的輸入,且 UTXO 的金額不少於 100 QTUM。產生的新 UTXO 在達到 500 個區塊的成熟條件後才能再次用於離線 Staking。這雖然提高了 Super Staker 進行離線 Staking 的門檻,但同時也能極大地緩解 Nothing-at-stake 問題。
小結
透過上述討論,我們可以得出結論,Qtum Offline Staking 透過智慧合約邏輯和共識規則的配合,保證了代幣本身在離線 Staking 過程中的安全性,同時也保證了委託雙方收益分配的安全性。在系統層面沒有引入額外的安全隱患。
4. 離線 Staking 應用場景
上文所述的委託資訊中的一項重要引數就是委託手續費率。不同的費率設定可以使離線 Staking 適應不同的應用場景。本節將介紹離線 Staking 在實際中幾種可能的應用示例。
常規離線委託(0 < 手續費率 < 100%)
在大部分常規的離線 Staking 委託中,大部分委託人會把委託手續費率設定在 (0, 100) % 範圍內,預設費率為 10%。在這類場景中,一般有三種角色參與:Super Staker,普通委託人,第三方資訊平臺。
Super Staker 透過提供穩定的 Staking 服務,或是較低的費率,吸引普通使用者把手裡代幣的 Staking 權利委託給自己,從而獲取收益。Super Staker 可以透過各種鏈下宣傳的方式對自身進行宣傳,吸引普通使用者。Super Staker 還可以根據自身運營成本篩選客戶,從而最大化自身的收益。
普通委託人可以把自己的 Staking 權利委託給 Super Staker。委託人是唯一可以設定手續費率的參與者,手續費率越高,被 Super Staker 接受的概率越高,但相應獲得的收益比例越低;反之,收益比例越高,但有可能被 Super Staker 忽略。委託人需要根據市場的變化和 Super Staker 的要求修改手續費率,以實現最大化收益。全網的平均手續費率是一個市場博弈的過程,最終會和 Super Staker 的運營成本接近。
隨著離線 Staking 的普及,會逐步出現一些第三方資訊平臺,聚合市面上所有 Super Staker 的列表,對比其費率和服務質量,供普通委託人篩選。同時也有助於 Super Staker 推廣自己的服務。
冷錢包Staking (手續費率 = 0%)
當委託人把手續費率設定為 0 時,區塊獎勵將完全由委託人獲得,Super Staker 無法獲取收益。這種設定適合大礦工進行冷錢包 Staking。
擁有較多代幣的大礦工,往往由於對熱錢包安全性擔憂而對參與 Staking 持觀望態度。透過 Qtum 離線 staking 機制,大礦工可以把存有大量代幣的冷錢包作為委託人地址,並委託給由自己維護的熱錢包地址,熱錢包地址可以只擁有數量很少的代幣,滿足每個區塊的最低代幣需求即可。委託的費率設定為 0,可以保證所有收益仍然傳送到冷錢包地址。這樣一來,既可以保證冷錢包中代幣的安全性,又可以參與 Staking 獲取收益,滿足大礦工的實際需求。
PoS礦池(手續費率 = 100%)
透過常規的離線 Staking 委託,普通委託人可以獲得一定的期望收益,但該收益有很大的不確定性,必須在 Super Staker 利用委託人的 UTXO 挖到新區塊時才能獲得。而在大家所熟悉的中心化礦池場景下,使用者只要加入礦池就可以確定地獲得一部分收益。雖然收益金額較少,但比較持續穩定。
為了滿足普通委託者獲取穩定收益的需求,礦池作為 Super Staker 可以要求委託人將手續費率設定為 100%。在這種情況下,委託人雖然擁有代幣的所有權,但所有區塊獎勵都將由礦池獲得。礦池隨後再根據和使用者的約定按比例分配收益,使用者獲得穩定的收益。這裡引入了和普通礦池一樣的中心化風險,因為礦池有可能不按照約定分配收益,因此需要使用者仔細甄別有公信力的礦池。但與普通的中心化 PoS 礦池相比,離線 Staking 的方案可以保證使用者的本金不受損失,極大降低了使用者的風險。而且使用者可以隨時取消委託,把風險降至最低。
5. 未來工作
智慧合約 Staking
隨著 DeFi 專案的持續火熱,越來越多的代幣被鎖定在智慧合約中。在以太坊等平臺上,鎖定在合約中的 ETH 是無法進行 Staking 的(假設以太坊已經切換 PoS 成功)。但在 Qtum 離線 Staking機制中,由於協議本身就是智慧合約實現的,利用合約中鎖定的代幣進行 Staking 也成為可能。
未來,我們計劃在智慧合約中增加類似前文提到的委託證明 PoD,把智慧合約中鎖定的代幣委託給 Super Staker,進行離線 Staking。獲取的收益將自動返還給智慧合約的資金池,增加 DeFi 參與者的收益。
代理合約鏈上治理
Qtum 離線 Staking 由於修改了共識規則,需要進行硬分叉升級。隨著 Staking 和 DeFi 生態的不斷髮展,在未來,可能還需要引入更多共識規則。但頻繁的硬分叉無疑會破壞社羣的共識。
Qtum 在未來會利用自主研發的分散式自治協議 DGP,對代理合約的共識機制進行管理。DGP 可以透過去中心化治理實現對共識規則和 Qtum 區塊鏈基本引數的無縫修改,無需硬分叉。
6. 總結
Qtum 離線 Staking 機制把智慧合約和傳統的 PoS 共識機制相結合,使任何使用者都可以隨時隨地參與 Staking,且保重參與 Staking 的本金以及 Staking 收益的安全性。成為 Qtum 的 Super Staker 沒有任何門檻,且沒有任何數量限制,保證了網路的去中心化,同時還為冷錢包 Staking、去中心化 PoS 礦池等提供了兼顧安全性和實用性的解決方案。另外,由於智慧合約的引入,具體的委託規則和獎勵分配規則都是可程式設計、可升級的,極大地提高了 Staking 的靈活性。我們相信 Qtum 離線 Staking 機制會隨著行業的發展而繼續進化,成為 Staking 領域新的標準。