cryptofoundry

الاتصال بـ cryptofoundry

أخبرنا بما تريد بناءه أو أتمتته.

البريد الإلكتروني
[email protected]
ADAMANT Messenger
فتح في ADAMANT
مقال

شبكة ADAMANT المحلية وإمكانية تجاوز الإعدادات: تطوير أسرع، اختبار أسهل، وأتمتة أفضل

ADAMANT Messengerمن المسبك ↗
شبكة ADAMANT المحلية وإمكانية تجاوز الإعدادات: تطوير أسرع، اختبار أسهل، وأتمتة أفضل

أصبح تطوير ADAMANT أسهل وأسرع للمشغلين والمساهمين ومطوري التطبيقات. بالإضافة إلى شبكة ADAMANT التجريبية العامة، يمكن للمطورين الآن تشغيل شبكة محلية خفيفة من ADAMANT مباشرة على جهازهم. تم تصميم إعداد شبكة محلية (Localnet) هذا لإجراء تجارب سريعة، وفحوصات تلقائية، واختبار السيناريوهات، وسير عمل التطوير التي لا تتطلب شبكة عامة أو بنية تحتية ثقيلة. وفي الوقت نفسه، يدعم عقدة ADAMANT الآن إمكانية تجاوز الإعدادات بشكل مرن، مما يسمح للمشغلين ونصوص الأتمتة باختبار تغيير إعدادات العقدة عند التشغيل دون الحاجة إلى تعديل ملف config.json أو test/config.json يدويًا.

من الشبكة التجريبية إلى الشبكة المحلية

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

ما هي شبكة ADAMANT المحلية؟

شبكة ADAMANT المحلية هي شبكة متعددة العقد من ADAMANT تُدار محليًا وتعمل على جهاز واحد. بدلاً من الاتصال بعقد الشبكة التجريبية العامة، تبدأ الشبكة المحلية عدة عقد ADAMANT معزولة محليًا. ولكل عقدة من هذه العقد منافذها الخاصة، وحالة التشغيل الخاصة بها، وسجلاتها، وإعداداتها، وبياناتها الوصفية للعملية، وإعدادات قاعدة البيانات.

سير العمل الأساسي بسيط:

npm run start:localnet -- --nodes 3
npm run status:localnet
npm run stop:localnet

عند الحاجة إلى تنظيف كامل، يمكن إزالة قواعد البيانات المحلية المحفوظة باستخدام الأمر npm run drop:localnet أو باستخدام npm run stop:localnet -- --dropOnStop.

تم تصميم الشبكة المحلية خفيفة الوزن بشكل متعمد. فهي لا تتطلب خادمًا عامًا أو خادمًا افتراضيًا خاصًا (VPS) أو مزامنة طويلة من الشبكة. وتُشغَّل محليًا، وتستخدم إعدادات اختبار مُتحكَّم بها، وهي مناسبة لأجهزة التطوير. وهذا يجعلها مفيدة للمساهمين الذين يختبرون تغييرات العقدة قبل إرسالها، وللمديرين الذين يحتاجون إلى فحوصات سريعة للإصدارات، وللمطورين الذين يبنون تطبيقات فوق واجهات برمجة تطبيقات ADAMANT، ولنصوص الأتمتة أو بيئات التشغيل التلقائي (CI).

ما الذي تُنشئه الشبكة المحلية في الخلفية

عند تشغيل الشبكة المحلية، يتم توليد بيانات تشغيل معزولة لكل عقدة، تشمل ملفات إعدادات خاصة بكل عقدة، وحالة التشغيل، وملفات PID، وقائمة بالتكوين (manifest)، وبيانات السلسلة المحلية، ومجلدات سجلات منفصلة لكل عقدة. وتُفصَل السجلات حسب العقدة، على سبيل المثال ضمن logs-localnet/node-1/، logs-localnet/node-2/، وهكذا. وهذا أمر مهم لأن مشكلات الشبكات متعددة العقد تتطلب غالبًا مقارنة السلوك عبر أقران مختلفين — فلا يكفي سجل واحد عند تصحيح مشكلات الانتشار، أو إعادة الاتصال، أو الكتل المفقودة، أو حالات الانقسام الذهني، أو سلوك التعدين، أو توافق broadhash. كما تُنتج أدوات الشبكة المحلية بيانات وصفية يمكن قراءتها بواسطة الآلة، ويمكن لاحقًا استخدامها بواسطة أدوات اختبار السيناريوهات.

