HeadlinesBriefing HeadlinesBriefing 12 languages

ESP32-C3 Adblock

Hacker News ·

🇬🇧 English

A Pi-hole-style DNS ad-blocker runs on a $2 ESP32-C3 without PSRAM by storing blocklist domains as sorted 40-bit FNV-1a hashes in flash memory. The project, featured on Tom's Hardware, XDA Developers, and Korben, fits 140,000+ domains in ~0.7 MB of flash with ~10 ms lookup time using only ~50 KB of RAM. Unlike typical ESP32 sinkholes that load domain strings into RAM and require PSRAM, this approach avoids RAM pressure by binary-searching hashes directly from flash.

At 141k domains, hash collisions are negligible (~0); at 537k domains, about one collision occurs. The 40-bit hash size balances flash usage and collision risk—32 bits increases collisions, 64 bits wastes space. The same method scales to larger chips like ESP32-S3, holding ~2.7M domains in 16 MB flash versus ~466k for strings in 8 MB PSRAM.

Hardware requirements include any ESP32-C3 board with 4 MB flash (tested on C3 Super Mini), powered via USB. A printable enclosure is available, with antenna clearance and venting recommended for thermal management. Firmware and blocklist update over Wi-Fi after initial USB flash using PlatformIO.

Web dashboard enables management via /ban, /addblock, etc., protected by WEB_USER/WEB_PASS/OTA_PASS. Build steps involve copying secrets template, building blocklist hash table, and flashing firmware + filesystem.

View original article →


🇸🇦 العربية

منع أعلانات DNS على ESP32-C3 باستخدام تجزئة مخزنة في الذاكرة الفلاشية

يعمل منع أعلانات DNS على غرار Pi-hole على ESP32-C3 بسعر $2 بدون PSRAM من خلال تخزين نطاقات قوائم الحظر كتجزئة FNV-1a مرتبة بـ 40 بت في الذاكرة الفلاشية. المشروع، الذي عُرض على Tom's Hardware، XDA Developers وKorben، يناسب أكثر من 140,000 نطاق في حوالي 0.7 ميجابايت من الفلاش مع زمن بحث حوالي 10 مللي ثانية باستخدام حوالي 50 كيلو بايت فقط من الذاكرة العشوائية. على عكس نواة ESP32 النوعية التي تحمل سلاسل النطاقات في الذاكرة العشوائية وتتطلب PSRAM، يتجنب هذا النهج الضغط على الذاكرة العشوائية من خلال البحث الثنائي على التجزئة مباشرة من الفلاش. عند 141k نطاق، فإن تصادمات التجزئة قليلة جداً (~0)؛ عند 537k نطاق، يحدث حوالي تصادم واحد. حجم التجزئة 40 بت يوازن بين استخدام الفلاش ومخاطر التصادم: 32 بت يزيد التصادمات، 64 بت يضيع المساحة. نفس الطريقة يمكن أن تتوسع إلى شرائح أكبر مثل ESP32-S3، والتي تحمل حوالي 2.7M نطاق في 16 ميجابايت من الفلاش مقابل حوالي 466k للسلاسل في 8 ميجابايت من PSRAM. متطلبات العتاد تشمل أي لوحة ESP32-C3 بـ 4 ميجابايت فلاش (تم اختبارها على C3 Super Mini)، وتعمل عبر USB. يتوفر غلاف قابل للطباعة، ويوصى بمسافة للأنتينا والتهوية لإدارة الحرارة. يتم تحديث البرمجيات الثابتة وقائمة الحظر عبر الواي فاي بعد البرمجة الأولية عبر USB باستخدام PlatformIO. لوحة الويب تتيح الإدارة عبر /ban، /addblock، إلخ، وتحميها WEB_USER/WEB_PASS/OTA_PASS. تشمل خطوات البناء نسخ قالب الأسرار، وبناء جدول تجزئة قائمة الحظر، وبرمجة البرمجيات الثابتة + نظام الملفات.

لماذا نستخدم تجزئة 40 بت بدلاً من تخزين سلاسل النطاقات في الذاكرة العشوائية؟

