الرموز المميزة على سولانا

الرموز المميزة هي أصول رقمية تمثل ملكية فئات متنوعة من الأصول. يتيح الترميز رقمنة حقوق الملكية. تُعرف الرموز المميزة على سولانا باسم رموز SPL (مكتبة برامج سولانا).

يغطي هذا القسم المفاهيم الأساسية لكيفية تمثيل الرموز المميزة على سولانا. راجع قسم أساسيات رموز SPL للاطلاع على أمثلة التعليمات البرمجية.

النقاط الرئيسية

  • تحتوي Token Program على جميع منطق التعليمات للتفاعل مع الرموز المميزة على الشبكة (سواء القابلة للاستبدال وغير القابلة للاستبدال).

  • يمثل mint account رمزًا مميزًا محددًا ويخزن البيانات الوصفية العالمية حول الرمز المميز مثل إجمالي العرض وسلطة الإصدار (العنوان المصرح له بإنشاء وحدات جديدة من الرمز المميز).

  • يتتبع token account الملكية الفردية للرموز المميزة لحساب إصدار محدد لمالك محدد.

  • associated token account هو token account تم إنشاؤه بعنوان مشتق من عناوين المالك وحساب الإصدار.

برامج الرموز المميزة

يحتوي نظام سولانا البيئي على برنامجين رئيسيين للرموز المميزة. الشفرة المصدرية لكلا البرنامجين أدناه.

تحتوي Token Program على جميع منطق التعليمات للتفاعل مع الرموز المميزة على الشبكة (سواء القابلة للاستبدال وغير القابلة للاستبدال). جميع الرموز المميزة على سولانا هي فعليًا حسابات بيانات مملوكة لـ Token Program.

Token ProgramToken Program

حساب الإصدار

يتم تحديد الرموز المميزة على سولانا بشكل فريد من خلال عنوان Mint Account المملوك لـ Token Program. يعمل هذا الحساب كعداد عالمي لرمز مميز محدد ويخزن بيانات مثل:

  • العرض: إجمالي عرض الرمز المميز
  • الكسور العشرية: دقة الكسور العشرية للرمز المميز
  • سلطة الإصدار: الحساب المخول بإنشاء وحدات جديدة من الرمز المميز، مما يزيد من العرض
  • سلطة التجميد: الحساب المخول بتجميد الرموز المميزة في token account، مما يمنعها من التحويل أو الحرق

حساب الإصدارحساب الإصدار

تتضمن التفاصيل الكاملة المخزنة في كل mint account ما يلي:

Mint Account State
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 initialized
pub is_initialized: bool,
/// Optional authority to freeze token accounts.
pub freeze_authority: COption<Pubkey>,
}

للمرجعية، إليك رابط مستكشف Solana إلى حساب إصدار USDC.

Token Account

ينشئ Token Program حسابات الرموز المميزة (Token Accounts) لتتبع الملكية الفردية لكل وحدة رمز مميز. يخزن token account بيانات مثل:

  • الإصدار: الرمز المميز الذي يحتفظ به token account
  • المالك: الحساب المخول بتحويل الرموز المميزة من token account
  • الكمية: عدد الرموز المميزة التي يحتفظ بها token account حاليًا

Token AccountToken Account

تتضمن التفاصيل الكاملة المخزنة في كل token account ما يلي:

Token Account State
pub struct Account {
/// The mint associated with this account
pub 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 delegate
pub delegate: COption<Pubkey>,
/// The account's state
pub 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 delegated
pub delegated_amount: u64,
/// Optional authority to close the account.
pub close_authority: COption<Pubkey>,
}

تحتاج المحفظة إلى token account لكل رمز مميز (إصدار) ترغب في الاحتفاظ به، مع تعيين عنوان المحفظة كمالك لـ token account. يمكن لكل محفظة امتلاك عدة token accounts للرمز المميز نفسه (الإصدار)، ولكن يمكن أن يكون لـ token account مالك واحد فقط ويحتفظ بوحدات من رمز مميز واحد (إصدار).

علاقة الحسابعلاقة الحساب

