# تنسيق الأدلة

Canonical page: https://phishdestroy.github.io/TgWitness/ar/docs/reference/evidence/

محتويات ملف ZIP الموقّع، وأنواع السجلات، وإيصالات المعالجة، وملفات تعريف الأشخاص، والنسخ خارج الموقع، والتحقق دون اتصال بالإنترنت.

الملاحظة ليست استنتاجًا. معرّف المرسل ليس هوية في العالم الواقعي. تحديث الخدمة المرئي للحساب هو المصدر؛ ولا تقوم Telegram بالتوقيع تشفيرياً على هذه السجلات المحفوظة لصالح محقق تابع لجهة خارجية.

## ما هو «الموقع»؟

| المواد | الحماية | ما يجب الاحتفاظ به |
| --- | --- | --- |
| كل ملاحظة في السجل، بما في ذلك الأحداث التشغيلية | سلسلة SHA-256 وتوقيع Ed25519 لكل حدث | `events.jsonl` الأصلي، بصمة المفتاح الموثوق بها، ونقطة تفتيش محفوظة |
| محتويات ملف ZIP الخاص بالأدلة | يقوم `manifest.sig` بتوقيع البيان القياسي، الذي يسرد التجزئات (هاشات) لملفات المحتوى | ملف ZIP الكامل، بما في ذلك قائمة المحتويات والتوقيع |
| المرفقات المحفوظة | SHA-256 وعدد البايتات في حدث `media.saved` موقّع؛ تجزئة الملف في قائمة محتويات ملف ZIP الموقّعة | البايتات الأصلية الموجودة داخل ملف ZIP الذي تم التحقق منه |
| Checkpoint | توقيع Ed25519 على طول السجل، وتجزئة الرأس، والمفتاح العام، ووقت الإنشاء | نسخة مستقلة يتم الاحتفاظ بها قبل إجراء أي تغيير مثير للجدل |
| إيصال التشغيل | قياسات مجمعة موقعة بشكل منفصل؛ مدرجة أيضًا في حدث `process.started` موقّع | الإيصال والسجل المرتبط به؛ القياسات مبنية على الإبلاغ الذاتي |
| ملف CSV أو HTML مستقل | لا توجد توقيعات تشفيرية مستقلة؛ فالتجزئات الخاصة بالأحداث وحدها غير كافية | استخدم النص المطابق الموجود داخل ملف ZIP الذي تم التحقق من صحته للتأكد من سلامة البيانات |
| لقطات شاشة، أو مطبوعات، أو ملفات PDF تم إنشاؤها بواسطة متصفح | لا يوجد توقيع TgWitness على النسخة المشتقة | احتفظ بالحزمة الأصلية التي تم التحقق منها ووثق كيفية إنشاء النسخة المشتقة منها |

يقوم المجمع بالتحقق من توقيعات السجل قبل إنشاء كل تنسيق تصدير. لا ينتج عن عملية التحقق من المصدر هذه توقيع على ملف CSV أو HTML تم تنزيله بشكل منفصل. وبالمثل، فإن توقيع حدث JSONL صالح لا يوفر بايتات المرفق ولا يثبت بشكل مستقل أن السجل المرصود بالكامل قد تم توفيره.

## تسليم التحقيق

