Api

secp256k1 API 是如何定義的?它在哪些方面受到限制?

  • February 3, 2022

我熟悉專有 API,第三方決定哪些數據和功能可供開發人員與其伺服器通信。

但是,secp256k1 是一個完全可訪問/可呼叫且可以分叉的開源密碼庫。在這種情況下,secp256k1 API 是什麼?它以什麼方式限制功能?

在這個GitHub 評論中,建議人們早在 2015 年就“嘗試使用庫呼叫隨機內部函式。現在應該更難做到”。為什麼不鼓勵這樣做,為什麼現在更難做到?

2022 年 2 月 2 日,公關評論俱樂部就 secp256k1使用範例對此進行了討論。感謝回答此問題的個人(glozow、lightlike、sipa、robot-dreams 等)。我沒有做任何實質性的改變,但任何錯誤都是我自己的。

未在標頭檔中公開的函式對潛在呼叫者不可見。該 repo 是開源的,因此可以在標頭檔中添加附加功能進行分叉,但是您必須維護分叉並且升級將是一件痛苦的事情(上游沒有人會關心保持內部函式介面的穩定)。

然而,僅僅在標頭檔中添加一個函式是不夠的。如果您將函式添加到標頭而不修改庫以提供和導出此類函式,則建構將在連結時失敗。標頭告訴呼叫者如何呼叫導出的庫函式。如果標頭和導出的庫函式不匹配,您將收到錯誤消息。您還需要修改庫以導出這些函式。

這樣做是否可取取決於案例、開發人員的能力以及維護 repo 分支的意願。一般來說,除非您知道自己在做什麼,否則建議您不要“滾動自己的加密貨幣”。變化越大,陷阱就越多。

Bitcoin Core repo 以各種方式使用 secp256k1 API。對於 ECDSA,呼叫者將消息散列提供給 libsecp256k1 並簽名/驗證。對於 BIP 340 (Schnorr),呼叫者提供消息,libsecp256k1 進行散列。

libsecp256k1 只有一個非常簡單的未優化的 SHA256 雜湊函式實現,因此它可以執行 RFC6979。已經討論過允許呼叫者向庫提供他們自己的 SHA256 實現,或者添加一個新的 API 函式,該函式接受未散列的消息並返回散列。然而,比特幣使用雙重 SHA256 來獲取消息雜湊,因此這要麼與比特幣對 ECDSA 的使用不匹配,要麼仍然需要呼叫者執行兩個雜湊步驟之一(或者不是標準的)。

引用自:https://bitcoin.stackexchange.com/questions/112223