I have a multisig setup where the signing is done through external HSM's. I am using Bcoin and its wallet to receive funds. What I am trying to do is to create a transaction and sign it with the HSMs. There are 2 approaches:

  1. Manually create the transaction using MTX.
  2. Use the wallet to create the transaction.

Method #1 solves my problem. The code is even shown here. However, this method has a big drawback. It requires that I create the Coins. That means, I need to manually create the VOuts and VIns. Meaning that I need to get my UTXO set and choose the ones I need for the transaction. This is very tedious and error prone.

Method #2 solves this issue. When using the wallet, createTx() will create the transaction for you, choosing the VOuts and VIns from the UTXO set for that wallet. However, the problem with this approach is that createTX() signs the transaction. I do not want this as the signing needs to be done by other sources.

So, is there a way for me to get the raw transaction from a wallet without it signing? MTX has the method toRaw() which gives the raw transaction. Is there any way I can get the wallet to create the transaction, or at least create the VOut/Vin sets?

Thank you.

1 Answer 1


createTX() doesn't sign the transaction. That is performed by sign() in wallet.js. If your private keys are offline anyway, what kind of unexpected behavior are you getting from createTX()? It wouldn't be able to sign without the keys...?

New functionality was also recently merged to return the MTX before the input scripts are templated (when the public keys are serialized and added to the witness): https://github.com/bcoin-org/bcoin/pull/557 I'm not sure if this helps out your use-case though.

You also might be interested in our own multisig wallet, bmultisig: https://github.com/bcoin-org/bmultisig

This application "plugs in" to the standard bcoin wallet (and full node) and offers hardware support like signing transactions from a Ledger device. Each counterparty of course can sign with their own hardware device at their own convenience.

  • Thank you @pinhead. You are right, I forgot that the private key is not in the wallet. I was considering using an MTX and using fund() to get the coins from the wallet, but createTX() would be a better choice. Thank you for suggesting bmultisig. This is probably what we need. We are expecting to use AWS HSM for signing. If you have any references or material in this regard I would really appreciate if you can share them. Thanks so much again.
    – madu
    Commented Jul 17, 2019 at 0:20

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Not the answer you're looking for? Browse other questions tagged or ask your own question.