Secp256k1

libsecp256k1 中的上下文是什麼?

  • May 21, 2019

我正在嘗試製作一個用於教育目的的錢包,並想直接使用 libsecp256k1。除了創建一個上下文並在呼叫中使用它之外,到目前為止我可能學到的只是你通常應該只創建一個上下文,但我什至不完全確定這是真的。

不知道為什麼,或者關於上下文的任何事情,我想知道它到底是什麼,它是如何使用的,以及應該如何使用它?

作為庫文件的程式碼註釋解釋了它的作用:

/** Opaque data structure that holds context information (precomputed tables etc.).
*
*  The purpose of context structures is to cache large precomputed data tables
*  that are expensive to construct, and also to maintain the randomization data
*  for blinding.
*
*  Do not create a new context object for each operation, as construction is
*  far slower than all other API calls (~100 times slower than an ECDSA
*  verification).
*
*  A constructed context can safely be used from multiple threads
*  simultaneously, but API call that take a non-const pointer to a context
*  need exclusive access to it. In particular this is the case for
*  secp256k1_context_destroy and secp256k1_context_randomize.
*
*  Regarding randomization, either do it once at creation time (in which case
*  you do not need any locking for the other calls), or use a read-write lock.
*/
typedef struct secp256k1_context_struct secp256k1_context;

libsecp256k1 不是物件導向的庫,也不能儲存各種有用的狀態。因此上下文對象允許保留有用的狀態。

您通常應該只創建一個,因為它生成和儲存的東西計算起來相對昂貴。要使用上下文,只需創建一個支持您要使用該secp256k1_context_create函式執行的操作的新上下文。您傳入SECP256K1_CONTEXT_VERIFY, SECP256K1_CONTEXT_SIGN,SECP256K1_CONTEXT_NONE標誌的按位或運算,這些標誌表示您想要做的事情的類型。

例如,如果您想創建一個將在簽名函式中使用的上下文,您將創建一個包含以下內容的上下文:

secp256k1_context* secp256k1_context_create(SECP256K1_CONTEXT_SIGN);

如果您想要一個可用於簽名和驗證的工具,您可以:

secp256k1_context* secp256k1_context_create(SECP256K1_CONTEXT_SIGN | SECP256K1_CONTEXT_VERIFY);

您只需將生成的上下文用作任何需要它的函式的上下文參數。

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