區塊鏈兄弟社區,區塊鏈技術專業問答先行者,中國區塊鏈技術愛好者彙集地算法
做者:吳壽鶴函數
來源:區塊鏈兄弟區塊鏈
原文連接:http://www.blockchainbrother.com/article/8spa
著權歸做者全部。商業轉載請聯繫做者得到受權,非商業轉載請註明出處。get
書面協議社區
Lamport在文中提出,之因此會出如今口頭傳達中的那些錯誤是由於一些叛徒能夠說謊,這裏經過簽名就是爲了防止說謊。在簽名算法中加了兩個條件:im
即A4(a)忠誠將軍的簽名是不能僞造的,內容修改可檢測。(即 即便是叛徒也要原封不動的簽了名將消息轉發出去)技術
(b)任何人均可以識別將軍的簽名,叛徒能夠僞造叛徒司令的簽名。(後半句是論文中的後半部分規定的)。lamp
並且這裏Lamport規定,每條消息只能夠複製,而後加上本身的姓名再發出去。 問答
下面是具體的算法:
對於這個算法要說的是:
1. 初始化中的 Vi 相似於一個集合,表示的是第i個將軍收到的命令,好比 Vi= {Attack} 之因此說是個集合是由於Vi裏面不會有重複的命令出現。這在算法步驟(2)的(B) 部分描述的很清楚。
在算法步驟(1)中將軍將簽了本身姓名的消息廣播發給全部副官。注意這裏發的格式是 V:0,V是命令,0表明本身的身份。
2. 算法步驟(2)(A)中,每一個副官將收到的消息 V:0 把命令V放入本身的命令集合Vi(由於初始的時候他們的命令集合都是空的,因此不存在重複問題) 而後他們將命令拷貝,而後加上本身的簽名 ,獲得消息: V:0:i 而後再發給其餘的副官。
在算法步驟(2)(B)中由於副官i 也會收到別的副官發來的消息v:0:1:...:jk. 此時i會判斷v在不在本身的命令集合中,若是不存在的話將v加入Vi,並在k的狀況下將信息簽名,繼續發出去。
在這裏有幾點是須要注意的。
A) 若是將軍是忠誠的話,那麼由於忠誠將軍的簽名是不能夠改的,因此全部的命令都只是V,只是消息的簽名不同罷了,那麼副官將不會將重複的命令再加入Vi,因此這就是lamport在論文中提到的若是將軍是忠臣的話,那麼每一個副官只會保存a single order 。這裏之因此提到這個是後面的證實須要用到。
B)爲何說當k的時候纔會發送呢,這是由於每條信息只須要被複制m+1就能夠了(這裏將將軍署名的時候也算是一次簽名,能夠發現每簽名1次就是一個複製),超過m就不必了。之因此有這樣的規定會面會有證實,即只須要複製m+1此全部的忠臣就能夠達成
一致。還有就是這裏的下標k,並非表明一個副官的id號,而是被簽名的多少次,例如 v:0:j3; 這條消息,k是等於1(由於除了將軍之外只被簽名了一次)的而不是3.
3. 算法步驟(3),當一個副官不會再收到任何的消息時就會執行choice函數。這裏再也不收到,lamport規定是超過一個時間再也不收到就認爲再也不收到了。這裏的choice函數,lamport沒作具體的實現,只是認爲,當Vi中只有一個命令時就得出這個命令。當Vi和Vj是相等的時候choice執行的結果是同樣的,即他們能夠達成一致,這個只會在將軍是叛徒的時候纔會出現,這樣的話就知足了IC1條件。
當第三步結束,就能夠得出一致命令了。
下面咱們看看lamport是怎麼證實只須要m+1次複製就能夠了。
證實的整體思路是:
情形(一)若是將軍是忠誠的話,就像咱們在討論算法的時候提到的,全部忠臣的副官只多是收到a single order而後通過 choice函數獲得的是將軍的命令,因此知足IC2。
情形(二)這裏假如將軍是個叛徒。證實的整體思路是隻須要證Vi,Vj是相同的集合就能夠了。即只須要證實若是在step2中i將命令v放入Vi時,j也會將命令v放入Vj。
下面咱們來證這個:
由於i要是想將v命令放入Vi,確定會收到一個消息,V:0:j1:j2:...jk。那麼下面就討論:
(1)若是j屬於j1~jk中的一個,那麼他既然在消息上籤了名,那麼確定也收到了消息v,因此在這種狀況下是知足的。
(2)若是j不屬於j1~jk中的一個的話,再討論k的範圍:
a.若是k那麼i確定會簽上本身的姓名,將消息轉發給全部的副官固然這裏面確定會有副官j(根據算法B中的ii),那麼j要麼在命令集vj中沒有v的狀況下將他保存,要麼在已經有的狀況下置之不理,可是不管是哪一種狀況,都會保證,Vj和Vi一致。
b. 若是k=m.此時i不會轉發此消息。可是由於只有m個叛徒,又將軍是叛徒,那麼這m+1個複製裏面就確定有1個是忠臣,而忠臣會不修改消息直接將叛徒將軍的消息v傳給全部的副官,固然包括 j, 因此在此狀況下也是能夠保證的。
如今用個實例來證實:
當n=4,m=2必需要通過m+1輪複製才能夠完成容錯(或者說是交換)。
實例證實:n=4,m=2,r=m+1時(r=3 複製的輪數)可容錯
1,當將軍,L3是叛徒
step1:R1={x:0} R2={y:0} R3={0:0}
step2:k=0;1將 x:0:1 發給2,3;2將 y:0:2 發給1,3;3將 z1:0:3 發給1,將 z2:0:3 發給2。獲得:
R1={x:0;y:0:2;z1:0:3} R2={y:0;x:0:1; z2:0:3} R3={0:0;x:0:1;y:0:2}
step3:k=1,k進行下一輪複製。1將 z1:0:3:1發給2,3;2將z2:0:3:2發給1,3。獲得:
R1={x:0;y:0:2;z1:0:3; z2:0:3:2} R2={y:0;x:0:1; z1:0:3; z2:0:3:1} k=2算法執行choice函數。
書面協議的本質就是引入了簽名系統,這使得全部消息均可追本溯源。這一優點,大大節省了成本,他化解了口頭協議中1/3要求,只要採用了書面協議,忠誠的將軍就能夠達到一致(實現IC1和IC2)。這個效果是驚人的,相較之下口頭協議則明顯有一些缺陷。
書面協議的結論很是使人興奮,這不是解決了拜占庭將軍問題了嗎?但請注意咱們在A1~A4中其實是添加了一些條件的,這使得拜占庭將軍問題在這些假設下可以解決,可是在實際情況中卻會有一些問題。觀察A1~A4,咱們作了一些在現實中比較難以完成的假設,好比沒考慮傳輸信息的延遲時間,書面協議的簽名體系難以實現,並且簽名消息記錄的保存難以擺脫一箇中心化機構而獨立存在。
文章發佈只爲分享區塊鏈技術內容,版權歸原做者全部,觀點僅表明做者本人,毫不表明區塊鏈兄弟贊同其觀點或證明其描述