لاحظ أن بيانات كل token account تتضمن حقل owner الذي يحدد من لديه سلطة على token account. هذا يختلف عن مالك البرنامج المحدد في نوع الحساب الأساسي، والذي هو Token Program لجميع token accounts.

Associated Token Account

تبسط associated token accounts عملية العثور على عنوان token account لإصدار ومالك محددين. يمكن اعتبار associated token account بمثابة token account "الافتراضي" لإصدار ومالك محددين.

يتم إنشاء حساب التوكن المرتبط (Associated Token Account) بعنوان مشتق من عنوان المالك وعنوان حساب العملة (mint account). من المهم فهم أن حساب التوكن المرتبط هو مجرد حساب توكن بعنوان محدد.

هذا يقدم مفهومًا أساسيًا في تطوير سولانا: العنوان المشتق من البرنامج (PDA). يشتق الـ PDA عنوانًا بشكل حتمي باستخدام مدخلات محددة مسبقًا، مما يسهل العثور على عنوان الحساب.

حساب التوكن المرتبطحساب التوكن المرتبط

لاحظ أن كل محفظة تحتاج إلى حساب توكن خاص بها لحفظ التوكنات من نفس العملة (mint).

علاقة الحسابات الموسعةعلاقة الحسابات الموسعة

أمثلة على واجهة سطر أوامر التوكن

تساعدك واجهة سطر الأوامر spl-token على تجربة توكنات SPL. تستخدم الأمثلة أدناه طرفية Solana Playground لتشغيل أوامر واجهة سطر الأوامر مباشرة في المتصفح دون تثبيت محلي.

يتطلب إنشاء التوكنات والحسابات SOL لإيداعات rent الحساب ورسوم المعاملات. بالنسبة لمستخدمي Solana Playground لأول مرة، قم بإنشاء محفظة Playground وتشغيل الأمر solana airdrop 1 في طرفية Playground. يمكنك أيضًا الحصول على SOL من شبكة devnet من صنبور الويب العام.

Terminal
$
solana airdrop 2

قم بتشغيل spl-token --help لرؤية جميع الأوامر المتاحة.

Terminal
$
spl-token --help

لتثبيت واجهة سطر أوامر spl-token محليًا، قم بتشغيل:

Terminal
$
cargo install spl-token-cli

اعثر على المزيد من الأمثلة في وثائق spl-token.

تختلف عناوين الحسابات المعروضة في مخرجات الطرفية الخاصة بك عن الأمثلة أدناه. استخدم العناوين من طرفية Playground الخاصة بك عند المتابعة. على سبيل المثال، يُخرج الأمر spl-token create-token عنوان حساب عملة مع محفظة Playground الخاصة بك كسلطة للعملة.

إنشاء توكن جديد

لإنشاء توكن جديد (حساب mint)، قم بتشغيل:

Terminal
$
spl-token create-token

ستبدو المخرجات كالتالي:

Terminal Output
Creating token 99zqUzQGohamfYxyo8ykTEbi91iom3CLmwCA75FK5zTg
Address: 99zqUzQGohamfYxyo8ykTEbi91iom3CLmwCA75FK5zTg
Decimals: 9
Signature: 44fvKfT1ezBUwdzrCys3fvCdFxbLMnNvBstds76QZyE6cXag5NupBprSXwxPTzzjrC3cA6nvUZaLFTvmcKyzxrm1

يبدأ حساب mint الجديد بإمداد صفري. تحقق من الإمداد الحالي باستخدام:

Terminal
$
spl-token supply <TOKEN_ADDRESS>

يُرجع أمر supply للرمز الجديد 0:

Example
spl-token supply 99zqUzQGohamfYxyo8ykTEbi91iom3CLmwCA75FK5zTg

يتطلب إنشاء حساب Mint Account جديد معاملة تحتوي على تعليمتين. إليك مثالاً بلغة جافاسكريبت على Solana Playground.

  1. ينشئ System Program حسابًا جديدًا بمساحة لبيانات Mint Account وينقل الملكية إلى Token Program.

  2. يقوم Token Program بتهيئة بيانات الحساب الجديد كـ Mint Account