تخزين تجزئة FNV-1a 40 بت في الفلاش يتجنب متطلبات PSRAM، ويقلل استخدام الذاكرة العشوائية إلى حوالي 50 كيلو بايت، ويتيح عمليات بحث ثنائية سريعة (حوالي 10 مللي ثانية) بينما يناسب أكثر من 140k نطاق في أقل من 1 ميجابايت من الفلاش، على عكس نهج سلاسل في الذاكرة العشوائية الذي يتطلب PSRAM وحوالي 2.5 ميجابايت من الذاكرة العشوائية لنفس الحجم.

العربية version →


🇧🇩 বাংলা

ESP32-C3 DNS বিজ্ঞাপন ব্লকার হ্যাশ-ইন-ফ্ল্যাশ ব্যবহার করে

একটি Pi-hole-এর মতো DNS বিজ্ঞাপন ব্লকার $2 এর ESP32-C3-এ চালু হয় PSRAM ছাড়াই ব্লকলিস্ট ডোমেইনগুলিকে ফ্ল্যাশ মেমরিতে সাজানো 40-বিট FNV-1a হ্যাশ হিসাবে সংরক্ষণ করে। এই প্রকল্পটি Tom's Hardware, XDA Developers এবং Korben-এ ফিচার করা হয়েছে, যা ~0.7 MB ফ্ল্যাশে 140,000+ ডোমেইন এবং ~10 মিলিসেকেন্ড লুকআপ সময়ের সাথে শুধুমাত্র ~50 KB RAM ব্যবহার করে ফিট হয়। সাধারণ ESP32 সিনকহোলগুলির বিপরীতে, যা RAM-এ ডোমেইন স্ট্রিং লোড করে এবং PSRAM প্রয়োজন হয়, এই পদ্ধতিটি ফ্ল্যাশ থেকে সরাসরি হ্যাশ বাইনারি সার্চ করে RAM চাপ এড়ায়। 141k ডোমেইন এবং হ্যাশ কলিশন অগ্রাহ্য (~0); 537k ডোমেইন এবং প্রায় একটি কলিশন ঘটে। 40-বিট হ্যাশ সাইজ ফ্ল্যাশ ব্যবহার এবং কলিশন ঝুঁকির মধ্যে সামঞ্জস্য রাখে—32 বিট কলিশন বাড়ায়, 64 বিট জায়গা বর্জন করে। একই পদ্ধতি বড় চিপগুলিতে যেমন ESP32-S3-এ স্কেল করতে পারে, যা 16 MB ফ্ল্যাশে ~2.7M ডোমেইন ধরে রাখে যা 8 MB PSRAM-এ ~466k স্ট্রিংয়ের তুলনায়। হার্ডওয়্যার প্রয়োজনীয়তাগুলির মধ্যে 4 MB ফ্ল্যাশ সহ যেকোনো ESP32-C3 বোর্ড অন্তর্ভুক্ত (C3 Super Mini-এ পরীক্ষা করা হয়েছে), USB এর মাধ্যমে সরবরাহ করা হয়। একটি প্রিন্টযোগ্য আলাদাকরণ উপলদ্ধ, তাপ ব্যবস্থাপনার জন্য অ্যান্টেনা ক্লিয়ারেন্স এবং ভেন্টিং সুপারিশ করা হয়। PlatformIO ব্যবহার করে প্রাথমিক USB ফ্ল্যাশের পরে ফার্মওয়্যার এবং ব্লকলিস্ট আপডেট ওয়াই-ফাইএর মাধ্যমে আপডেট হয়। ওয়েব ড্যাশবোর্ড /ban, /addblock ইত্যাদির মাধ্যমে পরিচালনা সম্ভব, যা WEB_USER/WEB_PASS/OTA_PASS দ্বারে সুরক্ষিত। বিল্ড ধাপগুলির মধ্যে সিক্রেট্স টেমপ্লেট কপি করা, ব্লকলিস্ট হ্যাশ টেবিল গঠন করা এবং ফার্মওয়্যার + ফাইলসিস্টেম ফ্ল্যাশ করা অন্তর্ভুক্ত।

