Permissioned Tokens with Token ACL (sRFC37)

Το Token ACL (Access Control List) είναι ένα πρόγραμμα Solana που επιτρέπει συμμορφούμενα, διαπιστευμένα tokens χωρίς να θυσιάζεται η εμπειρία χρήστη. Υλοποιεί sRFC37, επιτρέποντας σε επιχειρήσεις να δημιουργούν tokens με λειτουργικότητα λίστας αποδεκτών/αποκλεισμένων, διατηρώντας παράλληλα την απρόσκοπτη εμπειρία χρήστη που περιμένουν οι χρήστες.

Το Πρόβλημα

Οι επιχειρήσεις χρειάζονται συμμορφούμενα tokens που να μπορούν να:

  1. Επιβάλλουν απαιτήσεις KYC/AML
  2. Αποκλείουν κυρωμένες διευθύνσεις
  3. Περιορίζουν τις μεταφορές 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 ACLTransfer 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 αποτελείται από τρία κύρια στοιχεία:

  1. Token ACL Program: Το βασικό πρόγραμμα που διαχειρίζεται την ανάθεση εξουσιοδότησης παγώματος και τις λειτουργίες χωρίς άδεια
  2. Gate Program: Προσαρμοσμένη λογική που καθορίζει ποιος μπορεί να αποψύξει/παγώσει (π.χ., ABL Gate Program για λίστες αποδεκτών/αποκλεισμένων)
  3. 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 │ │
│ └─────────┘ └─────────┘ │
│ │
└─────────────────────────────────────────────────────────────────┘

Βασικές Έννοιες

  1. Ανάθεση Εξουσιοδότησης Παγώματος: Όταν δημιουργείτε μια διαμόρφωση Token ACL, η εξουσιοδότηση παγώματος του mint μεταφέρεται στο MintConfig PDA. Αυτό επιτρέπει στο Token ACL να διαχειρίζεται τις λειτουργίες παγώματος/απόψυξης.

  2. Gate Programs: Εξωτερικά προγράμματα που υλοποιούν τη λογική αποδεκτών/αποκλεισμένων. Το ABL (Allow Block List) Gate Program είναι μια υλοποίηση αναφοράς - οι εκδότες μπορούν να δημιουργήσουν προσαρμοσμένα Gate Programs με διαφορετική λογική (π.χ., επαλήθευση KYC onchain, ελέγχους κυρώσεων βάσει oracle, ή ενσωμάτωση με πρωτόκολλα ταυτότητας).

  3. Λειτουργίες Χωρίς Άδεια: Οι χρήστες μπορούν να αποψύξουν τους δικούς τους λογαριασμούς χωρίς παρέμβαση του εκδότη, εφόσον το Gate Program εγκρίνει.

  4. Ενσωμάτωση 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 ACLTACLkU6CiCdkQN2MjoyDkVg2yAH9zkxiHDsiztQ52TP
ABL Gate ProgramGATEzzqxhJnsWF6vHRsgtixxSB8PaQdcqGEVTEHWiULz

Προαπαιτούμενα

Για να εκτελέσετε τα παραδείγματα τοπικά, βεβαιωθείτε ότι έχετε κλωνοποιήσει τα προγράμματα στον τοπικό σας validator:

  1. Solana CLI

    (Για τοπική εκτέλεση χρησιμοποιήστε 2.x, ΟΧΙ 3.x - υπάρχει γνωστό πρόβλημα με τα μεταδεδομένα Token-2022 αυτή τη στιγμή, που θα αποτύγχανε στο βήμα προσθήκης επιπλέον μεταδεδομένων)

    solana --version
  2. Node.js 18+ και pnpm

  3. Τοπικό 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 SDK
