YOUChain(有鏈)公鏈 開源項目介紹——go-bls

本文介紹YOUChain 加密簽名方面的思考和方案,go-bls 庫已於 github 開源,項目地址:[https://github.com/youchainhq/go-bls]

YOUChain 簽名方案的考慮

1 面臨的問題

YOUChain所採用的共識機制,是基於VRF的一種新型PoS共識。對基於PoS的共識,基本上都存在一個對區塊做簽名投票的機制,所有這些投票信息,都需要存儲及隨區塊廣播。

考慮一個採用secp256k1簽名方案的例子,這時單個簽名的大小是 64 字節,如果有100個賬戶給一個區塊投票,則僅簽名數據就至少62.5KB。這個數據量必須得認真對待。

關於此問題,我們需要考慮,能否減少(壓縮)一個區塊的簽名投票數據,以減輕存儲及網絡通信負擔?

對多個簽名進行壓縮的技術,已知的包括閾值簽名(Threshold signature, 也有翻譯叫“門限簽名”)方案和BLS簽名方案。其中閾值簽名方案需要有一個複雜的初始化過程,並且要求參與者集合穩定(若參與者集合發生變更,則必須重新進行一輪全局初始化),這對於YOUChain這種最終將完全去中心化的公鏈來說,是無法接受的。BLS簽名方案也是實現簽名聚合的一種主要技術,而這也是我們重點評估並考慮採用的技術。

2 BLS簡介

BLS簽名方案是由Boneh-Lynn-Shacham三人於2001年提出的一種橢圓曲線簽名方案,具有一些良好的特性,最重要的就是“簽名聚合”:多個簽名可以聚合成單個簽名,聚合後的簽名長度就是單個簽名的長度。基於這些特性,BLS簽名方案在多籤及簽名聚合、m/n多籤等方面都能提供很好的支持。

2.1 BLS的基本原理

BLS簽名的核心,是橢圓雙曲線配對(Elliptic curve pairings)函數,也稱雙線性映射(bilinear maps)函數。要了解BLS的基本原理,重點是理解配對函數的性質。首先,我們需要一下基本知識:

1.橢圓曲線密碼學定義了兩個運算:曲線上兩個點的加法運算 +,以及一個整數與曲線上的一個點進行的標量稱法運算 ,其具體定義當前不需深究,只需要記住這些運算的結果也是曲線上的點。
2.橢圓曲線有一個"生成點" G, G 做 n 次加法運算後可得到橢圓曲線上(除無窮點,也即零點 之外)的所有點,n稱爲橢圓曲線的階。
3.定義一個無窮點O,算術上等價於0,即 P+O=P;
4.當 d 足夠大時,知道橢圓曲線上的兩個點 P,Q 其中 Q = d
P,求d困難,這就是橢圓曲線上的離散對數問題。

定義配對函數e(P,Q),如果函數滿足以下性質,則e(P,Q)就是一個雙線性映射函數(其中大寫字母表示曲線上的點,小寫字母除了e爲函數標識外,均爲標量):

1.e(P, Q + R) = e(P, Q) * e(P, R)
2.e(P + S, Q) = e(P, Q) * e(S, Q)
3.e(aP,bQ) = e(P,Q)^ab

也就是,配對函數對曲線上的運算滿足交換律、結合律、分配率以及上面第3條性質。

在配對函數的基礎上,令私鑰爲一個私密的整數 k, 則公鑰爲 P=kG,對消息 m ,將其映射爲曲線上的一個點,記爲 H,則簽名 S=kH

簽名的驗證過程,即驗證 e(P,H)=e(G,S) 是否成立。

證明爲:

e(P, H)= e(kG, H)= e(G, kH) = e(G, S)

對於簽名的聚合,假設聚合簽名 S=S1+S2+…+S100,其中每個子簽名都是不同 祕鑰對 對同一個消息的簽名(分別對不同消息簽名也是可以的,那樣驗證時需要知道每個公鑰對應的消息)。

則對聚合簽名的驗證爲 e(G,S)=e(P1,H)e(P2,H)…*e(P100,H)
根據簽名配對函數的性質,上述等式不難證明。

2.2 pairing-friendly curves
前述的雙線性映射函數,並不是在所有的橢圓雙曲線上都能實現。對於能實現雙線性映射的橢圓曲線,稱爲 pairing-friendly curves 。關於這些曲線,IETF在今年初(Jan 2019)開始提出標準草案,當前是第三版 version-02 版。跟蹤地址:ietf: draft-yonezawa-pairing-friendly-curves。根據標準草案,能實現雙線性配對的曲線主要有兩類:

Barreto-Naehrig curve, 2005年提出,簡稱 BN curve。
Barreto-Lynn-Scott Curve,2002年提出,簡稱 BLS curve。(BLS簽名和BLS曲線,作者不盡相同:L是同一個即Lynn,B分別是Boneh和Barreto,S分別是Shacham和Scott)
一些項目使用的曲線及其安全性見下表(其中,標 * 的表示不能完全達到標題所示的安全性。):

在這裏插入圖片描述

目前比較多的BLS實現是基於Barreto-Naehrig curve的,即上表中 BN 開頭的曲線。這些曲線的安全性目前打了些折扣。比如,BN256 (簽名長度是256 bits),原來預期是能達到 128 bit的安全性,但是在2016年的時候,Kim 和 Barhulescu提出了一種新算法:the extended tower number field sieve (exTNFS),大幅降低了解決FFDLP(有限域離散對數問題)的複雜度,使得 BN256 所提供的安全性從預計的128 bits降低到了大約 100 bits。見上表。參考 https://crypto.stackexchange.com/questions/22835/are-barreto-naehrig-curves-suitable-for-pairing-based-cryptographyhttps://moderncrypto.org/mail-archive/curves/2016/000740.html
BLS一族的曲線,其安全性可能跟實現細節有關,上表中標 * 的BLS12-381,其安全性大概是 117~120 bits。

2.3 BLS簽名標準草案

2.3.1 簡介
IETF於今年初(Feb 2019)開始提出BLS簽名標準草案。該標準草案的其中一個作者就是Dan Boneh。

根據標準草案,BLS實現上有兩種策略(不同的側重點):

最小化簽名大小。簽名放在G1中,公鑰放在G2中,G1/E1的表達更緊湊。
最小化公鑰大小。就是簡單的換一下,將公鑰放在G1中,將簽名放在G2中。如果涉及大量的公鑰傳輸,可以考慮這種策略。
相同的實現,將兩條曲線對換一下,就成第二種策略了。

2.3.2 實現現狀

標準草案介紹了BLS簽名當前的實現現狀(只介紹了基於 BLS12-381 的實現,因爲BN256安全性不夠):

Algorandhttps://github.com/algorand/bls_sigs_ref
Chia規格說明C++/Python實現源碼。採用的是最小化公鑰的策略,好像未包含成員檢查(成員檢查即檢查公鑰或簽名是否在相應的有限羣G1或G2內)。數據映射到曲線上(hashing to curve)使用的方案叫 Fouque-Tibouchi,可以在常量時間完成(這對於防止旁道攻擊 side channel attacks 是非常必要的)。
Dfinitygo封裝版,基於BN Curve, C++實現,實驗室項目。C++實現是從herumi/bls fork的。好像未包含成員檢查。(go封裝版不支持G1、G2調換)。
Ethereum 2.0:只有規格說明沒有實現。規格說明中提到這不是確定稿,會隨着BLS標準的情況作出修改。並提到規格中的hash_to_G2函數是不安全的。
根據我們的比較研究,目前值得我們重點考慮的項目,一個是Algorand的項目,另一個是:https://github.com/phoreproject/bls

3 YOUChain 中的考慮
BLS簽名方案,雖然有簽名聚合的優點,但目前也還存在以下兩個主要約束:

目前BLS的技術實現還不是很成熟,其安全性還沒有得到嚴格驗證;
目前雙線性映射函數的性能較差,相比主流的一些橢圓曲線簽名方案,其性能劣勢非常顯著(如相比 secp256k1 ,性能差距在兩個數量級以上)。

綜合考慮,YOUChain將重點考慮以下應用方案:

用戶賬戶體系,採用成熟穩定、高性能的 secp256k1 簽名方案;
在共識過程中,區塊投票的簽名,採用BLS簽名方案,在區塊形成共識後,將投票者的簽名進行聚合。
通過上述方案,將能更好地實現賬戶安全以及投票的簽名數據量之間的更好平衡。

4 參考&引文

BLS簽名方案:https://www.iacr.org/archive/asiacrypt2001/22480516.pdf
Compact Multi-Signatures for Smaller Blockchains :https://eprint.iacr.org/2018/483.pdf
https://medium.com/cryptoadvance/bls-signatures-better-than-schnorr-5a7fe30ea716
https://medium.com/@VitalikButerin/exploring-elliptic-curve-pairings-c73c1864e627
ietf: draft-yonezawa-pairing-friendly-curves:https://datatracker.ietf.org/doc/draft-yonezawa-pairing-friendly-curves/
IETF BLS標準草案: https://datatracker.ietf.org/doc/draft-irtf-cfrg-bls-signature/
https://crypto.stackexchange.com/questions/22835/are-barreto-naehrig-curves-suitable-for-pairing-based-cryptography
https://moderncrypto.org/mail-archive/curves/2016/000740.html
https://github.com/algorand/bls_sigs_ref
https://github.com/Chia-Network/bls-signatures/blob/master/SPEC.md
https://github.com/Chia-Network/bls-signatures
https://github.com/dfinity/go-dfinity-crypto
https://github.com/dfinity-lab/bls-tmp
https://github.com/ethereum/eth2.0-specs/blob/master/specs/bls_signature.md
https://github.com/phoreproject/bls

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