Το Token ACL (Access Control List) είναι ένα πρόγραμμα Solana που επιτρέπει συμμορφούμενα, διαπιστευμένα tokens χωρίς να θυσιάζεται η εμπειρία χρήστη. Υλοποιεί sRFC37, επιτρέποντας σε επιχειρήσεις να δημιουργούν tokens με λειτουργικότητα λίστας αποδεκτών/αποκλεισμένων, διατηρώντας παράλληλα την απρόσκοπτη εμπειρία χρήστη που περιμένουν οι χρήστες.
Το Πρόβλημα
Οι επιχειρήσεις χρειάζονται συμμορφούμενα tokens που να μπορούν να:
- Επιβάλλουν απαιτήσεις KYC/AML
- Αποκλείουν κυρωμένες διευθύνσεις
- Περιορίζουν τις μεταφορές tokens σε εγκεκριμένα μέρη
Η παραδοσιακή προσέγγιση χρησιμοποιεί την επέκταση DefaultAccountState του Token-2022 για
τη δημιουργία λογαριασμών σε παγωμένη κατάσταση, απαιτώντας χειροκίνητη παρέμβαση για την
απόψυξη κάθε λογαριασμού:
┌─────────────────────────────────────────────────────┐│ TRADITIONAL FROZEN TOKENS │├─────────────────────────────────────────────────────┤│ ││ 1. User creates token account ││ └─> Account is FROZEN ❄️ ││ ││ 2. User contacts issuer support ││ └─> "Please whitelist my wallet" ││ ││ 3. Issuer manually verifies KYC ││ └─> Delays, friction, poor UX ││ ││ 4. Issuer thaws account ││ └─> Finally can receive tokens ││ ││ ❌ Bad UX - users wait hours/days ││ │└─────────────────────────────────────────────────────┘
Αυτό δημιουργεί σημαντική τριβή και ακυρώνει την υπόσχεση άμεσων, αδειοδότητων συναλλαγών blockchain.
Η Λύση
Το Token ACL επιτρέπει την απόψυξη χωρίς άδεια - οι χρήστες μπορούν να αποψύξουν αυτόματα τους δικούς τους λογαριασμούς εάν πληρούν τα κριτήρια που ορίζει ένα Gate Program:
┌─────────────────────────────────────────────────────┐│ TOKEN ACL FLOW │├─────────────────────────────────────────────────────┤│ ││ 1. User creates token account ││ └─> Account is FROZEN ❄️ ││ ││ 2. User calls permissionless thaw ││ └─> Token ACL checks Gate Program ││ ││ 3. Gate Program validates user ││ ├─> On allow list? ✅ THAW ││ ├─> On block list? ❌ STAY FROZEN ││ └─> AllowAllEoas mode? ✅ THAW ││ ││ 4. Account thawed instantly! ││ └─> User can receive tokens immediately ││ ││ ✅ Great UX - instant, self-service ││ │└─────────────────────────────────────────────────────┘
Εκπαιδευτική Υλοποίηση Αναφοράς
Αυτός ο οδηγός περιλαμβάνει μια πλήρη λειτουργική υλοποίηση που μπορείτε να εκτελέσετε τοπικά. Ο πηγαίος κώδικας παρέχει υλοποιήσεις αναφοράς για εξερεύνηση και εκπαιδευτικούς σκοπούς.
Ο κώδικας των προγραμμάτων ACL είναι διαθέσιμος στο αποθετήριο token-acl και το ABL Gate Program είναι διαθέσιμο στο αποθετήριο abl-gate-program.
Σημαντικό: Το ABL (Allow Block List) Gate Program που χρησιμοποιείται σε αυτόν τον οδηγό είναι μια υλοποίηση αναφοράς. Παρόλο που έχει ελεγχθεί και είναι έτοιμο για παραγωγή, οι εκδότες είναι ελεύθεροι να δημιουργήσουν προσαρμοσμένα Gate Programs που ταιριάζουν καλύτερα στις συγκεκριμένες ανάγκες συμμόρφωσής τους. Δεσμεύεστε μόνο από την προδιαγραφή Token ACL (sRFC37), όχι από αυτή τη συγκεκριμένη σχεδίαση Gate Program.
ΜΗΝ χρησιμοποιείτε αυτόν τον κώδικα απευθείας στην παραγωγή χωρίς:
- Ολοκληρωμένους ελέγχους ασφαλείας
- Κατάλληλα συστήματα διαχείρισης κλειδιών
- Έλεγχο κανονιστικής συμμόρφωσης
- Νομική συμβουλή
Γιατί Token ACL;
| Πτυχή | Παραδοσιακή Παγωμένη | Token ACL |
|---|---|---|
| Ενεργοποίηση Λογαριασμού | Χειροκίνητη (λεπτά/μέρες) | Άμεση (αυτοεξυπηρέτηση) |
| Εμπειρία Χρήστη | Κακή | Απρόσκοπτη |
| Έλεγχος Συμμόρφωσης | Πλήρης | Πλήρης |
| Αποκλεισμός Κυρώσεων | Χειροκίνητος | Αυτόματος μέσω Gate Program |
| Προσπάθεια Ενσωμάτωσης | Υψηλή | Χαμηλή (διαθέσιμο SDK) |
| Συνθεσιμότητα | Περιορισμένη | Πλήρης (λειτουργεί με DeFi) |
Token ACL έναντι Transfer Hooks
Τόσο το Token ACL όσο και τα Transfer Hooks είναι λύσεις Token-2022 για την προσθήκη προσαρμοσμένης λογικής στα tokens, αλλά εξυπηρετούν διαφορετικούς σκοπούς και έχουν διαφορετικές αντισταθμίσεις:
| Πτυχή | Token ACL | Transfer Hooks |
|---|---|---|
| Πότε Εκτελείται η Λογική | Μόνο κατά τις λειτουργίες παγώματος/απόψυξης | Σε κάθε μεταφορά |
| Επιβάρυνση Μεταφοράς | Καμία - οι μεταφορές είναι τυπικές | Επιπλέον CUs + λογαριασμοί σε κάθε μεταφορά |
| Εξαρτήσεις Λογαριασμού | Μόνο κατά την ενεργοποίηση λογαριασμού | Απαιτούνται σε κάθε συναλλαγή μεταφοράς |
| Συνθεσιμότητα DeFi | Πλήρης - τα πρωτόκολλα λειτουργούν κανονικά | Περιορισμένη - πολλά πρωτόκολλα τα αποκλείουν |
| Ιδανικό Για | KYC/AML, κυρώσεις, λίστες αποδεκτών/αποκλεισμένων | Δικαιώματα, προσαρμοσμένη επικύρωση μεταφοράς |
| Πολυπλοκότητα για Χρήστες | Χαμηλή - εφάπαξ λειτουργία απόψυξης | Υψηλότερη - κάθε μεταφορά χρειάζεται επιπλέον δεδομένα |
Πότε να Χρησιμοποιήσετε Token ACL
Επιλέξτε Token ACL όταν χρειάζεται να ελέγξετε ποιος μπορεί να κατέχει το token σας:
- Συμμόρφωση KYC/AML - επαλήθευση κατόχων πριν μπορέσουν να λάβουν tokens
- Έλεγχος κυρώσεων - αποκλεισμός συγκεκριμένων διευθύνσεων
- Περιορισμοί διαπιστευμένων επενδυτών - περιορισμός κατόχων token σε επαληθευμένα μέρη
- Αποκλεισμός PDA - αποτροπή έξυπνων συμβολαίων από την κατοχή tokens
Πότε να Χρησιμοποιήσετε Transfer Hooks
Επιλέξτε Transfer Hooks όταν χρειάζεται να ελέγξετε πώς κινούνται τα tokens:
- Δικαιώματα NFT - χρέωση τελών σε κάθε μεταφορά
- Περιορισμοί μεταφοράς - περιορισμός ποσών ή συχνότητας μεταφοράς
- Προσαρμοσμένη λογική μεταφοράς - εκτέλεση κώδικα σε κάθε κίνηση
- Ανάλυση onchain - παρακολούθηση όλων των κινήσεων token
Συμπληρωματικές Λύσεις
Το Token ACL και τα Transfer Hooks μπορούν να χρησιμοποιηθούν μαζί. Για παράδειγμα, μπορείτε να χρησιμοποιήσετε Token ACL για να ελέγξετε ποιος μπορεί να κατέχει το token σας (συμμόρφωση) ενώ χρησιμοποιείτε Transfer Hooks για την επιβολή δικαιωμάτων σε κάθε μεταφορά.
Επισκόπηση Αρχιτεκτονικής
Το Token ACL αποτελείται από τρία κύρια στοιχεία:
- Token ACL Program: Το βασικό πρόγραμμα που διαχειρίζεται την ανάθεση εξουσιοδότησης παγώματος και τις λειτουργίες χωρίς άδεια
- Gate Program: Προσαρμοσμένη λογική που καθορίζει ποιος μπορεί να αποψύξει/παγώσει (π.χ., ABL Gate Program για λίστες αποδεκτών/αποκλεισμένων)
- MintConfig: Διαμόρφωση ανά mint που αποθηκεύει ρυθμίσεις και αναθέτει εξουσιοδότηση παγώματος
┌─────────────────────────────────────────────────────────────────┐│ TOKEN ACL ARCHITECTURE │├─────────────────────────────────────────────────────────────────┤│ ││ ┌──────────────┐ delegates ┌─────────────────┐ ││ │ Token Mint │ ──────────────────→ │ MintConfig │ ││ │ (Token-22) │ freeze authority │ (Token ACL) │ ││ └──────────────┘ └────────┬────────┘ ││ │ ││ │ calls ││ ▼ ││ ┌──────────────┐ validates ┌─────────────────┐ ││ │ User │ ◄─────────────────── │ Gate Program │ ││ │ (wallet) │ │ (ABL/Custom) │ ││ └──────────────┘ └─────────────────┘ ││ │ ││ ┌────────┴────────┐ ││ │ │ ││ ┌────▼────┐ ┌─────▼───┐ ││ │ Allow │ │ Block │ ││ │ Lists │ │ Lists │ ││ └─────────┘ └─────────┘ ││ │└─────────────────────────────────────────────────────────────────┘
Βασικές Έννοιες
-
Ανάθεση Εξουσιοδότησης Παγώματος: Όταν δημιουργείτε μια διαμόρφωση Token ACL, η εξουσιοδότηση παγώματος του mint μεταφέρεται στο MintConfig PDA. Αυτό επιτρέπει στο Token ACL να διαχειρίζεται τις λειτουργίες παγώματος/απόψυξης.
-
Gate Programs: Εξωτερικά προγράμματα που υλοποιούν τη λογική αποδεκτών/αποκλεισμένων. Το ABL (Allow Block List) Gate Program είναι μια υλοποίηση αναφοράς - οι εκδότες μπορούν να δημιουργήσουν προσαρμοσμένα Gate Programs με διαφορετική λογική (π.χ., επαλήθευση KYC onchain, ελέγχους κυρώσεων βάσει oracle, ή ενσωμάτωση με πρωτόκολλα ταυτότητας).
-
Λειτουργίες Χωρίς Άδεια: Οι χρήστες μπορούν να αποψύξουν τους δικούς τους λογαριασμούς χωρίς παρέμβαση του εκδότη, εφόσον το Gate Program εγκρίνει.
-
Ενσωμάτωση TokenMetadata: Η προσθήκη ενός πεδίου
token_aclστα μεταδεδομένα του mint επιτρέπει την αυτόματη ανίχνευση από πορτοφόλια και SDKs όπως@solana/token-helpers.
Αυτόματη Ανίχνευση με TokenMetadata
Όταν προσθέτετε ένα πεδίο token_acl στην επέκταση TokenMetadata του mint σας που δείχνει
στη διεύθυνση του Gate Program, τα SDKs όπως @solana/token-helpers μπορούν αυτόματα
να ανιχνεύσουν τα Token ACL mints και να συμπεριλάβουν οδηγίες απόψυξης κατά τη δημιουργία token
accounts.
Λειτουργίες ABL Gate Program
Το ABL είναι Υλοποίηση Αναφοράς
Το ABL Gate Program που παρουσιάζεται εδώ είναι μια υλοποίηση αναφοράς που καλύπτει συνηθισμένες περιπτώσεις χρήσης λιστών αποδεκτών/αποκλεισμένων. Ωστόσο, δεν είστε κλειδωμένοι σε αυτή τη σχεδίαση. Η προδιαγραφή Token ACL (sRFC37) ορίζει μόνο τη διεπαφή μεταξύ Token ACL και Gate Programs - μπορείτε να δημιουργήσετε προσαρμοσμένα Gate Programs με:
- Ενσωμάτωση με πρωτόκολλα ταυτότητας/KYC onchain
- Έλεγχο κυρώσεων σε πραγματικό χρόνο βάσει oracle
- Ροές εργασίας έγκρισης multi-sig
- Κανόνες πρόσβασης βάσει χρόνου ή υπό συνθήκες
- Οποιαδήποτε άλλη προσαρμοσμένη λογική συμμόρφωσης
Η μόνη απαίτηση είναι η υλοποίηση της διεπαφής Gate Program που ορίζεται στο sRFC37.
Το ABL (Allow Block List) Gate Program υποστηρίζει διάφορες λειτουργίες:
| Λειτουργία | Περιγραφή | Περίπτωση Χρήσης |
|---|---|---|
AllowAllEoas | Όλα τα κανονικά πορτοφόλια (μη-PDAs) μπορούν να αποψύξουν | Ανοιχτά tokens με αποκλεισμό PDA |
Allow | Μόνο πορτοφόλια στη λίστα αποδεκτών μπορούν να αποψύξουν | Tokens που απαιτούν KYC |
Block | Όλα τα πορτοφόλια ΕΚΤΟΣ αυτών στη λίστα αποκλεισμένων μπορούν να αποψύξουν | Συμμόρφωση κυρώσεων |
| Σύνθετη | Συνδυασμός λιστών αποδεκτών + αποκλεισμένων | Πλήρης ρύθμιση συμμόρφωσης |
Προτεραιότητα Λίστας Αποκλεισμένων
Κατά τη χρήση σύνθετων λιστών, η λίστα αποκλεισμένων έχει πάντα προτεραιότητα. Ένα πορτοφόλι που βρίσκεται τόσο στη λίστα αποδεκτών ΟΣΟ ΚΑΙ στη λίστα αποκλεισμένων ΔΕΝ θα μπορεί να αποψύξει.
Διευθύνσεις Προγραμμάτων
Για διευκόλυνση, τα προγράμματα είναι ήδη αναπτυγμένα στο devnet. Μπορείτε να χρησιμοποιήσετε τις παρακάτω διευθύνσεις. Η κυκλοφορία στο Mainnet θα ακολουθήσει μετά τους ελέγχους.
| Πρόγραμμα | Διεύθυνση |
|---|---|
| Token ACL | TACLkU6CiCdkQN2MjoyDkVg2yAH9zkxiHDsiztQ52TP |
| ABL Gate Program | GATEzzqxhJnsWF6vHRsgtixxSB8PaQdcqGEVTEHWiULz |
Προαπαιτούμενα
Για να εκτελέσετε τα παραδείγματα τοπικά, βεβαιωθείτε ότι έχετε κλωνοποιήσει τα προγράμματα στον τοπικό σας validator:
-
Solana CLI
(Για τοπική εκτέλεση χρησιμοποιήστε 2.x, ΟΧΙ 3.x - υπάρχει γνωστό πρόβλημα με τα μεταδεδομένα Token-2022 αυτή τη στιγμή, που θα αποτύγχανε στο βήμα προσθήκης επιπλέον μεταδεδομένων)
solana --version -
Node.js 18+ και pnpm
-
Τοπικό validator με απαιτούμενα προγράμματα:
solana-test-validator \--clone TACLkU6CiCdkQN2MjoyDkVg2yAH9zkxiHDsiztQ52TP \--clone GEC5tu9eaZQrNS7ohERwZRqyvLvV8k2iVZqqt6VuwvJu \--clone GATEzzqxhJnsWF6vHRsgtixxSB8PaQdcqGEVTEHWiULz \--clone D2GUvBwbnkFu3R5s1rz5dcBJ81UsqY3nvHbLdeJLtSx5 \--url devnet \--reset
Πλήρης Υλοποίηση
Βήμα 1: Εγκατάσταση Εξαρτήσεων
pnpm add @solana/kit @solana-program/token-2022 @solana-program/system \@solana-program/compute-budget @token-acl/sdk @token-acl/abl-sdk \@solana/spl-token-metadata @solana/web3.js ws
Βήμα 2: Δημιουργία Token με Token ACL
Εδώ είναι ένα πλήρες παράδειγμα που δημιουργεί ένα συμμορφούμενο token με Token ACL:
import {createSolanaRpc,createSolanaRpcSubscriptions,sendAndConfirmTransactionFactory,getSignatureFromTransaction,generateKeyPairSigner,pipe,createTransactionMessage,setTransactionMessageFeePayer,setTransactionMessageLifetimeUsingBlockhash,appendTransactionMessageInstructions,signTransactionMessageWithSigners,lamports} from "@solana/kit";import { getCreateAccountInstruction } from "@solana-program/system";import { getSetComputeUnitLimitInstruction } from "@solana-program/compute-budget";import {TOKEN_2022_PROGRAM_ADDRESS,getInitializeMintInstruction,getInitializeTokenMetadataInstruction,getUpdateTokenMetadataFieldInstruction,tokenMetadataField,AccountState,getMintSize,getPreInitializeInstructionsForMintExtensions,extension} from "@solana-program/token-2022";import { pack } from "@solana/spl-token-metadata";import { PublicKey } from "@solana/web3.js";// Token ACL SDKimport {getCreateConfigInstruction,findMintConfigPda,getTogglePermissionlessInstructionsInstruction,findThawExtraMetasAccountPda} from "@token-acl/sdk";// ABL Gate Program SDKimport {getCreateListInstruction,getSetupExtraMetasInstruction,getAddWalletInstruction,findListConfigPda,findWalletEntryPda,ABL_PROGRAM_ADDRESS,Mode} from "@token-acl/abl-sdk";// TLV sizes for Token-2022 extensionsconst TYPE_SIZE = 2;const LENGTH_SIZE = 2;async function createTokenACLMint() {// Setup RPCconst rpc = createSolanaRpc("http://localhost:8899");const rpcSubscriptions = createSolanaRpcSubscriptions("ws://localhost:8900");const sendAndConfirm = sendAndConfirmTransactionFactory({rpc,rpcSubscriptions});// Load your payer keypairconst payer = await loadKeypair("~/.config/solana/id.json");// Generate mint keypairconst mint = await generateKeyPairSigner();console.log(`🪙 Mint: ${mint.address}`);// TokenMetadata config - includes 'token_acl' for auto-detectionconst TOKEN_NAME = "Compliant Token";const TOKEN_SYMBOL = "COMP";const TOKEN_URI = "";const TOKEN_ACL_KEY = "token_acl";// Define extensionsconst defaultAccountStateExtension = extension("DefaultAccountState", {state: AccountState.Frozen});const metadataPointerExtension = extension("MetadataPointer", {authority: payer.address,metadataAddress: mint.address});const extensions = [defaultAccountStateExtension, metadataPointerExtension];// Calculate mint sizeconst baseMintSize = getMintSize(extensions);const metadataForSizing = {mint: new PublicKey(mint.address),name: TOKEN_NAME,symbol: TOKEN_SYMBOL,uri: TOKEN_URI,additionalMetadata: [[TOKEN_ACL_KEY, ABL_PROGRAM_ADDRESS]] as [string,string][]};const metadataLen = pack(metadataForSizing).length;const totalSpace = baseMintSize + metadataLen + TYPE_SIZE + LENGTH_SIZE;// Get rentconst mintRent = await rpc.getMinimumBalanceForRentExemption(BigInt(totalSpace)).send();// Get extension pre-initialization instructionsconst extensionInstructions = getPreInitializeInstructionsForMintExtensions(mint.address,extensions);// Build transactionconst { value: blockhash } = await rpc.getLatestBlockhash().send();const createMintTx = pipe(createTransactionMessage({ version: 0 }),(tx) => setTransactionMessageFeePayer(payer.address, tx),(tx) => setTransactionMessageLifetimeUsingBlockhash(blockhash, tx),(tx) =>appendTransactionMessageInstructions([getSetComputeUnitLimitInstruction({ units: 400_000 }),getCreateAccountInstruction({payer,newAccount: mint,lamports: lamports(mintRent),space: baseMintSize,programAddress: TOKEN_2022_PROGRAM_ADDRESS}),...extensionInstructions,getInitializeMintInstruction({mint: mint.address,decimals: 6,mintAuthority: payer.address,freezeAuthority: payer.address}),getInitializeTokenMetadataInstruction({metadata: mint.address,updateAuthority: payer.address,mint: mint.address,mintAuthority: payer,name: TOKEN_NAME,symbol: TOKEN_SYMBOL,uri: TOKEN_URI}),getUpdateTokenMetadataFieldInstruction({metadata: mint.address,updateAuthority: payer,field: tokenMetadataField("Key", [TOKEN_ACL_KEY]),value: ABL_PROGRAM_ADDRESS})],tx));// Sign and sendconst signedTx = await signTransactionMessageWithSigners(createMintTx);await sendAndConfirm(signedTx, { commitment: "confirmed" });console.log("✅ Mint created with TokenMetadata");return mint.address;}
Βήμα 3: Δημιουργία Διαμόρφωσης Token ACL
Αφού δημιουργήσετε το mint, δημιουργήστε τη διαμόρφωση Token ACL:
async function createTokenACLConfig(mintAddress: Address,payer: TransactionSigner) {const [mintConfigPda] = await findMintConfigPda({ mint: mintAddress });console.log(`📋 MintConfig PDA: ${mintConfigPda}`);const createConfigIx = getCreateConfigInstruction({payer: payer.address,authority: payer,mint: mintAddress,mintConfig: mintConfigPda,gatingProgram: ABL_PROGRAM_ADDRESS});const { value: blockhash } = await rpc.getLatestBlockhash().send();const tx = pipe(createTransactionMessage({ version: 0 }),(tx) => setTransactionMessageFeePayer(payer.address, tx),(tx) => setTransactionMessageLifetimeUsingBlockhash(blockhash, tx),(tx) => appendTransactionMessageInstructions([createConfigIx], tx));const signedTx = await signTransactionMessageWithSigners(tx);await sendAndConfirm(signedTx, { commitment: "confirmed" });console.log("✅ Token ACL config created");console.log(" Freeze authority transferred to MintConfig PDA");return mintConfigPda;}
Βήμα 4: Ρύθμιση ABL Gate Program
Δημιουργήστε μια λίστα ABL και ρυθμίστε τα επιπλέον metas:
// AllowAllEoas - All regular wallets can thaw automaticallyasync function setupAllowAllEoas(mintAddress: Address,mintConfigPda: Address,payer: TransactionSigner) {const listSeed = mintAddress; // Use mint as seedconst [listConfigPda] = await findListConfigPda({authority: payer.address,seed: listSeed});const createListIx = getCreateListInstruction({authority: payer,listConfig: listConfigPda,mode: Mode.AllowAllEoas, // All EOAs can thawseed: listSeed});const [thawExtraMetasPda] = await findThawExtraMetasAccountPda({ mint: mintAddress },{ programAddress: ABL_PROGRAM_ADDRESS });const setupMetasIx = getSetupExtraMetasInstruction({authority: payer,tokenAclMintConfig: mintConfigPda,mint: mintAddress,extraMetas: thawExtraMetasPda,lists: [listConfigPda]});// Send transaction with both instructions...console.log("✅ ABL list created with AllowAllEoas mode");}
Βήμα 5: Ενεργοποίηση Απόψυξης Χωρίς Άδεια
Επιτρέψτε στους χρήστες να αποψύξουν τους δικούς τους λογαριασμούς:
async function enablePermissionlessThaw(mintConfigPda: Address,authority: TransactionSigner) {const toggleIx = getTogglePermissionlessInstructionsInstruction({authority,mintConfig: mintConfigPda,thawEnabled: true,freezeEnabled: false // Optional: enable permissionless freeze too});// Send transaction...console.log("✅ Permissionless thaw enabled");}
Βήμα 6: Ο Χρήστης Αποψύχει τον Λογαριασμό του
Οι χρήστες μπορούν τώρα να αποψύξουν τους δικούς τους λογαριασμούς χρησιμοποιώντας το SDK:
import {createThawPermissionlessIdempotentInstructionWithExtraMetas,TOKEN_ACL_PROGRAM_ADDRESS} from "@token-acl/sdk";import { fetchEncodedAccount } from "@solana/kit";async function userThawsAccount(mintAddress: Address,userAta: Address,userAddress: Address,payer: TransactionSigner) {// Account retriever function for the SDKconst accountRetriever = async (addr: Address) => {return await fetchEncodedAccount(rpc, addr);};// The SDK handles all the complexity of fetching extra metasconst thawIx =await createThawPermissionlessIdempotentInstructionWithExtraMetas(payer, // authority (signer)userAta, // token account to thawmintAddress, // mintuserAddress, // token account ownerTOKEN_ACL_PROGRAM_ADDRESS, // Token ACL programaccountRetriever // account fetcher);// Send transaction signed by payer...console.log("✅ Account thawed permissionlessly!");}
Χρήση @solana/token-helpers για Αυτόματη Απόψυξη
Το SDK @solana/token-helpers μπορεί να ανιχνεύσει αυτόματα Token ACL mints και
να συμπεριλάβει οδηγίες απόψυξης:
import { createAndConfirmAssociatedTokenAccount } from "@solana/token-helpers";// This automatically includes thaw instruction if mint has 'token_acl' metadataconst { signature, associatedTokenAddress } =await createAndConfirmAssociatedTokenAccount(rpc,rpcSubscriptions,payer,user.address,mintAddress,true // idempotent);console.log(`✅ Account created AND thawed automatically!`);console.log(` ATA: ${associatedTokenAddress}`);
Απαίτηση TokenMetadata
Για να λειτουργεί η αυτόματη ανίχνευση του @solana/token-helpers, το mint σας πρέπει να διαθέτει:
- Την επέκταση
TokenMetadataαρχικοποιημένη - Ένα πεδίο
additionalMetadataμε κλειδίtoken_aclκαι τιμή ορισμένη στη διεύθυνση του Gate Program
Σύνθετες Λίστες Αποδεκτών + Αποκλεισμένων
Για μέγιστο έλεγχο συμμόρφωσης, συνδυάστε λίστες αποδεκτών και αποκλεισμένων:
async function setupCompositeLists(mintAddress: Address,mintConfigPda: Address,payer: TransactionSigner) {// Create ALLOW listconst allowListSeed = /* unique seed for allow list */;const [allowListPda] = await findListConfigPda({authority: payer.address,seed: allowListSeed,});const createAllowListIx = getCreateListInstruction({authority: payer,listConfig: allowListPda,mode: Mode.Allow,seed: allowListSeed,});// Create BLOCK listconst blockListSeed = /* unique seed for block list */;const [blockListPda] = await findListConfigPda({authority: payer.address,seed: blockListSeed,});const createBlockListIx = getCreateListInstruction({authority: payer,listConfig: blockListPda,mode: Mode.Block,seed: blockListSeed,});// Setup extra metas with BOTH listsconst [thawExtraMetasPda] = await findThawExtraMetasAccountPda({ mint: mintAddress },{ programAddress: ABL_PROGRAM_ADDRESS });const setupMetasIx = getSetupExtraMetasInstruction({authority: payer,tokenAclMintConfig: mintConfigPda,mint: mintAddress,extraMetas: thawExtraMetasPda,lists: [allowListPda, blockListPda], // Both lists!});// Send transaction...console.log("✅ Composite lists created");console.log(" - Allow list: Only whitelisted users can thaw");console.log(" - Block list: Blocked users can NEVER thaw");}
Συμπεριφορά Σύνθετης Λίστας
┌─────────────────────────────────────────────────────┐│ COMPOSITE LIST LOGIC │├─────────────────────────────────────────────────────┤│ ││ User tries to thaw: ││ ││ 1. Check BLOCK list first ││ └─> On block list? ❌ DENY (always) ││ ││ 2. Check ALLOW list ││ └─> On allow list? ✅ ALLOW ││ └─> Not on allow list? ❌ DENY ││ ││ Key insight: Block list ALWAYS wins! ││ │└─────────────────────────────────────────────────────┘
Περιπτώσεις Χρήσης
1. Tokens Ασφαλείας (Απαιτείται KYC)
Χρησιμοποιήστε μια λίστα αποδεκτών για να διασφαλίσετε ότι μόνο επαληθευμένοι μέσω KYC επενδυτές μπορούν να κατέχουν tokens:
// Create allow listconst createListIx = getCreateListInstruction({authority: issuer,listConfig: allowListPda,mode: Mode.Allow,seed: mintAddress});// After KYC verification, add investorawait addToAllowList(allowListPda, kycVerifiedInvestor, issuer);
2. Συμμόρφωση Κυρώσεων
Χρησιμοποιήστε μια λίστα αποκλεισμένων για να αποτρέψετε κυρωμένες διευθύνσεις από τη λήψη tokens:
// Create block listconst createListIx = getCreateListInstruction({authority: complianceOfficer,listConfig: blockListPda,mode: Mode.Block,seed: mintAddress});// Block sanctioned addressawait addToBlockList(blockListPda, sanctionedAddress, complianceOfficer);
3. Ανοιχτό Token με Προστασία PDA
Χρησιμοποιήστε AllowAllEoas για να επιτρέψετε σε όλα τα κανονικά πορτοφόλια ενώ αποκλείετε τα PDAs (έξυπνα συμβόλαια):
const createListIx = getCreateListInstruction({authority: payer,listConfig: listConfigPda,mode: Mode.AllowAllEoas, // Regular wallets OK, PDAs blockedseed: mintAddress});
4. Πλήρης Εταιρική Συμμόρφωση
Συνδυάστε λίστα αποδεκτών + λίστα αποκλεισμένων για πλήρη έλεγχο:
- Λίστα αποδεκτών: Επαληθευμένοι μέσω KYC επενδυτές
- Λίστα αποκλεισμένων: Κυρωμένες διευθύνσεις, απολυμένοι υπάλληλοι κ.λπ.
Ζητήματα Παραγωγής
Πριν από την ανάπτυξη σε παραγωγή:
-
Έλεγχοι Ασφαλείας: Λάβετε επαγγελματικούς ελέγχους ασφαλείας της υλοποίησής σας και οποιωνδήποτε προσαρμοσμένων Gate Programs
-
Διαχείριση Κλειδιών: Χρησιμοποιήστε κατάλληλες λύσεις φύλαξης για κλειδιά εξουσιοδότησης. Σκεφτείτε multi-sig για ευαίσθητες λειτουργίες
-
Κανονιστική Συμμόρφωση: Συμβουλευτείτε νομικούς εμπειρογνώμονες σχετικά με κανονισμούς κινητών αξιών, απαιτήσεις KYC/AML και συμμόρφωση κυρώσεων
-
Διαχείριση Λιστών: Δημιουργήστε ισχυρά συστήματα για τη διαχείριση λιστών αποδεκτών/αποκλεισμένων, συμπεριλαμβανομένων:
- Αυτοματοποιημένη ενσωμάτωση ελέγχου κυρώσεων
- Ενσωμάτωση παρόχου KYC
- Καταγραφή ελέγχου
-
Παρακολούθηση: Υλοποιήστε παρακολούθηση για:
- Αποτυχημένες προσπάθειες απόψυξης (πιθανά ζητήματα συμμόρφωσης)
- Τροποποιήσεις λίστας
- Χρήση κλειδιού εξουσιοδότησης
-
Αποκατάσταση Καταστροφών: Σχεδιάστε για εναλλαγή κλειδιών, ανάκτηση λίστας και διαδικασίες έκτακτου παγώματος
Έκδοση Solana CLI
Το Token ACL με TokenMetadata απαιτεί Solana CLI 2.x. Υπάρχει γνωστό πρόβλημα με το CLI 3.x που διακόπτει τη λειτουργία αυτόματης επέκτασης TokenMetadata. Πάντα επαληθεύετε την έκδοση του CLI σας πριν από την ανάπτυξη.
Διεπαφή Γραμμής Εντολών (CLI)
Τόσο το Token ACL όσο και το ABL Gate Program παρέχουν CLIs για τη διαχείριση διαμορφώσεων και λιστών χωρίς γραφή κώδικα. Αυτό είναι χρήσιμο για τις ομάδες λειτουργιών.
Token ACL CLI
Το Token ACL CLI διαχειρίζεται τις διαμορφώσεις mint και τις λειτουργίες παγώματος/απόψυξης.
Εγκατάσταση
# Install from crates.iocargo install token-acl-cli# Verify installationtoken-acl --version
Εντολές Token ACL
| Εντολή | Περιγραφή |
|---|---|
create-config | Δημιουργεί νέα διαμόρφωση mint (μεταφέρει εξουσιοδότηση παγώματος) |
delete-config | Διαγράφει μια διαμόρφωση mint |
set-authority | Ορίζει την εξουσιοδότηση μιας διαμόρφωσης mint |
set-gating-program | Ορίζει το πρόγραμμα gating για μια διαμόρφωση mint |
set-instructions | Ενεργοποίηση/απενεργοποίηση permissionless thaw/freeze |
thaw | Ξεπαγώνει ένα token account (απαιτείται εξουσιοδότηση) |
freeze | Παγώνει ένα token account (απαιτείται εξουσιοδότηση) |
thaw-permissionless | Ξεπαγώνει ένα token account χωρίς άδεια |
freeze-permissionless | Παγώνει ένα token account χωρίς άδεια |
create-ata-and-thaw-permissionless | Δημιουργεί ATA και ξεπαγώνει με μία εντολή |
Δημιουργία Διαμόρφωσης Token ACL
# Create a mint config (delegates freeze authority to Token ACL)token-acl create-config <MINT_ADDRESS> \--gating-program GATEzzqxhJnsWF6vHRsgtixxSB8PaQdcqGEVTEHWiULz
Ενεργοποίηση Permissionless Thaw
# Enable permissionless thaw only (recommended for most use cases)# - Users can self-service unfreeze after passing gate checks# - Only authority can freeze accounts (security best practice)token-acl set-instructions --enable-thaw --disable-freeze <MINT_ADDRESS># Enable both permissionless thaw AND freeze# Use case: Allow anyone to freeze blocked users, or users to self-freezetoken-acl set-instructions --enable-thaw --enable-freeze <MINT_ADDRESS># Disable all permissionless operations (authority-only mode)token-acl set-instructions --disable-thaw --disable-freeze <MINT_ADDRESS>
Λειτουργίες Thaw/Freeze
# Thaw an account permissionlessly (user self-service)token-acl thaw-permissionless <MINT_ADDRESS> <TOKEN_ACCOUNT_ADDRESS># Thaw using authority (issuer operation)token-acl thaw <MINT_ADDRESS> <TOKEN_ACCOUNT_ADDRESS># Freeze using authority (compliance enforcement)token-acl freeze <MINT_ADDRESS> <TOKEN_ACCOUNT_ADDRESS>
Δημιουργία ATA και Thaw με Μία Εντολή
# Creates associated token account and thaws it automaticallytoken-acl create-ata-and-thaw-permissionless --mint <MINT_ADDRESS> --owner <WALLET_ADDRESS>
ABL Gate CLI (allow-block-list)
Το ABL Gate CLI διαχειρίζεται λίστες αποδοχής/αποκλεισμού και εγγραφές πορτοφολιών.
Εγκατάσταση
# Install from crates.iocargo install token-acl-gate-cli# Verify installation (binary is named 'allow-block-list')allow-block-list --version
Εντολές ABL Gate
| Εντολή | Περιγραφή |
|---|---|
create-list | Δημιουργεί μια νέα λίστα αποδοχής/αποκλεισμού |
delete-list | Διαγράφει μια λίστα |
add-wallet | Προσθέτει ένα πορτοφόλι σε μια λίστα |
remove-wallet | Αφαιρεί ένα πορτοφόλι από μια λίστα |
apply-lists-to-mint | Ρυθμίζει ποιες λίστες εφαρμόζονται σε ένα mint |
Δημιουργία Λίστας
# Create an ALLOW list (only whitelisted wallets can thaw)allow-block-list create-list --mode allow# Create a BLOCK list (blocked wallets cannot thaw)allow-block-list create-list --mode block# Create an ALLOW-ALL-EOAs list (all regular wallets can thaw)allow-block-list create-list --mode allow-all-eoas
Η εντολή εξάγει τη διεύθυνση PDA του list_config και το seed - αποθηκεύστε τα!
Διαχείριση Πορτοφολιών σε Λίστες
# Add wallet to a list (works for both allow and block lists)allow-block-list add-wallet <LIST_ADDRESS> <WALLET_ADDRESS># Remove wallet from a listallow-block-list remove-wallet <LIST_ADDRESS> <WALLET_ADDRESS>
Εφαρμογή Λιστών σε Ένα Mint
# Apply a single list to a mintallow-block-list apply-lists-to-mint <MINT_ADDRESS> <LIST_ADDRESS># Apply multiple lists (e.g., allow + block for composite compliance)allow-block-list apply-lists-to-mint <MINT_ADDRESS> <ALLOW_LIST> <BLOCK_LIST>
Καθολικές Επιλογές CLI
Και τα δύο CLI υποστηρίζουν αυτές τις επιλογές:
| Επιλογή | Περιγραφή |
|---|---|
-u, --url <URL> | RPC URL (προεπιλογή: από τη διαμόρφωση Solana) |
-k, --payer <KEYPAIR> | Αρχείο keypair πληρωτή ή υλικό πορτοφόλι |
-C, --config <PATH> | Διαδρομή αρχείου διαμόρφωσης Solana |
-v, --verbose | Εμφάνιση πρόσθετων πληροφοριών |
Παράδειγμα Πλήρους Ροής Εργασίας CLI
Ακολουθεί μια πλήρης ροή εργασίας που χρησιμοποιεί όλα τα CLI για τη ρύθμιση ενός συμμορφούμενου token από το μηδέν:
# ============================================================================# STEP 1: Configure Solana CLI# ============================================================================solana config set --url localhost# ============================================================================# STEP 2: Create Token22 Mint with Metadata + DefaultAccountState Extensions# ============================================================================# Create the mint with:# - Token-2022 program# - Freeze authority enabled# - Default account state = frozen (all new accounts start frozen)# - Metadata extension with token_acl field for auto-detectionspl-token create-token \--program-id TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEb \--enable-freeze \--default-account-state frozen \--enable-metadata# Output:# Creating token 7KzLwpXMzKa8JiqYr2ookFjxLx1xMF4xM4YhVqPJpump# Address: 7KzLwpXMzKa8JiqYr2ookFjxLx1xMF4xM4YhVqPJpump# Save the mint address for use in subsequent commandsMINT=7KzLwpXMzKa8JiqYr2ookFjxLx1xMF4xM4YhVqPJpump# Initialize the token metadataspl-token initialize-metadata $MINT "Compliant Token" "COMP" "https://example.com/metadata.json"# Add the token_acl field for wallet auto-detection# This tells wallets/SDKs which gate program to use for thawspl-token update-metadata $MINT token_acl GATEzzqxhJnsWF6vHRsgtixxSB8PaQdcqGEVTEHWiULz# Verify the token was created correctlyspl-token display $MINT# ============================================================================# STEP 3: Create Token ACL Config# ============================================================================# This transfers freeze authority from your wallet to the Token ACL MintConfig PDAtoken-acl create-config $MINT \--gating-program GATEzzqxhJnsWF6vHRsgtixxSB8PaQdcqGEVTEHWiULz# Output:# ✅ Config created for mint 7KzLwpXMzKa8JiqYr2ookFjxLx1xMF4xM4YhVqPJpump# MintConfig PDA: 9xYzAbCdEfGhIjKlMnOpQrStUvWxYz123456789abc# ============================================================================# STEP 4: Create ABL Lists# ============================================================================# Create a block list for sanctions complianceallow-block-list create-list --mode block# Output:# list_config: 5HnJkLmNoPqRsTuVwXyZ987654321defghijk# seed: 3AbCdEfGhIjKlMnOpQrStUvWxYz123456789# Save the block list addressBLOCK_LIST=5HnJkLmNoPqRsTuVwXyZ987654321defghijk# ============================================================================# STEP 5: Apply Lists to Mint# ============================================================================# Configure the block list to be used for this mint's permissionless operationsallow-block-list apply-lists-to-mint $MINT $BLOCK_LIST# ============================================================================# STEP 6: Enable Permissionless Thaw# ============================================================================# Allow users to thaw their own accounts (if not on block list)# --enable-thaw: Users can self-service unfreeze after passing gate checks# --disable-freeze: Only authority can freezetoken-acl set-instructions --enable-thaw --disable-freeze $MINT# ============================================================================# STEP 7: Manage Block List (Compliance Operations)# ============================================================================# To fully block a user, you need TWO steps:# 1. Add to block list (prevents future thawing)# 2. Freeze their token account (stops current usage)# Step 7a: Add wallet to block list# Replace with actual wallet address to block (must be valid base58 pubkey)allow-block-list add-wallet $BLOCK_LIST <WALLET_TO_BLOCK># Step 7b: Freeze their existing token account (if they have one)# This requires the token account address, not the wallet address# spl-token address --verbose --token $MINT to get the token account address# token-acl freeze <TOKEN_ACCOUNT_ADDRESS># Note: Adding to block list alone only prevents them from THAWING.# If their account is already thawed, they can still use it until you freeze it!# Later, if sanctions are lifted:# 1. Remove from block list# allow-block-list remove-wallet $BLOCK_LIST <WALLET_ADDRESS># 2. User can then thaw their account again# ============================================================================# STEP 8: User Creates Account and Thaws# ============================================================================# A user can now create their token account and thaw it in one command# Use your own wallet or generate one: solana-keygen new --no-outfileUSER_WALLET=$(solana address) # Uses your configured wallettoken-acl create-ata-and-thaw-permissionless --mint $MINT --owner $USER_WALLET# Output:# ✅ Created ATA: 8AbCdEfGhIjKlMnOpQrStUvWxYz123456789xyz# ✅ Thawed successfully!# ============================================================================# STEP 9: Mint Tokens to User# ============================================================================# Now the issuer can mint tokens to the user's thawed accountspl-token mint $MINT 1000 --recipient-owner $USER_WALLET# Verify balancespl-token balance $MINT
Μεταδεδομένα Token για Αυτόματη Ανίχνευση
Η προσθήκη του πεδίου μεταδεδομένων token_acl είναι κρίσιμη για την ενσωμάτωση με πορτοφόλια. Όταν πορτοφόλια όπως το Phantom ή SDK όπως το @solana/token-helpers εντοπίζουν αυτό το πεδίο, συμπεριλαμβάνουν αυτόματα οδηγίες thaw κατά τη δημιουργία token accounts.
spl-token update-metadata $MINT token_acl GATEzzqxhJnsWF6vHRsgtixxSB8PaQdcqGEVTEHWiULz
Επόμενα Βήματα
-
Δοκιμάστε το Workshop: Κλωνοποιήστε το αποθετήριο token-acl και εκτελέστε τα παραδείγματα επίδειξης. Διαβάστε την υλοποίηση του ACL και του ABL Gate Program.
-
Δημιουργήστε Προσαρμοσμένα Gate Programs: Το ABL Gate Program είναι απλώς μια υλοποίηση αναφοράς. Δημιουργήστε το δικό σας Gate Program για ενσωμάτωση με την υπάρχουσα υποδομή συμμόρφωσης, παρόχους ταυτότητας, ή υλοποιήστε προσαρμοσμένη λογική που ταιριάζει στις συγκεκριμένες απαιτήσεις σας
-
Ενσωμάτωση με DeFi: Τα token ACL tokens είναι πλήρως συνθέσιμα με πρωτόκολλα DeFi
-
Διαβάστε την Προδιαγραφή: Ανατρέξτε στο sRFC37 για την πλήρη τεχνική προδιαγραφή και συμμετάσχετε στη συζήτηση sRFC37
Συμπέρασμα
Το Token ACL (sRFC37) παρέχει μια ισχυρή λύση για επιχειρήσεις που χρειάζονται συμμορφούμενα, με άδεια tokens χωρίς να θυσιάζουν την εμπειρία χρήστη που κάνει το blockchain πολύτιμο. Βασικά οφέλη:
- Άμεση Ενεργοποίηση: Οι χρήστες μπορούν να ξεπαγώσουν τους λογαριασμούς τους μόνοι τους
- Πλήρης Έλεγχος Συμμόρφωσης: Λίστες αποδοχής, λίστες αποκλεισμού ή προσαρμοσμένη λογική
- Ευέλικτα Gate Programs: Χρησιμοποιήστε την υλοποίηση αναφοράς ABL ή δημιουργήστε προσαρμοσμένα Gate Programs που ενσωματώνονται με την υποδομή συμμόρφωσής σας
- Απρόσκοπτη Ενσωμάτωση: Τα SDK διαχειρίζονται αυτόματα την πολυπλοκότητα
- Συνθέσιμο: Λειτουργεί με υπάρχοντα πρωτόκολλα DeFi
- Ελεγμένο: Έτοιμα για παραγωγή προγράμματα αναπτυγμένα στο mainnet
Ο συνδυασμός της επέκτασης DefaultAccountState του Token-2022 με τις permissionless λειτουργίες του Token ACL δημιουργεί ένα νέο παράδειγμα για τη συμμορφούμενη έκδοση token στο Solana.
Is this page helpful?