RAM-এ ডোমেইন স্ট্রিং সংরক্ষণ করার পরিবর্তে 40-বিট হ্যাশ ব্যবহার কেন?

ফ্ল্যাশে 40-বিট FNV-1a হ্যাশ সংরক্ষণ করে PSRAM প্রয়োজন এড়ায়, RAM ব্যবহার কমায় ~50 KB এবং দ্রুত বাইনারি-সার্চ লুকআপ (~10 মিলিসেকেন্ড) সক্ষম করে যখন 140k+ ডোমেইন <1 MB ফ্ল্যাশে ফিট হয়, যা স্ট্রিং-in-RAM পদ্ধতিগুলির বিপরীতে যা PSRAM এবং ~2.5 MB RAM চায় সমান স্কেলের জন্য।

বাংলা version →


🇩🇪 Deutsch

ESP32-C3 DNS-Werbeblocker verwendet Hash-in-Flash

Ein Pi-hole-ähnlicher DNS-Werbeblocker läuft auf einem $2 ESP32-C3 ohne PSRAM, indem er Blocklisten-Domänen als sortierte 40-Bit-FNV-1a-Hashes im Flash-Speicher speichert. Das Projekt, das auf Tom's Hardware, XDA Developers und Korben präsentiert wurde, fasst mehr als 140.000 Domänen in etwa 0,7 MB Flash mit einer Suchzeit von etwa 10 ms unter Verwendung von nur etwa 50 KB RAM unter. Im Gegensatz zu typischen ESP32-Senken, die Domänen-Strings in den RAM laden und PSRAM erfordern, vermeidet dieser Ansatz RAM-Druck durch binäre Suche von Hashes direkt aus dem Flash.

Bei 141k Domänen sind Hash-Kollisionen vernachlässigbar (~0); bei 537k Domänen tritt etwa eine Kollision auf. Die 40-Bit-Hash-Größe balanciert Flash-Nutzung und Kollisionsrisiko: 32 Bit erhöhen Kollisionen, 64 Bit verschwenden Platz. Die gleiche Methode lässt sich auf größere Chips wie ESP32-S3 hochskalieren, die etwa 2,7 M Domänen in 16 MB Flash im Vergleich zu etwa 466 k für Strings in 8 MB PSRAM unterbringen.

Die Hardware-Anforderungen umfassen ein beliebiges ESP32-C3-Board mit 4 MB Flash (getestet auf C3 Super Mini), das über USB mit Strom versorgt wird. Ein druckbarer Gehäuse ist verfügbar, wobei Antennenabstand und Belüftung für die thermische Verwaltung empfohlen werden. Firmware und Blocklisten-Update erfolgen über Wi-Fi nach dem initialen USB-Flash mit PlatformIO.

Das Web-Dashboard ermöglicht die Verwaltung über /ban, /addblock usw., geschützt durch WEB_USER/WEB_PASS/OTA_PASS. Die Build-Schritte beinhalten das Kopieren der Secrets-Vorlage, das Erstellen der Blocklisten-Hash-Tabelle und das Flashen der Firmware + Dateisystem.

Warum 40-Bit-Hashes verwenden anstelle von Domänen-Strings im RAM zu speichern?

Das Speichern von 40-Bit-FNV-1a-Hashes im Flash vermeidet die PSRAM-Anforderung, reduziert die RAM-Nutzung auf etwa 50 KB und ermöglicht schnelle binäre Suchvorgänge (~10 ms), während mehr als 140 k Domänen in weniger als 1 MB Flash Platz finden, im Gegensatz zu String-in-RAM-Ansätzen, die PSRAM und etwa 2,5 MB RAM für dieselbe Skalierung erfordern.

Deutsch version →


🇪🇸 Español

Bloqueador de anuncios DNS basado en hash en flash para ESP32-C3

