Diseño de participación de Bitcoin sin custodia
Fondo
La metodología para integrar el staking de Bitcoin se centra en el tiempo de bloqueo CLTV. El bloqueo de tiempo OP_CHECKLOCKTIMEVERIFY
(CLTV) es un código de operación específico utilizado en el lenguaje de programación de Bitcoin que permite crear condiciones basadas en el tiempo o la altura del bloque antes de que se puedan gastar bitcoins desde el resultado de una transacción. Esto proporciona una manera de crear salidas con bloqueo de tiempo, lo que significa que no se pueden gastar hasta que se cumpla una determinada condición relacionada con el tiempo o la altura del bloque.
Requisitos para la validez de las transacciones
- Para que una transacción de Bitcoin se considere válida y sea recogida por los Relayers, los usuarios deben asegurarse de que la transacción se envíe a su dirección y, utilizando la función de bloqueo de tiempo nativa de Bitcoin, especificar el monto de bloqueo que se pretende delegar al validador en la cadena de bloques Core, como salida de la transacción.
- La transacción también debe contener una salida
op_return
que especifique- La transacción también debe contener una salida
op_return
que especifique. - La dirección a la que el staker desea que se envíen sus recompensas en tokens CORE.
- La transacción también debe contener una salida
- Para que las apuestas sean elegibles en Core, existen requisitos mínimos para la cantidad de BTC que se puede apostar. Los usuarios deben apostar al menos 0,01 Bitcoin (menos las tarifas de transacción).
Flujo de trabajo de transacciones
Las operaciones de staking de Bitcoin sin custodia se llevan a cabo en dos cadenas de bloques independientes: Bitcoin y Core. El siguiente diagrama de flujo ilustra el flujo de trabajo para que los poseedores de Bitcoin ganen recompensas de staking a través del staking de Bitcoin sin custodia de Core.
Estructura de transacción
Transacción de apuesta
Una transacción de participación de Bitcoin debe tener dos o tres resultados, que son
- Salida tipo
P2SH/P2WSH
, con secuencia de comandos de canje habilitada para bloqueo de tiempo - Salida tipo
OP_RETURN
, con información de apuesta central - (Opcional) Cambiar dirección
(Opcional) Cambiar dirección.
Transacción de retiro
Los UTXO (Bitcoins) bloqueados se pueden gastar usando el script de canje cuando finaliza el bloqueo de tiempo.
Diseño de guión
Salida P2SH/P2WSH
-
Core admite salidas
P2SH
yP2WSH
para apostar Bitcoin. -
La construcción de la salida tipo
P2SH
es la siguienteOP_HASH160 <RIPEMD160(SHA256(RedeemScript))> OP_EQUAL
-
La construcción de la salida tipo
P2WSH
es la siguienteOP_0 <SHA256(RedeemScript)>
Canjear Script
El RedeemScript
debería comenzar con un bloqueo de tiempo CLTV. A continuación se muestran algunos tipos comunes.
-
Cuando se utiliza una clave pública
<CLTV timelock> OP_CLTV OP_DROP <pubKey Hash> OP_CHECKSIG
y el script de desbloqueo correspondiente en la transacción de retiro es<sig> <pubKey>
-
Cuando se utiliza un hash de clave pública (el más recomendado)
<CLTV timelock> OP_CLTV OP_DROP OP_DUP OP_HASH160 <pubKey Hash> OP_EQUALVERIFY OP_CHECKSIG
y el script de desbloqueo correspondiente en la transacción de retiro es<sig> <pubKey> <RedeemScript>
-
Al utilizar la dirección multifirma
<CLTV timelock> OP_CLTV OP_DROP M <pubKey1> <pubKey2> ... <pubKeyN> N OP_CHECKMULTISIG
y el script de desbloqueo correspondiente en la transacción de retiro esOP_0 <sig1>... <sigM> <RedeemScript>
La cantidad y duración de Bitcoin bloqueada en esta salida se utilizarán para el cálculo de la elección del validador y la distribución de recompensas en Core.
Existen requisitos mínimos sobre la cantidad de BTC que se puede apostar para ser elegible para la apuesta de BTC no custodial en Core. Un usuario debe apostar al menos 0,01 Bitcoin (sin incluir las tarifas de transacción).
OP_RETURN Salida
La salida OP_RETURN
debe contener toda la información de staking en orden y estar compuesta en el siguiente formato:
OP_RETURN
: identificador0x6a
LENGTH
: que representa la longitud total de bytes después del código de operaciónOP_RETURN
. Tenga en cuenta que todos los datos deben enviarse con sus bytes de tamaño apropiado.Identificador Satoshi Plus
: (SAT+) 4 bytesVersión
: (0x01) 1 byteID de cadena
: (1115 para Core Testnet y 1116 para Core Mainnet) 2 bytesDelegator
: La dirección principal para recibir recompensas, 20 bytesValidador
: La dirección del validador principal a la que apostar, 20 bytesTarifa
: Tarifa por retransmisor, 1 byte, rango [0,255], medido en CORERedeemScript
: se utiliza para canjear BTC apostados después de que expire el bloqueo de tiempo.- (Opcional)
Canjear script
Nota: Se debe incluir RedeemScript. Además, si se incluye Timelock, primero se requiere Little Endian.
Puntos clave
- Cualquier byte que pueda traducirse a un número debe usar
OP_number
({0}
debe usarOP_0
en lugar de0x0100
,{16}
debe usarOP_16
en lugar de0x0110
) - Cualquier byte con longitudes menores a
0x4c (76)
se envía con 1 byte igual al tamaño(byte[10] -> 10 + byte[10]; byte[70] -> 70 + byte[70])
- Cualquier byte mayor o igual a
0x4c
se envía usando0x4c
(es decir,OP_PUSHDATA
) seguido de la longitud seguida de los datos(byte[80] -> OP_PUSHDATA + 80 + byte[80])
- Cualquier byte con una longitud mayor que
255
usa0x4d
(OP_PUSHDATA2
) - Cualquier byte con una longitud mayor que
65535
(0xffff
) usa0x4e
(OP_PUSHDATA4
)
Debe estar disponible RedeemScript o Timelock. Esto permite a los Relayers obtener el «RedeemScript» y enviar transacciones en Core. Si se proporciona un RedeemScript
, el retransmisor lo utilizará directamente. De lo contrario, el retransmisor construirá el script de canje basándose en el bloqueo de tiempo y la información en las entradas de la transacción. Puede encontrar más información sobre la función del retransmisor en la sección siguiente.
Papel de los Relayers
En sentido estricto, el proceso de staking de Bitcoin sin custodia consta de dos pasos
- Participación en la red Bitcoin
- Envíe la transacción de staking de Bitcoin confirmada a Core
Para que todo el proceso sea más cómodo, Core introduce el rol de Relayers. Los Relayers pueden ayudar a los usuarios a enviar transacciones a la red central después de la confirmación de la transacción de participación en la red Bitcoin. Dado que es necesario verificar la transacción en la red central con el cliente Bitcoin Light integrado, los Relayers deben obtener el RedeemScript correspondiente de la salida P2SH/P2WSH
. Para cumplir con este requisito, sugerimos a los usuarios
- Si el
RedeemScript
es corto, coloque el RedeemScript completo al final de la salidaOP_RETURN
. Por ejemplo, un «RedeemScript» se construye utilizando un hash de clave pública, como se muestra en el ejemplo a continuación. - Establezca la dirección de recepción de la transacción de staking como propia para que los Relayers puedan extraer información útil de la entrada de la transacción y componer el
RedeemScript
por sí mismos. P.ej.- Si es una dirección normal, la
pubkey
o elpubkey hash
debe configurarse como la clave pública correspondiente de la entrada al construir elRedeemScript
. - Si se trata de una dirección multifirma, la clave pública de la dirección multifirma correspondiente debe configurarse al construir el
RedeemScript
.
- Si es una dirección normal, la
Ejemplos de transacciones
Transacción de apuesta
https://mempool.space/tx/9f5c66d5f90badafd537df44326f270aa64b7cc877ef68c3b69ed436870a3512
Salida P2WSH
Esta es la salida de replanteo y es una dirección P2WSH estándar. El script de canje utilizado para este resultado es 041f5e0e66b17576a914c4b8ae927ff2b9ce218e20bf06d425d6b68424fd88ac
OP_PUSHBYTES_4 1f5e0e66
OP_CLTV
OP_DROP
OP_DUP
OP_HASH160
OP_PUSHBYTES_20 c4b8ae927ff2b9ce218e20bf06d425d6b68424fd
OP_EQUALVERIFY
OP_CHECKSIG
El script se parece mucho a un script de canje P2PKH
normal, excepto que comienza con un bloqueo de tiempo OP_PUSHBYTES_4 1f5e0e66 OP_CLTV OP_DROP
.
El hash del script de canje utilizado en esta salida de P2WSH es SHA256(041f5e0e66b17576a914c4b8ae927ff2b9ce218e20bf06d425d6b68424fd88ac)
que resulta en 3dd731ae1c3ce32cfbec4ea82c855e027adf5fddca6d0118029b0ba15e44e0e9
.
El hash del script de canje utilizado en esta salida de P2WSH es Sha256(041f5e0e66b17576a914c4b8ae927ff2b9ce218e20bf06d425d6b68424fd88ac)
que resulta en 3dd731ae1c3ce32cfbec4ea82c855e027adf5fddca6d0118029b0ba15e44e0e9
Salida OP_RETURN
El hexadecimal completo de esta salida es 6a4c505341542b01045bde60b7d0e6b758ca5dd8c61d377a2c5f1af51ec1a9e209f5ea0036c8c2f41078a3cebee57d8a47d501041f5e0e66b17576a91 4c4b8ae927ff2b9ce218e20bf06d425d6b68424fd88ac
, donde
6a
es el código de operación op_return4c50
es la longitud total de bytes después del código de operaciónOP_RETURN
[1]5341542b
SAT+, que es satoshi plus identificador01
es la versión045b
1115, que es la identificación de la cadena (1115 para Core Testnet y 1116 para Core Mainnet)de60b7d0e6b758ca5dd8c61d377a2c5f1af51ec1
es la dirección de recompensaa9e209f5ea0036c8c2f41078a3cebee57d8a47d5
es la dirección del validador01
es la tarifa de retransmisión, medida en CORE041f5e0e66b17576a914c4b8ae927ff2b9ce218e20bf06d425d6b68424fd88ac
es un script de canje, que se explica en la sección anterior.
041f5e0e66b17576a914c4b8ae927ff2b9ce218e20bf06d425d6b68424fd88ac
es un script de rescate, que se explica en la sección anterior
Transacción de retiro
[https://mempool.space/tx/dc02ddc54ff82ba561f4d82429338d1df50377fcce0725bc764b9b2562d10832](https://mempool.space/tx/10182ad08fdb0469ab3d91d1bb340c7b0cbd858ad8865 f6b6ddf76e3806ba889)
This transaction spent the P2WSH time-lock output from the above staking transaction
En la entrada, se proporciona el script de canje 041f5e0e66b17576a914c4b8ae927ff2b9ce218e20bf06d425d6b68424fd88ac
para gastarlo. Dado que el bloqueo de tiempo 1f5e0e66
(660e5e1f después de revertir bytes, que es la marca de tiempo Unix 1712217631) ya expiró, el UTXO se gastó correctamente.
Nota> Pronto se proporcionarán ejemplos de código para la construcción de transacciones de participación y retiro en la red Bitcoin.