Signature
面對使用 C 庫生成事務簽名的問題
我正在嘗試使用用 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 測試網路。現在工作正常。