الرموز المميزة هي أصول رقمية تمثل الملكية عبر فئات متنوعة من الأصول. يتيح الترميز رقمنة حقوق الملكية. يُشار إلى الرموز المميزة على سولانا باسم رموز SPL (مكتبة برامج سولانا).
يغطي هذا القسم المفاهيم الأساسية لكيفية تمثيل الرموز المميزة على سولانا. راجع قسم أساسيات رموز SPL للحصول على أمثلة التعليمات البرمجية.
النقاط الرئيسية
-
تحتوي برامج الرموز المميزة على جميع منطق التعليمات للتفاعل مع الرموز المميزة على الشبكة (القابلة للاستبدال وغير القابلة للاستبدال).
-
يمثل حساب الإصدار رمزًا مميزًا محددًا ويخزن البيانات الوصفية العامة حول الرمز المميز مثل إجمالي العرض وسلطة الإصدار (العنوان المصرح له بإنشاء وحدات جديدة من الرمز المميز).
-
يتتبع حساب الرمز المميز الملكية الفردية للرموز المميزة لحساب إصدار محدد لمالك محدد.
-
حساب الرمز المميز المرتبط هو حساب رمز مميز يتم إنشاؤه بعنوان مشتق من عناوين المالك وحساب الإصدار.
برامج الرموز المميزة
يحتوي نظام سولانا البيئي على برنامجين رئيسيين للرموز المميزة. الكود المصدري لكلا البرنامجين أدناه.
Token Program (الأصلي)
- قدرة الرموز المميزة الأساسية (الإصدار، النقل، إلخ.)
- ثابت ومستخدم على نطاق واسع
Token Extension Program (Token 2022)
- يتضمن جميع ميزات Token Program الأصلي
- يضيف ميزات من خلال "الإضافات"
يحتوي Token Program على جميع منطق التعليمات للتفاعل مع الرموز المميزة على الشبكة (القابلة للاستبدال وغير القابلة للاستبدال). جميع الرموز المميزة على سولانا هي فعليًا حسابات بيانات مملوكة لـ Token Program.
Token Program
حساب الإصدار
يتم تحديد الرموز المميزة على سولانا بشكل فريد من خلال عنوان حساب الإصدار المملوك لـ Token Program. يعمل هذا الحساب كعداد عام لرمز مميز محدد ويخزن بيانات مثل:
- العرض: إجمالي عرض الرمز
- الكسور العشرية: الدقة العشرية للرمز
- سلطة الإصدار: الحساب المخول بإنشاء وحدات جديدة من الرمز، مما يزيد من العرض
- سلطة التجميد: الحساب المخول بتجميد الرموز في token account، مما يمنع نقلها أو حرقها
حساب الإصدار
التفاصيل الكاملة المخزنة في كل mint 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>,}
للمرجعية، إليك رابط Solana Explorer لـ حساب إصدار USDC.
حساب الرمز (Token Account)
ينشئ 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. يمكن لكل محفظة امتلاك عدة token accounts لنفس الرمز (mint)، ولكن يمكن أن يكون لـ token account مالك واحد فقط ويحتفظ بوحدات من رمز واحد (mint).
علاقة الحسابات
لاحظ أن بيانات كل token account تتضمن حقل owner يحدد من لديه صلاحية على token
account. هذا يختلف عن مالك البرنامج المحدد في نوع
الحساب الأساسي، وهو Token Program لجميع
token accounts.
حساب الرمز المرتبط (Associated Token Account)
تعمل حسابات الرموز المميزة المرتبطة على تبسيط عملية العثور على عنوان token account لـ mint ومالك محددين. فكر في associated token account على أنه token account "الافتراضي" لـ mint ومالك محددين.
يتم إنشاء associated token account بعنوان مشتق من عنوان المالك وعنوان mint account. من المهم أن تفهم أن associated token account هو مجرد token account بعنوان محدد.
يقدم هذا مفهومًا أساسيًا في تطوير سولانا: Program Derived Address (PDA). يشتق PDA عنوانًا بشكل حتمي باستخدام مدخلات محددة مسبقًا، مما يسهل العثور على عنوان الحساب.
حساب الرمز المميز المرتبط
لاحظ أن كل محفظة تحتاج إلى token account خاص بها للاحتفاظ بالرموز المميزة من نفس الـ mint.
علاقة الحسابات الموسعة
أمثلة Token CLI
يساعدك spl-token CLI على تجربة رموز SPL المميزة. تستخدم الأمثلة أدناه
طرفية Solana Playground لتشغيل أوامر CLI مباشرة في
المتصفح دون الحاجة للتثبيت المحلي.
يتطلب إنشاء الرموز المميزة والحسابات SOL لإيداعات rent الحساب ورسوم المعاملات.
بالنسبة لمستخدمي 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 account الجديد بمعروض صفري. تحقق من المعروض الحالي باستخدام:
$spl-token supply <TOKEN_ADDRESS>
يُرجع أمر supply للرمز المميز الجديد 0:
spl-token supply 99zqUzQGohamfYxyo8ykTEbi91iom3CLmwCA75FK5zTg
يتطلب إنشاء Mint Account جديد معاملة تحتوي على تعليمتين. إليك مثال بلغة Javascript على Solana Playground.
-
ينشئ System Program حسابًا جديدًا بمساحة لبيانات Mint Account وينقل الملكية إلى Token Program.
-
يقوم Token Program بتهيئة بيانات الحساب الجديد كـ Mint Account
إنشاء token account
للاحتفاظ برموز مميزة من mint محدد، قم بإنشاء token account:
$spl-token create-account <TOKEN_ADDRESS>
مثال على الأمر:
spl-token create-account 99zqUzQGohamfYxyo8ykTEbi91iom3CLmwCA75FK5zTg
النتيجة:
Creating account AfB7uwBEsGtrrBqPTVqEgzWed5XdYfM1psPNLmf7EeX9Signature: 2BtrynuCLX9CNofFiaw6Yzbx6hit66pup9Sk7aFjwU2NEbFz7NCHD9w9sWhrCfEd73XveAGK1DxFpJoQZPXU9tS1
ينشئ أمر create-account associated token account مع عنوان محفظتك كمالك.
لإنشاء token account بمالك مختلف:
$spl-token create-account --owner <OWNER_ADDRESS> <TOKEN_ADDRESS>
ملاحظة: يحدد <TOKEN_ADDRESS> mint account الخاص بـ token account.
مثال على الأمر:
spl-token create-account --owner 2i3KvjDCZWxBsqcxBHpdEaZYQwQSYE6LXUMx5VjY5XrR 99zqUzQGohamfYxyo8ykTEbi91iom3CLmwCA75FK5zTg
النتيجة:
Creating account Hmyk3FSw4cfsuAes7sanp2oxSkE9ivaH6pMzDzbacqmtSignature: 44vqKdfzspT592REDPY4goaRJH3uJ3Ce13G4BCuUHg35dVUbHuGTHvqn4ZjYF9BGe9QrjMfe9GmuLkQhSZCBQuEt
يتطلب إنشاء associated token account تعليمة واحدة تستدعي Associated Token Program. إليك مثال بلغة Javascript على Solana Playground.
يستخدم Associated Token Program استدعاءات البرامج المتقاطعة من أجل:
- استدعاء System Program لإنشاء حساب جديد باستخدام PDA المقدم كعنوان
- استدعاء Token Program لتهيئة بيانات token account
لإنشاء token account جديد باستخدام keypair جديد بدلاً من عنوان associated token account، أرسل معاملة تحتوي على تعليمتين. إليك مثال بلغة Javascript على Solana Playground.
-
يقوم 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
لسك الرموز المميزة إلى token account مختلف:
spl-token mint 99zqUzQGohamfYxyo8ykTEbi91iom3CLmwCA75FK5zTg 100 -- Hmyk3FSw4cfsuAes7sanp2oxSkE9ivaH6pMzDzbacqmt
النتيجة:
Minting 100 tokensToken: 99zqUzQGohamfYxyo8ykTEbi91iom3CLmwCA75FK5zTgRecipient: Hmyk3FSw4cfsuAes7sanp2oxSkE9ivaH6pMzDzbacqmtSignature: 3SQvNM3o9DsTiLwcEkSPT1Edr14RgE2wC54TEjonEP2swyVCp2jPWYWdD6RwXUGpvDNUkKWzVBZVFShn5yntxVd7
تقوم تعليمة MintTo على Token Program بإنشاء رموز مميزة جديدة. يجب أن توقع
سلطة السك على المعاملة. تسك التعليمة الرموز المميزة إلى token account وتزيد من
إجمالي العرض على mint account. إليك مثال بلغة 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.
لإنشاء رمز مع امتداد البيانات الوصفية:
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"
اعرض البيانات الوصفية على Solana Explorer.
تعرف على المزيد في دليل امتداد البيانات الوصفية. للحصول على تفاصيل حول Token Extensions، راجع دليل البدء الخاص بـ Token Extensions ووثائق SPL.
Is this page helpful?