Original Submission
(This was originally found on https://github.com/blockstack/blockstore/issues/76 and I’m just porting my comments over so that we can have a discussion here instead of on GitHub.)
In the current system, all namespaces simply exist and don’t need to be created. If you want to start operating in a namespace, you simply use a prefix that has the namespace properties in it (like pricing rules and whether names expire or not) and a human-readable identifier of length 1 (in order to distinguish it from other namespace with the same properties).
I’d like to explore a new system, whereby namespaces are explicitly defined and then they can be used from that point on. In this system, names could only be registered in existing namespaces.
Namespaces would be created with a namespace creation operation with the following effects:
the properties of the namespace are laid out, including the identifier of the namespace, the name pricing rules, and the name expiration rules
a namespace creation fee is paid (to prevent spam)
the namespace is added to the list of existing namespaces
Here is an example of a possible namespace creation operation as part of this system:
CREATE NAMESPACE
- Operation fee: 1 BTC
- TLD: .cool
- Name lifetime: 1 year
- Baseline name price: 0.01 BTC
- Name auctioning: false
- Name price decay per letter: 2x
There are 26^4 or 0.5M possible 4-letter TLDs. This means that 0.5M bitcoins would have to be spent to initialize all of the possible namespaces. People would be wise to choose TLDs that don’t conflict with existing ICANN TLDs. Further, TLDs don’t have to be used in practice. At minimum they act as a unique identifier for the namespace.
To be clear, if a namespace is defined it is not owned by anyone. The person who defines the namespace simply gets to set the properties of that namespace.
Update 1:
I’d like to modify this proposal and suggest that a namespace can be instantiated with a list of pre-registered names and their owning ScriptPubKeys (consult https://en.bitcoin.it/wiki/Transaction if you’re not familiar with this term).
The remarkable thing about this is it would essentially upgrade the “create namespace” call into an “import namespace” call. Namespaces could be migrated over seamlessly from other blockchains like Namecoin. And the best part is that users would be able to use their existing private keys to manage the names.
Update 2
Originally I thought that we would do the following:
- allow a namespace creator to specify the hash of a file with a list of pre-registered names
- either (a) have the file be stored in a DHT (which unfortunately makes naming dependent on external storage) or (b) have namespace creation files distributed with the code (which is cumbersome and is only realistic if namespaces are infrequently instantiated, maybe if it was costly to do so).
- have nodes that reconstruct and resolve the namespace respect all the names in the instantiation file
Now I’m thinking there’s a better way to do this:
- have two operations to create a namespace: “define” and “begin”
- in the “define” step, allow a namespace creator to define the details of the namespace, other than the pre-registered names
- only open up name registrations once the “begin” operation has been submitted
- allow names to be registered exclusively by the instantiator between the “define” operation and the “begin” operation
The advantages of this are that all names are stored inside of the blockchain, no external storage with an instantiation file is required.
Yes, this could be viewed as costly, since 1 transaction is required per name registered, but I argue this is a good thing, as namespace instantiation should be costly. And name registration shouldn’t just be free for the instantiator.
I also argue that this wouldn’t be prohibitively expensive, as a namespace with 30K names would only cost about $1,000 to port over, which is quite reasonable.