正常的 ECDSA 驗證是否比基於公鑰恢復的驗證方法慢?
背景資料:
這篇關於密碼學堆棧交換的文章展示瞭如何從簽名、簽名數據的雜湊和曲線知識中幾乎唯一地恢復公鑰:https ://crypto.stackexchange.com/questions/18105/how-does-從 ecdsa-signature-work 中恢復公鑰。我相信它基本上會產生兩個公鑰,給出的簽名將驗證散列。
主要問題:
給定一個公鑰
Q
、一個簽名S
和一些數據的雜湊值H
,似乎有兩種方法可以驗證這個三元組是否有效。
- 我們可以執行通常的 ECDSA 驗證常式,這有點費時。
S
我們可以使用 ( , , Curve)執行公鑰恢復,H
並驗證 2 個可能返回的公鑰之一(實際上是 4 個,因為每個都可以壓縮/解壓縮)是點Q
。我不確定這是否需要更多/更少的時間密集型。所以,
- 通過公鑰恢復進行的驗證是否比通常的 ECDSA 驗證更耗時或更短?
- 如果更少,那麼比特幣不能通過公鑰恢復來完成所有的ECDSA驗證並節省時間嗎?當然,檢查 pubkey-hash 將涉及獲取每個候選公鑰,OP_HASH160 對其進行散列並查看它是否出現在地址的正確 20 個字節中。如果 4 種可能性中的任何一種都沒有雜湊到正確的值,則簽名驗證失敗。
我問這個的唯一原因是 ECDSA 驗證很慢,我在某處讀到公鑰恢復非常快,所以只是想看看是否有人對此有任何見解。
帶有公鑰恢復的驗證永遠不會比正常驗證快,但它只會稍微慢一點。我不久前對其進行了基準測試,PubKey 恢復增加了大約 5% 的成本。
更改 txn 格式需要硬分叉,因此不太可能發生這種情況,但 pubkey 恢復的優勢在於它以儲存換取時間。這可能對比特幣有用,因為處理器能力不是 WAN 頻寬的瓶頸,尤其是在住宅“最後一英里”場景中。
一個典型的 2 進 2 出 P2PkH 事務是 373 字節(壓縮密鑰)和 437 字節(未壓縮密鑰)。沒有公鑰的相同事務將是 309 字節,導致儲存(頻寬和記憶體)減少 17% 到 29%,以換取 CPU 時間增加 5%。
散列非常快,因此執行 4 個散列與 1 個散列可以忽略不計,但單個字節可以消除該成本。該協議將要求使用帶有簽名的標誌來指示在恢復 PubKey 時使用哪種形式。
0x02 = compressed even 0x03 = compressed odd 0x04 = uncompressed even 0x05 = uncompressed odd
這實際上只會在 P2PkH 交易中節省大量空間。對於 P2SH(即多重簽名),腳本很可能包含完整的 pubkeys 而不是 keyhashes。
雖然最初使用 PubKey 恢復是有道理的,但在需要硬分叉方面的成本並不能使這種改變非常可行。如果將硬分叉放在桌面上,那麼可以做很多更有趣的事情。例如,從 ECDSA 切換到 Schnorr 簽名將允許本地門檻值簽名。這會將每個輸入的簽名數量從一個(或多個在多重簽名的情況下)減少到每個交易僅一個。每個真正加起來的 64 個字節。