做者:林冠宏 / 指尖下的幽靈git
GitHub : https://github.com/af913337456/數組
騰訊雲專欄: https://cloud.tencent.com/developer/user/1148436/activities網絡
這篇文章是上一篇的序章,上一篇的連接地址是:app
http://www.javashuo.com/article/p-motpqzjs-gk.html,(一)區塊鏈的共識算法:總體介紹 及 分叉 的通俗講解 post
本篇文章將會着重介紹
PoS
共識算法和採用代碼例子來實在地闡述它區塊鏈
關於什麼是共識算法
這個問題,請查看(一)區塊鏈的共識算法:總體介紹 及 分叉 的通俗講解 ,裏面已經給出了答案。線程
PoS
全稱爲 Proof of Stake 股權證實
。字面意思就是,股份制。就是說,誰的股份越多,誰的話事權越大,這和咱們生活中的股份制公司
中的股東的意思的差很少的。code
可是,在區塊鏈的應用中,咱們並不可能真實地分配給鏈中的節點
股份,取而代之的是另一些東西,這些東西充當股份,咱們將這些東西分配給鏈中節點
。下面將舉一些例子來加以闡述這個概念。
例如 PoS
在虛擬貨幣
的應用中,咱們能夠把持幣量的多少,來看做擁有股權、股份的多少,如今 以太坊 ETH
中是擁有 PoS
共識機制的,因此在以太坊中,就是把各個以太坊節點
所擁有的 ETH
代幣的數量來衡量,這個節點的股份有多少,它的話事權有多少。假設一個以太坊網絡,共有3個節點
,A 和 B 和 C,其中 A 節點擁有10000 個 ETH 代幣,而 B 和 C 分別有 1000 和 2000 個,那麼在這個以太坊網絡中,A 的區塊是最有可能被選中的,話事權是比較大的。
再例如,假設往後的某個非虛擬貨幣
的區塊鏈、公有鏈,一條實體業結合的鏈,例如 汽車鏈
,咱們就能夠把每一位車主所擁
有的車輛數目
和他的車價值多少錢
來分配股份
,例如規定一條公式:車數*車價值 = 股份的多少
,在 PoS
中股份是一個概念,一個衡量話事權的概念。
上面的描述已經說明了 PoS
共識算法的概念。由於它是以擁有某樣東西的數量
來衡量
話事權的,這就意味着,只要咱們的節點,擁有這類東西,例如 ETH 代幣,哪怕擁有的只有 一個
,都是有話事權的,即便很小,甚至都沒機會露面,但它仍是有機會。
在 PoS
中,塊是已經鑄造好的(這裏沒有「挖礦」的概念,因此咱們不用這個詞來證實股份),PoW
是有挖礦概念的。
這也就形成了它有下面的特色:
髒數據的區塊攻擊
爲了能讓更多人,以及非 go 開發者能看懂,下面將經過 僞代碼
來實現,完整的 go 代碼請留郵箱。
首先咱們使用一個候選區塊數組來保存,每個 節點
廣播過來的和本身當前節點生成的區塊對象:
candidateBlocks [ ]Blocks 候選區塊數組
每一個區塊結構體
裏面有一個變量
是用來記錄生成這個區塊的節點地址
的
type Block struct { Timestamp string // 時間戳,表明該區塊的生成時間 Hash string // 這個區塊的 hash 值 PrevHash string // 這個區塊的 上一個 區塊的 hash 值 NodeAddress string // 生成這個區塊的 節點地址 Data string // 區塊攜帶的數據 }
而後有一個 子線程
,專門負責遍歷 候選區塊數組
,來根據區塊
裏面的節點地址 獲取
它的代幣數量,而後分配股權
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
算法機制的代碼實現,單純地根據持幣數量來作股權分配。而事實上
,事情每每是比較複雜的,想一想一下,若是個人股權的分配,不只僅和代幣的數量有關係呢,對吧,這樣的話,就能衍生各類各樣的想法變種方式