Introducing Fully Noded Wallets

Fully Noded™️
7 min readJul 1, 2020

I am proud to announce the addition of some highly demanded features to Fully Noded!

A bit of backstory first:

Fully Noded has always had the ability to create wallets, however this ability was directly powered by your nodes bitcoin-cli interface and nothing else (except for in the case of HD multisig but we won’t go there). Fully Noded acted “dumb”, it allowed you to create Bitcoin Core wallets without offering anyway to back the wallet up via the apps user interface.

This meant users needed to know how to back up their node’s wallet’s, create a seed, derive keys from a seed, import them correctly etc… etc… Not ideal at all! Not to mention storing your private keys on your node (usually a general purpose computer) is not a good idea from a security perspective.

That has all changed! To be clear Fully Noded still offers all of its original functionality via the “Wallet Manager”, nothing has changed there, Fully Noded still allows unfettered access to your nodes capabilities for those who want it (me).

The major change is now visible from the “Active Wallet” tab. In the top left corner you can see a new plus button and a button in the form of a stack of squares.

To try it yourself you can join the new TestFlight here: https://testflight.apple.com/join/a6GWxet2

Tapping the plus button will present this view:

Now you have the option to create or recover a “Fully Noded Wallet”.

If you want to create a fresh wallet tap “single-sig” and let the magic happen. Fully Noded now uses a wonderful open source library called LibWally (https://github.com/ElementsProject/libwally-core) (https://github.com/blockchain/libwally-swift/blob/master/README.md) which allows us to utilize BIP39 directly in the app meaning you can easily recover your Fully Noded wallet with Electrum for example. Now when you create a wallet you will get a 12 word recovery phrase (no passphrase by default) to backup and keep safe.

Fully Noded Wallets are smarter. They create a wallet on your node that can only hold public keys, meaning your node can not spend your bitcoin on its own. Fully Noded imports BIP84 keys into your node but also imports each address type for each public key so that you can receive to and spend from every kind of address, this is handy in a world where not all popular wallets/bitcoin service providers are capable of sending btc to a bech32 segwit address (shocking I know).

The derivation paths used to import your public keys are:

m/84'/0'/0'/0/0–2500 (added to receive keypool)

m/84'/0'/0'/1/0–2500 (added to change keypool)

For each of the above paths we import each address script; bech32 (p2wpkh), segwit wrapped (p2sh-p2wpkh) and legacy (p2pkh).

Your node knows to watch 5,000 public keys and 15,000 address script types for the wallet by default. It will see all your utxo’s and in this way can build psbt’s with them. Your node will utilize Bitcoin Core’s excellent coin selection algorithm, fee estimation and you get to rely on the most peer reviewed peice of software in existence to build your transactions and manage your funds (Bitcoin Core), it is literally just you and your node.

When you go to send btc your node builds the psbt which is not signed at all, Fully Noded then takes that psbt and signs it locally (no internet required), converts it to a raw transaction and gives you the option to broadcast it. Because everything that happens on Fully Noded is happening on Tor the privacy and security benefits are huge.

Your encrypted seed words are stored independently of your wallet using your devices secure enclave to encrypt the seed, this way your seed can sign for any derivation path you hand it.

Fully Noded now acts like a hardware wallet, it can sign anything 100% locally with no internet required at all.

Ok, that covers the basic wallet, still with me? Good! Now on to something even more exciting; Fully Noded Recovery Wallet!

Fully Noded Recovery Wallets are designed to help users recover every possible popular derivation across a number of wallet vendors. It takes quite a few commands to your node and can take a minute or two to complete the process.

The recovery wallet allows you to input any set of BIP39 words, a custom account number (0 by default) and an optional passphrase.

Once you’ve added a valid BIP39 recovery phrase you can tap the “recover” button. At that point you will be presented with an option to include Samourai derivation paths, these include all Samourai wallet derivations, pre mix, post mix, ricochet, bad bank BIP47, 84, 44, 49. Selecting this option practically doubles the amount of time needed to complete the operation so it is optional and only needed for Samourai users.

By default it will recover BIP44, 84, and 49 derivation paths along with all three address types for each derivation (bech32, segwit wrapped and legacy).

Recovery wallets import 2500 receive public keys and 2500 change keys for each derivation along with the three address types for each key. As an example (with Samourai disabled):

m/84'/0'/custom account number’/0/0 to 2500 (added to receive keypool)

m/84'/0'/custom account number’/1/0 to 2500 (added to change keypool)

m/44'/0'/custom account number’/0/0 to 2500 (watching)

m/44'/0'/custom account number’/1/0 to 2500 (watching)

m/49'/0'/custom account number’/0/0 to 2500 (watching)

m/49'/0'/custom account number’/1/0 to 2500 (watching)

You end up with a BIP84 wallet (because we add the BIP84 keys to your wallets keypool and simply watch all the other addresses). So you can use this as a normal wallet or sweep it to a new wallet. It is much more then BIP84 as it can sign for all and spend all of the derivation paths it imported.

I do plan to implement more derivations from more obscure wallets in the future but this is a good starting point.

Upon importing all the keys your node will automatically rescan the blockchain, for non pruned nodes this can take up to an hour, just be patient and keep an eye on the rescan status from “tools” > “Get wallet info”, once it reaches 1 your rescan is complete, or you will simply see the “scanning” field disappear, at this point you should see all of your transactions and balances.

If you want to import more then 2500 keys you can simply tap the wallet and edit the “maximum index” field, at which point it will go through every derivation the wallet holds, is watching for, and import the increased range of keys.

To see your list of wallets tap the “stack of squares” button in the top left:

From here you can activate and deactivate wallets and tap the > button to see wallet details and get more options:

You can tap the label field to edit the wallets label, tap the delete button to delete the wallet, tap the maximum index field to increase the range of keys your node holds, see the current index (your highest utxo address index), see your recovery words associated with the wallet, see the filename where your wallet lives on your node, and see the descriptors which your wallet holds in its keypool along with the descriptors it is watching for.

In a recovery wallet you will see quite a few “Watching” descriptors. This is an unambigous way of showing you exactly what the wallet holds. To read more about descriptors see this document: https://github.com/bitcoin/bitcoin/blob/master/doc/descriptors.md

Descriptors are a clever way of importing specific keys into your node from any derivation, for any (or all) address types, single or multi signature, along with a fingerprint so offline psbt signers like a Coldcard and Fully Noded can sign the psbt if they hold the correct seed. This was a recent change to Bitcoin Core which basically made it compatible with BIP39 and all the standard derivation BIP’s which were previously not possible to use with your node.

When you create an invoice with the wallet the address will be derived from the “Receive Descriptor Keypool” and is capable of generating all three address types. When your node builds psbt’s it will derive change keys from the “Change Descriptor Keypool”.

Your node will automatically see and recognize any utxo which is related to the “Watching” descriptors as being owned by the wallet, for a normal wallet the “Watching” field will be empty, for a recovery wallet you will see all the descriptors that were imported. Fully Noded will of course be able to sign for and spend any utxo associated with any of the wallets descriptors.

I hope you enjoy using these smarter wallet types in Fully Noded and really hope the Recovery tool can get you out of a sticky situation! This is just the beginning, if you’d like to help please do give us a rating on the app store! https://apps.apple.com/us/app/fully-noded/id1436425586

As always I can be reached on Telegram at https://t.me/FullyNoded and Twitter @FullyNoded

--

--

Fully Noded™️

An open sourced app which utilizes bitcoind as a backend, connect your own node via Tor V3 authenticated service. PGP: 3B3797FA 0AE84BE5B4406591856401D7121C32FC