अवलोकन
यह दस्तावेज़ I2P blockfile फ़ाइल प्रारूप और Blockfile Naming Service NAMING द्वारा उपयोग की जाने वाली hostsdb.blockfile में टेबलों को निर्दिष्ट करता है।
blockfile एक कॉम्पैक्ट फॉर्मेट में तेज़ Destination lookup प्रदान करता है। जबकि blockfile page overhead काफी है, destinations को hosts.txt फॉर्मेट की तरह Base 64 में नहीं बल्कि binary में संग्रहीत किया जाता है। इसके अलावा, blockfile प्रत्येक entry के लिए मनमाना metadata storage (जैसे कि added date, source, और comments) की सुविधा प्रदान करता है। भविष्य में metadata का उपयोग उन्नत addressbook सुविधाएं प्रदान करने के लिए किया जा सकता है। blockfile storage requirement hosts.txt फॉर्मेट की तुलना में मामूली वृद्धि है, और blockfile lookup times में लगभग 10x कमी प्रदान करता है।
एक blockfile केवल कई sorted maps (key-value pairs) का on-disk storage है, जो skiplists के रूप में implemented है। blockfile format को Metanotion Blockfile Database METANOTION से अपनाया गया है। पहले हम file format को define करेंगे, फिर BlockfileNamingService द्वारा उस format के उपयोग को समझाएंगे।
ब्लॉकफाइल प्रारूप
मूल blockfile स्पेक को प्रत्येक page में magic numbers जोड़ने के लिए संशोधित किया गया था। फ़ाइल 1024-byte pages में संरचित है। Pages की संख्या 1 से शुरू होती है। “superblock” हमेशा page 1 पर होता है, यानी फ़ाइल में byte 0 से शुरू होता है। metaindex skiplist हमेशा page 2 पर होता है, यानी फ़ाइल में byte 1024 से शुरू होता है।
सभी 2-byte integer मान unsigned हैं। सभी 4-byte integer मान (page numbers) signed हैं और negative मान अवैध हैं। सभी integer मान network byte order (big endian) में संग्रहीत किए जाते हैं।
डेटाबेस को एक सिंगल thread द्वारा खोले और एक्सेस किए जाने के लिए डिज़ाइन किया गया है। BlockfileNamingService synchronization प्रदान करती है।
Superblock प्रारूप
| 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 |
सभी स्तरों का एक span होता है। सभी spans के स्तर नहीं होते।
| 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 |
Key/value संरचनाएं प्रत्येक span के भीतर और सभी spans में key के आधार पर क्रमबद्ध होती हैं। Key/value संरचनाएं प्रत्येक span के भीतर key के आधार पर क्रमबद्ध होती हैं। पहले span के अलावा अन्य spans खाली नहीं हो सकते।
| 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 |
Key और value की लंबाई को pages में विभाजित नहीं किया जाना चाहिए, यानी सभी 4 bytes एक ही page पर होने चाहिए। यदि पर्याप्त स्थान नहीं है तो एक page के अंतिम 1-3 bytes अप्रयुक्त रह जाते हैं और लंबाई continuation page में offset 8 पर होगी। Key और value data को pages में विभाजित किया जा सकता है। अधिकतम key और value की लंबाई 65535 bytes है।
| 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 है।
Properties Skiplist
%%__INFO__%% मुख्य डेटाबेस skiplist है जिसमें String/Properties key/value entries हैं जिसमें केवल एक entry होती है:
info - एक Properties (UTF-8 String/String Map), जो एक Mapping के रूप में serialized है:
- version - “4”
- created - Java long time (ms)
- upgraded - Java long time (ms) (database version 2 के रूप में)
- lists - होस्ट डेटाबेस की अल्पविराम-विभाजित सूची, जिसमें लुकअप के लिए क्रमानुसार खोजा जाना है। लगभग हमेशा “privatehosts.txt,userhosts.txt,hosts.txt”।
- listversion_* - lists में प्रत्येक डेटाबेस का संस्करण, उदाहरण के लिए: listversion_hosts.txt=4। व्यक्तिगत सूचियों के आंशिक या रद्द किए गए अपग्रेड की पहचान करने के लिए उपयोग किया जाता है। (database version 4 के रूप में)
रिवर्स लुकअप स्किपलिस्ट
%%__REVERSE__%% रिवर्स लुकअप skiplist है जिसमें Integer/Properties key/value entries हैं (database version 2 के अनुसार):
- Skiplist keys 4-byte Integers हैं, Destination के hash के पहले 4 bytes।
- Skiplist values प्रत्येक एक Properties (एक UTF-8 String/String Map) है जो Mapping
के रूप में serialized है
- Properties में कई entries हो सकती हैं, प्रत्येक एक reverse mapping है, क्योंकि किसी दिए गए destination के लिए एक से अधिक hostname हो सकते हैं, या hash के समान पहले 4 bytes के साथ collisions हो सकते हैं।
- प्रत्येक property key एक hostname है।
- प्रत्येक property value empty string है।
hosts.txt, userhosts.txt, और privatehosts.txt स्किपलिस्ट
प्रत्येक host database के लिए, उस database के hosts को शामिल करने वाली एक skiplist होती है। ध्यान दें कि version 4 format प्रति hostname कई Destinations का समर्थन करता है। यह format I2P release 0.9.26 में शुरू किया गया था। Version 3 databases स्वचालित रूप से version 4 में migrate हो जाते हैं।
इन skiplists में keys/values निम्नलिखित हैं:
key - एक UTF-8 स्ट्रिंग (होस्टनेम)
value - - Database version 4: एक DestEntry, जो एक एक-बाइट संख्या है Properties/Destination जोड़ों की जो आगे आने वाली हैं। उतनी संख्या में जोड़े: एक Properties (एक UTF-8 String/String Map) जो Mapping के रूप में serialized है, जिसके बाद एक binary Destination (सामान्य रूप से serialized) है। - Database version 3: एक DestEntry, जो एक Properties (एक UTF-8 String/String Map) है जो Mapping के रूप में serialized है, जिसके बाद एक binary Destination (सामान्य रूप से serialized) है।
DestEntry Properties में आमतौर पर शामिल होता है:
- “a” - जोड़ा गया समय (Java long time ms में)
- “m” - अंतिम बार संशोधित समय (Java long time ms में)
- “notes” - उपयोगकर्ता द्वारा प्रदान की गई टिप्पणियां
- “s” - एंट्री का मूल स्रोत (आमतौर पर एक फ़ाइल नाम या subscription URL)
- “v” - यदि एंट्री के signature की पुष्टि हुई है, “true” या “false”
Hostname keys को लोअर-केस में स्टोर किया जाता है और हमेशा “.i2p” से समाप्त होते हैं।