Εξαγωγή ιστορικού συναλλαγών από ένα Viewing Key
Οι περισσότερες εξαγωγές πορτοφολιών είναι ελλιπείς. Η φορολογική εξαγωγή του ZODL, για παράδειγμα, σου δίνει ημερομηνίες, ποσά και τέλη για το προηγούμενο ημερολογιακό έτος, αλλά όχι αναγνωριστικά συναλλαγών, σημειώματα ή διευθύνσεις. Αυτό δεν αρκεί για λογιστική καταχώριση, για έλεγχο μιας μετεγκατάστασης πορτοφολιού ή για να καταλάβεις τι συνέβη σε μια πληρωμή.
Δεν χρειάζεσαι τη φράση ανάκτησης για να έχεις την πλήρη εικόνα. Ένα unified full viewing key (UFVK, που ξεκινά με uview1) μπορεί να δει κάθε εισερχόμενη και εξερχόμενη συναλλαγή σε έναν λογαριασμό, και δύο εργαλεία μπορούν να το μετατρέψουν σε ένα αρχείο που διατηρείς: ο διακομιστής GraphQL του Zkool και το zingo-cli. Αυτός ο οδηγός συγκεντρώνει τις προσεγγίσεις από αυτό το νήμα στο φόρουμ και τις ενημερώνει για τις τρέχουσες εκδόσεις.
Δοκιμάστηκε τον Σεπτέμβριο του 2026 με το Zkool 6.30.0 και το zingo-cli από το zingolib 6.0.0.
Πριν ξεκινήσεις
Χρειάζεσαι δύο πράγματα:
- Το UFVK για τον λογαριασμό. Το Viewing Keys εξηγεί τι αποκαλύπτει και πώς να εξαγάγεις ένα.
- Ένα ύψος γέννησης, το μπλοκ από το οποίο θα ξεκινήσει η σάρωση. Χρησιμοποίησε ένα ύψος πριν από την πρώτη σου συναλλαγή. Αν το ορίσεις πολύ ψηλά, το παλαιότερο ιστορικό λείπει σιωπηρά. Αν το ορίσεις πολύ χαμηλά, η σάρωση απλώς διαρκεί περισσότερο. Η ενεργοποίηση του Sapling (419200) είναι πάντα ασφαλής, αλλά η σάρωσή της μπορεί να διαρκέσει ώρες.
Διατήρησέ το ιδιωτικό
Ένα viewing key δεν μπορεί να ξοδέψει χρήματα, αλλά δείχνει ολόκληρο το ιστορικό σου σε όποιον το κατέχει.
- Μην το επικολλήσεις σε ιστότοπο ή block explorer. Εισήγαγέ το σε λογισμικό που εκτελείς εσύ.
- Ο διακομιστής από τον οποίο συγχρονίζεσαι βλέπει τη διεύθυνση IP σου και ποιες συναλλαγές κατεβάζεις πλήρως. Και τα δύο εργαλεία παρακάτω ανακτούν καθεμία από τις συναλλαγές σου με αναγνωριστικό για να διαβάσουν σημειώματα και τέλη, και το ZIP 307 σημειώνει ότι αυτό λέει στον διακομιστή ποιες συναλλαγές είναι δικές σου. Ο συγχρονισμός από τον δικό σου κόμβο Zebra με το Zaino ή το lightwalletd το αποφεύγει αυτό. Το Zingolib και ο οδηγός Zaino Tutorial σε καθοδηγούν σε μια ρύθμιση.
- Το zingo-cli 6 στέλνει πληρωμές μέσω του mixnet Nym, αλλά ο συγχρονισμός του εξακολουθεί να συνδέεται απευθείας στον διακομιστή, οπότε ισχύει και γι’ αυτό το παραπάνω σημείο.
- Δώσε σε αυτά τα εργαλεία ένα viewing key, ποτέ μια φράση ανάκτησης. Ο διακομιστής GraphQL του Zkool δεν έχει σύνδεση χρήστη από προεπιλογή, και το API του θα επιστρέψει τη φράση ανάκτησης οποιουδήποτε λογαριασμού δημιουργήθηκε από μία και μπορεί να στείλει κεφάλαια.
- Διατήρησε τον διακομιστή στο δικό σου μηχάνημα. Η παρακάτω εντολή Docker ακούει μόνο στο
127.0.0.1.
- Και τα δύο εργαλεία αποθηκεύουν το κλειδί και το ιστορικό σου χωρίς κρυπτογράφηση. Διέγραψε τα δεδομένα εργασίας όταν τελειώσεις και διατήρησε την εξαγωγή κάπου κρυπτογραφημένα.
Επιλογή 1: GraphQL του Zkool
Το zkool_graphql είναι η μηχανή πορτοφολιού του Zkool ως αυτόνομος διακομιστής. Είναι ξεχωριστό πρόγραμμα από την εφαρμογή Zkool. Ο απλούστερος τρόπος να το εκτελέσεις είναι η επίσημη εικόνα Docker (amd64 και arm64). Υπάρχει επίσης ένα δυαδικό x86-64 του Linux στη σελίδα εκδόσεων Zkool· χρειάζεται glibc 2.38 ή νεότερη, επομένως το Ubuntu 24.04 λειτουργεί ενώ το Debian 12 όχι.
1. Εκκίνησε τον διακομιστή
Code-highlight
docker run -d --name zkool-export \
-p 127.0.0.1:8000:8000 \
-v zkool-export:/data \
hhanh00/zkool-graphql:6.30.0 \
--db-path /data/zkool.db
Συγχρονίζεται από το https://zec.rocks εκτός αν προσθέσεις το --lwd-url με τον δικό σου διακομιστή. Στην πρώτη εκκίνηση κατεβάζει τις παραμέτρους Sapling (περίπου 50 MB). Αν αυτό αποτύχει, το docker start zkool-export προσπαθεί ξανά.
Άνοιξε το http://127.0.0.1:8000/graphiql σε ένα πρόγραμμα περιήγησης. Μπορείς να επικολλήσεις εκεί καθένα από τα επόμενα βήματα και να το εκτελέσεις.
2. Εισήγαγε το κλειδί
Code-highlight
mutation {
createAccount(newAccount: {
name: "export"
key: "uview1..."
aindex: 0
birth: 2500000
useInternal: true
})
}
Επιστρέφει το αναγνωριστικό του νέου λογαριασμού, που είναι 1 σε έναν νέο διακομιστή.
- Όριζε πάντα το
birth. Χωρίς αυτό, το Zkool ξεκινά από το τρέχον μπλοκ και δεν βρίσκει τίποτα.
- Το
useInternal: true κάνει το Zkool να ελέγχει και διαφανείς διευθύνσεις ρέστων. Διατήρησέ το ενεργό για κλειδιά από το ZODL, την ίδια ρύθμιση που χρησιμοποιεί το Recovering Funds για φράσεις ανάκτησης ZODL.
3. Συγχρονισμός
Code-highlight
mutation { synchronizeAccount(idAccount: 1) }
Αυτό εκτελείται μέχρι να τελειώσει ο συγχρονισμός. Μην προσθέσεις το fast: true. Παραλείπει τη λήψη των πλήρων συναλλαγών, από όπου προέρχονται τα σημειώματα, τα τέλη και τα outputs.
Ο αριθμός που επιστρέφει είναι το ύψος που στόχευε, όχι απόδειξη ότι έφτασε εκεί. Ένα σφάλμα δικτύου μπορεί να τερματίσει τον συγχρονισμό νωρίς χωρίς να αναφέρει τίποτα, οπότε έλεγξε:
Code-highlight
{ currentHeight accounts { id name height } }
Αν το height του λογαριασμού είναι πίσω από το currentHeight, εκτέλεσε ξανά τον συγχρονισμό. Συνεχίζει από εκεί που σταμάτησε.
4. Εξαγωγή
Αποθήκευσε αυτό ως history.graphql:
Code-highlight
{
transactionsByAccount(idAccount: 1) {
txid height time value fee
notes { pool scope address value memo }
spends { pool scope address value }
outputs { pool vout address value memo }
}
}
Άφησε έξω το όρισμα height εκτός αν το εννοείς. Ορίζει ένα ελάχιστο, επομένως το height: 3000000 του παραδείγματος στο φόρουμ αποκλείει τα πάντα πριν από εκείνο το μπλοκ.
Ανάκτησέ το ως JSON:
Code-highlight
jq -n --rawfile q history.graphql '{query: $q}' |
curl -s http://127.0.0.1:8000/graphql \
-H 'content-type: application/json' --data-binary @- > history.json
Κάθε συναλλαγή θα πρέπει να εμφανίζει τέλη πάνω από 0, εκτός από τις ανταμοιβές εξόρυξης. Αν μία εμφανίζει "fee": "0" και δεν έχει σημείωμα, οι λεπτομέρειές της δεν κατέβηκαν. Το Zkool ανακτά τις πλήρεις συναλλαγές μία κάθε φορά μετά τη σάρωση, και μία αποτυχία σταματά σιωπηρά τις υπόλοιπες. Για να εμφανίσεις όσες επηρεάζονται:
Code-highlight
jq -r '.data.transactionsByAccount[] | select(.fee == "0") | .txid' history.json
Αν εμφανιστεί κάτι, συγχρονίσου ξανά λίγα λεπτά αργότερα και κάνε ξανά εξαγωγή.
Έπειτα ισοπέδωσέ το σε CSV, μία γραμμή ανά συναλλαγή:
Code-highlight
jq -r '["txid","height","time_utc","net_zec","fee_zec","memos"],
(.data.transactionsByAccount[] |
[.txid, .height, .time, .value, .fee,
([.notes[].memo, .outputs[].memo] | map(select(. != null and . != "")) | unique | join(" | "))])
| @csv' history.json > history.csv
Ανάγνωση του αποτελέσματος
| Πεδίο | Σημασία |
|---|
value | Καθαρή μεταβολή στον λογαριασμό σε ZEC, με τα τέλη να περιλαμβάνονται. Αρνητική για αποστολές. |
fee | Τέλη σε ZEC. Στις πληρωμές που έλαβες, τα πλήρωσε ο αποστολέας και δεν περιλαμβάνονται στο value. |
time | Χρόνος μπλοκ σε UTC, χωρίς δείκτη ζώνης ώρας |
notes | Ό,τι έλαβε ο λογαριασμός σε αυτή τη συναλλαγή, συμπεριλαμβανομένων των ρέστων. Τα σημειώματα που σου στάλθηκαν βρίσκονται εδώ. Οι διαφανείς εγγραφές δεν έχουν διεύθυνση. |
spends | Τα δικά notes του λογαριασμού που χρησιμοποίησε αυτή η συναλλαγή |
outputs | Ό,τι έστειλε η συναλλαγή: κάθε διαφανές output, συν θωρακισμένες πληρωμές σε άλλες διευθύνσεις με τα σημειώματά τους |
pool | 0 διαφανές, 1 Sapling, 2 Orchard, 3 Ironwood |
scope | 0 εξωτερικό (εισερχόμενη πληρωμή), 1 εσωτερικό (ρέστα) |
Η εφαρμογή Zkool διαθέτει επίσης τις επιλογές Export Transactions, Memos και Notes στο μενού λογαριασμού, αλλά αυτές είναι ακατέργαστες εξαγωγές πινάκων: ποσά σε zatoshis, χρονικές σημάνσεις Unix και σημειώματα σε ξεχωριστό αρχείο.
Επιλογή 2: zingo-cli
Το zingo-cli είναι το πορτοφόλι γραμμής εντολών του Zingo. Δεν υπάρχουν έτοιμες λήψεις, επομένως το δημιουργείς με το Rust:
Code-highlight
git clone --branch zingolib_v6.0.0 https://github.com/zingolabs/zingolib.git
cd zingolib
cargo build --release -p zingo-cli
cargo build --release --manifest-path zingo-netutils/Cargo.toml --features nym --bin nym-proxy
cp zingo-netutils/target/release/nym-proxy target/release/
Χρειάζεσαι το nym-proxy ακόμη και μόνο για συγχρονισμό. Το zingo-cli 6 δεν θα συνδεθεί σε κανέναν διακομιστή χωρίς αυτό.
Η πρώτη εκτέλεση δημιουργεί ένα πορτοφόλι μόνο για προβολή, το συγχρονίζει και εκτυπώνει το ιστορικό:
Code-highlight
./target/release/zingo-cli --data-dir "$HOME/zingo-export" \
--viewkey "uview1..." --birthday 2500000 \
--server https://zec.rocks:443 \
--waitsync transactions > transactions.txt
- Το
--data-dir πρέπει να είναι απόλυτη διαδρομή.
- Τα
--viewkey και --birthday ισχύουν μόνο όταν δημιουργείται το πορτοφόλι. Άφησέ τα έξω μετά από αυτό.
- Το zingo-cli ξεκινά εκτός σύνδεσης από προεπιλογή. Το
--server επιλέγει τον διακομιστή και μετρά επίσης ως συγκατάθεσή σου για σύνδεση στο διαδίκτυο.
- Το κλειδί καταλήγει στο ιστορικό του shell σου, οπότε καθάρισέ το μετά.
Μεταγενέστερες εκτελέσεις:
Code-highlight
Z="./target/release/zingo-cli --data-dir $HOME/zingo-export"
$Z --server https://zec.rocks:443 --waitsync transactions > transactions.txt
$Z --offline value_transfers > value_transfers.txt
$Z --offline messages > memos.json
Το --offline διαβάζει ό,τι έχει ήδη συγχρονιστεί χωρίς να αγγίζει το δίκτυο.
- Το
transactions δίνει μία καταχώριση ανά συναλλαγή: txid, ώρα (UTC), ύψος, είδος (received, sent, shield ή send-to-self), αξία, τέλη και τα note που εμπλέκονται.
- Το
value_transfers δίνει μία καταχώριση ανά πληρωμή, επομένως μια αποστολή σε δύο άτομα είναι δύο καταχωρίσεις, καθεμία με τη διεύθυνση του παραλήπτη και τα σημειώματα.
- Το
messages παραθέτει σημειώματα ως JSON.
Μερικά πράγματα που πρέπει να γνωρίζεις για το αποτέλεσμα:
- Τα
transactions και value_transfers εκτυπώνουν απλό κείμενο που μοιάζει λίγο με JSON αλλά δεν είναι.
- Τα ποσά είναι σε zatoshis (100.000.000 για 1 ZEC) και είναι πάντα θετικά. Το
kind σου λέει την κατεύθυνση. Για αποστολές, το value είναι ό,τι πήγε σε άλλα άτομα, χωρίς τα τέλη.
- Τα τέλη εμφανίζονται ως «not available» όταν μια συναλλαγή ξοδεύει διαφανή κεφάλαια που δεν ήταν δικά σου. Εμφανίζονται μόνο σημειώματα κειμένου.
- Αν ο συγχρονισμός αποτύχει, το σφάλμα πηγαίνει στο τερματικό, όχι στο αρχείο, και το zingo-cli εξακολουθεί να τερματίζει κανονικά. Έλεγξε το τερματικό πριν εμπιστευτείς το
transactions.txt.
Το zingoHelper του dismad έχει ένα script exportToJSON.sh που μετατρέπει το transactions σε JSON. Γράφτηκε πριν από το zingo-cli 6, είναι ρυθμισμένο για testnet, επισημαίνει ορισμένες εξερχόμενες εγγραφές Sapling και διαφανείς εγγραφές ως placeholders, και χρειάζεται GNU εργαλεία, επομένως δεν θα εκτελεστεί σε τυπικό macOS. Αντιμετώπισε το αποτέλεσμά του ως αφετηρία και έλεγξε τα σύνολα.
Τι δεν μπορεί να σου πει ένα viewing key
- Τιμές. Κανένα εργαλείο δεν καταγράφει μια τιμή ZEC τη στιγμή κάθε συναλλαγής. Πρόσθεσε μόνος σου αξίες fiat.
- Διαφανές ιστορικό, αν το κλειδί δεν το περιλαμβάνει. Το διαφανές μέρος ενός UFVK είναι προαιρετικό σύμφωνα με το ZIP 316. Με το zingo-cli, το
$Z --offline parse_viewkey uview1... δείχνει ποια pools καλύπτει ένα κλειδί.
- Ποιος σε πλήρωσε. Οι θωρακισμένες πληρωμές δεν μεταφέρουν τη διεύθυνση του αποστολέα. Εκτός αν ο αποστολέας έβαλε μία στο σημείωμα, δεν υπάρχει πουθενά.
- Ορισμένες εξερχόμενες λεπτομέρειες. Η διεύθυνση προορισμού, το ποσό και το σημείωμα για θωρακισμένες αποστολές ανακτώνται με αποκρυπτογράφηση μέσω του κλειδιού. Ωστόσο, ένα πορτοφόλι μπορεί να δημιουργήσει μια συναλλαγή ώστε αυτό να μην είναι δυνατό, αν και τα περισσότερα δεν το κάνουν.
Άλλα εργαλεία
| Εργαλείο | Τι λαμβάνεις |
|---|
| ZODL | Φορολογικό CSV με ημερομηνίες, ποσά, τέλη και μια ετικέτα. Μόνο για το προηγούμενο ημερολογιακό έτος, παραλείπει συναλλαγές θωράκισης, χωρίς txid, σημείωμα ή διεύθυνση. |
| Εφαρμογή Zkool | Ακατέργαστες εξαγωγές πινάκων από το μενού λογαριασμού |
| Zenith | Εισάγει ένα UFVK με το importvk. Το listreceived μέσω RPC επιστρέφει ληφθέντα notes με txid και σημείωμα, αλλά όχι αποστολές και όχι τέλη. |
| Zallet | Το z_listtransactions είναι λεπτομερές αλλά επισημασμένο ως πειραματικό, και το Zallet εισάγει μόνο Sapling viewing keys, όχι UFVKs |
| zcash-devtool | Εισάγει ένα UFVK με το wallet init-fvk και έπειτα το wallet list-tx. Η λειτουργία CSV του δεν έχει txid ή διεύθυνση, και το έργο λέει να μην το χρησιμοποιείς στην παραγωγή. |
Σχετικά