Es ist wichtig, alle Kommandos auszuführen und genau in der gegebenen Reihenfolge auszuführen!
1. Den tip auf der Blockchain herausfinden:
# block producer node currentSlot=$(cardano-cli query tip --mainnet | jq -r '.slot') echo Current Slot: $currentSlot
Das haben wir getan, um den Zeitpunkt angeben zu können, wann die Transaktion nicht mehr valide sein wird.
2. Die Anzahl der zu sendenden Coins in Lovelace angeben, hier 10Millionen Lovelace -> 10 Ada:
# block producer node amountToSend=10000000 echo amountToSend: $amountToSend
Cardano Transaktionen werden im in Lovelaces angeben 1 Ada = 1000000 Lovelace.
3. Die Zieladresse angeben:
# block producer destinationAddress=$(cat destination.addr) echo destinationAddress: $destinationAddress
destination.addr ist eine Datei, in der die Zieladdresse und nur die Zieladdresse in einer Zeile enthalten ist bsp:
addr1qxhazv2dp8yvqwyxxlt7n7ufwhw582uqtcn9llqak736ptfyf8d2zwjceymcq6l5gxht0nx9zwazvtvnn22sl84tgkyq7guw7q
4. die Account Balance und Anzahl der Transaktionen UTXOs herausfinden:
# block producer node 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}
5. Das build-raw transaction command bauen, dieses Kommando erzeugt eine raw Transaktion, in der noch einiges fehlt:
# block producer node cardano-cli transaction build-raw \ ${tx_in} \ --tx-out $(cat payment.addr)+0 \ --tx-out ${destinationAddress}+0 \ --invalid-hereafter $(( ${currentSlot} + 10000)) \ --fee 0 \ --out-file tx.tmp
In der Datei tx.tmp befinden sich jetzt die Informationen, von wo zu wo die Transaktion gehen soll und ab wann sie ungültig wird, wenn sie nicht vorher ausgeführt wird.
6. Netzwerk Parameter abrufen:
cardano-cli query protocol-parameter --mainnet --out-file params.json
7. Jetzt können wir aus dieser tx.tmp heraus die fee berechnen, die wir, für die Transaktion, zu zahlen haben:
# block producer node fee=$(cardano-cli transaction calculate-min-fee \ --tx-body-file tx.tmp \ --tx-in-count ${txcnt} \ --tx-out-count 2 \ --mainnet \ --witness-count 1 \ --byron-witness-count 0 \ --protocol-params-file params.json | awk '{ print $1 }') echo fee: $fee
8. Mit der fee kennen wir jetzt unsere Total Balance, was wir senden möchten und die fee, somit kennen wir den Kontostand nach der Transaktion:
# block producer node txOut=$((${total_balance}-${fee}-${amountToSend})) echo Change Output: ${txOut}
9. Mit all diesen Informationen können wir die Transaktion in endgültiger Form fertigmachen:
cardano-cli transaction build-raw \ ${tx_in} \ --tx-out $(cat payment.addr)+${txOut} \ --tx-out ${destinationAddress}+${amountToSend} \ --invalid-hereafter $(( ${currentSlot} + 10000)) \ --fee ${fee} \ --out-file tx.raw
Die tx.raw Datei kopieren wir jetzt zur Offline-Maschine!
Signieren der Transaktion
10. Wir signieren die Transaktion mit dem Payment Sign Key:
# Offline Maschine cardano-cli transaction sign \ --tx-body-file tx.raw \ --signing-key-file payment.skey \ --mainnet \ --out-file tx.signed
Die signierte Transaktion geht wieder zurück zum Block Producer!
Senden der Transaktion
11. Wir schicken die Transaktion ab:
cardano-cli transaction submit \ --tx-file tx.signed \ --mainnet
Das war es auch “schon”, die Transaktion ist gesendet!
Ergebnis überprüfen
Optional können wir nachsehen, ob alles angekommen ist:
cardano-cli query utxo \ --address ${destinationAddress} \ --mainnet
Die Ausgabe sollte unsere Transaktion anzeigen.