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

Here is an article about finalizing PSBT (Proof of Stake Bulletproofs) when the final signature is provided by a hardware wallet (HWW):

Finalizing PSBT with HWW Signature

When using device APIs for hardware wallets such as Ledger or Trezor, you may encounter situations where the final signature is not yet 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 the HWW signature, follow these steps:

Step 1: Obtain the HWW Signature

The first step is to obtain the HWW signature from the hardware wallet. This can be done using the “sign_tx” method provided by the device APIs, 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 APIs.

// 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 with another HWW, use the “sign_tx” method again.

// Suppose 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 ensure that the finalized PSBT is correct, verify it by checking the 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 shows 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 and private key for your wallet.

let pk = gener_keys().unwrap();

let sk = gener_keys().unwrap();

// Create a new PSBT (Proof of Stake Bulletproof) 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 refer to the device API documentation for specific instructions on finalizing PSBTs with HWW signatures. Also, keep in mind that the bitcoin community does not recommend using HWWs for key storage and transaction signing due to security concerns.

METAMASK PROGRAMMATICALLY IMPORTING METAMASK


Comments

Leave a Reply

Your email address will not be published. Required fields are marked *

MENU