Ecdsa
secp256k1 lib 編譯問題“無效使用不完整類型 secp256k1_context”
我做了一個小測試程式碼(test.cpp),嘗試顯示我遇到的問題:編譯使用
g++ -o 測試 test.cpp -lsecp256k1
#include <stdio.h> #include "secp256k1.h" static secp256k1_context_t *ctx = NULL; int main(int argc, char **argv) { ctx = secp256k1_context_create(SECP256K1_CONTEXT_VERIFY | SECP256K1_CONTEXT_SIGN); printf("Context created!\n"); secp256k1_context_t *ctx_clone; ctx_clone = secp256k1_context_clone(ctx); printf("Context cloned!\n"); /* if enable below two lines of code the compliling error will happen */ // secp256k1_ecmult_context_t* clone_ecm_ctx; // secp256k1_ecmult_context_clone(clone_ecm_ctx, &ctx->ecmult_ctx); secp256k1_context_destroy(ctx_clone); secp256k1_context_destroy(ctx); printf("Context destroyed!\n"); return 0; }
如果沒有兩個註釋程式碼,我不會有問題。如果有兩個註釋程式碼,編譯器將報告:
test.cpp:15:51: error: invalid use of incomplete type 'secp256k1_context_t {aka struct secp256k1_context_struct}' secp256k1_ecmult_context_clone(clone_ecm_ctx, &ctx->ecmult_ctx); ^~ In file included from test.cpp:2:0: /usr/local/include/secp256k1.h:50:16: note: forward declaration of 'secp256k1_context_t {aka struct secp256k1_context_struct}' typedef struct secp256k1_context_struct secp256k1_context_t; ^~~~~~~~~~~~~~~~~~~~~~~~
看起來我無法操作上下文結構內部成員(因為結構不透明),但是,我的程式碼確實需要訪問上下文結構內部的結構,對於 exp,下面的程式碼將觸發類似的編譯錯誤:
secp256k1_ecdsa_sig_verify(&ctx->ecmult_ctx, &r1, &s1, &q, &m)
有什麼解決方法嗎?
這個錯誤的原因是它
secp256k1_context
是一個不透明的類型。這意味著您不能在堆棧上創建它;您需要使用 API 中的函式創建一個堆分配版本(並銷毀它)(特別是secp256k1_context_create
和secp256k1_context_destroy
,正如 Mark H 在評論中提到的那樣)。沒有辦法訪問內部。您不嘗試這樣做是對的
#include <secp256k1.c>
……除了不太可能建構並要求您捆綁整個庫的副本之外,它還會將庫的內部暴露給您的程式碼,直接使用不安全。對於您正在做的事情(用啟用 OCL 的版本替換內部簽名功能),您最好分叉庫並直接編輯原始碼。這並不比您嘗試做的更具侵入性,它可以讓您使用現有的單元測試和 valgrind ctime 測試來檢查您的工作。