نظرة عامة
تحدد هذه الوثيقة تنسيق ملف I2P blockfile والجداول الموجودة في hostsdb.blockfile المستخدمة من قِبل خدمة Blockfile Naming Service NAMING .
يوفر blockfile بحثاً سريعاً عن الوجهة (Destination) بتنسيق مضغوط. بينما تكون النفقات العامة لصفحة blockfile كبيرة، يتم تخزين الوجهات في تنسيق ثنائي بدلاً من Base 64 كما في تنسيق hosts.txt. بالإضافة إلى ذلك، يوفر blockfile إمكانية تخزين البيانات الوصفية التعسفية (مثل تاريخ الإضافة والمصدر والتعليقات) لكل إدخال. قد يتم استخدام البيانات الوصفية في المستقبل لتوفير ميزات متقدمة لدفتر العناوين. متطلبات تخزين blockfile تمثل زيادة متواضعة مقارنة بتنسيق hosts.txt، ويوفر blockfile انخفاضاً يبلغ حوالي 10 أضعاف في أوقات البحث.
blockfile هو ببساطة تخزين على القرص لخرائط مرتبة متعددة (أزواج key-value)، مُطبق كـ skiplists. تم تبني تنسيق blockfile من قاعدة بيانات Metanotion Blockfile Database METANOTION . أولاً سنحدد تنسيق الملف، ثم استخدام هذا التنسيق بواسطة BlockfileNamingService.
تنسيق ملف الكتل (Blockfile Format)
تم تعديل مواصفات blockfile الأصلية لإضافة أرقام سحرية لكل صفحة. الملف منظم في صفحات بحجم 1024 بايت. الصفحات مرقمة بدءاً من 1. الـ “superblock” دائماً في الصفحة 1، أي بدءاً من البايت 0 في الملف. قائمة metaindex skiplist دائماً في الصفحة 2، أي بدءاً من البايت 1024 في الملف.
جميع قيم الأعداد الصحيحة من 2 بايت غير موقعة. جميع قيم الأعداد الصحيحة من 4 بايت (أرقام الصفحات) موقعة والقيم السالبة غير مسموحة. جميع قيم الأعداد الصحيحة مخزنة بترتيب بايتات الشبكة (big endian).
قاعدة البيانات مصممة ليتم فتحها والوصول إليها بواسطة خيط واحد فقط. يوفر BlockfileNamingService المزامنة.
تنسيق الكتلة الفائقة
| Byte | Contents | Description |
|---|---|---|
| 0-5 | Magic number | 0x3141de493250 ("1A" 0xde "I2P") |
| 6 | Major version | 0x01 |
| 7 | Minor version | 0x02 |
| 8-15 | File length | Total length in bytes |
| 16-19 | First free list page | |
| 20-21 | Mounted flag | 0x01 = yes |
| 22-23 | Span size | Max number of key/value pairs per span (16 for hostsdb). Used for new skip lists. |
| 24-27 | Page size | As of version 1.2. Prior to 1.2, 1024 is assumed. |
| 28-1023 | unused |
| Byte | Contents | Description |
|---|---|---|
| 0-7 | Magic number | 0x536b69704c697374 "SkipList" |
| 8-11 | First span page | |
| 12-15 | First level page | |
| 16-19 | Size | Total number of keys - may only be valid at startup |
| 20-23 | Spans | Total number of spans - may only be valid at startup |
| 24-27 | Levels | Total number of levels - may only be valid at startup |
| 28-29 | Span size | As of version 1.2. Max number of key/value pairs per span. Prior to that, specified for all skiplists in the superblock. Used for new spans in this skip list. |
| 30-1023 | unused |
جميع المستويات لها مدى. ليس جميع المديات لها مستويات.
| Byte | Contents | Description |
|---|---|---|
| 0-7 | Magic number | 0x42534c6576656c73 "BSLevels" |
| 8-9 | Max height | |
| 10-11 | Current height | |
| 12-15 | Span page | |
| 16- | Next level pages | 'current height' entries, 4 bytes each, lowest first |
| remaining | unused |
هياكل المفتاح/القيمة مرتبة حسب المفتاح داخل كل نطاق وعبر جميع النطاقات. هياكل المفتاح/القيمة مرتبة حسب المفتاح داخل كل نطاق. النطاقات غير النطاق الأول قد لا تكون فارغة.
| Byte | Contents | Description |
|---|---|---|
| 0-3 | Magic number | 0x5370616e "Span" |
| 4-7 | First continuation page | or 0 |
| 8-11 | Previous span page | or 0 |
| 12-15 | Next span page | or 0 |
| 16-17 | Max keys | 16 for hostsdb |
| 18-19 | Size | Current number of keys |
| 20-1023 | key/value structures |
| Byte | Contents | Description |
|---|---|---|
| 0-3 | Magic number | 0x434f4e54 "CONT" |
| 4-7 | Next continuation page | or 0 |
| 8-1023 | key/value structures |
يجب ألا تتوزع أطوال المفاتيح والقيم عبر الصفحات، أي أن جميع البايتات الأربعة يجب أن تكون في نفس الصفحة. إذا لم يكن هناك مساحة كافية، فإن آخر 1-3 بايتات من الصفحة تبقى غير مستخدمة وستكون الأطوال عند الإزاحة 8 في صفحة المتابعة. يمكن تقسيم بيانات المفاتيح والقيم عبر الصفحات. الحد الأقصى لأطوال المفاتيح والقيم هو 65535 بايت.
| Byte | Contents |
|---|---|
| 0-1 | key length in bytes |
| 2-3 | value length in bytes |
| 4- | key data |
| value data |
| Byte | Contents | Description |
|---|---|---|
| 0-7 | Magic number | 0x2366724c69737423 "#frList#" |
| 8-11 | Next free list block | or 0 if none |
| 12-15 | Number of valid free pages | in this block (0 - 252) |
| 16-1023 | Free pages | 4 bytes each, only the first (valid number) are valid |
| Byte | Contents | Description |
|---|---|---|
| 0-7 | Magic number | 0x7e2146524545217e "~!FREE!~" |
| 8-1023 | unused |
جداول خدمة تسمية ملفات الكتل
الجداول التي تم إنشاؤها واستخدامها بواسطة BlockfileNamingService هي كما يلي. العدد الأقصى للإدخالات لكل span هو 16.
قائمة تخطي الخصائص
%%__INFO__%% هو skiplist قاعدة البيانات الرئيسية مع إدخالات مفتاح/قيمة String/Properties التي تحتوي على إدخال واحد فقط:
info - خصائص (خريطة نص UTF-8/نص)، مُسلسلة كـ Mapping :
- version - “4”
- created - Java long time (ms)
- upgraded - Java long time (ms) (اعتباراً من إصدار قاعدة البيانات 2)
- lists - قائمة مفصولة بفواصل من قواعد بيانات المضيف، يتم البحث فيها بالترتيب للاستعلامات. دائماً تقريباً “privatehosts.txt,userhosts.txt,hosts.txt”.
- listversion_* - إصدار كل قاعدة بيانات في القوائم، على سبيل المثال: listversion_hosts.txt=4. يُستخدم لتحديد الترقية الجزئية أو المجهضة للقوائم الفردية. (اعتباراً من إصدار قاعدة البيانات 4)
قائمة التخطي للبحث العكسي
%%__REVERSE__%% هو skiplist البحث العكسي مع مدخلات مفتاح/قيمة من نوع Integer/Properties (اعتباراً من إصدار قاعدة البيانات 2):
- مفاتيح skiplist هي أعداد صحيحة من 4 بايت، وهي البايتات الأربعة الأولى من hash الخاص بـ Destination .
- قيم skiplist هي كل واحدة منها Properties (خريطة String/String بتشفير UTF-8) مسلسلة كـ Mapping
- قد توجد إدخالات متعددة في الخصائص، كل واحدة هي تخطيط عكسي، حيث أنه قد يكون هناك أكثر من اسم مضيف واحد لـ destination معين، أو قد تحدث تضاربات مع نفس البايتات الأربعة الأولى من الـ hash.
- كل مفتاح خاصية هو اسم مضيف.
- كل قيمة خاصية هي سلسلة نصية فارغة.
قوائم التخطي لملفات hosts.txt و userhosts.txt و privatehosts.txt
لكل قاعدة بيانات مضيف، هناك skiplist تحتوي على المضيفين لتلك قاعدة البيانات. لاحظ أن تنسيق الإصدار 4 يدعم عدة Destinations لكل اسم مضيف. تم تقديم هذا التنسيق في إصدار I2P 0.9.26. يتم ترحيل قواعد بيانات الإصدار 3 تلقائياً إلى الإصدار 4.
المفاتيح/القيم في هذه القوائم المتخطية هي كما يلي:
key - نص UTF-8 (اسم المضيف)
value - - إصدار قاعدة البيانات 4: DestEntry، وهو رقم من بايت واحد لأزواج Properties/Destination التي تتبع. ذلك العدد من الأزواج من: Properties (خريطة UTF-8 String/String) متسلسلة كـ Mapping متبوعة بـ Destination ثنائي (متسلسل كالمعتاد). - إصدار قاعدة البيانات 3: DestEntry، وهو Properties (خريطة UTF-8 String/String) متسلسلة كـ Mapping متبوعة بـ Destination ثنائي (متسلسل كالمعتاد).
خصائص DestEntry تحتوي عادة على:
- “a” - الوقت المُضاف (Java long time in ms)
- “m” - الوقت المُعدّل آخر مرة (Java long time in ms)
- “notes” - تعليقات يوفرها المستخدم
- “s” - المصدر الأصلي للإدخال (عادة اسم ملف أو رابط اشتراك)
- “v” - إذا تم التحقق من توقيع الإدخال، “true” أو “false”
يتم تخزين مفاتيح أسماء المضيفين بأحرف صغيرة وتنتهي دائماً بـ “.i2p”.