Blockstore discussion: implement proper name fee rules

(Migrating this discussion over from https://github.com/blockstack/blockstore/issues/35)

With the current design, names are purchased by paying tribute with mining fees. The problem here, though, is that miners can effectively register domain names for free because they’re simply paying themselves the mining fees. This could cause the incentives in the system to break down.

Solutions

  1. burn the name fee instead of offering it up as mining fees
  2. redefine name registration as a 3-Tx process
  3. figure out a way to make transaction outputs spendable by anyone at a given block height
  4. have the name price be split up among the mining/coinbase addresses of the last X blocks

Solution 1

Burn the name fee instead of offering it up as mining fees.

This is the simplest. No miner can register names for free, as the fees are just thrown away.

Solution 2

Redefine name registration as a 3-Tx process.

  • name preorder - hash(name, salt, scriptPubKey)
  • name reveal - name, salt
  • name registration completion - references the name reveal, has a large “anyone can spend” output and an nLockTime

As soon as the name reveal hits a block, the name registration completion is formatted to reference the name reveal and then is immediately broadcasted. Anyone can claim the output of the Tx but only once the number of blocks in the nLockTime has passed. Also, since miners have final say on the Tx’s that get included in blocks, if miners are smart, they’ll claim the “anyone can spend” output for themselves. The idea is for this to effectively be a mining fee to the miner of the t0+Nth block, where N is a fixed value like 6 or 10. This prevents miners from being able to pay themselves mining fees when they register a name, as they can’t predict who will mine a block N blocks from the t0 block.

Also, once someone does a name reveal, there’s a lock on that name for M blocks.

Solution 3

The basic idea here is to stick with a two part registration and in the name reveal/registration, have an output that anyone can spend after X blocks. Note that this is different from nLockTime, as this is for the spend-ability of an output, not for the include-ability of a Tx.

Peter Todd’s OP_CHECKLOCKTIMEVERIFY is exactly what we need for this. Unfortunately, it hasn’t been integrated yet, so we’ll have to wait for it to come out.

Here’s the writeup on OP_CHECKLOCKTIMEVERIFY: https://github.com/bitcoin/bips/blob/master/bip-0065.mediawiki - unfortunate that it’s not ready yet.

Solution 4

Have the name price be split up among the mining/coinbase addresses of the last X blocks, where X is sufficiently large.

X must be sufficiently large so that miners don’t wait until they get a bunch of blocks in a row and give themselves a massive effective discount on name prices. For example, let’s say X=10 and a mining pool has 30% of the hashing power. If the miner is able to occasionally get 5 blocks in a row, then it can effectively register names at a 50% discount by waiting until it finds the 5th block and packing names into that block. If X = 20, it can register names at a 25% discount. If X = 50, 10% discount.

Update: CHECKLOCKTIMEVERIFY has been merged.

Now we just have to see when it will be incorporated in.

Awesome @ CHECKLOCKTIMEVERIFY being merged. I think that’s the best solution and right now I’m in the camp of burn the fee until we can do checklocktimeverify. Because burn fee is a temporary thing, we can get away with it. In the long run, we want to incentivize miners.

Would love to hear thoughts from other people.

2 Likes