How do I use CHECKLOCKTIMEVERIFY to prevent a transaction being spent before 100 blocks?

1

I'm creating a Bitcoin based lottery application. An entry into the lottery is a transaction spending 1BTC.

If someone guesses some arbitrary value correctly, they can claim the entry and send this 1 Btc to an address they control.

I wish to have functionality as follows: if no one guesses the correct number after 100 blocks, then I can claim it as the operator of the lottery.

Can I do this via: Entry transaction IF CHECKLOCKTIMEVERIFY payable to a correct guess ELSE Payable to my operator public key END

Then when I try to spend this entry transaction, I set the nLockTime to the current block.

Throughout I set all the sequence numbers to 0xFFF... So that the transactions are mined.

Tom Taylor

Posted 2016-05-12T15:56:58.420

Reputation: 13

Answers

0

Yes, you can use OP_CHECKLOCKTIMEVERIFY to make a transaction output unspendable for a certain number of blocks. However, you can't use it directly in an if-else block as you have described. When OP_CHECKLOCKTIMEVERIFY executes, it doesn't place a result value on the stack. It either throws an error (invalidating the transaction attempting to spend the output), or continues executing as if nothing happened.

To create a transaction as you describe, you will need to use multisig, such that one party can spend the transaction as soon as the correct number is provided (input to a hash function, I presume?), OR you can spend it back to yourself after the lock time expires. This is basically how the lightning network works. You should check out Lightning Networks Part II: Hashed Timelock Contracts (HTLCs)

Jestin

Posted 2016-05-12T15:56:58.420

Reputation: 8 339

Thanks for the info. On the BIP Page Peter Todd suggests a script similar to mine though, right? https://github.com/bitcoin/bips/blob/master/bip-0065.mediawiki

Tom Taylor 2016-05-12T21:16:29.453

Yes, his examples are similar. Just remember that OP_CHECKLOCKTIMEVERIFY is a consequence of a condition, not the condition itself. The condition is the 0 or 1 at the end of his example redemption scripts. That's what determines if OP_CHECKLOCKTIMEVERIFY is called.Jestin 2016-05-12T21:33:51.833

Great, thanks. Will come back here with any further questions.Tom Taylor 2016-05-12T21:47:10.070