Rand Protocol
الوثائق
المفاهيم الأساسية

رموز RPL

معيار رموز RPL: الرمز بوصفه إدخالًا في سجل دفتر الأستاذ، ومعرّف أصله وفهرسه وصيغته النصية rpl1، وجهات الإصدار المخوّلة، وكلفة الإنشاء، ولماذا تبدو عملية تحويل الرمز مطابقة تمامًا لدفعة بعملة RAND، وعمليات الإصدار والحرق، وما يميّزه عن ERC-20 وSPL.

استخدم هذه الصفحة لتفهم ما هو الرمز (token) على هذه السلسلة قبل أن تنشئ واحدًا أو تدرجه أو تفهرسه. RPL هو معيار الرموز في Rand، وهو جديد في السلسلة 14. الرمز أصل أصلي محمي: مدخل واحد في سجل ضمن دفتر الأستاذ، تُحفظ أرصدته في صورة ملاحظات (notes) عادية في شجرة الالتزامات نفسها التي يستخدمها RAND. وهو ليس عقدًا. لإنشاء رمز خطوة بخطوة، راجع نشر رمز RPL.

السبب بنيوي. فالاستدعاء Call لا يكتب سوى إيصال، فلم يكن لعقد على طراز ERC-20 مكان يحتفظ فيه برصيد، وكان جدول أرصدة عام سيجعل الرموز الأصل الشفاف الوحيد على سلسلة محمية. لذلك يجعل RPL الرمز كائنًا أصيلًا في دفتر الأستاذ. وتضيف السلسلة 20 معيار RPL-2 (الإصدار v0.6.8): يمكن للبرنامج أن يحتفظ بخلايا حالة عامة وبخزنة عامة، وأن يكون سلطة السك لرمز خاص به (أدناه)؛ أما الأرصدة التي يحتفظ بها الأشخاص فتظل ملاحظات.

الرمز مدخل في سجل

TokenRegistry (crates/randprotocol-core/src/ledger/tokens.rs) جدول واحد يشترك فيه كل رمز، أصليًا كان أم مجسَّرًا. وهو السجل نفسه الذي يحلّ الجسر فهرس الأصل من خلاله. وهذه حقول كل مدخل:

الحقلالقاعدة
idمعرّف الأصل، 32 بايت، معنون بالمحتوى
indexمن النوع u32، وهو القيمة التي تحملها كلمة asset في الملاحظة؛ كثيف، يُسند بترتيب التسجيل بدءًا من 1. الفهرس 0 هو RAND ولا يُسجَّل أبدًا
nameمن 1 إلى 32 بايت بترميز UTF-8، والمسافات مسموحة، ولا يتغير
symbolمن 1 إلى 12 بايت ASCII مرئيًا (0x21..=0x7e، بلا مسافات)، ولا يتغير
decimalsمن 0 إلى 9، ولا يتغير
authorityسلطة السك، أدناه
mint_nonceعدّاد منع إعادة التشغيل لسلطة من النوع Key
total_supplyمن النوع u64، بحساب مدقَّق؛ ويرفض السك عند حدوث تجاوز. ومنذ السلسلة 15 يُبقى أقل من 2^63 (أدناه)
registered_atارتفاع الكتلة التي جرى فيها التسجيل

تتوقف الخانات العشرية عند 9 لأن المبالغ من النوع u64: فمع 18 خانة عشرية لا يتسع u64 إلا لـ 18.4 رمزًا كاملًا، و9 هي دقة RAND نفسها. أما الرمز المجسَّر فيُسجَّل دائمًا بـ 8 خانات عشرية، أيًّا كانت دقة عملاته المصدر.

يُفعَّل السجل بقسم tokens في ملف التكوين الأولي (genesis)، كما يُفعَّل bridge وaggregation بقسميهما. وبدونه يُرفض كل إجراء يخص الرموز قبل أي فحص آخر (TokenError::Disabled). يحتوي genesis السلسلة 20 على هذا القسم ويسرد رمزًا واحدًا هو zUSD بدعاماته السبع، منقولًا من السلسلة 14 عبر كل عملية قطع منذئذ؛ وكل رمز آخر على السلسلة يصل بمعاملة. (لم يسرد genesis السلسلة 14 أي رمز.) وعند تفعيل البوابة يدخل tokens_root (الجذر الميركلي لأوراق blake3("rand-token-leaf-1", bincode(TokenInfo)) بترتيب الفهرس) في جذر الحالة. ونطاق الجذر هو rand-state-4 على سلسلة لم يُفعَّل فيها شيء لاحق؛ أما جذر السلسلة 20 فيحمل أيضًا حالة الصنبور وطابور السندات والأسعار الحية للغاز وجذر حالة البرامج، وهي تجزئات تحت rand-state-8، ويُغلَّف مرة أخرى بمجموعة المدقّقين (validators) المعتمدين (الإجماع).