Un bloqueador de anuncios DNS estilo Pi-hole funciona en un ESP32-C3 de $2 sin PSRAM almacenando dominios de listas de bloqueo como hashes FNV-1a de 40 bits ordenados en memoria flash. El proyecto, destacado en Tom's Hardware, XDA Developers y Korben, caben más de 140,000 dominios en aproximadamente 0.7 MB de flash con un tiempo de búsqueda de aproximadamente 10 ms utilizando solo aproximadamente 50 KB de RAM. A diferencia de los típicos sumideros ESP32 que cargan cadenas de dominios en RAM y requieren PSRAM, este enfoque evita la presión de RAM buscando hashes directamente desde flash.

Con 141k dominios, las colisiones de hash son despreciables (aproximadamente 0); con 537k dominios, ocurre aproximadamente una colisión. El tamaño de hash de 40 bits equilibra el uso de flash y el riesgo de colisión: 32 bits aumenta las colisiones, 64 bits desperdicia espacio. El mismo método se escala a chips más grandes como ESP32-S3, albergando aproximadamente 2.7M de dominios en 16 MB de flash frente a aproximadamente 466k para cadenas en 8 MB de PSRAM.

Los requisitos de hardware incluyen cualquier placa ESP32-C3 con 4 MB de flash (probado en C3 Super Mini), alimentada por USB. Hay disponible un estuche imprimible, con espacio para antena y ventilación recomendados para la gestión térmica. El firmware y la actualización de la lista de bloqueo se realizan por Wi-Fi después de la programación inicial por USB usando PlatformIO.

El panel web permite la gestión a través de /ban, /addblock, etc., protegido por WEB_USER/WEB_PASS/OTA_PASS. Los pasos de construcción implican copiar la plantilla de secretos, construir la tabla de hash de la lista de bloqueo y flashear el firmware + sistema de archivos.

¿Por qué usar hashes de 40 bits en lugar de almacenar cadenas de dominios en RAM?

Almacenar hashes FNV-1a de 40 bits en flash evita la necesidad de PSRAM, reduce el uso de RAM a aproximadamente 50 KB y permite búsquedas rápidas por binaria (aproximadamente 10 ms) mientras caben más de 140k dominios en menos de 1 MB de flash, a diferencia de los enfoques de cadenas en RAM que requieren PSRAM y aproximadamente 2.5 MB de RAM para la misma escala.

Español version →


🇫🇷 Français

Bloqueur de publicités DNS ESP32-C3 utilisant un hachage en mémoire flash

Un bloqueur de publicités DNS dans le style Pi-hole fonctionne sur un ESP32-C3 à $2 sans PSRAM en stockant les domaines de liste de blocage sous forme de hachages FNV-1a de 40 bits triés dans la mémoire flash. Le projet, présenté sur Tom's Hardware, XDA Developers et Korben, peut contenir plus de 140 000 domaines dans environ 0,7 Mo de flash avec un temps de recherche d'environ 10 ms en utilisant seulement environ 50 Ko de RAM. Contrairement aux pièges typiques de l'ESP32 qui chargent les chaînes de domaines en RAM et nécessitent de la PSRAM, cette approche évite la pression sur la RAM en effectuant une recherche binaire sur les hachages directement depuis la flash.

Avec 141 k domaines, les collisions de hachage sont négligeables (environ 0) ; avec 537 k domaines, environ une collision se produit. La taille de hachage de 40 bits équilibre l'utilisation de la flash et le risque de collision : 32 bits augmente les collisions, 64 bits gaspille de l'espace. La même méthode peut être mise à l'échelle à des puces plus grandes comme l'ESP32-S3, pouvant contenir environ 2,7 M de domaines dans 16 Mo de flash contre environ 466 k pour des chaînes dans 8 Mo de PSRAM.

Les exigences matérielles comprennent n'importe quelle carte ESP32-C3 avec 4 Mo de flash (testée sur C3 Super Mini), alimentée par USB. Un boîtier imprimable est disponible, avec un espace pour l'antenne et des ouvertures de ventilation recommandés pour la gestion thermique. Le firmware et la mise à jour de la liste de blocage se font via Wi-Fi après le flash initial USB à l'aide de PlatformIO.

