تشغيل QORel بجانب مدقّق
كثيرًا ما يرحّل المدقّقون قنوات سلسلتهم. يمكن تشغيل QORel على مضيف المدقّق، أو كحاوية جانبية (sidecar)، أو في Kubernetes. تعرض هذه الصفحة التخطيطات الثلاثة والقواعد التي تُبقي المُرحِّل معزولًا عن مفاتيح المدقّق نفسه. وهي موجّهة إلى مشغّلي المدقّقين والعقد. ولتشغيل العقدة نفسها راجع تشغيل مدقّق وتشغيل عقدة.
الترحيل اليوم على شبكة الاختبار فقط: شُغِّل QORel مقابل qorechain-diana، ولا توجد قناة IBC مفتوحة على الشبكة الرئيسية.
الابتكارات
- خدمة مُحصَّنة في الحزمة. تثبّت حزمتا
.debو.rpmالخدمةqorel.serviceالتي تعمل بمستخدمها الخاصqorel، مع umask بقيمة0077، وبلا صلاحيات جديدة، و/tmpخاص، ونظام ملفات للقراءة فقط خارج/var/lib/qorel، وبلا مخلّفات ذاكرة (core dumps). - مفاتيح في الذاكرة فقط، إن أردت. يعيد تخطيط Kubernetes بناء المفاتيح عند بدء الـ pod من secret إلى وحدة تخزين مدعومة بالذاكرة، فلا تلمس ملفات المفاتيح القرص أبدًا.
- ملفات مفاتيح للمالك وحده. ملفات المفاتيح، بما فيها البذرة ما بعد الكمومية، بصلاحيات 0600.
- فحوص يمكنك التنبيه عليها. يبلّغ
qorel keys pqc-statusعنready_to_relay، ويوقف فحص ما قبل الإرسال معاملة سترفض قبل إنفاق أي رسم.
كيفية الاستخدام
القواعد الأساسية
- استخدم حساب مُرحِّل مخصصًا. لا مفتاح مشغّل المدقّق أبدًا ولا مفتاح الإجماع أبدًا. موّله بما يحتاجه المُرحِّل للرسوم.
- عملية مُرحِّل واحدة لكل مفتاح مُرحِّل. عمليتان توقّعان بالمفتاح نفسه تتنازعان على تسلسلات الحساب.
- رحّل قنواتك فقط. اضبط
packet_filter. - وجّه QORel إلى العقدة المحلية. استخدم
http://127.0.0.1:26657وhttp://127.0.0.1:9090وws://127.0.0.1:26657/websocket، وأبقِ تلك المنافذ مغلقة أمام الإنترنت. وهذا يمنح المُرحِّل أيضًا نقطة gRPC غير المتاحة علنًا. - على QoreChain، سجّل مفتاح المُرحِّل ما بعد الكمومي مرة واحدة بالأمر
qorel keys register-pqc، وتحقق منqorel keys pqc-statusقبل البدء.
1. systemd على مضيف المدقّق
-
ثبّت حزمة
.debأو.rpm(التثبيت). فهي تُنشئ مستخدم نظامqorel، منفصلًا عن مستخدم المدقّق، وخدمةqorel.serviceمُحصَّنة. -
حرّر
/etc/qorel/config.tomlبنقاط نهاية العقدة المحلية. -
أضف مفتاح المُرحِّل بصفة المستخدم
qorel، وسجّل المفتاح ما بعد الكمومي:sudo -u qorel qorel --config /etc/qorel/config.toml keys add --chain qorechain-diana --key-name relayer --mnemonic-file <file>sudo -u qorel qorel --config /etc/qorel/config.toml keys register-pqc --chain qorechain-dianasudo -u qorel qorel --config /etc/qorel/config.toml keys pqc-status --chain qorechain-diana -
شغّل
systemctl enable --now qorel. -
امنح QORel أولوية أدنى من العقدة، كي لا ينافسها أبدًا على إنتاج الكتل:
# /etc/systemd/system/qorel.service.d/priority.conf[Service]Nice=10CPUWeight=20MemoryMax=1Gثم
systemctl daemon-reload && systemctl restart qorel.
2. حاوية Docker Compose الجانبية
services:
qorel:
image: ghcr.io/qorechain/qorel:0.1.0
command: ["--config", "/home/nonroot/.hermes/config.toml", "start"]
network_mode: host # reach the node on 127.0.0.1
restart: unless-stopped
volumes:
- ./qorel:/home/nonroot/.hermes # config.toml + keys/ (owner uid 65532, mode 0700)
deploy:
resources:
limits: { cpus: "1.0", memory: 1g }
أضف المفاتيح مرة واحدة بالصورة نفسها، مثلًا:
docker run --rm -v $PWD/qorel:/home/nonroot/.hermes ghcr.io/qorechain/qorel:0.1.0 \
keys add --chain qorechain-diana --key-name relayer --mnemonic-file /home/nonroot/.hermes/relayer.mnemonic
docker run --rm --network host -v $PWD/qorel:/home/nonroot/.hermes ghcr.io/qorechain/qorel:0.1.0 \
keys register-pqc --chain qorechain-diana
احذف ملف العبارة السرية بعد ذلك.
3. Kubernetes
احتفظ بالعبارة السرية في مخزن الأسرار لديك وأعد بناء المفاتيح عند البدء:
- تشغّل حاوية تهيئة (init container) الأمر
qorel keys addداخلemptyDirبقيمةmedium: Memory(سجّل المفتاح ما بعد الكمومي مرة واحدة، يدويًا، قبل ذلك). - تشغّل الحاوية الرئيسية
qorel startعلى وحدة التخزين نفسها.
بهذه الطريقة لا توجد المفاتيح إلا في الذاكرة.
apiVersion: apps/v1
kind: Deployment
metadata: { name: qorel }
spec:
replicas: 1 # never more than one per key
strategy: { type: Recreate }
selector: { matchLabels: { app: qorel } }
template:
metadata: { labels: { app: qorel } }
spec:
securityContext: { runAsNonRoot: true, runAsUser: 65532, fsGroup: 65532 }
volumes:
- name: home
emptyDir: { medium: Memory }
- name: config
configMap: { name: qorel-config }
- name: mnemonic
secret: { secretName: qorel-relayer-mnemonic } # key: mnemonic
initContainers:
- name: keys
image: ghcr.io/qorechain/qorel:0.1.0
args: ["--config", "/config/config.toml", "keys", "add", "--chain", "qorechain-diana",
"--key-name", "relayer", "--mnemonic-file", "/secret/mnemonic", "--overwrite"]
volumeMounts:
- { name: home, mountPath: /home/nonroot/.hermes }
- { name: config, mountPath: /config }
- { name: mnemonic, mountPath: /secret, readOnly: true }
# repeat the init container for each chain in the config
containers:
- name: qorel
image: ghcr.io/qorechain/qorel:0.1.0
args: ["--config", "/config/config.toml", "start"]
ports: [{ containerPort: 3001, name: telemetry }]
resources: { limits: { cpu: "1", memory: 1Gi } }
volumeMounts:
- { name: home, mountPath: /home/nonroot/.hermes }
- { name: config, mountPath: /config }
يجب أن يشير key_store_folder في ملف الإعدادات إلى /home/nonroot/.hermes/keys (أو يُترك دون ضبط).
المراقبة
فعّل القياس عن بُعد ونبّه عند وجود حزم معلّقة، وأرصدة المُرحِّل، وحالة المفتاح ما بعد الكمومي، وحداثة العملاء. القائمة في المراقبة.
كيفية الوصول
- الشبكة. شبكة الاختبار
qorechain-diana. يتصل المُرحِّل بمنافذ عقدتك المحلية وبنقاط نهاية السلسلة الأخرى. - الحسابات. حساب مُرحِّل مخصص على كل سلسلة، ممول للرسوم؛ ولا يكون أبدًا مفتاح مشغّل المدقّق.
- المضيف. Linux مع systemd للتخطيط 1؛ وDocker مع شبكة المضيف للتخطيط 2؛ وعنقود مع
emptyDirمدعوم بالذاكرة للتخطيط 3. - التكلفة. الرسوم فقط. تحدّ الأمثلة أعلاه المُرحِّل بمعالج واحد و1 GiB من الذاكرة.
أين يُنشر
الحزم وصورة الحاوية والمصدر مدرجة في التثبيت. وملف الإعدادات النموذجي هو packaging/config.example.toml في qorechain/QORel.
الحدود والمشكلات المعروفة
- ليس من واجبات المدقّق. الترحيل اختياري ومنفصل عن التدقيق؛ وتوقف المُرحِّل لا يؤثر في الإجماع.
- عملية واحدة لكل مفتاح. التحديثات المتدرجة التي تبدأ pod ثانيًا بالمفتاح نفسه تكسر تسلسل الحساب؛ ولذلك يستخدم المثال
Recreate. - التسجيل اليدوي.
keys register-pqcخطوة يدوية تُجرى مرة واحدة؛ وحاوية التهيئة في Kubernetes تعيد بناء المفاتيح فقط. - شبكة الاختبار فقط. لا توجد قناة في الشبكة الرئيسية لترحيلها بعد.