كما تشترط السلسلة ذات القسم tokens أن تحمل كل ملاحظة alloc في genesis فتحها (pk وtime وr)، وتعيد العقدة حساب الالتزام وترفض الملف إن لم يطابق. ويكون الالتزام عند الأصل 0 ما لم يسمِّ الفتح فهرس رمز يسرده genesis نفسه — وللسلسلة 20 ملاحظتان من هذا النوع، 10 و89 zUSD عند الفهرس 1 — ويجب أن يساوي مجموع ملاحظات genesis لكل رمز مسرود ما تبدأ به دعاماته في locked. فما إن صارت للملاحظة كلمة asset يمكنها تسمية رمز، حتى صار التزام genesis غير المفتوح الطريقة الوحيدة لإدخال ملاحظة بلا دعم من أي أصل إلى المجمّع دون فحص.

معرّف الأصل والفهرس وrpl1…

للرمز اسمان، ويعرض RPC كليهما.

  • معرّف الأصل 32 بايت، معنون بالمحتوى مثل معرّف البرنامج. معرّف الرمز الأصلي هو blake3("rand-rpl-asset", bincode(name, symbol, decimals, authority, initial, salt))، حيث salt هو 32 بايت يختارها المنشئ وinitial هو السك الأولي كاملًا، إن وُجد. ومعرّف الرمز المجسَّر هو blake3("rand-rpl-asset", bincode(name, symbol, 8, salt)). ويُرفض تسجيل معرّف موجود بالفعل (TokenError::AlreadyRegistered).
  • الفهرس هو ما تحمله الملاحظة فعليًا، لأن المعرّف ذا 32 بايت لا يتسع في كلمة واحدة. وهو اختصار لا معنى له إلا على هذه السلسلة.
  • الصيغة النصية rpl1… هي bech32m (BIP-350) بالجزء المقروء rpl فوق بايتات المعرّف الاثنتين والثلاثين: 52 محرف بيانات ومجموع اختباري من 6 محارف، أي 62 محرفًا في المجموع. وتُعرض بجوار المعرّف السداسي العشري ذي 64 رقمًا حيثما سُمّي رمز، وتُقبل حيثما يُبحث عن رمز؛ ويظل السداسي العشري مقبولًا. والتحليل صارم: يُرفض المجموع الاختباري الخاطئ، والبادئة الخاطئة، والحمولة التي ليست 32 بايت بالضبط، والحالة المختلطة للأحرف، فلا يمكن لخطأ مطبعي أن يحلّ إلى رمز مختلف.

الرموز ليست فريدة. كما في ERC-20 وSPL، هوية الرمز هي معرّف أصله، لا اسمه ولا رمزه المختصر.

أما القيمة القديمة لكل (chain, token) التي يحسبها rand_bridgeAssetId ويطبعها rand_getAssets لكل صف دعامة، فهي معرّف أضيق لصيغة الجسر على السلك، وليست معرّف الرمز نفسه.

سلطات السك

السلطةمن يستطيع إصدار الوحداتملاحظات
Noneلا أحد، بعد التسجيلعرض ثابت: السك الأولي مطلوب وهو كل ما سيوجد على الإطلاق
Key(PublicKey)صاحب مفتاح Dilithium2 واحديسك مجددًا لاحقًا بتوقيع؛ ويمكنه تسليم السلطة إلى مفتاح آخر أو التنازل عنها
Bridge { backings }قفل الجسر وإطلاقه فقطلا سك مباشرًا أبدًا؛ توجد فقط عبر إجراءات حوكمة الجسر
Program(ProgramId)استدعاءات Invoke لذلك البرنامج فقط (RPL-2)على سلسلة فيها قسم program_state (السلسلة 20): يُسجَّل بلا سك أولي، فيبدأ عرضه من الصفر، ولا يُسك أو يُحرق إلا بانتقالات يشهد لها برهان البرنامج (rand token create --program <id>). ويُرفض عند التسجيل على سلسلة بلا هذا القسم

