編者注:本文主要內容來自墨客區塊鏈CEO陳小虎。
BLS (Boneh-Lynn-Shacham)簽名演算法是一種可以實作簽名聚合和密鑰聚合的演算法,它可以把一筆交易中的所有簽名和公鑰合并成單個簽名和公鑰,且合并程序不可見(無從追溯這個簽名或公鑰是否通過合并而來)。
原創說明:
BLS簽名在英文檔案介紹的比較多,但是很多講得并不清楚,通常需要查看原有的論文,對應后學習,對一般的程式員要求比較高。這里整理了一下本人在學習bls簽名程序中的詳細推導程序,自認為比較容易理解一些。跟大家共享一下,也是為墨客的亂數子鏈做一些技術層次的科普鋪墊。在閱讀本文的內容前,讀者可以先簡單復習一下常見的橢圓曲線公私鑰生成演算法,用來對比BLS,會有助于理解本文的內容。
1.基本原理
先簡單介紹一下BLS簽名。BLS的簽名采用曲線對的方式可以驗證兩個(或者同一個)曲線上的點對符合乘法交換律:
e(P, Q) → n
e(x×P, Q) = e(P, x×Q)
在BN曲線上面可以表示成:

(source:https://medium.com/cryptoadvance/bls-signatures-better-than-schnorr-5a7fe30ea716)
與傳統的橢圓曲線不同,BLS的創新點在于讓hash H(m)也能夠對應于BN曲線上的一個點。這個映射空間大致是2:1的關系,可以很容易的處理。實作細節不重要,就當個結論記一下。另外,簡單起見,本文里面提到的BLS簽名和閾值簽名不做區分。
閾值簽名(threshhold sig)本質是m-of-n的簽名方式,在知道m個簽名的條件下,可以合成唯一一個合法的簽名。任意m個簽名片段的組合都是同一個可驗證的簽名。而且,由于每個人只有一個私鑰片段,需要m個私鑰片段組合在一起才能形成一個合法的完整的私鑰。如果少于m個私鑰片段在網路中共享的話,就不會有任何一個個人知道這個完整的私鑰。
這里最基本的數學原理其實很簡單,就是利用m個變數的多項式方程在m個條件下可解。如果系統中有n>m個條件,任意m個條件都可以得出一個唯一確定的解。當然,如果小于m個條件就不可解。
2.主要流程
這里首先涉及到一個可驗證私鑰片段分發的問題(VSS)。每個節點獨立產生自己的私鑰片段,然后將可驗證的公鑰廣播出去,以及系統中其他節點需要驗證本地節點的可靠性的資訊。這個公/私鑰片段分發驗證的程序在初始化階段做一次即可(除非節點數變化,則再需要分發一次)。這個流程如下:
2.1 每個節點生成一組私鑰r0, r1, …, rm-1 r = a, b, c, d, … 這些私鑰是一個m階多項式的引數



3.應用示例
有了這個基礎,我們就可以實作第一個應用。
應用1:創建一個聚合私鑰(m-of-n),每個人有自己的私鑰片段,只有在收集>m個私鑰片段后,才可以得到全域私鑰,來對全域公鑰對應的錢包地址的操作進行簽名。這個可以用來配置一些需要多方控制的錢包。
但是這里有個問題,因為在使用的時候,需要m個私鑰片段的合成。這個程序可能會導致m個片段為公眾知道,所以,這樣的應用實用性不強,因為一旦大于m個私鑰片段公布在網路中,任何一個人就可以算出來全域私鑰,那么辛辛苦苦經歷步驟1-6的程序只能使用一次,代價太大了。
這里,就需要用到BLS簽名的長處了。具體的做法是,節點不應該公布共享私鑰資訊,而只是公布簽名資訊。這樣,共享私鑰可以一直使用,每個人可以驗證簽名的有效性。而全域私鑰卻沒有人能夠知道。這個就是threshold 簽名。
具體的做法如下:
(1)對于一個資訊s,先計算出其hash在曲線上的映射H(s),參見文章開頭的插圖

由:


由此,我們可以實作第二個應用。
應用2:創建一個亂數區塊鏈,區塊鏈的每個共識節點通過初始化實作VSS,每個節點有自己的私鑰片段。然后每個節點對某個資訊(交易集合,或者預定義資訊)進行簽名。節點在收集>m個簽名片段后,就可以合成全域簽名。這個簽名可以很容易通過全面公鑰來驗證。在這個程序中,全域私鑰沒有任何人知道,但是這個簽名的結果是多個節點認可的結果。如果以這個全域簽名作為亂數源,這個亂數就是一個共識的結果,而且無法被單個人篡改。而且,這個是可以持續安全地產生亂數,只要每輪給出不同的資訊來簽名。
但是這里有個問題,如果每個節點公布簽名片段的話,資訊量是O(n2),有沒有更好的方案,請關注后續文章。
————————————————
著作權宣告:本文為CSDN博主「Li_Yu_Qing」的原創文章
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/30121.html
標籤:區塊鏈技術
