Secp256k1
libsecp256k1 中的上下文是什麼?
我正在嘗試製作一個用於教育目的的錢包,並想直接使用 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);
您只需將生成的上下文用作任何需要它的函式的上下文參數。