يُرفض RegisterToken الذي يسمّي Bridge (TokenError::AuthorityNotAllowed)، وكذلك الذي يسمّي Program مع سك أولي أو على سلسلة بلا program_state. وسلطة Key هي مفتاح Dilithium2 عام واحد بالضبط: يُرفض مفتاح بأي طول بايتات آخر (TokenError::BadAuthorityKey)، ويُقيَّد مفتاح ML-KEM للمستلم في عملية السك بطوله بالطريقة نفسها. فكلاهما حالة إجماع أو مساحة كتلة تُشترى برسم ثابت، ولذلك لا يجوز أن يكون أيٌّ منهما كبيرًا بلا حد.

إنشاء رمز

الإنشاء بلا إذن. يركب Action::RegisterToken { name, symbol, decimals, authority, initial, salt, index } على حزمة رسوم RAND عادية، ويدفع BUNDLE_BASE مضافًا إليه registration_fee الخاص بالسجل. ورسم التسجيل معامل في genesis محصور بين 1 RAND و10,000 RAND، فيكلّف الرمز المزعج شيئًا دائمًا. وهو في السلسلة 20 يساوي 1 RAND، فيكلّف التسجيل 1.001 RAND، وتقوم السلسلة 20 بـحرقه، كما فعلت كل سلسلة منذ 15: فلا يحتفظ المقترِح إلا بأساس الحزمة (أدناه).

يسمّي index فهرس السجل الذي ختم المنشئ الملاحظة الأولية له. فإن سبقه تسجيل آخر إلى ذلك الفهرس رُفضت المعاملة (TokenError::IndexMismatch) بدلًا من أن تبقى الملاحظة عالقة؛ ويُعيد المنشئ الإثبات عند الفهرس التالي.

الملاحظة المسكوكة تحسبها السلسلة ولا يختارها المرسِل: note_commitment(recipient.pk, MINT_FROM, amount, index, time, r). والمبلغ وpk الخاص بالمستلم عامّان على السلك، فيستطيع المستلم إعادة بناء الملاحظة من حقول المعاملة نفسها حتى لو كان المظروف المختوم تالفًا. ولإيداع الجسر الحماية نفسها.

لماذا يربط المعرّف السك الأولي كاملًا

الإجراء RegisterToken غير موقَّع. وربط المعاملة يمنع تعديل نسخة مُثبَتة، لكنه لا يقول شيئًا عمّا يجوز لنسخة جديدة أن تسمّيه. ولو غطّى المعرّف المبلغ الأولي وحده، لتمكّن من يراقب تسجيلًا معلّقًا من تقديم نسخة بمستلم مختلف وتسجيلها تحت المعرّف نفسه، والاستيلاء على العرض الكامل لرمز ثابت العرض بالالتزام أولًا. أما وقد غطّى المعرّف السك الأولي كاملًا (المبلغ والمستلم وr وtime والمظروف)، فإن النسخة المعاد توجيهها تُجزَّأ إلى معرّف أصل مختلف: رمز مختلف بالرمز المختصر نفسه، وهو ما يسمح به أصلًا كون الرموز المختصرة غير فريدة. ويظل الأصلي يصل عند الفهرس التالي بكلفة إثبات واحد جديد.

التحويلات هي الحزمة نفسها كما في RAND

منذ السلسلة 14 تحمل كل معاملة تنقل قيمة حزمة واحدة بالضبط، هي الشكل الثابت 4 مدخلات و4 مخرجات ذو الأصل المخفي (المعاملات والإجراءات). تحمل الخانتان 0–1 أصلًا خاصًا، RAND أو أي رمز RPL، ولا تعرف الدارة أيهما. وتحمل الخانتان 2–3 دائمًا RAND. وتحويل أي أصل هو Action::None، وهو الإجراء الذي تستخدمه دفعة RAND العادية. ولا يوجد إجراء لتحويل الرموز ولا حقل عام يسمّي الرمز.

ما يراه المراقب في تحويل الرمز هو بالضبط ما تنشره دفعة RAND: مرساة، وأربعة مُبطِلات، وأربعة التزامات، ورسم RAND fee، وburn_a = burn_r = burn_asset = 0، وقيمة time، وأربعة نصوص مشفّرة للأغلفة، وإثبات الحزمة. ومنذ السلسلة 17 (التفويض المنفصل) تحمل كل حزمة أيضًا auth_commit وإثبات تفويض ثانيًا أصغر، وهما كذلك متطابقان لكل أصل. وفي السلسلة 20 يبلغ حجم كل غلاف 1,860 بايت بالضبط، وفيه متسع لمذكرة مشفّرة (rand send --memo)، سواء أُرسلت مذكرة أم لا. أما المرسل والمستلم والمبلغ والأصل الذي جرى تحويله والخانات التي كانت وهمية والباقي المُعاد، فلا يراها.

