BIP65 hat mehrere Beispiele, wo OP_CHECKLOCKTIMEVERIFY den Zeitwert darunter im Stack interpretiert, zum Beispiel :
<expiry time> CHECKLOCKTIMEVERIFY DROP DUP HASH160 <pubKeyHash> EQUALVERIFY CHECKSIG
Wie ist der Zeitwert in diesem Skript codiert? Es ist ein CScriptNum
Objekt, aber ich bin mir nicht sicher, ob das Little-Endian-Bytes entspricht
Aus dem Bitcoin-Wiki :
Die Stapel enthalten Byte-Vektoren. Wenn sie als Zahlen verwendet werden, werden Byte-Vektoren als Little-Endian-Ganzzahlen variabler Länge interpretiert, wobei das höchstwertige Bit das Vorzeichen der Ganzzahl bestimmt. Somit steht 0x81 für -1. 0x80 ist eine andere Darstellung von Null (sogenannte negative 0). Positive 0 wird durch einen Vektor der Länge Null dargestellt. Byte-Vektoren werden als boolesche Werte interpretiert, wobei False durch eine beliebige Darstellung von Null und True durch eine beliebige Darstellung von Nicht-Null dargestellt wird.
Was dies nicht sagt, ist, wie mehr als ein Byte zu einer Ganzzahl kombiniert wird. Um beispielsweise die Ganzzahl 278 darzustellen, hätte der Stapel Folgendes:
0x02 0x1601
Und um die Ganzzahl -278 darzustellen:
0x02 0x1681
Das höchstwertige Byte (0x01) wurde nur mit (0x80) XOR-verknüpft, um das Vorzeichen ins Negative zu ändern.
Jetzt, da wir wissen, wie Skript-Ganzzahlen codiert werden, müssen wir nur verstehen, wie sie interpretiert werden. Dies wird im BIP65-Code angezeigt:
// 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;
Wo LOCKTIME_THRESHOLD
ist die UTC-Zeit:
LOCKTIME_THRESHOLD = 500000000; // Tue Nov 5 00:53:20 1985 UTC
Grundsätzlich können Sie also die Zeit festlegen, die OP_CLTV im scriptPubKey überprüft. Wenn es unter ist LOCKTIME_THRESHOLD
, wird es basierend auf der Blocknummer des Blocks verglichen, der die Transaktion enthält. Wenn es über ist LOCKTIME_THRESHOLD
, wird es basierend auf der Blockzeit des Blocks verglichen, der die Transaktion enthält. Beachten Sie, dass dies auf der Konsensregel beruht, dass Transaktionen in Zukunft nicht mehr in einen Block mit einer Sperrzeit ( nLockTime
) aufgenommen werden können.