إرسال الرموز إلى عنوان خاطئ قد يؤدي إلى فقدان دائم للأموال. يضمن التحقق من العنوان أنك ترسل الرموز فقط إلى العناوين التي يمكنها استلامها والوصول إليها بشكل صحيح.
راجع كيفية عمل المدفوعات على سولانا للتعرف على المفاهيم الأساسية للمدفوعات.
فهم عناوين سولانا
حسابات سولانا لها نوعان من العناوين، على المنحنى وخارج المنحنى.
العناوين على المنحنى
العناوين القياسية هي المفاتيح العامة من أزواج مفاتيح Ed25519. هذه العناوين:
- لها مفتاح خاص مقابل يمكنه التوقيع على المعاملات
- تُستخدم كعناوين محفظة
العناوين خارج المنحنى (PDAs)
العناوين المشتقة من البرنامج يتم اشتقاقها بشكل حتمي من معرف البرنامج والبذور. هذه العناوين:
- لا تحتوي على مفتاح خاص مقابل
- يمكن التوقيع عليها فقط من قبل البرنامج الذي اشتُق منه العنوان
أنواع الحسابات في المدفوعات
استخدم العنوان لجلب حساب من الشبكة، تحقق من مالك البرنامج ونوع الحساب لتحديد كيفية التعامل مع العنوان.
معرفة ما إذا كان العنوان على المنحنى أو خارج المنحنى لا تخبرك بنوع الحساب، أو البرنامج الذي يملكه، أو ما إذا كان الحساب موجوداً على ذلك العنوان. يجب عليك جلب الحساب من الشبكة لتحديد هذه التفاصيل.
حسابات System Program (المحافظ)
الحسابات المملوكة من قبل System Program هي محافظ قياسية. لإرسال رموز SPL إلى محفظة، تقوم باشتقاق واستخدام حساب الرمز المرتبط (ATA) الخاص بها.
بعد اشتقاق عنوان ATA، تحقق مما إذا كان حساب الرمز موجوداً على السلسلة. إذا لم يكن ATA موجوداً، يمكنك تضمين تعليمة لإنشاء حساب الرمز الخاص بالمستلم في نفس المعاملة مع التحويل. ومع ذلك، هذا يتطلب دفع إيجار لحساب الرمز الجديد. نظراً لأن المستلم يملك ATA، فإن SOL المدفوع للإيجار لا يمكن استرداده من قبل المرسل.
بدون ضمانات، يمكن استغلال دعم إنشاء ATA. يمكن لمستخدم ضار طلب تحويل، وإنشاء ATA الخاص به على نفقتك، وإغلاق ATA لاستعادة SOL الخاص بالإيجار، وتكرار العملية.
حسابات الرموز
حسابات الرموز مملوكة لبرنامج Token Program أو Token-2022 Program وتحتفظ بأرصدة الرموز. إذا كان العنوان الذي تتلقاه مملوكاً لبرنامج رموز، فيجب عليك التحقق من أن الحساب هو حساب رمز (وليس mint account) ويطابق حساب mint الرمز المتوقع قبل الإرسال.
تتحقق برامج Token Programs تلقائياً من أن كلا حسابي الرموز في التحويل يحتفظان برموز من نفس mint. إذا فشل التحقق، يتم رفض المعاملة ولا تُفقد أي أموال.
حسابات mint
حسابات mint تتتبع إمداد الرموز والبيانات الوصفية لرمز معين. حسابات mint مملوكة أيضاً لبرامج Token Programs ولكنها ليست مستلمين صالحين لتحويلات الرموز. محاولة إرسال رموز إلى عنوان mint تؤدي إلى فشل المعاملة، ولكن لا تُفقد أي أموال.
حسابات أخرى
الحسابات المملوكة لبرامج أخرى تتطلب قراراً سياسياً. بعض الحسابات (مثل محافظ التوقيع المتعدد) قد تكون مالكي حسابات رموز صالحين، بينما يجب رفض حسابات أخرى.
سير عملية التحقق
يوضح الرسم التخطيطي التالي شجرة قرارات مرجعية للتحقق من صحة عنوان:
جلب الحساب
استخدم العنوان لجلب تفاصيل الحساب من الشبكة.
الحساب غير موجود
إذا لم يكن هناك حساب موجود في هذا العنوان، تحقق مما إذا كان العنوان on-curve أو off-curve:
-
خارج المنحنى (PDA): يُرفض العنوان بحذر لتجنب الإرسال إلى حساب رمزي مرتبط (ATA) قد يكون غير قابل للوصول. بدون حساب موجود، لا يمكنك تحديد من العنوان وحده أي برنامج اشتق هذا العنوان المشتق برمجياً (PDA) أو ما إذا كان العنوان لحساب رمزي مرتبط. قد يؤدي اشتقاق حساب رمزي مرتبط لهذا العنوان لإرسال الرموز إلى قفل الأموال في حساب رمزي غير قابل للوصول.
-
على المنحنى: هذا عنوان محفظة صالح (مفتاح عام) لم يتم تمويله بعد. اشتق الحساب الرمزي المرتبط، تحقق من وجوده، وأرسل الرموز إليه. يجب عليك اتخاذ قرار سياسي بشأن ما إذا كنت ستمول إنشاء الحساب الرمزي المرتبط إذا لم يكن موجوداً.
الحساب موجود
إذا كان الحساب موجوداً، تحقق من البرنامج الذي يملكه:
-
برنامج النظام: هذه محفظة قياسية. اشتق الحساب الرمزي المرتبط، تحقق من وجوده، وأرسل الرموز إليه. يجب عليك اتخاذ قرار سياسي بشأن ما إذا كنت ستمول إنشاء الحساب الرمزي المرتبط إذا لم يكن موجوداً.
-
برنامج الرموز / Token-2022: تحقق من أن الحساب هو حساب رمزي (وليس حساب إصدار) وأنه يحتفظ بالرمز (الإصدار) الذي تنوي إرساله. إذا كان صالحاً، أرسل الرموز مباشرة إلى هذا العنوان. إذا كان حساب إصدار أو حساب رمزي لإصدار مختلف، ارفض العنوان.
-
برنامج آخر: هذا يتطلب قرار سياسي. قد تكون بعض البرامج مثل محافظ التوقيع المتعدد مالكين مقبولين لحسابات الرموز. إذا كانت سياستك تسمح بذلك، اشتق الحساب الرمزي المرتبط وأرسل. وإلا، ارفض العنوان.
عرض توضيحي
يوضح المثال التالي منطق التحقق من صحة العنوان فقط. هذا كود مرجعي لأغراض التوضيح.
لا يوضح العرض التوضيحي كيفية اشتقاق ATA أو بناء معاملة لإرسال الرموز. راجع وثائق حساب الرمز وتحويل الرمز للحصول على أمثلة التعليمات البرمجية.
يستخدم العرض التوضيحي أدناه ثلاث نتائج محتملة:
| النتيجة | المعنى | الإجراء |
|---|---|---|
IS_WALLET | عنوان محفظة صالح | اشتقاق وإرسال إلى associated token account |
IS_TOKEN_ACCOUNT | token account صالح | إرسال الرموز مباشرة إلى هذا العنوان |
REJECT | عنوان غير صالح | عدم الإرسال |
/*** Validates an input address and classifies it as a wallet, token account, or invalid.** @param inputAddress - The address to validate* @param rpc - Optional RPC client (defaults to mainnet)* @returns Classification result:* - IS_WALLET: Valid wallet address* - IS_TOKEN_ACCOUNT: Valid token account* - REJECT: Invalid address for transfers*/export async function validateAddress(inputAddress: Address,rpc: Rpc<GetAccountInfoApi> = defaultRpc): Promise<ValidationResult> {const account = await fetchJsonParsedAccount(rpc, inputAddress);// Log the account data for democonsole.log("\nAccount:", account);// Account doesn't exist on-chainif (!account.exists) {// Off-curve = PDA that doesn't exist as an account// Reject conservatively to avoid sending to an address that may be inaccessible.if (isOffCurveAddress(inputAddress)) {return { type: "REJECT", reason: "PDA doesn't exist as an account" };}// On-curve = valid keypair address, treat as unfunded walletreturn { type: "IS_WALLET" };}// Account exists, check program ownerconst owner = account.programAddress;// System Program = walletif (owner === SYSTEM_PROGRAM) {return { type: "IS_WALLET" };}// Token Program or Token-2022, check if token accountif (owner === TOKEN_PROGRAM || owner === TOKEN_2022_PROGRAM) {const accountType = (account.data as { parsedAccountMeta?: { type?: string } }).parsedAccountMeta?.type;if (accountType === "account") {return { type: "IS_TOKEN_ACCOUNT" };}// Reject if not a token account (mint account)return {type: "REJECT",reason: "Not a token account"};}// Unknown program ownerreturn { type: "REJECT", reason: "Unknown program owner" };}// =============================================================================// Examples// =============================================================================
Is this page helpful?