تنفق المحفظة ما يصل إلى ملاحظتين من الرمز في الخانتين 0–1، وما يصل إلى ملاحظتين من RAND في الخانتين 2–3 لسداد الرسم. والرسم دائمًا بعملة RAND، ولذلك يُرفض الحامل الذي يملك رمزًا ولا يملك RAND قبل توليد الإثبات. وتكلفة التحويل هي نفسها تكلفة دفعة RAND (الرسوم). وفي السلسلة 20 يعني ذلك إثباتَي STARK يُولَّدان على جهاز المرسل: تفويض الإنفاق (المستوى 10، نحو 7 ثوانٍ، نحو 1.37 ميغابايت) والحزمة (المستوى 14، نحو 100 ثانية، نحو 1.5 ميغابايت)، أي نحو 2.85 ميغابايت على الشبكة معًا. وكلٌّ منهما أقل من سقف السلسلة البالغ 4 MiB للإثبات الواحد. وقبل السلسلة 17 كان التحويل يحمل إثبات الحزمة وحده، نحو 1.42 ميغابايت كما قيس حينها.

الإصدار والسلطة

يُصدر TokenMint { asset, amount, recipient, r, time, envelope, nonce, signature } كمية إضافية من رمز تفوَّض سلطته إلى Key. ويُسلّم SetAuthority { asset, new, nonce, signature } السلطة إلى مفتاح آخر، أو يتنازل عنها حين لا يوجد new؛ وبعد التنازل لا يستطيع أي مفتاح إصدار الرمز مجددًا أبدًا. ويُرفض أي من الإجراءين على رمز لا تكون سلطته Key (TokenError::NotKeyAuthority).

توقّع السلطة على blake3("rand-rpl-mint-1" | "rand-rpl-authority-1", chain_id ‖ asset_id ‖ nonce ‖ body). ويجب أن يساوي nonce قيمة mint_nonce للرمز، التي تزداد بعد ذلك، فلا يمكن إعادة تشغيل إصدار موقَّع على هذه السلسلة ولا نقله إلى أخرى. ويتضمن body الخاص بالإصدار ملخّص الغلاف: فالالتزام وحده لا يغطيه، ومن دون الملخّص يستطيع طرف ثالث إعادة تغليف إصدار منتشر بغلاف عشوائي واستهلاك قيمة nonce.

يُنقل الإجراءان كلاهما ضمن حزمة رسم بعملة RAND تدفع BUNDLE_BASE. والمحفظة التي تدفع الرسم والمفتاح الذي يفوِّض الإصدار منفصلان، ويمكن أن يعودا إلى شخصين مختلفين.

الحرق

يُنقل Action::TokenBurn { asset, amount } ضمن الحزمة الواحدة نفسها: يجب أن يساوي burn_asset في الحزمة قيمة asset، وأن يساوي burn_a قيمة amount، ويكون burn_r صفرًا. ويخرج الرمز من المجمّع عبر خانات الأصل، ويخرج رسم RAND عبر الخانتين 2–3 من الإثبات نفسه. وينخفض total_supply بمقدار amount تمامًا. ويُرفض هنا رمزٌ سلطته Bridge (TokenError::BridgedToken)؛ فهو يخرج عبر حرق في الجسر.

الرسوم

يدفع كل إجراء من إجراءات RPL بعملة RAND.

الإجراءالحد الأدنى للرسمفي السلسلة 20
تحويل أي أصل (Action::None)BUNDLE_BASE0.001 RAND
RegisterTokenBUNDLE_BASE + registration_fee1.001 RAND، يُحرق منها 1 RAND
TokenMintBUNDLE_BASE0.001 RAND
SetAuthorityBUNDLE_BASE0.001 RAND
TokenBurnBUNDLE_BASE0.001 RAND

يحتوي genesis السلسلة 20 على قسم gas، وهو يسعّر استدعاءات البرامج واستحضاراتها فقط. وهذه الحدود الدنيا ثابتة: لا يدفع أي إجراء من إجراءات RPL بحسب الغاز ولا بحسب البايت.

ما هو علني وما هو مخفي

