Script
腳本中的時間編碼 (BIP65) 是如何進行的?
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_THRESHOLD
UTC時間在哪裡:LOCKTIME_THRESHOLD = 500000000; // Tue Nov 5 00:53:20 1985 UTC
因此,基本上,您可以在 scriptPubKey 中設置 OP_CLTV 驗證的時間。如果低於
LOCKTIME_THRESHOLD
,則根據包含交易的塊的塊號進行比較。如果高於LOCKTIME_THRESHOLD
,則根據包含交易的區塊的區塊時間進行比較。請注意,這依賴於共識規則,即交易不能包含nLockTime
在未來具有鎖定時間( )的塊中。