Transactions
Signmessagewithprivkey 結果與 txinwitness 不同
我正在研究 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)。