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:
<timeDelay>
representa el valor? ¿Cómo puedo, por ejemplo, bloquear los fondos para 2 bloques?bitcoinjs-lib
u otra biblioteca?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
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
mandelpato