mirror of
https://github.com/vacp2p/vac.dev-experimental-old.git
synced 2025-02-27 12:30:32 +00:00
629 lines
27 KiB
HTML
629 lines
27 KiB
HTML
<!DOCTYPE html>
|
||
<html class="h-full" lang="en-US">
|
||
<head>
|
||
|
||
<title>Vac - DNS Based Discovery</title>
|
||
|
||
|
||
<meta charset="utf-8" />
|
||
<meta http-equiv="x-ua-compatible" content="ie=edge" />
|
||
<title>Vac</title>
|
||
<meta name="viewport" content="width=device-width, initial-scale=1" />
|
||
|
||
<link
|
||
rel="shortcut icon"
|
||
href="/assets/img/favicon.png"
|
||
type="image/png"
|
||
/>
|
||
|
||
<link rel="preconnect" href="https://fonts.googleapis.com" />
|
||
<link
|
||
href="https://fonts.googleapis.com/css2?family=Open+Sans:ital,wght@0,400;0,600;0,700;1,400;1,600&display=swap"
|
||
rel="stylesheet"
|
||
/>
|
||
<link rel="stylesheet" href="/assets/css/style.css" />
|
||
</head>
|
||
|
||
<body class="h-full flex flex-col">
|
||
<div
|
||
class="flex-grow container max-w-screen-xl mx-auto px-5 md:px-12 lg:pt-6"
|
||
>
|
||
<header>
|
||
<div class="container max-w-screen-xl sm:border-b">
|
||
<div
|
||
class="
|
||
nav-section
|
||
flex
|
||
justify-between
|
||
items-center
|
||
py-3
|
||
md:py-5
|
||
lg:py-10
|
||
"
|
||
>
|
||
<div class="logo md:pr-8 l:p-0">
|
||
<a href="/"
|
||
><img src="/assets/img/logo.png"
|
||
/></a>
|
||
</div>
|
||
<div class="flex justify-between items-center w-9/12">
|
||
<div class="burger block sm:hidden z-50">
|
||
<button
|
||
class="
|
||
burger__button burger__button--open
|
||
fixed
|
||
top-2
|
||
right-5
|
||
w-12
|
||
h-12
|
||
"
|
||
type="button"
|
||
aria-label="Mobile menu button"
|
||
>
|
||
<img
|
||
class="burger__icon"
|
||
src="/assets/img/burger.svg"
|
||
alt="Open menu button"
|
||
/>
|
||
</button>
|
||
<button
|
||
class="
|
||
burger__button burger__button--close
|
||
hidden
|
||
fixed
|
||
top-2
|
||
right-5
|
||
w-12
|
||
h-12
|
||
"
|
||
type="button"
|
||
aria-label="Close mobile menu button"
|
||
>
|
||
<img
|
||
class="burger__icon burger__icon--close"
|
||
src="/assets/img/close.svg"
|
||
alt="Close menu button"
|
||
/>
|
||
</button>
|
||
</div>
|
||
|
||
<nav class="nav max-w-screen-xm md:max-w-screen-sl container">
|
||
<ul
|
||
class="
|
||
nav__list
|
||
hidden
|
||
sm:flex
|
||
justify-between
|
||
container
|
||
text-xs
|
||
font-semibold
|
||
md:pr-8
|
||
l:p-0
|
||
"
|
||
>
|
||
<li class="hover:opacity-50">
|
||
|
||
<a class="nav__link" href="/#work">Work</a>
|
||
|
||
</li>
|
||
<li class="hover:opacity-50">
|
||
|
||
<a class="nav__link" href="/#about">About</a>
|
||
|
||
</li>
|
||
<li class="hover:opacity-50">
|
||
|
||
<a class="nav__link" href="/#join">Join VAC</a>
|
||
|
||
</li>
|
||
<li class="hover:opacity-50">
|
||
|
||
<a class="nav__link" href="/research-log">Research log</a>
|
||
|
||
</li>
|
||
<li class="hover:opacity-50">
|
||
|
||
<a class="nav__link" href="/media">Media</a>
|
||
|
||
</li>
|
||
<li class="hover:opacity-50">
|
||
|
||
<a href="https://specs.vac.dev" target="_blank" rel="noopener noreferrer"
|
||
>Specs</a
|
||
>
|
||
|
||
</li>
|
||
<li class="hover:opacity-50">
|
||
|
||
<a href="https://forum.vac.dev/" target="_blank" rel="noopener noreferrer"
|
||
>Forum</a
|
||
>
|
||
|
||
</li>
|
||
|
||
</ul>
|
||
</nav>
|
||
|
||
<ul class="social items-center hidden md:flex">
|
||
<li class="pr-5">
|
||
<a href="https://twitter.com/vacp2p" target="_blank" rel="noopener noreferrer"
|
||
><svg
|
||
width="25"
|
||
height="21"
|
||
viewBox="0 0 25 21"
|
||
fill="none"
|
||
xmlns="http://www.w3.org/2000/svg"
|
||
class="hover:opacity-50"
|
||
>
|
||
<path
|
||
d="M24.8872 3.04499C23.9872 3.43499 23.0572 3.70498 22.0672 3.82499C23.0872 3.22498 23.8672 2.26499 24.2272 1.09499C23.2672 1.66499 22.2172 2.05499 21.1072 2.29499C20.2072 1.33499 18.9172 0.734985 17.5072 0.734985C14.7772 0.734985 12.5872 2.95499 12.5872 5.65499C12.5872 6.04499 12.6172 6.40498 12.7072 6.76498C8.62721 6.58498 5.02721 4.60498 2.59721 1.63499C0.857207 4.75498 2.80721 7.33499 4.09721 8.20499C3.31721 8.20499 2.53721 7.96499 1.87721 7.60499C1.87721 10.035 3.58721 12.045 5.80721 12.495C5.32721 12.645 4.24721 12.735 3.58721 12.585C4.21721 14.535 6.04721 15.975 8.17721 16.005C6.49721 17.325 4.03721 18.375 0.887207 18.045C3.07721 19.455 5.65721 20.265 8.44721 20.265C17.5072 20.265 22.4272 12.765 22.4272 6.28499C22.4272 6.07499 22.4272 5.86499 22.3972 5.65499C23.4172 4.90499 24.2572 4.03499 24.8872 3.04499Z"
|
||
fill="#151512"
|
||
/>
|
||
</svg>
|
||
</a>
|
||
</li>
|
||
<li class="pr-5">
|
||
<a href="https://github.com/vacp2p" target="_blank" rel="noopener noreferrer"
|
||
><svg
|
||
width="26"
|
||
height="25"
|
||
viewBox="0 0 26 25"
|
||
fill="none"
|
||
xmlns="http://www.w3.org/2000/svg"
|
||
class="hover:opacity-50"
|
||
>
|
||
<path
|
||
d="M12.8857 0.856567C6.26021 0.856567 0.915339 6.20154 0.950043 12.7951C0.9778 18.0687 4.43935 22.5427 9.21766 24.1227C9.81824 24.2327 10.0353 23.864 10.0336 23.5474C10.0321 23.2635 10.0177 22.5129 10.0065 21.5171C6.67274 22.238 5.95552 19.9163 5.95552 19.9163C5.40376 18.5369 4.61433 18.1698 4.61433 18.1698C3.51994 17.4296 4.69151 17.4444 4.69151 17.4444C5.89646 17.5291 6.53549 18.6751 6.53549 18.6751C7.61609 20.4989 9.35182 19.9727 10.0342 19.6665C10.1382 18.8951 10.4459 18.3689 10.7878 18.0702C8.12222 17.7684 5.31483 16.7443 5.29076 12.1708C5.2839 10.8672 5.74629 9.80152 6.50989 8.96619C6.3838 8.66445 5.96641 7.45009 6.61027 5.80766C6.61027 5.80766 7.61658 5.4866 9.9167 7.03094C10.8723 6.76636 11.8976 6.63408 12.9191 6.62962C13.9376 6.63556 14.9658 6.76636 15.9257 7.03242C18.2081 5.48809 19.2163 5.80914 19.2163 5.80914C19.8789 7.45306 19.4743 8.66594 19.3529 8.96767C20.1268 9.80301 20.5959 10.8687 20.6028 12.1723C20.6269 16.7577 17.8272 17.767 15.1558 18.0628C15.5882 18.4314 15.976 19.1597 15.9819 20.273C15.9903 21.8693 15.9821 23.1565 15.9841 23.5474C15.9858 23.867 16.2038 24.2386 16.8122 24.1212C21.5663 22.5397 24.9778 18.0672 24.95 12.7951C24.9153 6.20154 19.5142 0.856567 12.8857 0.856567Z"
|
||
fill="#151512"
|
||
/>
|
||
</svg>
|
||
</a>
|
||
</li>
|
||
<li>
|
||
<a
|
||
href="https://discord.gg/PQFdubGt6d"
|
||
target="_blank"
|
||
rel="noopener noreferrer"
|
||
><svg
|
||
width="25"
|
||
height="21"
|
||
viewBox="0 0 25 21"
|
||
fill="none"
|
||
xmlns="http://www.w3.org/2000/svg"
|
||
class="hover:opacity-50"
|
||
>
|
||
<path
|
||
d="M22.7861 9.04256C21.8482 5.74455 20.7799 4.04048 20.7627 4.00991C20.7017 3.93459 19.189 2.104 15.5271 0.75L15.0353 2.0764C16.7774 2.72057 18.0116 3.50643 18.6899 4.01419C16.6599 3.40408 14.2431 3.03041 12.1008 3.03041C9.95851 3.03041 7.53775 3.40408 5.50128 4.01419C6.18496 3.50648 7.42744 2.72057 9.17631 2.0764L8.69846 0.75C5.02238 2.104 3.49044 3.93459 3.42863 4.00991C3.41108 4.04048 2.32479 5.74455 1.35221 9.04256C0.414855 12.2208 0.0415214 16.7045 0.027872 16.8843C0.109225 17.0131 1.97891 20.25 7.12077 20.25L8.43406 18.3536C6.97595 17.964 5.58693 17.3357 4.31689 16.4832L5.10228 15.3069C7.15122 16.6822 9.54509 17.4092 12.0251 17.4092C14.5051 17.4092 16.9067 16.6822 18.9701 15.3069L19.7431 16.4832C18.4641 17.3357 17.0684 17.964 15.6062 18.3536L16.8995 20.25C22.0414 20.25 23.9452 17.0131 24.0279 16.8843C24.0161 16.7045 23.69 12.2208 22.7861 9.04256ZM8.79853 12.7392H7.39228L7.40468 10.3841H8.81093L8.79853 12.7392ZM16.7071 12.7392H15.3008L15.3132 10.3841H16.7195L16.7071 12.7392Z"
|
||
fill="#151512"
|
||
/>
|
||
</svg>
|
||
</a>
|
||
</li>
|
||
|
||
</ul>
|
||
</div>
|
||
|
||
<div
|
||
class="
|
||
overlay
|
||
container
|
||
max-w-screen-sm
|
||
w-full
|
||
hidden
|
||
sm:hidden
|
||
fixed
|
||
top-0
|
||
right-0
|
||
h-screen
|
||
bg-black bg-opacity-40
|
||
z-30
|
||
"
|
||
>
|
||
<nav
|
||
class="
|
||
nav-mobile
|
||
hidden
|
||
fixed
|
||
top-0
|
||
right-0
|
||
flex flex-col
|
||
justify-between
|
||
items-center
|
||
pt-14
|
||
px-12
|
||
pb-5
|
||
bg-white
|
||
w-9/12
|
||
h-3/4
|
||
z-40
|
||
"
|
||
>
|
||
<ul
|
||
class="
|
||
nav__list
|
||
flex flex-col flex-1
|
||
justify-between
|
||
items-center
|
||
container
|
||
box-content
|
||
w-32
|
||
h-auto
|
||
max-h-nav
|
||
text-xs
|
||
font-normal
|
||
"
|
||
>
|
||
<li class="hover:opacity-50">
|
||
|
||
<a class="nav__link" href="/#work">Work</a>
|
||
|
||
</li>
|
||
<li class="hover:opacity-50">
|
||
|
||
<a class="nav__link" href="/#about">About</a>
|
||
|
||
</li>
|
||
<li class="hover:opacity-50">
|
||
|
||
<a class="nav__link" href="/#join">Join VAC</a>
|
||
|
||
</li>
|
||
<li class="hover:opacity-50">
|
||
|
||
<a class="nav__link" href="/research-log">Research log</a>
|
||
|
||
</li>
|
||
<li class="hover:opacity-50">
|
||
|
||
<a class="nav__link" href="/media">Media</a>
|
||
|
||
</li>
|
||
<li class="hover:opacity-50">
|
||
|
||
<a href="https://specs.vac.dev" target="_blank" rel="noopener noreferrer"
|
||
>Specs</a
|
||
>
|
||
|
||
</li>
|
||
<li class="hover:opacity-50">
|
||
|
||
<a href="https://forum.vac.dev/" target="_blank" rel="noopener noreferrer"
|
||
>Forum</a
|
||
>
|
||
|
||
</li>
|
||
|
||
</ul>
|
||
<ul class="social items-center flex mt-8">
|
||
<li class="pr-5">
|
||
<a href="https://twitter.com/vacp2p" target="_blank" rel="noopener noreferrer"
|
||
><svg
|
||
width="25"
|
||
height="21"
|
||
viewBox="0 0 25 21"
|
||
fill="none"
|
||
xmlns="http://www.w3.org/2000/svg"
|
||
class="hover:opacity-50"
|
||
>
|
||
<path
|
||
d="M24.8872 3.04499C23.9872 3.43499 23.0572 3.70498 22.0672 3.82499C23.0872 3.22498 23.8672 2.26499 24.2272 1.09499C23.2672 1.66499 22.2172 2.05499 21.1072 2.29499C20.2072 1.33499 18.9172 0.734985 17.5072 0.734985C14.7772 0.734985 12.5872 2.95499 12.5872 5.65499C12.5872 6.04499 12.6172 6.40498 12.7072 6.76498C8.62721 6.58498 5.02721 4.60498 2.59721 1.63499C0.857207 4.75498 2.80721 7.33499 4.09721 8.20499C3.31721 8.20499 2.53721 7.96499 1.87721 7.60499C1.87721 10.035 3.58721 12.045 5.80721 12.495C5.32721 12.645 4.24721 12.735 3.58721 12.585C4.21721 14.535 6.04721 15.975 8.17721 16.005C6.49721 17.325 4.03721 18.375 0.887207 18.045C3.07721 19.455 5.65721 20.265 8.44721 20.265C17.5072 20.265 22.4272 12.765 22.4272 6.28499C22.4272 6.07499 22.4272 5.86499 22.3972 5.65499C23.4172 4.90499 24.2572 4.03499 24.8872 3.04499Z"
|
||
fill="#151512"
|
||
/>
|
||
</svg>
|
||
</a>
|
||
</li>
|
||
<li class="pr-5">
|
||
<a href="https://github.com/vacp2p" target="_blank" rel="noopener noreferrer"
|
||
><svg
|
||
width="26"
|
||
height="25"
|
||
viewBox="0 0 26 25"
|
||
fill="none"
|
||
xmlns="http://www.w3.org/2000/svg"
|
||
class="hover:opacity-50"
|
||
>
|
||
<path
|
||
d="M12.8857 0.856567C6.26021 0.856567 0.915339 6.20154 0.950043 12.7951C0.9778 18.0687 4.43935 22.5427 9.21766 24.1227C9.81824 24.2327 10.0353 23.864 10.0336 23.5474C10.0321 23.2635 10.0177 22.5129 10.0065 21.5171C6.67274 22.238 5.95552 19.9163 5.95552 19.9163C5.40376 18.5369 4.61433 18.1698 4.61433 18.1698C3.51994 17.4296 4.69151 17.4444 4.69151 17.4444C5.89646 17.5291 6.53549 18.6751 6.53549 18.6751C7.61609 20.4989 9.35182 19.9727 10.0342 19.6665C10.1382 18.8951 10.4459 18.3689 10.7878 18.0702C8.12222 17.7684 5.31483 16.7443 5.29076 12.1708C5.2839 10.8672 5.74629 9.80152 6.50989 8.96619C6.3838 8.66445 5.96641 7.45009 6.61027 5.80766C6.61027 5.80766 7.61658 5.4866 9.9167 7.03094C10.8723 6.76636 11.8976 6.63408 12.9191 6.62962C13.9376 6.63556 14.9658 6.76636 15.9257 7.03242C18.2081 5.48809 19.2163 5.80914 19.2163 5.80914C19.8789 7.45306 19.4743 8.66594 19.3529 8.96767C20.1268 9.80301 20.5959 10.8687 20.6028 12.1723C20.6269 16.7577 17.8272 17.767 15.1558 18.0628C15.5882 18.4314 15.976 19.1597 15.9819 20.273C15.9903 21.8693 15.9821 23.1565 15.9841 23.5474C15.9858 23.867 16.2038 24.2386 16.8122 24.1212C21.5663 22.5397 24.9778 18.0672 24.95 12.7951C24.9153 6.20154 19.5142 0.856567 12.8857 0.856567Z"
|
||
fill="#151512"
|
||
/>
|
||
</svg>
|
||
</a>
|
||
</li>
|
||
<li>
|
||
<a
|
||
href="https://discord.gg/PQFdubGt6d"
|
||
target="_blank"
|
||
rel="noopener noreferrer"
|
||
><svg
|
||
width="25"
|
||
height="21"
|
||
viewBox="0 0 25 21"
|
||
fill="none"
|
||
xmlns="http://www.w3.org/2000/svg"
|
||
class="hover:opacity-50"
|
||
>
|
||
<path
|
||
d="M22.7861 9.04256C21.8482 5.74455 20.7799 4.04048 20.7627 4.00991C20.7017 3.93459 19.189 2.104 15.5271 0.75L15.0353 2.0764C16.7774 2.72057 18.0116 3.50643 18.6899 4.01419C16.6599 3.40408 14.2431 3.03041 12.1008 3.03041C9.95851 3.03041 7.53775 3.40408 5.50128 4.01419C6.18496 3.50648 7.42744 2.72057 9.17631 2.0764L8.69846 0.75C5.02238 2.104 3.49044 3.93459 3.42863 4.00991C3.41108 4.04048 2.32479 5.74455 1.35221 9.04256C0.414855 12.2208 0.0415214 16.7045 0.027872 16.8843C0.109225 17.0131 1.97891 20.25 7.12077 20.25L8.43406 18.3536C6.97595 17.964 5.58693 17.3357 4.31689 16.4832L5.10228 15.3069C7.15122 16.6822 9.54509 17.4092 12.0251 17.4092C14.5051 17.4092 16.9067 16.6822 18.9701 15.3069L19.7431 16.4832C18.4641 17.3357 17.0684 17.964 15.6062 18.3536L16.8995 20.25C22.0414 20.25 23.9452 17.0131 24.0279 16.8843C24.0161 16.7045 23.69 12.2208 22.7861 9.04256ZM8.79853 12.7392H7.39228L7.40468 10.3841H8.81093L8.79853 12.7392ZM16.7071 12.7392H15.3008L15.3132 10.3841H16.7195L16.7071 12.7392Z"
|
||
fill="#151512"
|
||
/>
|
||
</svg>
|
||
</a>
|
||
</li>
|
||
|
||
</ul>
|
||
</nav>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
</header>
|
||
|
||
|
||
<main class="bg-white text-black flex flex-col"><section
|
||
class="
|
||
container
|
||
max-w-screen-xl
|
||
flex flex-col
|
||
sm:flex-row
|
||
pt-10
|
||
pb-0
|
||
md:pb-10
|
||
lg:pb-0
|
||
"
|
||
>
|
||
<div
|
||
class="
|
||
heading-block
|
||
w-full
|
||
sm:w-2/12
|
||
lg:w-3/12
|
||
flex
|
||
lg:justify-center
|
||
items-start
|
||
pb-3
|
||
sm:pb-0
|
||
"
|
||
>
|
||
<a class="link link--back" href="/research-log/">Back</a>
|
||
</div>
|
||
<div
|
||
class="info-block w-full sm:w-10/12 lg:w-9/12 pb-5 sm:pb-10 overflow-hidden"
|
||
>
|
||
<div class="post mb-10">
|
||
<h1 class="text-xl md:text-xxl mb-5 sm:max-w-md lg:max-w-2xl">
|
||
DNS Based Discovery
|
||
</h1>
|
||
<div>
|
||
<span class="text-s lg:text-base">
|
||
07 Feb 2020 • by
|
||
</span>
|
||
<a
|
||
href="/authors/dean"
|
||
class="text-s lg:text-base font-bold hover:underline"
|
||
>dean</a
|
||
>
|
||
</div>
|
||
</div>
|
||
<div class="post__content"><p>Discovery in p2p networks is the process of how nodes find each other and specific resources they are looking for. Popular discovery protocols, such as <a href="https://pdos.csail.mit.edu/~petar/papers/maymounkov-kademlia-lncs.pdf">Kademlia</a> which utilizes a <a href="https://en.wikipedia.org/wiki/Distributed_hash_table">distributed hash table</a> or DHT, are highly inefficient for resource restricted devices. These methods use short connection windows, and it is quite battery intensive to keep establishing connections. Additionally, we cannot expect a mobile phone for example to synchronize an entire DHT using cellular data.</p>
|
||
|
||
<p>Another issue is how we do the initial bootstrapping. In other words, how does a client find its first node to then discover the rest of the network? In most applications, including Status right now, this is done with a <a href="https://github.com/status-im/specs/blob/master/status-client-spec.md#bootstrapping">static list of nodes</a> that a client can connect to.</p>
|
||
|
||
<p>In summary, we have a static list that provides us with nodes we can connect to which then allows us to discover the rest of the network using something like Kademlia. But what we need is something that can easily be mutated, guarantees a certain amount of security, and is efficient for resource restricted devices. Ideally our solution would also be robust and scalable.</p>
|
||
|
||
<p>How do we do this?</p>
|
||
|
||
<p><a href="https://eips.ethereum.org/EIPS/eip-1459">EIP 1459: Node Discovery via DNS</a>, which is one of the strategies we are using for discovering waku nodes. <a href="https://eips.ethereum.org/EIPS/eip-1459">EIP-1459</a> is a DNS-based discovery protocol that stores <a href="https://en.wikipedia.org/wiki/Merkle_tree">merkle trees</a> in DNS records which contain connection information for nodes.</p>
|
||
|
||
<p><em>Waku is our fork of Whisper. Oskar recently wrote an <a href="https://vac.dev/fixing-whisper-with-waku">entire post</a> explaining it. In short, Waku is our method of fixing the shortcomings of Whisper in a more iterative fashion. You can find the specification <a href="https://specs.vac.dev/specs/waku/waku.html">here</a></em></p>
|
||
|
||
<p>DNS-based methods for bootstrapping p2p networks are quite popular. Even Bitcoin uses it, but it uses a concept called DNS seeds, which are just DNS servers that are configured to return a list of randomly selected nodes from the network upon being queried. This means that although these seeds are hardcoded in the client, the IP addresses of actual nodes do not have to be.</p>
|
||
|
||
<div class="language-console highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="gp">></span><span class="w"> </span>dig dnsseed.bluematt.me +short
|
||
<span class="go">129.226.73.12
|
||
107.180.78.111
|
||
169.255.56.123
|
||
91.216.149.28
|
||
85.209.240.91
|
||
66.232.124.232
|
||
207.55.53.96
|
||
86.149.241.168
|
||
193.219.38.57
|
||
190.198.210.139
|
||
74.213.232.234
|
||
158.181.226.33
|
||
176.99.2.207
|
||
202.55.87.45
|
||
37.205.10.3
|
||
90.133.4.73
|
||
176.191.182.3
|
||
109.207.166.232
|
||
45.5.117.59
|
||
178.211.170.2
|
||
160.16.0.30
|
||
</span></code></pre></div></div>
|
||
|
||
<p>The above displays the result of querying on of these DNS seeds. All the nodes are stored as <a href="https://simpledns.plus/help/a-records"><code class="language-plaintext highlighter-rouge">A</code> records</a> for the given domain name. This is quite a simple solution which Bitcoin almost soley relies on since removing the <a href="https://en.bitcoin.it/wiki/Network#IRC">IRC bootstrapping method in v0.8.2</a>.</p>
|
||
|
||
<p>What makes this DNS based discovery useful? It allows us to have a mutable list of bootstrap nodes without needing to ship a new version of the client every time a list is mutated. It also allows for a more lightweight method of discovering nodes, something very important for resource restricted devices.</p>
|
||
|
||
<p>Additionally, DNS provides us with a robust and scalable infrastructure. This is due to its hierarchical architecture. This hierarchical architecture also already makes it distributed such that the failure of one DNS server does not result in us no longer being able to resolve our name.</p>
|
||
|
||
<p>As with every solution though, there is a trade-off. By storing the list in DNS name an adversary would simply need to censor the DNS records for a specific name. This would prevent any new client trying to join the network from being able to do so.</p>
|
||
|
||
<p>One thing you notice when looking at <a href="https://eips.ethereum.org/EIPS/eip-1459">EIP-1459</a> is that it is a lot more technically complex than Bitcoin’s way of doing this. So if Bitcoin uses this simple method and has proven that it works, why did we need a new method?</p>
|
||
|
||
<p>There are multiple reasons, but the main one is <strong>security</strong>. In the Bitcoin example, an attacker could create a new list and no one querying would be able to tell. This is however mitigated in <a href="https://eips.ethereum.org/EIPS/eip-1459">EIP-1459</a> where we can verify the integrity of the entire returned list by storing an entire merkle tree in the DNS records.</p>
|
||
|
||
<p>Let’s dive into this. Firstly, a client that is using these DNS records for discovery must know the public key corresponding to the private key controlled by the entity creating the list. This is because the entire list is signed using a secp256k1 private key, giving the client the ability to authenticate the list and know that it has not been tampered with by some external party.</p>
|
||
|
||
<p>So that already makes this a lot safer than the method Bitcoin uses. But how are these lists even stored? As previously stated they are stored using <strong>merkle trees</strong> as follows:</p>
|
||
|
||
<ul>
|
||
<li>
|
||
<p>The root of the tree is stored in a <a href="https://simpledns.plus/help/txt-records"><code class="language-plaintext highlighter-rouge">TXT</code> record</a>, this record contains the tree’s root hash, a sequence number which is incremented every time the tree is updated and a signature as stated above.</p>
|
||
|
||
<p>Additionally, there is also a root hash to a second tree called a <strong>link tree</strong>, it contains the information to different lists. This link tree allows us to delegate trust and build a graph of multiple merkle trees stored across multiple DNS names.</p>
|
||
|
||
<p>The sequence number ensures that an attacker cannot replace a tree with an older version because when a client reads the tree, they should ensure that the sequence number is greater than the last synchronized version.</p>
|
||
</li>
|
||
<li>
|
||
<p>Using the root hash for the tree, we can find the merkle tree’s first branch, the branch is also stored in a <code class="language-plaintext highlighter-rouge">TXT</code> record. The branch record contains all the hashes of the branch’s leafs.</p>
|
||
</li>
|
||
<li>
|
||
<p>Once a client starts reading all the leafs, they can find one of two things: either a new branch record leading them further down the tree or an Ethereum Name Records (ENR) which means they now have the address of a node to connect to! To learn more about ethereum node records you can have a look at <a href="https://eips.ethereum.org/EIPS/eip-778">EIP-778</a>, or read a short blog post I wrote explaining them <a href="https://dean.eigenmann.me/blog/2020/01/21/network-addresses-in-ethereum/#enr">here</a>.</p>
|
||
</li>
|
||
</ul>
|
||
|
||
<p>Below is the zone file taken from the <a href="https://eips.ethereum.org/EIPS/eip-1459">EIP-1459</a>, displaying how this looks in practice.</p>
|
||
|
||
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>; name ttl class type content
|
||
@ 60 IN TXT enrtree-root:v1 e=JWXYDBPXYWG6FX3GMDIBFA6CJ4 l=C7HRFPF3BLGF3YR4DY5KX3SMBE seq=1 sig=o908WmNp7LibOfPsr4btQwatZJ5URBr2ZAuxvK4UWHlsB9sUOTJQaGAlLPVAhM__XJesCHxLISo94z5Z2a463gA
|
||
C7HRFPF3BLGF3YR4DY5KX3SMBE 86900 IN TXT enrtree://AM5FCQLWIZX2QFPNJAP7VUERCCRNGRHWZG3YYHIUV7BVDQ5FDPRT2@morenodes.example.org
|
||
JWXYDBPXYWG6FX3GMDIBFA6CJ4 86900 IN TXT enrtree-branch:2XS2367YHAXJFGLZHVAWLQD4ZY,H4FHT4B454P6UXFD7JCYQ5PWDY,MHTDO6TMUBRIA2XWG5LUDACK24
|
||
2XS2367YHAXJFGLZHVAWLQD4ZY 86900 IN TXT enr:-HW4QOFzoVLaFJnNhbgMoDXPnOvcdVuj7pDpqRvh6BRDO68aVi5ZcjB3vzQRZH2IcLBGHzo8uUN3snqmgTiE56CH3AMBgmlkgnY0iXNlY3AyNTZrMaECC2_24YYkYHEgdzxlSNKQEnHhuNAbNlMlWJxrJxbAFvA
|
||
H4FHT4B454P6UXFD7JCYQ5PWDY 86900 IN TXT enr:-HW4QAggRauloj2SDLtIHN1XBkvhFZ1vtf1raYQp9TBW2RD5EEawDzbtSmlXUfnaHcvwOizhVYLtr7e6vw7NAf6mTuoCgmlkgnY0iXNlY3AyNTZrMaECjrXI8TLNXU0f8cthpAMxEshUyQlK-AM0PW2wfrnacNI
|
||
MHTDO6TMUBRIA2XWG5LUDACK24 86900 IN TXT enr:-HW4QLAYqmrwllBEnzWWs7I5Ev2IAs7x_dZlbYdRdMUx5EyKHDXp7AV5CkuPGUPdvbv1_Ms1CPfhcGCvSElSosZmyoqAgmlkgnY0iXNlY3AyNTZrMaECriawHKWdDRk2xeZkrOXBQ0dfMFLHY4eENZwdufn1S1o
|
||
</code></pre></div></div>
|
||
|
||
<p>All of this has already been introduced into go-ethereum with the pull request <a href="https://github.com/ethereum/go-ethereum/pull/20094">#20094</a>, created by Felix Lange. There’s a lot of tooling around it that already exists too which is really cool. So if your project is written in Golang and wants to use this, it’s relatively simple! Additionally, here’s a proof of concept that shows what this might look like with libp2p on <a href="https://github.com/decanus/dns-discovery">github</a>.</p>
|
||
|
||
<p>I hope this was a helpful explainer into DNS based discovery, and shows <a href="https://eips.ethereum.org/EIPS/eip-1459">EIP-1459</a>’s benefits over more traditional DNS-based discovery schemes.</p>
|
||
</div>
|
||
</div>
|
||
</section>
|
||
</main>
|
||
</div>
|
||
<footer class="footer bg-black flex flex-shrink-0 justify-center">
|
||
<div
|
||
class="
|
||
container
|
||
max-w-screen-xl
|
||
flex
|
||
sl:justify-between
|
||
lm:justify-start
|
||
p-5
|
||
pb-10
|
||
md:px-12 md:pt-5
|
||
lg:pt-10
|
||
"
|
||
>
|
||
<div class="logo mr-10 sm:mr-0 sm:w-2/12 lg:w-3/12">
|
||
<a href="/"
|
||
><img
|
||
src="/assets/img/logo.png"
|
||
alt="Vac logo"
|
||
class="w-9 h-11"
|
||
/></a>
|
||
</div>
|
||
|
||
<div
|
||
class="flex flex-col xm:flex-row xm:justify-between sm:w-10/12 lg:w-9/12"
|
||
>
|
||
<p
|
||
class="
|
||
hidden
|
||
ml:inline-block ml:mr-10
|
||
w-52
|
||
text-base text-white
|
||
opacity-75
|
||
lm:mr-32
|
||
"
|
||
>
|
||
VAC researches peer-to-peer, private, censorship resistant communication
|
||
</p>
|
||
<nav class="flex max-w-xs mr-0 xm:mr-5 l:mr-32 mb-5 sm:mb-0">
|
||
<div class="flex">
|
||
<div class="flex flex-col mr-5 sm:mr-10 sl:mr-14">
|
||
<p class="text-base text-white mb-5 lg:mb-4">Research</p>
|
||
<ul>
|
||
<li class="text-xxs lg:text-base text-white opacity-75 hover:opacity-50 mb-5">
|
||
<a href="https://status.im/" target="_blank" rel="noopener noreferrer"
|
||
>Log</a
|
||
>
|
||
</li>
|
||
<li class="text-xxs lg:text-base text-white opacity-75 hover:opacity-50 mb-5">
|
||
<a href="https://forum.vac.dev/" target="_blank" rel="noopener noreferrer"
|
||
>Forum</a
|
||
>
|
||
</li>
|
||
<li class="text-xxs lg:text-base text-white opacity-75 hover:opacity-50 mb-5">
|
||
<a href="https://status.im/" target="_blank" rel="noopener noreferrer"
|
||
>Media</a
|
||
>
|
||
</li>
|
||
<li class="text-xxs lg:text-base text-white opacity-75 hover:opacity-50 mb-5">
|
||
<a href="https://jobs.status.im/?search=Vac" target="_blank" rel="noopener noreferrer"
|
||
>Careers</a
|
||
>
|
||
</li>
|
||
|
||
</ul>
|
||
</div>
|
||
<div class="flex flex-col sl:mr-14">
|
||
<p class="text-base text-white mb-5 lg:mb-4 mr-5">Socials</p>
|
||
<ul>
|
||
<li class="text-xxs lg:text-base text-white opacity-75 hover:opacity-50 mb-5">
|
||
<a href="https://twitter.com/vacp2p" target="_blank" rel="noopener noreferrer"
|
||
>Twitter</a
|
||
>
|
||
</li>
|
||
<li class="text-xxs lg:text-base text-white opacity-75 hover:opacity-50 mb-5">
|
||
<a href="https://discord.gg/PQFdubGt6d" target="_blank" rel="noopener noreferrer"
|
||
>Discord</a
|
||
>
|
||
</li>
|
||
<li class="text-xxs lg:text-base text-white opacity-75 hover:opacity-50 mb-5">
|
||
<a href="https://t.me/vacp2p" target="_blank" rel="noopener noreferrer"
|
||
>Telegram</a
|
||
>
|
||
</li>
|
||
|
||
</ul>
|
||
</div>
|
||
</div></nav>
|
||
|
||
<div class="flex flex-col w-52">
|
||
<h3 class="text-base text-white mb-5">Signup for updates</h3>
|
||
<form action="" class="footer__form">
|
||
<div class="flex items-center w-full">
|
||
<input
|
||
class="
|
||
text-xs text-white
|
||
w-full
|
||
bg-black
|
||
border-b border-white
|
||
rounded-none
|
||
mr-2
|
||
focus:outline-none
|
||
placeholder-white placeholder-opacity-50
|
||
"
|
||
type="email"
|
||
placeholder="your email"
|
||
required
|
||
/>
|
||
<button
|
||
class="
|
||
h-10
|
||
w-10
|
||
bg-arrowWhite bg-auto bg-no-repeat bg-left
|
||
focus:outline-none
|
||
hover:opacity-50
|
||
"
|
||
type="submit"
|
||
></button>
|
||
</div>
|
||
</form>
|
||
<p
|
||
class="footer__confirm text-base italic text-white opacity-75 hidden"
|
||
>
|
||
You signed up! Check your e-mail
|
||
</p>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
</footer>
|
||
<script src="/assets/js/main.js"></script>
|
||
<script src="/assets/js/smooth-scroll.js"></script>
|
||
|
||
</body>
|
||
</html>
|