El proyecto ESP32-C3 Adblock implementa un sumidero de DNS que bloquea dominios de publicidad y rastreo almacenándolos como hashes FNV-1a de 40 bits en la memoria flash en lugar de como cadenas en RAM. Este enfoque permite al dispositivo mantener una lista de bloqueo de 537,000 dominios utilizando solo aproximadamente 50 KB de RAM, en comparación con los ~2.5 MB de RAM que se requerirían si se almacenaran las cadenas de dominio directamente. El sistema realiza búsquedas mediante búsqueda binaria en la tabla de hash ordenada, logrando un tiempo de resolución de consulta de aproximadamente 10 ms, según se informa en la documentación del proyecto.

En su esencia, el dispositivo funciona como un sumidero de DNS UDP: cuando llega una consulta DNS, extrae el dominio, calcula su hash FNV-1a (con sufijos superiores para la coincidencia de subdominios) y realiza una búsqueda binaria de este hash en la tabla almacenada en flash. En caso de coincidencia, devuelve 0.0.0.0 para bloquear efectivamente el dominio; en caso de no coincidencia, reenvía la consulta a un resolver DNS ascendente y retransmite la respuesta. El proyecto incluye un panel web para administración, accesible mediante mDNS en http://c3adblock.local, que permite a los usuarios ver estadísticas, bloquear clientes específicos, añadir dominios bloqueados personalizados y configurar actualizaciones por aire tanto para la lista de bloqueo como para el firmware a través de una interfaz de navegador.

Diagrama que muestra el sumidero de DNS ESP32-C3 Adblock con tabla de hash y panel web
Visión general del sistema ESP32-C3 Adblock: sumidero de DNS UDP, lista de bloqueo basada en hash en flash y panel de administracióngithub.com

La imagen ilustra el mecanismo del sumidero de DNS UDP y el panel de administración descritos en el artículo, mostrando cómo el adblocker ESP32-C3 procesa las consultas DNS y ofrece administración de usuarios.

A pesar de su enfoque innovador, el proyecto reconoce limitaciones inherentes en su método de bloqueo basado en hash. Con hashes de 40 bits almacenando 537,000 dominios, el sistema espera aproximadamente una colisión de hash donde un dominio no bloqueado comparta un hash con un dominio bloqueado, lo que resulta en falsos positivos (sobrebloqueo). Mientras que la documentación señala que las colisiones entre dos dominios bloqueados son inconsecuentes (ambos deberían estar bloqueados de todos modos), no detalla mecanismos para resolver las colisiones de falsos positivos más allá de la API /unblock del panel web. Además, las restricciones técnicas del dispositivo significan que no puede implementar reglas de bloqueo más sofisticadas como patrones regex o comodines, que se omiten durante la compilación de la lista de bloqueo, limitando sus capacidades de filtrado en comparación con soluciones más avanzadas.