Статья актуальная для версий Yggdrasil 0.3.16 и ниже. Об изменениях в Yggdrasil 0.4 читайте статью "Yggdrasil Network 0.4 — Скачок в развитии защищенной самоорганизующейся сети".
Абонентский IP – логический адрес пользователя в сети. В малых сетях обычно используются статические адреса, прописанные вручную, а в более массовых – автоматическое назначение через DHCP. За каждый сегмент локальной или глобальной сети отвечает некое лицо или организация, в чьи обязанности входит управление маршрутизацией и контроль IP-адресов.
В большинстве случаев произвольная смена адреса, выданного администратором, не несет абоненту практической пользы, т.к. может отсечь его от сети. Более опытный пользователь знает про коллизию адресов и может этим злоупотребить: назначить своему устройству уже занятый адрес, тем самым лишив изначального хозяина IP-адреса возможности использовать сеть. В обычных сетях за подобным хулиганством бдит администратор, а что происходит в масштабируемых сетях с автоматической маршрутизацией, где контроль за пользователями вовсе отсутствует? Разберем решение этой задачи в Yggdrasil Network – масштабируемой меш-сети с оконечным шифрованием и IPv6-маршрутизацией в сети 200::/7.
Никакого мошенничества
Так как сеть имеет сквозное шифрование от абонента до абонента, очевидно наличие ключей. В Yggdrasil используется шифрование на эллиптических кривых – x25519, подразумевающее связку публичного и приватного ключа. Публичный ключ распространяется свободно, а приватный надежно хранится и служит для расшифровки.
Первый байт «02» адреса IPv6-Yggdrasil является константой, а дальше интереснее: от публичного ключа x25519 берется хеш SHA512, количество лидирующих единиц которого, т.е. битов, установленных в ненулевом состоянии, образует второй байт.
Нулевой бит, следующий за массивом единиц, равно как и первый нулевой бит при отсутствии лидирующих единиц, урезается. Следующие за ним 14 байт образуют оставшуюся часть адреса.
Таким образом получается бесконфликтная сеть, где при масштабировании небольшого сегмента сети, например, при подключении локального сегмента к глобальному через публичный пир, не возникает опасности коллизии адресов. Это обуславливается почти безграничным множеством вероятных ключей x25519, случайно генерируемых при первом запуске Yggdrasil.
Почва для размышлений
Хеш SHA512 составляет 64 байта, в то время как адрес IPv6 даже с учетом константы «02» – всего лишь 16 байт, а изначальный ключ x25519 – 32 байта.
Некоторые пользователи сомневаются в практической пользе такого решения и считают, что вполне реально найти ключи с коллизией адресов, т.к. массив данных ключа увеличивается вдвое, а затем от него берется лишь небольшая часть (примерно 1/5), которая образует IPv6. При всем желании, модель угрозы нахождения разных ключей с одинаковым адресом не была подтверждена практически, что говорит о сложно исчислимом количестве вариаций адресов даже при таком на первый взгляд необычном подходе к их образованию.
Разработчики Yggdrasil постарались усложнить подбор адресов. Первые непрерывно идущие единичные биты создают дополнительный фактор уникальности адреса. Вероятность подобрать последовательность из последних 14 байт IPv6 кажется весьма реалистичной, однако общий успех менее вероятен, т.к. напрямую зависит от количества лидирующих единиц в хеше – 2-го байта. Отсюда выходит понятие «высокого адреса» – адреса с большим значением во втором байте и, следовательно, с более обширным использованием 64-байтного массива от SHA512. Исходя из этого, имеет смысл майнить «высокие адреса» для серьезных проектов.
Желание найти коллизию, особенно при умозрительной вероятности успеха, побудило ни один десяток человек к беспощадному майнингу адресов.