Esta traducción fue generada mediante aprendizaje automático y puede no ser 100% precisa. Ver versión en inglés

Especificación de Archivo de Bloqueo y Base de Datos de Hosts

Especificación del formato de archivo blockfile de I2P y las tablas en hostsdb.blockfile utilizadas por el Servicio de Nombres Blockfile

Resumen

Este documento especifica el formato de archivo blockfile de I2P y las tablas en el hostsdb.blockfile utilizado por el Servicio de Nomenclatura Blockfile NAMING .

El blockfile proporciona una búsqueda rápida de Destination en un formato compacto. Aunque la sobrecarga de páginas del blockfile es sustancial, los destinations se almacenan en binario en lugar de en Base 64 como en el formato hosts.txt. Además, el blockfile proporciona la capacidad de almacenamiento arbitrario de metadatos (como fecha de adición, fuente y comentarios) para cada entrada. Los metadatos pueden utilizarse en el futuro para proporcionar características avanzadas de la libreta de direcciones. El requerimiento de almacenamiento del blockfile es un incremento modesto sobre el formato hosts.txt, y el blockfile proporciona aproximadamente una reducción de 10x en los tiempos de búsqueda.

Un blockfile es simplemente almacenamiento en disco de múltiples mapas ordenados (pares clave-valor), implementados como skiplists. El formato blockfile está adoptado de la Base de Datos Blockfile de Metanotion METANOTION . Primero definiremos el formato de archivo, luego el uso de ese formato por el BlockfileNamingService.

Formato de Archivo de Bloques

La especificación original del blockfile fue modificada para agregar números mágicos a cada página. El archivo está estructurado en páginas de 1024 bytes. Las páginas están numeradas comenzando desde 1. El “superbloque” siempre está en la página 1, es decir, comenzando en el byte 0 del archivo. La skiplist del metaíndice siempre está en la página 2, es decir, comenzando en el byte 1024 del archivo.

Todos los valores enteros de 2 bytes son sin signo. Todos los valores enteros de 4 bytes (números de página) son con signo y los valores negativos son ilegales. Todos los valores enteros se almacenan en orden de bytes de red (big endian).

La base de datos está diseñada para ser abierta y accedida por un solo hilo. El BlockfileNamingService proporciona sincronización.

Formato de superbloque

ByteContentsDescription
0-5Magic number0x3141de493250 ("1A" 0xde "I2P")
6Major version0x01
7Minor version0x02
8-15File lengthTotal length in bytes
16-19First free list page
20-21Mounted flag0x01 = yes
22-23Span sizeMax number of key/value pairs per span (16 for hostsdb). Used for new skip lists.
24-27Page sizeAs of version 1.2. Prior to 1.2, 1024 is assumed.
28-1023unused
### Formato de página de bloque de lista de saltos
ByteContentsDescription
0-7Magic number0x536b69704c697374 "SkipList"
8-11First span page
12-15First level page
16-19SizeTotal number of keys - may only be valid at startup
20-23SpansTotal number of spans - may only be valid at startup
24-27LevelsTotal number of levels - may only be valid at startup
28-29Span sizeAs 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-1023unused
### Formato de página de bloque de nivel de salto

Todos los niveles tienen un span. No todos los spans tienen niveles.

ByteContentsDescription
0-7Magic number0x42534c6576656c73 "BSLevels"
8-9Max height
10-11Current height
12-15Span page
16-Next level pages'current height' entries, 4 bytes each, lowest first
remainingunused
### Omitir formato de página de bloque span

Las estructuras clave/valor se ordenan por clave dentro de cada span y a través de todos los spans. Las estructuras clave/valor se ordenan por clave dentro de cada span. Los spans distintos al primer span no pueden estar vacíos.

ByteContentsDescription
0-3Magic number0x5370616e "Span"
4-7First continuation pageor 0
8-11Previous span pageor 0
12-15Next span pageor 0
16-17Max keys16 for hostsdb
18-19SizeCurrent number of keys
20-1023key/value structures
### Formato de página de bloque de continuación de span
ByteContentsDescription
0-3Magic number0x434f4e54 "CONT"
4-7Next continuation pageor 0
8-1023key/value structures
### Formato de estructura clave/valor

