Segregated-Witness
使用 rust-bitcoin 簽署 segwit 輸入時,您如何承諾先前輸出的數量?
我正在嘗試用 rust-bitcoin 簽署隔離見證交易。首先,我的事務設置如下所示:
let previous_output = OutPoint::new(Txid::from_hex("991ab2b13f6bc6c13002d79d5e9775626a5e7328e14cd16837d50d1cc637dc6a").unwrap(), 0); let tx_input = TxIn { previous_output, script_sig: Default::default(), sequence: 0xffffffff, witness: Default::default() }; let tx_output = TxOut { value: 4999995000, script_pubkey: output_details.script_pubkey() // don't worry about this }; let mut transaction = Transaction { version: 2, lock_time: 0, input: vec![tx_input], output: vec![tx_output] };
為了簽署交易(順便說一下,使用 Schnorr),我提取了 sighash,如下所示:
let signature_hash = transaction.signature_hash(0, &output_details.script_pubkey(), 0); // is that really the most idiomatic way of passing a sighash flag in rust-bitcoin? let message = Message::from_slice(&signature_hash.to_vec()).unwrap();
當我列印 hex-serialized
message
時,我得到以下值:fa42b9b0f54972b31712b2efbc86db1bf78aa833bc9c969ea7860ef38a25fbaf
.但是,為了簽署隔離見證交易,還必須承諾先前輸出的金額,而我沒有看到這樣做的方法。據我所知,我應該簽署的 sighash 實際上是
61746ec9baa14bbe82586c7f149926b1492871c67dc7fe21e7cfe2f2260a1405
.最後,雖然不太相關,但如果一切正常,我的簽名過程將如何結束:
let signature = private_key.sign_schnorr(message); let signature_vec = signature.as_ref().to_vec(); transaction.input[0].witness = Witness::from_vec(vec![signature_vec]);
提前感謝您幫助我解決這個問題!
有一個
bitcoin::util::sighash
模組包含所有令人嘆為觀止的東西。我不確定這是不是正確的方法,但它絕對是一種獲得你想要的結果的方法。看起來您必須創建一個
SighashCache
對象,然後您可以使用它來獲取交易的所有不同類型的 sighashes。在您的情況下,此程式碼可能會使其工作:
let previous_output_as_tx_out = TxOut { value: 50_0000_0000, script_pubkey: output_details.script_pubkey() }; let prevouts = vec![previous_output_as_tx_out]; let mut sighash_cache = bitcoin::util::sighash::SighashCache::new(&transaction); let input_index = 0; // taproot_key_spend_signature_hash is the crucial part let signature_hash = sighash_cache.taproot_key_spend_signature_hash(input_index, &Prevouts::All(&prevouts), SchnorrSighashType::Default).unwrap(); let message = Message::from_slice(&signature_hash.to_vec()).unwrap();