علنيمخفي
التسجيلالاسم، الرمز، الخانات العشرية، السلطة، معرّف الأصل، مبلغ الإصدار الأولي ومستلمهلا شيء؛ وبهذا يمكن تدقيق عرض الرمز منذ كتلته الأولى
إصدار إضافيالمبلغ، عنوان المستلم المحمي، حقول الملاحظة الجديدةمن دفع رسم RAND
تحويللا شيء يدل على أن رمزًا قد جرى تحويله أصلًاالمرسل، المستلم، المبلغ، الأصل
حرقالأصل والمبلغمن كان يحوز الملاحظات المحروقة
تغيير السلطةالمفتاح الجديد، أو أنها أُسقطت—

ولذلك يظل total_supply قابلًا للتدقيق دائمًا: فهو ما أضافه التسجيل وكل إصدار، مطروحًا منه كل حرق. والتحويل بين الحائزين لا يكشف شيئًا، بما في ذلك أن رمزًا لا RAND هو الذي تغيّرت ملكيته.

يعمل الإفصاح كما يعمل في RAND. فنص الملاحظة الصريح يحمل الأصل، ولذلك يفتح مفتاحٌ خاص بكل معاملة (rand tx-key <hash>) أو مفتاح عرض ملاحظةَ رمزٍ كما يفتح ملاحظة RAND، وتُرجع rand_checkTransaction وrand_getViewingNotes الحقل asset في الملاحظة التي تفصحان عنها. وإذا توفر مفتاح كهذا، حلّ randscan الفهرس في السجل وعرض التحويل بوصفه الرمزَ المسمّى؛ أما الصفحة العلنية للمعاملة نفسها فلا تُظهر شيئًا من ذلك.

الرموز المجسَّرة

الرمز ذو السلطة Bridge هو رمز RPL مثل غيره: مدخل السجل نفسه، والتحويل المخفي نفسه، وآليات الحرق نفسها. ولا يتحرك عرضه إلا عبر قفل على سلسلة المصدر (BridgeAttest) أو عبر إطلاق (BridgeBurn). ويمكن أن يكون للرمز المجسَّر الواحد عدة ضمانات، كلٌّ منها زوج (chain, token) له خاناته العشرية المصدرية ومبلغه المقفل وسقف إصداره، ويساوي total_supply دائمًا مجموع ما أقفلته ضماناته. ولا يُسجَّل رمز مجسَّر، ولا تُضاف ضمانة، إلا بنصاب من حراس الجسر المقاومين للحوسبة الكمّية.

في السلسلة 20 يكون أول رمز في السجل هو zUSD (“Shielded USD”)، الفهرس 1، بثماني خانات عشرية، وهو مدرج في ملف genesis بسبع ضمانات (USDT وUSDC على Ethereum وBinance Smart Chain وSolana، وUSDT على Tron). وهو يحتفظ بمعرّف الأصل الذي كان له في السلسلة 14، حيث سُجّل بمعاملة عند الارتفاع 256: وتدرجه السلاسل من 15 إلى 20 كلٌّ في genesis بالاسم والرمز والملح أنفسها. وبدأ السلسلة 20 بـ 99 zUSD في ملاحظتي genesis (10 و89)، مضمونة بـ 22 USDT مقفلة على Ethereum، و22 على Binance Smart Chain، و30 على Tron، و25 على Solana، منقولة من حالة جسر السلسلة 19. وبدأت السلسلة 19 بـ 10 zUSD مضمونة بـ 10 USDT على Solana؛ وبدأت السلسلة 18 بـ 9 USDT مقفلة على Tron وواحد على Solana. ويساوي عرضه الكلي ما تحتفظ به ضماناته مقفلًا، ويتحرك مع كل إيداع واسترداد. ومعرّفه rpl1xtj6k2x8strx8c2d5fjs50ltztck5ykms4ve7nmzmstf6fhn0v0spelqtx. ويتناول الجسر الضمانات ووحدات الإطلاق وسقوف الإصدار والإيقاف المؤقت والتوقيع المشترك.

