Οδηγός Ενσωμάτωσης Εμπιστευτικών Μεταφορών

Υποστήριξη Εμπιστευτικών Μεταφορών στο Solana

Ιστορικό

Η επέκταση Εμπιστευτικής Μεταφοράς επιτρέπει στα Token-2022 mints να διατηρούν τα ποσά μεταφοράς και τα υπόλοιπα λογαριασμών κρυπτογραφημένα onchain. Τα υπόλοιπα είναι κρυπτογραφημένα, επομένως η εμφάνισή τους απαιτεί τα κλειδιά αποκρυπτογράφησης του κατόχου, και η αποστολή απαιτεί τη δημιουργία αποδείξεων μηδενικής γνώσης στον client.

Αυτός ο οδηγός απευθύνεται σε ομάδες που ενσωματώνουν tokens εμπιστευτικής μεταφοράς (πορτοφόλια, εξερευνητές, ανταλλακτήρια, θεματοφύλακες, indexers) και όχι σε εκδότες που διαμορφώνουν ένα mint. Αν δομείτε τη βασική ροή από την αρχή, ξεκινήστε με τις αναλυτικές σελίδες που συνδέονται παρακάτω· αυτός ο οδηγός εστιάζει στο τι χρειάζεται να κάνει το προϊόν σας για να υποστηρίξει αποτελεσματικά αυτά τα tokens.

Οι διευθύνσεις λογαριασμών, το mint και ο κάτοχος κάθε λογαριασμού παραμένουν δημόσια. Μόνο τα ποσά και τα υπόλοιπα είναι κρυπτογραφημένα, οπότε όλα τα υπόλοιπα, συμπεριλαμβανομένου του ποιος συναλλάσσεται με ποιον, παραμένουν ορατά. Αυτό παρέχει εμπιστευτικότητα από δημόσιους παρατηρητές, όχι ανωνυμία.

Πόροι

Περίληψη

  • Κάθε εμπιστευτικός token account εξακολουθεί να έχει ένα δημόσιο υπόλοιπο καθώς και ένα κρυπτογραφημένο εκκρεμές και διαθέσιμο υπόλοιπο. Ένα token μπορεί να μετακινείται ελεύθερα μεταξύ δημόσιας και εμπιστευτικής κατάστασης.
  • Για να εμφανίσετε ένα εμπιστευτικό υπόλοιπο χρειάζεστε τα κλειδιά του κατόχου. Η συνιστώμενη προσέγγιση είναι να τα παράγετε από το πορτοφόλι του κατόχου, να αποκρυπτογραφήσετε το διαθέσιμο υπόλοιπο με το κλειδί AES (γρήγορα) και να αποκρυπτογραφήσετε τα εκκρεμή ποσά με το κλειδί ElGamal όταν χρειάζεται.
  • Για να αποστείλετε εμπιστευτικά, δημιουργείτε αποδείξεις ZK στον client (ισότητας, εγκυρότητας κρυπτοκειμένου, εύρους), που συνήθως τοποθετούνται σε προσωρινούς λογαριασμούς κατάστασης απόδειξης, και στη συνέχεια υποβάλλετε τη μεταφορά. Τόσο το @solana-program/token-2022 (JS) όσο και το spl-token-client (Rust) παρέχουν βοηθητικές συναρτήσεις υψηλού επιπέδου που δομούν τις αποδείξεις και ακολουθούν τη σειρά των συναλλαγών για εσάς.
  • Οι εμπιστευτικές μεταφορές εκτείνονται αυτήν την περίοδο σε μερικές εξαρτώμενες συναλλαγές, επειδή οι αποδείξεις υπερβαίνουν το τρέχον όριο μεγέθους συναλλαγής. Μια επερχόμενη αλλαγή (μορφή συναλλαγής v1, που θα κυκλοφορήσει με το Agave v4.2) αυξάνει αυτό το όριο και αναμένεται να επιτρέψει την εκτέλεση μιας εμπιστευτικής μεταφοράς σε μία μόνο onchain συναλλαγή.
  • Ένα πορτοφόλι που δεν προσθέτει καμία υποστήριξη εξακολουθεί να λειτουργεί: εμφανίζει το δημόσιο υπόλοιπο και οι τυπικές μεταφορές συνεχίζουν να λειτουργούν. Τα εμπιστευτικά κεφάλαια παραμένουν προσβάσιμα σε οποιονδήποτε client που υποστηρίζει εμπιστευτικές μεταφορές και διαθέτει τα κλειδιά του κατόχου.

