Skip to content

Commit

Permalink
Merge pull request #2053 from input-output-hk/jpraynaud/fix-cardano-n…
Browse files Browse the repository at this point in the history
…ode-10.1

Fix: era markers and pool tools for Cardano `10.1`
  • Loading branch information
jpraynaud authored Oct 25, 2024
2 parents ed246cd + 5f105e8 commit 650e77d
Show file tree
Hide file tree
Showing 10 changed files with 126 additions and 60 deletions.
92 changes: 83 additions & 9 deletions docs/runbook/era-markers/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -33,7 +33,7 @@ export SCRIPT_TX_VALUE=**MINIUM_SCRIPT_TX_VALUE**
A common value for the transaction amount used when a script transaction is made is:

```bash
export SCRIPT_TX_VALUE=2000000
export SCRIPT_TX_VALUE=2100000
```

Compute the network magic parameter that handles both the Cardano mainnet and Cardano test networks:
Expand Down Expand Up @@ -129,7 +129,10 @@ An example output of the command is:
Verify that the payment address has funds:

```bash
$CARDANO_CLI query utxo --address $(cat $CARDANO_WALLET_PATH/payment.addr) $CARDANO_NETWORK_MAGIC --socket-path $CARDANO_NODE_SOCKET_PATH
$CARDANO_CLI $CARDANO_ERA query utxo --address $(cat $CARDANO_WALLET_PATH/payment.addr) $CARDANO_NETWORK_MAGIC --socket-path $CARDANO_NODE_SOCKET_PATH
```

```bash
TxHash TxIx Amount
--------------------------------------------------------------------------------------
f0c0345f151f9365fbbb4e7afa217e56b987d9e91fd754ca609d9dfec97275c7 0 10000000000 lovelace + TxOutDatumNone
Expand All @@ -151,6 +154,9 @@ $CARDANO_CLI $CARDANO_ERA transaction build $CARDANO_NETWORK_MAGIC \
--change-address $(cat $CARDANO_WALLET_PATH/payment.addr) \
--out-file $ASSETS_PATH/tx.raw \
--socket-path $CARDANO_NODE_SOCKET_PATH
```

```bash
Estimated transaction fee: Lovelace 168669
```

Expand All @@ -171,20 +177,29 @@ $CARDANO_CLI $CARDANO_ERA transaction submit \
$CARDANO_NETWORK_MAGIC \
--tx-file $ASSETS_PATH/tx.signed \
--socket-path $CARDANO_NODE_SOCKET_PATH
```

```bash
Transaction successfully submitted.
```

Also get the transaction id:

```bash
$CARDANO_CLI transaction txid --tx-file $ASSETS_PATH/tx.signed
$CARDANO_CLI $CARDANO_ERA transaction txid --tx-file $ASSETS_PATH/tx.signed
```

```bash
6518b3cea0b49b55746ec61148e7c60ab042959d534f6bb6e8f6a844d4af69fb
```

We need to wait a few seconds before the transaction is available and we can see the initial datum for the script address:

```bash
$CARDANO_CLI query utxo --address $(cat $CARDANO_WALLET_PATH/payment.addr) $CARDANO_NETWORK_MAGIC --socket-path $CARDANO_NODE_SOCKET_PATH
$CARDANO_CLI $CARDANO_ERA query utxo --address $(cat $CARDANO_WALLET_PATH/payment.addr) $CARDANO_NETWORK_MAGIC --socket-path $CARDANO_NODE_SOCKET_PATH
```

```bash
TxHash TxIx Amount
--------------------------------------------------------------------------------------
6518b3cea0b49b55746ec61148e7c60ab042959d534f6bb6e8f6a844d4af69fb 0 1500000 lovelace + TxOutDatumInline ReferenceTxInsScriptsInlineDatumsInBabbageEra (ScriptDataConstructor 0 [ScriptDataBytes "[{\"n\":\"thales\",\"e\":1}]",ScriptDataBytes "\165\143\232\227\&6\244e\222\211\187\167\197\167\175\229\181\162o/\182[|Nnt.h\ACKE\241=\242\139\242\182:a\204r\217\200&\190I\SO,\US\DLE\152\217U\223P5\128\164\232\153\181\ETB8\132\227\SO"])
Expand All @@ -196,7 +211,10 @@ Optional: We can retrieve the initial value stored in the datum with the cardano
The full utxo json representation:

