無法在測試網上使用 UNIX 時間戳作為鎖定時間
我正在嘗試創建一個時間鎖事務,但我無法在測試網上使用 UNIX 時間戳。但是,如果我使用塊高度,則交易有效。
當我使用未來的區塊高度並廣播交易時,我得到:
sendrawtransaction RPC error: {"code":-26,"message":"non-final"}
當達到塊高度時,交易按預期進行。
當我將鎖定時間設置為 500,000,000 以上時,我收到一條不同的消息:
"non-mandatory-script-verify-flag (Locktime requirement not satisfied)"
我嘗試了來自不同年份(2013 年、2020 年)的幾種不同的隨機時間戳,並且收到了相同的錯誤消息。如果我以 400,000,000 的大鎖定時間進行交易,我會收到預期的
"non-final"
消息。只有當我超過 500,000,000 最低時才會發生這種情況。我已經解碼了兩個事務,唯一顯著的區別是鎖定時間。
以下是 2013 年 UNIX 時間戳的原始交易:
0200000001ab306f83a06f006f76695f0911fbe095d2443798f232e91e7a78e8bbf2050ec40000000088483045022100c381bfb9de6930ecb45cf2cc13581aca8c42e9f570615cabf1a631fbf137270b022026636856bbf250d169f7608abe1ab4fcba13c495ffa27ee4e821d38d626365ab012103803a5bbbe00dad7dbb29dd5f4d7883ac049bad52d78b456cda12591e26ae70241c00b17576a91450840658811828e04f5501bf3fe87f012d297bdd88acfeffffff01e4250000000000001976a914f005b469eb92525da0294247b5d0ae169efd78f588ac2e377452
這是具有塊高度的原始交易:
0200000001ab306f83a06f006f76695f0911fbe095d2443798f232e91e7a78e8bbf2050ec40000000087473044022011704ab11cf526e656aaf681c9ab2c3002fd8a3982383afcad8ec46af68f099d022061c06671dcc7cf6e192c541b4692a809ea97711ed2866c004780054028cc5237012103803a5bbbe00dad7dbb29dd5f4d7883ac049bad52d78b456cda12591e26ae70241c00b17576a91450840658811828e04f5501bf3fe87f012d297bdd88acfeffffff01e4250000000000001976a914f005b469eb92525da0294247b5d0ae169efd78f588acfbb22400
您的交易輸入有一個使用
OP_CHECKLOCKTIMEVERIFY
. 此操作碼獲取堆棧頂部的項目並將其值與事務中給出的鎖定時間進行比較。但是,由於鎖定時間可以是高度或時間戳,它還會檢查比較是比較兩個高度還是兩個時間戳,而不是兩者。所以它應用相同的高度和時間戳模式切換規則。如果您更詳細地查看redeemScript,我們會發現它在 之前推了一個 0
OP_CHECKLOCKTIMEVERIFY
,因此 0 是要比較的鎖定時間。由於 0 小於 500,000,000,因此該值被解釋為高度鎖定時間為 0。但是您的事務鎖定時間大於門檻值,因此它被解釋為時間戳。由於無法比較高度和時間戳,腳本解釋器在這裡拋出錯誤,導致交易無效。因此,使用此腳本的唯一方法是專門使用基於高度的鎖定時間。