استخدم هذه الصفحة لبناء أي أداة تقرأ المجمّع أو تدقيقها: محفظة تمسح بحثًا عن ملاحظاتها، أو مفهرس يتتبع الالتزامات والمُبطِلات، أو أداة تفحص ما تنشره المعاملة. القيمة على هذه السلسلة مجموعة من الملاحظات؛ والسلسلة تحتفظ بالتزاماتها، ولا تحتفظ بمحتوياتها أبدًا.
الملاحظة
الملاحظة هي { pk, from, amount, asset, time, r }: 28 كلمة من 32 بت، أي 112 بايت، مرتبة على النحو pk(8) from(8) amount_lo amount_hi asset time r(8). pk هي القيمة العامة لملاحظات المالك (مشتقة من مفتاح العرض)، وfrom قيمة المرسل، وamount عدد من النوع u64 بالوحدات (1 RAND = 10⁹ وحدة)، وasset عدد من النوع u32 (0 للعملة RAND، وإلا فهو الفهرس الكثيف في سجل الرموز لرمز RPL، سواء كان مُجسَّرًا أو أصليًا؛ انظر رموز RPL)، وtime ارتفاع الكتلة الذي استهدفه المرسل، وr ثماني كلمات عشوائية للتعمية.
لا يظهر النص الأصلي على السلسلة أبدًا. وما يظهر هو:
- التزامها
cm = H(CM, words)، وهو تجزئة Poseidon2 للكلمات الـ28 تحت وسم النطاق 4، يُضاف ورقةً في الشجرة؛ - مغلفها، وهو النص الأصلي مختومًا بعنوان المالك بحيث لا يقرؤه إلا المالك، أو المرسل عبر مفتاح العرض الصادر الخاص به. ومنذ chain 18 (وبما فيها chain 20) يحمل المغلف أيضًا مذكرة مشفّرة. وبعض الملاحظات التي تحسبها السلسلة من حقول عامة لا تحمل أي مغلف (أدناه).
إنفاق الملاحظة ينشر مُبطِلها H(NF, nk, cm)، وهو تجزئة Poseidon2 تحت وسم النطاق 3 لمفتاح العرض لدى المالك وللالتزام. وبدون nk لا يمكن ربط المُبطِل بالتزامه. ومجموعة المُبطِلات هي ما يمنع الإنفاق المزدوج.
المغلف
Envelope { kem_ct, to_receiver, to_sender, body }
| الجزء | البايتات | ما هو |
|---|---|---|
kem_ct | 1,088 | تغليف ML-KEM-768 إلى عنوان المستلم |
to_receiver | 60 | مفتاح كل معاملة TxKey ملفوفًا تحت السر المغلَّف |
to_sender | 60 | TxKey نفسه ملفوفًا تحت مفتاح العرض الصادر للمرسل ovk |
body | 652 | الملاحظة ذات الـ112 بايت وحقل مذكرة من 512 بايت تحت TxKey (140 بايت، أي الملاحظة وحدها، حتى chain 17) |
كل جزء مشفّر بـ ChaCha20-Poly1305 مع nonce عشوائي من 12 بايت يُلحَق في البداية ووسم من 16 بايت، والبيانات المرتبطة هي وسم (rand-envelope-receiver أو rand-envelope-sender أو rand-envelope-body) يليه التزام الملاحظة، فلا يستطيع مفتاح أن يفتح مغلفًا لم يختمه، وتكون الملاحظة المفتوحة مرتبطة بالورقة التي تحتها. ومجموع ذلك 1,860 بايت من النص المشفّر؛ وببادئات الطول في bincode يصبح 1,892 على الشبكة. تضبط بنية التكوين الأولى لـ chain 20 القيمة envelope_bytes: 1860، ويرفض دفترها أي مغلف ملاحظة بطول آخر (envelope is 1348 bytes, this chain requires exactly 1860)؛ ولا يفحص شيئًا آخر عنه. وحتى chain 17 لم يكن للمغلف حقل مذكرة وكان 1,348 بايت (1,380 على الشبكة)، ولم يكن الدفتر يحدّه إلا بـ 2,048 بايت، وهذه ما تزال القاعدة على سلسلة لا تتضمن بنية تكوينها الأولى envelope_bytes.
حقل المذكرة هو len (u16 LE) ‖ UTF-8 text ‖ zero padding، بحجم 512 بايت، أي بحد أقصى 510 بايت من النص. وكل مغلف ملاحظة على chain 20 يحتوي عليه، سواء وُجدت مذكرة أم لا: فمخرج الباقي والمخرج الوهمي والدفعة بلا مذكرة تُحشى جميعًا بالطريقة نفسها، ولا شيء على السلسلة يميّز مذكرة أو طولها أو غيابها. والمذكرة ليست في الملاحظة ولا في الالتزام ولا في أي إثبات. ويقرؤها بالضبط من يستطيع أصلًا قراءة الملاحظة: المالك، أو المرسل عبر ovk، أو أي شخص سُلِّم TxKey ذلك المخرج. وحقل المذكرة المشوَّه (طول خاطئ، أو UTF-8 غير صالح، أو حشو غير صفري) يُفتح على أنه بلا مذكرة ولا يكلّف المالك ملاحظته أبدًا. والمذكرة نص يكتبه أي أحد، إذ يستطيع أي شخص أن يدفع ملاحظة غبارية إلى عنوان عام: فاعرضها على أنها غير موثوقة، مع استبدال محارف التحكم ومحارف تنسيق Unicode، كما تفعل محفظة rand. ويختم rand send --memo مذكرة في مخرج الدفعة؛ ويعرضها rand notes --memo وrand history --memo.
الشجرة والمراسي والنوافذ
تُضاف الالتزامات إلى شجرة Poseidon2 واحدة بعمق 32، الأقدم أولًا، ولا تُزال أبدًا. والورقة i هي الملاحظة رقم i التي أنشأتها السلسلة على الإطلاق؛ وملاحظات الإيداع في بنية التكوين الأولى هي الأوراق الأولى. وتضيف الحزمة أربع أوراق وأربعة مُبطِلات مهما كان ما تنقله، بما في ذلك الوهميات. والورقة الفارغة كلها أصفار والعقدة هي H(NODE, left, right) (وسم النطاق 7). وتحتفظ العقدة بالحدود فقط، فلا تحتفظ حالة الإجماع بالأوراق أبدًا؛ ويعيد rand_getWitness بناء الشجرة الكاملة من الأوراق المخزّنة عند الطلب، ولهذا فهو أغلى قراءة تخدمها العقدة.
تثبت الحزمة انتماء مدخلاتها بالنسبة إلى مرساة، وهي جذر الشجرة. وقاعدتان تُبقيان المرساة صادقة:
| الثابت | القيمة | القاعدة |
|---|---|---|
ANCHOR_WINDOW | 256 كتلة؛ 1,024 على chain 20 | يجب أن تكون المرساة واحدًا من آخر window من جذور نهاية الكتلة؛ والجذر الذي تمر به الشجرة في منتصف كتلة لا يكون مرساة أبدًا |
TIME_WINDOW | 256 كتلة؛ 1,024 على chain 20 | يجب أن يقع time الخاص بالحزمة ضمن [height − window, height] |
النافذتان كلتاهما 256 كتلة ما لم تضبط بنية التكوين الأولى proof_window_blocks (v0.6.8، من 256 إلى 4,096)، فيحل محل النافذتين معًا. وتضبط chain 20 القيمة 1,024؛ أما السلاسل من 14 إلى 19 فلم يكن فيها هذا الحقل.
وُجدت النوافذ لأن الإثبات يستغرق وقتًا حقيقيًا: فإثبات حزمة من المستوى 14 يقيس نحو 100 ثانية على حاسوب محمول (ومنذ chain 17 تُجري المحفظة إثبات تفويض ثانيًا من المستوى 10، نحو 7 ثوانٍ). وكانت 256 كتلة نحو خمس دقائق عند كتل chain 18 البالغة 1.17 ث، ورُفض إثبات مفوَّض على مُثبِت بطيء عند 294 ث؛ أما 1,024 كتلة على chain 20 فتعادل نحو 23 دقيقة عند 1.34 ث التي أبلغ عنها المستكشف هناك. والمحفظة التي تخسر السباق يقال لها anchor is not one of the last 1024 roots فتعيد الإثبات. ويعيد rand_getAnchor دون معامل جذر نهاية الكتلة للرأس، وهو المرساة الوحيدة التي ينبغي لمُثبِت أن يبني عليها.
الحزمة
كل معاملة تنقل قيمة تحمل بالضبط حزمة واحدة ثابتة بأربعة مدخلات وأربعة مخرجات ذات أصل مخفي (منذ chain 14؛ وكانت بمدخلين ومخرجين حتى chain 13)، يثبتها ضيف zkVM للأصل المخفي الذي ثُبِّت بصمته hc_bundle في ملف بنية التكوين الأولى (60af094acfe65d85fdb18fb3d06cf9085dcf28c96e59e87f1ee527226e6e3fce، ضيف الحزمة v3، على السلاسل 17 إلى 20؛ وكانت 83d3a3704a1fcdb9bae7136c0a947ffa34bd53f055388395ed705fe8cacd0ef8، الضيف v1، على السلسلتين 14 و15):
Bundle { anchor, nullifiers[4], commitments[4], fee, burn_a, burn_r, burn_asset, time, envelopes[4], proof,
auth_commit, auth_proof } // the last two since chain 17
تحمل الخانتان 0–1، مدخلات ومخرجات، أصلًا خاصًا A؛ وتحمل الخانتان 2–3 دائمًا RAND. وفي دفعة RAND وحدها تكون الخانتان 0–1 وهميتين وتنتقل القيمة والرسوم عبر الخانتين 2–3. وفي تحويل رمز ينتقل الرمز عبر الخانتين 0–1 وتُدفع رسوم RAND من الخانتين 2–3 في الإثبات نفسه. وA كلمة شاهد في الإثبات وليست في أي حقل عام، فتحويل أي رمز RPL هو Action::None مع burn_a = burn_r = burn_asset = 0، حقلًا بحقل على شكل دفعة RAND.
يقرر الإثبات أن كل مدخل حقيقي ورقة تحت anchor ويحمل أصل خانته، وأن المُبطِلات الأربعة هي المنشورة، وأن كل مجموعة متوازنة (in0 + in1 = out0 + out1 + burn_a في الأصل الخاص، وin2 + in3 = out2 + out3 + fee + burn_r في RAND)، وأن المنفق يحوز المفاتيح، دون الكشف عن أي أوراق ولا أي مبالغ ولا أي أصل ولا عن هوية أحد. وحقول الحرق الثلاثة هي البيان العام الوحيد للحزمة عن قيمة تغادر المجمّع: فـburn_a وburn_asset لا يكونان غير صفريين إلا في TokenBurn أو BridgeBurn، حيث يساويان مبلغ الإجراء وأصله؛ وburn_r هو RAND المحروق، ولا يكون غير صفري إلا في Bond (الحصة) وRegisterAggregator (الضمان). والرسوم دائمًا بـ RAND.
ومنذ chain 17 صارت سلطة الإنفاق موزعة على إثباتين (التفويض المنقسم). فضيف الحزمة v3 يأخذ مفتاح العرض nk وملحًا حيث كانت الضيوف السابقة تأخذ مفتاح الإنفاق: فيشتق pk_self = H(PK, nk)، ويشترط أن يملك كل مدخل، ويطوي c = H(AUTH, nk ‖ salt) في البصمة التي ينشرها. وضيف ثانٍ، هو ضيف التفويض (hc_auth في بنية التكوين الأولى، 1e4e347f44cf86750b30a9a4bdf9ec9256efe353d4ff8017451eca7d195639c1)، يأخذ مفتاح الإنفاق sk والملح نفسه، ويشتق nk = H(NK, sk) وينشر c نفسه. وتحمل الحزمة c بوصفه auth_commit وإثبات ضيف التفويض من المستوى 10 بوصفه auth_proof، ويشترط الدفتر أن يتحقق الإثباتان كلاهما مقابل ربط المعاملة نفسه وأن تتطابق قيمتا c. فالمُثبِت الذي يحوز nk والملح يستطيع إذن أن يصنع إثبات الحزمة لكن لا إثبات التفويض، وهذا ما يقوم عليه الإثبات المفوَّض. والملح 256 بتًا عشوائيًا جديدًا لكل حزمة، فـauth_commit عام ولا يربط شيئًا. والمحفظة التي تثبت لنفسها تصنع الإثباتين أيضًا، فتبدو المعاملة المثبتة ذاتيًا والمفوَّضة متماثلتين على السلسلة.
المخارج ثابتة الشكل، لذا فالخانات كثيرًا ما تكون وهمية: المدخل الوهمي ملاحظة صفرية القيمة يملكها المُنفِق (ويظل مُبطِلها منشورًا)، والمخرج الوهمي ملاحظة بمبلغ صفر، ومخرج الباقي موجود حتى حين يكون الباقي صفرًا. فلو بدت المعاملة مختلفة حين لا يوجد باقٍ لكشفت أنه لا يوجد. ويترتب على ذلك للمحافظ: تُنفق كل مجموعة من مجموعتَي الحزمة ملاحظتين على الأكثر. فدفعة RAND أو سند أو نشر أو استدعاء تُنفق ملاحظتَي RAND على الأكثر؛ وتحويل الرمز أو حرقه يُنفق ملاحظتين على الأكثر من الرمز وملاحظتَي RAND على الأكثر للرسوم. أما القيمة الموزعة على ثلاث ملاحظات أو أكثر في مجموعة واحدة فيجب دمجها أولًا بإرسالها إلى عنوان صاحبها نفسه.
منذ السلسلة 14 صار الإثبات مرتبطًا بمعاملته أيضًا: يُنشأ ويُتحقق منه على تجزئة المعاملة كاملةً بعد تفريغ الإثباتات، فلا يمكن نسخه إلى إجراء آخر ولا إلى أظرف أخرى ولا إلى سلسلة أخرى؛ وفي السلسلة 20 تشمل التجزئة أيضًا تجزئة التكوين (genesis)، فلا يمكن نسخه حتى إلى سلسلة تشترك معها في معرّف السلسلة (المعاملات).
ما هو علني وما هو مخفي
| علني على السلسلة | مخفي | |
|---|---|---|
| تحويل، من RAND أو من أي رمز RPL | المرساة، والمُبطِلات الأربعة جميعها، والالتزامات الأربعة جميعها، والرسوم، وburn_a = burn_r = burn_asset = 0، وtime، وأربعة نصوص مشفّرة للأظرف، والإثبات، وauth_commit وإثبات التفويض | من أرسله، ومن دُفع إليه، والمبلغ، والمذكرة النصية، وأي أصل انتقل، والباقي، وأي أوراق أُنفقت، وأي الخانات كانت وهمية |
| حرق رمز أو حرق جسر | كل ما يُنشره التحويل، مع burn_asset وburn_a مساويين لأصل الإجراء ومبلغه (وفي حرق الجسر أيضًا رسوم المُرحِّل، والرمز الداعم، والوجهة) | أي الملاحظات حُرقت، ومن حرقها |
| سكّ من الصنبور (faucet) | الالتزام، والظرف، والمبلغ، والمُصادِق الذي سكّ، ومنذ السلسلة 14 فتح الملاحظة (pk وtime وr) الذي يعيد القبول حساب الالتزام منه | كل إنفاق لاحق للملاحظة |
| إيداع في التكوين (genesis) | { cm, envelope, amount, opening: { pk, time, r } } في ملف التكوين، مع asset في الفتح لملاحظة من رمز مُدرج (يحمل تكوين السلسلة 20 ملاحظتَي zUSD): فـpk المالك والمبلغ والأصل علنية بالتصميم | متى تُنفق لاحقًا وفيما تُنفق |
| سحب، أو إيداع جسر، أو سكّ رمز، أو السكّ الأولي لتسجيل | المبلغ، والمستلم، وقيمة time للملاحظة وعامل التعمية r (والسلسلة تحسب الالتزام بنفسها) | كل إنفاق لاحق للملاحظة |
| دفعة استدعاء (invoke) أو سكّ برنامج (السلسلة 20) | المبلغ، والأصل، والمستلم، وr؛ أما time للملاحظة فهو للحزمة | كل إنفاق لاحق للملاحظة |
| ملاحظة رسوم الجسر (السلسلة 20) | المبلغ، والأصل، وtime، وعامل تعمية مشتق، وخزينة التكوين (genesis) مالكًا، ولا ظرف لها | كل إنفاق لاحق للملاحظة |
تدخل القيمة إلى المجمّع بمبلغ علني — سكّ من الصنبور، أو إيداع في التكوين، أو سحب مُصادِق، أو إقرار جسر وملاحظة رسومه، أو سكّ رمز، أو دفعة من خزنة برنامج — وتخرج منه رسومًا علنية أو حرقًا. وكل ما بين ذلك ملاحظات.
هذا الجدول هو ما تخفيه إثباتات السلسلة 20، ولم يكن الأمر كذلك دائمًا. ففي السلسلتين 14 و15 كان إثبات الحزمة نفسه يفصح عن أكثر من ذلك (مراجعة zkVM بتاريخ 2026-09-27، INT-2 / GV-1): كان المجموع الجاري لـLogUp في كل جدول منشورًا غير معمّى، وكان ضيف الإثبات v1 يتخطى فحصَي ميركل والأصل للمدخل الوهمي ويتفرع عند كل بت من مسار ميركل، فكان بوسع أي أحد أن يقرأ من إثبات الحزمة أي خانات المدخلات الأربع حقيقية، ومن ثَم هل نقلت رمزًا أم RAND فقط، وعدد البتات 1 في فهرس كل ورقة أُنفقت. وأغلق تغييران هذه الثغرة. فقد انتقلت السلسلة 16 إلى مجموعة القيود 7، التي تعمّي كل طرف نهائي في LogUp وتجعل الحد الأدنى لكل جدول مُعلَن 2^7 صفًّا، وإلى ضيف الحزمة v2 الخالي من التفرع، الذي تُجري فيه كل خانة، وهمية كانت أم حقيقية، فحص العضوية والأصل كاملًا عبر التعليمات نفسها. أما الضيف v3، الذي تعمل به السلاسل من 17 إلى 20، فهو علاقة v2 نفسها مع nk والملح بدل مفتاح الإنفاق، وهو أيضًا خالٍ من التفرع. وتحتفظ الحزم المُثبَّتة في السلسلتين 14 و15 بما سرّبته. وما لا يزال الإثبات يُظهره في السلسلة 20 هو ترويسته: فهي للحزمة شكل واحد ثابت (الطبقة 14، وحد غاز مُعلَن قدره 20,479 في كل حزمة)، وهي للمعاملة Call أو Invoke الطبقة وحد الغاز المُعلَن وهل استخدم الاستدعاء المترجَم المسبق keccak أو sha256 وبأي تكرار تقريبًا (الإثباتات).
ملاحظات بلا ظرف
تُكتشف معظم الملاحظات بفتح أظرفها. وبعضها تحسبه السلسلة من حقول علنية، وهذه إما لا ظرف لها أو لا يُوثق بظرفها.
- ملاحظات رسوم الجسر (السلسلة 20). تحت
bridge.feesتُلحق السلسلة ملاحظة zUSD بخزينة التكوين (genesis) عند كل إيداع وكل حرق (رموز RPL). ولا ظرف لها: يفهرسها التخزين بظرف فارغ، مختوم لا لأحد، وتعرضهاrand_getCompactBlocksوrand_getCommitmentsعلى هذا النحو، فتأتي ملاحظة الإيداع بعد ملاحظة الإيداع نفسه، وملاحظة الحرق بعد الملاحظات الأربع للحزمة. وكل كلمة في الملاحظة علنية: المبلغ من المعاملة ومعدّل التكوين، والأصل وtimeمن المعاملة، وfrom = 0، وعامل التعميةblake3("rand-bridge-fee-r-1" ‖ mu)للإيداع أوblake3("rand-bridge-burn-fee-r-1" ‖ txid)للحرق، والمالك هوrecipientفي التكوين (genesis). - ملاحظات لا يربط ظرفها شيئًا. يحمل إيداع الجسر، وسكّ الرمز، والسكّ الأولي للتسجيل، وفي السلسلة 20 دفعات الاستدعاء وسكّ البرامج، ظرفًا يختمه من قدّم المعاملة، لكن السلسلة تحسب الملاحظة من الحقول العلنية للإجراء ولا تتحقق قط من الظرف بمقابلته بها. وقد يختم مقدِّم مهمل أو خبيث بيانات عشوائية، فلا يجوز للمستلم أن يعتمد عليه.
لذلك تعيد محفظة rand بناء هذه الملاحظات بنفسها (wallet::rebuilt_notes_with)، في مرور علني إلى جانب فك التشفير التجريبي: فلكل معاملة من هذا النوع تذكر pk الخاص بها، ولملاحظات الرسوم حين يكون عنوانها هو الخزينة، تحسب الملاحظة وتسجلها عند الورقة التي تُجزَّأ إلى التزامها. والملاحظة المُعاد بناؤها مرشحة فقط: فالعقدة التي تكذب بشأن معاملة أو معدّل الرسوم أو تجزئة تجعل ملاحظة لا تُعثر عليها، ولا تضيف رصيدًا قط. ومنذ v0.6.8 تحمل الترويسات التي تعيدها rand_getBlocks معاملات الإيداع والسكّ والتسجيل في public_notes، وفي سلسلة ذات رسوم جسر تحمل الحرق أيضًا، بعد تجريدها من الإثباتات وتحت معرّفها الحقيقي، فيقرأ المرور صفحات الترويسات وحدها. أما معاملات الاستدعاء (invoke) فليست في public_notes في v0.6.8، ولذلك لا تجد المحفظة دفعة الاستدعاء مع عقدة v0.6.8 إلا عبر ظرفها، الذي يختمه المستدعي ولا يتحقق منه شيء. ويحمل Fullnode main معاملات الاستدعاء هناك أيضًا، بعد تجريدها من الإثباتات، منذ d0bb73fb؛ وهو تغيير على العقدة وحدها، لم يُطبَّق بعد على أسطول السلسلة 20، ولا تحتاج المحفظة إلى أي تغيير من أجله.
المسح: كيف تعثر المحفظة على ملاحظاتها
تجيب العقدة بـ«هذه هي الشجرة كاملة»، ولا تجيب قط بـ«هذا رصيدك». أما المحفظة فتفعل ما يلي:
- تقرأ الأوراق صفحةً صفحة بـ
rand_getCommitments(from_index, limit)(1,000 على الأكثر في الاستدعاء الواحد) أو بتدفق الكتلrand_getCompactBlocks(from_height, to_height)(128 كتلة على الأكثر في الاستدعاء الواحد)؛ وكل معاملة تحمل حزمة تسرد هناك أربع ملاحظات وأربعة مُبطِلات، ولا يستطيع أي قارئ أن يميّز الخانة الوهمية من الحقيقية؛ - تجرّب فك تشفير كل ظرف: مستقبِلةً عبر مفتاح فك التغليف ML-KEM الخاص بها، ومُرسِلةً عبر
ovk؛ وتحتفظ بالملاحظات التيpkفيها هو مفتاحها، وتعيد بناء الملاحظات ذات المبلغ العلني من معاملاتها (أعلاه)؛ - تحسب مُبطِل كل ملاحظة احتفظت بها، وتعلّم تلك التي تظهر في
rand_getNullifiers(from_height, limit)؛ - وتجمع ما تبقى.
تبيّن rand_getTreeInfo مدى ما يلزم مسحه: { "next_index", "root", "nullifiers" }. وللإنفاق تحتاج المحفظة إلى مسار ميركل ذي 32 مستوى لكل مدخل حقيقي. وتحتفظ محفظة rand بنسختها الخاصة من شجرة الالتزامات، تبنيها أثناء المسح من صفحات rand_getCommitments نفسها، وتحسب كل مسار بنفسها، فلا يسأل الإرسال العقدة عن الشجرة إلا rand_getAnchor، التي لا تسمّي أي ورقة. وتبقى rand_getWitness(index) على العقدة لعملاء آخرين. وهي تُعلم العقدة أي ورقة يوشك المستدعي على إنفاقها، وكان ذلك أكبر تسريب في المجمّع قبل الشجرة المحلية: فالعميل الذي لا بد له من استخدامها ينبغي أن يشغّل عقدته الخاصة، أو أن يطلب شهودًا لا يحتاج إليها إلى جانب التي يحتاج إليها.
rand sync # scanned 41 leaves and 37 blocks; 1 notes, 1 unspent
rand notes # index, asset, amount, height, spent, pending, memo
rand history # notes this wallet created for others, opened through ovk
تكون الملاحظة في حالة pending بين rand send --no-wait وأول sync تالٍ يرى إما المُبطِل (nullifier) الخاص بها أو كتلًا تتجاوز time + window (القيمة 1,024 على chain 20، وتُقرأ من rand_getLimits.proof_window_blocks؛ و256 في غيابه)، وبعد ذلك لا يمكن قبول الحزمة أبدًا وتصبح الملاحظة قابلة للإنفاق من جديد.