Setting up the wallets:
- Create Wallets A and B on the primary computer (or an offline computer if you want to make sure both wallets never touch the same online computer)
- Print paper backups of A and B
- Scan QR code on paper backup B with phone
- Delete private keys of wallet B on the primary computer (Armory has an option for deleting private keys only, converting to watching-only wallet)
- Put both paper backups away in a safe place (safety-deposit box preferred)
- (optional) Put watching-only copy of wallet A on the phone (if you want to give out addresses from your phone)
Now to give out addresses:
- Device gets next unused public key from its own wallet, n, and then gets public key n from the watching-only wallet of the other device
- Generate 2-of-2 multi-sig address
To spend the money:
- Computer generates transaction like normal.
- Create BIP 0010 Tx Distribution Proposal (TxDP; I really need a better name for this) and add signature for wallet A
- Display BIP 0010 packet as a QR code on the screen (or multiple codes, if it's a long tx)
- Phone scans QR code(s), displays transaction details, asks user to confirm
- Phone adds signature B, and connects to the network just long enough to broadcast it to 3+ nodes
To recover loss of one or both devices
- Restore both paper backups
- No per-address/tx backup information needed, at all
BIP 0010 guarantees that the phone doesn't need the blockchain, yet it can still verify the details of any given transaction. The determinism guarantees that we can create an infinite sequence of these multi-sig addresses and each one will be unique and unpredictable to strangers. By designating these wallets are dedicated to 2-of-2 transactions, we can guarantee that we only use "parallel" public keys in both wallets: that way you don't have to check all combinations of keys in wallet A with all keys in wallet B: you only have to check publicKeyA(i)-and-publicKeyB(i)
A similar scheme can be concocted for ((A and B) or C), using a designated full wallet for A, and requesting a watching-only wallet for B (which is the third party). C is then created on an offline computer and never touches the internet, backup is stored in safety deposit box. Again, you only use ((PubKeyA(i) and PubKeyB(i)) or PubKeyC(i)) to keep a simple search space in case of a restore-from-backup situation.
-----
There are lots of magical things you can do with ECDSA, but to me they feel like hacks with multi-sig right around the corner (except for the [[A and B] or C] case). They are secure, but they usually come with caveats: such as requiring one party to give up their private key to the other party, who then gets full control of the funds--works fine in some situations, but a complete fail here, since giving them one private key is giving them all of them with a determinstic wallet.