1. سجل رقم القضية، والمشغل، والمعرّف الرقمي لحساب Telegram، والمصادر المحددة، وسياسة التجميع، وفترة التجميع في ملاحظات القضية الخاصة بك. يحفظ TgWitness الملاحظات؛ بينما تُدار سجلات تخصيص القضايا وحفظها خارج التطبيق. قم بتحديد إعدادات التجميع المقصودة من خلال [إجراء القبول المباشر](https://github.com/phishdestroy/TgWitness/blob/main/docs/internal/LIVE_ACCEPTANCE.md).
2. احتفظ ببصمة المفتاح العام لمساحة العمل بشكل مستقل قبل الاعتماد على عمليات التصدير الخاصة بها. احفظ نقاط التحقق الموقعة خارج أداة التجميع أثناء عملية التجميع. سجل حالات الانقطاع وحدود رؤية الحساب.
3. قم بتصدير ملف **ZIP موقّع** واحتفظ بإيصال التشغيل الموقّع. استخدم نقطة تفتيش عند أو قبل حدود السجل المُصدَّر. قد تؤدي نقطة تفتيش لاحقة إلى رفض التصدير السابق بشكل صحيح باعتباره قصيرًا جدًّا. تتضمن عمليات التصدير سجل مساحة العمل بالكامل، بغض النظر عن مرشحات اللوحة؛ راجع المواد قبل مشاركتها.
4. اطلب من المستلم التحقق من ملف ZIP باستخدام نسخة موثوقة من أداة التحقق و البصمة/نقطة التحقق المقدمة بشكل مستقل. من بيئة تشغيل موثوقة مع تشغيل بيئة Python الخاصة بها:

   ```
   python -m tgwitness.verify evidence.zip --fingerprint TRUSTED_PUBLIC_KEY_SHA256 --checkpoint retained-checkpoint.json
   ```

   تُصدر التقارير الناجحة الرمزين `key_pinned: true` و`checkpoint_checked: true` عند توفير المدخلتين وقبولهما. احتفظ بنتيجة التحقق.

   ```
   For a handover requiring the final exported record to be witnessed, use
   `--witness witness.zip --witness-fingerprint TRUSTED_WITNESS_SHA256 --require-witness`.
   This refuses an export with an unwitnessed tail. See the
   [witness handover procedure](WITNESS.md#require-a-witnessed-export-boundary).
   ```

   1. سجل قيمة SHA-256 للأرشيف، وحدود التصدير، وتاريخ النقل، والمرسل، و المستلم في سجل الحفظ الخاص بك. احتفظ بالحزمة الأصلية سليمة واعمل من النسخ. شارك ملفات الأدلة بدلاً من دليل البيانات الخاصة بالتطبيق ، الذي يحتوي أيضًا على جلسات الحساب وأسرار التوقيع. للنقل، يمكن وضع الملف المصدَّر في ملف ZIP مشفر بـ AES-256 ومحمي بكلمة مرور. كلمة المرور تحمي السرية فقط ولا يتم تخزينها؛ يقوم المستلم باستخراج الأرشيف والتحقق من الملف المصدَّر الموقَّع بداخله، والذي لم يتغير.
   2. إذا كان التثبيت المستقل للوقت مطلوبًا، فاتبع [إجراء RFC 3161](https://phishdestroy.github.io/TgWitness/ar/docs/reference/timestamp/) واحتفظ بالطلب ونقطة الفحص ومعلومات السلطة المصدقة الموثوقة واستجابة السلطة التي تم التحقق منها. إن إعداد الطلب وحده لا يؤدي إلى الحصول على طابع زمني.

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

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

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

## توحيد الأحداث

يتكون إدخال التجزئة من الحقول التالية بالضبط:

```
seq, observed_at, source_at, kind, chat_id, message_id, actor_id, payload, previous_hash
```

تسلسل البيانات باستخدام JSON المتوافق مع Python بترميز UTF-8، ومفاتيح كائنات مرتبة، وبدون رموز ASCII الهروب، وبدون مسافات بيضاء غير ذات أهمية، وبدون قيم NaN أو اللانهاية:

```
json.dumps(value, ensure_ascii=False, sort_keys=True,
           separators=(",", ":"), allow_nan=False).encode("utf-8")
```

يصبح SHA-256 لتلك البايتات هو تجزئة الحدث. التوقيع هو Ed25519 على 32 بايت تجزئة خام، ثم يتم ترميزها بـ base64. أول previous_hash هو 64 صفرًا. تبدأ أرقام التسلسل من 1 وتزداد بمقدار 1. جميع الأحداث، بما في ذلك الأحداث التشغيلية ، تشترك في سلسلة واحدة. لا يوجد منع للتسليم المكرر: الملاحظات المتكررة هي إيصالات مميزة، وليست ادعاءً بوجود إجراءات Telegram منفصلة.

تكون تواريخ Telegram الأولية سلاسل ISO؛ وتصبح الحقول الثنائية كائنات تحتوي على bytes_base64. ويتم الاحتفاظ بنص الرسالة، والكيانات، ووصف الوسائط، وبيانات الرد الوصفية، وردود الفعل، وإجراءات الخدمة في البيانات الوصفية الأولية للرسالة عند توفرها.

observed_at هي الساعة العالمية (UTC) الخاصة بالمجمع. source_at هي تاريخ Telegram المُقدم عند توفره. لا توفر إشعارات الحذف وقت الحذف الدقيق، لذا تظل source_at فارغة. ترتيب استلام البيانات ليس بالضرورة هو ترتيب الحدث في المصدر . تستخدم لقطات السجل تواريخ مصدر أقدم ولكن أوقات ملاحظة حالية.

## دلالات الفاعل

message.new actor_id هو مرسل الرسالة. لا يُستنتج محرر لـ message.edited ؛ يسجل payload.sender_id مرسل الرسالة التي تمت ملاحظتها. الحذف يظل actor_id فارغًا. تحتفظ رسائل خدمة العضوية بمرسل الرسالة ونوع الإجراء ، دون تحويل كل عملية إزالة إلى انسحاب طوعي. تحتفظ تحديثات المشاركين الخام بـ actor_id كما تم توفيره. لا تختلق لقطات ردود الفعل فاعل تغيير.

تحتوي إشعارات الحذف الخاصة بالمحادثات الخاصة والمجموعات العادية على معرّفات الرسائل فقط. تشترك تلك المحادثات في تسلسل معرّفات واحد على مستوى الحساب، لذا فإن كل معرّف يحدد رسالة واحدة من هذا الحساب. عندما يتم حفظ رسالة تحمل هذا المعرّف مسبقًا في هذا السجل، يتم تسجيل الحذف في تلك المحادثة على أنه message.deleted مع payload.chat_resolution لتسمية الطريقة. أما المعرّفات التي لم يتم حفظها مطلقًا، فيتم الاحتفاظ بها على أنها deletion.unscoped بدون chat_id؛ ولا يتم تخمين أي شيء. تقوم القنوات والمجموعات الفائقة بترقيم الرسائل لكل محادثة ولا تتم مطابقتها بهذه الطريقة أبدًا. عندما تكون الرسالة المحذوفة قد أُرسلت من قبل الحساب الذي تمت ملاحظته، تكون قيمة payload.deleted_message_was_outgoing صحيحة؛ ولا يزال المُحذف غير محدد.

## التغطية: الاستمرارية، والثغرات، والمعرفات غير الملحوظة

يحتوي كل ملف ZIP موقّع على `coverage.json`، ويبدأ التقرير HTML بنفس الملخص، ويقوم `verify.py` بإعادة حسابه من `events.jsonl` بدلاً من الوثوق بالملف:

- **يتم المراقبة بشكل مستمر من X إلى Y.** تبدأ الفترة بـ `observation.started` وت تنتهي عند حدوث توقف مؤقت، أو توقف تام، أو انقطاع اتصال Telegram، أو تسجيل الخروج، أو بدء عملية دون توقف منظم، أو مرور أكثر من ثلاث دقائق دون أي تسجيل أثناء المراقبة (يتم تسجيل نبضات القلب كل دقيقة، لذا فإن الصمت يعني أن العملية توقفت أو تجمدت أو أن الكمبيوتر دخل في وضع السكون). عند تغيير الفاصل الزمني لنبضات القلب في **«المعلمات**»، تسجل كل نبضة ذلك ويصبح الصمت المسموح به ثلاث فترات، ولا يقل أبدًا عن ثلاث دقائق.
- تُدرج **الفجوات** الفترة الزمنية الفاصلة بين الفترات مع ذكر السبب. ويُشار إلى الفجوة التي لا تزال مفتوحة عند آخر سجل بالرمز `not_resumed_by_last_record`.
- **لم يتم رصد معرّفات الرسائل.** بالنسبة للقنوات والمجموعات الكبيرة، التي يتم فيها ترقيم الرسائل لكل محادثة، يتم إدراج المعرّفات المفقودة بين المعرّفات التي تم رصدها على شكل نطاقات. ويتم الإبلاغ عنها على أنها «لم*يتم رصدها*» — محذوفة، أو لم يتم تسليمها أبدًا، أو خارج السجل المحفوظ — ولا يتم الإبلاغ عنها أبدًا على أنها «محذوفة». تشترك المحادثات الخاصة والمجموعات العادية في تسلسل على مستوى الحساب بأكمله، لذا فإن الفجوات الموجودة هناك لا تعني شيئًا ولا يتم إدراجها.
- يتم احتساب إشعارات الفجوات على مستوى الدردشة (على سبيل المثال، طلب Telegram استعادة الفرق في إحدى القنوات) كملاحظات؛ ولا تقطع التغطية الشاملة.

تصف التغطية ما سجله هذا المجمع. وهي لا تُعد دليلاً على أن Telegram قد أرسلت كل التحديثات خلال فترة متواصلة.

## المنتج

تحتوي قائمة الأدلة الموقعة في ملفات ZIP، وصادرات الدردشات، وسجلات الشهود، وبيانات ملفات الملفات الشخصية للأشخاص على `producer` : البرنامج، والإصدار، والمشروع (PhishDestroy)، والصفحة الرئيسية، ومستودع المصدر. يعرض التقرير بتنسيق HTML السطر نفسه، ويقوم `verify.py` بطباعته كجزء مما تم التحقق منه. أما الأرشيفات التي تم إنشاؤها قبل وجود هذا الحقل، فيتم التحقق منها كما كان الحال سابقًا، ويتم الإبلاغ عنها على أنها لا تذكر اسم المُنتج.

## ملفات تعريف الأشخاص

يتم إنشاء ملف الملف الشخصي (`tgwitness-dossier-v1`، JSON) عند الطلب من السجلات الموجودة بالفعل في السجل الخاص بمحادثة واحدة؛ ولا يتم استرداد أي شيء من Telegram ولا يتم أبدًا كتابة محتويات الملف الشخصي في السجل (يتم تسجيل تشغيل الملفات الشخصية وإيقافها على أنها `dossier.changed`). بالنسبة لكل شخص لديه رسالة محفوظة، يُدرج السجل الاسم وسجل اسم المستخدم، وعلامات Telegram (روبوت، احتيال، مزيف، مميز، مُثبت، مقيد، محذوف) كما تظهر وقت الحفظ، معرفات الصور الشخصية، و SHA-256 والتجزئة الإدراكية (pHash، متوافقة مع `imagehash.phash`) لـ الصورة الرمزية من ذاكرة التخزين المؤقتة المحلية للصور الرمزية مع الصور الرمزية المماثلة، والنشاط (الرسالة الأولى والأخيرة، أعداد المشاركات، والمشاركات التي تم تعديلها وحذفها، والرسائل حسب الساعة بالتوقيت العالمي المنسق)، ومن يرد على من، والمحادثات الأخرى في هذا السجل التي كتب فيها الشخص، والمحافظ المذكورة (BTC، EVM، TRON، TON، LTC، DOGE، XMR، SOL؛ عناوين Base58Check يتم التحقق من صحتها باستخدام المجموع الاختباري)، وأرقام الهواتف، وأسماء المستخدمين و الروابط، بما في ذلك الروابط المخفية خلف النص.

تُدرج كل حقيقة سجلات السجل (`seq`) التي استُمدت منها، ويحتوي `record_hashes` على التجزئة لكل سجل مشار إليه. يتم توقيع البيان بمفتاح مساحة العمل:

```
python verify.py tgwitness-dossier-CHAT.json --fingerprint TRUSTED_SHA256 --evidence tgwitness-evidence.zip
```

يتحقق من التوقيع، ويتأكد من صحة عملية تصدير الأدلة نفسها (التوقيع، وسلسلة التجزئة، والملفات) ومن أن كل سجل مشار إليه موجود دون تغيير في عملية التصدير تلك من نفس مساحة العمل. يتم تصنيف تجزئات الصور الرمزية على أنها قادمة من ذاكرة التخزين المؤقتة المحلية (وليس من سجلات السجل). الإشارات هي مطابقات أنماط — أدلة يجب التحقق منها، وليست حقائق مؤكدة. يتم تشغيل الملفات الشخصية لكل محادثة على حدة، ويمكن تصديرها كملف ZIP مشفر بـ AES-256 مع كلمة مرور، و يتم حذفها عند إيقاف تشغيلها أو عند إزالة المحادثة من المصادر.

## شاهد مستقل

يتم مطابقة سجل الشاهد (`tgwitness-witness-v1`) ومنشورات قناته مع تصدير الأدلة باستخدام `verify.py --witness … --channel …`؛ انظر [الشاهد المستقل](https://phishdestroy.github.io/TgWitness/ar/docs/reference/witness/).

## البيان ونقاط التفتيش

يتضمن ملف manifest.json التنسيق، ووقت التصدير، والمفتاح العام، والبصمة الرقمية، وطول السجل، وهاش الرأس، والنطاق، والمنتج، والقيود، و SHA-256 لكل عنصر محتوى بخلاف `manifest.json` و `manifest.sig` أنفسهما. ملف manifest.sig هو توقيع base64 Ed25519 على ملف JSON الأساسي للبيان. يرفض أداة التحقق العناصر غير المتوقعة أو المفقودة، والأسماء المكررة، والملفات التالفة، والتسلسل/السلسلة المكسورة، والتوقيعات غير الصالحة، وعدم التطابق مع نقطة التحقق المقدمة. ولا تستخرج أبدًا مسارات الأرشيف. وتحدد الحجم الإجمالي المعلن غير المضغوط بـ 4 جيجابايت؛ ويسمح `--max-gib N` بإنشاء أرشيفات أكبر حجمًا باستخدام حد **معلمات** أعلى.

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

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

التوقيع الصالح من مفتاح غير مثبت يثبت الاتساق الداخلي فقط. وحتى المفتاح المثبت لا يمكنه إثبات صحة محتوى المصدر إذا تعرض المُجمِّع أو المفتاح للاختراق قبل التسجيل. ويُعد التوقيت الزمني الخارجي والتسجيل الموثوق متطلبين منفصلين. ولا تضمن TgWitness مقبولية الأدلة أو الحصول على شهادة جنائية.

## المرفقات

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

يقوم مُصدِّر ملفات ZIP بالتحقق من الوسائط المخزنة مقارنةً بأسمائها. أما عمليات التصدير بتنسيقات JSONL و CSV و HTML فتتحقق من توقيعات الأحداث ولكنها لا تنقل بايتات الوسائط. التقارير المشتقة هي أدوات تيسيرية؛ أما ملف events.jsonl فهو التمثيل الموثوق للأحداث.

## جمع مستدام وإيصالات المعالجة (0.2)

مهمة وسائط وتسجيل حدث الرسالة في معاملة واحدة. تخزن المهمة وصف الرسالة الأصلية على Telegram؛ وتربط الملاحظة الموقعة بـ SHA-256، والحساب، وسياسة الحجم. يتحقق نظام الاسترداد من صحة هذا الربط قبل التنزيل. ولا يقوم أبدًا بجلب الرسالة الحالية، بل يستبدل المرفق الأحدث بصمت. يتم إعادة محاولة المهام المتوقفة، بينما يظل الفشل الدائم نتيجة صريحة.

لكل مساحة عمل دفترها الخاص وهوية التوقيع الخاصة بها. يتضمن حدث «process.started» معرف التشغيل، والساعات المحلية، وإصدارات التبعيات، وتجزئات الملفات المصدرية، والحساب/النطاق الأولي، وإعدادات الالتقاط. تتضمن نبضات التشغيل معرف التشغيل، والوقت المتناسق، وحالة قائمة الانتظار. يمكن أيضًا تنزيل إيصال العملية كبيان موقّع بشكل منفصل. قياسات الملفات يتم الإبلاغ عنها ذاتيًا وليست شهادة موثوقة من الأجهزة.

يتم الاحتفاظ بنقاط الفحص التلقائية محليًّا عند بدء التشغيل، وكل خمس دقائق أثناء المراقبة (**المعلمات → نقطة فحص موقعة كل**)، وعند الإيقاف المنظم. يقوم التحقق عند بدء التشغيل والتصدير بمقارنة السجل بأحدث نقطة تفتيش محلية محفوظة. ويمكن أن يكشف ذلك عن تراجع قاعدة البيانات عندما تظل نقطة التفتيش سليمة؛ ولا يزال بإمكان المشغل الذي يتحكم في كليهما استبدال كليهما. يظل الاحتفاظ المستقل والطوابع الزمنية الخارجية الموثوقة متطلبات منفصلة.

بعد إعادة التشغيل، يتم استئناف موضع التحديث المحفوظ في Telegram (`catch_up_from` في `observation.started`) ويتم طلب التحديثات الفائتة. تسجل عملية إعادة الفحص الدورية `message.recovered` للرسائل الفائتة و`message.missing_on_recheck` عندما لا يعود Telegram بإرجاع رسالة محفوظة؛ وهذا الأخير ليس إشعارًا بالحذف ولا يذكر اسم المحذف أو الوقت.

### النسخ والاستعادة خارج الموقع (S3)

تقوم النسخة الخارجية (التصدير، معطلة افتراضيًا) بتحميل أجزاء السجل والملفات المحفوظة ونقاط الفحص مع طوابعها الزمنية وعمليات تصدير الدردشات المكتملة إلى مساحة تخزين متوافقة مع S3، مشفرة باستخدام AES-256-GCM قبل التحميل باستخدام مفتاح محفوظ في خزينة مساحة العمل؛ ويتم تطبيق الاحتفاظ بـ «قفل الكائن» (Object Lock) عندما يدعمها الحاوية. لا يمكن قراءة النسخة بدون المفتاح الذي تم تنزيله. الاستعادة والتحقق باستخدام `python -m tgwitness.replica restore --key-file KEY.json --out DIR`.

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

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

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

### لقطات تصدير البث المباشر

تستخدم عمليات التصدير المتدفقة لقطة قراءة مستقرة من SQLite. قد يكون رأسها أقدم من السجل المباشر الحالي عند اكتمال التنزيل. يمكن لنقطة فحص تم إنشاؤها بعد تلك اللقطة أن تشير بشكل صحيح إلى أن الأرشيف أقصر؛ قارن ذلك بنقطة فحص عند البادئة المصدرة أو قبلها، وليس بنقطة فحص لاحقة عشوائية.

## التحضير لمعيار RFC 3161 والتحقق من الاستجابة (0.2)

يُرسل «وضع الأدلة» (معطّل افتراضيًّا) فقط قيمة SHA-256 لكل نقطة تفتيش موقّعة إلى السلطات المدرجة في RFC 3161 وتقويمات OpenTimestamps، عبر مسار مساحة العمل وليس عبر MTProxy أبدًا. يتم الاحتفاظ بالإجابات في `checkpoints/anchors/`، وتصديرها، والتحقق منها بواسطة `verify.py` (يقوم `--tsa-ca` بالتحقق من توقيع TSA؛ وتأكيد أدلة OpenTimestamps باستخدام `ots upgrade` و`ots verify`).

يقوم اللوح بإعداد أرشيف طلبات يحتوي على بايتات ملف checkpoint.json القياسية، وبصمة رسالة SHA-256 ورقم عشوائي (nonce) في ملف timestamp.tsq، ومجموعات التحقق، والتعليمات. لا يتم إجراء أي طلب شبكي. لا يُعتبر الإعداد طابعًا زمنيًا موثوقًا به.

تستدعي `python -m tgwitness.anchor verify` OpenSSL مرتين: مرة مقابل بايتات نقطة التحقق ومرة مقابل الطلب الأصلي. يلزم وجود ملف CA موثوق به بشكل صريح؛ ولا يُعتمد تلقائيًا على الشهادات المضمنة. يعد فحص الطلب اختياريًا في واجهة سطر الأوامر (CLI)، لذا احتفظ بـ --request واستخدمه لفحص الرقم العشوائي (nonce). وتوضح النتيجة ما إذا تم فحصه أم لا. ولا يزال يتعين التحقق من توقيع نقطة تفتيش المجمع والسجل بشكل منفصل باستخدام بصمة المجمع الموثوق بها.

لا يقوم أداة التحقق الحالية باسترداد معلومات الإلغاء أو تنفيذ التحقق من الأرشيف على المدى الطويل بعد انتهاء صلاحية الشهادة. لا تربط بين نجاح التحقق من التوقيع وبين الطابع الزمني المؤهل أو المقبولية القانونية. لم يتم الاتصال بـ هيئة TSA مستقلة حقيقية أثناء التطوير. انظر [الإجراء](https://phishdestroy.github.io/TgWitness/ar/docs/reference/timestamp/).
