Here is an article on how to finalize a PSBT (Proof of Stake Bulletproofs) when the final signature is provided by a Hardware Wallet (HWW):
PSBT Finalization with HWW Signature
When using hardware wallet device APIs such as Ledger or Trezor, there may be situations where the final signature has not yet been provided. However, it is important to note that these devices usually provide the necessary signature upon successful initialization.
To finalize a PSBT (Proof of Stake Bulletproofs) after receiving an HWW signature, follow these steps:
Step 1: Obtain 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 APIs, as mentioned in the question.
use psbt::prelude::*;
// Suppose we 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 we 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.
// Suppose we have another Ledger device and a Trezor device with the same API.
let hww_sign = LedgerDevice::new("path/to/other_ledger_book").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 final PSBT is correct, verify it by checking its hash and signature.
// Suppose we 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();
easy sk = generate_keys().unwrap();
// Create a new PSBT (Proof of Stake Bulletproofs) transaction.
easy 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(check_sign.check_sign, &psbt);
psbt.sign_tx(signature_of_treasure.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 PSBTs with HWW signatures. Also, please note that using HWW for key storage and transaction signing is not recommended by the Bitcoin community for security reasons.