Le tableau de bord Web permet la gestion via /ban, /addblock, etc., protégé par WEB_USER/WEB_PASS/OTA_PASS. Les étapes de construction impliquent la copie du modèle de secrets, la construction de la table de hachage de la liste de blocage et le flashage du firmware + du système de fichiers.

Pourquoi utiliser des hachages de 40 bits au lieu de stocker des chaînes de domaines en RAM ?

Stocker des hachages FNV-1a de 40 bits en flash évite l'exigence de PSRAM, réduit l'utilisation de RAM à environ 50 Ko et permet des recherches binaires rapides (environ 10 ms) tout en contenant plus de 140 k domaines dans moins de 1 Mo de flash, contrairement aux approches de chaînes en RAM qui exigent de la PSRAM et environ 2,5 Mo de RAM pour la même échelle.

Français version →


🇮🇳 हिन्दी

ESP32-C3 DNS विज्ञापन अवरोधक हैश-इन-फ़्लैश का उपयोग करता है

एक Pi-hole-शैली DNS विज्ञापन अवरोधक $2 के ESP32-C3 पर बिना PSRAM के चलता है, जो ब्लॉकलिस्ट डोमेन को फ़्लैश मेमोरी में सॉर्टेड 40-बिट FNV-1a हैश के रूप में संग्रहीत करता है। इस प्रोजेक्ट को Tom's Hardware, XDA Developers और Korben पर फीचर किया गया है, जो ~0.7 MB फ़्लैश में 140,000+ डोमेन और ~10 मिलीसेकंड लुकअप समय के साथ ~50 KB RAM के उपयोग के साथ फिट होता है। सामान्य ESP32 सिंकहोल्स के विपरीत, जो डोमेन स्ट्रिंग को RAM में लोड करते हैं और PSRAM की आवश्यकता होती है, इस दृष्टिकोण RAM प्रदर्शन को बचाता है क्योंकि यह फ़्लैश से सीधे हैश के बाइनरी सर्च करता है। 141k डोमेन पर, हैश संघट्टन नगण्य हैं (~0); 537k डोमेन पर, लगभग एक संघट्टन होता है। 40-बिट हैश आकार फ़्लैश उपयोग और संघट्टन जोखिम के बीच संतुलन कायम रखता है—32 बिट संघट्टन बढ़ाता है, 64 बिट स्थान बर्बाद करता है। वही विधि बड़े चिप्स जैसे ESP32-S3 में स्केल कर सकती है, जो 16 MB फ़्लैश में ~2.7M डोमेन को 8 MB PSRAM में ~466k स्ट्रिंग्स की तुलना में रखती है। हार्डवेयर आवश्यकताएं में 4 MB फ़्लैश वाला कोई भी ESP32-C3 बोर्ड शामिल है (C3 Super Mini पर परीक्षण किया गया), USB के माध्यम से सप्लाई किया गया। एक प्रिंटेबल एन्क्लोज़र उपलब्ध है, थर्मल मैनेजमेंट के लिए एंटीना क्लियरेंस और वेंटिंग की सिफारिश की जाती है। PlatformIO का उपयोग करके प्रारंभिक USB फ़्लैश के बाद फर्मवेयर और ब्लॉकलिस्ट अपडेट Wi-Fi के माध्यम से अपडेट होता है। वेब डैशबोर्ड /ban, /addblock आदि के माध्यम से प्रबंधन की अनुमति देता है, जो WEB_USER/WEB_PASS/OTA_PASS द्वारा सुरक्षित है। बिल्ड चरणों में सीक्रेट्स टेम्प्लेट कॉपी करना, ब्लॉकलिस्ट हैश टेबल बनाना और फर्मवेयर + फ़ाइल सिस्टम फ़्लैश करना शामिल है।

डोमेन स्ट्रिंग को RAM में संग्रहीत करने के बजाय 40-बिट हैश क्यों उपयोग करें?

