近幾年門限密碼學在區塊鏈系統裏開始逐漸被應用,分爲門限加密和門限簽名,通常見於隨機預言機、防審查、減小通訊複雜度(HotStuff)、共識網絡中防拜占庭(HoneyBadgerBFT 中用於 BA 環節的 common coin)以及做爲分佈式僞隨機數生成器(coin tossing)的重要原語,其優越的資產協同防盜特性也慢慢被新興數字資產託管機制所重視,今天咱們主要討論公鑰密碼學(PKC)裏的門限簽名機制。一種理想的門限簽名系統是能夠在異步的網絡環境裏作到容錯容災不可僞造(non-forgeability),而且擁有極度可靠安全的消息傳輸通道,簽名份額的生成和驗證是徹底非交互式的,在初始密鑰階段具有能夠防止拜占庭行爲的異步分佈式密鑰生成(DKG)機制。node
與基礎簽名機制相似,門限簽名機制(Threshold Signature Schemes)也分爲兩部分:算法
門限密鑰生成(Thresh-Key-Gen):基於安全參數構造一種分佈式密鑰生成協議 DKG,協議運行輸出一個共同的公鑰 pk 和分屬不一樣參與方各自全部的私鑰份額 ski,彙集起知足閾值數量的私鑰份額能夠構建出真正的私鑰 sk。安全
門限簽名(Thresh-Sig):基於分佈式通訊網絡,各參與方經過本身的私鑰份額 ski 完成對消息 m 的分佈式協做簽署並輸出最終的可驗證簽名 Sig(sk, m),這個簽名跟單獨用 sk 私鑰簽出的如出一轍,能夠用所基於的基礎簽名機制裏的驗證函數進行本地驗證,無需走通訊交互驗證網絡
可是大多數狀況下會經過使用一個可信的中心節點(dealer)來實現私鑰份額的生成和分發。沙米爾祕密分享(Shamir Secret Sharing)是最簡單的依賴中心 dealer 節點的門限密鑰生成方法,基本原理是拉格朗日插值,在 (t, n) 門限構造中,dealer 會選擇一個 (t-1) 次方的隨機多項式 f,令 f(0)=s,s 即爲要分享的祕密值,而後向每一個節點分發該多項式曲線上的點 si=f(i) 做爲各自的祕密份額值,簡單來說,三個點肯定一個二次方程曲線(Lagrange interpolation formula)。爲了解決中心做惡問題,人們又不斷探索了基於承諾(commitment)的可驗證祕密分享(VSS、PVSS),以及應用於異步網絡的 VSS(Cobalt BFT 在區塊鏈系統裏也嘗試告終合 PoW 准入機制的 AVSS)。有許多優秀成熟的 commitment scheme 能夠借鑑應用,簡單來說承諾(commitment)算法 [C(M), D(M)]=Com(pk, M, r) 中 pk 是與承諾機制有關的公鑰,M 是要承諾的原始值,r 是一個隨機骰子,算法輸出的 C 即是 commitment,D 則是須要祕密保管的 decommitment 值,在正式公開 M 以前先公開 M 的承諾 C,即先對本身要公佈的消息作個上帝擔保,約束本身沒法更換 M,而對於 M 的受衆或者接收者,它們能夠經過以前公佈的承諾和驗證算法進行驗證惟一性。這裏咱們主要關注非交互式的 VSS 實現。架構
此外,在過往的研究裏,簽名(Sig)的生成和驗證大可能是交互式的,而且依賴一個同步通訊網絡和廣播通道(broadcast channel),節點們在某種設定下接收到特定消息後便同時啓動簽名協議,並嚴格遵循超時機制。而在互聯網環境和區塊鏈網絡裏,對網絡假設的限定是有限的,因此門限系統要成功運做除了須要構造真正的 DKG 協議和非交互式簽名機制外,還須要具有商用級的網絡系統以及被驗證過的成熟代碼實現。這裏咱們(Bytom)嘗試提出並構建一種弱同步網絡假設下的門限簽名分佈式系統,主要對網絡模型、DKG 構建、簽名機制進行一些創新結合和應用,探索在實際網絡環境裏最小可實用的門限簽名系統原型。異步
門限系統是一種(t, k, n)型 fault-tolerance 系統,t 表明網絡最大容錯,k 表明最小門限值,n 是節點數,通常設定 k>=t+1,但這種對網絡分區(network partition)是無能爲力的,因此在一個異步拜占庭網絡裏咱們依然選用經典設定 k=n-t & t<n/3 去達成系統裏的一個大多數共識。分佈式
門限網絡或者通訊模型是實現可實用門限系統須要認真考量的一個關鍵點。像 HoneyBadgerBFT 所構建的接近異步通訊網絡在現實案例中是少見的,通常會增長消息複雜度和通訊輪次,異步網絡模型主要依賴所接收到的消息類型和數量進行判斷,由於時間因子(time-based)並不能區分誰是慢節點誰是惡意節點。但在這裏咱們更傾向採用高效的弱同步網絡假設,即消息延遲和時鐘偏移有上限(實際可接受)但未知,延遲的漸進是合理的,保障 liveness(safety 能夠採用妥協的方法處理);可以對 crash、network failure、byzantine 等不一樣狀況儘可能作到分開處理,好比設置規定時間內可容忍的 crash 閾值,對於誠實節點發生 crash 後可以從一個規定的狀態恢復等;而且假設網絡故障總能被修復、遭受的 DoS 攻擊總會中止;最後在構建通訊通路上能夠藉助 PKI 和外部 CA 構建 TLS 連接,以及藉助經典的 RBC 協議(reliable broadcast channel)。函數
DKG 是門限簽名最爲核心的環節也是第一階段,負責完成門限密鑰的生成和分發。VSS 是 DKG 的重要組成部分。上面提到 VSS 的基本原理是承諾機制,通常基於 Pedersen commitment,構造形如 C=mG+nH 的承諾(這裏咱們省去了一些對橢圓曲線羣運算特徵定義和假設,能夠簡單理解爲橢圓曲線計算),其中 m 來自密鑰構造多項式 f(x) 係數,而 n 來自 dealer 另外構造的一個隨機多項式 h(x) 的係數,承諾集合 {Ci, 0<i<t} 是一種公開可獲取的係數「證據」,用於證實 dealer 只認可一個合法的密鑰多項式。各個參與方在得到 dealer 分發給本身的密鑰份額 f(i) 和祕密值份額 h(i) 後,計算 f(i)G+h(i)H,若是與對應的承諾值(多項式計算)相等,則認爲合法,若是不一致,則認爲 dealer 出現做惡行爲,開始向網絡提交本身的抗議 complaint,其餘人能夠進行驗證,若是發現事實如此,則當即中止協議,若是其餘人驗證後發現該 complaint 不合法,則發起 complaint 的節點會被標記不可信。VSS 過程簡單來說包括中心初始化密鑰分發、構建承諾和重建密鑰三部份內容,整個網絡交互存在兩輪(synchronous)全網廣播(all-to-all)達成一致,最終將密鑰份額和承諾傳遞給每一個參與節點,這裏咱們會定義三種消息類型用於標記多輪消息序列並攜帶足夠的信息用於計算門限密鑰。區塊鏈
真正的 DKG 是須要去掉 VSS 裏的那個中心,在分佈式協做下生成祕密,避免單點泄漏風險,其原理也很簡單,至關於 n 個節點同時各自選擇祕密值並運行本身的 VSS,每一個節點收集來自其餘節點的祕密份額完成組裝,組裝後的結果即是真正私鑰的份額,而各個合法節點各自分發的祕密值聚合起來即是最終的構造私鑰,最後在進行承諾驗證。這彷佛很像一個 Multi-valued Validated Byzantine Agreement (MVBA) protocol (一種被普遍研究的能夠對多種提案高效率達成共識的一致性協議算法,存在多個變種,好比異步公共子集 Common Subset)。加密
不過咱們儘可能避免這種複雜的實現,通常經過選舉出 Leader 節點,統一協調處理這些 VSS 的完成狀況和最終共識,定義序列,當大多數節點(n-t)完成各自的 VSS 階段並被其餘全部誠實節點所確認後,Leader 將這些已完成的 VSS 信息進行收集並重組提案,再通過兩輪全網廣播後,每一個節點便會肯定下各自最終的祕密份額,所以保障 liveness 對於咱們的系統是十分關鍵的。若是 DKG 協議裏任何一方出現惡意行爲,協議都會當即中止,即 DKG 須要確保全部參與方的誠實行爲。至此,一把公共的門限公鑰和分屬不一樣參與方的門限私鑰份額便構造完畢。
簽名階段簡單來說是基於上面獲得的密鑰份額各自完成簽署本身的簽名份額,最後再完成統一組裝,獲得最終門限簽名。Thresh-Sig 階段的具體實現與所基於的數字簽名算法有很大關係,例如 Schnorr 算法在計算簽名 s 值時所依賴的祕密值 k 在常數項,s=k-z(H(K||M)),因此能夠簡單的將祕密值份額相組。而 ECDSA 中祕密值 k 是非線性的,即 s=(H(M)+zr)/k(其中 r 也是由 k 通過指數運算得來),存在兩個祕密值(k 和 z)的乘運算,因此各個節點不能僅經過擁有 k 祕密值份額來完成最終簽名值的組裝,須要對公式進行變形,從新定義組合祕密值 kz,並分佈式完成 kz 的祕密份額計算以及分發,甚至須要藉助安全多方計算(在不泄漏各自 k 和 z 份額的前提下,完成 kz 的結果計算並輸出 kz 的祕密份額給相應參與方)、同態加密機制以及零知識證實(range proof),所以多方的 ECDSA 門限簽名在實現和效率上會比較複雜,現階段以可實用的 2-2 方案研究居多。
不管是採用 ECDSA 仍是 Schnorr 算法,最核心的問題依然是基於 DKG 和多方計算的原理去生成和分發簽名算法中須要的祕密值,每一個參與方基於各自的密鑰份額和祕密值份額完成本身的簽名過程,最後經過總體的交互組裝得到最終的合法簽名。一樣的,若是沒法達到足夠門限閾值數量的合法簽名方,簽名協議也會當即中止。根據不一樣的應用場景需求,咱們須要認真研究用於實現門限簽名機制的底層簽名算法,好比 ECDSA、EdDSA、Schnorr、BLS 等,不一樣的簽名算法對應的門限機制實現複雜度和效率是不一樣的。
此外,一個完整的門限系統可能會有成員變動的需求,原有的密鑰份額隨之須要新一輪變動,最直觀的作法是引入週期的概念,經過同步網絡和共識協議發起新一輪密鑰生成,產生新的主公鑰和私鑰份額,用超時機制防止阻塞。成員變動和 DKG 是一種比較精細(或脆弱)的系統,任何一個成員 fail 或者 fault 都會引起情況外。在實現上咱們用狀態機複製原理構建門限(DKG)節點,基於消息輸入更換自身狀態(例如 node_remove,leader_change,group_update)。
門限密碼學隨着結合應用場景的需求研究增多,不斷完善自身成熟度,尤爲是隨着高度可靠的代碼實現增多,隨着複雜網絡環境裏的系統架構成熟,有但願在價值網絡裏扮演「門神」的重大做用,同時會促進對零知識證實、同態加密技術的進一步場景化應用,是當下區塊鏈新技術領域爲數很少值得深刻研究和實戰的研究方向。現代密碼學與價值網絡相輔相成,前者給予後者「上帝保障」,後者給予前者「偉大戰場」。
比原鏈研究院 劉秋杉