Hinzufügen eines zweiten Pool Owners mit Hardware Wallet
Es macht Sinn, den private Key in einen Hardware Ledger zu speichern. Im folgenden eine kleine Anleitung, wie man dies für einen Cardano Stake Pool macht, wenn man einen zweiten Pool Owner hinzufügt.
Warnung: Die folgende Anleitung greift erst nach 2 Epochen. Der Stake kann also nicht sofort von der Mnemonic- oder CLI-Methode überwiesen werden, sondern wir müssen 2 Epochen warten.
Schritt 1: wir delegierern die ADAS des zweiten pool owner zum Stake Pool.
Dies kann per Daedalus, Adalite oder Yoroi passieren.
Schritt 2: Cardano-HW-CLI installieren (Lokaler PC oder block producer node):
# Hardware Wallet works with Trezor and Ledger Nano S/X # Reference https://github.com/vacuumlabs/cardano-hw-cli/blob/develop/docs/installation.md cd $NODE_HOME wget https://github.com/vacuumlabs/cardano-hw-cli/releases/download/v1.2.0/cardano-hw-cli_1.2.0-1.deb sudo dpkg --install ./cardano-hw-cli_1.2.0-1.deb
Schritt 3: Exportieren der Hardware Wallet staking keys (Lokaler PC oder block producer node):
cardano-hw-cli address key-gen --path 1852H/1815H/0H/2/0 --verification-key-file hw-stake.vkey --hw-signing-file hw-stake.hwsfile
Kopiere den hw-stake.vkey zum cold environment.
Schritt 4: Update des stake pool registration certicate (cold environment):
Dies fügt die neue hardware wallet owner adresse zum pool hinzu. Dies wird zwei Dinge schützen, den pool pledge und den pool reward account.
Unterer Code muss für die eigenen Bedürfnisse natürlich angepasst werden:
cardano-cli stake-pool registration-certificate \ --cold-verification-key-file $HOME/cold-keys/node.vkey \ --vrf-verification-key-file vrf.vkey \ --pool-pledge 2000000000 \ --pool-cost 345000000 \ --pool-margin 0.00 \ --pool-reward-account-verification-key-file hw-stake.vkey \ --pool-owner-stake-verification-key-file stake.vkey \ --pool-owner-stake-verification-key-file hw-stake.vkey \ --mainnet \ --single-host-pool-relay <dns based relay, example ~ relaynode1.myadapoolnamerocks.com> \ --pool-relay-port 6000 \ --metadata-url <url where you uploaded poolMetaData.json> \ --metadata-hash $(cat poolMetaDataHash.txt) \ --out-file pool.cert
Jetzt das pool.cert zum hot environment kopieren.
Schritt 5: Die Transaktion der neuen Registrierung vorbereiten (Block Producer Node):
Ab hier Block Producer Node:
Den momentanen tip herausfinden:
currentSlot=$(cardano-cli query tip --mainnet | jq -r '.slot') echo Current Slot: $currentSlot
Die Balances und UTXOs herausfinden:
cardano-cli query utxo \ --address $(cat payment.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}
Das build-raw transaction Kommando durchführen:
cardano-cli transaction build-raw \ ${tx_in} \ --mary-era \ --tx-out $(cat payment.addr)+${total_balance} \ --invalid-hereafter $(( ${currentSlot} + 10000)) \ --fee 0 \ --certificate-file pool.cert \ --out-file tx.tmp
Die minimum fee berechnen:
fee=$(cardano-cli transaction calculate-min-fee \ --tx-body-file tx.tmp \ --tx-in-count ${txcnt} \ --tx-out-count 1 \ --mainnet \ --witness-count 4 \ --byron-witness-count 0 \ --protocol-params-file params.json | awk '{ print $1 }') echo fee: $fee
Die neuen output berechnen:
txOut=$((${total_balance}-${fee})) echo txOut: ${txOut}
Baue die Transaktion:
cardano-cli transaction build-raw \ ${tx_in} \ --mary-era \ --tx-out $(cat payment.addr)+${txOut} \ --invalid-hereafter $(( ${currentSlot} + 10000)) \ --fee ${fee} \ --certificate-file pool.cert \ --out-file tx-pool.raw
Die tx-pool.raw Transaktion, zum signieren, zum cold environment kopieren.
Schritt 6: Die Transaktion signieren (cold environment):
Dies ist eine multi signature transaction, wir signieren diese durch witnesses.
Wir benötigen 4 witnesses:
- node.skey
- hw-stake.hwsfile
- stake.skey
- payment.skey
Kreiere ein witness mit dem node.skey:
cardano-cli transaction witness \ --tx-body-file tx-pool.raw \ --signing-key-file node.skey \ --mainnet \ --out-file node.witness
Kreiere ein witness mit dem stake.skey:
cardano-cli transaction witness \ --tx-body-file tx-pool.raw \ --signing-key-file stake.skey \ --mainnet \ --out-file stake.witness
Kreiere ein witness mit dem payment.skey:
cardano-cli transaction witness \ --tx-body-file tx-pool.raw \ --signing-key-file payment.skey \ --mainnet \ --out-file payment.witness
Jetzt den tx-pool.raw zum lokalen PC oder block producer node kopieren – dahin, wo das hardware wallet device mit verbunden ist. Sicherstellen, dass die hardware wallet verbunden und freigeschaltet ist.
Auf dem lokalen PC oder block producer:
cardano-hw-cli transaction witness --tx-body-file tx-pool.raw --hw-signing-file hw-stake.hwsfile --mainnet --out-file hw-stake.witness
Die Datei hw-stake.witness zum cold environment kopieren:
cardano-cli transaction assemble \ --tx-body-file tx-pool.raw \ --witness-file node.witness \ --witness-file stake.witness \ --witness-file payment.witness \ --witness-file hw-stake.witness \ --out-file tx-pool.multisign
Die Datei tx-pool.multisign zum hot environment kopieren.
Schritt 7: Sende die Transaktion (hot environment):
cardano-cli transaction submit \ --tx-file tx-pool.multisign \ --mainnet
Die upgedatete Pool Information kann jetzt auf adapools.org überprüft werden. Die Hardware Wallet sollte nun als 2. Pool Owner erscheinen.
Erweiterte Metadaten für Adapools
Es ist sinnvoll die Metadaten des Pools durch erweiterte Informationen zu ergänzen.
Die Metadaten werden im Zertifikat des Pools mit eingebrannt. Um die Metadaten eines Pools zu ändern, muss das Zertifikat also neu hochgeladen werden. Dazu muss der Prozess der Zertifikatserstellung so wie hier oder hier neu durchgemacht werden. Dort dann entsprechend die neuen Metadaten angeben.
Hierzu muss ein Feld “extended” mit der URL zu den erweiterten Metadaten im json-Format angelegt werden.
Schritt 1: Metadaten um das extended Feld ergänzen:
{ "name": "Financial Refuge", "description": "We stand for a free and decentralised financial system. A financial system without central banks and government controlled money.", "ticker": "FIRE", "homepage": "https://financialrefuge.com", "extended": "https://financialrefuge.com/ext_metadata.json" }
Schritt 2: Einen extended Metadata File erstellen:
{ "info": { "url_png_icon_64x64": "https://financialrefuge.com/FIRE_Logo_poolMetadata_64_64.png", "url_png_logo": "https://financialrefuge.com/FIRE_Logo_poolMetadata.png", "location": "Germany", "social": { "twitter_handle": "FinancialRefuge", "telegram_handle": "fire_pool" }, "company": { "name": "LunarisApps", "country": "Germany" }, "about": { "me": "We believe in a free and decentralized monetary system, free from inflation, government control and central banking. The current financial system is broken and excludes a large part of humanity from fair access. Banking the unbanked!", "server": "2 Relay Nodes + Block Producer | HW configuration CPU:4core|RAM:12GB|SSD:128GB" } }, "my-pool-ids": { "0": "3ef2fd2433dd22627c88a1667232e48996c96563ec57d9d1631b07a2" }, "when-satured-then-recommend": { "0": "small pools to support decentralisation"" } }
Schritt 3: Hash für den Metadaten file erstellen
cardano-cli stake-pool metadata-hash --pool-metadata-file poolMetaData.json > poolMetaDataHash.txt
Schritt 4: extendet Metadaten auf einen öffentlich erreichbaren Server hochladen
Schirtt 5: Das Pool registration certificate neu erstellen
Dies ist notwendig, weil sich die Metadaten und damit der Hash-Wert der Metadaten geändert haben.
Im Falle eines Pools mit 2 Ownern und einer davon ein hardware key, wird die oben verlinkte Anleitung ab Schritt 4 durchgeführt.
Für einen pool mit 2 Ownern würde es wie hier beschrieben gehen und das Kommando so aussehen. Die 500 Ada ersteinlage müssen nicht wieder gezahlt werden.
cardano-cli stake-pool registration-certificate \ --cold-verification-key-file $HOME/cold-keys/node.vkey \ --vrf-verification-key-file vrf.vkey \ --pool-pledge 1000000000 \ --pool-cost 345000000 \ --pool-margin 0.10 \ --pool-reward-account-verification-key-file hw-stake.vkey \ --pool-owner-stake-verification-key-file stake.vkey \ --pool-owner-stake-verification-key-file hw-stake.vkey \ --mainnet \ --single-host-pool-relay <dns based relay, example ~ relaynode1.myadapoolnamerocks.com> \ --pool-relay-port 6000 \ --metadata-url <url where you uploaded poolMetaData.json> \ --metadata-hash $(cat poolMetaDataHash.txt) \ --out-file pool.cert
Nachdem das neue Zertifikat hochgeladen ist, läuft der Pool mit erweiterten Metadaten.
quellen:
https://adapools.org/login/spo/3ef2fd2433dd22627c88a1667232e48996c96563ec57d9d1631b07a2/meta
https://a.adapools.org/extended-example
https://financialrefuge.com/poolMetaData.json
https://charity-pool.ro/metadata.json
https://charity-pool.ro/ext_metadata.json
https://www.coincashew.com/coins/overview-ada/guide-how-to-build-a-haskell-stakepool-node#18-4-changing-the-pledge-fee-margin-etc