عقد ADAMANT IPFS الإصدار 0.1.0: تخزين محدود، دورة حياة مدركة لجمع البيانات المهملة، ونسخ متماثل حتمي
يقدم ADAMANT IPFS الإصدار 0.1.0 دورة حياة تخزين موجهة للإنتاج تحد من نمو القرص، وتنظف عمليات الرفع الفاشلة، وتميز المحتوى الدائم عن ذاكرة التخزين المؤقت القابلة للاسترداد، وتضع النسخ المتماثلة بشكل حتمي عبر مجموعة عقد ADAMANT، وتصلح النسخ المفقودة، وتحافظ على كل CID موجود مسبقاً أثناء الترقية.
لماذا كان هذا ضرورياً
كان التنفيذ السابق يقوم ببث الكتل إلى مخزن الكتل قبل معرفة جميع حدود الطلب. يمكن أن يؤدي الرفع المتقطع أو المرفوض إلى ترك كتل خلفه، بينما تظل عمليات الرفع الناجحة مثبتة دون سياسة انتهاء صلاحية، ولم تكن هناك عملية نصاب قانوني صريحة للنسخ المتماثل أو عملية إصلاح. جعل هذا من المستحيل الإجابة بشكل موثوق على مقدار مساحة القرص التي يمكن أن يستهلكها الرفع، وما هي الملفات الدائمة أو القابلة للاسترداد، وماذا يحدث إذا انقطع الطلب في منتصف الاستيراد، وأي العقد مسؤولة عن CID معين، وما إذا كان بإمكان العقدة استعادة المساحة دون حذف المحتوى المؤكد، وما إذا كانت الملفات الموجودة تظل متاحة بعد ترقية المجموعة.
القبول يحدث قبل التخزين
يتم رفض عمليات الرفع قبل أن تتمكن من استهلاك مساحة قرص غير محدودة. يتم تقييد عمليات الرفع المتزامنة بواسطة storage.maxConcurrentUploads (الاستجابة 429). يتم تحديد حجم الطلب الإجمالي بواسطة storage.maxRequestSizeBytes (413)، والذي يتم فرضه مقابل كل من Content-Length والبايتات التي تم بثها فعلياً لأن الطلبات المجزأة لا تعلن عن حجمها النهائي. يعيد احتياطي القرص الذي يتم فرضه بواسطة storage.diskReserveBytes الخطأ 507 عندما تكون المساحة الحرة غير كافية. يتم تقييد الملفات لكل طلب بواسطة maxFileCount (400)، وحجم الملف الفردي بواسطة uploadLimitSizeBytes (400). تحجز الطلبات المتزامنة القرص ذرياً، بحيث لا يمكن لعدة عمليات رفع استهلاك نفس المساحة الحرة المتاحة.
يمتلك كل طلب جلسة رفع تتعقب الكتل التي أنشأها. يؤدي رفض المحلل، أو فشل الاستيراد، أو خطأ المسار، أو فشل النصاب الصارم، أو انقطاع اتصال العميل إلى إزالة تلك الكتل الجديدة فقط. يتم الحفاظ على الكتل الموجودة مسبقاً، والكتل التي احتفظت بها عملية رفع متزامنة أخرى، والكتل المثبتة.
دورة حياة ملف صريحة
يسجل سجل مدعوم بمخزن بيانات تحت /adm/files دورة حياة ومحاسبة تخزين كل CID معروف. تمثل حالة temporary عملية رفع تنتظر التأكيد أو التسوية. تمثل confirmed محتوى دائماً محمياً بالسياسة. تمثل expired محتوى تم تحريره وقد يتم استرداده تحت الضغط. يتم تتبع pinned و heldLocally بشكل منفصل عن الحالة المنطقية.
يتم تنسيق انتقالات دورة الحياة، وعمليات التثبيت، وكتابات السجل، وتنظيف الرفع، وتسوية النسخ المتماثلة، والإصلاح، وجمع البيانات المهملة باستخدام أقفال لكل CID وعقد إيجار لجمع البيانات على مستوى التخزين. يعمل تعويض الفشل على استعادة كل من التثبيت وسجل البيانات إلى خط الأساس المرصود بدلاً من تركها في حالات متناقضة.
يحافظ الإعداد الافتراضي storage.confirmationRequired: false على عقد API الحالي حيث تصبح عمليات الرفع دائمة على الفور. تتلقى عمليات النشر التي تفعّل التأكيد مدة صلاحية (TTL) قابلة للتكوين لعمليات الرفع المهجورة ويجب عليها استدعاء نقطة نهاية التأكيد الموثقة.
جمع البيانات المهملة القائم على الضغط والمدرك لدورة الحياة
يعد تحرير التثبيت وحذف الكتل قرارين منفصلين عمداً. يظل الملف المحرر في مخزن الكتل ويمكنه الاستمرار في خدمة عمليات القراءة مجاناً. يتم حذف الكتل فقط عندما يتجاوز مخزن الكتل الحد الأعلى المكون أو ينخفض نظام الملفات إلى احتياطي القرص. هذا يتجنب التخلص من ذاكرة التخزين المؤقت المفيدة فقط لجلبها مرة أخرى لاحقاً.
يتمتع جامع البيانات بعدة خصائص أمان. لا يتم اختيار المحتوى المؤكد الذي تحتفظ به هذه العقدة للإخلاء أبداً. يتم إصلاح الحماية المفقودة على ملف مؤكد قبل بدء أي حذف. يتم إجهاض التشغيل الذي لا يمكنه التحقق من المحتوى الدائم قبل اتخاذ إجراء تدميري. تحتفظ إخفاقات جمع البيانات المهملة الجزئية بسجلات السجل حتى تتمكن التمريرة التالية من إعادة المحاولة بأمان. يبلغ وضع التشغيل التجريبي (Dry-run) عن خطة التحرير والاحتفاظ الدقيقة دون تغيير التثبيتات أو الكتل. عمليات المسح المجدولة محدودة وتتقدم بدلاً من مسح السجل بالكامل بشكل متكرر.
الإعدادات الافتراضية الموثقة هي حد أعلى 50 جيجابايت، وحد أدنى 40 جيجابايت، واحتياطي مساحة حرة 5 جيجابايت، وتمريرة مجدولة كل 15 دقيقة. جميع القيم قابلة للتكوين. يتم تمكين جمع البيانات المهملة المجدول افتراضياً ولكنه لا يقوم بأي حذف طالما ظلت المساحة أعلى من عتبات الأمان. يمكن للمشغلين فحص الخطة باستخدام:
bash
curl —fail-with-body
-X POST
-H “x-api-key: $ADMIN_API_KEY”
“https://ipfs.example.org/api/storage/gc?dryRun=true”
النسخ المتماثل عبر شبكة libp2p الحالية
يعمل النسخ المتماثل عبر /adamant/replication/1.0.0، وليس عبر خدمة HTTP إضافية. يثبت مصافحة libp2p هوية النظير البعيد، لذا لا يحتاج النسخ المتماثل إلى سر API مشترك، أو منفذ عام ثانٍ، أو برنامج خفي منفصل للمجموعة. يتم قبول العمليات التي تجعل هذه العقدة مسؤولة عن المحتوى فقط من النظراء المدرجين في nodes. رسائل التحكم مؤطرة بالطول ومحدودة. تسجل معاملات النسخ المتماثل نظيرها الأصلي، ولا يمكن إلا لهذا النظير تسويتها.
يتم اختيار الحاملين باستخدام تجزئة rendezvous عبر CID. تقوم كل عقدة لديها نفس قائمة العضوية بحساب نفس مجموعة الحاملين بشكل مستقل دون منسق مركزي. تحتفظ سياسة التنسيب الافتراضية بأربع نسخ للمحتوى الجديد، وثلاث نسخ بعد 180 يوماً، ونسختين بعد عام واحد. يتم تحديد العدد بحجم الشبكة الفعلي، لذا فإن شبكة مكونة من ثلاث عقد طُلب منها أربع نسخ تضع نسخة واحدة على كل عقدة متاحة. يتقلص التنسيب حسب عمر الملف بدلاً من وقت الوصول الأخير، لأن تتبع عمليات القراءة سيخلق بيانات وصفية حول متى يسترجع المستخدمون الملفات.
متانة الرفع الصارمة اختيارية. عند تمكين replication.requireQuorumOnUpload، يشكل القبول المحلي والنسخ المتماثلة البعيدة معاملة واحدة قابلة للتراجع: يقوم النظراء بتجهيز النسخ، ويتحقق الأصل من نصاب الإقرار المكون، ثم يلتزم أو يجهض كل نسخة مجهزة. يتطلب التكوين الصارم ackQuorum >= 2، مما يضمن أن النجاح يثبت وجود نسخة بعيدة واحدة على الأقل.
الإصلاح، التسليم، والاسترجاع
يسأل عمل الإصلاح نظيراً عما إذا كان لديه بالفعل CID وما إذا كان لديه مساحة قبل نقل البيانات. يتم تحديد المدخول من خلال التزامن، وحجم الطلب، وحجز القرص، والمهلة، والميزانية لكل نظير. تقوم عقدة خارج مجموعة الحاملين الحالية بتسليم نسختها الدائمة إلى الحاملين المعينين وتحرر تثبيتها فقط بعد أن يؤكد هؤلاء الحاملون أن لديهم الملف. إذا اختفى كل حامل بعيد لاحقاً بينما لا تزال الكتل محلية، تتولى العقدة المسؤولية مرة أخرى بدلاً من السماح باختفاء آخر نسخة قابلة للاسترداد.
تستخدم عمليات القراءة أيضاً معلومات التنسيب. قبل تقديم CID، تتصل العقدة مباشرة بالنظراء المتوقع أن يحملوه بدلاً من الاعتماد على نظير Bitswap مفيد متصل بالفعل. يحافظ التناظر الدوري على الشبكة المكونة متاحة بعد بدء التشغيل. هذا مهم لـ ADAMANT Messenger: يستخدم المرسل والمستقبل عادةً عقد بنية تحتية مختلفة، لذا فإن القراءة الأولى للمستقبل غالباً ما تهبط على عقدة ليست حاملاً معيناً.
الحفاظ على الملفات و CIDs الموجودة
لا تقوم الترقية بإعادة استيراد أو إعادة كتابة أو إعادة تسمية المحتوى المخزن. يظل توليد CID متوافقاً مع الحزمة السابقة، لذا تستمر روابط الرسائل الموجودة في توجيه نفس الملفات. عند بدء التشغيل، يتم ملء التثبيتات التي تسبق سجل دورة الحياة كسجلات مؤكدة. يتم قياس أحجام DAG الخاصة بها دون اتصال، ويتم الإبلاغ عن المحتوى غير المكتمل بدلاً من تسجيله بصمت كدائم. يمكن أن تبدأ API بينما يستمر الملء في الخلفية.
أحد الآثار المترتبة على السعة مهم: لا يمكن استعادة وقت الرفع الأصلي للتثبيت القديم، لذا يتم التعامل مع الملفات المملوءة في البداية على أنها جديدة وتدخل في أوسع فئة تنسيب. يجب على المشغلين التخطيط لسعة المجموعة للمجموعة الموجودة، وليس فقط لعمليات الرفع المستقبلية. تعالج عمليات الإصلاح هذه المجموعة في دفعات متقدمة محدودة بدلاً من محاولة نسخ كل شيء في تمريرة واحدة.
يتم تقديم /adamant/replication/1.0.0 فقط حالياً، لذا فإن هذا الإصدار مخصص لترقية منسقة على مستوى المجموعة. يكشف GET /api/storage/metrics عن إصدار البروتوكول النشط، مما يجعل النشر المختلط مرئياً.
الرؤية التشغيلية وحدود الوصول
تكشف مسارات القراءة فقط العامة عن السعة وحالة دورة الحياة بدون أسماء ملفات، أو مخزونات CID، أو طوبولوجيا النظراء: GET /api/file/:cid/status، و GET /api/storage/metrics، و GET /api/storage/policy. تتطلب الطفرات الإدارية مثل التأكيد، والتحرير، وجمع البيانات المهملة عند الطلب، والإصلاح، وإدارة التثبيت، وعمليات طوبولوجيا libp2p مفتاح x-api-key المكون.
يتضمن تقرير التخزين البايتات المثبتة والقابلة للاسترداد، وتوافر نظام الملفات، والسعة المحجوزة والقابلة للاستخدام، وعدد دورة الحياة، ومعاملات النسخ المتماثل المرحلية، وحالة الوظيفة، وصحة النسخ المتماثل. إنه يوفر معلومات كافية للتحقق من الترقية ومراقبة تمريرات الجمع والإصلاح اللاحقة دون كشف تفاصيل تشغيلية خاصة.
الإعدادات الافتراضية التي يجب على المشغلين مراجعتها
تناسب الإعدادات الافتراضية وحدة تخزين مخصصة وتحافظ على سلوك الرفع الفوري الحالي. يبلغ حجم الرفع الإجمالي افتراضياً 512 ميجابايت، وعمليات الرفع المتزامنة 32، واحتياطي القرص 5 جيجابايت، و TTL المؤقت 24 ساعة، وجدول جمع البيانات المهملة كل 15 دقيقة، وجدول الإصلاح كل 30 دقيقة، والتنسيب الجديد 4 نسخ. يبلغ نصاب إقرار الرفع افتراضياً 1 (نسخ متماثل بأفضل جهد)، ويتم تعطيل نصاب الرفع الصارم. يجب على كل مشغل مراجعة السعة، والعلامات المائية، وقوائم العضوية، وفئات التنسيب قبل النشر.
التحقق
اجتاز التنفيذ المدمج 232 اختبار وحدة، و102 اختبار تكامل، وبناء TypeScript للإنتاج، وفحوصات ESLint و Prettier، وتدقيق تبعية الإنتاج، وفحوصات Semgrep SAST و Semgrep OSS. تم اختباره أيضاً على شبكة من أربع عقد: تم وضع ستة عشر ملفاً على ثلاثة حاملين أثناء كونهم جدداً، وتقاربوا إلى حاملين اثنين بالضبط بعد التقدم في السن في الفئة التالية، ثم تمت قراءتهم بايت مطابق من جميع العقد الأربع عبر 64 عملية قراءة ناجحة عبر العقد. لم يتم تقديم أي تبعية وقت تشغيل جديدة.
العمل اللاحق المتعمد
يؤسس هذا الإصدار تخزيناً محدوداً ومتانة من عقدة إلى عقدة ولكنه لا يدعي حل كل مشكلة ملكية أو عضوية شبكة. يتتبع الإصدار #27 الحذف المصرح به بواسطة توقيع الرافع الأصلي. يتتبع الإصدار #28 اكتشاف العقد اللامركزي ومقاومة Sybil. يتتبع الإصدار #29 محاسبة حركة المرور، والتراجع، والحدود الشهرية. يظل تشفير المحتوى مسؤولية بروتوكول عميل ADAMANT؛ تدير عقدة التخزين المحتوى المشفر بواسطة CID ولا تحتاج إلى وصول بالنص العادي.