إنشاء token account

لحفظ الرموز من mint محدد، قم بإنشاء token account:

Terminal
$
spl-token create-account <TOKEN_ADDRESS>

مثال على الأمر:

Example
spl-token create-account 99zqUzQGohamfYxyo8ykTEbi91iom3CLmwCA75FK5zTg

النتيجة:

Terminal Output
Creating account AfB7uwBEsGtrrBqPTVqEgzWed5XdYfM1psPNLmf7EeX9
Signature: 2BtrynuCLX9CNofFiaw6Yzbx6hit66pup9Sk7aFjwU2NEbFz7NCHD9w9sWhrCfEd73XveAGK1DxFpJoQZPXU9tS1

ينشئ أمر create-account حساب associated token account مع عنوان محفظتك كمالك.

لإنشاء token account بمالك مختلف:

Terminal
$
spl-token create-account --owner <OWNER_ADDRESS> <TOKEN_ADDRESS>

ملاحظة: يحدد <TOKEN_ADDRESS> حساب mint للـ token account.

مثال على الأمر:

Example
spl-token create-account --owner 2i3KvjDCZWxBsqcxBHpdEaZYQwQSYE6LXUMx5VjY5XrR 99zqUzQGohamfYxyo8ykTEbi91iom3CLmwCA75FK5zTg

النتيجة:

Terminal Output
Creating account Hmyk3FSw4cfsuAes7sanp2oxSkE9ivaH6pMzDzbacqmt
Signature: 44vqKdfzspT592REDPY4goaRJH3uJ3Ce13G4BCuUHg35dVUbHuGTHvqn4ZjYF9BGe9QrjMfe9GmuLkQhSZCBQuEt

يتطلب إنشاء Associated Token Account تعليمة واحدة تستدعي Associated Token Program. إليك مثالاً بلغة جافاسكريبت على Solana Playground.

يستخدم Associated Token Program استدعاءات البرامج المتقاطعة لـ:

لإنشاء حساب توكن جديد باستخدام keypair جديد بدلاً من عنوان Associated Token Account، أرسل معاملة تحتوي على تعليمتين. إليك مثالاً بلغة جافاسكريبت على Solana Playground.

  1. يقوم System Program بإنشاء حساب جديد مع مساحة لبيانات Token Account وينقل الملكية إلى Token Program.

  2. يقوم Token Program بتهيئة البيانات كـ Token Account

سك التوكنات

لإنشاء وحدات جديدة من توكن، قم بسك التوكنات إلى Token Account:

Terminal
$
spl-token mint [OPTIONS] <TOKEN_ADDRESS> <TOKEN_AMOUNT> [--] [RECIPIENT_TOKEN_ACCOUNT_ADDRESS]

مثال على الأمر:

Example
spl-token mint 99zqUzQGohamfYxyo8ykTEbi91iom3CLmwCA75FK5zTg 100

النتيجة:

Terminal Output
Minting 100 tokens
Token: 99zqUzQGohamfYxyo8ykTEbi91iom3CLmwCA75FK5zTg
Recipient: AfB7uwBEsGtrrBqPTVqEgzWed5XdYfM1psPNLmf7EeX9
Signature: 2NJ1m7qCraPSBAVxbr2ssmWZmBU9Jc8pDtJAnyZsZJRcaYCYMqq1oRY1gqA4ddQno3g3xcnny5fzr1dvsnFKMEqG

لسك التوكنات إلى حساب توكن مختلف:

Example
spl-token mint 99zqUzQGohamfYxyo8ykTEbi91iom3CLmwCA75FK5zTg 100 -- Hmyk3FSw4cfsuAes7sanp2oxSkE9ivaH6pMzDzbacqmt

النتيجة:

Terminal Output
Minting 100 tokens
Token: 99zqUzQGohamfYxyo8ykTEbi91iom3CLmwCA75FK5zTg
Recipient: Hmyk3FSw4cfsuAes7sanp2oxSkE9ivaH6pMzDzbacqmt
Signature: 3SQvNM3o9DsTiLwcEkSPT1Edr14RgE2wC54TEjonEP2swyVCp2jPWYWdD6RwXUGpvDNUkKWzVBZVFShn5yntxVd7

