Previously Fully Noded acted more or less as a remote control for your node and that was it. If you wanted to sign transactions you either had to use a hot wallet on your node or supply a private key to sign a transaction with. Neither are good ideas or very UX friendly.
Thanks to Christopher Allen for introducing me to a wonderful library called LibWally which allows Fully Noded to sign PSBT’s locally, acting much like a hardware wallet acts in that it can sign transactions locally with no internet required, all built with pure C code from the ground up. I touched on this in my last post which you can read here if you missed it: https://medium.com/@FullyNoded/introducing-fully-noded-wallets-9fc2e4837102
Now Fully Noded has the ability for you too add psbt signers independently of wallets, this means you can create a 100% watch-only wallet on your node where the node only holds public keys, then very easily add your BIP39 seed words with an optional passphrase and Fully Noded will automatically sign the psbt for you if it can, making recovering cold storage easier then ever.
You can add as many signers as you want, they will sign for absolutely any derivation you pass them and any address type *as long as you imported that derivation into you node*. You can label the signers, delete them (careful with that as you will not be able to spend your btc) and you can see details such as the date added and the master key fingerprint which is ueful for offline psbt signers like Coldcard and Fully Noded.
Lets jump right in to the good stuff:
As you can see above we have a cold wallet, there is no signer associated with this wallet yet on Fully Noded. The balance is under the COLD section because the node holds no private keys for this wallet and can not spend it.
I went ahead and built a psbt with the wallet, one recent update to Fully Noded is that you no longer choose between raw transactions or psbt’s, if you can fully sign a transaction it will return a signed raw transaction, otherwise it returns a psbt, the way it should be. Another important update is you can also now utilize rbf even with cold storage transactions (multisig too) in the latest Fully Noded updates!
Tapping the text of the psbt allows you to airdrop the psbt as a raw data file compatible with BIP174 (Coldcard and Electrum) to my macbook.
There he is, all alone and unsigned 😞
Now to illustrate the functionality we will add a signer so we can sign this psbt.
Tapping the “stack of squares” button in the top left of the “Active Wallet” view shows us your list of “Fully Noded Wallets”, to see the “Fully Noded Signers” tap the pencil button in the top right of this view.
There you can see all the signers you’ve added. Tapping the + button in the top right allows you to add as many as you would like.
Here you can add an optional passphrase and your BIP39 seed words, either one by one or all at once by pasting them in.
Once valid words have been added you will be alerted:
The words and passphrase will be encrypted and stored securely to your device, no iCloud backup, no servers, just you and your device’s secure enclave.
As you can see the signer has been added, to edit its label or delete it just tap it:
Now for the fun part, remember our lonely sad psbt we airdropped to the macbook, lets close Fully Noded and go back to the macbook, he needs some love:
Go ahead and airdrop it back to the iPhone.
🤩 Thanks to the good folk at BlueWallet for inspiring this feature where you can register a file type (in this case a .psbt), if you airdrop the .psbt file to your iPhone you will be prompted to automatically open it with Fully Noded. Doing so will present a dedicated and brand new “PSBT Signer” view.
At first Tor will reconnect when the view appears (takes a few seconds so be patient), then we process the psbt with your nodes active wallet, once its processed by your node you will see the base64 encoded text of the psbt. At this point you may investigate it by tapping “decode” or “analyze”, these are the bitcoin-cli commands analyzepsbt and decodepsbt, they show you all the info you would ever need to know about the psbt.
Once you are happy it all looks good you can tap “sign”, at this point Fully Noded comes into action and filters through all the signers stored on your device and signs the psbt with them if they are able to sign. This works without internet connection but we do make a few commands to the node so it is not offline optimized. Perhaps in the future we will move to 100% offline.
If the psbt if fully signed you’ll get a notification:
As you can see the text in the background converts to a complete signed raw transaction that can now be broadcast. You always have the option to tap “cancel” and copy and paste the signed raw transaction for further inspection if you’d like. If you are ready to broadcast you can do that too.
It is worth noting that in the case where the psbt is not complete you will of course have the option to export it as raw data or text to another signer. In this scenario its been broadcast so you get a notification as such, and a txid appears which you can copy/paste to check with your node using Fully Noded tools.
This makes collobarative multisig *extremely* easy for anyone to achieve and makes using your node in the best possible way easily achievable whilst also offering a secure and private means of signging and broadcasting your transactions. Just pass these .psbt files between Coldcard, Fully Noded (1 and 2), Electrum and any other signer who supports BIP174.
To take us back full circle here is the transaction showing in the history (I sent it to myself so it shows as in and out):
I hope you enjoy this new power and awesome flexibility for your single sig and multisig wallets, I know I do :)
Currently this is still only on the Testflight as it is all quite new and there could be some more bugs to iron out, please help speed that process up by checking out the new Fully Noded Testflight here: https://testflight.apple.com/join/a6GWxet2 and reporting any issues you run into.
As always I can be reached on the Fully Noded telegram at https://t.me/FullyNoded and on Twitter @FullyNoded