ESP32-C3 Adblockプロジェクトは、ドメインをRAM内の文字列ではなくフラッシュメモリ内の40ビットFNV-1aハッシュとして格納することで、広告およびトラッキングドメインをブロックするDNS sinkholeを実装しています。このアプローチにより、デバイスは約50KBのRAMしか使用せずに537,000ドメインのブロックリストを維持できます。一方、ドメイン文字列を直接格納した場合は約2.5MBのRAMが必要となります。システムはソートされたハッシュテーブルに対する二分探索によってルックアップを行い、プロジェクトドキュメントで報告されているように約10msのクエリ解決時間を達成しています。

その核では、デバイスはUDP DNS sinkholeとして機能します。DNSクエリが到着すると、ドメインを抽出し、サブドマインマッチングのため親サフィックスを含むFNV-1aハッシュを計算し、フラッシュに格納されたテーブルで二分探索を行います。一致した場合は0.0.0.0を返してドメインを効果的にブロックし、不一致の場合は上流のDNSリゾルバーにクエリを転送して応答を中継します。プロジェクトにはmDNS経由でhttp://c3adblock.localからアクセス可能な管理用ウェブダッシュボードが含まれており、これによりユーザーは統計情報を閲覧し、特定のクライアントをブロックし、カスタムブロックドメインを追加し、ブラウザインターフェイスを介してブロックリストおよびファームウェアのオーバーザーエア更新を設定することができます。

ESP32-C3 AdblockのDNS sinkhole、ハッシュテーブル、ウェブダッシュボードを示す図
ESP32-C3 Adblockシステムの概要:UDP DNS sinkhole、フラッシュメモリ内のハッシュベースのブロックリスト、管理用ウェブダッシュボードgithub.com

この図は、記事で説明されているUDP DNS sinkholeのメカニズムとウェブダッシュボードを示し、ESP32-C3アドブロッカーがDNSクエリをどのように処理し、ユーザー管理を提供するかを示しています。

革新的なアプローチにもかかわらず、このプロジェクトはハッシュベースのブロック方法に内在する制限を認めています。40ビットハッシュで537,000ドメインを格納する場合、ブロックされていないドメインがブロック済みドメインとハッシュが衝突し、偽陽性(過剰ブロック)が発生する可能性が約1つあると見込まれます。ドキュメントでは、ブロック済みドメイン間の衝突はどちらもブロックされるべきであるため問題とならないと指摘されていますが、ウェブダッシュボードの/unblock API以外での偽陽性衝突の解決メカニズムについては詳細が示されていません。さらに、デバイスの技術的制約により、ブロックリストのコンパイル時にスキップされる正規表現パターンやワイルドカードなどの高度なブロックルールを実装することはできず、これによりフィルタリング機能がより高度なソリューションと比較して制限されます。