تعليمة MintTo في Token Program تقوم بإنشاء توكنات جديدة. يجب أن يوقع مفوض السك على المعاملة. تقوم التعليمة بسك التوكنات إلى Token Account وزيادة إجمالي المعروض في Mint Account. إليك مثالاً بلغة جافاسكريبت على Solana Playground.

تحويل التوكنات

لتحويل التوكنات بين حسابات التوكن:

Terminal
spl-token transfer [OPTIONS] <TOKEN_ADDRESS> <TOKEN_AMOUNT> <RECIPIENT_ADDRESS or RECIPIENT_TOKEN_ACCOUNT_ADDRESS>

مثال على الأمر:

Example
spl-token transfer 99zqUzQGohamfYxyo8ykTEbi91iom3CLmwCA75FK5zTg 100 Hmyk3FSw4cfsuAes7sanp2oxSkE9ivaH6pMzDzbacqmt

النتيجة:

Terminal Output
Transfer 100 tokens
Sender: AfB7uwBEsGtrrBqPTVqEgzWed5XdYfM1psPNLmf7EeX9
Recipient: Hmyk3FSw4cfsuAes7sanp2oxSkE9ivaH6pMzDzbacqmt
Signature: 5y6HVwV8V2hHGLTVmTmdySRiEUCZnWmkasAvJ7J6m7JR46obbGKCBqUFgLpZu5zQGwM4Xy6GZ4M5LKd1h6Padx3o

تعليمة Transfer في Token Program تتعامل مع تحويلات التوكن. يجب أن يوقع مالك Token Account المرسل على المعاملة. تقوم التعليمة بنقل التوكنات بين حسابات التوكن. إليك مثالاً بلغة جافاسكريبت على Solana Playground.

يحتاج كل من المرسل والمستلم إلى حسابات توكن للتوكن المحدد (mint). يمكن للمرسل تضمين تعليمات لإنشاء حساب توكن للمستلم في نفس المعاملة.

إنشاء بيانات وصفية للتوكن

يتيح لك برنامج Token Extensions تخزين البيانات الوصفية (الاسم، الرمز، رابط الصورة) مباشرة على حساب mint.

لإنشاء رمز مميز بامتداد البيانات الوصفية:

Example
spl-token create-token --program-id TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEb --enable-metadata

النتيجة:

Terminal Output
Creating token BdhzpzhTD1MFqBiwNdrRy4jFo2FHFufw3n9e8sVjJczP under program TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEb
To 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: BdhzpzhTD1MFqBiwNdrRy4jFo2FHFufw3n9e8sVjJczP
Decimals: 9
Signature: 5iQofFeXdYhMi9uTzZghcq8stAaa6CY6saUwcdnELST13eNSifiuLbvR5DnRt311frkCTUh5oecj8YEvZSB3wfai

لتهيئة البيانات الوصفية:

Terminal
spl-token initialize-metadata <TOKEN_MINT_ADDRESS> <YOUR_TOKEN_NAME> <YOUR_TOKEN_SYMBOL> <YOUR_TOKEN_URI>

يربط عنوان URI للرمز المميز بالبيانات الوصفية خارج السلسلة. شاهد مثالاً لتنسيق JSON هنا.

مثال على الأمر:

Example
spl-token initialize-metadata BdhzpzhTD1MFqBiwNdrRy4jFo2FHFufw3n9e8sVjJczP "TokenName" "TokenSymbol" "https://raw.githubusercontent.com/solana-developers/opos-asset/main/assets/DeveloperPortal/metadata.json"

اعرض البيانات الوصفية على مستكشف Solana.

تعرف على المزيد في دليل امتداد البيانات الوصفية. للحصول على تفاصيل حول Token Extensions، راجع دليل البدء السريع لـ Token Extensions و وثائق SPL.

Is this page helpful?