Segregated-Witness

使用 rust-bitcoin 簽署 segwit 輸入時,您如何承諾先前輸出的數量?

  • June 21, 2022

我正在嘗試用 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-serializedmessage時,我得到以下值: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();

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