التوكنات هي أصول رقمية تمثل ملكية فئات متنوعة من الأصول. يتيح التحويل إلى توكنات رقمنة حقوق الملكية. يشار إلى التوكنات على سولانا باسم توكنات SPL (مكتبة برامج سولانا).
يغطي هذا القسم المفاهيم الأساسية لكيفية تمثيل الرموز على سولانا. ارجع إلى قسم أساسيات رموز SPL للحصول على أمثلة التعليمات البرمجية.
النقاط الرئيسية
-
تحتوي برامج التوكن على جميع منطق التعليمات للتفاعل مع التوكنات على الشبكة (سواء القابلة للاستبدال وغير القابلة للاستبدال).
-
يمثل حساب العملة توكنًا محددًا ويخزن البيانات الوصفية العالمية حول التوكن مثل إجمالي العرض وسلطة الإصدار (العنوان المصرح له بإنشاء وحدات جديدة من التوكن).
-
يتتبع حساب التوكن الملكية الفردية للتوكنات لحساب عملة محدد لمالك محدد.
-
حساب التوكن المرتبط هو حساب توكن تم إنشاؤه بعنوان مشتق من عناوين المالك وحساب العملة.
برامج التوكن
يحتوي نظام سولانا البيئي على برنامجين رئيسيين للتوكن. الشفرة المصدرية لكلا البرنامجين أدناه.
برنامج التوكن (الأصلي)
- قدرات التوكن الأساسية (الإصدار، التحويل، إلخ.)
- غير قابل للتغيير ومستخدم على نطاق واسع
برنامج امتداد التوكن (توكن 2022)
- يتضمن جميع ميزات برنامج التوكن الأصلي
- يضيف ميزات من خلال "الامتدادات"
تحتوي برامج التوكن على جميع منطق التعليمات للتفاعل مع التوكنات على الشبكة (سواء القابلة للاستبدال وغير القابلة للاستبدال). جميع التوكنات على سولانا هي فعليًا حسابات بيانات مملوكة لبرنامج التوكن.
برنامج التوكن
حساب العملة
يتم تحديد التوكنات على سولانا بشكل فريد من خلال عنوان حساب العملة المملوك لبرنامج التوكن. يعمل هذا الحساب كعداد عالمي لتوكن محدد ويخزن بيانات مثل:
- العرض: إجمالي عرض الرمز المميز
- الكسور العشرية: دقة الكسور العشرية للرمز المميز
- سلطة الإصدار: الحساب المخول بإنشاء وحدات جديدة من الرمز المميز، مما يزيد من العرض
- سلطة التجميد: الحساب المخول بتجميد الرموز المميزة في حساب token account، مما يمنعها من التحويل أو الحرق
حساب الإصدار
تتضمن التفاصيل الكاملة المخزنة في كل حساب إصدار ما يلي:
pub struct Mint {/// Optional authority used to mint new tokens. The mint authority may only/// be provided during mint creation. If no mint authority is present/// then the mint has a fixed supply and no further tokens may be/// minted.pub mint_authority: COption<Pubkey>,/// Total supply of tokens.pub supply: u64,/// Number of base 10 digits to the right of the decimal place.pub decimals: u8,/// Is `true` if this structure has been initializedpub is_initialized: bool,/// Optional authority to freeze token accounts.pub freeze_authority: COption<Pubkey>,}
للمرجعية، إليك رابط مستكشف سولانا إلى حساب إصدار USDC.
حساب الرمز المميز
ينشئ Token Program حسابات الرموز المميزة لتتبع الملكية الفردية لكل وحدة رمز مميز. يخزن token account بيانات مثل:
- الإصدار: الرمز المميز الذي يحتفظ به token account
- المالك: الحساب المخول بتحويل الرموز المميزة من token account
- الكمية: عدد الرموز المميزة التي يحتفظ بها token account حاليًا
حساب الرمز المميز
تتضمن التفاصيل الكاملة المخزنة في كل token account ما يلي:
pub struct Account {/// The mint associated with this accountpub mint: Pubkey,/// The owner of this account.pub owner: Pubkey,/// The amount of tokens this account holds.pub amount: u64,/// If `delegate` is `Some` then `delegated_amount` represents/// the amount authorized by the delegatepub delegate: COption<Pubkey>,/// The account's statepub state: AccountState,/// If is_native.is_some, this is a native token, and the value logs the/// rent-exempt reserve. An Account is required to be rent-exempt, so/// the value is used by the Processor to ensure that wrapped SOL/// accounts do not drop below this threshold.pub is_native: COption<u64>,/// The amount delegatedpub delegated_amount: u64,/// Optional authority to close the account.pub close_authority: COption<Pubkey>,}
تحتاج المحفظة إلى token account لكل رمز مميز (mint) ترغب في الاحتفاظ به، مع تعيين عنوان المحفظة كمالك لـ token account. يمكن لكل محفظة امتلاك عدة حسابات رموز مميزة لنفس الرمز المميز (mint)، ولكن يمكن أن يكون لـ token account مالك واحد فقط ويحتفظ بوحدات من رمز مميز واحد (mint).
علاقة الحساب
لاحظ أن بيانات كل Token Account تتضمن حقل owner يحدد من لديه صلاحية على Token
Account. هذا يختلف عن مالك البرنامج المحدد في نوع
Account الأساسي، وهو Token Program لجميع
Token Accounts.
حساب الرمز المميز المرتبط
تبسط associated token account عملية العثور على عنوان حساب الرمز المميز لإصدار ومالك محددين. يمكن اعتبار associated token account بمثابة حساب الرمز المميز "الافتراضي" لإصدار ومالك محددين.
يتم إنشاء associated token account بعنوان مشتق من عنوان المالك وعنوان mint account. من المهم فهم أن associated token account هو مجرد token account بعنوان محدد.
هذا يقدم مفهومًا أساسيًا في تطوير سولانا: Program Derived Address (PDA). يشتق PDA عنوانًا بشكل حتمي باستخدام مدخلات محددة مسبقًا، مما يسهل العثور على عنوان الحساب.
حساب التوكن المرتبط
لاحظ أن كل محفظة تحتاج إلى token account خاص بها للاحتفاظ بالتوكنات من نفس الإصدار.
علاقات الحسابات الموسعة
أمثلة على واجهة سطر أوامر التوكن
يساعدك spl-token CLI على تجربة رموز SPL. تستخدم الأمثلة أدناه طرفية
Solana Playground لتشغيل أوامر CLI مباشرة في المتصفح
دون الحاجة للتثبيت المحلي.
يتطلب إنشاء الرموز والحسابات SOL لإيداعات إيجار الحساب ورسوم المعاملات. لمستخدمي
Solana Playground لأول مرة، أنشئ محفظة Playground وقم بتشغيل أمر
solana airdrop في طرفية Playground. يمكنك أيضًا الحصول على SOL من devnet
من صنبور الويب العام.
$solana airdrop 2
قم بتشغيل spl-token --help لرؤية جميع الأوامر المتاحة.
$spl-token --help
لتثبيت spl-token CLI محليًا، قم بتشغيل:
$cargo install spl-token-cli
ابحث عن المزيد من الأمثلة في وثائق
spl-token.
عناوين الحسابات المعروضة في مخرجات الطرفية الخاصة بك تختلف عن الأمثلة أدناه.
استخدم العناوين من طرفية Playground الخاصة بك عند المتابعة. على سبيل المثال،
يُخرج أمر create-token عنوان mint account مع محفظة Playground الخاصة بك
كصلاحية mint.
إنشاء توكن جديد
لإنشاء توكن جديد (mint account)، قم بتشغيل:
$spl-token create-token
ستبدو المخرجات كالتالي:
Creating token 99zqUzQGohamfYxyo8ykTEbi91iom3CLmwCA75FK5zTgAddress: 99zqUzQGohamfYxyo8ykTEbi91iom3CLmwCA75FK5zTgDecimals: 9Signature: 44fvKfT1ezBUwdzrCys3fvCdFxbLMnNvBstds76QZyE6cXag5NupBprSXwxPTzzjrC3cA6nvUZaLFTvmcKyzxrm1
يبدأ حساب mint الجديد بإمداد صفري. تحقق من الإمداد الحالي باستخدام:
$spl-token supply <TOKEN_ADDRESS>
يُرجع أمر supply لرمز جديد 0:
spl-token supply 99zqUzQGohamfYxyo8ykTEbi91iom3CLmwCA75FK5zTg
يتطلب إنشاء حساب mint جديد معاملة تحتوي على تعليمتين. إليك مثالاً بلغة جافاسكريبت على سولانا بلايجراوند.
-
يقوم System Program بإنشاء حساب جديد مع مساحة لبيانات حساب Mint Account وينقل الملكية إلى Token Program.
-
يقوم Token Program بتهيئة بيانات الحساب الجديد كحساب Mint Account
إنشاء حساب الرمز (Token Account)
لحفظ الرموز من mint محدد، قم بإنشاء حساب رمز:
$spl-token create-account <TOKEN_ADDRESS>
مثال على الأمر:
spl-token create-account 99zqUzQGohamfYxyo8ykTEbi91iom3CLmwCA75FK5zTg
النتيجة:
Creating account AfB7uwBEsGtrrBqPTVqEgzWed5XdYfM1psPNLmf7EeX9Signature: 2BtrynuCLX9CNofFiaw6Yzbx6hit66pup9Sk7aFjwU2NEbFz7NCHD9w9sWhrCfEd73XveAGK1DxFpJoQZPXU9tS1
ينشئ أمر create-account associated token account مع عنوان محفظتك كمالك.
لإنشاء حساب رمز بمالك مختلف:
$spl-token create-account --owner <OWNER_ADDRESS> <TOKEN_ADDRESS>
ملاحظة: <TOKEN_ADDRESS> يحدد حساب mint الخاص بحساب الرمز المميز.
مثال على الأمر:
spl-token create-account --owner 2i3KvjDCZWxBsqcxBHpdEaZYQwQSYE6LXUMx5VjY5XrR 99zqUzQGohamfYxyo8ykTEbi91iom3CLmwCA75FK5zTg
النتيجة:
Creating account Hmyk3FSw4cfsuAes7sanp2oxSkE9ivaH6pMzDzbacqmtSignature: 44vqKdfzspT592REDPY4goaRJH3uJ3Ce13G4BCuUHg35dVUbHuGTHvqn4ZjYF9BGe9QrjMfe9GmuLkQhSZCBQuEt
يتطلب إنشاء حساب رمز مرتبط (Associated Token Account) تعليمة واحدة تستدعي برنامج الرمز المرتبط (Associated Token Program). إليك مثالاً بلغة جافاسكريبت على سولانا بلايجراوند.
يستخدم Associated Token Program استدعاءات البرامج المتقاطعة (Cross Program Invocations) من أجل:
- استدعاء System Program لإنشاء حساب جديد باستخدام PDA المقدم كعنوان
- استدعاء Token Program لتهيئة بيانات token account
لإنشاء حساب Token Account جديد باستخدام keypair جديد بدلاً من عنوان Associated Token Account، أرسل معاملة تحتوي على تعليمتين. إليك مثالاً بلغة جافاسكريبت على سولانا بلايجراوند.
-
ينشئ System Program حسابًا جديدًا بمساحة لبيانات Token Account وينقل الملكية إلى Token Program.
-
يقوم Token Program بتهيئة البيانات كحساب Token Account
سك الرموز
لإنشاء وحدات جديدة من الرمز، قم بسك الرموز إلى Token Account:
$spl-token mint [OPTIONS] <TOKEN_ADDRESS> <TOKEN_AMOUNT> [--] [RECIPIENT_TOKEN_ACCOUNT_ADDRESS]
مثال على الأمر:
spl-token mint 99zqUzQGohamfYxyo8ykTEbi91iom3CLmwCA75FK5zTg 100
النتيجة:
Minting 100 tokensToken: 99zqUzQGohamfYxyo8ykTEbi91iom3CLmwCA75FK5zTgRecipient: AfB7uwBEsGtrrBqPTVqEgzWed5XdYfM1psPNLmf7EeX9Signature: 2NJ1m7qCraPSBAVxbr2ssmWZmBU9Jc8pDtJAnyZsZJRcaYCYMqq1oRY1gqA4ddQno3g3xcnny5fzr1dvsnFKMEqG
لسك الرموز إلى حساب رموز مختلف:
spl-token mint 99zqUzQGohamfYxyo8ykTEbi91iom3CLmwCA75FK5zTg 100 -- Hmyk3FSw4cfsuAes7sanp2oxSkE9ivaH6pMzDzbacqmt
النتيجة:
Minting 100 tokensToken: 99zqUzQGohamfYxyo8ykTEbi91iom3CLmwCA75FK5zTgRecipient: Hmyk3FSw4cfsuAes7sanp2oxSkE9ivaH6pMzDzbacqmtSignature: 3SQvNM3o9DsTiLwcEkSPT1Edr14RgE2wC54TEjonEP2swyVCp2jPWYWdD6RwXUGpvDNUkKWzVBZVFShn5yntxVd7
تعليمة MintTo في Token Program تنشئ رموزاً مميزة جديدة. يجب على سلطة mint
التوقيع على المعاملة. تقوم التعليمة بإنشاء رموز مميزة إلى حساب رمز مميز وتزيد من
إجمالي العرض في حساب mint. إليك مثال Javascript على
Solana Playground.
تحويل الرموز
لتحويل الرموز بين حسابات الرموز:
spl-token transfer [OPTIONS] <TOKEN_ADDRESS> <TOKEN_AMOUNT> <RECIPIENT_ADDRESS or RECIPIENT_TOKEN_ACCOUNT_ADDRESS>
مثال على الأمر:
spl-token transfer 99zqUzQGohamfYxyo8ykTEbi91iom3CLmwCA75FK5zTg 100 Hmyk3FSw4cfsuAes7sanp2oxSkE9ivaH6pMzDzbacqmt
النتيجة:
Transfer 100 tokensSender: AfB7uwBEsGtrrBqPTVqEgzWed5XdYfM1psPNLmf7EeX9Recipient: Hmyk3FSw4cfsuAes7sanp2oxSkE9ivaH6pMzDzbacqmtSignature: 5y6HVwV8V2hHGLTVmTmdySRiEUCZnWmkasAvJ7J6m7JR46obbGKCBqUFgLpZu5zQGwM4Xy6GZ4M5LKd1h6Padx3o
تعليمة Transfer في Token Program تتعامل مع تحويلات الرموز المميزة. يجب على
مالك حساب الرمز المميز للمرسل التوقيع على المعاملة. تقوم التعليمة بنقل الرموز
المميزة بين حسابات الرموز المميزة. إليك مثال Javascript على
Solana Playground.
يحتاج كل من المرسل والمستلم إلى حسابات رموز للرمز المحدد (mint). يمكن للمرسل تضمين تعليمات لإنشاء حساب رموز المستلم في نفس المعاملة.
إنشاء بيانات وصفية للرمز
يتيح لك برنامج Token Extensions Program تخزين البيانات الوصفية (الاسم، الرمز، رابط الصورة) مباشرة على حساب mint account.
لإنشاء رمز مميز مع امتداد البيانات الوصفية:
spl-token create-token --program-id TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEb --enable-metadata
النتيجة:
Creating token BdhzpzhTD1MFqBiwNdrRy4jFo2FHFufw3n9e8sVjJczP under program TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEbTo initialize metadata inside the mint, please run `spl-token initialize-metadata BdhzpzhTD1MFqBiwNdrRy4jFo2FHFufw3n9e8sVjJczP <YOUR_TOKEN_NAME> <YOUR_TOKEN_SYMBOL> <YOUR_TOKEN_URI>`, and sign with the mint authority.Address: BdhzpzhTD1MFqBiwNdrRy4jFo2FHFufw3n9e8sVjJczPDecimals: 9Signature: 5iQofFeXdYhMi9uTzZghcq8stAaa6CY6saUwcdnELST13eNSifiuLbvR5DnRt311frkCTUh5oecj8YEvZSB3wfai
لتهيئة البيانات الوصفية:
spl-token initialize-metadata <TOKEN_MINT_ADDRESS> <YOUR_TOKEN_NAME> <YOUR_TOKEN_SYMBOL> <YOUR_TOKEN_URI>
يرتبط عنوان URI للرمز المميز بالبيانات الوصفية خارج السلسلة. شاهد مثالاً لتنسيق JSON هنا.
مثال على الأمر:
spl-token initialize-metadata BdhzpzhTD1MFqBiwNdrRy4jFo2FHFufw3n9e8sVjJczP "TokenName" "TokenSymbol" "https://raw.githubusercontent.com/solana-developers/opos-asset/main/assets/DeveloperPortal/metadata.json"
اعرض البيانات الوصفية على مستكشف سولانا.
تعرف على المزيد في دليل امتداد البيانات الوصفية. للحصول على تفاصيل حول Token Extensions، راجع دليل البدء الخاص بـ Token Extensions و وثائق SPL.
Is this page helpful?