首先,我們發現 PoW 模式基本都採用的比特幣的出塊方式。PoS 模式的出塊方式則不同。每生成一個 PoS 塊就要花費一箇舊幣,消耗掉它的幣齡。一箇舊 幣 只有滿足下列公式才能在 time_in_seconds 生成一個 PoS 塊:
其中:
·coin(代幣)指的是建立了一段時間(timeweight(coin))的 UTXO(為防止舊幣的權重過大,建立天數以 90 天為上限),value(coin) 指的是 UTXO 的值。二者相乘得出 幣齡 。
·time_in_seconds 指的是精確到秒的當前時間。和比特幣一樣,PPCoin 同樣要假設誠實的節點擁有同步時鐘(偏差很小)。如果一個區塊的時間戳晚於節點時鐘的當前時間或是早於前一個區塊的時間戳,節點應將其視為無效。
·d 是可調的難度引數,旨在將 PoS 塊的出塊速度維持在 10 分鐘。
·prev_blocks_data 是這個公式裡最有趣,也是最巧妙的引數。它的功能是防止有人預先知道滿足上述公式的代幣(從而獲得生成 PoS 塊的資格),並且對選塊過程進行操控。這個引數決定了系統的公正性,換言之,從權益者中選出出塊者的過程是公正的。(我們有時也會將這一過程稱為 出塊選舉 ——權益者的獲選概率應該與其持有代幣的總幣齡成正比,而且無法提前預知自己會於何時獲選)。我們將檢驗一些 prev_blocks_data 的替代引數,並發現它們的問題所在。
如果滿足了上述公式,代幣 的所有者就可以生成一個區塊,裡面包括一個透過花費 代幣 創造新的交易輸出的 代幣權益 交易,它的值略高於 value(coin) (超出每年幣齡消耗量的 1/100 ,相當於 1% 的年通脹率)。
PoS 區塊和 PoW 區塊之間的主要差別在於 隨機數(nonce) 欄位。 為了生成一個 PoS 區塊,區塊鏈中的每個代幣每秒都有一次機會參與選舉(即符合公式)。如果成功獲選,控制 該代幣 的權益者可以釋出一個區塊。否則必須等待一秒後才能再次嘗試。此處很適合強調工作量證明挖礦的兩大不同之處:
·在 PoW 模式下,礦工持有的代幣量不會影響找到合法區塊的過程。
·更重要的是,在 PoW 模式下,為了找到一個合法的區塊,礦工在硬體條件允許的情況下每秒可以進行儘可能多的嘗試。在上一篇文章中,我們指出到 2018 年 6 月為止,比特幣網路每秒可產出大約 3500 萬兆個雜湊——遠遠超過 PPCoin 中(每個幣)每秒只能進行一次嘗試。
公平的出塊選舉
到目前為止是不是看起來前途一片光明。接下來讓我們從 prev_blocks_data 的角度更深入地研究一下這個系統。 以下是三種潛在的替代方案:
·prev_blocks_data = 空值。如果將 prev_blocks_data 從公式中去掉,凡是關注該區塊鏈的人都會有“預見”能力,可以找出哪個幣在哪個時刻有資格釋出 PoS 區塊。出塊過程的不可預見性蕩然無存。然而,問題還不止於此——聰明的權益者會調整 UTXO ,以便儘快獲得出塊資格。於是,PPCoin 會成為一種昂貴的 PoW 系統,在尋找“獲選潛力大的”代幣的過程中消耗大量成本。
·prev_blocks_data = 前一個區塊的雜湊值。在這種情況下,由於每個區塊使用的 prev_blocks_data 都會變化,出現“預見”情況的可能性要小得多。然而,問題在於區塊提議者可以選擇區塊,這樣就有一個特定的代幣在不久的將來有資格生成 PoS 塊。這就賦予了出塊選舉過程很高的可操縱性。更糟糕的是,如果持有權益較多的權益者將自己的代幣正確分割開來,(只需要很低的成本)就可以偷偷建立出一條很長的鏈,然後使用這條鏈發起雙花攻擊。為操控出塊選舉過程調整區塊通常被稱為 粉碎攻擊(Grinding Attack) 。
·prev_blocks_data = 前一個 PoW 區塊的雜湊值。這種方案理當可以緩解 粉碎攻擊 的問題,因為礦工不可能放棄他們找到的合法的 PoW 區塊(在 PoW 模式下,自私挖礦 可以被視為一種影響力非常有限的粉碎攻擊)。這種方案也有助於抑制“預見”問題——“預見”能力只能持續到下一個 PoW 塊出來之前。不過 PoS 模式的問題依然存在。經過簡單的分析可知,(如果將持有的幣正確分割開來)平均每生成 4⁶=4096 個區塊之後,持有全網 1/4 權益的權益者就有資格生成連續 6 個 PoS 區塊。對於 PoW 區塊來說當然也是如此,不同之處在於潛在的攻擊者會預先知道自己是否能夠連續生成多個塊,從而制定相應的攻擊計劃。(掌握的算力不足全網 1/2 的礦工)偷偷建立一條 PoW 鏈需要承擔很大的風險,因此礦工為避免經濟損失不會試圖發動這類攻擊。然而,在 PPCoin 的模式下,假設每 6 小時生成一個 PoW 塊,如果權益者發現自己接下來有資格生成連續 6 個塊,就可以實現長達 6 個塊的重組。這樣就可以在無成本的情況下發起隱藏鏈攻擊。此外,如果出塊率很低的話,會很難留住 PoW 礦工。如果我們提高 PoW 的出塊率,所謂的 PoS 系統就名不副實了。
經過上述分析,你應該已經相信公平的權益者選舉過程設計起來並不容易了吧。然而,PPCoin 不只存在這一個問題。另一個有趣的問題是 理性分叉 。
理性分叉
要理解這個問題,讓我們重新思考一下 PoW ——如果 PoW 鏈上的一個礦工發現某個可以開挖的區塊點(tip),在上面建立了一個區塊,然後驗證其有效性,她立馬就能得到響應。如果區塊是合法的,她會將它釋出到網路上。否則她會提高 nonce 值,並再次嘗試。關鍵在於她的計算資源在任何時候都是充分利用的。因此,如果礦工當時還知道另一個具有替代性的可挖區塊點,她必須決定如何分割自己資源。她的最佳策略是將自己的資源貢獻給最有可能認可她的區塊的網路,如果她真的有幸找到一個區塊的話。
現在讓我們考慮一下 PPCoin 的情況。與 PoW 相似,權益者嘗試基於已知 tip 建立了一個區塊,並立即得到了回覆。如果該區塊是有效的,她會將它釋出到網路上。反之,她必須等待整整一秒才能進行下一次嘗試。在這一秒中,她的計算資源是閒置的。因此,在等待期間,如果她將計算資源貢獻給了不太可能認可她的區塊的鏈,她不會遭受損失(不過收益也不高)。具體來說,如果權益者(在相同的區塊高度上)知道了兩個相互競爭的區塊點,她不可能老老實實地只選擇其中一個建立區塊。她更有可能選擇同時維護兩條分叉鏈,以便獲得更多(預期)收益。
如果所有權益者都採用上述策略,那麼這條鏈會經常出現重組,整個系統的可靠性就會大幅降低。越是縮短出塊的間隔時間,這個問題就會越發嚴重,因此 PPCoin 的 PoS 系統無法實現擴容或是縮短確認時長。
“無利害關係”問題
上述問題還可以從另一個方面思考,即 無利害關係(Nothing-at-stake) 問題。權益者會試圖另外建立一條(隱藏的)鏈來攻擊主鏈。她們會不間斷地試圖拓展已有的鏈條,除非發現在某條鏈上連續出塊的機會。因為這些嘗試實際上都是零成本的,他們不會遭受損失。如果他們發現主鏈比隱藏的分叉鏈長很多,他們只需放棄這條分叉鏈,再從距當今更近的點上建立一條鏈。值得一提的是,當攻擊發生的時候,他們可以同時嘗試擴充套件主鏈,確保無論如何自己都不會遭受任何損失。發動這種攻擊最後是會成功的,然而更糟糕的是,攻擊者不承擔任何成本。
PoS 系統的無利害關係問題的主要原因是出塊成本“很低”,而且無需“工作量”。在 PPCoin 中,這一問題與出塊的出塊選舉方式有直接關聯。我們會在後續文章分開討論這兩個問題,及其解決之道。
上述分析基於 Iddo Bentov 等人所著論文的第二節。
去中心化的妥協?如何實現公平和激勵?
要確保持有代幣的權益者沒有操控 PoS 塊的選舉流程,prev_blocks_data 選用了一種非常複雜的函式(點選此處檢視詳情)。PPCoin 的開發人員透過對 prev_blocks_data 的設計降低了權益者在出塊選舉方面的影響力。然而,這種解決方案的效果如何很難評定,在下一篇文章中,我們將討論另一種解決方案——“低影響力函式”。
此外,PPCoin 的開發人員會透過 檢查點機制 解決理性分叉(以及隱藏鏈攻擊)的問題。 檢查點會抑制權益者的隱藏鏈攻擊——由於鏈的合法性實際由檢查點機制決定,任何長鏈重組行為都將無法實現。
當然,檢查點機制也存在一個問題,即作為一種中心化手段來實現系統的穩定性。此外,出塊選舉過程似乎很容易受到權益者的操控。
在後續文章中,我們將提出 PoS 系統設計者真正需要解決的問題:1)為出塊選舉賦予無法預測和無法操控的隨機性以及 2)如何解決出塊的低成本問題(以防 鏈融合 或 隱藏鏈攻擊 之類的短程攻擊和 同步新節點 之類的長程攻擊)。
另一個需要解決的問題是在 PoS 系統中,至少是在 PPCoin 的 PoS 系統中,權益者獲得的收益很少,因此參與出塊過程的積極性不高。由於許多權益者可能會在很長一段時間內保持離線狀態,參與度會成為一個問題。
後續文章預告
在這部分,我想提一下 PoS 設計中的三大主要演進階段。最初模仿比特幣 PoW 模式的嘗試過於幼稚,而且存在很多弱點。這些嘗試包括 PPCoin (及後來者 Nxt 和 BlackCoin)和 Iddo Bentov 的行動證明(Proof-of-Activity)和行動鏈(Chains-of-Activity)。
之後的嘗試將 拜占庭容錯層(BFT)融入了原始的鏈選舉規則。從某種意義上說,最長鏈的選舉規則被一種更安全的方案替代了,即研究歷史達 30 年之久的拜占庭容錯共識演算法,如實用拜占庭容錯(PBFT) 等。拜占庭容錯演算法通常會滿足幾個數學特徵,不過要依託於不必然能在實際實現中得到滿足的特定假設。具體來說,BFT 鏈的選舉規則可以減少為確保一致性而對同步通訊的需求(能夠極大地提升出塊速度),不過是在假設只有極少數參與者沒有誠實地遵守協議的前提下。
在後續的文章中,我們會詳細探討這一點,不過在 PoS 模式的設計中,激勵正確的參與具有非常重要的意義。 Tendermint 和 Algorand 最先嚐試將 BFT 演算法融入 PoS 。
在傳統 BFT 演算法和現代 PoS 模型中,提議區塊和確認區塊是由同一個實體進行的。Casper FFG 為代表的第三代 PoS 系統將生成區塊和確認區塊分開。一方面不斷生成區塊,並透過雜湊鏈構成一個樹狀的資料結構,另一方面透過 PoS 驅動的 BFT 協議將從該樹中敲定一條不斷生長的分支。
這種方法透過 PoW 模式下的區塊生成來降低實行 PoS 模式的區塊鏈的難度。透過將 PoS 模式融入 PoW 鏈的執行能夠逐漸向 PoS 模式遷移。這就是以太坊計劃實行 Casper FFG 的目的所在,之後會用 PoS 模式代替 PoW 模式生成區塊。
阿劍按:在看 PPCoin 的執行模式描述時,我完全沒意識到還可以像“理性分叉”講的這樣攻擊。什麼是“honest”呢?太難定義了。在 PPCoin 模式下,人們每秒可以嘗試一次出塊,但什麼是“honest”呢?換一個出塊點嘗試算是惡意嗎?