I might as well pile on too while we're all at it
Just some thoughts I've been having about this problem I wanted to share.
Using namecoin strings alone as identities is clearly crazy - they're first come first serve, and anyone can come and register one after you whose typesetting only very subtly different, opening the door for phishing. So you need a PKI built on top, which is much more difficult to do than namecoin itself. Not to mention, as retep did earler ITT, it can't do lightweight clients without trust. Even with the complex UTXO commitments he mentioned, you have to trust that miners won't rewrite history (because lightweight clients won't be able to check a UTXO proof for every block for every name they're interested in).
If we slightly temper our expectations of a secure, decentralized naming system, then we can solve these problems very easily (or define them away, depending on how you look at it). And the result is Good Enough IMHO. Essentially, if we give up on names being meaningful (but still keep them short, pronounceable and memorable) then they can be used alone securely as identities - no PKI needed. The idea is that there are a relatively small number of transactions in the Bitcoin blockchain (< 2^25 currently), so you don't need very many bits to encode a transaction's location in the blockchain uniquely. You then run these encodings through an universally agreed upon cipher to make them dissimilar, and encode the result into some phonemic base. By encoding a pubkey fingerprint in a transaction, you have a secure name to pubkey mapping. This can build directly off of Jeff Garzik's identity protocol:
https://en.bitcoin.it/wiki/Identity_protocol_v1.
For example, with a large set of CVC phonemes (consonant - vowel - consonant), you only need three to describe a 32 bit name: ~reb-mizvig. Wisely selecting a smaller set of phonemes may make for more readable names in general at the expense of needing another phoneme: ~bitlyr-worwyd. Might be worth it. And you could have lots of different "languages" for different styles of names. Or different alphabets even. The guys working on Urbit are currently developing some of these phonemic bases and said we can just copy what they come up with if we like.
Note that all a lightweight client needs to resolve a name to a pubkey fingerprint is the block headers and a merkle path, which encodes the transaction's location via the ordering of hashes. Also, names done this way would be very dissimilar, so you could safely use them alone as your identity. This is probably best for identities that live purely online; if people know you only by this name, then key verification comes for free.
Regarding transfer of names, I wonder if that really makes sense. I can wholeheartedly vouch for a person, but can I really sell your trust in me to to them? The names are sufficiently throwaway, so I say don't bother with this. System's much simpler without it.
Of course this all glosses over the need for good key management. Maybe devices like Trezor could be useful here. Some random thoughts on a distributed key revocation blockchain:
- Identity protocol's miner sacrifices makes this hard to spam.
- Authenticated prefix trees instead of merkle trees could make it so you only have to pay attention to small subsets of each block containing (or not containing) names you care about.
- We only care about unjammability, so we can pay attention to, say, the 5 longest branches to make it more difficult for miners to suppress revocations.
Thoughts? Is this all crazy/expecting too much of people? Am I misunderstanding the problem?