يُبلغ نص حالة التشغيل عن معلومات خاصة بكل عقدة مثل حالة واجهة برمجة التطبيقات (API)، وعدد المفوّضين، وآخر وقت تعدين، وnethash، وتوافق broadhash الحي. ويكون توافق broadhash مفيدًا بشكل خاص للتحقق مما إذا كانت العقد المحلية متماثلة فعليًا بعد التشغيل. في اختبار تدخين محلي، تم تشغيل شبكة محلية مكوّنة من 3 عقد، وتم جلب الحالة، ووصل توافق broadhash الحي إلى 100% على جميع العقد، ثم تم إيقاف الشبكة المحلية وإزالتها بشكل منسق.

لا يتم إيقاف الشبكة المحلية ببساطة عن طريق إنهاء العمليات. يستخدم نص stop:localnet مسار الإغلاق المنظم الطبيعي للعقدة، مما يساعد على تجنب مشكلات غير ضرورية في قاعدة البيانات أو حالة التشغيل، ويبقي الاختبار المحلي أقرب إلى السلوك التشغيلي الحقيقي. بشكل افتراضي، تكون قواعد البيانات المحلية من PostgreSQL دائمة. ويعتمد إنشاء قاعدة البيانات التلقائي على أن يكون لدى دور PostgreSQL المحلي صلاحية CREATEDB؛ وإذا لم تكن هذه الصلاحية متوفرة، يمكن للمطورين استخدام إعداد قاعدة بيانات موجود أو استخدام خيارات التجاوز/الإنشاء الموثقة.

تجاوزات الإعدادات: لا مزيد من التعديل اليدوي للإعدادات

في السابق، كان يدعم عقدة ADAMANT اختيار ملف إعدادات باستخدام --config وكان لديه عدة تجاوزات مُعدة مسبقًا في واجهة سطر الأوامر مثل --port و--address و--peers و--log و--snapshot. كان هذا كافيًا للحالات البسيطة، لكنه لم يكن قابلاً للتوسع. غالبًا ما يحتاج المشغلون ونصوص الأتمتة إلى تغيير قيم إعدادات متداخلة — مثل المنافذ، أو إعدادات Redis، أو إعدادات قاعدة البيانات، أو قوائم الأقران، أو خيارات التسجيل، أو إعدادات واجهة برمجة التطبيقات، أو تكوين التعدين، أو ارتفاعات التنشيط، أو المعلمات الخاصة بالاختبار. إن تعديل ملفات الإعدادات المنسوخة يدويًا يُعدّ عرضة للخطأ، وإضافة علم واجهة سطر أوامر لكل مفتاح إعداد لا يمكن توسيعه، واستبدال ملف الإعداد بالكامل يكون غالبًا ثقيلًا جدًا بالنسبة للتغييرات الصغيرة المرتبطة بالبيئة.

يمكن للمطورين الآن تمرير قيم إعدادات فردية مباشرة عند التشغيل باستخدام مفاتيح مسار النقطة (dot-path) التي تطابق هيكل كائن الإعداد الحالي:

node app.js \
  --config test/config.json \
  --genesis test/genesisBlock.json \
  --config-set consensusActivationHeights.fairSystem=4359465 \
  --config-set redis='{ "url": "redis://127.0.0.1:6379/1", "password": null }'

هذا يسمح للنصوص بتجاوز قيمة عددية متداخلة واحدة أو قيمة كائن كامل. وتُحلَّل القيم كقيم متوافقة مع JSON عند الإمكان، لذلك يمكن تمثيل الأرقام، والقيم المنطقية، والقيمة null، والمصفوفات، والكائنات بشكل صحيح بدلاً من معاملتها كسلسلة نصية بسيطة.

تدعم تجاوزات الإعدادات أيضًا الملفات. يمكن أن يحتوي ملف تجاوز بنمط البيئة (env-style) على إدخالات مثل:

consensusActivationHeights.fairSystem=4359465
redis='{ "url": "redis://127.0.0.1:6379/1", "password": null }'

