Перейти к основному содержимому

Сервис TON DHT

warning

Эта страница переведена сообществом на русский язык, но нуждается в улучшениях. Если вы хотите принять участие в переводе свяжитесь с @alexgton.

Реализация:

Общие сведения

Распределенная хэш-таблица (DHT - Distributed Hash Table), подобная Kademlia, играет важную роль в сетевой части проекта TON и используется для поиска других узлов в сети.

Ключи TON DHT — это просто 256-битные целые числа. В большинстве случаев они вычисляются как SHA256 TL-сериализованного объекта.

Значения, присвоенные этим 256-битным ключам, по сути, являются произвольными строками байтов ограниченной длины. Интерпретация таких строк байтов определяется прообразом соответствующего ключа; обычно она известна как узлу, который ищет ключ, так и узлу, который хранит ключ.

В простейшем случае ключ представляет собой адрес ADNL некоторого узла, а значение может быть его IP-адресом и портом.

Сопоставление ключ-значение TON DHT хранится на узлах DHT.

Узлы DHT

Каждый узел DHT имеет 256-битный адрес DHT. В отличие от адреса ADNL, адрес DHT не должен меняться слишком часто, иначе другие узлы не смогут найти искомые ими ключи.

Ожидается, что значение ключа K будет храниться на S узлах Kademlia-ближайших к K.

Расстояние Kademlia = 256-битный ключ XOR 256-битный адрес узла DHT (это не имеет ничего общего с географическим положением).

S — небольшой параметр, например S = 7, который необходим для повышения надежности DHT (если мы будем хранить ключ только на одном узле, ближайшем к K, значение этого ключа будет потеряно, если этот узел выйдет из сети).

Таблица маршрутизации Kademlia

Любой узел, участвующий в DHT, обычно поддерживает таблицу маршрутизации Kademlia.

Она состоит из 256 сегментов, пронумерованных от 0 до 255. i-тый сегмент будет содержать информацию о некоторых известных узлах (фиксированное количество "лучших" узлов и, возможно, несколько дополнительных кандидатов), которые находятся на расстоянии Kademlia от 2^i до 2^(i+1) − 1 от адреса узла a.

Эта информация включает их адреса DHT, IP-адреса и порты UDP, а также некоторую информацию о доступности, такую ​​как время и задержка последнего пинга.

Когда узел Kademlia узнает о любом другом узле Kademlia в результате какого-либо запроса, он помещает его в подходящую корзину своей таблицы маршрутизации, сначала как кандидата. Затем, если некоторые из "лучших" узлов в этой корзине выходят из строя (например, не отвечают на ping запросы в течение длительного времени), их можно заменить некоторыми из этих кандидатов. Таким образом, таблица маршрутизации Kademlia остается заполненной.

Пары ключ-значение

Пары ключ-значение можно добавлять и обновлять в TON DHT.

"Правила обновления" могут различаться. В некоторых случаях они просто разрешают замену старого значения новым значением, при условии, что новое значение подписано владельцем/создателем (подпись должна храниться как часть значения, чтобы быть проверенной позже любыми другими узлами после того, как они получат значение этого ключа). В других случаях старое значение каким-то образом влияет на новое значение. Например, он может содержать порядковый номер, и старое значение перезаписывается только в том случае, если новый порядковый номер больше (для предотвращения атак повторного использования).

TON DHT используется не только для хранения IP-адресов узлов ADNL, но также для других целей — он может хранить список адресов узлов, которые хранят определенный торрент в хранилище TON Storage, список адресов узлов, входящих в оверлейную подсеть, ADNL-адреса сервисов TON или ADNL-адреса аккаунтов блокчейна TON и т. д.

к сведению

Узнайте больше о TON DHT в статье DHT или в главе 3.2. документа TON Whitepaper.