फ़्लैश में 40-बिट FNV-1a हैश संग्रहीत करने से PSRAM की आवश्यकता नहीं होती, RAM उपयोग को ~50 KB तक कम कर देती है और तेज़ बाइनरी-सर्च लुकअप (~10 मिलीसेकंड) सक्षम करती है जबकि 140k+ डोमेन को <1 MB फ़्लैश में फिट करती है—जिस तरह स्ट्रिंग-in-RAM दृष्टिकोण PSRAM और ~2.5 MB RAM की मांग करते हैं, जो उसी स्केल के लिए।

हिन्दी version →


🇮🇩 Bahasa Indonesia

Pemblokir Iklan DNS ESP32-C3 Menggunakan Hash-in-Flash

Pemblokir iklan DNS bertipe Pi-hole berjalan pada ESP32-C3 seharga $2 tanpa PSRAM dengan menyimpan domain daftar pemblokir sebagai hash FNV-1a 40-bit yang diurutkan di memori flash. Proyek ini, yang ditampilkan di Tom's Hardware, XDA Developers, dan Korben, dapat menampung lebih dari 140.000 domain dalam sekitar 0,7 MB flash dengan waktu pencarian sekitar 10 ms menggunakan hanya sekitar 50 KB RAM. Berbeda dengan sinkhole ESP32 khas yang memuat string domain ke dalam RAM dan membutuhkan PSRAM, pendekatan ini menghindari tekanan RAM dengan melakukan pencarian biner hash langsung dari flash.

Pada 141k domain, tabrakan hash dapat diabaikan (~0); pada 537k domain, terjadi sekitar satu tabrakan. Ukuran hash 40-bit menyeimbangkan penggunaan flash dan risiko tabrakan: 32-bit meningkatkan tabrakan, 64-bit menyia-siakan ruang. Metode yang sama dapat diskala ke chip yang lebih besar seperti ESP32-S3, yang dapat menampung sekitar 2,7 juta domain dalam 16 MB flash dibandingkan sekitar 466k untuk string dalam 8 MB PSRAM.

Persyaratan perangkat keras mencakup board ESP32-C3 apa saja dengan 4 MB flash (diuji pada C3 Super Mini), yang digerakkan melalui USB. Kasus yang dapat dicetak tersedia, dengan rekomendasi jeda antena dan ventilasi untuk pengelolaan termal. Firmware dan pembaruan daftar pemblokir melalui Wi-Fi setelah flash USB awal menggunakan PlatformIO.

Dasbor web memungkinkan pengelolaan melalui /ban, /addblock, dll., dilindungi oleh WEB_USER/WEB_PASS/OTA_PASS. Langkah-langkah build meliputi menyalin template rahasia, membangun tabel hash daftar pemblokir, dan mem-flash firmware + sistem berkas.

Bahasa Indonesia version →


🇯🇵 日本語

ESP32-C3 DNS 広告ブロッカーはフラッシュ内ハッシュを使用

2ドルのPSRAMなしESP32-C3でPi-holeスタイルのDNS広告ブロッカーが動作し、フラッシュメモリにソートされた40ビットFNV-1aハッシュとしてブロックリストドメインを保存します。このプロジェクトはTom's Hardware、XDA Developers、Korbenで特集され、フラッシュの約0.7MBに140,000以上のドメインを収容し、純粋に約50KBのRAMで約10msの検索時間を実現しています。通常のESP32シンクホールとは異なり、ドメイン文字列をRAMにロードしPSRAMを必要とするものとは、このアプローチはフラッシュから直接ハッシュをバイナリ検索することでRAMの圧迫を回避します。141kドメインではハッシュ衝突は無視できない(約0);537kドメインでは約1回の衝突が発生します。40ビットハッシュサイズはフラッシュ使用量と衝突リスクのバランスを取ります:32ビットは衝突を増やし、64ビットはスペースを浪費します。同じ方法はESP32-S3のような大きなチップにスケーリングでき、16MBフラッシュで約2.7Mドメインを収容し、8MB PSRAMで約466kの文字列と比較されます。ハードウェア要件には4MBフラッシュを搭載した任意のESP32-C3ボード(C3 Super Miniでテスト済み)が含まれ、USB給電されます。印刷可能なケースが利用可能で、熱管理のためにアンテナクリアランスと通気が推奨されます。PlatformIOを使用して初期USBフラッシュ後、ファームウェアとブロックリストはWi-Fiで更新されます。Webダッシュボードは/ban、/addblockなどを通じて管理を可能にし、WEB_USER/WEB_PASS/OTA_PASSによって保護されます。ビルド手順にはシークレットテンプレートのコピー、ブロックリストハッシュテーブルの構築、ファームウェア+ファイルシステムのフラッシュが含まれます。

