Skip to content

Commit ad9def7

Browse files
committed
Add SPO creation tool
1 parent 51da84e commit ad9def7

File tree

1 file changed

+179
-0
lines changed

1 file changed

+179
-0
lines changed
Lines changed: 179 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,179 @@
1+
#!/usr/bin/env bash
2+
3+
# Script for operating a SPO
4+
5+
ARTIFACTS_DIR=pool
6+
NETWORK_MAGIC=2
7+
cd $ARTIFACTS_DIR
8+
9+
# 1. Create keys and addresses
10+
## Create payment keypair
11+
./cardano-cli address key-gen \
12+
--verification-key-file payment.vkey \
13+
--signing-key-file payment.skey
14+
15+
## Create stake keypair
16+
./cardano-cli stake-address key-gen \
17+
--verification-key-file stake.vkey \
18+
--signing-key-file stake.skey
19+
20+
## Create payment address
21+
./cardano-cli address build \
22+
--payment-verification-key-file payment.vkey \
23+
--stake-verification-key-file stake.vkey \
24+
--out-file payment.addr \
25+
--testnet-magic $NETWORK_MAGIC
26+
27+
## Create stake address
28+
./cardano-cli stake-address build \
29+
--stake-verification-key-file stake.vkey \
30+
--out-file stake.addr \
31+
--testnet-magic $NETWORK_MAGIC
32+
33+
# 2. Generate your stake pool keys
34+
## Generate Cold Keys and a Cold_counter
35+
./cardano-cli node key-gen \
36+
--cold-verification-key-file cold.vkey \
37+
--cold-signing-key-file cold.skey \
38+
--operational-certificate-issue-counter-file opcert.counter
39+
40+
## Generate VRF Key pair
41+
./cardano-cli node key-gen-VRF \
42+
--verification-key-file vrf.vkey \
43+
--signing-key-file vrf.skey
44+
45+
## Generate the KES Key pair
46+
./cardano-cli node key-gen-KES \
47+
--verification-key-file kes.vkey \
48+
--signing-key-file kes.skey
49+
50+
## Generate the Operational Certificate
51+
### Compute KES period
52+
### Replace /home/curry/docker/cardano-configurations/network/preview w/ /config
53+
PROTOCOL_FILE=/home/curry/docker/cardano-configurations/network/preview/genesis/shelley.json
54+
SLOTS_KES_PERIOD=$(cat $PROTOCOL_FILE | jq .slotsPerKESPeriod)
55+
SLOT=$(CARDANO_NODE_SOCKET_PATH=../ipc/node.socket ./cardano-cli query tip --testnet-magic $NETWORK_MAGIC | jq .slot)
56+
KES_PERIOD=`expr $SLOT / $SLOTS_KES_PERIOD`
57+
58+
### Generate Operational Certificate
59+
./cardano-cli node issue-op-cert \
60+
--kes-verification-key-file kes.vkey \
61+
--cold-signing-key-file cold.skey \
62+
--operational-certificate-issue-counter opcert.counter \
63+
--kes-period $KES_PERIOD \
64+
--out-file opcert.cert
65+
66+
### Create a registration certificate
67+
./cardano-cli stake-address registration-certificate \
68+
--stake-verification-key-file stake.vkey \
69+
--out-file stake.cert
70+
71+
### Send tokens to / Check utxo payment address
72+
CARDANO_NODE_SOCKET_PATH=../ipc/node.socket
73+
echo Send tokens to '$(cat payment.addr)' at https://docs.cardano.org/cardano-testnet/tools/faucet
74+
watch CARDANO_NODE_SOCKET_PATH=$CARDANO_NODE_SOCKET_PATH ./cardano-cli query utxo --address $(cat payment.addr) --testnet-magic $NETWORK_MAGIC
75+
76+
### Register stake address on chain
77+
AMOUNT_STAKED=1000000000
78+
#### Build transaction
79+
CARDANO_NODE_SOCKET_PATH=$CARDANO_NODE_SOCKET_PATH ./cardano-cli transaction build \
80+
--babbage-era \
81+
--tx-in $(CARDANO_NODE_SOCKET_PATH=$CARDANO_NODE_SOCKET_PATH ./cardano-cli query utxo \
82+
--testnet-magic $NETWORK_MAGIC \
83+
--address $(cat payment.addr) | tail -n 1 | awk '{print $1;}')#0 \
84+
--tx-out $(cat payment.addr)+${AMOUNT_STAKED} \
85+
--change-address $(cat payment.addr) \
86+
--testnet-magic $NETWORK_MAGIC \
87+
--certificate-file stake.cert \
88+
--invalid-hereafter $(( $SLOT + 100000 )) \
89+
--out-file stake-registration.txbody \
90+
--witness-override 2
91+
92+
#### Sign transaction
93+
CARDANO_NODE_SOCKET_PATH=$CARDANO_NODE_SOCKET_PATH ./cardano-cli transaction sign \
94+
--signing-key-file payment.skey \
95+
--signing-key-file stake.skey \
96+
--testnet-magic $NETWORK_MAGIC \
97+
--tx-body-file stake-registration.txbody \
98+
--out-file stake-registration.tx
99+
100+
#### Submit transaction
101+
CARDANO_NODE_SOCKET_PATH=$CARDANO_NODE_SOCKET_PATH ./cardano-cli transaction submit \
102+
--tx-file stake-registration.tx \
103+
--testnet-magic $NETWORK_MAGIC
104+
105+
### Register stake pool on chain
106+
107+
#### Create pool metadata
108+
#### TODO: custom metadata
109+
cat > ./pool-metadata.json << EOF
110+
{
111+
"name": "Mithril Pool 1",
112+
"description": "Mithril Pool 1",
113+
"ticker": "MIT01",
114+
"homepage": "https://mithril.network"
115+
}
116+
EOF
117+
POOL_METADATA_HASH=$(./cardano-cli stake-pool metadata-hash --pool-metadata-file pool-metadata.json)
118+
119+
#### Generate stake pool registration certificate
120+
POOL_PLEDGE=$AMOUNT_STAKED
121+
POOL_COST=$(cat $PROTOCOL_FILE | jq .protocolParams.minPoolCost)
122+
POOL_MARGIN=0.1
123+
POOL_METADATA_URL="https://mithril.network/tbd.json"
124+
POOL_RELAY_URL="https://aggregator.dev-preview.api.mithril.network/"
125+
126+
./cardano-cli stake-pool registration-certificate \
127+
--cold-verification-key-file cold.vkey \
128+
--vrf-verification-key-file vrf.vkey \
129+
--pool-pledge $POOL_PLEDGE \
130+
--pool-cost $POOL_COST \
131+
--pool-margin $POOL_MARGIN \
132+
--pool-reward-account-verification-key-file stake.vkey \
133+
--pool-owner-stake-verification-key-file stake.vkey \
134+
--testnet-magic $NETWORK_MAGIC \
135+
--single-host-pool-relay $POOL_RELAY_URL \
136+
--metadata-url $POOL_METADATA_URL \
137+
--metadata-hash $POOL_METADATA_HASH \
138+
--out-file pool-registration.cert
139+
140+
#### Generate delegation certificate pledge
141+
./cardano-cli stake-address delegation-certificate \
142+
--stake-verification-key-file stake.vkey \
143+
--cold-verification-key-file cold.vkey \
144+
--out-file delegation.cert
145+
146+
#### Submit the pool certificate and delegation certificate to the blockchain
147+
##### Build transaction
148+
STAKE_ADDRESS_DEPOSIT=$(cat $PROTOCOL_FILE | jq .protocolParams.poolDeposit)
149+
CARDANO_NODE_SOCKET_PATH=$CARDANO_NODE_SOCKET_PATH ./cardano-cli transaction build \
150+
--babbage-era \
151+
--tx-in $(CARDANO_NODE_SOCKET_PATH=$CARDANO_NODE_SOCKET_PATH ./cardano-cli query utxo \
152+
--testnet-magic $NETWORK_MAGIC \
153+
--address $(cat payment.addr) | tail -n 1 | awk '{print $1;}')#1 \
154+
--tx-out $(cat payment.addr)+$STAKE_ADDRESS_DEPOSIT \
155+
--change-address $(cat payment.addr) \
156+
--invalid-hereafter $(( $SLOT + 100000 )) \
157+
--out-file pool-registration.txbody \
158+
--certificate-file pool-registration.cert \
159+
--certificate-file delegation.cert \
160+
--witness-override 4 \
161+
--testnet-magic $NETWORK_MAGIC
162+
163+
#### Sign transaction
164+
CARDANO_NODE_SOCKET_PATH=$CARDANO_NODE_SOCKET_PATH ./cardano-cli transaction sign \
165+
--signing-key-file payment.skey \
166+
--signing-key-file stake.skey \
167+
--signing-key-file cold.skey \
168+
--testnet-magic $NETWORK_MAGIC \
169+
--tx-body-file pool-registration.txbody \
170+
--out-file pool-registration.tx
171+
172+
#### Submit transaction
173+
CARDANO_NODE_SOCKET_PATH=$CARDANO_NODE_SOCKET_PATH ./cardano-cli transaction submit \
174+
--tx-file pool-registration.tx \
175+
--testnet-magic $NETWORK_MAGIC
176+
177+
### Compute Pool Id
178+
POOL_ID=$(./cardano-cli stake-pool id --cold-verification-key-file cold.vkey)
179+
echo $POOL_ID

0 commit comments

Comments
 (0)