Corrupt wallets used to cause a DB_RUNRECOVERY uncaught exception and a crash. This commit does three things:
- Runs a BDB verify early in the startup process, and if there is a low-level problem with the database:
- Moves the bad wallet.dat to wallet.timestamp.bak
- Runs a ‘salvage’ operation to get key/value pairs, and writes them to a new wallet.dat
- Continues with startup.
-
Much more tolerant of serialization errors. All errors in deserialization are tolerated EXCEPT for errors related to reading keypairs or master key records– those are reported and then shut down, so the user can get help (or recover from a backup).
-
Adds a new -salvagewallet option, which:
- Moves the wallet.dat to wallet.timestamp.bak
- extracts ONLY keypairs and master keys into a new wallet.dat
- soft-sets -rescan, to recreate transaction history
This was tested by randomly corrupting testnet wallets using a little python script I wrote (https://gist.github.com/3812689)