Renew KES Keys

Typical procedure for renewing KES keys

UPDATED: 12/12/24 to include conway CLI comands

circle-info

Credits to Earn Coin Poolarrow-up-right for documenting the procedure.

circle-info

Please note: paths in this guide are based on Coincashewarrow-up-right guide on how to build a stake pool. Please adjust paths as necessary.

Step 1 - Find the starting KES period

On node run the following commands:

slotNo=$(cardano-cli conway query tip --mainnet | jq -r '.slot')
slotsPerKESPeriod=$(cat $NODE_HOME/${NODE_CONFIG}-shelley-genesis.json | jq -r '.slotsPerKESPeriod')
kesPeriod=$((${slotNo} / ${slotsPerKESPeriod}))
startKesPeriod=${kesPeriod}
echo startKesPeriod: ${startKesPeriod}
circle-exclamation

Step 2 - Look up Operational Certificate Numbers

There are two different methods you can use, please review and select your preferred method.

When it's time to update your KES you can run the following command on your block producer to confirm you have the correct Operational Certificate Numbers

circle-info

Note path to node.cert and adjust if needed. Path in example is based off Coincashewarrow-up-right guide for setting up a stake pool.

cardano-cli conway query kes-period-info --mainnet  \
  --op-cert-file $NODE_HOME/node.cert

Results should look similar to the following:

✓ The operational certificate counter agrees with the node protocol state counter
✓ Operational certificate's kes period is within the correct KES period interval
{
    "qKesNodeStateOperationalCertificateNumber": 4,
    "qKesCurrentKesPeriod": 505,
    "qKesOnDiskOperationalCertificateNumber": 4,
    "qKesRemainingSlotsInKesPeriod": 6832926,
    "qKesMaxKESEvolutions": 62,
    "qKesKesKeyExpiry": "2022-09-22T21:44:51Z",
    "qKesEndKesInterval": 558,
    "qKesStartKesInterval": 496,
    "qKesSlotsPerKesPeriod": 129600
}
circle-info

This line is the Operational Certificate that your pool used to mint its last block "qKesNodeStateOperationalCertificateNumber": 4,

circle-info

This line is the counter number of your current Operational Certificate: "qKesOnDiskOperationalCertificateNumber": 4,

triangle-exclamation
circle-exclamation

Step 3 - Make a new KES pair

circle-info

KES files in this example with be created to our $NODE_HOME directory. Adjust if needed.

In this step we will create a new KES pair (kes.vkey and kes.skey)

⚠️ON AIR GAPPED MACHINE: run the following commands:

Step 4 - Verify the current value of your node.counter is valid.

⚠️STILL ON AIR GAPPED MACHINE:

navigate to where your node.counter file is. 📁In this example it's located in our home directory in a folder called: cold-keys. So we run this command to output node.counter information.

✍️Take note that "Next certificate issue number: x"

circle-info

node.counter MUST be ONE greater than the most recently created block's OpCertC or "qKesNodeStateOperationalCertificateNumber" value. Depending which method you used in Step 2

For example, if your OpCertC value is 4 for your last block, then your node.counter should read "Next certificate issue number: 5" Likewise if you used CLI method if "qKesNodeStateOperationalCertificateNumber": 4, our node.counter should read "Next certificate issue number: 5"

If your "Next certificate issue number" is one higher you are all set and can continue to the Step 5.

circle-exclamation

Step 5 - Create the new node.cert

⚠️STILL ON AIR GAPPED MACHINE: Create a new node.cert file with the following command.

Update <startKesPeriod> with the value from above from Step 1

Then run this command by replacing "<startKesPeriod>" with correct number from Step 1 Example: --kes-period 503 \

Step 6 - Copy node.cert and kes.skey back to your block producer node.

Copy your new node.cert and kes.skey file to your block producer node

Step 7 - Restart Node on block producer

Now restart cardano node on your block producer with following command

Step 8 - Check if correct

Once you update your KES you can run the following command on your block producer to confirm you have the correct OpCertC

circle-info

Note path to node.cert and adjust if needed. Path in example is based off Coincashewarrow-up-right guide for setting up a stake pool.

Results should look similar to the following:

circle-info

The first line after checks should show last node counter. For our example the last OpCertC number for our last block was 4. So it should read: "qKesNodeStateOperationalCertificateNumber": 4,

circle-check
circle-info

Make note of "qKesKesKeyExpiry": date.

Congratulations you did it!

Step 10 - Back up

If update successful:

circle-info

Best practice recommendation: It's now a good time to make a new backup of your new node.counter file and cold-keys directory to another USB drive or other offline location.

Contributors

Thanks to the following pools for helping to put together these guides. Please consider delegating to their pools to support them. Are you a pool? Consider buying them a coffee

Apex Cardano Pool - Ticker: APEXarrow-up-right

Earn Coin Pool - Ticker: ECParrow-up-right

Envy Stake Pool - Ticker ENVYarrow-up-right

PGWADarrow-up-right

xSPO Alliance Logo xSPO Alliancearrow-up-right

Last updated