Diseño de Staking de Bitcoin con Autocustodia
Antecedentes
La metodología para integrar el staking de Bitcoin se centra en el código CLTV timelock OP_CODE, nativo de Bitcoin. CLTV es una operación del script de Bitcoin que restringe que las salidas de transacciones sean gastadas hasta que se alcance un tiempo absoluto o altura de bloque especificada. Al crear una transacción con un script CLTV, los poseedores de Bitcoin pueden hacer que sus monedas sean temporalmente no gastables mientras incluyen metadatos que permiten a Core reconocer su participación en el consenso. Este mecanismo aprovecha las capacidades de scripting existentes de Bitcoin sin requerir ninguna modificación al protocolo de Bitcoin.

Requisitos para la Validez de la Transacción
- Para crear una transacción de bloqueo temporal válida que los relayers de Core reconozcan, los usuarios deben:
- Crear una transacción de Bitcoin donde la salida se envíe a su propia dirección utilizando la función nativa de timelock CLTV de Bitcoin
- Especificar la cantidad de Bitcoin que desean bloquear temporalmente para la delegación a un validador de Core
- Incluir una salida
OP_RETURNque contenga dos datos críticos:- La dirección del validador de Core al que desean apoyar
- La dirección Core donde quieren recibir las recompensas en tokens CORE
- Requisitos Mínimos:
- Cantidad: Al usar la interfaz oficial de staking, se debe bloquear temporalmente un mínimo de 0.01 BTC (excluyendo las comisiones de transacción).
- Duración: El período mínimo de bloqueo temporal es de 24 horas, aunque la interfaz de staking de Core recomienda un mínimo de 5 días para una participación óptima
- Implementación técnica: No existen requisitos mínimos al crear transacciones de bloqueo temporal manualmente, aunque se recomiendan los mismos parámetros para una participación efectiva
Flujo de Transacciones
Las operaciones de Self-Custodial Bitcoin Staking se realizan en dos cadenas de bloques separadas: Bitcoin y Core. El siguiente diagrama de flujo ilustra el proceso para que los poseedores de Bitcoin ganen recompensas de staking a través del Self-Custodial Bitcoin Staking de Core.

Estructura de la Transacción
Transacción de staking
Una transacción de staking en Bitcoin debe tener dos o tres salidas, que son
- Una salida de tipo
P2SH/P2WSH, con un script de canje con bloqueo por tiempo habilitado - Una salida de tipo
OP_RETURN, con la información de staking de Core - (Opcional) Una dirección de cambio
Tenga en cuenta que no hay restricciones sobre las entradas.

Transacción de retiro
El UTXO bloqueado (Bitcoins) puede ser gastado usando el script de canje una vez que finaliza el timelock.

