الورقة البيضاء · 04
نظرة عامة على الحل
بنية A-REX Core: ثلاثة مستويات باتجاه اعتماد واحد، ومسار التحويل، والجهات الفاعلة، وكيفية نشر المكونات.
ثلاثة مستويات، واتجاه اعتماد واحد
تفصل A-REX بين ما يجب توحيده وما يجب فحسب أن يعمل:
الطبقات الأربع للمعيار
flowchart TB
L3["الطبقة 3 · IARexAttest<br/>attest · revokeAttestation · isAttested · جهات إصدار موثوقة لكل موضوع"]
L2["الطبقة 2 · IARexHook + IARexHookManager<br/>hookFlags · check → bytes32 · onExecuted · getHooks"]
L1["الطبقة 1 · IARexBatch<br/>createBatch · batchOf · setBatchStatus · setBatchMetadata · transform · parentsOf"]
L0["الطبقة 0 · ERC-1155 + ERC-165 + IERC7943MultiToken<br/>freeze · forcedTransfer · canSend · canReceive · canTransfer"]
L3 --- L2 --- L1 --- L0
classDef l3 fill:#edf5ff,stroke:#0f62fe,color:#161616
classDef l2 fill:#d0e2ff,stroke:#0f62fe,color:#161616
classDef l1 fill:#a6c8ff,stroke:#0f62fe,color:#161616
classDef l0 fill:#78a9ff,stroke:#0043ce,color:#161616
class L3 l3
class L2 l2
class L1 l1
class L0 l0مستويا المستودع واتجاه الاعتماد
flowchart LR
STD["<b>المعيار</b><br/>standard/ · contracts/standard/<br/>معياري · CC0"]
REF["<b>التنفيذ المرجعي</b><br/>ARexToken · ARexAttestations<br/>MIT"]
DEMO["<b>العروض التوضيحية</b><br/>7 خطافات · 3 امتدادات<br/>MIT · غير معياري"]
STD -->|يُنفَّذ بواسطة| REF -->|يُوضَّح بواسطة| DEMO
DEMO -.->|تعتمد على الواجهات فقط| STDلا يعتمد المعيار أبدًا على المرجع؛ ولا يعتمد الرمز أبدًا على الخطافات. أزل كل خطاف وكل امتداد، وسيبقى رمز مطابق قائمًا. وهذه هي الخاصية التي تتيح لطرف ثالث تنفيذ A-REX دون تبنّي أي شيء من هذا المستودع باستثناء ستة ملفات واجهات.
ما هي الدفعة
الدفعة هي معرّف رمز ERC-1155 له سجل:
struct Batch {
address issuer; // who created it (or performed the transformation)
uint64 createdAt;
uint8 status; // 0 ACTIVE · 255 RETIRED (terminal) · 1..254 issuer-defined
bytes32 commodity; // keccak256("HS:100199"), keccak256("FAO:0111"), keccak256("GTIN:0779…")
bytes32 unit; // UN/CEFACT Rec. 20: "KGM", "TNE", "LTR", "BX"
uint64 producedAt; // 0 = not yet produced (pre-harvest)
uint64 expiresAt; // 0 = none
bytes32 originRef; // hash / reference to origin evidence — never coordinates
bytes32 metadataHash; // keccak256 of the off-chain document
string uri; // where the document is
}
كل ما هو أغنى — الدرجة، والرطوبة، والبروتين، والتعبئة، ومعرّفات GS1، وكود دفعة التتبع، ومرجع إقرار EUDR، والتقارير المختبرية، وجدول حالات جهة الإصدار — يوجد في مستند البيانات الوصفية الذي تُلتزَم تجزئته على السلسلة. ويتبع المستند مخطط JSON Schema منشورًا متوائمًا مع EPCIS 2.0 ومع عناصر البيانات الرئيسية في FSMA 204.
مسار التحويل
يمرّ كل تغيير في الأرصدة — السك، والتحويل، والحرق، والتحويل القسري، والتحويل التصنيعي — عبر نقطة مرور واحدة في الرمز المرجعي. والترتيب ثابت وقابل للتدقيق:
flowchart TD
A[safeTransferFrom / createBatch / burn / forcedTransfer / transform] --> B["قفل إعادة الدخول"]
B --> C{"هل الحالة موقوفة مؤقتًا؟"}
C -- نعم، وليس تحويلًا قسريًا --> X1[EnforcedPause]
C -- لا --> D{"canSend للمُرسِل / canReceive للمستلم<br/>الاقتران المنطقي لخطافات ELIGIBILITY"}
D -- false --> X2[ERC7943CannotSend / CannotReceive]
D -- true --> E{"لكل معرّف: هل موجود؟ هل لم يُسحب من التداول؟<br/>هل الكمية ≤ الرصيد − المجمَّد؟"}
E -- فشل --> X3[ARexBatchNotFound / ARexBatchRetired /<br/>ERC7943InsufficientUnfrozenBalance]
E -- سليم --> F{"لكل معرّف، ولكل خطاف CHECK بالترتيب:<br/>check → الكود"}
F -- الكود ≠ 0 --> X4["ARexHookRejected(hook, code)"]
F -- كلها 0 --> G["تحديث الأرصدة · تتبّع إجمالي المعروض"]
G --> H["لكل معرّف، ولكل خطاف EXECUTED: onExecuted"]
H --> I["فتح القفل"]تعيد دالتا عرض تشغيل المنطق نفسه دون تغيير الحالة: canTransfer (قيمة منطقية، كما يتطلب ERC-7943) وtransferCheck (أول كود رفض، لتتمكن واجهة المستخدم من إخبار المستخدم بالسبب).
تتجاوز التحويلات القسرية الإيقاف المؤقت وفحوص الأهلية — فالإنفاذ يجب أن يعمل حين يكون كل شيء آخر مجمّدًا — لكنها تشغّل الخطافات مع OP_FORCED_TRANSFER، ولذلك يمكن لخطاف أن يشترط مثلًا مرجع أمر قضائي في بيانات التحويل.
النسب
transform هي العملية الوحيدة للتقسيم والدمج والمعالجة:
graph LR
W1["قمح #1<br/>250 طن · مزارع"] -- "transform (إعادة تكوين الدفعة)" --> W2["قمح #2<br/>100 طن · المشتري A"]
W1 -- "transform (إعادة تكوين الدفعة)" --> W3["قمح #3<br/>150 طن · المشتري B"]
W2 -- "transform (معالجة، TRANSFORMER_ROLE)" --> F4["دقيق #4<br/>75 طن · مطحنة"]- إعادة تكوين الدفعة (السلعة نفسها، ووحدة القياس نفسها، والكمية محفوظة) متاحة لأي حامل أو مشغّل معتمد: كتعاونية تقسّم دفعة صومعة بين أعضائها، أو مُصدِّر يدمج عمليات تسليم.
- تتطلب المعالجة (أي شيء آخر) فضلًا عن ذلك
TRANSFORMER_ROLE. parentsOf(4) == [2]، وparentsOf(2) == [1]؛ وحدثBatchTransformedواحد لكل عملية، وهوTransformationEventفي EPCIS بحكم التصميم.
الإنفاذ
يستطيع ENFORCER_ROLE تجميد أي مقدار لأي حساب (setFrozenTokens، ويجوز أن يتجاوز الرصيد، كما يحدد ERC-7943) ونقل الرموز دون موافقة الحامل (forcedTransfer). وهذا ما يجعل رمز الدفعة قابلًا للاستخدام خارج العروض التوضيحية: مُقرِض ينفّذ على سند وارانت، أو محكمة تأمر بحجز حبوب مخزّنة، أو مستودع يستعيد دفعة بعد أن يفقد عميل مفاتيحه. وكل إجراء إنفاذ هو حدث.
الخطافات
الخطاف عقد له خمس دوال وخريطة بتات ثابتة للأعلام. ويخزّن الرمز الأعلام مؤقتًا عند التسجيل، فتكلّف عملية التحويل استدعاءً خارجيًا واحدًا لكل خطاف معنيّ، لا فحص واجهة واحدًا لكل قدرة في كل وحدة. ويعرف الخطاف الرمز المستدعي من msg.sender؛ ويمكن لنشر واحد أن يخدم رموزًا كثيرة.
تُوضّح الخطافات المرجعية القدرات الثلاث:
| الخطاف | القدرة | ما يثبته |
|---|---|---|
EligibilityHook | CHECK + ELIGIBILITY | قوائم السماح والحظر والعقوبات تغذّي canSend / canReceive وتنتج أكواد دقيقة |
ExpiryHook | CHECK | تقييد قابلية التلف وما قبل الحصاد مشتق بالكامل من سجل الدفعة |
AttestationHook | CHECK | "يحتاج البن إلى إقرار EUDR مثبَت بإفادة قبل أن يجوز بيعه" |
PerishabilityHook | CHECK | نماذج التدهور ودوال عرض القيمة؛ والدفعات المنتهية الصلاحية أو عديمة القيمة لا تنتقل |
SeasonalHook | CHECK | نوافذ الحصاد والتداول لكل سلعة |
DeliveryHook | CHECK + EXECUTED | قفل الحيازة أثناء التسليم؛ والتسوية هي التحويل نفسه، ويُحدَّد بواسطة data |
TraceabilityHook | EXECUTED | سجل أحداث بصيغة EPCIS لكل عملية، إضافةً إلى أحداث التتبع الحرجة اليدوية |
الامتدادات المرافقة (وليست خطافات): CommodityPriceOracle، وCarbonImmobilizationWrapper، وParametricInsurance.
الإفادات
يسجّل عقد مرافق (batch, topic) → (issuer, reference, validity). ولا يستطيع إصدار الإفادة إلا جهات الإصدار الموثوقة لموضوع ما؛ ويؤدي الإبطال وانتهاء الصلاحية وفقدان الثقة جميعًا إلى أن تُرجع isAttested القيمة false. والمواضيع من نوع bytes32، ولذلك تعمل مواضيع ادعاءات ERC-735 ومعرّفات مخططات Ethereum Attestation Service وتجزئات أسماء الشهادات جميعها دون جدول في المعيار.
الجهات الفاعلة والأدوار
| الفاعل | الدور المعتاد في الرمز المرجعي | الإجراء المعتاد |
|---|---|---|
| المنصة المُنشِئة، أو التعاونية، أو صومعة الحبوب | ISSUER_ROLE | createBatch |
| المزارع / الحامل | لا شيء | التحويل، وإعادة تكوين الدفعة، والحرق |
| المطحنة، أو شركة التعبئة، أو المعالِج | TRANSFORMER_ROLE | transform للمعالجة |
| المستودع، أو المفتش، أو المنصة | STATUS_ROLE | setBatchStatus، setBatchMetadata |
| جهة منح الشهادات، أو المختبر، أو السلطة | جهة إصدار موثوقة لموضوع ما | attest |
| المُقرِض، أو الحارس المعيَّن بقرار قضائي، أو الامتثال | ENFORCER_ROLE | setFrozenTokens، forcedTransfer |
| الحوكمة (توقيع متعدد، وتأخير زمني) | DEFAULT_ADMIN_ROLE، HOOK_ADMIN_ROLE، UPGRADER_ROLE، PAUSER_ROLE | الأدوار، والخطافات، والترقيات، والإيقاف المؤقت |
لا شيء في المعيار يثبّت هذه الأدوار؛ فهي الطريقة التي يمارس بها التنفيذ المرجعي بنود MUST ("مقيَّد بدور مخوَّل").
أشكال النشر
- L2 عامة (Polygon وArbitrum وBase وOptimism): الأرخص والأكثر قابلية للتركيب؛ مناسبة لتداول السلع وتمويلها حيث تكون الأطراف المقابلة منشآت أعمال.
- سلسلة EVM مقيّدة بتصاريح: حيث تشترطها سلطات حماية البيانات أو المؤسسة المحورية؛ ويشجّع EDPB صراحةً التصاميم المقيّدة بتصاريح. والمعيار محايد تجاه السلاسل.
- هجينة: الدفعات على سلسلة عامة، والبيانات المقيّدة (مضلّعات قطع الأراضي، وهوية المنتِج) خلف تخزين خاضع للتحكم في الوصول يُشار إليه من البيانات الوصفية.
تُنشر الحزمة المرجعية بوحدة Ignition واحدة أو بسكربت واحد: وكيل الرمز، وسجل الإفادات، وخطافا الأهلية وانتهاء الصلاحية.
قرارات التصميم والبدائل التي تحل محلها
| البديل الذي جرى النظر فيه | A-REX Core | السبب |
|---|---|---|
| واجهة نواة واسعة بتعدادات للسلعة والدرجة والحالة | IARexBatch من 8 دوال مع أكواد مفتوحة | لا شيء يُعاد نشره لمحصول أو نظام أو دورة حياة جديدة |
| واجهات قدرات تُفحص عند كل تحويل | واجهة خطاف واحدة، مع تخزين الأعلام مؤقتًا | الغاز خطي في عدد الخطافات، لا في المعرّفات × الوحدات × الفحوص |
| أسباب نصية | أكواد bytes32 وأخطاء محددة الأنواع | مقروءة آليًا وقابلة للفهرسة |
| حالة دورة حياة يستطيع أي حامل تغييرها | الدور فقط؛ وRETIRED نهائية | الأمان |
| اشتراط أن يكون تاريخ الحصاد في الماضي | السماح بـ producedAt == 0 | تمويل ما قبل الحصاد |
| عدم وجود تقسيم / دمج / معالجة | transform + parentsOf | التتبع، وسحب المنتجات، وEPCIS |
| عدم وجود تجميد أو تحويل قسري | ERC-7943 | قابلية الإنفاذ |
| تخزين الإحداثيات على السلسلة | مرجع المنشأ فقط | GDPR / EDPB 02/2025 |
| اشتراط عقدَي السجل والهوية | لا يُشترط شيء | لا حزمة هوية مفروضة |