Skip to content

Commit e7ef10a

Browse files
committed
Enhance SPO creation tool
And move it to tools subfolder.
1 parent 9aaa033 commit e7ef10a

File tree

2 files changed

+205
-179
lines changed

2 files changed

+205
-179
lines changed

mithril-infra/assets/tools/create-cardano-spo.sh

Lines changed: 0 additions & 179 deletions
This file was deleted.
Lines changed: 205 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,205 @@
1+
#!/usr/bin/env bash
2+
3+
# Script for creating a cardano pool (SPO) / Tests only
4+
## Inspired from https://docs.cardano.org/development-guidelines/operating-a-stake-pool/creating-a-stake-pool
5+
6+
NETWORK=$1
7+
NETWORK_MAGIC=$2
8+
CARDANO_NODE=$3
9+
SIGNER_NODE=$4
10+
SIGNER_TICKER=$5
11+
DOMAIN=$6
12+
POOL_ARTIFACTS_DIR=/pool
13+
POOL_ARTIFACTS_DIR_PREFIX=./data/${NETWORK}/${SIGNER_NODE}/cardano
14+
POOL_WWW_DIR=/www
15+
16+
# Cardano cli function
17+
CARDANO_CLI_CMD() {
18+
docker exec ${CARDANO_NODE} cardano-cli ${@}
19+
}
20+
21+
# 1. Create keys and addresses
22+
## Create payment keypair
23+
CARDANO_CLI_CMD address key-gen \
24+
--verification-key-file ${POOL_ARTIFACTS_DIR}/payment.vkey \
25+
--signing-key-file ${POOL_ARTIFACTS_DIR}/payment.skey
26+
27+
## Create stake keypair
28+
CARDANO_CLI_CMD stake-address key-gen \
29+
--verification-key-file ${POOL_ARTIFACTS_DIR}/stake.vkey \
30+
--signing-key-file ${POOL_ARTIFACTS_DIR}/stake.skey
31+
32+
## Create payment address
33+
CARDANO_CLI_CMD address build \
34+
--payment-verification-key-file ${POOL_ARTIFACTS_DIR}/payment.vkey \
35+
--stake-verification-key-file ${POOL_ARTIFACTS_DIR}/stake.vkey \
36+
--out-file ${POOL_ARTIFACTS_DIR}/payment.addr \
37+
--testnet-magic $NETWORK_MAGIC
38+
39+
## Create stake address
40+
CARDANO_CLI_CMD stake-address build \
41+
--stake-verification-key-file ${POOL_ARTIFACTS_DIR}/stake.vkey \
42+
--out-file ${POOL_ARTIFACTS_DIR}/stake.addr \
43+
--testnet-magic $NETWORK_MAGIC
44+
45+
# 2. Generate your stake pool keys
46+
## Generate Cold Keys and a Cold_counter
47+
CARDANO_CLI_CMD node key-gen \
48+
--cold-verification-key-file ${POOL_ARTIFACTS_DIR}/cold.vkey \
49+
--cold-signing-key-file ${POOL_ARTIFACTS_DIR}/cold.skey \
50+
--operational-certificate-issue-counter-file ${POOL_ARTIFACTS_DIR}/opcert.counter
51+
52+
## Generate VRF Key pair
53+
CARDANO_CLI_CMD node key-gen-VRF \
54+
--verification-key-file ${POOL_ARTIFACTS_DIR}/vrf.vkey \
55+
--signing-key-file ${POOL_ARTIFACTS_DIR}/vrf.skey
56+
57+
## Generate the KES Key pair
58+
CARDANO_CLI_CMD node key-gen-KES \
59+
--verification-key-file ${POOL_ARTIFACTS_DIR}/kes.vkey \
60+
--signing-key-file ${POOL_ARTIFACTS_DIR}/kes.skey
61+
62+
## Generate the Operational Certificate
63+
### Compute KES period
64+
### Replace /home/curry/docker/cardano-configurations/network/preview w/ /config
65+
PROTOCOL_FILE=/home/curry/docker/cardano-configurations/network/preview/genesis/shelley.json
66+
SLOTS_KES_PERIOD=$(cat $PROTOCOL_FILE | jq .slotsPerKESPeriod)
67+
SLOT=$(CARDANO_CLI_CMD query tip --testnet-magic $NETWORK_MAGIC | jq .slot)
68+
KES_PERIOD=`expr $SLOT / $SLOTS_KES_PERIOD`
69+
70+
### Generate Operational Certificate
71+
CARDANO_CLI_CMD node issue-op-cert \
72+
--kes-verification-key-file ${POOL_ARTIFACTS_DIR}/kes.vkey \
73+
--cold-signing-key-file ${POOL_ARTIFACTS_DIR}/cold.skey \
74+
--operational-certificate-issue-counter ${POOL_ARTIFACTS_DIR}/opcert.counter \
75+
--kes-period $KES_PERIOD \
76+
--out-file ${POOL_ARTIFACTS_DIR}/opcert.cert
77+
78+
### Create a registration certificate
79+
CARDANO_CLI_CMD stake-address registration-certificate \
80+
--stake-verification-key-file ${POOL_ARTIFACTS_DIR}/stake.vkey \
81+
--out-file ${POOL_ARTIFACTS_DIR}/stake.cert
82+
83+
### Send funds to / Check utxo payment address
84+
echo Send funds to "$(cat ${POOL_ARTIFACTS_DIR_PREFIX}${POOL_ARTIFACTS_DIR}/payment.addr)" at https://docs.cardano.org/cardano-testnet/tools/faucet
85+
while true
86+
do
87+
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`
88+
if [ $UTXO_ROWS_NUMBER -gt 0 ] ; then
89+
echo ">>>> Funds Received!"
90+
break
91+
else
92+
echo ">>>> Waiting for Funds..."
93+
sleep 10
94+
fi
95+
done
96+
97+
98+
### Register stake address on chain
99+
AMOUNT_STAKED=1000000000
100+
#### Build transaction
101+
CARDANO_CLI_CMD transaction build \
102+
--babbage-era \
103+
--tx-in $(CARDANO_CLI_CMD query utxo \
104+
--testnet-magic $NETWORK_MAGIC \
105+
--address $(cat ${POOL_ARTIFACTS_DIR_PREFIX}${POOL_ARTIFACTS_DIR}/payment.addr) | tail -n 1 | awk '{print $1;}')#0 \
106+
--tx-out $(cat ${POOL_ARTIFACTS_DIR_PREFIX}${POOL_ARTIFACTS_DIR}/payment.addr)+${AMOUNT_STAKED} \
107+
--change-address $(cat ${POOL_ARTIFACTS_DIR_PREFIX}${POOL_ARTIFACTS_DIR}/payment.addr) \
108+
--testnet-magic $NETWORK_MAGIC \
109+
--certificate-file ${POOL_ARTIFACTS_DIR}/stake.cert \
110+
--invalid-hereafter $(( $SLOT + 100000 )) \
111+
--out-file ${POOL_ARTIFACTS_DIR}/stake-registration.txbody \
112+
--witness-override 2
113+
114+
#### Sign transaction
115+
CARDANO_CLI_CMD transaction sign \
116+
--signing-key-file ${POOL_ARTIFACTS_DIR}/payment.skey \
117+
--signing-key-file ${POOL_ARTIFACTS_DIR}/stake.skey \
118+
--testnet-magic $NETWORK_MAGIC \
119+
--tx-body-file ${POOL_ARTIFACTS_DIR}/stake-registration.txbody \
120+
--out-file ${POOL_ARTIFACTS_DIR}/stake-registration.tx
121+
122+
#### Submit transaction
123+
CARDANO_CLI_CMD transaction submit \
124+
--tx-file ${POOL_ARTIFACTS_DIR}/stake-registration.tx \
125+
--testnet-magic $NETWORK_MAGIC
126+
127+
### Register stake pool on chain
128+
129+
#### Create pool metadata
130+
cat > ${POOL_ARTIFACTS_DIR_PREFIX}${POOL_WWW_DIR}/pool-metadata.json << EOF
131+
{
132+
"name": "Mithril Signer ${SIGNER_TICKER}",
133+
"description": "Mithril signer node ${SIGNER_TICKER}",
134+
"ticker": "${SIGNER_TICKER}",
135+
"homepage": "https://mithril.network"
136+
}
137+
EOF
138+
POOL_METADATA_HASH=$(CARDANO_CLI_CMD stake-pool metadata-hash --pool-metadata-file ${POOL_WWW_DIR}/pool-metadata.json)
139+
140+
#### Generate stake pool registration certificate
141+
POOL_PLEDGE=$AMOUNT_STAKED
142+
POOL_COST=$(cat $PROTOCOL_FILE | jq .protocolParams.minPoolCost)
143+
POOL_MARGIN=0.1
144+
POOL_METADATA_URL=$(curl -s https://tinyurl.com/api-create.php?url=https://${SIGNER_NODE}.${DOMAIN}/pool-metadata.json)
145+
POOL_RELAY_URL="https://${SIGNER_NODE}.${DOMAIN}/"
146+
147+
CARDANO_CLI_CMD stake-pool registration-certificate \
148+
--cold-verification-key-file ${POOL_ARTIFACTS_DIR}/cold.vkey \
149+
--vrf-verification-key-file ${POOL_ARTIFACTS_DIR}/vrf.vkey \
150+
--pool-pledge $POOL_PLEDGE \
151+
--pool-cost $POOL_COST \
152+
--pool-margin $POOL_MARGIN \
153+
--pool-reward-account-verification-key-file ${POOL_ARTIFACTS_DIR}/stake.vkey \
154+
--pool-owner-stake-verification-key-file ${POOL_ARTIFACTS_DIR}/stake.vkey \
155+
--testnet-magic $NETWORK_MAGIC \
156+
--single-host-pool-relay $POOL_RELAY_URL \
157+
--metadata-url $POOL_METADATA_URL \
158+
--metadata-hash $POOL_METADATA_HASH \
159+
--out-file ${POOL_ARTIFACTS_DIR}/pool-registration.cert
160+
161+
#### Generate delegation certificate pledge
162+
CARDANO_CLI_CMD stake-address delegation-certificate \
163+
--stake-verification-key-file ${POOL_ARTIFACTS_DIR}/stake.vkey \
164+
--cold-verification-key-file ${POOL_ARTIFACTS_DIR}/cold.vkey \
165+
--out-file ${POOL_ARTIFACTS_DIR}/delegation.cert
166+
167+
#### Submit the pool certificate and delegation certificate to the blockchain
168+
##### Build transaction
169+
STAKE_ADDRESS_DEPOSIT=$(cat $PROTOCOL_FILE | jq .protocolParams.poolDeposit)
170+
CARDANO_CLI_CMD transaction build \
171+
--babbage-era \
172+
--tx-in $(CARDANO_CLI_CMD query utxo \
173+
--testnet-magic $NETWORK_MAGIC \
174+
--address $(cat ${POOL_ARTIFACTS_DIR_PREFIX}${POOL_ARTIFACTS_DIR}/payment.addr) | tail -n 1 | awk '{print $1;}')#1 \
175+
--tx-out $(cat ${POOL_ARTIFACTS_DIR_PREFIX}${POOL_ARTIFACTS_DIR}/payment.addr)+$STAKE_ADDRESS_DEPOSIT \
176+
--change-address $(cat ${POOL_ARTIFACTS_DIR_PREFIX}${POOL_ARTIFACTS_DIR}/payment.addr) \
177+
--invalid-hereafter $(( $SLOT + 100000 )) \
178+
--out-file ${POOL_ARTIFACTS_DIR}/pool-registration.txbody \
179+
--certificate-file ${POOL_ARTIFACTS_DIR}/pool-registration.cert \
180+
--certificate-file ${POOL_ARTIFACTS_DIR}/delegation.cert \
181+
--witness-override 4 \
182+
--testnet-magic $NETWORK_MAGIC
183+
184+
#### Sign transaction
185+
CARDANO_CLI_CMD transaction sign \
186+
--signing-key-file ${POOL_ARTIFACTS_DIR}/payment.skey \
187+
--signing-key-file ${POOL_ARTIFACTS_DIR}/stake.skey \
188+
--signing-key-file ${POOL_ARTIFACTS_DIR}/cold.skey \
189+
--testnet-magic $NETWORK_MAGIC \
190+
--tx-body-file ${POOL_ARTIFACTS_DIR}/pool-registration.txbody \
191+
--out-file ${POOL_ARTIFACTS_DIR}/pool-registration.tx
192+
193+
#### Submit transaction
194+
CARDANO_NODE_SOCKET_PATH=$CARDANO_NODE_SOCKET_PATH CARDANO_CLI_CMD transaction submit \
195+
--tx-file ${POOL_ARTIFACTS_DIR}/pool-registration.tx \
196+
--testnet-magic $NETWORK_MAGIC
197+
198+
### Compute Pool Id
199+
POOL_ID=$(CARDANO_CLI_CMD stake-pool id --cold-verification-key-file ${POOL_ARTIFACTS_DIR}/cold.vkey)
200+
echo $POOL_ID > ${POOL_ARTIFACTS_DIR_PREFIX}${POOL_ARTIFACTS_DIR}/pool-id.txt
201+
echo POOL_ID=$POOL_ID
202+
203+
### Delegate stakes to the pool
204+
echo Delegate stakes to pool id "$POOL_ID" at https://docs.cardano.org/cardano-testnet/tools/faucet
205+

0 commit comments

Comments
 (0)