Όροι

  • ElGamal keypair: ανά λογαριασμό keypair δημόσιου κλειδιού που χρησιμοποιείται για την κρυπτογράφηση υπολοίπων και την κατασκευή αποδείξεων ZK. Το δημόσιο κλειδί αποθηκεύεται στον λογαριασμό.
  • Κλειδί AES: ανά λογαριασμό συμμετρικό κλειδί που χρησιμοποιείται για την κρυπτογράφηση του «αποκρυπτογραφήσιμου διαθέσιμου υπολοίπου», ώστε ο κάτοχος να μπορεί να διαβάζει το διαθέσιμο υπόλοιπό του σε σταθερό χρόνο, χωρίς να επιλύει διακριτό λογάριθμο.
  • Εκκρεμές υπόλοιπο: κρυπτογραφημένο υπόλοιπο κεφαλαίων που ελήφθησαν μέσω καταθέσεων ή εισερχόμενων μεταφορών που δεν έχουν εφαρμοστεί ακόμη. Δεν μπορεί να δαπανηθεί άμεσα.
  • Διαθέσιμο υπόλοιπο: κρυπτογραφημένο υπόλοιπο που μπορεί να μεταφερθεί ή να αναληφθεί.
  • Εφαρμογή: το βήμα που μετακινεί το εκκρεμές υπόλοιπο στο διαθέσιμο.
  • Λογαριασμός κατάστασης πλαισίου απόδειξης: ένας προσωρινός λογαριασμός onchain που διατηρεί μια προεπαληθευμένη απόδειξη ZK, στον οποίο αναφέρεται μια εμπιστευτική εντολή και στη συνέχεια κλείνει για ανάκτηση rent.
  • Ελεγκτής: ένα προαιρετικό καθολικό κλειδί ElGamal στο mint· όταν οριστεί, κάθε μεταφορά κρυπτογραφεί επιπλέον το ποσό της με αυτό το κλειδί, ώστε ένα ορισμένο μέρος να μπορεί να το αποκρυπτογραφήσει.

Μοντέλο λογαριασμού και υπόλοιπα