ドメイン文字列をRAMに保存する代わりに40ビットハッシュを使用する理由は?

フラッシュに40ビットFNV-1aハッシュを保存することでPSRAMの必要性を回避し、RAM使用量を約50KBに抑え、約10msの高速バイナリ検索を可能にしながら、140k以上のドメインを1MB未満のフラッシュに収容できます。これは、同じスケールにおいてPSRAMと約2.5MBのRAMを必要とするRAM内文字列のアプローチとは異なります。

日本語 version →


🇧🇷 Português

Bloqueador de anúncios DNS ESP32-C3 usa hash em flash

Um bloqueador de anúncios DNS no estilo Pi-hole funciona em um ESP32-C3 de $2 sem PSRAM armazenando domínios de lista de bloqueio como hashes FNV-1a de 40 bits ordenados na memória flash. O projeto, destacado no Tom's Hardware, XDA Developers e Korben, cabe mais de 140.000 domínios em cerca de 0,7 MB de flash com um tempo de pesquisa de cerca de 10 ms usando apenas cerca de 50 KB de RAM. Ao contrário dos típicos poços de sombra ESP32 que carregam strings de domínios na RAM e exigem PSRAM, esta abordagem evita a pressão de RAM pesquisando hashes diretamente do flash.

Com 141k domínios, as colisões de hash são negligenciáveis (~0); com 537k domínios, ocorre aproximadamente uma colisão. O tamanho de hash de 40 bits equilibra o uso de flash e o risco de colisão: 32 bits aumenta colisões, 64 bits desperdiça espaço. O mesmo método se escala para chips maiores como ESP32-S3, contendo aproximadamente 2,7M de domínios em 16 MB de flash versus aproximadamente 466k para strings em 8 MB de PSRAM.

Os requisitos de hardware incluem qualquer placa ESP32-C3 com 4 MB de flash (testada em C3 Super Mini), alimentada via USB. Uma carcaça imprimível está disponível, com espaço para antena e ventilação recomendados para gerenciamento térmico. O firmware e a atualização da lista de bloqueio são feitos via Wi-Fi após o flash inicial USB usando PlatformIO.

O painel web permite gerenciamento via /ban, /addblock, etc., protegido por WEB_USER/WEB_PASS/OTA_PASS. As etapas de construção envolvem copiar o modelo de segredos, construir a tabela de hash da lista de bloqueio e flashar firmware + sistema de arquivos.

Por que usar hashes de 40 bits em vez de armazenar strings de domínios na RAM?

Armazenar hashes FNV-1a de 40 bits em flash evita a necessidade de PSRAM, reduz o uso de RAM para cerca de 50 KB e permite pesquisas binárias rápidas (~10 ms) enquanto cabem mais de 140k domínios em menos de 1 MB de flash, ao contrário de abordagens de strings em RAM que exigem PSRAM e cerca de 2,5 MB de RAM para a mesma escala.

Português version →


🇷🇺 Русский

DNS-блокировщик рекламы ESP32-C3 использует хеширование в flash-памяти

