Signature

面對使用 C 庫生成事務簽名的問題

  • October 9, 2018

我正在嘗試使用用 C 實現的 ECDSA 庫為原始交易生成簽名。

以下是交易參數:

const txParams = {
   "nonce": "0x05",
   "gasPrice": "0x0ba43b7400",
   "gasLimit": "0x5208",
   "to": "0x9fbad6ab4b240d7512f863753ad3449f9ad6a530",
   "value": "0x0de0b6b3a7640000",
   "data": "0x",
   "chainId": 4
}

然後我生成交易參數的 RLP 編碼 Keccak256 散列。以下是 RLP 雜湊:

ad7de070ee104a433e37298f70feb6af08da26287efff6af2b25bbf64a56b70b

到這里為止的所有步驟都是使用ethereumjs-tx庫完成的。

在 C 程序中,我將 RLP 雜湊轉換為字節格式並儲存在字節數組中。

static uint8_t m_hash[] =
{
 0xad,0x7d,0xe0,0x70,0xee,0x10,0x4a,0x43,
 0x3e,0x37,0x29,0x8f,0x70,0xfe,0xb6,0xaf,
 0x08,0xda,0x26,0x28,0x7e,0xff,0xf6,0xaf,
 0x2b,0x25,0xbb,0xf6,0x4a,0x56,0xb7,0x0b
};

然後使用私鑰對其進行簽名。

每次我執行程序時,輸出簽名總是不同的,下面是一些範例。

29C1C06C3E60D5BD51F9F803AEE5193ACABFFD6B45FAC48C7DDE737427FB7F2C643B35FABB633E6A6B6ABC52F7907D245457ECAE5F2372D3D6A85BC2B68A4DF0

64FE2A3AF423642EFC989BAD1503CEA2637FC5543963E64F95A0644942D96EF5663267511DB6A8853E666F1877ACEAC86470DF8A710D844177E66DE4A158F0EA

B3C2DA2C5800FE4773BECF5A0690041483AB6C551A8DE6CCB84FD07EDD09857B3B2AAFA0BA268A4B7178B260C8A79BC86EFF60A55D60EFD11247632A9AB11382

然後我使用ethereumjs-util的 sign 函式來解析這個簽名並將其編碼為 v、r、s 值。

為了計算 v,我嘗試了 0 - 3 範圍內的不同恢復 id 值,我直接在ethereumjs-util的符號函式中輸入,如下所示。

exports.ecsign = function (msgHash, privateKey) {

 // -------------------------------------------------
 // Original Implementation

 // var sig = secp256k1.sign(msgHash, privateKey);

 // --------------------------------------------------


 // --------------------------------------------------
 // My changes

 var sig = {
   signature: "",
   recovery: 0
 }

 var signature = "29C1C06C3E60D5BD51F9F803AEE5193ACABFFD6B45FAC48C7DDE737427FB7F2C643B35FABB633E6A6B6ABC52F7907D245457ECAE5F2372D3D6A85BC2B68A4DF0"

 sig.signature = Buffer.from(signature, 'hex');

 // --------------------------------------------------

 var ret = {};
 ret.r = sig.signature.slice(0, 32);
 ret.s = sig.signature.slice(32, 64);
 ret.v = sig.recovery + 27;
 return ret;
};

這將返回簽名的交易,然後我將其序列化並嘗試廣播到乙太坊區塊鏈

0xf86c05850ba43b7400825208949fbad6ab4b240d7512f863753ad3449f9ad6a530880de0b6b3a7640000802ca029c1c06c3e60d5bd51f9f803aee5193acabffd6b45fac48c7dde737427fb7f2ca0643b35fabb633e6a6b6abc52f7907d245457ecae5f2372d3d6a85bc2b68a4df0

此時我收到一條錯誤消息,指出“發件人無效”。

有人可以幫我解決我在這裡做錯的事情嗎?

抱歉,我試圖將交易發佈到主網路,而不是 Rinkeby 測試網路。現在工作正常。

引用自:https://ethereum.stackexchange.com/questions/60234