Las longitudes de clave y valor no deben dividirse entre páginas, es decir, los 4 bytes deben estar en la misma página. Si no hay suficiente espacio, los últimos 1-3 bytes de una página quedan sin usar y las longitudes estarán en el desplazamiento 8 en la página de continuación. Los datos de clave y valor pueden dividirse entre páginas. Las longitudes máximas de clave y valor son 65535 bytes.

ByteContents
0-1key length in bytes
2-3value length in bytes
4-key data
value data
### Formato de página de bloque de lista libre
ByteContentsDescription
0-7Magic number0x2366724c69737423 "#frList#"
8-11Next free list blockor 0 if none
12-15Number of valid free pagesin this block (0 - 252)
16-1023Free pages4 bytes each, only the first (valid number) are valid
### Formato de bloque de página libre
ByteContentsDescription
0-7Magic number0x7e2146524545217e "~!FREE!~"
8-1023unused
El metaíndice (ubicado en la página 2) es una asignación de cadenas US-ASCII a enteros de 4 bytes. La clave es el nombre de la skiplist y el valor es el índice de página de la skiplist.

Tablas del Servicio de Nombres Blockfile

Las tablas creadas y utilizadas por el BlockfileNamingService son las siguientes. El número máximo de entradas por span es 16.

Lista de Salto de Propiedades

%%__INFO__%% es la skiplist principal de la base de datos con entradas clave/valor String/Properties que contiene solo una entrada:

info - un Properties (Mapa de Cadena/Cadena UTF-8), serializado como un Mapping :

  • version - “4”
  • created - Tiempo largo de Java (ms)
  • upgraded - Tiempo largo de Java (ms) (a partir de la versión 2 de la base de datos)
  • lists - Lista separada por comas de bases de datos de hosts, que se buscarán en orden para las consultas. Casi siempre “privatehosts.txt,userhosts.txt,hosts.txt”.
  • listversion_* - La versión de cada base de datos en las listas, por ejemplo: listversion_hosts.txt=4. Se usa para identificar actualizaciones parciales o interrumpidas de listas individuales. (a partir de la versión 4 de la base de datos)

Lista de Salto de Búsqueda Inversa

%%__REVERSE__%% es la skiplist de búsqueda inversa con entradas clave/valor Integer/Properties (a partir de la versión 2 de la base de datos):

  • Las claves de la skiplist son enteros de 4 bytes, los primeros 4 bytes del hash del Destination .
  • Los valores de la skiplist son cada uno una Properties (un Mapa String/String UTF-8) serializado como un Mapping
    • Puede haber múltiples entradas en las propiedades, cada una es un mapeo inverso, ya que puede haber más de un nombre de host para un destino dado, o podría haber colisiones con los mismos primeros 4 bytes del hash.
    • Cada clave de propiedad es un nombre de host.
    • Cada valor de propiedad es la cadena vacía.

Listas de exclusión de hosts.txt, userhosts.txt y privatehosts.txt

Para cada base de datos de hosts, hay una skiplist que contiene los hosts para esa base de datos. Tenga en cuenta que el formato versión 4 admite múltiples Destinations por nombre de host. Este formato se introdujo en la versión 0.9.26 de I2P. Las bases de datos versión 3 se migran automáticamente a la versión 4.

Las claves/valores en estas skiplists son las siguientes:

key - una cadena UTF-8 (el nombre del host)

value - - Versión 4 de base de datos: Una DestEntry, que es un número de un byte de pares Properties/Destination a seguir. Ese número de pares de: Un Properties (un Mapa UTF-8 String/String) serializado como un Mapping seguido por un Destination binario (serializado como de costumbre). - Versión 3 de base de datos: una DestEntry, que es un Properties (un Mapa UTF-8 String/String) serializado como un Mapping seguido por un Destination binario (serializado como de costumbre).

Las propiedades DestEntry típicamente contienen:

  • “a” - El tiempo agregado (tiempo largo de Java en ms)
  • “m” - El tiempo de la última modificación (tiempo largo de Java en ms)
  • “notes” - Comentarios proporcionados por el usuario
  • “s” - La fuente original de la entrada (típicamente un nombre de archivo o URL de suscripción)
  • “v” - Si la firma de la entrada fue verificada, “true” o “false”

Las claves de nombre de host se almacenan en minúsculas y siempre terminan en “.i2p”.

Referencias

Was this page helpful?