zUSD سلّة، وليس سبع مطالبات منفصلة. فضماناته مجمَّعة بقيمتها الاسمية، ولذلك يتحمل الحائز مخاطر كل ضمانة مدرجة، لا مخاطر العملة التي أودعها: إذ يمكن إيداع ضمانة فقدت ربطها بسعرها بالقيمة الاسمية ثم حرق zUSD مقابل ضمانة سليمة، إلى أن تُستنزف الضمانات السليمة. والذي يحدّ الخسارة هو نافذة الإصدار المتجددة (في السلسلة 20: 4,000 zUSD عبر كل الضمانات في 24 ساعة، إلى جانب 100,000 لكل ضمانة) والحضانة المقفلة فعلًا. وتحدّ النافذة من المعدّل وتمنح وقتًا لإيقاف الإصدار مؤقتًا، لكنها لا تضع سقفًا للمجموع. ولا تُدرج ضمانة إلا بنصاب الحراس المقاومين للحوسبة الكمّية، ولا تُدرج أثناء إيقاف الإصدار مؤقتًا.

رسوم الجسر بعملة zUSD (السلسلة 20). يضبط genesis السلسلة 20 القيمة bridge.fees: 10 نقاط أساس على الإيداع و10 نقاط أساس على الحرق، يُقرَّب كلٌّ منها إلى الأسفل إلى وحدة إطلاق كاملة للضمانة (100 وحدة أساسية لـ USDT ذي 6 خانات عشرية)، وتُدفع على هيئة ملاحظة zUSD إلى عنوان خزينة يسمّيه genesis (الإصدار v0.6.8، الملف docs/bridge.md في fullnode، §25). ويُلحق إيداع بمقدار g ملاحظتين: ملاحظة المودِع بمقدار g − fee وملاحظة الخزينة بمقدار fee؛ فإيداع 1 USDT يعني 0.999 zUSD للمودِع. ويُبقي حرق بمقدار amount الرسم fee ملاحظةً للخزينة ويُطلق amount − fee على سلسلة المصدر؛ ويوقّع الحراس على مبلغ الإطلاق هذا، وتخدم rand_getBridgeBurn القيم amount وrelease_amount وfee. وملاحظة الرسم مُصدَرة ومضمونة، ولذلك يظل total_supply مساويًا لمجموع locked في الضمانات: فالإيداع يحرّك كليهما بمقدار g، والحرق يخفضهما بمقدار amount − fee. ولا تحمل ملاحظة الرسم غلافًا. وكل كلمة فيها علنية (المبلغ من المعاملة ومعدل genesis، والأصل وtime، والتعمية المشتقة من ملخّص الإثبات أو من معرّف معاملة الحرق، والمالك من genesis)، ولذلك تعيد محفظة الخزينة بناءها من حقول علنية (الملاحظات). أما BRIDGE_BURN_FEE، وهو 0.01 RAND يدفعها الحرق إلى المقترِح، فلم يتغير. ولم يكن في السلاسل من 14 إلى 19 أي رسم جسر على Rand.

السجل منذ السلسلة 15

منذ السلسلة 15 يفعّل genesis ثلاث قواعد للسجل لم تكن في السلسلة 14، ويضبط genesis السلسلة 20 القيم الثلاث نفسها. وكلٌّ منها مُلتزَم به في تجزئة genesis وجذر الرموز.

حقل التكوين الأولي (genesis)السلسلة 20الأثر
tokens.max_tokens4096لا يحتوي السجل أكثر من هذا العدد؛ وعند بلوغ الحد يُرفض RegisterToken وRegisterBridgedToken بالخطأ RegistryFull. أما ListBacking فلا يضيف رمزًا ولا يتأثر
tokens.burn_registration_feetrueتُتلف registration_fee الخاصة بالتسجيل بدلًا من دفعها إلى المقترِح، الذي يحتفظ بالفرق fee − registration_fee. تحتسبها rand_getSupply ضمن burned وضمن registration_fees_burned (المعروض)
tokens.bound_note_valuetrueيُرفض بالخطأ AmountTooLarge أي TokenMint أو سكّ أولي أو إيداع عبر الجسر بقيمة 2^63 أو أكثر، ويُرفض بالخطأ SupplyTooLarge ما من شأنه أن يبلغ بـtotal_supply الخاص برمز ما القيمة 2^63 أو يتجاوزها

يوجد حدّ قيمة الملاحظة لأن دائرة الحزمة تتحقق من نطاق كل مبلغ ضمن 63 بتًا: فالملاحظة التي تبلغ قيمتها 2^63 أو أكثر يمكن الالتزام بها لكن لا يمكن إنفاقها أبدًا، مع أنها تُحتسب ضمن المعروض من الرمز. كما ترفض كل عقدة هذا المبلغ عند القبول على كل سلسلة، أيًّا كان ما ينص عليه تكوينها الأولي.

