zecd — Διακομιστής πορτοφολιού με προτεραιότητα στα θωρακισμένα
Το zecd είναι ένας διακομιστής πορτοφολιού με προτεραιότητα στα θωρακισμένα για το Zcash, βασισμένος στο librustzcash και προσβάσιμος μέσω της διαλέκτου JSON-RPC του Bitcoin Core. Παρέχει σε προγραμματιστές και ενσωματωτές πληρωμών ένα οικείο, συμβατό με Bitcoin API για αλληλεπίδραση με το Zcash — ενώ καθιστά το Orchard (το pool με την περισσότερη ιδιωτικότητα) την προεπιλογή. Αναπτυγμένο από το zec.rocks, το zecd έχει σχεδιαστεί για να αντικαταστήσει τη λειτουργικότητα πορτοφολιού του zcashd σε σύγχρονες, cloud-native αναπτύξεις.
Τρέχουσα έκδοση: 0.5.0-rc3 (13 Ιουλίου 2026) — με υποστήριξη για το Ironwood (NU6.3). Εγκατάστησέ το μέσω του cargo install zecd ή χρησιμοποίησε την επίσημη εικόνα Docker.
Με λίγα λόγια
- Το zecd είναι ένας daemon πορτοφολιού (διακομιστής) — όχι πλήρης κόμβος. Διαχειρίζεται κλειδιά, σάρωση, αποδείξεις και RPC χωρίς να επικοινωνεί μέσω του πρωτοκόλλου P2P του Zcash.
- Χρησιμοποιεί τη διάλεκτο JSON-RPC του Bitcoin Core: ίδια ονόματα μεθόδων, μορφές πεδίων, έλεγχο ταυτότητας και κωδικούς σφαλμάτων — πολλοί πελάτες Bitcoin RPC λειτουργούν με το Zcash αμέσως.
- Οι διευθύνσεις Orchard (θωρακισμένες) είναι η προεπιλογή· η υποστήριξη για διαφανείς διευθύνσεις (t-address) και Sapling απαιτεί ρητή επιλογή για κάθε πορτοφόλι.
- Συνδέεται με έναν αυτοφιλοξενούμενο πλήρη κόμβο Zebra μέσω τοπικού JSON-RPC — δεν απαιτείται lightwalletd.
- Χωρίς κατάσταση εκ σχεδιασμού: ολόκληρο το πορτοφόλι μπορεί να ανακτηθεί μόνο από τη φράση ανάκτησης, καθιστώντας τον κατάλογο δεδομένων αναλώσιμο.
- Δεν αποτελεί άμεση αντικατάσταση του zcashd: υλοποιεί μόνο ένα υποσύνολο των μεθόδων RPC του Zcash, με σκόπιμες σχεδιαστικές διαφορές για ιδιωτικότητα και ασφάλεια.
- Τα τέλη ακολουθούν το ZIP-317 (ντετερμινιστικός υπολογισμός τελών)· τα τέλη που ορίζονται από τον χρήστη απορρίπτονται.
- Υποστηρίζει θωρακισμένα σημειώματα (ZIP-302) μέσω της οικείας επιφάνειας Bitcoin RPC.
Ποιο πρόβλημα λύνει το zecd;
Το zcashd ήταν ο αρχικός κόμβος και πορτοφόλι του Zcash μαζί — ένα fork της βάσης κώδικα C++ του Bitcoin το 2016. Με τον καιρό, αυτό δημιούργησε δυσκολίες: ο κώδικας είναι δύσκολο να συντηρηθεί, το πορτοφόλι είναι στενά συνδεδεμένο με τον κόμβο και οι διαφανείς διευθύνσεις παρουσιάζονται ως επιλογές πρώτης κατηγορίας δίπλα στις θωρακισμένες.
Το zecd διαχωρίζει την ευθύνη του πορτοφολιού από τη συναίνεση. Είναι ένα αποκλειστικό επίπεδο πορτοφολιού που βρίσκεται μεταξύ εφαρμογών και ενός πλήρους κόμβου Zebra, παρέχοντας:
- Μια καθαρή, σύγχρονη υλοποίηση Rust βασισμένη στο librustzcash (την ίδια βιβλιοθήκη που τροφοδοτεί τα Zodl και Zingo)
- Σχεδιασμό με προεπιλεγμένη ιδιωτικότητα (διευθύνσεις Orchard εκτός αν ρυθμιστεί διαφορετικά)
- Μια συμβατή με Bitcoin διεπαφή RPC που εξαλείφει την ανάγκη εκμάθησης εργαλείων ειδικών για το Zcash
- Αρχιτεκτονική χωρίς κατάσταση, ανακτήσιμη από τη φράση ανάκτησης, κατάλληλη για αναπτύξεις σε containers και cloud
Αρχιτεκτονική
Το zecd λειτουργεί με ένα μοντέλο τριών επιπέδων:
Code-highlight
Your app / Bitcoin RPC client
↓ JSON-RPC
zecd
(keys, scanning, proving, RPC)
↓ JSON-RPC (local only)
Zebra
(full node — consensus, mempool, chain data)
Το zecd επικοινωνεί με το Zebra αποκλειστικά μέσω τοπικού JSON-RPC — χωρίς δικτύωση peer-to-peer, χωρίς indexers τρίτων και χωρίς lightwalletd. Η σύνδεση Zebra είναι σκόπιμα μόνο τοπική: το zecd θα αρνηθεί να στείλει διαπιστευτήρια σε έναν καθολικά δρομολογήσιμο host, εκτός αν ρυθμιστεί ρητά για ένα ασφαλές tunnel εκτός ζώνης (π.χ. WireGuard ή SSH).
Βασικά χαρακτηριστικά
Προτεραιότητα στα θωρακισμένα, προεπιλογή το Orchard
Το zecd χρησιμοποιεί τις ενοποιημένες διευθύνσεις Orchard ως προεπιλεγμένο τύπο διεύθυνσης. Τα pool Sapling και τα διαφανή pool (t-address) απαιτούν ρητή ρύθμιση για κάθε πορτοφόλι. Αυτός ο σχεδιασμός μειώνει τον κίνδυνο τυχαίων διαφανών αποστολών — ένα συνηθισμένο πρόβλημα ιδιωτικότητας σε παλαιότερα εργαλεία Zcash.
Η πολιτική ιδιωτικότητας μπορεί να ρυθμιστεί ανά κλήση ή καθολικά στο [spend] privacy_policy:
| Πολιτική | Συμπεριφορά |
|---|
AllowRevealedRecipients (προεπιλογή) | Επιτρέπει αποστολές σε διαφανείς παραλήπτες· αποκαλύπτει ποσό και παραλήπτη on-chain |
AllowRevealedAmounts | Επιτρέπει αποστολές μεταξύ pools (Sapling↔Orchard), αλλά απορρίπτει διαφανείς παραλήπτες |
FullPrivacy | Μόνο πλήρως θωρακισμένες αποστολές μέσα σε ένα pool· απορρίπτει διαφανείς παραλήπτες και αποστολές μεταξύ pools |
AllowFullyTransparent | Επιτρέπει επίσης αποστολές t→t που χρηματοδοτούνται από διαφανή UTXOs |
Συμβατότητα με Bitcoin Core RPC
Το zecd υλοποιεί τη διάλεκτο JSON-RPC του Bitcoin Core με συμμόρφωση στα εξής:
- Ονόματα μεθόδων (π.χ.
getblockchaininfo, getbalance, getnewaddress, listtransactions, sendtoaddress, sendmany)
- Ονόματα και τύποι πεδίων στις αποκρίσεις
- Δομή φακέλου JSON-RPC 1.0
- Basic auth, καταχωρίσεις
rpcauth και έλεγχο ταυτότητας με αρχείο cookie
- Κωδικούς σφαλμάτων και αντιστοίχιση κατάστασης HTTP (HTTP 500 με σώμα σφάλματος, σημασιολογία 401)
Αυτό σημαίνει ότι πολλές υπάρχουσες βιβλιοθήκες πληρωμών Bitcoin, ενσωματώσεις ανταλλακτηρίων και εργαλεία παρακολούθησης μπορούν να αλληλεπιδρούν με το Zcash μέσω του zecd με ελάχιστες ή καθόλου αλλαγές κώδικα.
Η σουίτα συμμόρφωσης (140+ έλεγχοι) εκτελείται σε κάθε PR έναντι ενός ενεργού regtest daemon και έχει επίσης επικυρωθεί έναντι του δημόσιου testnet.
Θωρακισμένα σημειώματα (ZIP-302)
Το zecd εκθέτει τη δυνατότητα θωρακισμένων σημειωμάτων του Zcash μέσω της οικείας επιφάνειας Bitcoin RPC — κάτι που δεν είναι διαθέσιμο στα τυπικά εργαλεία Bitcoin:
- Το
sendtoaddress δέχεται ένα προαιρετικό δεκαεξαδικό σημείωμα ως επιπλέον τελική παράμετρο (έως 512 bytes· απορρίπτεται για διαφανείς παραλήπτες)
- Οι καταχωρίσεις ιστορικού συναλλαγών από τα
listtransactions και gettransaction περιλαμβάνουν τα πεδία memo (δεκαεξαδικό) και memoStr (αποκωδικοποιημένο κείμενο) όταν μια έξοδος περιέχει σημείωμα
- Υποστηρίζονται αποστολές μηδενικού ποσού σε θωρακισμένο παραλήπτη για περιπτώσεις χρήσης μόνο με σημείωμα (το μοτίβο «memo-only-send» του
z_sendmany)
Αυτό καθιστά το zecd κατάλληλο για εφαρμογές που χρειάζονται ιδιωτικά, on-chain μηνύματα μαζί με πληρωμές.
Χωρίς κατάσταση εκ σχεδιασμού
Το zecd δεν διατηρεί καμία off-chain κατάσταση που μια επαναφορά μόνο από τη φράση ανάκτησης δεν θα μπορούσε να ανακατασκευάσει. Η βάση δεδομένων πορτοφολιού (data.sqlite) προκύπτει εξ ολοκλήρου από τη φράση ανάκτησης — τα θωρακισμένα κεφάλαια ανακτώνται άνευ όρων· τα διαφανή κεφάλαια ανακτώνται έως το διαμορφωμένο όριο κενού.
Για να επαναφέρεις ένα πορτοφόλι από τη φράση ανάκτησης:
Code-highlight
zecd init --restore --birthday <block-height>
Αυτό καθιστά τον κατάλογο δεδομένων αναλώσιμο: ένα container χωρίς μόνιμο volume, που ανακατασκευάζεται από τη φράση ανάκτησης σε κάθε εκκίνηση, δεν χάνει τίποτα κρίσιμο. Εσύ είσαι υπεύθυνος για την παρακολούθηση των διευθύνσεων που δίνεις — το zecd θυμάται διευθύνσεις μόνο αφού έχουν λάβει κεφάλαια on-chain.
Οι ετικέτες απουσιάζουν σκόπιμα. Επειδή οι ετικέτες δεν έχουν on-chain πηγή και δεν μπορούν να ανακατασκευαστούν από τη φράση ανάκτησης, το zecd απλώς δεν τις υποστηρίζει. Η κλήση μεθόδων ετικετών επιστρέφει σφάλμα method-not-found (-32601).
Χωρίς εξάρτηση από lightwalletd
Το zecd παράγει compact blocks, κατάσταση δέντρου και ορατότητα mempool απευθείας από το JSON-RPC του Zebra. Δεν υπάρχει lightwalletd για λειτουργία ή συντήρηση — μειώνοντας την επιχειρησιακή πολυπλοκότητα για αυτοφιλοξενούμενες αναπτύξεις.
Cloud-native και αναπτύξεις σε containers
Η αρχιτεκτονική χωρίς κατάσταση του zecd έχει σχεδιαστεί για περιβάλλοντα Docker και Kubernetes:
- Πλήρης στοίβα Compose Docker (
zebra → zecd) διαθέσιμη στο αποθετήριο
- Endpoint υγείας στη θύρα
9233 με διαμορφώσιμα readiness probes (synced ή connected)
- Επιλογή δομημένης καταγραφής JSON για pipelines συγκέντρωσης logs
- Ντετερμινιστικά τέλη ZIP-317 — χωρίς oracle τελών ή χειροκίνητη ρύθμιση τελών
- Το
bootstrap_from_keys (ενεργό από προεπιλογή): ένας κενός κατάλογος δεδομένων δίπλα στο keys.toml ανακατασκευάζει αυτόματα το πορτοφόλι κατά την εκκίνηση — κάνε ανάπτυξη προσαρτώντας ένα Secret και εκκινώντας με ένα κενό PVC
Μοντέλα φύλαξης
Το zecd υποστηρίζει τρία μοντέλα φύλαξης κλειδιών, κατάλληλα για διαφορετικές απαιτήσεις ανάπτυξης και ασφάλειας:
1. Μη κρυπτογραφημένο (προεπιλογή — αυτόματο ξεκλείδωμα)
Το mnemonic της φράσης ανάκτησης στο keys.toml περιτυλίγεται σε ένα αρχείο ταυτότητας age (identity.txt). Με το προεπιλεγμένο auto_unlock = true, η φράση ανάκτησης αποκρυπτογραφείται στη μνήμη κατά την εκκίνηση ώστε οι αποστολές να γίνονται χωρίς επίβλεψη και να μη χρειάζεται κλήση walletpassphrase.
Κατάλληλο για: αυτοματοποιημένους επεξεργαστές πληρωμών, hot wallets ανταλλακτηρίων, περιβάλλοντα προγραμματιστών.
Code-highlight
zecd init --datadir ./data --wallet default --account-name primary
Αποθήκευσε το identity.txt εκτός του καταλόγου δεδομένων στο mainnet — όποιος διαβάσει και τα δύο αρχεία έχει εξουσία δαπάνης.
2. Κρυπτογραφημένο (προστατευμένο με συνθηματικό)
Το mnemonic περιτυλίγεται με συνθηματικό (age scrypt) αντί για αρχείο ταυτότητας. Το πορτοφόλι ξεκινά κλειδωμένο· το walletpassphrase "<pass>" <timeout> το ξεκλειδώνει για τη δεδομένη διάρκεια και το ξανακλειδώνει αυτόματα στη λήξη — αντιστοιχώντας στη συμπεριφορά κρυπτογραφημένου πορτοφολιού του Bitcoin Core.
Κατάλληλο για: hot wallets όπου δεν απαιτείται εξουσία δαπάνης χωρίς επίβλεψη· διαδραστικές ροές εργασίας χειριστή.
Code-highlight
zecd init --datadir ./data --encrypt
# later: walletpassphrase "my-passphrase" 300
3. Μόνο παρακολούθηση (UFVK — χωρίς κλειδί δαπάνης)
Αρχικοποιείται με ένα Unified Full Viewing Key (UFVK) που έχει εξαχθεί από άλλο πορτοφόλι. Μπορεί να λαμβάνει, να σαρώνει και να αναφέρει υπόλοιπα — αλλά δεν μπορεί να υπογράφει συναλλαγές. Ιδανικό για παρακολούθηση, τιμολόγηση ή κόμβους ελέγχου χωριστά από το πορτοφόλι υπογραφής.
Code-highlight
# On the signing wallet's host:
zecd export-ufvk
# On the watch-only host:
zecd init --datadir ./data-watch --ufvk "uview1..." --birthday <height>
Αντίγραφα ασφαλείας και ανάκτηση
Τα κεφάλαια μπορούν να ανακτηθούν μόνο από το mnemonic. Όλα τα υπόλοιπα είναι cache.
| Στοιχείο | Τοποθεσία | Τι προστατεύει | Αντίγραφο ασφαλείας; |
|---|
| Mnemonic 24 λέξεων | Εμφανίζεται μία φορά στο zecd init | Τα κεφάλαια — απώλεια = μόνιμη απώλεια | Ναι — offline (χαρτί/HSM) |
keys.toml | <wallet dir>/keys.toml | Κρυπτογραφημένη φράση ανάκτησης + birthday + δίκτυο | Ναι — ως Secret |
identity.txt | [keys] age_identity | Αποκρυπτογραφεί το keys.toml (εξουσία δαπάνης) | Ναι — χωριστά από το keys.toml |
| Ύψος birthday | Μέσα στο keys.toml | Κάνει την επαναφορά γρήγορη (οποιοδήποτε ύψος πριν από την πρώτη συναλλαγή) | Κατέγραψέ το μαζί με το mnemonic |
data.sqlite | <wallet dir>/data.sqlite | Cache πορτοφολιού — ανακατασκευάζεται από τη φράση ανάκτησης κατά την επαναφορά | Όχι — αναλώσιμο |
|
Ο κατάλογος δεδομένων πρέπει να είναι τοπικός στον host. Το κλείδωμα μίας παρουσίας του zecd (<datadir>/.lock) είναι συμβουλευτικό κλείδωμα λειτουργικού συστήματος — δεν εκτείνεται σε hosts. Μην κοινοποιείς ποτέ έναν κατάλογο δεδομένων με δικαίωμα ανάγνωσης-εγγραφής μεταξύ μηχανημάτων (NFS, Kubernetes ReadWriteMany) — δύο παρουσίες zecd θα κατέστρεφαν τη βάση δεδομένων πορτοφολιού. Χρησιμοποίησε volumes ReadWriteOnce στο Kubernetes.
Λίστα επιτρεπόμενων μεθόδων RPC
Για αναπτύξεις όπου η διαρροή διαπιστευτηρίων θα ήταν καταστροφική, το zecd υποστηρίζει τον περιορισμό της επιφάνειας RPC σε ένα επιλεγμένο υποσύνολο μεθόδων:
Code-highlight
[rpc]
allowed_methods = ["getblockchaininfo", "getbalance", "getnewaddress", "listtransactions"]
Κάθε μέθοδος που δεν βρίσκεται στη λίστα επιστρέφει -32601 (HTTP 404) — χωρίς διάκριση από μια μέθοδο που δεν υπάρχει, επομένως ένας κλειδωμένος διακομιστής δεν αποκαλύπτει τίποτα για ό,τι απενεργοποίησε. Ένας invoicer μόνο για λήψη μπορεί να απενεργοποιήσει τα sendtoaddress, sendmany και stop για να ελαχιστοποιήσει το εύρος επίπτωσης από έναν παραβιασμένο πελάτη.
Βασικές διαφορές από το Bitcoin Core RPC
Οι προγραμματιστές που μεταβαίνουν από εργαλεία Bitcoin ή zcashd πρέπει να γνωρίζουν αυτές τις σκόπιμες αποκλίσεις:
| Συμπεριφορά | Bitcoin Core | zecd |
|---|
| Μορφή διεύθυνσης | 1... / bc1... | u1... (ενοποιημένη διεύθυνση Orchard) — δεν αναλύεται ως διεύθυνση Bitcoin από πελάτες που αναλύουν συμβολοσειρές |
| Ετικέτες | Πλήρης αποθήκη ετικετών | Δεν υλοποιείται — τα setlabel, listlabels κ.λπ. επιστρέφουν -32601 |
| Τέλη | Καθορίζονται από τον χρήστη· αγορά τελών | Μόνο ντετερμινιστικά ZIP-317· τα settxfee, fee_rate, subtractfeefromamount απορρίπτονται με -8 |
| Σημειώματα | Δεν υποστηρίζονται | Το sendtoaddress δέχεται δεκαεξαδικό σημείωμα· το ιστορικό έχει πεδία memo + memoStr |
| Επιβεβαιώσεις για δαπάνη | 1 | 3 (δικά σου ρέστα) / 10 (τρίτου μέρους) — διαμορφώσιμο μέσω trusted_confirmations / untrusted_confirmations |
listsinceblock σε reorg |
Γρήγορη εκκίνηση
Προαπαιτούμενα: Το Zebra εκτελείται τοπικά με rpc.listen_addr = 127.0.0.1:18234 (testnet).
Εγκατάσταση από crates.io (0.4.3+):
Code-highlight
cargo install zecd
Ή δημιουργία από τον πηγαίο κώδικα:
Code-highlight
git clone https://github.com/zecrocks/zecd && cd zecd
cargo build --release
Code-highlight
# 1. Initialize a testnet wallet (generates a 24-word mnemonic and an account)
zecd --datadir ./data --testnet init --wallet default --account-name primary
# 2. Start the daemon (syncs in background, serves JSON-RPC on port 18232)
zecd --datadir ./data --testnet \
--rpcuser zec --rpcpassword secret --rpcbind 127.0.0.1 --rpcport 18232
Αλληλεπίδραση μέσω curl:
Code-highlight
curl -s --user zec:secret --data-binary \
'{"jsonrpc":"1.0","id":"1","method":"getblockchaininfo","params":[]}' \
-H 'content-type: text/plain;' http://127.0.0.1:18232/
Αλληλεπίδραση μέσω Python (με χρήση βιβλιοθήκης Bitcoin RPC):
Code-highlight
from bitcoinrpc.authproxy import AuthServiceProxy
rpc = AuthServiceProxy("http://zec:secret@127.0.0.1:18232")
print(rpc.getblockchaininfo())
addr = rpc.getnewaddress() # returns a u1... Orchard Unified Address
print(rpc.getbalance())
print(rpc.listtransactions("*", 20))
# Send with a shielded memo
rpc.sendtoaddress(addr, 0.001, "", "", False, "48656c6c6f205a6563617368") # hex memo
Επαναφορά από φράση ανάκτησης:
Code-highlight
zecd --datadir ./data init --restore --birthday 2500000
# paste your 24-word mnemonic when prompted
Προεπιλεγμένες θύρες
| Δίκτυο | RPC zecd | RPC Zebra (backend) | Υγεία |
|---|
| Mainnet | 8232 | 8234 | 9233 |
| Testnet | 18232 | 18234 | 9233 |
zecd έναντι zcashd έναντι Zaino
| zcashd | Zaino | zecd |
|---|
| Ρόλος | Πλήρης κόμβος + πορτοφόλι | Indexer (αντικαθιστά το lightwalletd) | Μόνο διακομιστής πορτοφολιού |
| Γλώσσα | C++ | Rust | Rust |
| Κατάσταση | Καταργημένο | Ενεργό | Ενεργό (v0.5.0-rc3, Ιούλιος 2026) |
| Προεπιλεγμένο pool | Διαφανές | Δ/Υ | Orchard (θωρακισμένο) |
| Διάλεκτος RPC | Ειδική για zcashd | gRPC (lightwalletd) | Bitcoin Core JSON-RPC |
| Απαιτεί πλήρη κόμβο | Ναι (τον ίδιο) | Zebra ή zcashd | Zebra |
| Ανάκτηση χωρίς κατάσταση | Όχι | Δ/Υ | Ναι (μόνο φράση ανάκτησης) |
| Θωρακισμένα σημειώματα | Ναι (z_sendmany) | Δ/Υ | Ναι (επιφάνεια Bitcoin RPC) |
|
Σχετικές σελίδες
- Πλήρης κόμβος Zebra — ο πλήρης κόμβος με τον οποίο συνδέεται το zecd
- Zaino Indexer — εναλλακτική προσέγγιση indexer (αντικαθιστά το lightwalletd)
- Κόμβος Zakura — μια άλλη υλοποίηση πλήρους κόμβου (fork του Zebra)
- Viewing Keys — πώς το zecd σαρώνει την αλυσίδα χρησιμοποιώντας viewing keys λογαριασμού
- Πορτοφόλια — επισκόπηση του οικοσυστήματος πορτοφολιών
Πόροι