概念
2012年,化名Sunny King的網友推出了Peercoin,該加密電子貨幣採用工作量證明機制發行新幣,採用權益證明機制維護網路安全,這是權益證明機制在加密電子貨幣中的首次套用。
與要求證明人執行一定量的計算工作不同,權益證明要求證明人提供一定數量加密貨幣的所有權即可。權益證明機制的運作方式是,當創造一個新區塊時,礦工需要創建一個“幣權”交易,交易會按照預先設定的比例把一些幣傳送給礦工本身。權益證明機制根據每個節點擁有代幣的比例和時間,依據算法等比例地降低節點的挖礦難度,從而加快了尋找隨機數的速度。這種共識機制可以縮短達成共識所需的時間,但本質上仍然需要網路中的節點進行挖礦運算。因此,PoS機制並沒有從根本上解決PoW機制難以套用於商業領域的問題。
實現思路
Peercoin(點點幣,PPC)於2012年8月發布,最大創新是其採礦方式混合了POW及POS兩種方式,其中POW主要用於發行代幣,未來預計隨著挖礦難度上升,產量降低,系統安全主要由POS維護。目前區塊鏈中存在兩種類型的區塊,POW區塊和POS區塊。PPC的作者為同樣不願意公開身份的密碼貨幣極客Sunny King,同時也是Primecoin的研發者。
要掌握Peercoin的POS機制,需要重點理解Sunny King專門為PPC設計的幾個核心概念:Coinstake,Kernel,Stake Modifier,ModifierInterval,StakeReward,Coinage等。
Coinstake
為了實現POS,Sunny King專門設計了一種特殊類型交易,叫Coinstake,Coinstake的設計借鑑於中本聰的Coinbase設計。本質上Coinbase和Coinsake都是一筆交易,只是對他們的輸入、輸出做了一些硬性限制,這樣才不會擾亂系統原有的POW機制。
1) Coinbase結構要求:
(1)輸入數量必須等於1,且輸入的Prevout欄位(指定前一筆交易的輸出)必須置空值。
(2)輸出數量必須大於等於1。
2 ) Coinstake結構要求。
(1)輸入數量大於等於1,且第一個輸入的Prevout欄位不能為空,即要求Kernel必須存在。
(2)輸出數量大於等於2,且第一個輸出必須置空值。
這兩種特殊交易在區塊鏈中存放的位置也有特殊要求,中本聰規定每個區塊的第一筆交易必須放置Coinbase,反之,Coinbase不能出現在區塊的其他位置。Sunny King顯然不想破壞這個規則,他增加了一條規則,對於POS區塊,第二筆交易必須放置Coinstake,反之,Coinstake不能出現在其他地方。換言之,只要第二筆交易是Coinstake,那么這個區塊就當POS區塊來處理。
Coinbase和Coinstake都不應該被單獨廣播,而只存在於區塊中,因此客戶端節點一般都不允許進入記憶體池,當花費這兩種交易時,都需要檢測是否已經成熟。
Kernel
Coinstake的第一個輸入(Input 0)叫KernelKernel在POS機制里確實起到核心作用,合格區塊的判定與之息息相關。合格區塊表述為:
SHA256D(nStakeModifier+txPrev.block.nTime+txPrev.offset+txPrev.nTime+txPrev.vout.n+nTime)< bnTarget X nCoinDayWeight
公式中的每一個參數都有明確的設計目的。
nS takeModifier:專門為POS設計的調節器,按照以上公式,如果沒有參數nStakeModifier當一個人收到一筆幣之後,他立即就能提前計算得知自己在未來何時可以鍛造區塊,這顯然不符合設計目標,Sunny King希望POS礦工和POW礦工一樣做盲目探索,以實時線上維護區塊鏈,nStakeModifier的設計就是為了防止POS礦工提前計算。nStakeModifier可以理解為POS區塊的一個屬性,每一個區塊對應一個nS takeModifier值,但nStakeModifier並不是每個區塊都變動,不過協定規定每隔一定時間Cmodifier interval)必須重新計算一次,取值與前一個nS takeModifier以及最新區塊哈希值有關,因此POS礦工無法提前計算,因為他不知道未來的區塊哈希值。
也就是說,在PPC系統中,除了存在區塊鏈、幣鏈(幣的交易簽名歷史),還隱藏著一個很少被提及的鏈條一一權益調節器鏈條。
值得一提的是,Sunny King是在PPC後來的版本才加入這個調節器的,一開始他使用nBits。
txPrev: Kernel對應的前一筆交易。
txPrev.block.nTime: txPrev所在區塊的時間戳,一筆交易被納入區塊的時間是交易發起者不能確定的,節點有可能通過提前計算預估到未來對自己有利的時間戳,這個參數就是為了防止節點利用這種預估優勢提前生成大批交易。
txPrev.offset: txPrev在區塊中的偏移量,用以降低網路節點同時生成Coinstake的機率。
txPrev.nTime: txPrev構造時間,設計目標如txPrev.offset。
txPrev.vout.n: Kernel在txPrev中的輸出下標,設計目標如txPrev.offset。
bnTarget:全網當前目標難度基準值,類似POW中的當前難度值,由nbits記錄。
nCoinDayWeight: Kernel消耗的幣齡,加入了一個時間權重。
Coinage
幣齡,也叫幣天,假如1.5個幣存在於區塊鏈中10天,幣齡數值為
Coinage=1.5×10=15
PPC採用幣齡,而不是直接採用餘額(Balance)來計算。
StakeReward
權益激勵,俗稱獲得利息,計算公式為:
stakeReward=Coinage×33/(365×33+8)×0.01×COIN
公式可簡化為
stakeReward=(0.01×Coinage/365)×COIN
其中,Coinage即上文說的幣齡,COIN可理解為“幣”,1 COIN即通常所說的1個幣,本質是一個常量,中本聰在比特幣系統里定義為100 000 000,如此設計主要是為了避免浮點數運算,比特幣支持8位小數源於此。
思路總結
POS一併解決了POW浪費能源和算力集中兩個痛點,理論上還能縮短了共識時間,但同時也丟棄了POW的某些優勢,因此更容易分叉,一筆交易需要等待更多確認才能確保全全,而POS最大的問題是其安全性和容錯性還沒有得到嚴格的數學論證。