I'm working on my own implementation for this idea, but I'm sure others might like it and be inclined to incorporate it into their own clients. I'd love to see it somehow implemented in the ref client.
I think this idea is critical for BTC to be adopted by businesses and would also be quite useful for regular users. I will use the small business as the target user here.
The basis for this concept is some solid crypto-magic for deterministic wallets with predictable public keys. I can describe the cryptography separately, if desired, but it is actually quite simple, secure, and has the following properties:
- Private keys are computed based on only two 256-bit numbers: a private-key-generator and a "chaincode".
- All publickeys/addresses can be computed with only the first public key and the chaincode.
- Wallets can be backed up once, forever, and an online computer can generate new addresses without needing any of the private keys!
- Without the chaincode, there is no verifiable link between any of these addresses.
My proposal is to implement a new
mode in the Satoshi client, or a new client altogether this idea. Here is the CONOPS for a small business using this technique to run an online store. I will refer to them as the "vendor."
- Vendor buys a $200 netbook and puts it in the back corner of their office without an internet connection
- Vendor generates a new wallet on this offline computer based on this generator&chaincode technique
- Vendor clicks a button to generate two files:
FileA.priv ={PrivateKeyGen (256bits), ChainCode (256bits)}
FileB.pub ={FirstPublicKey (512bits), ChainCode (256bits)} - Vendor permanently backs up FileA.priv to paper/USBkey/floppydisk/CD/tattoo. They would probably keep this in a safe-deposit box.
- Vendor copies FileB.pub to a USB key and copies it to their webserver that runs their online store. They click a button to create a special WatchingOnlyWallet, select FileB.pub from the USB key.
- Vendor also creates a small online wallet for refunds.
- When customers purchase items they are given a new address by the server in one of two ways:
--Generate a new public key based on the chaincode technique for the offline wallet
--If the refunds account is low, generate a new address for that account - Client watches the blockchain and can confirm that payment was received. Waiting an hour for 6 confirmations is acceptable before shipping the products
- To move money to another account (or boost the refund account) they click a button on their online client to copy verified tx data to USB key (or the whole blockchain)
- The key is inserted into the offline computer and the client automatically detects and updates its own blockchain/database of transactions
- Vendor enters an amount and address to which he wants to move his money, computer saves a FileC.signedtx to the USB key
- Vendor inserts USB key into the online computer, clicks a "Broadcast Offline Tx" button, selects the FileC.signedtx
- Profit!
This mode of operation has a plethora of benefits to all users:
--Private keys for majority of savings
never touches the internet -- optimal security!
--Has high level of convenience for the user/vendor, given the fact their private keys are offline.
--Maintains a small spending account for the user/vendor online for sending small amounts of money, immediately. Refilling the small online wallet can be "automatic" by the address-selection method.
--User only needs to backup their online and offline wallets
once, ever--Encryption of wallet on offline computer easy to integrate/use, in case of stolen property
The one downside to this method is: if the chaincode is compromised, then someone can immediately associate all transactions processed by this wallet. However, in most situations where the online computer is compromised, the compromised data would hold this information anyway (any wallet will contain all this data), so I don't see this as much more of a threat than the current wallets. Plus, that's only a risk to privacy, but gives the attacker no way to spend the money.
Any thoughts on this process? I think this, or something closely related should be a high-priority goal for BTC client development activities.
[/list]