Description
Background
As a prerequisite for being able to officially support Bitcoin mainnet
for taproot assets, we need to carefully think about how we approach the question of backup and recovery of tapd
data, since not only assets might be at stake but also the BTC of the anchoring transaction output (you can't spend the BTC that carries assets without being able to reconstruct the full asset tree).
This issue serves as a collection/brainstorm issue around everything related to data safety, backups and recovery procedures.
Documentation
Similar to the lnd
Operational Safety Guidelines document, we'll want a doc that describes the different data sources, what they are used for and how to best prevent loss thereof.
The document should (at least) describe the following key items:
- What is the relationship between asset public/private keys (e.g.
script_key
s) andlnd
's wallet/seed? - What data is required in order to recover both the assets and the BTC of a taproot asset output?
- What data is stored where (
tapd
's database,lnd
's wallet database,lnd
's channel database)? - Where does
tapd
store its files and which files need to be backed up regularly? - How can the
tapd
database be set up in a production ready manner? - Recoverability when using a public universe vs. using a private one? (See further below).
How to prevent database loss
As long as the tapd
database is fully intact and the seed for the lnd
wallet is known, all funds are SAFU.
So to have a replicated (or at least regularly backed up) state of the DB should be the highest priority.
We should test and then document the following ways of setting up a database cluster or streaming replication:
- Using a Postgres database cluster as a database backend: This is already possible and is the recommended way of running
tapd
in a production environment. We'll want to document some setup recommendations and best practices around this though. - Add support for low-level SQLite replication support, perhaps using something like https://github.com/benbjohnson/litestream.
How to recover from full database loss
Even though keeping the tapd
database intact should always be the highest priority, the reality is that users often don't realize that uninstalling and re-installing an app on platforms like Umbrel causes all data to be deleted. So because we want to ship tapd
as part of Lightning Terminal, which is available on such platforms, we need to have a strategy for basic recovery of assets and BTC for the case when the full tapd
database is lost.
Possible approaches:
- Keep a single file (similar to the SCB file used in
lnd
for static channel information) around that is updated on every mint, send and receive and keeps track of the latest on-chain output and proof chain, as well as the universe information. The file would basically contain all the information to be able to recover the asset and BTC funds, but not the transaction history. Then mobile and other platform apps would only need to make sure to create an off-device backup of that file whenever it changes. - When using public multiverses, then the information available in
lnd
could be enough to query those multiverses for the information required to recover access to asset and BTC funds. This requires thelnd
wallet database to be fully intact though, as some of this information is added to the wallet DB bytapd
and is not recoverable through a simplelnd
wallet restore from seed.- Query the
lnd
wallet for unspent p2tr outputs that aren't BIP-0086, then look up the multiverse for assets related to those outpoints (this will only work if the asset anchoring transaction has a change output that goes back to thelnd
wallet, because the actual asset anchoring output will not be recognized as "belonging" to thelnd
wallet). This will work for asset mints and asset change outputs. - Query the
lnd
wallet for any specifically registered tapscript addresses, then look those outpoints up in the multiverse to recover asset proofs. This will work for assets received through taproot asset addresses (non-interactive receives). Though the tapscript addresses aren't directly derived from the seed, so if thelnd
wallet was recovered from seed, this won't be possible.
- Query the
New universe RPCs required for multiverse proof lookup
To allow some of the multiverse lookups described above, we might need additional indexes into the universe/multiverse tree structure:
- Today we have
assetID => outpoint || scriptKey
- Might also need
outpoint => assetID || scriptKey
andscriptKey => assetID || outpoint
Metadata
Metadata
Assignees
Type
Projects
Status