I wanted to share some thoughts about how Webcoin is going to handle DWs. I'll use the same symbols as TierNolan.
First of all, I don't see the need for a seed. Since the seed has to be stored with the private key anyway, you might as well regard it as part of the private key.
Next, the master private key should have a full 256-bits of entropy. So we use a random number 0 < a < 2
256. Yes, it's a pain to type. In practice you'd normally use more convenient ways to transfer DWs, such as USB sticks, QR codes, etc.
(However, if your house just burnt down and you lost every backup but the printed hardcopy at your safety deposit box, I don't think having to type a very long password is going to concern you too much.)
Here is an example of a 256-bit number using base58 encoding:
"6QPCJCRhPSVoKL4hhLoqRuBEk4VYzAFMAC1GwQ7JbSR4"
In reality we'll also add a checksum and a version byte, similar to a Bitcoin address.
In our version, there is no seed, so we've been working with v(t, n) instead of v(n, t, s).
t ...
type is included only for future use. Currently it is a zero-length string, i.e. it is omitted.
n ...
serial is a 64 bit unsigned integer (LE).
So a new keypair b, B is generated as:
b = a + SHA256(A t n)
B = A + SHA256(A t n)*G
A is an ECPoint encoded using standard non-compressed form (0x04 x y)
To generate a new public key for the wallet, you need to know A, t and the next serial number to use.
To spend the coins on any of the addresses, you need to know a, t and the serial number.
During normal use, we assume that we have access to a metadata storage system. The metadata storage is retrievable using an access key SHA256(A "access"). It's contents are unencrypted, symmetrically encrypted or asymmetrically encrypted depending on the application. For example, a merchant server whose only job is generating addresses would encrypt metadata for those transactions using a public key and the wallet would retrieve it using the corresponding private key. That way, if the merchant server is compromised, privacy for previous transactions is still guaranteed.
If the metadata is lost for any reason, the user can use a recovery tool to get their coins back. The recovery tool needs a full database of unspent outputs in the block chain and will simply generate public keys using sequential serial numbers using the method above. Whenever it finds coins it will add an entry to a new metadata array.
Note: Using t will make coin recovery more difficult, because the recovery tool will have to a) know all values for t and b) separately scan them all. That's why we're more interested in keeping t an empty string for all normal use cases and using the metadata to synchronize what the next available serial number is.
The maximum number of addresses for one wallet is 2
64 or 18,446,744,073,709,551,616 (for each t).
As long as a and s are protected, the user can never be unable to spend his coins and as long as a is kept secret, nobody else can spend his coins.
Correct. I want to add one more: As long as the master public key A is secret, nobody can break the privacy of the other addresses.
Am I correct in thinking that if you keep A a secret between you and a friend, and agree to use some agreed upon sequence of serial numbers (could this just be trivial and the same for everyone?), that they could have access to an infinite number of your public keys that can't be associated by an outsider? Edit: lol I think you just said this in the last sentence.
If so, then it seems like it could enable people to interface in the client with a contacts list instead of ugly addresses, but without having to reuse them or manually request new ones all the time.
I guess one major problem would be losing the master private key, and having people continue to send to addresses derived from the associated public key.
This could be mitigated by having your contact instead for each transaction get the master public key from an (untrusted) online storage server who stores it encrypted to your private key and your contact's public key, and check that it hasn't changed. That way if you lose your wallet, you can stop everyone from sending to it in one step by deleting the master public keys from your storage server, and restart it again by uploading new ones for each of your contacts, without having to notify them, since their client can just start the agreed upon serial number sequence anew if they notice that the master public key has been changed.
Edit: Damn, I read your post two days ago, and forgot to re-read it before responding. I apologize for basically restating what you did.