```bash
$CARDANO_CLI query utxo --address $(cat $CARDANO_WALLET_PATH/payment.addr) $CARDANO_NETWORK_MAGIC --socket-path $CARDANO_NODE_SOCKET_PATH --out-file temp.json && cat temp.json | jq '. [] | select(.inlineDatum | . != null and . != "")'
$CARDANO_CLI $CARDANO_ERA query utxo --address $(cat $CARDANO_WALLET_PATH/payment.addr) $CARDANO_NETWORK_MAGIC --socket-path $CARDANO_NODE_SOCKET_PATH --out-file temp.json && cat temp.json | jq '.[] | select(.inlineDatum | . != null and . != "")'
```

```bash
{
"address": "addr_test1qzzngukkj9ydjemqjlgfn42sevy2xnvauay46weushlpuq9thd4ray00csjssf4sxftv04xeequ3xfx72nujg9y4d5ysgkxxlh",
"datum": null,
Expand All @@ -219,6 +237,28 @@ $CARDANO_CLI query utxo --address $(cat $CARDANO_WALLET_PATH/payment.addr) $CARD
}
```

The parsed era markers json representation:

```bash
$CARDANO_CLI $CARDANO_ERA query utxo --address $(cat $CARDANO_WALLET_PATH/payment.addr) $CARDANO_NETWORK_MAGIC --socket-path $CARDANO_NODE_SOCKET_PATH --out-file temp.json && cat temp.json | jq -r '.[] | select(.inlineDatum | . != null and . != "")| .inlineDatum.fields[].bytes' | tr '\n' ' ' | xxd -r -p | jq
```

```json
{
"markers": [
{
"name": "thales",
"epoch": 1
},
{
"name": "pythagoras",
"epoch": null
}
],
"signature": "a83a8dee3b875a7e8d259500a8ce14cc73587ef838899d269ad58aadd16086cfe0486528e54b841b3a1d5aa8b7176d55c0803337ca59fbd3654b2bdd5a480d05"
}
```

## Update Era Markers: Write a new version of datum on chain

> [!IMPORTANT]
Expand All @@ -228,7 +268,10 @@ $CARDANO_CLI query utxo --address $(cat $CARDANO_WALLET_PATH/payment.addr) $CARD
Retrieve the utxo of the payment address:

```bash
$CARDANO_CLI query utxo --address $(cat $CARDANO_WALLET_PATH/payment.addr) $CARDANO_NETWORK_MAGIC --socket-path $CARDANO_NODE_SOCKET_PATH
$CARDANO_CLI $CARDANO_ERA query utxo --address $(cat $CARDANO_WALLET_PATH/payment.addr) $CARDANO_NETWORK_MAGIC --socket-path $CARDANO_NODE_SOCKET_PATH
```