RPC وCLI

الطريقةالمعاملاتالنتيجة
rand_getTokens[from_index, limit]، اختيارية، والقيمتان الافتراضيتان 0 و1000، ويُقيَّد الحد الأعلى بـ1000{ enabled, registration_fee, next_index, max_tokens, burn_registration_fee, bound_note_value, tokens }، بترتيب تصاعدي حسب الفهرس، وتُقرأ بالنطاق ابتداءً من from_index
rand_getToken[token]: فهرس، أو معرّف من 64 خانة سداسية عشرية، أو rpl1…صف رمز واحد، أو null؛ والمعرّف المشوَّه يعطي -32602
rand_getTokenSupply[token]، بالصيغ نفسها{ total_supply, backings }؛ وتكون backings فارغة للرمز الأصلي

كل مبلغ في هذه النتائج (total_supply وregistration_fee وlocked الخاص بالدعم وmint_cap_per_day وminted_today) هو سلسلة عشرية، لأن الرقم في JSON ليس دقيقًا بعد 2⁵³. أما index وnext_index وmint_day وmax_tokens فهي أعداد صحيحة عادية (وقيمة max_tokens هي null في سلسلة بلا حد أقصى)؛ وburn_registration_fee وbound_note_value قيمتان منطقيتان. أما authority في الصف فهو {"kind":"none"} أو {"kind":"key","key","address"} أو {"kind":"bridge","backings":[…]} أو {"kind":"program","program"}. التفاصيل الكاملة في JSON-RPC.

الخصوصية. تكلّف rand_getTokens الكلفة نفسها أيًّا كان الرمز الذي يقصده المستدعي. أما rand_getToken وrand_getTokenSupply فتُعلمان العقدة بالرمز الذي يهمّ المستدعي: وهذا مقبول لمستكشف، لكنه خطأ لمحفظة على وشك الإرسال. لذلك تحلّ المحفظة كل --asset من القائمة الكاملة، ولا يصل فهرس رقمي إلى العقدة إطلاقًا.

الأمروظيفته
rand token createتسجيل رمز عند الفهرس التالي في السجل، بمعروض ثابت أو بتفويض Key
rand token mintسكّ مزيد من رمز مفوَّض بـKey، بتوقيع مفتاح سلطته
rand token set-authorityتسليم السلطة إلى مفتاح آخر (--new-key) أو التخلي عنها (--renounce)
rand token burn <ASSET> <AMOUNT>إتلاف وحدات تحتفظ بها هذه المحفظة
rand token info <ASSET>الصف الكامل لرمز واحد
rand token listصفحة واحدة من السجل
rand send <TO> <AMOUNT> --asset <INDEX|rpl1…|hex>إرسال رمز في حزمة واحدة؛ وبدون --asset يرسل RAND. يطبع بصمة المستلم والمبلغ ويسأل send? [y/N] قبل إنشاء الإثبات (--yes يتخطى السؤال)
rand asset-balance [INDEX]ما تحتفظ به هذه المحفظة من أصل واحد، أو صفًّا لكل أصل
rand token register-bridged, rand token list-backingإجراءا الإدراج الخاصان بالجسر؛ ويحتاج كل منهما إلى ملف نصاب حرّاس PQ

منذ v0.5.10 أصبحت مبالغ rand send --asset وrand token mint وrand token burn بـوحدات العرض الخاصة بالرمز، وتُقرأ وفق decimals في صف السجل الخاص به: فـ1.5 من رمز بست منازل عشرية تساوي 1,500,000 من أصغر وحداته، ويُرفض أي عدد من المنازل الكسرية يزيد على ما للرمز. ويطبع تأكيد send الاثنين معًا (1.500000 USDX (1500000 units)). أما --fixed-supply و--initial في rand token create فما زالا يأخذان وحدات صغرى كاملة، وكذلك rand bridge-burn، ويطبع rand asset-balance الوحدات الصغرى. وعلى السلسلة يكون المبلغ دائمًا عددًا صحيحًا بأصغر وحدة. العلامات والقيم الافتراضية في سطر الأوامر.

الفروق عن ERC-20 وSPL

