Tendermint共識協議補充介紹和相關證明

本文作者:萬向區塊鏈技術中心研究組。

 

本文檔補充介紹Tendermint 共識協議中validator選取規則以及算法的相關證明。關於Tendermint共識協議的詳細解析,請看https://blog.csdn.net/WXblockchain1/article/details/105491701

 

1. validator選取

與其他的一些PoS共識算法不同的是,Tendermint中,各validator節點都需要聯網,並且validator集合由外部的特定程序進行指定和管理。

 

對Tendermint共識來說,PoS不是必需的,但可以基於它實現PoS共識,也就是說,此時節點需要在鏈上或鏈下支付保證金,或者也可能不需要支付任何保證金。

 

每個validator節點擁有一對密鑰對,以及相應數量的投票權,而且投票權不需要都相同。

 

選取validator節點有兩種方式:

可以在創世狀態(genesis state)對應的創世配置文件genesis.json中進行預先設置;

每次 commit 新區塊後,Application logic通過ABCI(Application Blockchain Interface)接口發送的針對EndBlock消息的回覆中,會包含有validator集合的更新。

 

2. 算法相關證明

本部分介紹算法的Safety,Liveness和Fork Accountability的證明。

 

2.1. Safety證明

Safety指的是,假設系統中拜占庭的validator投票權佔比爲 -1/3(小於1/3),就可以保證鏈不會產生分叉,也就是同一高度不會commit兩個不同的區塊。證明如下:

假設一個validator在round R中commit了一個區塊B,這就意味着該節點接收到了+2/3(大於2/3) 的precommit投票。由於拜占庭節點投票數最多爲-1/3,因此有1/3+(大於1/3)的誠實節點在round R中仍然lock在區塊B上。

這些誠實節點要解除lock狀態的話,需要接收到來自round R'>R的PoLC,即需要有+2/3的針對另一個區塊B'的prevote投票。但這是不可能的,因爲按照算法規則,這些佔比爲1/3+的誠實節點只會prevote區塊B,從而導致針對區塊B'的prevote投票無法達到+2/3。這就說明,除了commit的區塊B之外,同一高度上不會再commit其它區塊,保證了safety。

 

2.2. Liveness證明

如果有1/3+的誠實節點在不同的round中lock在不同的區塊上,由於最終會有proposer將更靠後的round上對應的PoLC廣播出來,這樣就會導致在更靠前的round上lock的節點被unlock。這就能保證足夠多的節點可以進行後續的共識投票,從而保證系統的Liveness。

 

此外,各節點等待接收完整的proposal即block以及可能的PoLC信息的超時時間timeoutProposalR可以隨着round的推進而增加,這樣在proposal的大小相對比較固定的情況下,整個網絡可以保證proposal被各節點接收到。

 

綜合以上兩點,系統可以保持Liveness。

 

2.3. 分叉問責證明

分叉問責(Fork Accountability)需要收集相應的投票信息,以便在分叉時,能夠判斷是那些節點進行了雙重簽名,即同一個節點在同一高度,對兩個不同的區塊進行簽名。

 

對於一個validator v1來說,所有對應高度爲H,由它簽名的precommit投票,加上與這些投票對應的、證明合法性所有PoLC(即所有對應lock change的prevote投票)組成的集合,記爲JSet(justification-vote-set)。

 

比如,如果v1對以下precommit投票簽過名:
Precommit(B1 @ round 0)
Precommit(nil @ round 1)
Precommit(B2 @ round 4)

 

則 Precommit(B1 @ round 0)投票需要round 0 有一個PoLC來證明,同時Precommit(B2 @ round 4)投票需要round 4 有一個PoLC來證明。Precommit(nil @ round 1)根據算法規則,不需要有對應的PoLC,同理,這裏沒有round 2和3的precommit 投票信息,也不需要對應的prevote投票信息。因此JSet只需包含round 0和4的PoLC投票。

 

進一步地,對於一個區塊鏈高度H,以及validator集合VSet,可以定義JSet爲所有VSet中的validator對應的JSet的並集。對於所有在round R commit過區塊B的誠實的validator來說,可以構建一個JSet來證明這個commit。

 

在指定高度H,和round R,如果有一個commit,並且所有commit區塊的validator(committer)對應的JSet能夠爲每一個validator提供證明,則稱JSet能夠證明該commit。

 

現在我們來證明,如果檢測到分叉,即同一高度上存在兩個不同的commit,則這兩個commit對應的JSet的並集中,存在1/3+的validator有雙重簽名。

 

證明:
假設commit的兩個區塊分別爲B和B',則它們分別對應着兩個precommit投票集合P和P'。P和P'中都包含+2/3的precommit投票。

P中每一個precommit投票對應一個validator,記所有validator的集合爲V。同理,P'對應validator集合爲V'。則V和V'的交集即爲進行過雙重簽名的節點集合。假設其節點數量佔比爲-1/3,則V中去掉這部分節點佔比爲+1/3,加上V'的節點,則佔比超過 1/3 + 2/3 = 1,這是不可能的,說明假設不成立,也就是有1/3+的節點有雙重簽名。

這同時也說明,當檢測到分叉時,就說明拜占庭節點佔比爲1/3+,不符合爲保證Safety所需的條件。

此時,可以通過外部介入的方式,來判定相應的責任。根據前面的推理,最後可以找到至少1/3或更多的節點,對於其中每個節點來說,要麼其至少一個投票無法證明合法性,要麼其有雙重簽名。


3. References

[1] https://tendermint.readthedocs.io/en/master/

重點章節:

Tendermint 201/Specification/Byzantine Consensus Algorithm,Genesis, Validators

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章