```bash
TxHash TxIx Amount
--------------------------------------------------------------------------------------
6518b3cea0b49b55746ec61148e7c60ab042959d534f6bb6e8f6a844d4af69fb 0 1500000 lovelace + TxOutDatumInline ReferenceTxInsScriptsInlineDatumsInBabbageEra (ScriptDataConstructor 0 [ScriptDataBytes "[{\"n\":\"thales\",\"e\":1}]",ScriptDataBytes "\165\143\232\227\&6\244e\222\211\187\167\197\167\175\229\181\162o/\182[|Nnt.h\ACKE\241=\242\139\242\182:a\204r\217\200&\190I\SO,\US\DLE\152\217U\223P5\128\164\232\153\181\ETB8\132\227\SO"])
Expand Down Expand Up @@ -284,14 +327,20 @@ Transaction successfully submitted.
Also get the transaction id:

```bash
$CARDANO_CLI transaction txid --tx-file $ASSETS_PATH/tx.signed
$CARDANO_CLI $CARDANO_ERA transaction txid --tx-file $ASSETS_PATH/tx.signed
```

```bash
1fd4d3e131afe3c8b212772a3f3083d2fbc6b2a7b20e54e4ff08e001598818d8
```

We need to wait a few seconds before the transaction is available and we can see the updated datum for the script address:

```bash
$CARDANO_CLI query utxo --address $(cat $CARDANO_WALLET_PATH/payment.addr) $CARDANO_NETWORK_MAGIC --socket-path $CARDANO_NODE_SOCKET_PATH
$CARDANO_CLI $CARDANO_ERA query utxo --address $(cat $CARDANO_WALLET_PATH/payment.addr) $CARDANO_NETWORK_MAGIC --socket-path $CARDANO_NODE_SOCKET_PATH
```

```bash
TxHash TxIx Amount
--------------------------------------------------------------------------------------
1f139b47017c9c90d4622ac768e249d25d37ad4461db44a20486b7da72a78915 0 2000000 lovelace + TxOutDatumInline ReferenceTxInsScriptsInlineDatumsInBabbageEra (ScriptDataConstructor 0 [ScriptDataBytes "[{\"n\":\"thales\",\"e\":1},{\"n\":\"pythagoras\",\"e\":null}]",ScriptDataBytes "^P\EOT\248k3\196/\139\tU\173H\138\FS\194MD\240\153\227\142z\181\134\213\168\&2\222\219i1\246\NAK\\]\247\154U\143-^vmtq\204\207#\236\213\f\201\&1\152\145(\161\ETX;\183\128\195\r"])
Expand All @@ -303,7 +352,10 @@ We can retrieve the updated value stored in the datum with the cardano cli:
The full utxo json representation:

```bash
$CARDANO_CLI query utxo --address $(cat $CARDANO_WALLET_PATH/payment.addr) $CARDANO_NETWORK_MAGIC --socket-path $CARDANO_NODE_SOCKET_PATH --out-file temp.json && cat temp.json | jq '. [] | select(.inlineDatum | . != null and . != "")'
$CARDANO_CLI $CARDANO_ERA query utxo --address $(cat $CARDANO_WALLET_PATH/payment.addr) $CARDANO_NETWORK_MAGIC --socket-path $CARDANO_NODE_SOCKET_PATH --out-file temp.json && cat temp.json | jq '.[] | select(.inlineDatum | . != null and . != "")'
```

```bash
{
"address": "addr_test1qzzngukkj9ydjemqjlgfn42sevy2xnvauay46weushlpuq9thd4ray00csjssf4sxftv04xeequ3xfx72nujg9y4d5ysgkxxlh",
"datum": null,
Expand All @@ -325,3 +377,25 @@ $CARDANO_CLI query utxo --address $(cat $CARDANO_WALLET_PATH/payment.addr) $CARD
}
}
```

The parsed era markers json representation:

```bash
$CARDANO_CLI $CARDANO_ERA query utxo --address $(cat $CARDANO_WALLET_PATH/payment.addr) $CARDANO_NETWORK_MAGIC --socket-path $CARDANO_NODE_SOCKET_PATH --out-file temp.json && cat temp.json | jq -r '.[] | select(.inlineDatum | . != null and . != "")| .inlineDatum.fields[].bytes' | tr '\n' ' ' | xxd -r -p | jq
```

