Create a transaction spendable in a specific block height

1

I am new in Bitcoin and I try to create an address in Bitcoind and send a transaction that the amount will be spendable in a specific height of the blockchain.

Here is what I have done:

privateKey = 'cS5bZo8D1PBXwLbpGwYpb3CPvev5FYA7zPpftXAc6vzvbXt3aAa4'

absolute_time = 150

addr = getAddressFromPriv(privateKey) #customFunction

seq = Sequence(TYPE_ABSOLUTE_TIMELOCK, absolute_time)

script = Script([seq.for_script(), 
                        'OP_CHECKLOCKTIMEVERIFY', 
                        'OP_DROP', 
                        'OP_DUP', 
                        'OP_HASH160', 
                        p2pkh_addr.to_hash160(), 
                        'OP_EQUALVERIFY', 
                        'OP_CHECKSIG'])

addr2 = convertScriptToAddress(script) 

Then in bitcoin-cli I use that addr2 to bitcoin-cli sendtoaddress <addr2> 10

However, when I inspect the transaction it says that it is spendable in the current block height. Any idea?

Tasos

Posted 2019-04-12T08:43:48.533

Reputation: 129

1Shouldn't you add the <absolute time/blockheight> before OP_CHECKLOCKTIMEVERIFY in the script? Also you are using 150 as the block height, which means it should be spendable immediately.Ugam Kamat 2019-04-12T10:43:38.753

@UgamKamat: I think you're on to it, but please don't use comments to answer a question, rather post an answer. You can always edit your answer as the topic evolves.Murch 2019-04-12T14:02:37.217

Yeah, wasn't totally sure. So wanted @Tasos to check if that works. Writing it as an answer.Ugam Kamat 2019-04-12T14:41:01.270

Answers

1

You have to add the absolute time/blockheight before OP_CHECKLOCKTIMEVERIFY in the script to depict how long you want to lock the transaction. Also you are using 150 as the CLTV parameter. Anything that is below 500M is dubbed as block height. Given you are using 150, that means that transaction is not spendable until 150 blocks, which should mean it is spendable immediately.

Ugam Kamat

Posted 2019-04-12T08:43:48.533

Reputation: 5 180

I use regtest and I reset the chain to test it. So, 150 blocks haven't reached yet. As for the OP_CHECKLOCKTIMEVERIFY isn't the seq.for_script() which is before that do the trick? Since the seq has the absolute time/blockheightTasos 2019-04-12T15:36:52.840

No. nSequnce has different meaning for CLTV. If nSequence value is >=2^31 it indicates that CLTV, or opt-in-replace is used. However, if nSequence value <2^31, it indicates CSV. nSequence value should however not be 0xffffffff when using cltvUgam Kamat 2019-04-12T15:48:10.883

So, to understand, it should be replaced with an integer for the absolute height like that? script = Script([150, 'OP_CHECKLOCKTIMEVERIFY', 'OP_DROP', 'OP_DUP', 'OP_HASH160', p2pkh_addr.to_hash160(), 'OP_EQUALVERIFY', 'OP_CHECKSIG'])Tasos 2019-04-12T15:52:00.000

Unsure about the exact syntax, but think that should work.Ugam Kamat 2019-04-12T16:04:09.437