當 Schnorr 簽名成為比特幣的一部分時,是否可以僅通過一次簽名驗證來驗證每個區塊?
在最近的一次演講中,Pieter Wuille談到了在使用 Schnorr 簽名和驗證多個簽名的各種算法時加快驗證速度。
真的可以通過聚合所有交易的密鑰和簽名來驗證一個區塊嗎?(理論上,在多個區塊上的交易更多)
我認為這確實意味著不再使用舊的 ECDSA 方案。如果我們向後兼容,我們可能只能對使用 Schorr 簽名的交易執行此操作,而其他交易必須一一驗證。
(撇開協議劇烈變化的政治不談)如果我們採用塊頭來包含該塊的一個聚合 Schnorre 簽名並省略該塊中單個交易的所有 schnorr 簽名,難道我們不能節省更多空間嗎?
我錯過了什麼嗎?談話沒有提供太多細節,只是提到了這個想法。
是的,每個區塊一個驗證,但不是每個區塊一個簽名。
為了消除混淆,這裡涉及 3 種不同的技術:
- (1)非互動式聚合是第三方(不持有任何私鑰)將多個簽名組合成一個簽名的能力,每個簽名都有自己的消息和公鑰,可以由無所不知的人驗證消息和公鑰。
- (2)互動聚合是一樣的,但是簽名者需要知道聚合的時候,並且相互通信來共同產生一個單一的簽名。
- (3)批量驗證是驗證者驗證多個(公鑰、消息、簽名)元組是否都有效的能力,比驗證單個簽名更快。如果一個或多個元組無效,驗證者將不會知道哪些元組,在這種情況下。
Schnorr 簽名(以及任何其他已知的基於離散對數的簽名方案)支持 (2) 和 (3),但不支持 (1)。
缺少 (1) 意味著整個區塊 (*) 不能有一個簽名,因為建構區塊的礦工是不參與簽名創建的第三方。
由於 (2),我們所能期望的最好結果(只要我們僅限於基於 DL 的簽名)就是每筆交易一個簽名。即使這樣也需要交叉輸入聚合,它的複雜性不僅僅是實現鏈上 Schnorr 簽名(例如,參見這篇文章)。
但是,由於(3),每個塊可以有一個驗證是正確的,但每個塊不能有一個簽名。事實上,通過批量驗證實現的加速確實變得不平凡。4 行中的每一行都是一種優化技術,目前在 libsecp256k1 中實現,它將根據問題的大小和記憶體限制選擇最好的。
(*) 基於 DL 的簽名存在一種非互動式“半聚合”形式,其中 N 個簽名可以非互動地組合成一個大小為 (1+N)/2 個原始簽名的單個簽名。這可以用於塊,儘管收益不是很大,而且塊範圍聚合的複雜性使其不那麼有趣。