¿Cómo se codifica el tiempo (BIP65) en los scripts?

BIP65 tiene varios ejemplos donde OP_CHECKLOCKTIMEVERIFY interpreta el valor de tiempo debajo de él en la pila, por ejemplo :

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

¿Cómo se codifica el valor del tiempo en este script? Es un CScriptNumobjeto, pero no estoy seguro si equivale a bytes little endian.

Respuestas (1)

De la wiki de Bitcoin :

Las pilas contienen vectores de bytes. Cuando se utilizan como números, los vectores de bytes se interpretan como enteros de longitud variable little-endian, y el bit más significativo determina el signo del entero. Por lo tanto, 0x81 representa -1. 0x80 es otra representación de cero (llamado 0 negativo). El 0 positivo está representado por un vector de longitud nula. Los vectores de bytes se interpretan como valores booleanos, donde False se representa con cualquier representación de cero y True se representa con cualquier representación distinta de cero.

Lo que esto no dice es cómo más de un byte se combina en un número entero. Por ejemplo, para representar el entero 278, la pila tendría:

0x02 0x1601

Y para representar el entero -278:

0x02 0x1681

El byte más significativo (0x01) fue simplemente XOR con (0x80) para cambiar el signo a negativo.

Ahora que sabemos cómo se codifican los enteros del script, solo tenemos que entender cómo se interpretan. Esto se muestra en el código 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;

¿Dónde LOCKTIME_THRESHOLDestá la hora UTC?

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

Entonces, básicamente, puede establecer la hora en que OP_CLTV verificará en el scriptPubKey. Si está por debajo LOCKTIME_THRESHOLDde , se compara según el número de bloque del bloque que contiene la transacción. Si está por encima de LOCKTIME_THRESHOLD, se compara según el tiempo de bloque del bloque que contiene la transacción. Tenga en cuenta que esto se basa en la regla de consenso de que las transacciones no se pueden incluir en un bloque con un tiempo de bloqueo ( nLockTime) en el futuro.