Wie wird die Zeit in Skripten codiert (BIP65)?

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 CScriptNumObjekt, aber ich bin mir nicht sicher, ob das Little-Endian-Bytes entspricht

Antworten (1)

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_THRESHOLDist 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.