1. 程式人生 > >The Science of the Blockchain筆記(四)

The Science of the Blockchain筆記(四)

認證的協定

上一篇:The Science of the Blockchain筆記(三)

  拜占庭節點能就它們的輸入和接收到的訊息撒謊。能檢測出某些謊言並具有限制拜占庭節點的能力嗎?也許可以使用簽名來證實訊息的真實性。

利用認證的協定

在這裡插入圖片描述
在這裡插入圖片描述
在這裡插入圖片描述
證明.
  假定主節點p不是拜占庭節點,並且其輸入為1,那麼p在第一輪廣播 value(1)p ,這將觸發所有好節點將決策值設為1。如果p的輸入是0,那麼不存在簽名的訊息 value(1)p ,因此無節點可以將決策值設為1。
  如果主節點p是拜占庭節點,那麼需要所有好節點判定為相同的決策值,否則演算法就不正確。假定節點P在第i輪(i < f + 1)說服一個好節點v其值為1。由此可知v接收到i個簽名的訊息 value(1)u

。 然後,v將廣播i + 1個簽名的訊息value(1)u (演算法第10行),這將觸發所有好節點也判定決策值為1。如果p是在第f + 1輪才說服某個節點v,則v必須接收f + 1個簽名的訊息。由於至多f個節點是拜占庭節點,至少存在一個好節點u在第i <f + 1輪中已判斷決策值為1,併發布了訊息value(1)u。這就又回到了前面的情形中。

分析.

  • 該演算法僅花費f + 1輪,效率是最優的。
  • 實際上,主節點通常是好節點。如果這樣,那麼演算法5.3僅需兩輪!

Zyzzyva演算法

在這裡插入圖片描述
當沒有拜占庭節點存在:
在這裡插入圖片描述
分析.

  • 由於客戶端接收到3f+ 1個一致的響應,所以所有正確的副本都必然處於同一狀態。
  • 完成命令c僅需要三個通訊回合。

考慮到拜占庭節點的存在:
在這裡插入圖片描述
分析.

  • 如果有副本宕機,一個客戶端u將接收到少於 3f+1 條一致的相應訊息。客戶端u只能假設如果所有正確副本最終將命令c附加到它們的本地歷史hr,那麼客戶端u只能假設命令c是完成的。

當主節點為拜占庭節點:
在這裡插入圖片描述
  例如,如果客戶端u接收到兩條由主節點簽名的訊息Response(a,OR)r,但其中包含的OR並不一致。那麼客戶端u能夠證明主節點行為不當。客戶端u通過向所有副本廣播一條 (IHatePrimary)r訊息來通告這個不當行為,同時也啟動了一個檢視改變( View Change) 。
在這裡插入圖片描述


分析.

  • 拜占庭主節點(Faulty Primary)可以通過不發出Ordered Request訊息(演算法5.8第4行)來降低Zyzzyva的速度,並重復進入到演算法5.12。
  • 仍然存在優化的空間。例如,一個副本可能已知道客戶端請求的命令。在該情形中,它可以作出回答而不詢問主節點。進一步地,主節點可能己知道副本請求的訊息OR。此時,它將舊的OR訊息傳送給發出請求的副本。

檢視改變

在這裡插入圖片描述
檢視改變協商階段:
在這裡插入圖片描述
分析.

  • 集合H中的f + 1個 (IHatePrimary)r訊息證明至少一個好副本發起了檢視改變。該證明被廣播到所有副本來確保一旦第一個好副本在當前檢視中停止活動,所有其他副本都將跟隨。
  • 在Zyzzyva中,拜占庭主節點在檢視改變後開始充當常規副本。 實踐中,所有機器最終都損壞並且很少在此之後修復自身。作為替代,可以考慮採用不在前一檢視中的新副本來替換拜占庭主節點。

檢視改變執行階段:
在這裡插入圖片描述
分析.

  • 直至SI之前的命令被包括到新的歷史hnew中。
  • 如果最後提交證書SI之後至少f + 1個副本共享一致的歷史, 那麼之後的命令也將被包括進去。
  • 即使f+1個正確副本一致地報告最後的提交證書Sl之後的命令c,客戶端也可能不認為c是己完成的,因為發到該客戶端的某條響應被丟失了。這樣的命令被包括到新的歷史hnew中。 當客戶端重新嘗試執行c時,副本將能夠利用該客戶端的請求中包括的時間戳標識出同一命令c,從而避免重複執行該命令。

檢視恢復階段(包含於檢視改變執行階段):
在這裡插入圖片描述
分析.

  • 命令c可以僅在Sl之後在演算法5.8中完成。因此,3f + 1個副本向c傳送了 Response(a,OR)r 訊息。C包括2f + 1個副本的本地歷史,在這2f+1個副本中至多f個副本是拜占庭節點。於是,c及其歷史可以在C中的至少f + 1個本地歷史中發現。