(二)區塊鏈的共識演算法:PoS 及其 例子 程式碼 實現
這篇文章是上一篇的序章,上一篇的連結地址是:
juejin.im/post/5b78f6… (一)區塊鏈的共識演算法:整體介紹 及 分叉 的通俗講解
本篇文章將會著重介紹PoS
共識演算法和採用程式碼例子來實在地闡述它
關於什麼是共識演算法
這個問題,請檢視(一)區塊鏈的共識演算法:整體介紹 及 分叉 的通俗講解
,裡面已經給出了答案。
PoS 共識演算法
PoS
全稱為Proof of Stake 股權證明
。字面意思就是,股份制。就是說,誰的股份越多,誰的話事權越大,這和我們生活中的股份制公司
中的股東的意思的差不多的。
但是,在區塊鏈的應用中,我們並不可能真實地分配給鏈中的節點
股份,取而代之的是另外一些東西,這些東西充當股份,我們將這些東西分配給鏈中節點
。下面將舉一些例子來加以闡述這個概念。
例如PoS
在虛擬貨幣
的應用中,我們可以把持幣量的多少,來看作擁有股權、股份的多少,現在以太坊 ETH
中是擁有PoS
共識機制的,所以在以太坊中,就是把各個以太坊節點
所擁有的ETH
代幣的數量來衡量,這個節點的股份有多少,它的話事權有多少。假設一個以太坊網路,共有3個節點
,A 和 B 和 C,其中 A 節點擁有10000 個 ETH 代幣,而 B 和 C 分別有 1000 和 2000 個,那麼在這個以太坊網路中,A 的區塊是最有可能被選中的,話事權是比較大的。
再例如,假設日後的某個非虛擬貨幣
的區塊鏈、公有鏈,一條實體業結合的鏈,例如汽車鏈
,我們就可以把每一位車主所擁
有的車輛數目
和他的車價值多少錢
來分配股份
,例如規定一條公式:車數*車價值 = 股份的多少
,在PoS
中股份是一個概念,一個衡量話事權的概念。
PoS 的特點
上面的描述已經說明了PoS
共識演算法的概念。因為它是以擁有某樣東西的數量
來衡量
話事權的,這就意味著,只要我們的節點,擁有這類東西,例如 ETH 代幣,哪怕擁有的只有一個
,都是有話事權的,即使很小,甚至都沒機會露面,但它還是有機會。
在PoS
中,塊是已經鑄造好的(這裡沒有“挖礦”的概念,所以我們不用這個詞來證明股份),PoW
是有挖礦概念的。
這也就造成了它有下面的特點:
-
優點:
- 縮短了共識達成的時間,鏈中共識塊的速度更快
- 不再需要大量消耗能源挖礦
- 作弊得不嘗失,因為如果一名持有 51% 以上股權的人作弊,相當於他坑了自己,因為他是擁有股權最多的人,作弊導致的結果往往是擁有著越多的損失越多
-
缺點:
髒資料的區塊攻擊
編寫 PoS 程式碼
為了能讓更多人,以及非 go 開發者能看懂,下面將通過虛擬碼
來實現,完整的 go 程式碼請留郵箱。
首先我們使用一個候選區塊陣列來儲存,每一個節點
廣播過來的和自己當前節點生成的區塊物件:
candidateBlocks [ ]Blocks候選區塊陣列 複製程式碼
每個區塊結構體
裡面有一個變數
是用來記錄生成這個區塊的節點地址
的
type Block struct { Timestampstring// 時間戳,代表該區塊的生成時間 Hashstring// 這個區塊的 hash 值 PrevHashstring// 這個區塊的 上一個 區塊的 hash 值 NodeAddress string// 生成這個區塊的 節點地址 Datastring// 區塊攜帶的資料 } 複製程式碼
然後有一個子執行緒
,專門負責遍歷候選區塊陣列
,來根據區塊
裡面的節點地址獲取
它的代幣數量,然後分配股權
stakeRecord []string// 陣列 for block ~ candidateBlocks { coinNum = getCoinBalance(block.NodeAddress) // 獲取代幣數量 for i ~ coinNum {// 幣有多少,就迴圈新增多少次 if stakeRecord.contains(block.NodeAddress) {// 是否以及包含了 break // 包含的就不再重複新增 } stakeRecord = append(block.NodeAddress) // 新增 } } 複製程式碼
然後從stakeRecord
中選出
一個競選勝利者
。這個概率就和上面的coinNum
有關,越大就越有機會。
index = randInt()// 得出一個整形隨機數 winner = stakeRecord[index]// 取出勝利者節點的地址 複製程式碼
最後,我們就能取出這個winner
所生成的區塊來進行公鏈的接入,然後廣播出去
for block ~ candidateBlocks { if block.NodeAddress == winner { // 新增 } } // 廣播出去 ... 複製程式碼
以上,就是一個很簡單的,PoS
演算法機制的程式碼實現,單純地根據持幣數量來做股權分配。而事實上
,事情往往是比較複雜的,想想一下,如果我的股權的分配,不僅僅和代幣的數量有關係呢,對吧,這樣的話,就能衍生各種各樣的想法變種方式
例如以太坊加入了幣齡,在候選成功後,以太坊在這個步驟還會扣除幣齡。種種的這些,都是可以變的,我們要理解 PoS 的精髓,才能在開發自己的公有鏈的時候,隨心而行