¿Cómo uso CHECKLOCKTIMEVERIFY para evitar que una transacción se gaste antes de 100 bloques?

Estoy creando una aplicación de lotería basada en Bitcoin. Una entrada a la lotería es una transacción que gasta 1 BTC.

Si alguien adivina algún valor arbitrario correctamente, puede reclamar la entrada y enviar este 1 Btc a una dirección que controle.

Deseo tener la siguiente funcionalidad: si nadie adivina el número correcto después de 100 bloques, entonces puedo reclamarlo como el operador de la lotería.

Puedo hacer esto a través de: Transacción de entrada IF CHECKLOCKTIMEVERIFY pagadero a una conjetura correcta ELSE Pagadero a la clave pública de mi operador FIN

Luego, cuando intento gastar esta transacción de entrada, configuro nLockTime en el bloque actual.

En todo momento configuré todos los números de secuencia en 0xFFF ... Para que las transacciones se extraigan.

Respuestas (1)

Sí, puede usar OP_CHECKLOCKTIMEVERIFYpara hacer que la salida de una transacción no se pueda gastar para una cierta cantidad de bloques. Sin embargo, no puede usarlo directamente en un bloque if-else como lo ha descrito. Cuando OP_CHECKLOCKTIMEVERIFYse ejecuta, no coloca un valor de resultado en la pila. O arroja un error (invalidando la transacción que intenta gastar la salida) o continúa ejecutándose como si nada hubiera pasado.

Para crear una transacción como usted describe, deberá usar multisig, de modo que una de las partes pueda gastar la transacción tan pronto como se proporcione el número correcto (supongo que ingresará a una función hash), O puede volver a gastarlo en usted mismo después de que expire el tiempo de bloqueo. Básicamente, así es como funciona Lightning Network. Debe consultar Lightning Networks Parte II: Contratos de bloqueo de tiempo hash (HTLC)

Gracias por la info. Sin embargo, en la página BIP, Peter Todd sugiere un guión similar al mío, ¿verdad? github.com/bitcoin/bips/blob/master/bip-0065.mediawiki
Sí, sus ejemplos son similares. Solo recuerda que OP_CHECKLOCKTIMEVERIFYes una consecuencia de una condición, no la condición en sí misma. La condición es el 0o 1al final de sus scripts de canje de ejemplo. Eso es lo que determina si OP_CHECKLOCKTIMEVERIFYse llama.
Muchas gracias. Volveré aquí con más preguntas.