Transactions

Signmessagewithprivkey 結果與 txinwitness 不同

  • January 21, 2020

我正在研究 segwit,並且正在 regtest 中做一些實驗。我用 P2SH 地址創建了一個原始交易。

我沒有簽名的交易數據是:

0200000001faf19017fe7e20747535ac41009922e4beb76e17a7fd5423bc60e75fbc8381c40000000000ffffffff01606b042a0100000017a914b63007b51b936175644dcf654f77c528e35f01178700000000

這是我要簽名的消息,而不是使用signrawtransactionwithkey我嘗試使用signmessagewithprivkey的簽名,我希望我可以在 txwitness 欄位(第一行)中找到簽名。

signmessagewithprivkey 返回 base64 簽名,然後我將其轉換為十六進制。結果是:

20db4febb769c43c9072daf30934a345b2327b6107e701f21c7fe052a040180d4129dc3079dc7dad29db37c31fa6401013819e386beb9396e330b3b6e9f7fbcf5b

signrawtransactionwithkey 返回:

"txinwitness": [
     "3044022077f49ad0371ea5baf0ce60d3d15175c9bb5e37ff7f3bc023b76863b2a91d379e022073010deba5eef8619745cd79d94a73c4a4527391253731104fc734449322d85b01",            "02985586bf43d26229a97092f76086cfe6f9bf09d93bef16a92f65185c8f7f0b17"
     ],

我想知道,為什麼 signmessagewithprivkey 的結果一開始不等於 txwitness 的原始結果?

從橢圓曲線密碼學的角度來看,您簽署的所有內容都是“消息”,但比特幣上下文中的“消息”一詞是指使用者想要用他的密鑰簽名的隨機字元串(通常用於所有權證明或類似的東西)。

這意味著當您使用sign*message*withprivkey程式碼時,會將輸入解釋為字元串,並使用生成完全不同的摘要 ( "some_fixed_string" + UTF8.Decode("0200000001f...")) 的不同方法對其進行簽名。但是,當您使用sign*rawtransaction*withkey程式碼時,會將給定的字元串解釋為交易,並根據其輸入腳本使用不同的方法對其進行簽名("Transaction.Decode("0200000001f...")然後Serialize()基於BIP143用於 SegWit)。

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