import {
getCreateConfigInstruction,
findMintConfigPda,
getTogglePermissionlessInstructionsInstruction,
findThawExtraMetasAccountPda
} from "@token-acl/sdk";
// ABL Gate Program SDK
import {
getCreateListInstruction,
getSetupExtraMetasInstruction,
getAddWalletInstruction,
findListConfigPda,
findWalletEntryPda,
ABL_PROGRAM_ADDRESS,
Mode
} from "@token-acl/abl-sdk";
// TLV sizes for Token-2022 extensions
const TYPE_SIZE = 2;
const LENGTH_SIZE = 2;
async function createTokenACLMint() {
// Setup RPC
const rpc = createSolanaRpc("http://localhost:8899");
const rpcSubscriptions = createSolanaRpcSubscriptions("ws://localhost:8900");
const sendAndConfirm = sendAndConfirmTransactionFactory({
rpc,
rpcSubscriptions
});
// Load your payer keypair
const payer = await loadKeypair("~/.config/solana/id.json");
// Generate mint keypair
const mint = await generateKeyPairSigner();
console.log(`🪙 Mint: ${mint.address}`);
// TokenMetadata config - includes 'token_acl' for auto-detection
const TOKEN_NAME = "Compliant Token";
const TOKEN_SYMBOL = "COMP";
const TOKEN_URI = "";
const TOKEN_ACL_KEY = "token_acl";
// Define extensions
const defaultAccountStateExtension = extension("DefaultAccountState", {
state: AccountState.Frozen
});
const metadataPointerExtension = extension("MetadataPointer", {
authority: payer.address,
metadataAddress: mint.address
});
const extensions = [defaultAccountStateExtension, metadataPointerExtension];
// Calculate mint size
const 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 rent
const mintRent = await rpc
.getMinimumBalanceForRentExemption(BigInt(totalSpace))
.send();
// Get extension pre-initialization instructions
const extensionInstructions = getPreInitializeInstructionsForMintExtensions(
mint.address,
extensions
);
// Build transaction
const { 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 send
const 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 automatically
async function setupAllowAllEoas(
mintAddress: Address,
mintConfigPda: Address,
payer: TransactionSigner
) {
const listSeed = mintAddress; // Use mint as seed
const [listConfigPda] = await findListConfigPda({
authority: payer.address,
seed: listSeed
});
const createListIx = getCreateListInstruction({
authority: payer,
listConfig: listConfigPda,
mode: Mode.AllowAllEoas, // All EOAs can thaw
seed: 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 SDK
const accountRetriever = async (addr: Address) => {
return await fetchEncodedAccount(rpc, addr);
};
// The SDK handles all the complexity of fetching extra metas
const thawIx =
await createThawPermissionlessIdempotentInstructionWithExtraMetas(
payer, // authority (signer)
userAta, // token account to thaw
mintAddress, // mint
userAddress, // token account owner
TOKEN_ACL_PROGRAM_ADDRESS, // Token ACL program
accountRetriever // 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' metadata
const { 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 σας πρέπει να διαθέτει:

  1. Την επέκταση TokenMetadata αρχικοποιημένη
  2. Ένα πεδίο additionalMetadata με κλειδί token_acl και τιμή ορισμένη στη διεύθυνση του Gate Program

Σύνθετες Λίστες Αποδεκτών + Αποκλεισμένων

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

async function setupCompositeLists(
mintAddress: Address,
mintConfigPda: Address,
payer: TransactionSigner
) {
// Create ALLOW list
const 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 list
const 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 lists
const [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 list
const createListIx = getCreateListInstruction({
authority: issuer,
listConfig: allowListPda,
mode: Mode.Allow,
seed: mintAddress
});
// After KYC verification, add investor
await addToAllowList(allowListPda, kycVerifiedInvestor, issuer);

2. Συμμόρφωση Κυρώσεων

Χρησιμοποιήστε μια λίστα αποκλεισμένων για να αποτρέψετε κυρωμένες διευθύνσεις από τη λήψη tokens:

// Create block list
const createListIx = getCreateListInstruction({
authority: complianceOfficer,
listConfig: blockListPda,
mode: Mode.Block,
seed: mintAddress
});
// Block sanctioned address
await addToBlockList(blockListPda, sanctionedAddress, complianceOfficer);

3. Ανοιχτό Token με Προστασία PDA

Χρησιμοποιήστε AllowAllEoas για να επιτρέψετε σε όλα τα κανονικά πορτοφόλια ενώ αποκλείετε τα PDAs (έξυπνα συμβόλαια):

const createListIx = getCreateListInstruction({
authority: payer,
listConfig: listConfigPda,
mode: Mode.AllowAllEoas, // Regular wallets OK, PDAs blocked
seed: mintAddress
});

4. Πλήρης Εταιρική Συμμόρφωση

Συνδυάστε λίστα αποδεκτών + λίστα αποκλεισμένων για πλήρη έλεγχο:

  • Λίστα αποδεκτών: Επαληθευμένοι μέσω KYC επενδυτές
  • Λίστα αποκλεισμένων: Κυρωμένες διευθύνσεις, απολυμένοι υπάλληλοι κ.λπ.

Ζητήματα Παραγωγής

Πριν από την ανάπτυξη σε παραγωγή:

  1. Έλεγχοι Ασφαλείας: Λάβετε επαγγελματικούς ελέγχους ασφαλείας της υλοποίησής σας και οποιωνδήποτε προσαρμοσμένων Gate Programs

  2. Διαχείριση Κλειδιών: Χρησιμοποιήστε κατάλληλες λύσεις φύλαξης για κλειδιά εξουσιοδότησης. Σκεφτείτε multi-sig για ευαίσθητες λειτουργίες

  3. Κανονιστική Συμμόρφωση: Συμβουλευτείτε νομικούς εμπειρογνώμονες σχετικά με κανονισμούς κινητών αξιών, απαιτήσεις KYC/AML και συμμόρφωση κυρώσεων

  4. Διαχείριση Λιστών: Δημιουργήστε ισχυρά συστήματα για τη διαχείριση λιστών αποδεκτών/αποκλεισμένων, συμπεριλαμβανομένων:

    • Αυτοματοποιημένη ενσωμάτωση ελέγχου κυρώσεων
    • Ενσωμάτωση παρόχου KYC
    • Καταγραφή ελέγχου
  5. Παρακολούθηση: Υλοποιήστε παρακολούθηση για:

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

Έκδοση 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.io
cargo install token-acl-cli
# Verify installation
token-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-freeze
token-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 automatically
token-acl create-ata-and-thaw-permissionless --mint <MINT_ADDRESS> --owner <WALLET_ADDRESS>

ABL Gate CLI (allow-block-list)

Το ABL Gate CLI διαχειρίζεται λίστες αποδοχής/αποκλεισμού και εγγραφές πορτοφολιών.

Εγκατάσταση

# Install from crates.io
cargo 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 list
allow-block-list remove-wallet <LIST_ADDRESS> <WALLET_ADDRESS>

Εφαρμογή Λιστών σε Ένα Mint

# Apply a single list to a mint
allow-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-detection
spl-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 commands
MINT=7KzLwpXMzKa8JiqYr2ookFjxLx1xMF4xM4YhVqPJpump
# Initialize the token metadata
spl-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 thaw
spl-token update-metadata $MINT token_acl GATEzzqxhJnsWF6vHRsgtixxSB8PaQdcqGEVTEHWiULz
# Verify the token was created correctly
spl-token display $MINT
# ============================================================================
# STEP 3: Create Token ACL Config
# ============================================================================
# This transfers freeze authority from your wallet to the Token ACL MintConfig PDA
token-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 compliance
allow-block-list create-list --mode block
# Output:
# list_config: 5HnJkLmNoPqRsTuVwXyZ987654321defghijk
# seed: 3AbCdEfGhIjKlMnOpQrStUvWxYz123456789
# Save the block list address
BLOCK_LIST=5HnJkLmNoPqRsTuVwXyZ987654321defghijk
# ============================================================================
# STEP 5: Apply Lists to Mint
# ============================================================================
# Configure the block list to be used for this mint's permissionless operations
allow-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 freeze
token-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-outfile
USER_WALLET=$(solana address) # Uses your configured wallet
token-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 account
spl-token mint $MINT 1000 --recipient-owner $USER_WALLET
# Verify balance
spl-token balance $MINT

Μεταδεδομένα Token για Αυτόματη Ανίχνευση

Η προσθήκη του πεδίου μεταδεδομένων token_acl είναι κρίσιμη για την ενσωμάτωση με πορτοφόλια. Όταν πορτοφόλια όπως το Phantom ή SDK όπως το @solana/token-helpers εντοπίζουν αυτό το πεδίο, συμπεριλαμβάνουν αυτόματα οδηγίες thaw κατά τη δημιουργία token accounts.

spl-token update-metadata $MINT token_acl GATEzzqxhJnsWF6vHRsgtixxSB8PaQdcqGEVTEHWiULz

Επόμενα Βήματα

  1. Δοκιμάστε το Workshop: Κλωνοποιήστε το αποθετήριο token-acl και εκτελέστε τα παραδείγματα επίδειξης. Διαβάστε την υλοποίηση του ACL και του ABL Gate Program.

  2. Δημιουργήστε Προσαρμοσμένα Gate Programs: Το ABL Gate Program είναι απλώς μια υλοποίηση αναφοράς. Δημιουργήστε το δικό σας Gate Program για ενσωμάτωση με την υπάρχουσα υποδομή συμμόρφωσης, παρόχους ταυτότητας, ή υλοποιήστε προσαρμοσμένη λογική που ταιριάζει στις συγκεκριμένες απαιτήσεις σας

  3. Ενσωμάτωση με DeFi: Τα token ACL tokens είναι πλήρως συνθέσιμα με πρωτόκολλα DeFi

  4. Διαβάστε την Προδιαγραφή: Ανατρέξτε στο 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?

Πίνακας Περιεχομένων

Το ΠρόβλημαΗ ΛύσηΓιατί Token ACL;Token ACL έναντι Transfer HooksΠότε να Χρησιμοποιήσετε Token ACLΠότε να Χρησιμοποιήσετε Transfer HooksΕπισκόπηση ΑρχιτεκτονικήςΒασικές ΈννοιεςΛειτουργίες ABL Gate ProgramΔιευθύνσεις ΠρογραμμάτωνΠροαπαιτούμεναΠλήρης ΥλοποίησηΒήμα 1: Εγκατάσταση ΕξαρτήσεωνΒήμα 2: Δημιουργία Token με Token ACLΒήμα 3: Δημιουργία Διαμόρφωσης Token ACLΒήμα 4: Ρύθμιση ABL Gate ProgramΒήμα 5: Ενεργοποίηση Απόψυξης Χωρίς ΆδειαΒήμα 6: Ο Χρήστης Αποψύχει τον Λογαριασμό τουΧρήση @solana/token-helpers για Αυτόματη ΑπόψυξηΣύνθετες Λίστες Αποδεκτών + ΑποκλεισμένωνΣυμπεριφορά Σύνθετης ΛίσταςΠεριπτώσεις Χρήσης1. Tokens Ασφαλείας (Απαιτείται KYC)2. Συμμόρφωση Κυρώσεων3. Ανοιχτό Token με Προστασία PDA4. Πλήρης Εταιρική ΣυμμόρφωσηΖητήματα ΠαραγωγήςΔιεπαφή Γραμμής Εντολών (CLI)Token ACL CLIΕγκατάστασηΕντολές Token ACLΔημιουργία Διαμόρφωσης Token ACLΕνεργοποίηση Permissionless ThawΛειτουργίες Thaw/FreezeΔημιουργία ATA και Thaw με Μία ΕντολήABL Gate CLI (allow-block-list)ΕγκατάστασηΕντολές ABL GateΔημιουργία ΛίσταςΔιαχείριση Πορτοφολιών σε ΛίστεςΕφαρμογή Λιστών σε Ένα MintΚαθολικές Επιλογές CLIΠαράδειγμα Πλήρους Ροής Εργασίας CLIΕπόμενα ΒήματαΣυμπέρασμα
Επεξεργασία Σελίδας
© 2026 Ίδρυμα Solana. Με επιφύλαξη παντός δικαιώματος.