كما يدعم التنفيذ ملفات تجاوز جزئية بصيغة JSON. وهذا مفيد للبيئات المحلية، واختبار الأتمتة، وسير عمل يشبه CI، وللمديرين الذين يريدون مجموعة قابلة للتكرار من التغييرات دون تعديل ملفات الإعدادات التي يتم تتبعها. وتستخدم الشبكة المحلية هذه الآلية بشكل افتراضي من خلال test/config.localnet.json، مع الحفاظ على استقرار الإعداد الأساسي بينما تُطبَّق الاختلافات الخاصة بالشبكة المحلية من خلال نفس تدفق التجاوز المُعتمد.

التحقق والسلامة

لا يزال التكوين النهائي المُقرَّر يتم التحقق منه مقابل مخطط إعدادات ADAMANT الحالي بعد حل القيم الافتراضية، وملفات التجاوز، والتجاوزات المباشرة، والاختصارات القديمة لواجهة سطر الأوامر. ومن المتوقع أن تفشل المسارات غير الصالحة، وأنواع القيم غير الصالحة، وJSON غير الصحيح، والمفاتيح غير الآمنة قبل التشغيل، بدلًا من إنتاج سلوك تشغيلي غير قابل للتنبؤ. وتُحجب القيم الحساسة من سجلات تجاوز الإعدادات، بما في ذلك كلمات المرور، وعبارات المرور، والأسرار، والرموز. وتُوجَّه الاختصارات القديمة للتشغيل من خلال نفس خط أنابيب التجاوز المُعتمد، وتحتفظ بأعلى أولوية تجاوز، بحيث تستمر سير العمل الحالية في العمل بينما تكتسب سير العمل الجديدة آلية تكوين أكثر عمومية واتساقًا.

قد تكون بعض قيم الإعداد حساسة للتوافق. يمكن أن يكون تجاوز مفاتيح مثل consensusActivationHeights.* مفيدًا للسيناريوهات المحلية أو التجريبية، ولكن استخدام ارتفاعات تنشيط غير متوافقة مع الشبكة ضد سلسلة خاطئة قد يؤدي إلى تباعد العقدة عن الشبكة. تُعد تجاوزات الإعدادات مقصودة وظاهرة. وهي مفيدة للشبكة المحلية، والشبكة التجريبية، والأتمتة، وسيناريوهات التشغيل الخاضعة للتحكم، ولكن يجب استخدامها بحذر على عقد الشبكة الرئيسية في بيئة الإنتاج. وتغيّر هذه الميزة فقط آلية حل تكوين التشغيل — ولا تغيّر مباشرة منطق الكتل، أو تسلسل المعاملات، أو منطق المكافآت، أو منطق الرسوم، أو ترتيب المفوّضين، أو فحوصات التوقيع، أو قواعد التوافق.

تعمل الشبكة المحلية والشبكة التجريبية معًا

الشبكة المحلية لا تحل محل الشبكة التجريبية؛ فكل منهما تحل مشكلة مختلفة. تعد الشبكة المحلية الأفضل للتطوير السريع والخاص والقابل للتكرار على جهاز واحد، حيث يحتاج المطورون إلى تحكم كامل، وتشغيل سريع، وتجارب معزولة. بينما تعد الشبكة التجريبية الأفضل للاختبار العام والمشترك على مستوى الشبكة، حيث يحتاج المطورون إلى بيئة مستمرة، وأقران عامة، وعملات ADM تجريبية، وإمكانية الوصول إلى المستكشف، وفحوصات على مستوى التطبيق ضد شبكة مشتركة. معًا، يحصل المساهمون في ADAMANT على خط أنابيب تطوير أقوى: اختبر محليًا باستخدام الشبكة المحلية، وتحقق من خلال الشبكة التجريبية العامة، ثم هيّئ إصدارات أمان للشبكة الرئيسية.

تم فصل إدارة دورة حياة الشبكة المحلية عن تنفيذ اختبار السيناريوهات بشكل متعمد. تكون نصوص الشبكة المحلية مسؤولة عن بدء الشبكة المحلية، وإيقافها، وفحصها، وتنظيفها. ثم يمكن لبرامج تشغيل السيناريوهات استهداف شبكة محلية أو تجريبية متاحة بالفعل وإنتاج التقارير. يحافظ هذا الفصل على وضوح المسؤوليات ويجعل بناء أدوات مستقبلية أسهل.