Tx stake address

Transacción de registro de dirección stake o participación.

Nos movemos al directorio donde tenemos los certificados:

cd
cd cnode/keys

Añadir fondos a la stake pool

El siguiente paso es enviar fondos reales de tu billetera personal a la dirección recién creada paymentwithstake.addr.

Como mínimo tienes que enviar un valor superior a la suma del depósito + pledge + comisión. El pledge es el grado de compromiso económico con el que un operador crea una stake pool, es decir, con este mecanismo el operador se convierte en el primero en delegar una cantidad determinada de ADAs.

  1. Obtenemos el valor de la dirección.

cat paymentwithstake.addr

2. Enviamos los fondos a la dirección anterior.

Puedes comprobar el estado de la transacción directamente desde cardano explorer.

Antes de continuar, tus nodos deben estar completamente sincronizados con la blockchain. De lo contrario, no verá los nuevos fondos.

Obtener los parámetros del protocolo:

cardano-cli query protocol-parameters \
    --mainnet \
    --out-file protocol.json

Obtener la cantidad de deposito necesario

poolDeposit=$(cat protocol.json | jq -r '.keyDeposit')
echo $poolDeposit

Vamos a obtener el balance total de ADAs y UTXOs, de esta forma comprobamos que la transacción de depósito está correctamente registrada en la blockchain:

cardano-cli query utxo \
    --address $(cat paymentwithstake.addr) \
    --mainnet > fullUtxo.out
    
tail -n +3 fullUtxo.out | sort -k3 -nr > balance.out

cat balance.out

tx_in=""
total_balance=0
while read -r utxo; do
    in_addr=$(awk '{ print $1 }' <<< "${utxo}")
    idx=$(awk '{ print $2 }' <<< "${utxo}")
    utxo_balance=$(awk '{ print $3 }' <<< "${utxo}")
    total_balance=$((${total_balance}+${utxo_balance}))
    echo TxHash: ${in_addr}#${idx}
    echo ADA: ${utxo_balance}
    tx_in="${tx_in} --tx-in ${in_addr}#${idx}"
done < balance.out
txcnt=$(cat balance.out | wc -l)
echo Total ADA balance: ${total_balance}
echo Number of UTXOs: ${txcnt}

El balance y los UTXOs dependen de que previamente hayas realizado la transacción de depósito desde tu billetera personal.

Tenemos creado hasta el momento los siguientes certificados:

stake.vkey stake.skey stake.addr payment.vkey payment.skey paymentwithstake.addr

Necesitamos registrar nuestro stake key en la blockchain. Para lograr esto, necesitamos:

  1. Crear un certificado de registro.

  2. Determinar su tiempo de vida (TTL).

  3. Calcular la comisión de transacción y depósitos necesarios.

  4. Finalmente, registrar el certificado en la blockchain con una transacción.

Crear un certificado de registro.

A partir de la clave de verificación stake.vkey

cardano-cli stake-address registration-certificate \
    --stake-verification-key-file stake.vkey \
    --out-file stake.cert

Una vez creado el certificado, debemos incluirlo en una transacción para que quede registrado en la blockchain.

Determinar su tiempo de vida (TTL) o validez de la transacción.

El tiempo de vida TTL determina cuánto tiempo tiene de validez la transacción hasta que es procesada y confirmada. En el caso de que termine el tiempo TTL y la transacción no se haya realizado, esta se cancela. El tiempo se mide en slots.

Necesitamos el TIP actual de la blockchain, es decir, el número del último slot producido. Buscamos el valor unSlotNo

cardano-cli query tip --mainnet

{ "blockNo": 4544573, "headerHash": "543341083bcf1bc258c082487fcfbb27a203c5a72378d94618749ee46c1bb772", "slotNo": 5575640 }

También podemos extraer el valor directamente:

currentSlot=$(cardano-cli query tip --mainnet | jq -r '.slot')

echo $currentSlot

5575640

Entonces, en este momento, el último slot producido hasta el momento es el 5575640.

Cada slot dura 1 segundo. Queremos una ventana de tiempo suficientemente grande para que se complete la transacción, por ejemplo 1200 slots, entonces tendremos un TTL de 5575640 + 1200 = 5576840 . Con esto conseguimos que nuestra transacción pueda verificarse solo hasta el slot 5576840.

2000000

Calcular la tarifa de comisión

Recuerda que, el balance y los UTXOs dependen de que previamente hayas realizado al menos una transacción de depósito desde tu billetera personal a la dirección paymentwithstake.addr.

Nada mas ejecutarse el comando, el primer parámetro ${tx_in} recoge la transacción de entrada. En caso de no haber ejecutado el depósito te aparecerá un error del estilo:

Missing: --tx-in TX-IN

Build a transaction (low-level, inconvenient)

Para calcular la tarifa o comisión de transacción vamos a tomar como ejemplo la información del depósito, de la que obtenemos los UTXOs, mas concretamente el valor tx_in, que debe coincidir con el de tu billetera personal.

cardano-cli transaction build-raw \
    ${tx_in} \
    --tx-out $(cat paymentwithstake.addr)+0 \
    --invalid-hereafter $(( ${currentSlot} + 1200)) \
    --fee 0 \
    --out-file tx.tmp \
    --certificate stake.cert

Una vez generada la transacción de ejemplo tx.tmp

fee=$(cardano-cli transaction calculate-min-fee \
    --tx-body-file tx.tmp \
    --tx-in-count ${txcnt} \
    --tx-out-count 1 \
    --mainnet \
    --witness-count 1 \
    --byron-witness-count 0 \
    --protocol-params-file protocol.json | awk '{ print $1 }')

echo $fee

197665

Asegúrese de que su balance sea mayor que el costo fee + poolDeposit o no funcionará.

Calcula el cambio, txOut debe ser un valor positivo.

txOut=$((${total_balance}-${poolDeposit}-${fee}))
echo Change Output: ${txOut}

Change Output: 4526616946

Ahora, creamos la transacción que registrará la dirección de participación o stake address.

cardano-cli transaction build-raw \
    ${tx_in} \
    --tx-out $(cat paymentwithstake.addr)+${txOut} \
    --invalid-hereafter $(( ${currentSlot} + 10000)) \
    --fee ${fee} \
    --certificate-file stake.cert \
    --out-file tx.raw

Se genera el archivo tx.rawque representa la transacción.

Firmamos la transacción con las claves secretas de pago y participación payment.skey stake.skey.

cardano-cli transaction sign \
    --tx-body-file tx.raw \
    --signing-key-file payment.skey \
    --signing-key-file stake.skey \
    --mainnet \
    --out-file tx.signed

Finalmente, mandamos la transacción firmada a la red.

cardano-cli transaction submit \
    --tx-file tx.signed \
    --mainnet

Última actualización

¿Te fue útil?