DNS-блокировщик рекламы в стиле Pi-hole работает на ESP32-C3 за $2 без PSRAM, храня домены списков блокировки в виде отсортированных 40-битных хешей FNV-1a в flash-памяти. Проект, представленный на Tom's Hardware, XDA Developers и Korben, вмещает более 140 000 доменов в около 0,7 МБ flash-памяти с временем поиска около 10 мс, используя только около 50 КБ ОЗУ. В отличие от типичных ESP32-ловушек, которые загружают строки доменов в ОЗУ и требуют PSRAM, этот подход избегает давления на ОЗУ, выполняя бинарный поиск хешей непосредственно из flash-памяти. При 141k доменах коллизии хешей пренебрежимо малы (~0); при 537k доменах происходит около одной коллизии. Размер хеша 40 бит обеспечивает баланс между использованием flash-памяти и риском коллизий: 32 бита увеличивают коллизии, 64 бита тратят место. Тот же метод масштабируется на более крупные чипы, такие как ESP32-S3, вмещающие около 2,7 млн доменов в 16 МБ flash-памяти по сравнению с около 466 тыс. строк в 8 МБ PSRAM. Требования к оборудованию включают любую плату ESP32-C3 с 4 МБ flash-памяти (тестировалась на C3 Super Mini), питание через USB. Доступен печатный корпус, рекомендуется оставить пространство для антенны и вентиляцию для теплового управления. Прошивка и обновление списка блокировок осуществляются по Wi-Fi после первоначальной прошивки через USB с использованием PlatformIO. Веб-панель позволяет управлять через /ban, /addblock и т.д., защищённую WEB_USER/WEB_PASS/OTA_PASS. Этапы сборки включают копирование шаблона секретов, создание таблицы хешей списка блокировок и прошивку прошивки + файловой системы.

Почему использовать 40-битные хеши вместо хранения строк доменов в ОЗУ?

Хранение 40-битных хешей FNV-1a в flash-памяти избавляет от необходимости PSRAM, сокращает использование ОЗУ до около 50 КБ и обеспечивает быстрый бинарный поиск (~10 мс), при этом более 140 тыс. доменов помещаются в менее 1 МБ flash-памяти, в отличие от подходов со строками в ОЗУ, которые требуют PSRAM и около 2,5 МБ ОЗУ для такого же масштаба.

Русский version →


🇨🇳 简体中文

ESP32-C3 DNS 广告拦截器采用闪存哈希技术

一种 Pi-hole 风格的 DNS 广告拦截器运行在无 PSRAM 的 2 美元 ESP32-C3 上,通过在闪存内存中存储排序的 40 位 FNV-1a 哈希来拦截域名。该项目登载于 Tom's Hardware、XDA Developers 和 Korben,在闪存的 ~0.7 MB 中容纳了 140,000+ 个域名,查找时间约为 10 毫秒,仅使用 ~50 KB 的 RAM。与将域名字符串加载到 RAM 并需要 PSRAM 的典型 ESP32 诱骗设备不同,这种方法通过直接从闪存中对哈希进行二分查找,避免了 RAM 压力。拥有 141k 个域名时,哈希冲突可忽略不计(约为 0);拥有 537k 个域名时,约会发生一次冲突。40 位哈希大小在闪存使用和冲突风险之间取得平衡——32 位会增加冲突,64 位则浪费空间。相同方法可扩展到更大的芯片,如 ESP32-S3,在 16 MB 闪存中可容纳约 270 万个域名,相比之下 8 MB PSRAM 中仅能容纳约 466k 个字符串。硬件要求包括任何带有 4 MB 闪存的 ESP32-C3 板(在 C3 Super Mini 上测试),通过 USB 供电。提供可打印的外壳,建议为天线留出空间和通风孔以进行热管理。固件和屏蔽列表通过 Wi-Fi 更新,在使用 PlatformIO 进行初始 USB 刷写后。Web 仪表板支持通过 /ban、/addblock 等进行管理,受 WEB_USER/WEB_PASS/OTA_PASS 保护。构建步骤包括复制 secrets 模板、构建屏蔽列表哈希表以及刷写固件 + 文件系统。

为什么使用 40 位哈希而不是在 RAM 中存储域名字符串?

在闪存中存储 40 位 FNV-1a 哈希可避免 PSRAM 要求,将 RAM 使用量降至约 50 KB,并支持快速的二分查找(约 10 毫秒),同时在小于 1 MB 闪存中容纳 140k+ 个域名——与需要 PSRAM 和约 2.5 MB RAM 的字符串-in-RAM 方法不同,后者无法实现相同的规模。

简体中文 version →