Skip to content

Commit

Permalink
New translations overlay.md (Russian)
Browse files Browse the repository at this point in the history
  • Loading branch information
TonSquare committed Jan 1, 2025
1 parent 6ba28e6 commit b9efba4
Showing 1 changed file with 101 additions and 0 deletions.
Original file line number Diff line number Diff line change
@@ -0,0 +1,101 @@
# Оверлейные подсети

Реализация:

- https://github.com/ton-blockchain/ton/tree/master/overlay

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

Архитектура TON построена таким образом, что в ней одновременно и независимо может существовать множество цепочек — они могут быть как частными, так и общедоступными.
Узлы имеют возможность выбирать, какие шарды и цепочки они хранят и обрабатывают.
При этом протокол связи остается неизменным из-за своей универсальности. Такие протоколы, как DHT, RLDP и Оверлеи, позволяют этого добиться.
С первыми двумя мы уже знакомы, в этом разделе мы узнаем, что такое Оверлеи.

Оверлеи отвечают за разделение единой сети на дополнительные подсети. Оверлеи могут быть как общедоступными, к которым может подключиться любой желающий, так и частными, где для входа требуются дополнительные учетные данные, известные только определенному кругу лиц.

Все чейны в TON, включая мастерчейн, общаются с помощью собственного оверлея.
Чтобы присоединиться к нему, нужно найти узлы, которые уже состоят в нем, и начать обмениваться с ними данными.
Для общедоступных оверлеев вы можете найти узлы с помощью DHT.

## ADNL против оверлейных сетей

В отличие от ADNL, оверлейные сети TON обычно не поддерживают
отправка датаграмм на другие произвольные узлы. Вместо этого между определенными узлами устанавливаются некоторые “полупостоянные
соединения” (называемые “соседними” по отношению к
рассматриваемой оверлейной сети), и сообщения обычно пересылаются
по этим соединениям (т.е. от узла к одному из его соседей).

Каждая оверлейная подсеть имеет 256-разрядный сетевой идентификатор, обычно равный SHA256 описания оверлейной сети — TL-сериализованного объекта.

Оверлейные подсети могут быть общедоступными или частными.

Оверлейные подсети работают по специальному протоколу [gossip](https://ru.wikipedia.org/wiki/Gossip_\(%D0%Bf%D1%80%D0%Be%D1%82%D0%Be%D0%Ba%D0%Be%D0%Bb\)).

## Взаимодействие с оверлейными узлами

Мы уже разбирали пример с поиском оверлейных узлов в статье о DHT,
в разделе [Поиск узлов, хранящих состояние блокчейна](/v3/documentation/network/protocols/dht/dht-deep-dive#search-for-nodes-that-store-the-state-of-the-blockchain).
В этом разделе мы сосредоточимся на взаимодействии с ними.

При запросе DHT мы получим адреса оверлейных узлов, из которых мы можем узнать адреса других узлов этого оверлея с помощью запроса [overlay.getRandomPeers](https://github.com/ton-blockchain/ton/blob/ad736c6bc3c06ad54dc6e40d62acbaf5dae41584/tl/generate/scheme/ton_api.tl#L237).
Как только мы подключимся к достаточному количеству узлов, мы сможем получать от них всю информацию о блоках и другие события чейна, а также отправлять им наши транзакции для обработки.

### Найдите больше соседей

Давайте рассмотрим пример получения узлов в оверлее.

Для этого отправьте запрос `overlay.getRandomPeers` на любой известный узел оверлея, сериализуйте схему TL:

```tlb
overlay.node id:PublicKey overlay:int256 version:int signature:bytes = overlay.Node;
overlay.nodes nodes:(vector overlay.node) = overlay.Nodes;
overlay.getRandomPeers peers:overlay.nodes = overlay.Nodes;
```

`peers` - должен содержать известные нам пиры, поэтому мы не получаем их обратно, но поскольку мы пока не знаем ни одного, `peers.nodes` будет пустым массивом.

В случае, если мы хотим не просто получить какую-то информацию, а участвовать в оверлее и получать трансляции, мы также должны добавить в `peers` информацию о нашем узле, с которого мы делаем запрос.
Когда пиры получат информацию о нас - они начнут отправлять нам широковещательные сообщения с помощью ADNL или RLDP.

Каждый запрос внутри оверлея должен иметь префикс TL-схемы:

```tlb
overlay.query overlay:int256 = True;
```

`overlay` должен быть идентификатором оверлея - идентификатором ключа схемы `tonNode.ShardPublicOverlayId` - тем же, который мы использовали для поиска в DHT.

Нам нужно объединить 2 сериализованные схемы, просто объединив 2 сериализованных байтовых массива, `overlay.query` будет первым, `overlay.getRandomPeers` - вторым.

Мы оборачиваем полученный массив в схему `adnl.message.query` и отправляем ее через ADNL. В ответе ждем `overlay.nodes` - это будет список узлов оверлея, к которым мы можем подключиться и, при необходимости, повторить тот же запрос к новым из них, пока не получим достаточное количество подключений.

### Функциональные запросы

После того, как соединение установлено, мы можем получить доступ к оверлейным узлам с помощью [запросов](https://github.com/ton-blockchain/ton/blob/ad736c6bc3c06ad54dc6e40d62acbaf5dae41584/tl/generate/scheme/ton_api.tl#L413) `tonNode.*`.

Для запросов такого рода используется протокол RLDP. И важно не забыть префикс `overlay.query` - он должен использоваться для каждого запроса в оверлее.

В самих запросах нет ничего необычного, они очень похожи на то, что мы [делали в статье про ADNL TCP](/v3/documentation/network/protocols/adnl/adnl-tcp#getmasterchaininfo).

Например, запрос `downloadBlockFull` использует уже знакомую схему идентификатора блока:

```tlb
tonNode.downloadBlockFull block:tonNode.blockIdExt = tonNode.DataFull;
```

Передав его, мы сможем загрузить полную информацию о блоке, в ответ получим:

```tlb
tonNode.dataFull id:tonNode.blockIdExt proof:bytes block:bytes is_link:Bool = tonNode.DataFull;
or
tonNode.dataFullEmpty = tonNode.DataFull;
```

Если присутствует, поле `block` будет содержать данные в формате TL-B.

Таким образом, мы можем получать информацию напрямую с узлов.

## Ссылки

*Вот [ссылка на оригинальную статью](https://github.com/xssnick/ton-deep-doc/blob/master/Overlay-Network.md) [Олега Баранова](https://github.com/xssnick).*

0 comments on commit b9efba4

Please sign in to comment.