الورقة البيضاء · 06
المعيار الأساسي
مسوّغات كل عنصر في A-REX Core: لماذا يضم سجل الدفعة هذه الحقول بالضبط، ولماذا النسب عملية لا جدول ربط، ولماذا يأتي الإنفاذ من ERC-7943، ولماذا تحل الأكواد محل التعدادات، وما الدروس التي شكّلت التصميم.
هدف التصميم: أصغر واجهة يمكن أن ينفّذها طرف ثالث
يُتبنّى المعيار حين تكون كلفة تنفيذه أقل من كلفة عدم قابلية التشغيل البيني. وكان على كل حقل ودالة وقاعدة في A-REX Core أن يجتاز اختبارًا واحدًا: هل سيقبل فريق مستقل، يبني منصة لصوامع الحبوب في الأرجنتين أو نظامًا لمُصدِّر بن في كولومبيا، هذا القيد مقابل قابلية التشغيل البيني؟ لقد أخفقت في هذا الاختبار تعدادات المحاصيل، وأسماء الدرجات الأمريكية، وسجل المزارع الإلزامي، وحزمة الهوية المفروضة، وصيغة التقييم. واجتازته هوية الدفعة والنسب والإنفاذ ونقطة الامتداد.
سجل الدفعة، حقلًا حقلًا
| الحقل | سبب وجوده على السلسلة | سبب تشكيله بهذا الشكل |
|---|---|---|
commodity: bytes32 | يجب أن تتمكن الخطافات والأسواق والجهات التنظيمية من التصفية بحسب المنتج دون تحليل البيانات الوصفية | يقبل keccak256("HS:100199") أي نظام (HS، أو تعريفة جمركية وطنية مثل NCM أو CN أو TARIC أو HTS، أو FAO/CPC، أو GTIN، أو نظام جهة الإصدار نفسها) دون جدول في المعيار؛ ومنذ مخطط البيانات الوصفية 1.1.0 صار اسم النظام مفتوحًا في المستند أيضًا؛ أما التعداد فسيجمّد قائمة محاصيل العالم عند النشر |
unit: bytes32 | لا معنى للكميات بلا وحدة قياس؛ فتحويل 1000 يعني 1000 كغ أو 1000 صندوق | التوصية رقم 20 الصادرة عن UN/CEFACT هي قائمة الأكواد التي تستخدمها أنظمة EDI وEPCIS والجمارك |
producedAt: uint64 | تعتمد قابلية التلف والموسمية والعقود الآجلة كلها على وقت الإنتاج | تعني 0 "لم يُنتَج بعد": فمستحقات المحاصيل والعقود الآجلة وسندات الوارانت على المحاصيل المستقبلية هي أدوات التمويل الزراعي السائدة في أمريكا اللاتينية، ويجب أن يكون تمثيلها ممكنًا |
expiresAt: uint64 | أكثر قواعد التحويل شيوعًا في الزراعة هي "ليس بعد هذا التاريخ" | تعني 0 عدم وجود تاريخ؛ وتقرر الخطافات ما يترتب على انتهاء الصلاحية |
originRef: bytes32 | يجب أن يكون المنشأ قابلًا للإثبات (EUDR، والمنتجات العضوية، والمؤشرات الجغرافية) | مرجع إلى دليل (رقم بيان عناية واجبة، أو معرّف في سجل) أو مرجع عشوائي، وليس إحداثيات أبدًا ولا قيمة محسوبة منها أبدًا: فتجزئة قطعة الأرض أو geohash لها يمكن إعادة حسابهما من قطعة أرض مخمَّنة، والموقع الجغرافي لقطعة أرض المنتِج بيانات شخصية (إرشادات EDPB رقم 02/2025 الإصدار 2.0، يوليو 2026)، ولا تستطيع سلسلة عامة غير قابلة للتغيير أن تفي بحق المحو. وتنص المسودة المقترحة مع ADR-019 (مقترح) على القاعدة الثانية بوصفها MUST |
metadataHash: bytes32 + uri | كل ما عدا ذلك خارج السلسلة، لكن على الرمز أن يلتزم به | تجزئة مستند JSON قياسي يتبع مخططًا منشورًا (الإصدار 1.2.0)؛ ويمكن أن يكون uri على IPFS أو HTTPS أو رابط GS1 Digital Link |
status: uint8 | تمر الدفعة بدورة حياة، ويجب أن تمنع بعض الحالات الحركة | قيم مفتوحة بنقطتين ثابتتين (0 نشطة، و255 مسحوبة من التداول)؛ أما التعداد السابق ذو الحالات التسع فكان يرمّز مفردات سلسلة إمداد واحدة وكان يمكن لأي حامل تغييره |
issuer، createdAt | المساءلة والتدقيق | يضبطهما العقد، لا المستدعي أبدًا |
ما هو غائب عمدًا: خط العرض وخط الطول، ومعرّف المزرعة، وتعداد الدرجات، والرطوبة والبروتين، وعلم التحقق وعنوان جهة التحقق، وحقل quantity (فتتبّع المعروض في ERC-1155 هو المرجع)، وأي مفهوم للقيمة.
النسب بوصفه عملية
من الأخطاء الشائعة دورة حياة فيها حالة PROCESSED لكن بلا أي وسيلة لإنتاج السلعة المعالَجة. وتنص أنظمة التتبع صراحةً على أن التحويل التصنيعي حدث يربط المدخلات بالمخرجات: حدث التتبع الحرج للتحويل في FSMA 204، وTransformationEvent في EPCIS 2.0 مع inputQuantityList وoutputQuantityList. أما جدول ربط للدفعات الأم يكتبه مسؤول فلن يحمل الكميات ولا الذرّية.
تحرق transform(from, to, inputIds, inputAmounts, outputs, outputAmounts, processRef) وتسك في معاملة واحدة، وتسجّل الدفعات الأم على كل مخرج، وتُصدر حدثًا واحدًا بجميع الكميات ومرجع العملية، وتشغّل مسار الخطافات على كل عملية حرق أو سك. والتقسيم (1←n) والدمج (n←1) والمعالجة (n←m) هي الدالة نفسها. ويتيح التنفيذ المرجعي لأي حامل إعادة تكوين الدفعة (السلعة ووحدة القياس نفسهما، والكمية محفوظة) في حسابه هو، لكنه يشترط TRANSFORMER_ROLE لتغيير طبيعة السلع أو كميتها، أو لتسليم المخرجات إلى حساب آخر — فالمطحنة تستطيع تحويل القمح إلى دقيق، أما المزارع فلا يستطيع تحويل القمح إلى ذهب. وتشغّل كلتا عمليتي transform الخطافات بوصفها OP_TRANSFORM، ولذلك فإن المزارع الذي يبيع جزءًا من دفعة يعيد تكوينها أولًا في المكان ثم يحوّلها؛ ويخضع البيع لكل قواعد التحويل.
لا تعبر transform من رمز إلى آخر. فحين يستلم رمز المشتري سلعًا من رمز المورّد، تسمّي الدفعة الجديدة دفعةَ المورّد في بياناتها الوصفية: إذ تعطي قائمة upstream في المخطط 1.2.0 معرّف السلسلة، والعقد، ومعرّف الرمز، وما إذا كانت السلع قد استُلمت منها دون تغيير (received_from) أو عولجت منها (processed_from). والمرجع إلى المنبع ادعاء من جهة الإصدار اللاحقة، لا حقيقة على السلسلة، ولذلك يُطلب من المفهرسات والمدققين وأدوات السحب من السوق أن يتحققوا منه مقابل رمز المنبع، وأن يعرضوا المراجع التي تعذّر عليهم التحقق منها بوصفها غير متحقَّق منها. ويقرأ السحب الأمامي من السوق عبر الرموز هذه القوائم، لأن رمز المنبع لا يحتفظ بأي سجل لها.
الإنفاذ من ERC-7943 دون إعادة اختراعه
تخضع الدفعات الزراعية بصورة معتادة لحقوق امتياز، وسندات وارانت، وحظر، وإجراءات إعسار، وسحب للمنتجات من السوق. والرمز الذي لا يستطيع طرف مخوَّل تجميده أو نقله رغمًا عن إرادة حامله لا يمكنه تمثيل هذه الدفعة أمام مصرف أو محكمة أو جهة تنظيمية. وقد حلّ ERC-3643 هذه المشكلة للأوراق المالية في عام 2021؛ وعمّمها ERC-7943 على أي أصل من العالم الحقيقي وبلغ حالة Final في مايو 2026 مع نسخة ERC-1155. وتتبنّى A-REX تلك الواجهة حرفيًا بدلًا من تعريف واجهة خاصة بها، حتى تتعرف محركات الامتثال الواعية بـ ERC-7943 (Chainlink ACE، وأدوات ERC-3643) على رمز A-REX دون تكييف.
تلائم نسخة الرموز المتعددة ERC-1155 بصورة طبيعية: فالتجميد يكون لكل حساب ولكل معرّف دفعة، والتحويلات القسرية تسمّي الدفعة، والأهلية لكل حساب.
خطاف واحد، مرتّب، مع أكواد
لا يتوسع نظام وحدات مبني على خمس واجهات قدرات، تُفحص كل منها بـ supportsInterface عند كل تحويل؛ فمع ثماني وحدات وخمسة معرّفات في تحويل مجمّع كان ذلك يعني ثمانين استدعاءً ثابتًا قبل أن تعمل أي قاعدة. وكانت حالات الرفض نصوصًا حرة لا يستطيع أي مفهرس تفسيرها ولا أي اختبار مقارنتها بموثوقية.
تعرّف A-REX Core واجهة خطاف واحدة بخريطة بتات ثابتة للأعلام تُخزَّن مؤقتًا عند التسجيل. ويقيّم الرمز الخطافات بترتيب ثابت ويتوقف عند أول كود bytes32 غير صفري، متراجعًا بالخطأ ARexHookRejected(hook, code). والترتيب قابل للتدقيق (getHooks)، والإزالة تحفظه، ويعرف الخطاف الرمز المستدعي من msg.sender، ولذلك يخدم نشر واحد رموزًا كثيرة. وتُدمج الأهلية (canSend/canReceive) في الواجهة نفسها بحيث تكون دوال عرض ERC-7943 في الرمز هي الاقتران المنطقي لخطافاته.
لماذا أكواد وليست أخطاء مخصصة من الخطاف؟ لأن check دالة عرض يجب أن تكون قابلة للتركيب: فالرمز يحتاج إلى أن يسأل كل خطاف ويقارن الإجابات ويعرض أولاها عبر transferCheck دون تراجع. والأكواد رخيصة وقابلة للفهرسة والترجمة ومحددة بفضاءات أسماء (keccak256("AREX:BATCH_EXPIRED")، وkeccak256("MYHOOK:QUOTA")).
إفادات لكل دفعة، وجهات إصدار لكل موضوع
شهادة المنتِج مشكلة هوية لها حلول ناضجة (ONCHAINID، وEthereum Attestation Service، وبيانات الاعتماد القابلة للتحقق، والهوية الإلكترونية الوطنية). أما شهادة الدفعة فهي ما يتحقق منه المشترون والجمارك والجهات التنظيمية، ولم تكن لها صيغة معيارية. ويسجّل IARexAttest القيمة (batch, topic) → (issuer, reference, validity) ويتيح لمسؤول أن يقرر أي جهة إصدار يجوز لها الإفادة في أي موضوع، محاكيًا سجل جهات الإصدار الموثوقة في ERC-3643 دون فرض مزود هوية. والمواضيع قيم bytes32 مفتوحة، ولذلك تتعايش مواضيع ادعاءات ERC-735 ومعرّفات مخططات EAS وتجزئات أسماء الشهادات.
isAttested هي السؤال الوحيد الذي يطرحه الخطاف: وهي false إذا كانت الإفادة غائبة أو مُبطَلة أو منتهية الصلاحية أو فقدت جهة إصدارها الثقة. وهذا يتيح لخطاف أن يفرض "تحتاج دفعات البن إلى مرجع عناية واجبة وفق EUDR قبل أن يجوز بيعها" في ستة أسطر.
تستطيع جهة إصدار الإفادة إبطالها دائمًا، ويجوز ذلك أيضًا لجهة إبطال فوّضتها جهة الإصدار، كما هو الحال في قوائم حالة بيانات الاعتماد لدى W3C وفي جهات إصدار الادعاءات في ERC-3643. وفي المسودة المقترحة مع ADR-019 (مقترح) لا ينبغي أن يستطيع مسؤول الرمز أو مسؤول عقد الإفادات أن يُبطل في 2.x إفادة لم يُصدرها، ويجب ألا يستطيع ذلك بدءًا من الإصدار 3.0؛ والتنفيذ من 2.x الذي يُبقي هذه الصلاحية يوثّقها لجهات الإصدار وللأطراف التي تعتمد على الإفادات. والمشغّل الذي يرى أن شهادة ما خاطئة لا يُبطلها، بل يضع عليها علامة نزاع خارج السلسلة ويُبلغ جهة الإصدار؛ والرمز الذي لم يعد يعتمد على جهة إصدار يزيلها من الموضوع، فتصبح إفاداتها false بالنسبة إلى ذلك الرمز.
ما لا يقوله المعيار
- لا يحدد من يجوز له إنشاء الدفعات أو تغيير الحالة أو الإنفاذ — بل يذكر فقط أن هذه أدوار، لا أرصدة أبدًا.
- لا يحدد معنى الحالات 1..254؛ فجهة الإصدار تنشر جدولًا في البيانات الوصفية.
- لا يحدد كيف تُقيَّم الدفعة، ولا كيف تتدهور، ولا متى يجوز تداولها موسميًا، ولا كيف تُسلَّم أو تُؤمَّن: فهذه كلها خطافات أو عقود مرافقة.
- لا يحدد أي سلسلة، ولا أي مزود هوية، ولا أي أوراكل، ولا أي سجل.
- لا يحدد ما إذا كان الرمز ورقة مالية أو سلعة.
- لا يحدد من يجوز له استخدام قدرة ما، ولا ما إذا كانت مفعّلة، ولا أي القوائم والسلطات تنطبق: من يحمل دور الإنفاذ، ومن يجوز له الإيقاف المؤقت، وأي قوائم العقوبات تُعتمد. ويضع ADR-019 (مقترح) ذلك في ملف سياسات ذي إصدارات لكل ولاية قضائية ولكل مؤسسة، بحيث يصبح تغيّر القانون تحديثًا للملف، لا عقدًا جديدًا ولا إصدارًا جديدًا من المعيار.
الدروس التي شكّلت التصميم
| الدرس | النتيجة في A-REX Core |
|---|---|
| المعيار الذي يضم سجل مزارع ونظام هوية بوصفهما إلزاميين (REQUIRED) ليس معيار رمز، بل منتج | لا شيء خارج الرمز مطلوب |
| التعداد المغلق في توقيع دالة يجعل أي "سجل ديناميكي" للسلع شيفرة ميتة | السلع ووحدات القياس والحالات والمواضيع أكواد مفتوحة |
| السلطة المشتقة من الرصيد ثغرة في رمز متعدد الحاملين | تغييرات الحالة مقيّدة بالأدوار؛ وRETIRED نهائية |
| منطق الأعمال في النواة يناقض "نواة بلا منطق أعمال" | التقييم والتدهور والنوافذ توجد في الخطافات |
| البناء الذي لا يُترجَم من نسخة مستنسخة نظيفة ليس تنفيذًا مرجعيًا | الاعتماديات مثبّتة، وملف القفل مُودَع، والتكامل المستمر يعمل عند كل رفع للتعديلات إلى المستودع |
| تتقادم التواريخ التنظيمية في الورقة البيضاء؛ ويجب ألا تتقادم الشيفرة التي تعتمد عليها | يخزّن الرمز مراجع وتجزئات، ولا يخزّن منطقًا تنظيميًا أبدًا |
التوافق مع الإصدارات السابقة
رموز A-REX Core رموز ERC-1155 وERC-7943 كاملة. وتعمل المحافظ والأسواق والمفهرسات التي تعرف ERC-1155 دون تغيير؛ وتتعرف أدوات الامتثال الواعية بـ ERC-7943 على سطح الإنفاذ. وتتصل محركات القواعد المكتوبة لرموز أخرى عبر مهايئ IARexHook ما دامت قراراتها تعتمد على معاملات الاستدعاء وسجل الدفعة فقط.