Ecdsa

secp256k1 lib 編譯問題“無效使用不完整類型 secp256k1_context”

  • February 28, 2022

我做了一個小測試程式碼(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_createsecp256k1_context_destroy,正如 Mark H 在評論中提到的那樣)。沒有辦法訪問內部。

您不嘗試這樣做是對的#include <secp256k1.c>……除了不太可能建構並要求您捆綁整個庫的副本之外,它還會將庫的內部暴露給您的程式碼,直接使用不安全。

對於您正在做的事情(用啟用 OCL 的版本替換內部簽名功能),您最好分叉庫並直接編輯原始碼。這並不比您嘗試做的更具侵入性,它可以讓您使用現有的單元測試和 valgrind ctime 測試來檢查您的工作。

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