ERC-20 / SPLRPL
الأرصدةتعيين أو حساب عامملاحظات محمية (shielded)؛ لا يستطيع رؤية الواحدة منها إلا حامل المفتاح
أحداث التحويلعامة، تتضمن المرسِل والمستلم والمبلغلا توجد؛ فالتحويل لا ينشر شيئًا مميِّزًا
شيفرة لكل رمزممكنة: ضريبة، إعادة معايرة (rebase)، خطافات، تجميدلا توجد؛ كل رمز يتبع القواعد الثابتة نفسها
احتفاظ برنامج بالرمزنعمفي السلسلة 20 (RPL-2): خزنة عامة للبرنامج، تُملأ بحقول الإتلاف في الاستدعاء وتُصرف ملاحظاتٍ تحسبها السلسلة
المبالغحتى 256 بتًا (ERC-20)، و64 بتًا (SPL)u64، وبحد أقصى 9 منازل عشرية
الاستلاملا يحتاج ERC-20 إلى أي إعداد؛ ويحتاج SPL إلى حساب رمز مرتبطلا إعداد؛ فالعنوان المحمي يستقبل أي شيء
كلفة التحويلتنفيذ EVM أو SVM عادييُثبته المرسِل: حزمة الأصول المخفية المشتركة، ومنذ السلسلة 17 إثبات تفويض صغير بجانبها
الموافقاتapprove / transferFromغير متاحة بعد
البيانات الوصفيةقابلة للتعديل في بعض التنفيذاتعلى السلسلة وغير قابلة للتغيير
التجميد والقائمة السوداءممكنان في بعض الرموزخارج النطاق بحكم التصميم

حدود معروفة

  • لا مخصصات إنفاق (allowances). صُمم approve وtransferFrom في مواصفة RPL على هيئة حسابات مخصصات محجوزة، ولم يُبنيا.
  • حيازات البرنامج عامة. في السلسلة 20 يمكن لبرنامج أن يحتفظ برموز في خزنته وأن يسكّ رمزه الخاص (RPL-2)، لكن رصيد الخزنة عام، مثل المعروض من الرمز؛ والملاحظات وحدها خاصة. أما السلاسل السابقة للسلسلة 20 فلم تكن فيها حالة برنامج على الإطلاق.
  • الرسوم بـ RAND فقط. لا يستطيع الرمز دفع رسمه بنفسه؛ والمحفظة التي لا تحتوي إلا على رموز لا تستطيع التحرك.
  • u64 ومنازل عشرية لا تزيد على 9. تُمثَّل العملة المصدرية ذات 18 منزلة عشرية بدقة أدنى؛ وتسوّي الجسر هذا بـ8 منازل عشرية ووحدة صرف لكل دعم.
  • كل تحويل يُثبَت. نحو 100 ثانية وعدة غيغابايت من الذاكرة على جهاز المرسِل؛ ولا يوجد مسار أرخص لرمز مما هو لـ RAND.
  • لا تجميد ولا قائمة سوداء ولا إيقاف مؤقت على رمز أصلي، بقرار مقصود. ويسري إيقاف السكّ المؤقت في الجسر على عمليات السكّ المجسَّرة وحدها.
  • عمليات البحث لكل رمز تكشف الاهتمام. rand_getToken وrand_getTokenSupply و/tokens/:id في المستكشف تُعلم الخادم بالرمز الذي سُئل عنه.

آخر تحقق مقابل الإيداع c0878c3f في fullnode (السلسلة 21) بتاريخ 2026-10-12، وfullnode `docs/tokens.md`, `docs/cli.md`, `docs/rpc.md`, `docs/superpowers/specs/2026-09-19-rpl-token-standard-design.md`, and the live registry at `randscan.org/api/v1/tokens` on 2026-09-20; updated for chain 15 against fullnode `8abf85e` (v0.5.9) `docs/tokens.md` §§14–16 and `deploy/genesis-chain15.json`; updated for chain 18 on 2026-09-30 against fullnode `90e7716` (the fleet runs v0.6.7 `86941a1`) `docs/tokens.md`, `docs/cli.md`, `docs/shielded.md` §2, `docs/bridge.md` §13.1, `crates/randprotocol-core/src/gas.rs` and `deploy/genesis-chain18.json`; updated for chain 20 on 2026-10-01 against fullnode v0.6.8 `c9c9bd3c` `docs/bridge.md` §25, `docs/program-state.md`, `crates/randprotocol-core/src/ledger/tokens.rs`, `crates/randprotocol-client/src/wallet.rs` (`rebuilt_notes_with`), the committed `deploy/genesis-chain20.json` and `rand_getLimits` on chain 20. إذا اختلف الكود عن هذه الصفحة فالكود هو الصحيح؛ أبلغونا بذلك.