Creando una transacción OP_CSV con bitcoinjs

Estoy trabajando en una herramienta para la generación de contratos de tiempo limitado. Mi script de canje se ve así:

OP_HASH160 <revocationHash> OP_EQUAL
OP_IF
    <bobPubKey>
OP_ELSE
    <timeDelay> OP_CHECKSEQUENCEVERIFY OP_DROP
    <alicePubKey>
OP_ENDIF
OP_CHECKSIG

El objetivo es que Alice pueda gastar los fondos después de un tiempo de retraso, mientras que Bob puede gastarlos en cualquier momento demostrando el conocimiento de la preimagen hash.

Gastar a través del hash de revocación es bastante fácil. Sin embargo, tengo problemas para construir una transacción que gaste en función del bloqueo de tiempo y está resultando más difícil. Esencialmente, mis preguntas son:

  1. ¿Qué <timeDelay>representa el valor? ¿Cómo puedo, por ejemplo, bloquear los fondos para 2 bloques?
  2. Por lo que he leído, se debe establecer el número de secuencia en la transacción de gasto. Pero, ¿en qué se debe configurar?
  3. ¿ Cómo implemento prácticamente esto usando bitcoinjs-libu otra biblioteca?

Respuestas (3)

En bitcoin-js podrías hacer algo como esto

aliceToBobRedeemScript =  bitcoin.script.compile([,
bitcoin.opcodes.OP_IF,
  bitcoin.opcodes.OP_HASH160,
  aliceSecretHash,
  bitcoin.opcodes.OP_EQUALVERIFY,
  bobPrivKey.getPublicKeyBuffer(),
bitcoin.opcodes.OP_ELSE,
  bitcoin.script.number.encode(10),
  bitcoin.opcodes.OP_NOP3,
  bitcoin.opcodes.OP_DROP, 
  alicePrivKey.getPublicKeyBuffer(),
bitcoin.opcodes.OP_ENDIF,
bitcoin.opcodes.OP_CHECKSIG
]);

hay un código de muestra en una demostración antigua de atomicswap, no tiene csv pero muestra otras cosas, como cómo firmar transacciones personalizadas, etc.

https://github.com/rubensayshi/counterparty-p2sh-demo/blob/master/atomic-swap.js#L163-L185

una actualización de bitcoin-js también tiene una práctica bip68 lib en github github.com/bitcoinjs/bip68 , por lo que podría hacer algo como esto ` var secuenciaNumber = bip68.encode({ segundos: timeToLock }); bitcoin.script.number.encode(número de secuencia), bitcoin.opcodes.OP_NOP3, bitcoin.opcodes.OP_DROP, `

siguiendo el enlace https://github.com/bitcoin/bips/blob/master/bip-0112.mediawiki :

1.) el timeDelay en su ejemplo representa dos posibilidades:

// There are two kinds of nSequence: lock-by-blockheight
// and lock-by-blocktime, distinguished by whether
// nSequenceMasked < CTxIn::SEQUENCE_LOCKTIME_TYPE_FLAG.

2.) cuando obtengo esto correctamente, está relacionado con BIP68. Originalmente, nSequence debería permitir modificar un tx mientras está en el mempool, cuando el valor es menor que 0xFFFFFFFF. Con CSV, ahora hay un tiempo relativo después del punto en que el tx ingresa a la cadena de bloques. Gastar la UTXO con CSV requiere que haya transcurrido una cierta cantidad de bloques. Mientras que el tx normal establecería nSequence en 0xFFFFFFFF, el uso de CSV requiere que sea 0xFFFFFFFE o menos. Lectura adicional recomendada :-)

3.) No tengo idea, tal vez otros expertos conozcan una biblioteca que admita CLTV y CSV...

Para responder a la pregunta: ¿Qué representa el valor de timeDelay? ¿Cómo puedo, por ejemplo, bloquear los fondos para 2 bloques?

Por favor vea el siguiente ejemplo usando bitcoinjs:

let bip68 = require('bip68')

bip68.encode({ bloques: 54 }) // => 0x00000036

bip68.encode({ bloques: 200 }) // => 0x000000c8 Además, vea el siguiente enlace: https://github.com/bitcoinjs/bip68