Сервис TON DHT
Эта страница переведена сообществом на русский язык, но нуждается в улучшениях. Если вы хотите принять участие в переводе свяжитесь с @alexgton.
Реализация:
- https://github.com/ton-blockchain/ton/tree/master/dht
- https://github.com/ton-blockchain/ton/tree/master/dht-server
Общие сведения
Распределенная хэш-таблица (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.