Script

腳本中的時間編碼 (BIP65) 是如何進行的?

  • December 30, 2019

BIP65 有幾個例子,其中 OP_CHECKLOCKTIMEVERIFY 解釋堆棧中它下面的時間值,例如

<expiry time> CHECKLOCKTIMEVERIFY DROP DUP HASH160 <pubKeyHash> EQUALVERIFY CHECKSIG

這個腳本中的時間值是如何編碼的?這是一個CScriptNum對象,但我不確定這是否等同於小端字節

來自比特幣維基

堆棧保存字節向量。當用作數字時,字節向量被解釋為 little-endian 可變長度整數,其中最高有效位確定整數的符號。因此 0x81 代表 -1。0x80 是零的另一種表示形式(所謂的負 0)。正 0 由空長度向量表示。字節向量被解釋為布爾值,其中 False 由零的任何表示表示,True 由非零的任何表示表示。

這並沒有說明如何將一個以上的字節組合成一個整數。例如,要表示整數 278,堆棧將具有:

0x02 0x1601

並表示整數 -278:

0x02 0x1681

最高有效字節 (0x01) 只是與 (0x80) 異或,以將符號變為負數。

現在我們知道腳本整數是如何編碼的,我們只需要了解它們是如何解釋的。這顯示在 BIP65 程式碼中:

// There are two types of nLockTime: lock-by-blockheight
// and lock-by-blocktime, distinguished by whether
// nLockTime < LOCKTIME_THRESHOLD.
//
// We want to compare apples to apples, so fail the script
// unless the type of nLockTime being tested is the same as
// the nLockTime in the transaction.
if (!(
     (txTo.nLockTime <  LOCKTIME_THRESHOLD && nLockTime <  LOCKTIME_THRESHOLD) ||
     (txTo.nLockTime >= LOCKTIME_THRESHOLD && nLockTime >= LOCKTIME_THRESHOLD)
    ))
   return false;

LOCKTIME_THRESHOLDUTC時間在哪裡:

LOCKTIME_THRESHOLD = 500000000; // Tue Nov  5 00:53:20 1985 UTC

因此,基本上,您可以在 scriptPubKey 中設置 OP_CLTV 驗證的時間。如果低於LOCKTIME_THRESHOLD,則根據包含交易的塊的塊號進行比較。如果高於LOCKTIME_THRESHOLD,則根據包含交易的區塊的區塊時間進行比較。請注意,這依賴於共識規則,即交易不能包含nLockTime在未來具有鎖定時間( )的塊中。

引用自:https://bitcoin.stackexchange.com/questions/39119