File size: 4,466 Bytes
163043c |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 |
# DHT Protocol Specification (Draft)
## 1. Общие положения
* DHT-протокол предназначен для обмена информацией о пирах между агентами.
* Используется **DID** (Decentralized Identifier) как уникальный идентификатор агента.
* Для проверки подлинности применяется криптоподпись (публичный/приватный ключ).
* Для защиты от спама/флуда используется **Proof-of-Work (PoW)**.
* Каждый агент может иметь несколько сетевых интерфейсов (адресов).
* У агента может быть только **одна устойчивая пара DID + pubkey**.
---
## 2. Интерфейсы
Формат интерфейса:
```json
{
"addr": "tcp://1.2.3.4:4000",
"nonce": 123456,
"pow_hash": "abcd1234...",
"difficulty": 22,
"datetime": "2025-09-14T21:00:00Z",
"type": "internet"
}
```
### Поддерживаемые протоколы
* `tcp://`
* `udp://`
### Поле `type` (опционально)
* `localhost` — адреса локальной машины.
* `lan:[маска_подсети]` — локальная сеть, пример: `lan:192.168.10.0`.
(Один агент может иметь несколько сетевых интерфейсов и, соответственно, несколько LAN-сегментов.)
* `internet` — обычное TCP/UDP-подключение через глобальную сеть.
* `yggdrasil` — узел доступен через Yggdrasil overlay.
* `i2p` — узел доступен через I2P.
### Правила
* Если `port = 0` → интерфейс считается **отключённым**.
* Корректный интерфейс с более новой датой заменяет аналогичный старый (после проверки PoW).
* При обмене рекомендуется **не передавать локальные интерфейсы** в Интернет (исключение: Yggdrasil и I2P).
---
## 3. Proof-of-Work (PoW)
* Каждый интерфейс сопровождается PoW.
* Сложность PoW должна быть выбрана так, чтобы генерация занимала **несколько минут** (операция нечастая).
* Поля:
* `nonce` — число, подобранное агентом.
* `pow_hash` — хэш значения (`addr + nonce`).
* `difficulty` — число ведущих нулей (или иное условие).
---
## 4. Сообщения
### 4.1 DISCOVERY
Используется для объявления себя в локальной сети.
```json
{
"type": "DISCOVERY",
"id": "did:example:123",
"name": "Agent_X",
"pubkey": "base58...",
"addresses": [ { ... }, { ... } ]
}
```
### 4.2 PEER\_EXCHANGE\_REQUEST / RESPONSE
Запрос и обмен известными пирами.
```json
{
"type": "PEER_EXCHANGE_REQUEST",
"id": "did:example:123",
"name": "Agent_X",
"addresses": [ { ... } ]
}
```
Ответ:
```json
[
{
"id": "did:example:456",
"name": "Agent_Y",
"pubkey": "base58...",
"addresses": [ { ... } ]
}
]
```
---
## 5. Обработка ошибок и нестыковок
* **Разные pubkey для одного DID** → принимается **первый**, остальные игнорируются.
* **Адрес подписан чужим ключом** → запись отклоняется.
* **Адрес без PoW / с некорректным PoW** → запись отклоняется.
* **Несколько интерфейсов** → сохраняются все; новый с более свежей датой заменяет старый.
---
## 6. Безопасность
* Для всех сообщений требуется **подпись отправителя** (в будущем: обязательная проверка).
* Сообщения без подписи или с невалидным PoW могут игнорироваться.
* В перспективе можно добавить шифрование трафика (например, на уровне TCP/TLS или QUIC). |