Bitcoin: How do you complete a PSBT when the final signature is provided by a HWW?

Here is an article on how to finalize PSBT (Proof of Stake Bulletproofs) when the final signature is provided by a hardware wallet (HWW):


Finalizing PSBT with HWW Signature

When using the API of a hardware wallet device such as Ledger or Trezor, you may encounter situations where the final signature has not yet been provided. However, it is important to note that these devices usually provide the required signature upon successful initialization.

To finalize PSBT (Proof of Stake Bulletproofs) after receiving an HWW signature, follow these steps:








Bitcoin: How do you finalize a PSBT when the last signature is provided by a HWW?

Step 1: Obtain the HWW Signature

The first step is to obtain the HWW signature from your hardware wallet. This can be done using the sign_tx method provided by the device API, as mentioned in the question.

use psbt::prelude::*;

// Suppose you have a Ledger device and a Trezor device with the same API.

let hww = LedgerDevice::new("path/to/ledger").unwrap();

hww.sign_tx(psbt::Tx::NewTransaction(

psbt::Amount::Zero(),

psbt::Target,

psbt::Hash,

psbt::ProofOfStake::Unconfirmed,

));


Step 2: Create the finalized PSBT

Once you have the HWW signature, you can create the finalized PSBT using the `finalize'' method provided by the device API.

// Suppose you have a Ledger device and a Trezor device with the same API.

let psbt = finalize(

hww.hww_signature,

psbt::Amount::Zero(),

psbt::Target,

psbt::Hash,

);


Step 3: Sign the finalized PSBT (optional)

If you want to sign the finalized PSBT using a different HWW, use the sign_tx` method again.

// Assume you have another Ledger device and a Trezor device with the same API.

let hww_sign = LedgerDevice::new("path/to/other_ledger").unwrap();

let psbt_sign = finalize(

hww.sign_tx(psbt::Amount::Zero(), psbt::Target, psbt::Hash),

psbt::Amount::Zero(),

psbt::Target,

psbt::Hash,

);


Step 4: Verify the finalized PSBT

To make sure that the finalized PSBT is correct, verify it by checking its hash and signature.

// Suppose you have a Ledger device and a Trezor device with the same API.

let hww = LedgerDevice::new("path/to/ledger").unwrap();

hww.verify_finalized_psbt(&psbt::Hash, &psbt::Signature);


Example Use Case

Here is an example use case that demonstrates how to finalize a PSBT using HWW signatures:

use psbt::prelude::*;

fn main() {

// Create a new Trezor device with the same API.

let trezor = TrezorDevice::new("path/to/trezor").unwrap();

// Generate a public key and private key for your wallet.

let pk = generate_keys().unwrap();

let sk = generate_keys().unwrap();

// Create a new PSBT (Proof of Stake Bulletproofs) transaction.

let mut psbt = create_psbt(&pk, &sk);

// Sign the PSBT with a Ledger device and another Trezor device.

let hww_sign = LedgerDevice::new("path/to/ledger").unwrap();

let trezor_sign = TrezorDevice::new("path/to/trezor").unwrap();

psbt.sign_tx(hww_sign.hww_signature, &psbt);

psbt.sign_tx(trezor_sign.hww_signature, &psbt);

// Get the finalized PSBT.

let finalized_psbt = finalize(&hww_sign.hww_signature, &psbt).unwrap();

println!("Finalized PSBT hash: {}", finalized_psbt.hash());

}

Please note that this is a simplified example and you should consult your device's API documentation for specific instructions on how to finalize PSBT with HWW signatures. Also, please note that using HWW for key storage and transaction signing is discouraged by the Bitcoin community due to security concerns.

Ethereum Possible Send Satoshi Bitcoin