Přehled
Tento dokument specifikuje formát souboru I2P blockfile a tabulky v hostsdb.blockfile používané službou Blockfile Naming Service NAMING .
Blockfile poskytuje rychlé vyhledávání Destination v kompaktním formátu. Zatímco režie stránky blockfile je značná, destinace jsou uloženy v binárním formátu místo ve formátu Base 64 jako v hosts.txt formátu. Kromě toho blockfile poskytuje možnost ukládání libovolných metadat (jako je datum přidání, zdroj a komentáře) pro každý záznam. Metadata mohou být v budoucnu využita k poskytování pokročilých funkcí adresáře. Požadavky na úložiště blockfile představují mírné navýšení oproti hosts.txt formátu a blockfile poskytuje přibližně 10násobné snížení času vyhledávání.
Blockfile je jednoduše diskové úložiště více seřazených map (párů klíč-hodnota), implementované jako skiplists. Formát blockfile je přijat z Metanotion Blockfile Database METANOTION . Nejprve definujeme formát souboru, poté použití tohoto formátu službou BlockfileNamingService.
Formát blokových souborů
Původní specifikace blockfile byla upravena tak, aby se do každé stránky přidala magická čísla. Soubor je strukturován do stránek o velikosti 1024 bajtů. Stránky jsou číslovány od 1. “Superblock” je vždy na stránce 1, tj. začíná na bajtu 0 v souboru. Skiplist metaindexu je vždy na stránce 2, tj. začíná na bajtu 1024 v souboru.
Všechny 2-bajtové celočíselné hodnoty jsou bez znaménka. Všechny 4-bajtové celočíselné hodnoty (čísla stránek) jsou se znaménkem a záporné hodnoty jsou neplatné. Všechny celočíselné hodnoty jsou uloženy v síťovém pořadí bajtů (big endian).
Databáze je navržena tak, aby byla otevřena a přístupná pouze jediným vláknem. BlockfileNamingService poskytuje synchronizaci.
Formát superbloku
| 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 |
Všechny úrovně mají rozsah. Ne všechny rozsahy mají úrovně.
| 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 |
Struktury klíč/hodnota jsou seřazeny podle klíče v rámci každého rozpětí a napříč všemi rozpětími. Struktury klíč/hodnota jsou seřazeny podle klíče v rámci každého rozpětí. Rozpětí jiná než první rozpětí nesmí být prázdná.
| 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 |
Délky klíčů a hodnot nesmí být rozděleny napříč stránkami, tj. všechny 4 bajty musí být na stejné stránce. Pokud není dostatek místa, posledních 1-3 bajtů stránky zůstane nevyužitých a délky budou na offsetu 8 v pokračující stránce. Data klíčů a hodnot mohou být rozdělena napříč stránkami. Maximální délka klíčů a hodnot je 65535 bajtů.
| 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 |
Tabulky služby pojmenování Blockfile
Tabulky vytvořené a používané službou BlockfileNamingService jsou následující. Maximální počet záznamů na span je 16.
Seznam přeskočených vlastností
%%__INFO__%% je hlavní databáze skiplist se String/Properties klíč/hodnota záznamy obsahující pouze jeden záznam:
info - Properties (UTF-8 String/String Map), serializované jako Mapping :
- version - “4”
- created - Java long time (ms)
- upgraded - Java long time (ms) (od verze databáze 2)
- lists - Seznam databází hostitelů oddělený čárkami, který se prohledává v pořadí pro vyhledávání. Téměř vždy “privatehosts.txt,userhosts.txt,hosts.txt”.
- listversion_* - Verze každé databáze v seznamech, například: listversion_hosts.txt=4. Používá se k identifikaci částečného nebo přerušeného upgradu jednotlivých seznamů. (od verze databáze 4)
Skiplist pro zpětné vyhledávání
%%__REVERSE__%% je skiplist pro zpětné vyhledávání s klíč/hodnota záznamy typu Integer/Properties (od verze databáze 2):
- Klíče skiplist jsou 4-bajtové celá čísla, první 4 bajty hashe Destination .
- Hodnoty skiplist jsou každá Properties (UTF-8 String/String Mapa) serializované jako Mapping
- V properties může být více záznamů, každý je reverzní mapování, protože pro danou destination může být více než jeden hostname, nebo by mohlo dojít ke kolizím se stejnými prvními 4 bajty hashe.
- Každý klíč property je hostname.
- Každá hodnota property je prázdný řetězec.
Seznamy přeskočených hosts.txt, userhosts.txt a privatehosts.txt
Pro každou databázi hostitelů existuje skiplist obsahující hostitele pro danou databázi. Poznamenejte, že formát verze 4 podporuje více Destinations na jeden název hostitele. Tento formát byl představen v I2P vydání 0.9.26. Databáze verze 3 jsou automaticky migrovány na verzi 4.
Klíče/hodnoty v těchto skiplistech jsou následující:
key - řetězec UTF-8 (název hostitele)
value - - Databázová verze 4: DestEntry, což je jednobytové číslo párů Properties/Destination, které následují. Tolik párů: Properties (UTF-8 String/String Mapa) serializovaná jako Mapping následovaná binárním Destination (serializováno obvyklým způsobem). - Databázová verze 3: DestEntry, což je Properties (UTF-8 String/String Mapa) serializovaná jako Mapping následovaná binárním Destination (serializováno obvyklým způsobem).
Vlastnosti DestEntry obvykle obsahují:
- “a” - Čas přidání (Java long time v ms)
- “m” - Čas poslední modifikace (Java long time v ms)
- “notes” - Uživatelem zadané komentáře
- “s” - Původní zdroj záznamu (typicky název souboru nebo URL předplatného)
- “v” - Pokud byl podpis záznamu ověřen, “true” nebo “false”
Klíče názvů hostitelů jsou uloženy malými písmeny a vždy končí na “.i2p”.