Όταν ένας λογαριασμός έχει ρυθμιστεί για εμπιστευτικές μεταφορές, η επέκταση ConfidentialTransferAccount αποθηκεύει (μεταξύ άλλων πεδίων):

  • elgamal_pubkey: το δημόσιο κλειδί ElGamal του λογαριασμού.
  • pending_balance_lo / pending_balance_hi: κρυπτοκείμενα ElGamal του εκκρεμούς υπολοίπου, χωρισμένα σε χαμηλά και υψηλά bits (η αποκρυπτογράφηση των υψηλών bits είναι πιο δαπανηρή, γι' αυτό διατηρούνται χωριστά).
  • available_balance: κρυπτοκείμενο ElGamal του δαπανήσιμου υπολοίπου.
  • decryptable_available_balance: ένα κρυπτοκείμενο AES του ίδιου διαθέσιμου υπολοίπου που ο κάτοχος μπορεί να αποκρυπτογραφήσει άμεσα. Αυτό είναι το πεδίο που πρέπει να χρησιμοποιείται για εμφάνιση.
  • allow_confidential_credits / allow_non_confidential_credits: εάν ο λογαριασμός αποδέχεται αυτή τη στιγμή εισερχόμενες εμπιστευτικές ή δημόσιες πιστώσεις.
  • pending_balance_credit_counter και maximum_pending_balance_credit_counter: πόσες πιστώσεις έχουν συσσωρευτεί στο εκκρεμές υπόλοιπο και το όριο πριν απαιτηθεί εφαρμογή.

Όλα αυτά τα πεδία επιστρέφονται σε αναλυμένη κατάσταση λογαριασμού μέσω του τυπικού RPC. Οποιοσδήποτε μπορεί να διαβάσει τα κρυπτοκείμενα, αλλά μόνο οι κάτοχοι κλειδιών μπορούν να ανακτήσουν τα υποκείμενα ποσά.

Διαχείριση κλειδιών

Κάθε εμπιστευτικός λογαριασμός χρησιμοποιεί δύο κλειδιά: ένα ElGamal keypair για κρυπτογράφηση και αποδείξεις, και ένα κλειδί AES για γρήγορη αποκρυπτογράφηση υπολοίπου. Ο τρόπος με τον οποίο παράγετε και αποθηκεύετε αυτά τα κλειδιά είναι επιλογή ενσωμάτωσης. Μερικές συνηθισμένες επιλογές:

  • Παραγωγή από υπογραφή πορτοφολιού (προτεινόμενη προεπιλογή). Ο κάτοχος υπογράφει ένα κανονικό, domain-separated μήνυμα και τα κλειδιά παράγονται από αυτή την υπογραφή, οπότε είναι αναπαραγώγιμα μόνο από το πορτοφόλι και δεν χρειάζεται να τα αποθηκεύσετε. Το seed είναι ντετερμινιστικό ανά λογαριασμό: τα JS βοηθητικά προγράμματα παρακάτω το συνδέουν με το ζεύγος (owner, mint), ενώ το παράδειγμα Rust χρησιμοποιεί ως seed τη διεύθυνση του token account (για ένα associated token account αυτά είναι ισοδύναμα, καθώς η διεύθυνση αυτή παράγεται από τον κάτοχο και το mint).
  • Παραγωγή από ανεξάρτητο υλικό κλειδιού. Για passkeys, ασφαλείς θύλακες ή ρυθμίσεις MPC, παράγετε τα κλειδιά από έξοδο WebAuthn PRF ή άλλο υλικό κλειδιού εισόδου, ώστε τα εμπιστευτικά κλειδιά να μην είναι συνδεδεμένα με το κλειδί υπογραφής του λογαριασμού. Το @solana/zk-sdk εκθέτει τα ConfidentialKeys.fromIkm και ConfidentialKeys.fromPrf για αυτόν τον σκοπό.
  • Άμεση δημιουργία και διαχείριση. Οι πάροχοι custodial και MPC ενδέχεται να προτιμούν να δημιουργούν τα κλειδιά και να τα διαχειρίζονται όπως οποιοδήποτε άλλο ευαίσθητο υλικό κλειδιού.

Ο client @solana-program/token-2022 παρέχει βοηθητικά προγράμματα για την προτεινόμενη διαδρομή:

import {
deriveElGamalKeypairForOwnerMint,
deriveAeKeyForOwnerMint
} from "@solana-program/token-2022";
// `owner` signs a domain-separated message; the keys are bound to (owner, mint).
const { elgamalPubkey, secretKey } = await deriveElGamalKeypairForOwnerMint({
signer: owner,
owner: owner.address,
mint
});
const aesKey = await deriveAeKeyForOwnerMint({
signer: owner,
owner: owner.address,
mint
});

Τα εμπιστευτικά κλειδιά είναι κλειδιά αποκρυπτογράφησης. Αντιμετωπίστε ένα αίτημα υπογραφής του μηνύματος παραγωγής όπως το ξεκλείδωμα μιας ιδιωτικής προβολής των υπολοίπων του χρήστη. Προτιμήστε την παραγωγή κατ' απαίτηση αντί της αποθήκευσης· αν τα αποθηκεύετε (για παράδειγμα σε μια custodial υπηρεσία), προστατέψτε τα με την ίδια αυστηρότητα που εφαρμόζετε στα κλειδιά υπογραφής.

Οι βοηθοί παραγωγής κλειδιών επιστρέφουν σειριοποιημένο υλικό κλειδιών. Οι βοηθοί υψηλού επιπέδου για πράξεις (που παρουσιάζονται παρακάτω) δέχονται αντικείμενα WASM ElGamalKeypair και AeKey, οπότε ανακατασκευάστε τα από τα bytes όταν τα χρειάζεστε:

Δημιουργία και ρύθμιση λογαριασμών

Πριν ένας λογαριασμός μπορέσει να διατηρεί εμπιστευτικό υπόλοιπο, χρειάζεται την επέκταση ConfidentialTransferAccount, η οποία προσθέτει περίπου 295 bytes στο token account (της τάξης των 0.0015 SOL σε επιπλέον rent). Η εγκατάσταση γίνεται σε δύο βήματα: δημιουργία του token account και στη συνέχεια ρύθμιση της επέκτασης.

Η ρύθμιση απαιτεί κανονικά ο ιδιοκτήτης του λογαριασμού να υπογράψει και να παράσχει μια απόδειξη ότι κατέχει το δημόσιο κλειδί ElGamal που ορίζεται στον λογαριασμό. Ένα πορτοφόλι ή ένα ανταλλακτήριο μπορεί να δημιουργήσει και να χρηματοδοτήσει τον βασικό token account για έναν χρήστη, αλλά δεν μπορεί να ρυθμίσει την εμπιστευτική επέκταση εκ μέρους του χρήστη χωρίς αυτή την υπογραφή.

Για τον λόγο αυτό, αποφύγετε να προμηθεύετε αθόρυβα εμπιστευτικούς λογαριασμούς για κάθε χρήστη: κοστίζει επιπλέον rent και εξακολουθεί να απαιτεί τη συμμετοχή του ιδιοκτήτη. Ρυθμίστε κατά την πρώτη χρήση, ή όταν ο χρήστης επιλέγει εμπιστευτικές μεταφορές.

Το μητρώο ElGamal καταργεί το βήμα ιδιοκτήτη ανά λογαριασμό. Ένας χρήστης καταχωρεί το δημόσιο κλειδί ElGamal του μία φορά (υπογράφοντας μια απόδειξη κατά την εγγραφή), και η καταχώρηση μητρώου είναι επαναχρησιμοποιήσιμη σε κάθε mint. Μετά από αυτό, ένα τρίτο μέρος μπορεί να ρυθμίσει εμπιστευτικούς λογαριασμούς για τον χρήστη με ConfigureAccountWithRegistry, που δεν απαιτεί υπογραφή ιδιοκτήτη ή απόδειξη κατά τη ρύθμιση, μόνο έναν πληρωτή για rent. Αυτός είναι ο μηχανισμός που πρέπει να χρησιμοποιείτε αν θέλετε να προμηθεύετε εμπιστευτικούς λογαριασμούς για χρήστες ομαλά.

Η ρύθμιση μητρώου είναι διαθέσιμη στο Rust spl-token-client (confidential_transfer_configure_token_account_with_registry) και στο πρόγραμμα spl-elgamal-registry σήμερα. Αντίστοιχοι βοηθοί στον JS client @solana-program/token-2022 δεν είναι ακόμα διαθέσιμοι, οπότε οι JS ενσωματώσεις που χρειάζονται τη διαδρομή μητρώου θα πρέπει να παρακολουθούν τις εκδόσεις του client.

Εμφάνιση υπολοίπων

Μια ολοκληρωμένη ενσωμάτωση εμφανίζει το δημόσιο υπόλοιπο χρησιμοποιώντας το τυπικό υπόλοιπο token, ανιχνεύει την εμπιστευτική επέκταση και, όταν ο χρήστης έχει ξεκλειδώσει τα κλειδιά του, αποκρυπτογραφεί και εμφανίζει το διαθέσιμο υπόλοιπο.

Το διαθέσιμο υπόλοιπο διαβάζεται καλύτερα από το decryptable_available_balance χρησιμοποιώντας το κλειδί AES, το οποίο είναι σταθερού χρόνου. Η αποκρυπτογράφηση του ElGamal available_balance απευθείας απαιτεί την επίλυση ενός διακριτού λογαρίθμου και θα πρέπει να αποφεύγεται για τη συνήθη εμφάνιση.

import { AeCiphertext } from "@solana/zk-sdk/bundler";
import { fetchToken } from "@solana-program/token-2022";
import { unwrapOption } from "@solana/kit";
const account = await fetchToken(rpc, tokenAccountAddress);
// `extensions` is an Option<Array<Extension>>; each extension is a tagged union.
const extensions = unwrapOption(account.data.extensions) ?? [];
const ct = extensions.find((e) => e.__kind === "ConfidentialTransferAccount");
if (ct) {
// Fast path: decrypt the AES "decryptable available balance" for display.
const ciphertext = AeCiphertext.fromBytes(
new Uint8Array(ct.decryptableAvailableBalance)
);
// `aesKey` is the rebuilt AeKey object (see the rebuild snippet above), not raw bytes.
const availableBalance = ciphertext?.decrypt(aesKey); // bigint | undefined
console.log("Available (confidential):", availableBalance);
}

Όταν ο χρήστης δεν έχει ξεκλειδώσει τα κλειδιά του, εμφανίστε το δημόσιο υπόλοιπο και υποδείξτε ότι υπάρχει εμπιστευτικό υπόλοιπο αλλά είναι κλειδωμένο, αντί να εμφανίζετε μηδέν.

Λήψη μεταφορών

Οι εισερχόμενες καταθέσεις και μεταφορές καταλήγουν στο υπόλοιπο εκκρεμότητας και δεν είναι δαπανήσιμες μέχρι να εφαρμοστούν. Κάθε πίστωση αυξάνει το pending_balance_credit_counter· μόλις φτάσει στο maximum_pending_balance_credit_counter, ο λογαριασμός δεν μπορεί να λάβει άλλες εμπιστευτικές πιστώσεις μέχρι ο κάτοχος να εφαρμόσει το εκκρεμές υπόλοιπο.

Οι ενσωματώσεις που διαχειρίζονται κεφάλαια για λογαριασμό χρηστών θα πρέπει να:

  • Εμφανίζουν ξεχωριστά το εκκρεμές και το διαθέσιμο υπόλοιπο, ώστε οι χρήστες να κατανοούν γιατί ένα πρόσφατα ληφθέν ποσό δεν είναι ακόμη δαπανήσιμο.
  • Εφαρμόζουν το εκκρεμές υπόλοιπο εκ μέρους του χρήστη σε κατάλληλες στιγμές (για παράδειγμα πριν από μια αποστολή), ώστε τα υπόλοιπα να μην παγώνουν.
import { getApplyConfidentialPendingBalanceInstructionFromToken } from "@solana-program/token-2022";
// Builds a single instruction; no proofs are needed to apply.
const instruction = getApplyConfidentialPendingBalanceInstructionFromToken({
token: tokenAccountAddress,
tokenAccount, // decoded Token account
authority: owner,
elgamalSecretKey: elgamalKeypair.secret(),
aesKey
});

Δείτε τη σελίδα Εφαρμογή Εκκρεμούς Υπολοίπου για την πλήρη ροή.

Αποστολή μεταφορών

Μια εμπιστευτική μεταφορά απαιτεί τρεις αποδείξεις μηδενικής γνώσης που δημιουργούνται στον πελάτη:

  • Απόδειξη ισότητας ότι το νέο κείμενο κρυπτογράφησης υπολοίπου του αποστολέα κρυπτογραφεί την ίδια τιμή με μια νέα δέσμευση που μπορεί να ανοίξει ο αποστολέας.
  • Απόδειξη εγκυρότητας κρυπτοκειμένου ότι τα κρυπτοκείμενα του ποσού μεταφοράς είναι σωστά διαμορφωμένα βάσει των κλειδιών πηγής, προορισμού και (εφόσον έχουν οριστεί) ελεγκτή.
  • Απόδειξη εύρους ότι το ποσό και το εναπομένον υπόλοιπο του αποστολέα είναι έγκυροι μη αρνητικοί ακέραιοι, κάτι που αποτρέπει τη δημιουργία αξίας από το πουθενά.

Αυτές οι αποδείξεις είναι μεγαλύτερες από ό,τι επιτρέπει το σημερινό όριο μεγέθους συναλλαγής για ενσωμάτωση, οπότε το συνηθισμένο μοτίβο είναι να δημιουργούνται λογαριασμοί κατάστασης πλαισίου απόδειξης, να επαληθεύεται κάθε απόδειξη σε αυτούς, να αναφέρονται από την εντολή μεταφοράς και στη συνέχεια να κλείνουν για την ανάκτηση rent. Αυτό охватva μερικές εξαρτώμενες συναλλαγές. Η μορφή συναλλαγής v1 (που προσγειώνεται με το Agave v4.2) αυξάνει το όριο μεγέθους και αναμένεται να επιτρέψει την εκτέλεση μιας εμπιστευτικής μεταφοράς σε μία μόνο onchain συναλλαγή, γεγονός που θα απλοποιήσει αυτή τη ροή.

Δεν χρειάζεται να συναρμολογήσετε τις αποδείξεις χειροκίνητα. Και οι δύο clients παρέχουν έναν βοηθό υψηλού επιπέδου που δημιουργεί τις αποδείξεις και παράγει τις εντολές για υποβολή:

import { getConfidentialTransferInstructionPlan } from "@solana-program/token-2022";
// Returns an instruction plan covering proof setup, the transfer, and cleanup.
const plan = await getConfidentialTransferInstructionPlan({
rpc,
payer, // funds rent for the temporary proof context state accounts
sourceToken,
mint,
destinationToken,
sourceTokenAccount, // decoded Token account for the source
destinationTokenAccount, // decoded Token account for the destination,
// or pass `destinationElgamalPubkey` directly instead
authority: owner,
amount,
sourceElgamalKeypair, // ElGamal keypair for the source account
aesKey, // AES key for the source account
auditorElgamalPubkey // optional, read from the mint config
});
// Execute the plan with your instruction-plan executor of choice.

Εάν χρειάζεστε μεγαλύτερο έλεγχο, διατίθενται επίσης τα δομικά στοιχεία χαμηλότερου επιπέδου: @solana/zk-sdk δημιουργεί τα δεδομένα κάθε απόδειξης (CiphertextCommitmentEqualityProofData, BatchedGroupedCiphertext3HandlesValidityProofData, BatchedRangeProofU128Data), το @solana-program/zk-elgamal-proof παρέχει τις εντολές επαλήθευσης αποδείξεων, και το @solana-program/token-2022 παρέχει τις εντολές confidentialTransfer και λογαριασμού κατάστασης πλαισίου.

Δείτε τη σελίδα Μεταφορά Tokens για την αναλυτική ακολουθία εντολών.

Ανάληψη

Η ανάληψη μεταφέρει κεφάλαια από το εμπιστευτικό διαθέσιμο υπόλοιπο πίσω στο δημόσιο υπόλοιπο, μετά από την οποία συμπεριφέρονται όπως οποιοδήποτε κανονικό υπόλοιπο token. Η ανάληψη απαιτεί επίσης αποδείξεις (μια απόδειξη ισότητας και μια απόδειξη εύρους), που εκτίθενται ως getConfidentialWithdrawInstructionPlan στον JS client και confidential_transfer_withdraw στον Rust client. Εφαρμόστε πρώτα οποιοδήποτε εκκρεμές υπόλοιπο ώστε να είναι διαθέσιμο το πλήρες ποσό. Δείτε Ανάληψη Tokens.

Σχετικές εμπιστευτικές επεκτάσεις

Δύο προαιρετικές επεκτάσεις βασίζονται σε εμπιστευτικές μεταφορές. Και οι δύο αποτελούν κυρίως ευθύνη του εκδότη, αλλά καθεμία αλλάζει κάτι που πρέπει να χειριστεί ο integrator:

  • Εμπιστευτικά τέλη μεταφοράς. Όταν ένα mint συνδυάζει εμπιστευτικές μεταφορές με ένα τέλος μεταφοράς, οι αποστολές χρησιμοποιούν μια διαδρομή μεταφοράς με τέλος (confidential_transfer_transfer_with_fee στον Rust client), και το παρακρατηθέν τέλος κρυπτογραφείται όπως το ποσό. Η είσπραξη παρακρατηθέντων τελών (συγκέντρωση και ανάληψη) είναι δουλειά της αρχής τελών, όχι του integrator.
  • Εμπιστευτικό mint και burn. Ένα mint με αυτή την επέκταση εκδίδει και καίει προσφορά εμπιστευτικά, γεγονός που απενεργοποιεί τη δημόσια διαδρομή κατάθεσης και ανάληψης. Τα tokens δεν μπορούν να μετακινηθούν μεταξύ δημόσιων και εμπιστευτικών υπολοίπων σε ένα τέτοιο mint, οπότε μην εμφανίζετε κατάθεση ή ανάληψη για αυτό.

Για τις λεπτομέρειες σε επίπεδο πρωτοκόλλου και για τα δύο, δείτε την τεκμηρίωση εμπιστευτικών υπολοίπων.

Ανάλυση συναλλαγών εμπιστευτικής μεταφοράς

Οι εξερευνητές και οι δείκτες πρέπει να αναγνωρίζουν και να επισημαίνουν τη δραστηριότητα εμπιστευτικής μεταφοράς χωρίς να μπορούν να διαβάζουν τα ποσά. Ο πελάτης @solana-program/token-2022 εκθέτει το identifyToken2022Instruction για να κατηγοριοποιεί κάθε εντολή Token-2022, καθώς και αναλυτές ανά εντολή (για παράδειγμα parseConfidentialTransferInstruction) για την αποκωδικοποίηση λογαριασμών και πεδίων που δεν είναι μυστικά. Τα κρυπτογραφημένα ποσά παραμένουν ως κρυπτοκείμενα: εμφανίστε τα ως εμπιστευτικά αντί να αποδίδετε τα bytes ως αριθμό.

JS-parse-instruction.ts
import {
identifyToken2022Instruction,
Token2022Instruction,
TOKEN_2022_PROGRAM_ADDRESS
} from "@solana-program/token-2022";
for (const ix of instructions) {
if (ix.programAddress !== TOKEN_2022_PROGRAM_ADDRESS) continue;
const kind = identifyToken2022Instruction(ix);
switch (kind) {
case Token2022Instruction.ConfidentialTransfer:
case Token2022Instruction.ConfidentialTransferWithFee:
console.log("Confidential transfer (amount encrypted)");
break;
case Token2022Instruction.ConfidentialDeposit:
console.log("Deposit to confidential balance");
break;
case Token2022Instruction.ConfidentialWithdraw:
console.log("Withdraw from confidential balance");
break;
case Token2022Instruction.ApplyConfidentialPendingBalance:
console.log("Apply pending balance");
break;
default:
break;
}
}

Περιορισμοί ευρετηρίασης που πρέπει να λάβετε υπόψη:

  • Κανένα ποσό για εμπιστευτικές μεταφορές. Ένα ConfidentialTransfer περιέχει κρυπτογραφημένα ποσά, οπότε η ανάλυση όγκου, ροής και μεγέθους μεταφοράς δεν μπορεί να υπολογιστεί από αυτό. Επισημάνετε αυτές τις μεταφορές ως εμπιστευτικές αντί να καταγράφετε μηδέν ή ένα ακατέργαστο κρυπτοκείμενο.
  • Καμία διαφορά υπολοίπου. Οι εμπιστευτικές κινήσεις δεν αλλάζουν το δημόσιο υπόλοιπο token, οπότε η σύγκριση υπολοίπων πριν/μετά που τροφοδοτεί την ευρετηρίαση μεταφορών δεν τις καταγράφει. Τα εκκρεμή και διαθέσιμα υπόλοιπα είναι κρυπτοκείμενα.
  • Καταθέσεις και αναλήψεις είναι σε καθαρό κείμενο. Το ConfidentialDeposit και το ConfidentialWithdraw φέρουν ποσά σε καθαρό κείμενο, οπότε μπορείτε να ευρετηριάζετε τη ροή εισόδου και εξόδου από την εμπιστευτική δεξαμενή, αλλά όχι τις μεταφορές εντός αυτής.
  • Μία μεταφορά εκτείνεται σε πολλές συναλλαγές σήμερα. Λογαριασμοί κατάστασης πλαισίου απόδειξης δημιουργούνται, χρησιμοποιούνται και κλείνουν γύρω από τη μεταφορά, οπότε συσχετίστε τις σχετικές συναλλαγές αντί να αντιμετωπίζετε κάθε μία μεμονωμένα. Αυτό θα απλοποιηθεί μόλις υλοποιηθούν οι εμπιστευτικές μεταφορές μιας συναλλαγής (βλ. παραπάνω).
  • Τα mints ελεγκτή είναι αποκρυπτογραφήσιμα. Εάν ένα mint έχει παγκόσμιο ελεγκτή και κατέχετε το κλειδί ελεγκτή, μπορείτε να αποκρυπτογραφήσετε τα ποσά μεταφοράς για αυτό το mint (βλ. παρακάτω).

Ελεγκτές και συμμόρφωση

Μια έκδοση μπορεί να διαμορφώσει ένα καθολικό ElGamal public key ελεγκτή. Όταν οριστεί, κάθε εμπιστευτική μεταφορά πρέπει να περιλαμβάνει το ποσό κρυπτογραφημένο με το κλειδί του ελεγκτή, ώστε ο κάτοχος του μυστικού κλειδιού του ελεγκτή να μπορεί να αποκρυπτογραφήσει όλα τα ποσά μεταφοράς για αυτή την έκδοση. Η απόδειξη εγκυρότητας καλύπτει το κρυπτοκείμενο του ελεγκτή, οπότε ως ενσωματωτής δεν χρειάζεται να κάνετε κάτι ιδιαίτερο στη διαδρομή αποστολής, πέρα από το να περάσετε το κλειδί ελεγκτή από τη διαμόρφωση της έκδοσης (τα βοηθητικά εργαλεία υψηλού επιπέδου το διαβάζουν για εσάς).

Εάν το προϊόν σας είναι ο ελεγκτής (για παράδειγμα, ένας ρυθμιζόμενος εκδότης ή ένας πάροχος συμμόρφωσης), αποκρυπτογραφείτε τα ποσά μεταφοράς με το μυστικό κλειδί του ελεγκτή με τον ίδιο τρόπο που ένας κάτοχος αποκρυπτογραφεί το δικό του υπόλοιπο. Οι κάτοχοι μπορούν επίσης να μοιραστούν επιλεκτικά τα κλειδιά ανά λογαριασμό με συγκεκριμένο μέρος, χωρίς να τα εκθέτουν δημόσια.

Παρακολούθηση συναλλαγών (KYT)

Για παρόχους γνώσης συναλλαγής (KYT) και AML, οι εμπιστευτικές μεταφορές αλλάζουν αυτό που είναι παρατηρήσιμο, όχι το συνολικό μοντέλο:

  • Η ανάλυση διευθύνσεων και γραφημάτων δεν επηρεάζεται. Οι αποστολείς, οι παραλήπτες, οι εκδόσεις και οι κάτοχοι λογαριασμών παραμένουν δημόσιοι, οπότε ο έλεγχος διευθύνσεων, η αντιστοίχιση κυρώσεων και η ανάλυση γραφήματος αντισυμβαλλομένων λειτουργούν όπως και για οποιοδήποτε token.
  • Οι ευρετικές μέθοδοι βάσει ποσού χρειάζονται το κλειδί ελεγκτή. Η δόμηση, η υποβολή εκθέσεων κατωφλίου και η βαθμολόγηση κινδύνου βάσει όγκου δεν μπορούν να διαβάσουν τα ποσά εμπιστευτικής μεταφοράς από μόνα τους. Τα ποσά κατάθεσης και ανάληψης παραμένουν ορατά, οπότε το μέγεθος των ροών που εισέρχονται και εξέρχονται από την εμπιστευτική δεξαμενή εξακολουθεί να είναι ορατό.
  • Η κάλυψη προέρχεται από το μοντέλο ελεγκτή. Σε εκδόσεις που διαμορφώνουν καθολικό ελεγκτή, ένας πάροχος που λειτουργεί με το κλειδί ελεγκτή (ή λαμβάνει επιλεκτική αποκάλυψη από τον χρήστη ή τον εκδότη) μπορεί να ανακτήσει τα ποσά μεταφοράς. Οι εκδότες σε ρυθμιζόμενα πλαίσια θα πρέπει να σχεδιάζουν τη διαμόρφωση ελεγκτή ή να υποστηρίζουν επιλεκτική αποκάλυψη ώστε η παρακολούθηση να είναι εφικτή.

Συμβατότητα προς τα πίσω

  • Ένα confidential token account έχει πάντα δημόσιο υπόλοιπο. Τα πορτοφόλια και οι εφαρμογές που δεν υποστηρίζουν την επέκταση συνεχίζουν να λειτουργούν και εμφανίζουν το δημόσιο υπόλοιπο.
  • Οι τυπικές μεταφορές εξακολουθούν να λειτουργούν για το δημόσιο υπόλοιπο, εφόσον ο παραλήπτης επιτρέπει μη εμπιστευτικές πιστώσεις.
  • Τα εμπιστευτικά υπόλοιπα δεν είναι ορατά σε εργαλεία που δεν τα υποστηρίζουν, αλλά τα κεφάλαια δεν χάνονται: οποιοσδήποτε πελάτης με υποστήριξη εμπιστευτικών συναλλαγών μπορεί να αποκτήσει πρόσβαση σε αυτά με τα κλειδιά του κατόχου.
  • Επειδή τα ποσά είναι κρυπτογραφημένα, τα αναλυτικά εργαλεία προσφοράς και όγκου που βασίζονται στην ανάγνωση ποσών μεταφοράς δεν θα βλέπουν εμπιστευτική δραστηριότητα. Σχεδιάστε τα dashboards και τη λογιστική σας λαμβάνοντας αυτό υπόψη.

Προτεινόμενες Προτεραιότητες Ενσωμάτωσης ανά Πλατφόρμα

Γενικές Απαιτήσεις

ΑπαίτησηΠεριγραφήΠροτεραιότητα
Ανίχνευση επέκτασηςΑναγνωρίστε την επέκταση Confidential Transfer σε mints και λογαριασμούς και διαχειριστείτε αυτά τα token ρητά, αντί να υποθέτετε ένα μοντέλο αποκλειστικά δημόσιου υπολοίπου.P0
Ποτέ μην χάνετε εμπιστευτικά κεφάλαιαΑκόμα και χωρίς πλήρη υποστήριξη, εμφανίστε ότι υπάρχει εμπιστευτικό υπόλοιπο ώστε οι χρήστες να μην θεωρούν ότι ο λογαριασμός τους είναι άδειος.P0
Ορθή διαχείριση κλειδιώνΕπιλέξτε στρατηγική κλειδιών για τα κλειδιά ElGamal και AES. Η παραγωγή τους από το πορτοφόλι του κατόχου είναι η προτεινόμενη προεπιλογή· αν αποθηκεύετε κλειδιά, προστατέψτε τα όπως τα κλειδιά υπογραφής.P0

Πορτοφόλια

ΑπαίτησηΠεριγραφήΠροτεραιότητα
Εμφάνιση δημόσιου υπολοίπουΝα εμφανίζετε πάντα το δημόσιο υπόλοιπο χρησιμοποιώντας τυπικές αναγνώσεις υπολοίπου token.P0
Ξεκλείδωμα και εμφάνιση διαθέσιμου υπολοίπουΕπιτρέψτε στον χρήστη να ξεκλειδώνει κλειδιά μέσω υπογραφής και εμφανίστε το αποκρυπτογραφημένο διαθέσιμο υπόλοιπο (μέσω του αποκρυπτογραφήσιμου υπολοίπου AES).P0
Εμφάνιση εκκρεμών έναντι διαθέσιμωνΕμφανίστε τα εκκρεμή υπόλοιπα ξεχωριστά και προτρέψτε για εφαρμογή τους όταν λαμβάνονται κεφάλαια.P1
Αυτόματη εφαρμογή εκκρεμώνΕφαρμόστε τα εκκρεμή υπόλοιπα σε κατάλληλες στιγμές (π.χ. πριν από μια αποστολή) ώστε τα κεφάλαια να μην κολλούν.P1
Εμπιστευτική αποστολήΥποστηρίξτε ροές κατάθεσης, μεταφοράς και ανάληψης με δημιουργία αποδείξεων από την πλευρά του πελάτη.P1
UX κλειδωμένης κατάστασηςΌταν τα κλειδιά δεν είναι ξεκλειδωμένα, να υποδεικνύετε σαφώς ότι υπάρχει εμπιστευτικό υπόλοιπο αντί να εμφανίζετε μηδέν.P1
Εισαγωγή / εκπαίδευσηΒοηθήστε τους χρήστες να κατανοήσουν τι παραμένει ιδιωτικό (ποσά και υπόλοιπα) και το βήμα ξεκλειδώματος κλειδιών.P2

Εξερευνητές και Ευρετηριαστές

ΑπαίτησηΠεριγραφήΠροτεραιότητα
Επισήμανση εμπιστευτικών λογαριασμών και νομισμάτωνΣαφής σήμανση λογαριασμών και νομισμάτων που χρησιμοποιούν την επέκταση, με εμφάνιση του δημόσιου υπολοίπου.P0
Ανάλυση εμπιστευτικών εντολώνΑποκωδικοποίηση εντολών ρύθμισης, κατάθεσης, εφαρμογής, μεταφοράς και ανάληψης, με εμφάνιση του τύπου τους (όχι των ποσών).P0
Μη εμφάνιση κρυπτογραφημένων ποσών ως αριθμώνΠοτέ να μην αποδίδονται πεδία κρυπτοκειμένου ως απλά υπόλοιπα· να εμφανίζονται ως εμπιστευτικά.P0
Ευρετηρίαση δημόσιων ροών κατάθεσης/ανάληψηςΚαταγραφή των ποσών σε καθαρό κείμενο κατά την κατάθεση και ανάληψη για παρακολούθηση της ροής προς και από την εμπιστευτική δεξαμενή.P1
Συσχέτιση μεταφορών πολλαπλών συναλλαγώνΟμαδοποίηση των συναλλαγών ρύθμισης απόδειξης, μεταφοράς και εκκαθάρισης που αποτελούν μία εμπιστευτική μεταφορά.P1
Εμφάνιση ρύθμισης ελεγκτήΑνάδειξη του εάν ένα νόμισμα έχει διαμορφωμένο καθολικό ελεγκτή.P1
Κύκλος ζωής λογαριασμού απόδειξηςΑναγνώριση δημιουργίας και κλεισίματος λογαριασμού κατάστασης πλαισίου απόδειξης, ώστε οι συναλλαγές να διαβάζονται με νόημα.P2

Ανταλλακτήρια και Θεματοφύλακες

ΑπαίτησηΠεριγραφήΠροτεραιότητα
Παρακολούθηση δημόσιας και εμπιστευτικής κατάστασηςΛογιστική τόσο των δημόσιων όσο και των εμπιστευτικών υπολοίπων κατά την πίστωση καταθέσεων και τον υπολογισμό των διακρατήσεων.P0
Εφαρμογή εκκρεμών ποσών κατά τις καταθέσειςΕφαρμογή εκκρεμών υπολοίπων όταν φθάνουν εμπιστευτικές καταθέσεις, ώστε τα πιστούμενα ποσά να είναι ακριβή.P0
Ασφαλής διαχείριση κλειδιώνΕάν διακρατούνται εμπιστευτικά κεφάλαια ως θεματοφύλακας, διαχείριση κλειδιών ElGamal/AES με την ίδια αυστηρότητα όπως τα κλειδιά υπογραφής.P0
Προμήθεια λογαριασμών μέσω μητρώουΓια τη δημιουργία εμπιστευτικών λογαριασμών για χρήστες, να ζητείται από τους χρήστες να καταχωρίσουν ένα κλειδί ElGamal μία φορά και να γίνεται προμήθεια μέσω της διαδρομής μητρώου, αντί να απαιτείται υπογραφή ανά λογαριασμό.P1
Αναλήψεις προς χρήστεςΥποστήριξη εμπιστευτικών ή δημόσιων αναλήψεων ανάλογα με τη διαμόρφωση του λογαριασμού προορισμού.P1
Συμμόρφωση / υποστήριξη ελεγκτήΌπου απαιτείται, χρήση κλειδιών ελεγκτή ή επιλεκτικής αποκάλυψης για την εκπλήρωση υποχρεώσεων αναφοράς.P1
Εσωτερική λογιστική επί ακατέργαστων ποσώνΣυμφωνία με αποκρυπτογραφημένα ποσά στο σημείο εισόδου και αποθήκευσή τους· να μην επιχειρείται συνάθροιση κρυπτοκειμένων.P1

Πάροχοι Συμμόρφωσης και KYT

ΑπαίτησηΠεριγραφήΠροτεραιότητα
Έλεγχος διευθύνσεων και γράφουΈλεγχος αποστολέων, παραληπτών, εκδοτών και ιδιοκτητών και εκτέλεση ανάλυσης γράφου αντισυμβαλλομένων· αυτά παραμένουν δημόσια.P0
Παρακολούθηση δημόσιων καταθέσεων/αναλήψεωνΠαρακολούθηση των ποσών κατάθεσης και ανάληψης σε καθαρό κείμενο ως τα ορατά σημεία εισόδου και εξόδου του εμπιστευτικού pool.P0
Ορατότητα ποσών με κλειδί ελεγκτήΓια εκδόσεις με ενεργοποιημένο ελεγκτή, αποκρυπτογράφηση ποσών μεταφοράς με το κλειδί ελεγκτή για υποστήριξη ανίχνευσης βάσει ποσού.P1
Λήψη επιλεκτικής αποκάλυψηςΥποστήριξη αποκαλύψεων ποσών που κοινοποιούνται από χρήστες ή εκδότες μέσω κλειδιών ανά λογαριασμό.P2

Is this page helpful?

© 2026 Ίδρυμα Solana. Με επιφύλαξη παντός δικαιώματος.