시간잠금 (locktime)

Locktime (시간 잠금)

Locktime

서명된 Bitcoin 트랜잭션은 일반적으로 바로 보내게 되는데, Bitcoin은 일정 시간 이후에 트랜잭션을 보내는 기능을 지원하고 있다.

일정 시간 이후에 트랜잭션을 보내기 위해서는 Locktime 필드를 설정하면 된다. 여기서 일정 시간을 지정하기 위해 (1) Unix Timestamp와 (2) Block Height를 사용할 수 있다. Unix Timestamp을 사용하면 미래의 특정 시간이 지난 후에 블럭 안에 넣을 수 있게 되고, Block Height를 사용하면 미래의 특정 Block Height 혹은 그 이후에 블럭 안에 들어갈 수 있다. 일반적으로 Block은 평균 10분마다 생성되지만, 이 시간은 다소 차이가 있을 수 있으므로 최종적으로 언제 들어가는 지는 어느 정도의 편차가 있을 수 있다.

미래의 시간은 Locktime 필드 하나를 가지고 표시하는데, 그 수가 500백만 이상이면 Unix Timestamp으로 해석되고, 그 미만이면 Block Height로 해석된다. 예를 들어, Locktime 필드가 850000 이면 이는 Block Height를 의미하고, 1678675234 이면 Unix Timestamp를 의미한다.

bitcoin-cli 에서 시간 잠금(locktime)을 지정하기 위해서는 createrawtransaction 명령에서 locktime 파라미터를 지정하면 된다. 아래 예는 locktime에 Block Height 2189540 을 사용한 것이다.

$ bitcoin-cli -named createrawtransaction inputs='''[ { "txid": "'$txid'", "vout": '$vout' } ]''' 
    outputs='{ "tb1qlkqqnp3ymgawyk5kansrfepwj0jr5ky5hxa4lh": 0.001 }' 
    locktime=2189540

$ bitcoin-cli signrawtransactionwithwallet 0200000001c50b...

$ bitcoin-cli decoderawtransaction 02000000000101c50b630566360ed83431702d4678f4e0659dc3ec5ab9d41e8e894505da832a670000000000feffffff01a086010000000000160014fd80098624da3ae25a96ece034e42e93e43a589402473044022051d1b1c103c21842aeec313a778e26d637f1aa1e982a53745d100918450ad2bf022025c9e98b66096a1473ceb88e1ed94f706a2dc2bd2c0d66803d76d3b917c0eb3101210297b718401ed49c0282539943c417404689947f29cba725bce451bcdc689469cae4682100
{
    "txid": "846fe340a12b230c7acba83c8c17d3517220b48b1e603692b1f06f2620e54a2c",
    "hash": "c9832154f01cfbb384b83c6b402ac521828c3265a4aa2a27b8fffa66de05ecbe",
    "version": 2,
    "size": 191,
    "vsize": 110,
    "weight": 437,
    "locktime": 2189540,   <=== 
    "vin": [
    {
        "txid": "672a83da0545898e1ed4b95aecc39d65e0f478462d703134d80e366605630bc5",
        "vout": 0,
        "scriptSig": {
        "asm": "",
        "hex": ""
        },
        "txinwitness": [
        "3044022051d1b1c103c21842aeec313a778e26d637f1aa1e982a53745d100918450ad2bf022025c9e98b66096a1473ceb88e1ed94f706a2dc2bd2c0d66803d76d3b917c0eb3101",
        "0297b718401ed49c0282539943c417404689947f29cba725bce451bcdc689469ca"
        ],
        "sequence": 4294967294  <=== 

Raw Transaction을 decode 해보면, locktime 이 2189540 으로 설정되어 있고, sequence가 4294967294으로 자동 설정되어 있는 것을 볼 수 있다. bitcoin-cli는 locktime이 설정되면, sequence를 locktime을 위한 플래그값인 4294967294으로 자동 설정한다.

Locktime이 걸린 트랜잭션을 Broadcast하면 다음과 같은 에러가 발생한다. 2013년 이후, Locktime 이 걸린 트랜잭션은 Locktime이 Expire되지 않는 한 Mempool에 들어갈 수 없게 되었는데, 따라서 월렛은 이 트랜잭션을 가지고 있다가 Locktime이 Expire 된 후에 Broadcast하게 된다.

$ bitcoin-cli sendrawtransaction 02000000000101c50b630566360ed83431702d4678f4e0659dc3ec5ab9d41e8e894505da832a670000000000feffffff01a086010000000000160014fd80098624da3ae25a96ece034e42e93e43a589402473044022051d1b1c103c21842aeec313a778e26d637f1aa1e982a53745d100918450ad2bf022025c9e98b66096a1473ceb88e1ed94f706a2dc2bd2c0d66803d76d3b917c0eb3101210297b718401ed49c0282539943c417404689947f29cba725bce451bcdc689469cae4682100
error code: -26
error message:
non-final    

Locktime을 거는 이유 중에 하나는 나중에 트랜잭션을 취소할 수 있게하는 것인데, 이를 취소하기 위해서는 그 트랜잭션에 있는 UTXO들 중 최소 하나의 UTXO를 사용하여 새로운 트랜잭션을 만들어 보내면 된다.

본 웹사이트는 광고를 포함하고 있습니다. 광고 클릭에서 발생하는 수익금은 모두 웹사이트 서버의 유지 및 관리, 그리고 기술 콘텐츠 향상을 위해 쓰여집니다.