Diseño del Script
Salida P2SH/P2WSH
-
Core admite salidas tanto de tipo
P2SHcomoP2WSHpara el staking de Bitcoin. -
La construcción de una salida de tipo
P2SHes la siguienteOP_HASH160 <RIPEMD160(SHA256(RedeemScript))> OP_EQUAL
-
La construcción de una salida de tipo
P2WSHes la siguienteOP_0 <SHA256(RedeemScript)>
Script de Canje
El RedeemScript debe comenzar con un timelock CLTV. A continuación, se presentan algunos tipos comunes.
-
Cuando se utiliza una clave pública
<CLTV timelock> OP_CLTV OP_DROP <pubKey> OP_CHECKSIGy el script de desbloqueo correspondiente en la transacción de retiro es<sig> <RedeemScript> -
Cuando se utiliza un hash de clave pública (más recomendado)
<CLTV timelock> OP_CLTV OP_DROP OP_DUP OP_HASH160 <pubKey Hash> OP_EQUALVERIFY OP_CHECKSIGy el script de desbloqueo correspondiente en la transacción de retiro es<sig> <pubKey> <RedeemScript> -
Cuando se utiliza la dirección de firma múltiple
<CLTV timelock> OP_CLTV OP_DROP M <pubKey1> <pubKey2> ... <pubKeyN> N OP_CHECKMULTISIGy 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.
Para ser elegible para el staking autocustodiado de BTC en Core, los requisitos mínimos de participación dependen del método elegido. Si se utiliza la interfaz del sitio web oficial, los usuarios deben hacer staking de al menos 0.01 BTC (excluyendo las comisiones de transacción). Al hacer staking mediante script, no hay un requisito mínimo de cantidad. Asimismo, la duración mínima del staking también varía según el método. La interfaz del sitio web oficial requiere un mínimo de 5 días, mientras que el staking a través del script no tiene ningún requisito de bloqueo.
Salida OP_RETURN
La salida OP_RETURN debe contener toda la información de staking en orden y debe componerse con el siguiente formato:
OP_RETURN: identificador0x6aLENGTH: representa el tamaño total en bytes después del opcodeOP_RETURN. Nota: todos los datos deben incluir su byte(s) de longitud correspondiente.Satoshi Plus Identifier: (SAT+) 4 bytesVersion: (0x01) 1 byteChain ID: (1114 para Core Testnet2 y 1116 para Core Mainnet) 2 bytesDelegator: La dirección principal para recibir recompensas, 20 bytesValidator: Dirección del validador de Core al que se delega, 20 bytesFee: Comisión para el relayer, 1 byte, rango [0,255], medida en CORERedeemScript: usado para redimir el BTC en staking una vez que el timelock expira.- (Opcional)
Timelock: 4 bytes
Nota: Se debe incluir el RedeemScript. Además, si se incluye el Timelock, debe estar en formato Little Endian.
Puntos Clave
- Cualquier byte que pueda traducirse a un número debe usar
OP_number({0}debe usarOP_0en lugar de0x0100,{16}debe usarOP_16en lugar de0x0110) - Cualquier byte con longitudes menores que
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
0x4cse 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 longitud mayor a
255utiliza0x4d(OP_PUSHDATA2) - Cualquier byte con longitud mayor a
65535(0xffff) utiliza0x4e(OP_PUSHDATA4)
Ya sea el RedeemScript o el Timelock deben estar disponibles. Esto permite a los relayers obtener el RedeemScript y enviar transacciones en Core. Si se proporciona un RedeemScript, el relayer lo utilizará directamente. De lo contrario, el relayer construirá el redeem script basado en el timelock y la información contenida en los inputs de la transacción. Puedes encontrar más información sobre el rol del relayer en la siguiente sección.
Rol de los Relayers
En un sentido estricto, el proceso de Self-Custodial Bitcoin Staking consiste en dos pasos
- Realizar el stake en la red de Bitcoin
- Enviar la transacción de staking confirmada a Core
Para hacer que todo el proceso sea más conveniente, Core introduce el rol de los relayers. Los relayers pueden ayudar a los usuarios a enviar las transacciones a la red de Core después de la confirmación de la transacción de staking en la red de Bitcoin. Dado que es necesario verificar la transacción en la red de Core mediante el cliente ligero de Bitcoin embebido, los relayers necesitan obtener el RedeemScript correspondiente de la salida P2SH/P2WSH. Para cumplir con este requerimiento, sugerimos a los usuarios que
- Si el
RedeemScriptes corto, colócalo completo al final de la salidaOP_RETURN. Por ejemplo, unRedeemScriptse puede construir utilizando un public key hash, como se muestra en el ejemplo siguiente. - Configura la dirección receptora de la transacción de staking como tu propia dirección, para que los relayers puedan extraer información útil del input de la transacción y componer el
RedeemScriptpor sí mismos. Ejemplo.- Si es una dirección normal, la
pubkeyopubkey hashdebe configurarse como la clave pública correspondiente del input al construir elRedeemScript. - Si se trata de una dirección de firmas múltiples, la clave pública de la dirección de firmas múltiples correspondiente se debe configurar al construir el
RedeemScript.
- Si es una dirección normal, la
Ejemplos de Transacción
Transacción de staking
https://mempool.space/tx/9f5c66d5f90badafd537df44326f270aa64b7cc877ef68c3b69ed436870a3512
-3841227c1adc420360ffe0e500eea671.png)
Salida P2WSH
Esta es la salida de staking y es una dirección estándar P2WSH. El redeem script utilizado para esta salida 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 redeem script P2PKH normal, excepto que comienza con un timelock 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 3dd731ae1c3ce32cfbec4ea82c855e027adf5fddca6d0 118029b0ba15e44e0e9.
Aquí hay una herramienta en línea para generar el valor hash P2WSH sha256 a partir del script de canje, mediante el cual puede verificar el cálculo anterior: https://www.btcschools.net/bitcoin/bitcoin_tool_sha256.php
Salida OP_RETURN
El hex completo de esta salida es 6a4c505341542b01045bde60b7d0e6b758ca5dd8c61d377a2c5f1af51ec1a9e209f5ea0036c8c2f41078a3cebee57d8a47d501041f5e0e66b17576a914c4b8ae927ff2b9ce218e20bf06d425d6b68424fd88ac , donde
6aes el código de operación op_return4c50es la longitud total de bytes después del opcodeOP_RETURN[1]5341542bSAT+, que es satoshi plus identificador01es la versión045b1115, que es la identificación de la cadena (1115 para Core Testnet y 1116 para Core Mainnet)de60b7d0e6b758ca5dd8c61d377a2c5f1af51ec1es la dirección de recompensaa9e209f5ea0036c8c2f41078a3cebee57d8a47d5es la dirección del validador01es la tarifa de relayer, medida en CORE041f5e0e66b17576a914c4b8ae927ff2b9ce218e20bf06d425d6b68424fd88aces un script de canje, que se explica en la sección anterior.
[1] Cualquier cantidad de bytes mayor o igual a 0x4c se inserta usando 0x4c (es decir, OP_PUSHDATA) seguido de la longitud seguida de los datos (byte[80] -> OP_PUSHDATA + 80 + byte[80])
Transacción de retiro
https://mempool.space/tx/dc02ddc54ff82ba561f4d82429338d1df50377fcce0725bc764b9b2562d10832
Esta transacción gastó la salida P2WSH con time-lock de la transacción de staking mencionada anteriormente
-f86fe8b3f6ddc2a7e1e02cf96fe124de.png)
En la entrada, se proporciona el redeem script
041f5e0e66b17576a914c4b8ae927ff2b9ce218e20bf06d425d6b68424fd88ac para gastar la salida. 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ó con éxito.
Nota: > Próximamente se proporcionarán ejemplos de código para construir las transacciones de staking y retiro en la red de Bitcoin.