```json
{
"markers": [
{
"name": "thales",
"epoch": 1
},
{
"name": "pythagoras",
"epoch": 123
}
],
"signature": "a83a8dee3b875a7e8d259500a8ce14cc73587ef838899d269ad58aadd16086cfe0486528e54b841b3a1d5aa8b7176d55c0803337ca59fbd3654b2bdd5a480d05"
}
```
16 changes: 8 additions & 8 deletions mithril-infra/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -154,14 +154,14 @@ In order to retire a stake pool:
- Retire a stake poool with `retire-stake-pool.sh`
| Script | Description | Usage |
| --------------------------- | -------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `create-keys.sh` | Script for creating keys for a Cardano pool (SPO) | `GENESIS_FILE=**YOUR_GENESIS_FILE** ./tools/pool/create-keys.sh` |
| `query-stake-pool.sh` | Script for querying info about a Cardano pool (SPO) | `./tools/pool/query-stake-pool.sh` |
| `register-stake-address.sh` | Script for registering stake address of a Cardano pool (SPO) | `TX_IN=**YOUR_TX_IN** ./tools/pool/register-stake-address.sh` |
| `register-stake-pool.sh` | Script for registering a Cardano stake pool (SPO) | `GENESIS_FILE=**YOUR_GENESIS_FILE** TX_IN=**YOUR_TX_IN** SIGNER_DOMAIN=**YOUR_SIGNER_DOMAIN_NAME** POOL_TICKER=**YOUR_TICKER** ./tools/pool/register-stake-pool.sh` |
| `renew-opcert.sh` | Script for renewing Operational Certificate for a Cardano pool (SPO) | `./tools/pool/renew-opcert.sh` |
| `retire-stake-pool.sh` | Script for retiring a Cardano pool (SPO) | `TX_IN=**YOUR_TX_IN** VALUE_OUT=**YOUR_VALUE_OUT** ./tools/pool/retire-stake-pool.sh` |
| Script | Description | Usage |
| --------------------------- | -------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `create-keys.sh` | Script for creating keys for a Cardano pool (SPO) | `GENESIS_FILE=**YOUR_SHELLEY_GENESIS_FILE** ./tools/pool/create-keys.sh` |
| `query-stake-pool.sh` | Script for querying info about a Cardano pool (SPO) | `./tools/pool/query-stake-pool.sh` |
| `register-stake-address.sh` | Script for registering stake address of a Cardano pool (SPO) | `TX_IN=**YOUR_TX_IN** ./tools/pool/register-stake-address.sh` |
| `register-stake-pool.sh` | Script for registering a Cardano stake pool (SPO) | `GENESIS_FILE=**YOUR_SHELLEY_GENESIS_FILE** TX_IN=**YOUR_TX_IN** SIGNER_DOMAIN=**YOUR_SIGNER_DOMAIN_NAME** POOL_TICKER=**YOUR_TICKER** ./tools/pool/register-stake-pool.sh` |
| `renew-opcert.sh` | Script for renewing Operational Certificate for a Cardano pool (SPO) | `./tools/pool/renew-opcert.sh` |
| `retire-stake-pool.sh` | Script for retiring a Cardano pool (SPO) | `TX_IN=**YOUR_TX_IN** VALUE_OUT=**YOUR_VALUE_OUT** ./tools/pool/retire-stake-pool.sh` |
### Genesis
Expand Down
2 changes: 1 addition & 1 deletion mithril-infra/assets/infra.version
Original file line number Diff line number Diff line change
@@ -1 +1 @@
0.3.5
0.3.6
2 changes: 1 addition & 1 deletion mithril-infra/assets/tools/pool/_prelude.sh
Original file line number Diff line number Diff line change
Expand Up @@ -35,7 +35,7 @@ CARDANO_CLI_CMD() {

# Compute current Cardano era if needed
if [ -z "${CARDANO_ERA}" ]; then
CARDANO_ERA=$(CARDANO_CLI_CMD query tip --testnet-magic $NETWORK_MAGIC | jq -r '.era |= ascii_downcase | .era')
CARDANO_ERA=$(CARDANO_CLI_CMD latest query tip --testnet-magic $NETWORK_MAGIC | jq -r '.era |= ascii_downcase | .era')
fi

# Compute auxiliary env vars
Expand Down
42 changes: 17 additions & 25 deletions mithril-infra/assets/tools/pool/create-keys.sh
Original file line number Diff line number Diff line change
Expand Up @@ -13,85 +13,77 @@ fi

# Create keys and addresses
## Create payment keypair
CARDANO_CLI_CMD address key-gen \
CARDANO_CLI_CMD ${CARDANO_ERA} address key-gen \
--verification-key-file ${POOL_ARTIFACTS_DIR}/payment.vkey \
--signing-key-file ${POOL_ARTIFACTS_DIR}/payment.skey

## Create stake keypair
CARDANO_CLI_CMD stake-address key-gen \
CARDANO_CLI_CMD ${CARDANO_ERA} stake-address key-gen \
--verification-key-file ${POOL_ARTIFACTS_DIR}/stake.vkey \
--signing-key-file ${POOL_ARTIFACTS_DIR}/stake.skey

## Create payment address
CARDANO_CLI_CMD address build \
CARDANO_CLI_CMD ${CARDANO_ERA} address build \
--payment-verification-key-file ${POOL_ARTIFACTS_DIR}/payment.vkey \
--stake-verification-key-file ${POOL_ARTIFACTS_DIR}/stake.vkey \
--out-file ${POOL_ARTIFACTS_DIR}/payment.addr \
--testnet-magic $NETWORK_MAGIC

## Create stake address
CARDANO_CLI_CMD stake-address build \
CARDANO_CLI_CMD ${CARDANO_ERA} stake-address build \
--stake-verification-key-file ${POOL_ARTIFACTS_DIR}/stake.vkey \
--out-file ${POOL_ARTIFACTS_DIR}/stake.addr \
--testnet-magic $NETWORK_MAGIC

# Generate your stake pool keys
## Generate Cold Keys and a Cold_counter
CARDANO_CLI_CMD node key-gen \
CARDANO_CLI_CMD ${CARDANO_ERA} node key-gen \
--cold-verification-key-file ${POOL_ARTIFACTS_DIR}/cold.vkey \
--cold-signing-key-file ${POOL_ARTIFACTS_DIR}/cold.skey \
--operational-certificate-issue-counter-file ${POOL_ARTIFACTS_DIR}/opcert.counter

## Generate VRF Key pair
CARDANO_CLI_CMD node key-gen-VRF \
CARDANO_CLI_CMD ${CARDANO_ERA} node key-gen-VRF \
--verification-key-file ${POOL_ARTIFACTS_DIR}/vrf.vkey \
--signing-key-file ${POOL_ARTIFACTS_DIR}/vrf.skey

## Generate the KES Key pair
CARDANO_CLI_CMD node key-gen-KES \
CARDANO_CLI_CMD ${CARDANO_ERA} node key-gen-KES \
--verification-key-file ${POOL_ARTIFACTS_DIR}/kes.vkey \
--signing-key-file ${POOL_ARTIFACTS_DIR}/kes.skey

## Generate the Operational Certificate
### Compute KES period
SLOT=$(CARDANO_CLI_CMD query tip --testnet-magic $NETWORK_MAGIC | jq .slot)
SLOT=$(CARDANO_CLI_CMD ${CARDANO_ERA} query tip --testnet-magic $NETWORK_MAGIC | jq .slot)
SLOTS_KES_PERIOD=$(cat $GENESIS_FILE | jq .slotsPerKESPeriod)
KES_PERIOD=`expr $SLOT / $SLOTS_KES_PERIOD`
KES_PERIOD=$(( $SLOT / $SLOTS_KES_PERIOD ))

### Generate Operational Certificate
CARDANO_CLI_CMD node issue-op-cert \
CARDANO_CLI_CMD ${CARDANO_ERA} node issue-op-cert \
--kes-verification-key-file ${POOL_ARTIFACTS_DIR}/kes.vkey \
--cold-signing-key-file ${POOL_ARTIFACTS_DIR}/cold.skey \
--operational-certificate-issue-counter ${POOL_ARTIFACTS_DIR}/opcert.counter \
--kes-period $KES_PERIOD \
--out-file ${POOL_ARTIFACTS_DIR}/opcert.cert

### Create a registration certificate
if [ "${CARDANO_ERA}" == "conway"]; then
KEY_REGISTRATION_DEPOSIT_ANOUNT=$(CARDANO_CLI_CMD ${CARDANO_ERA} query gov-state --testnet-magic ${NETWORK_MAGIC} | jq -r .enactState.curPParams.keyDeposit)
# Conway specific creation of registration certificate
CARDANO_CLI_CMD stake-address registration-certificate \
--stake-verification-key-file ${POOL_ARTIFACTS_DIR}/stake.vkey \
--out-file ${POOL_ARTIFACTS_DIR}/stake.cert \
--key-reg-deposit-amt $KEY_REGISTRATION_DEPOSIT_ANOUNT
else
# Legacy creation of registration certificate
CARDANO_CLI_CMD stake-address registration-certificate \
--stake-verification-key-file ${POOL_ARTIFACTS_DIR}/stake.vkey \
--out-file ${POOL_ARTIFACTS_DIR}/stake.cert
fi
KEY_REGISTRATION_DEPOSIT_AMOUNT=$(CARDANO_CLI_CMD ${CARDANO_ERA} query gov-state --testnet-magic ${NETWORK_MAGIC} | jq -r .currentPParams.stakeAddressDeposit)
CARDANO_CLI_CMD ${CARDANO_ERA} stake-address registration-certificate \
--stake-verification-key-file ${POOL_ARTIFACTS_DIR}/stake.vkey \
--out-file ${POOL_ARTIFACTS_DIR}/stake.cert \
--key-reg-deposit-amt $KEY_REGISTRATION_DEPOSIT_AMOUNT


### Compute Pool Id
POOL_ID=$(CARDANO_CLI_CMD stake-pool id --cold-verification-key-file ${POOL_ARTIFACTS_DIR}/cold.vkey)
POOL_ID=$(CARDANO_CLI_CMD ${CARDANO_ERA} stake-pool id --cold-verification-key-file ${POOL_ARTIFACTS_DIR}/cold.vkey)
echo $POOL_ID > ${POOL_ARTIFACTS_DIR_PREFIX}${POOL_ARTIFACTS_DIR}/pool-id.txt
echo POOL_ID=$POOL_ID

### Send funds to / Check utxo payment address
echo Send funds to "$(cat ${POOL_ARTIFACTS_DIR_PREFIX}${POOL_ARTIFACTS_DIR}/payment.addr)" at https://docs.cardano.org/cardano-testnet/tools/faucet
while true
do
UTXO_ROWS_NUMBER=`expr $(CARDANO_CLI_CMD query utxo --address $(cat ${POOL_ARTIFACTS_DIR_PREFIX}${POOL_ARTIFACTS_DIR}/payment.addr) --testnet-magic $NETWORK_MAGIC 2> /dev/null | wc -l) - 2`
UTXO_ROWS_NUMBER=$(( $(CARDANO_CLI_CMD ${CARDANO_ERA} query utxo --address $(cat ${POOL_ARTIFACTS_DIR_PREFIX}${POOL_ARTIFACTS_DIR}/payment.addr) --testnet-magic $NETWORK_MAGIC 2> /dev/null | wc -l) - 2 ))
if [ $UTXO_ROWS_NUMBER -gt 0 ] ; then
echo ">>>> Funds Received!"
break
Expand Down
Loading

0 comments on commit 650e77d

Please sign in to comment.