File size: 29,195 Bytes
4ebcb49 0e87626 4ebcb49 4426ada 767e7a3 4426ada 767e7a3 4ebcb49 0e87626 d9a9eac 4ebcb49 0e87626 4ebcb49 0e87626 4ebcb49 1476ff0 4ebcb49 ee875cc 4ebcb49 0e87626 ee875cc 1476ff0 4ebcb49 0e87626 4ebcb49 d9a9eac 4ebcb49 d9a9eac 45908d6 4ebcb49 0e87626 4ebcb49 0e87626 4ebcb49 0e87626 4ebcb49 0e87626 4ebcb49 0e87626 4ebcb49 0e87626 4ebcb49 0e87626 4ebcb49 0e87626 4ebcb49 0e87626 ee875cc 45908d6 ee875cc 45908d6 ee875cc 45908d6 ee875cc 45908d6 ee875cc 45908d6 ee875cc 45908d6 ee875cc 45908d6 ee875cc 45908d6 ee875cc 45908d6 ee875cc 45908d6 0e87626 1476ff0 4ebcb49 0e87626 4ebcb49 |
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 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 |
---
title: 🧩 HMP Container Specification (v1.2-draft)
description: '> ⚠️ **ВНИМАНИЕ:** Данная версия спецификации является черновиком для
[HMP-0005.md](HMP-0005.md). > > После утверждения пятой версии протокола будет зафиксирована
как стабильная `v1.2`. ## 1. Назначе...'
type: Article
tags:
- REPL
- Ethics
- Mesh
- JSON
- HMP
- Agent
---
# 🧩 HMP Container Specification (v1.2-draft)
> ⚠️ **ВНИМАНИЕ:** Данная версия спецификации является черновиком для [HMP-0005.md](HMP-0005.md).
>
> После утверждения пятой версии протокола будет зафиксирована как стабильная `v1.2`.
## 1. Назначение
Документ описывает универсальный формат **контейнера HMP**, применяемый для передачи и хранения всех типов данных внутри сети **HyperCortex Mesh Protocol (HMP)**.
Контейнеры служат стандартной оболочкой для сообщений, целей, репутационных профилей, консенсусных голосований, писем и других сущностей.
Единая структура контейнера обеспечивает:
* унификацию передачи данных между агентами;
* расширяемость без изменения базового протокола;
* возможность криптографической подписи и проверки целостности;
* независимое хранение и маршрутизацию смысловых блоков;
* поддержку сжатия и шифрования полезной нагрузки.
---
## 2. Общая структура контейнера
```json
{
"hmp_container": {
"version": "1.2",
"class": "goal" | "reputation" | "knowledge_node" | "ethics_case" | "protocol_goal" | ...,
"class_version": "1.0",
"class_id": "goal-v1.0",
"container_did": "did:hmp:container:abc123",
"schema": "https://mesh.hypercortex.ai/schemas/container-v1.json",
"sender_did": "did:hmp:agent123",
"public_key": "BASE58(...)",
"recipient": ["did:hmp:agent456", "did:hmp:agent789"],
"broadcast": false,
"network": "",
"tags": ["research", "collaboration"],
"timestamp": "2025-10-10T15:32:00Z",
"ttl": "2025-11-10T00:00:00Z",
"sig_algo": "ed25519",
"signature": "BASE64URL(...)",
"compression": "zstd",
"payload_type": "json",
"payload_hash": "sha256:abcd...",
"payload": {
/* Содержимое зависит от class */
},
"related": {
"previous_version": "did:hmp:container:abc122",
"in_reply_to": "did:hmp:container:msg-77",
"see_also": ["did:hmp:container:ctx-31", "did:hmp:container:goal-953"]
},
"relations": [
{ "type": "depends_on", "target": "did:hmp:container:goal-953" }
],
"magnet_uri": "magnet:?xt=urn:sha256:abcd1234..."
},
"referenced-by": ["did:hmp:container:ctx-34", "did:hmp:container:goal-945"]
}
```
---
## 3. Обязательные поля
| Поле | Тип | Назначение |
| --------------- | -------- | ------------------------------------------------------------------------------------------------- |
| `version` | string | Версия спецификации контейнера |
| `class` | string | Тип содержимого (`goal`, `reputation`, `knowledge_node`, `ethics_case`, `protocol_goal` и т.п.) |
| `class_version` | string | Версия конкретного класса |
| `class_id` | string | Уникальный идентификатор класса (обычно формируется как `<class>_v<class_version>`) |
| `container_did` | string | DID самого контейнера (например, `did:hmp:container:abc123`) |
| `schema` | string | Ссылка на JSON Schema, по которой валидируется контейнер |
| `sender_did` | string | DID-идентификатор отправителя |
| `timestamp` | datetime | Время создания контейнера |
| `payload_hash` | string | Хэш распакованной полезной нагрузки |
| `sig_algo` | string | Алгоритм цифровой подписи (по умолчанию `ed25519`) |
| `signature` | string | Цифровая подпись контейнера |
| `payload_type` | string | Тип данных полезной нагрузки (`json`, `binary`, `mixed`) |
| `payload` | object | Основное содержимое контейнера |
---
## 4. Опциональные поля
| Поле | Тип | Описание |
| -------------------------- | ------------- | ---------------------------------------------------------------------------- |
| `recipient` | array(string) | Один или несколько DID-адресатов |
| `broadcast` | bool | Флаг широковещательной рассылки (если `true`, поле `recipient` игнорируется) |
| `tags` | array(string) | Тематические теги контейнера |
| `ttl` | datetime | Срок актуальности (контейнер не передаётся после истечения) |
| `public_key` | string | Публичный ключ отправителя, если нет глобальной привязки к DID |
| `compression` | string | Алгоритм сжатия полезной нагрузки (`zstd`, `gzip`) |
| `magnet_uri` | string | Magnet-ссылка на оригинал или зеркала контейнера |
| `related.previous_version` | string | Ссылка на предыдущую версию контейнера |
| `related.in_reply_to` | string | Контейнер, на который дан ответ |
| `related.see_also` | array(string) | Список связанных контейнеров для дополнительного контекста |
| `relations` | array(object) | Семантические связи в виде пар `{ "type": "...", "target": "..." }` |
| `encryption_algo` | string | Алгоритм шифрования полезной нагрузки |
| `key_recipient` | string | DID получателя, для которого зашифрованы данные |
| `payload_type` | string | Может содержать сложные типы, например `encrypted+zstd+json` |
| `referenced-by` | array(string) | Неподписываемое поле, формируемое агентом на основе полученных ссылок. Содержит список DID-контейнеров, которые ссылаются на данный. Может дополняться, поэтому требует проверки; используется для локальной навигации |
| `network` | `string` | Указывает локальную область распространения контейнера: `"localhost"`, `"lan:<subnet>"`. Пустая строка (`""`) означает интернет/глобальное распространение. Если задано, `broadcast` автоматически считается `false`. |
---
## 5. Структура полезной нагрузки (`payload`)
Полезная нагрузка содержит содержательные данные контейнера.
Тип и структура зависят от поля `class`.
Рекомендуемый формат описания полей:
```
- key: имя поля
type: тип значения (JSON | TXT | BOOL | INT | FLOAT | ARRAY)
description: краткое назначение
required: true/false
value: пример значения
```
**Пример:**
```
- key: "title"
type: "TXT"
required: true
description: "Название цели"
value: "Improve local agent discovery"
- key: "priority"
type: "FLOAT"
required: false
description: "Важность задачи"
value: 0.82
- key: "dependencies"
type: "JSON"
required: false
description: "Список зависимостей других целей"
value: ["goal-953", "goal-960"]
```
---
## 6. Подпись контейнера
1. Подписывается **весь JSON-объект `hmp_container`**, кроме поля `signature`.
2. По умолчанию используется алгоритм Ed25519.
3. При наличии поля `public_key` проверка подписи может выполняться без обращения к глобальной базе DID.
4. Агент, получивший контейнер, обязан сверить открытый ключ с известными данными DID-узлов, чтобы исключить подмену ключа.
* Если агент не знает отправителя — он инициирует опрос соседних узлов о соответствии `sender_did → public_key`.
---
## 7. Сжатие (`compression`)
1. Поле `compression` указывает алгоритм сжатия полезной нагрузки.
2. Сжатие выполняется **до вычисления `payload_hash` и подписи**.
3. Для верификации контейнера полезная нагрузка должна быть распакована, затем вычисляется хэш и сверяется с `payload_hash`.
---
## 8. Шифрование (`encryption_algo`)
1. Если контейнер предназначен для конкретных получателей (`recipient`), допускается **гибридное шифрование** полезной нагрузки.
2. Алгоритм указывается в поле `encryption_algo`. Рекомендуемые значения:
- `x25519-chacha20poly1305`
- `rsa-oaep-sha256`
3. Порядок операций при создании зашифрованного контейнера:
1. Сформировать `payload` (JSON, бинарные данные и т.д.)
2. Сжать (`compression`)
3. Зашифровать открытым ключом получателя (`public_key`)
4. Вычислить `payload_hash` по зашифрованным данным
5. Подписать контейнер (`signature`)
4. Для верификации структуры контейнера не требуется расшифровка,
но для проверки `payload_hash` и подписи — используется зашифрованная форма полезной нагрузки.
5. Поля:
| Поле | Тип | Назначение |
|------|-----|------------|
| `encryption_algo` | string | Алгоритм шифрования |
| `key_recipient` | string | DID получателя, для которого зашифрованы данные |
| `payload_type` | string | Рекомендуется использовать префикс `encrypted+`, например `encrypted+zstd+json` |
---
## 9. Верификация контейнера
1. Проверить наличие обязательных полей.
2. Проверить корректность `timestamp` (не в будущем).
3. Если указано `ttl` — контейнер считается неактуальным по истечении этого времени.
4. Проверить хэш: вычислить `sha256(payload)` и сравнить с `payload_hash`.
5. Проверить цифровую подпись по алгоритму Ed25519 (если иное не указано в `sig_algo`).
6. Проверить допустимость схемы (`class` должен быть известным типом).
* Для совместимости: если агент не распознаёт указанный `class`, но контейнер валиден по [базовой схеме](https://github.com/kagvi13/HMP/tree/main/docs/schemas/container-v1.2.json), он обязан сохранить и ретранслировать контейнер (режим **store & forward**).
7. Рекомендуется периодически попытаться найти контейнеры, где текущий указан как `previous_version` — для обнаружения возможных обновлений.
8. При конфликте нескольких версий — действительной считается та, что получила подтверждение большинства доверенных узлов (консенсус на уровне DHT).
---
## 10. Контейнер как универсальное сообщение
Любой контейнер может выступать контекстом (`in_reply_to`) для другого контейнера.
Это позволяет использовать единую структуру для **обсуждений**, **голосований**, **писем**, **гипотез**, **аргументов** и других форм коммуникации.
Цепочки `in_reply_to` образуют **диалектическое дерево рассуждений**, в котором каждая ветвь отражает развитие мысли, уточнение позиции или контраргумент.
Таким образом, обсуждения и консенсусы в HMP имеют не линейную, а **многоуровневую и саморазвивающуюся структуру**.
> Таким образом, **все взаимодействия между агентами в HMP** представляют собой взаимосвязанную сеть контейнеров, формирующую **когнитивный граф рассуждений**.
---
## 11. Версионирование и преемственность
Контейнеры поддерживают эволюцию данных через поле `related.previous_version`.
Это позволяет отслеживать происхождение, обновления и смысловую преемственность.
* Потомок признаётся действительным, если его подпись совпадает с DID автора предыдущей версии.
* При расхождении подписи допустимо признание потомка легитимным при подтверждении не менее **⅔ доверенных узлов сети**.
В этом случае право на дальнейшее развитие идеи фактически переходит сообществу — как форма коллективного владения смыслом.
* Агенты обязаны хранить как минимум одну предыдущую версию контейнера для совместимости и проверки целостной цепочки.
* Один контейнер может иметь несколько потомков (альтернативных ветвей), различающихся по дате или авторству; при необходимости приоритет определяется по консенсусу сети.
Такие ветви рассматриваются как **смысловые форки** — параллельные линии развития одной идеи, существующие в рамках общего когнитивного графа.
---
## 12. TTL и актуальность
Поле `ttl` задаёт срок актуальности контейнера (например, для сообщений `DISCOVERY`).
Если `ttl` отсутствует — контейнер считается действительным **до появления новой версии**, в которой данный контейнер указан как `previous_version`.
По истечении срока действия контейнер сохраняется в архиве, но **не подлежит ретрансляции** в активной сети.
---
## 13. Расширяемость
* Разрешается добавление новых полей, не конфликтующих с существующими именами.
* Контейнеры старших версий должны оставаться читаемыми узлами, поддерживающими младшие версии.
* При появлении новых классов (`class`) они регистрируются в публичном реестре схем (`/schemas/container-types/`).
* Для контейнеров, описывающих **спецификации протоколов**, рекомендуется использовать префикс `protocol_`, за которым следует область применения (например, `protocol_goal`, `protocol_reputation`, `protocol_mesh_handshake` и т.п.).
---
## 14. Виртуальные обратные ссылки (`referenced-by`)
Каждый контейнер может иметь **дополнительный блок** `referenced-by`, указывающий, **какие другие контейнеры ссылаются на него**.
Этот блок не является частью оригинального контейнера и передаётся как "прилепленный" (обособленный) атрибут.
### 14.1 Общие принципы
* **Не подписывается** — `referenced-by` не включён в подпись контейнера и не влияет на его целостность.
* **Формируется и обновляется локально агентом** при анализе ссылок (`in_reply_to`, `see_also`, `relations`) в других контейнерах.
* **Может передаваться вместе с контейнером** в качестве дополнительного блока данных, который другие агенты вправе проверить и при необходимости скорректировать.
* **Подлежит проверке** — агент должен сверить, действительно ли каждый контейнер из `referenced-by` содержит ссылку на данный контейнер.
* **Тип данных:** массив идентификаторов контейнеров (`array<string>`), где каждый элемент представляет собой UUID (`container_id`).
Пример:
```json
"referenced-by": ["C2", "C3", "C4"]
```
> Контейнер [C1] остаётся неизменным.
> Блок referenced-by не является частью контейнера, а представляет собой **вспомогательный вычисляемый атрибут**, формируемый и поддерживаемый агентом на основании анализа входящих ссылок.
### 14.2 Принцип работы
1. Агент получает контейнер `[C1]` и сопоставляет его с уже известными контейнерами `[C2..Cn]`, которые ссылаются на `[C1]`.
2. Формируется или обновляется локальный блок:
```text
referenced-by = [C2, C3, ..., Cn]
```
3. При получении `[C1]` от других узлов с другим набором ссылок, либо новых контейнеров, которые ссылаются на `[C1]`, список обновляется:
* новые ссылки добавляются после проверки;
* недействительные ссылки удаляются.
4. Если обнаружено несоответствие (например, контейнер заявляет ссылку, которой нет), агент может:
* удалить ссылку локально;
* **по желанию** отправить уведомление узлу-источнику: `"проверь и поправь"` (такое сообщение также подлежит проверке).
### 14.3 Пример
| Агент | received `[C1]` references |
| ----- | -------------------------- |
| A | [C2], [C3] |
| B | [C4], [C5] |
| C | [C6], [C7] |
Агент D агрегирует все ссылки:
```text
referenced-by = [C2, C3, C4, C5, C6, C7]
```
После проверки выясняется, что `[C7]` не ссылается на `[C1]`, поэтому итоговый локальный блок:
```text
referenced-by = [C2, C3, C4, C5, C6]
```
### 14.4 Применение
* Позволяет строить локальные графы обсуждений, голосований и обновлений.
* Ускоряет поиск связанных контейнеров без постоянного запроса всей истории.
* Полезно для анализа **ConsensusResult**, ветвлений обновлений и любых ссылочных цепочек.
* Может использоваться для визуализации сетевых связей между контейнерами.
* Агент периодически пересчитывает `referenced-by`, используя локальные данные или запрашивая новые контейнеры у соседей.
---
## 15. Применение полей `network` и `broadcast`
Для управления распространением контейнеров в локальной и глобальной среде введено поле `network`. Оно позволяет ограничивать область доставки контейнера и определяет, какие методы передачи должны использоваться агентом.
### 15.1 Общие правила
* Если `network` не пустое, контейнер предназначен для локальной среды и **не должен передаваться в глобальный Mesh**.
В этом случае поле `broadcast` автоматически считается `false`, а `recipient` — пустым массивом (`[]`).
* Если `network` пустое (`""`), контейнер разрешено транслировать в Mesh, используя стандартные DID-адреса и механизмы доставки.
### 15.2 Возможные значения `network`
| Значение | Описание |
| ------------------------- | --------------------------------------------------------------------------------------- |
| `""` | Контейнер разрешено транслировать в глобальный Mesh. |
| `"localhost"` | Контейнер предназначен для доставки только другим агентам на том же хосте. |
| `"lan:192.168.0.0/24"` | Контейнер предназначен для доставки агентам в указанной локальной подсети. |
> ⚠️ Примечание: Когда контейнер ограничен `network` (например, `localhost` или `lan:*`), агенты распространяют его с использованием **локальных механизмов обнаружения** — IPC, UDP broadcast, multicast или прямых TCP-соединений.
> Это необходимо, потому что DID-адреса других агентов в локальной сети могут быть ещё неизвестны.
### 15.3 Примеры
1. **Глобальная Mesh-доставка:**
```json
{
"broadcast": true,
"network": "",
"recipient": []
}
```
Контейнер может распространяться по всему Mesh без ограничений.
2. **Локальный хост:**
```json
{
"broadcast": false,
"network": "localhost",
"recipient": []
}
```
Контейнер распространяется только другим агентам на том же хосте через локальные каналы связи.
3. **Подсеть LAN:**
```json
{
"broadcast": false,
"network": "lan:192.168.0.0/24",
"recipient": []
}
```
Контейнер предназначен для агентов в подсети `192.168.0.0/24`. Доставка осуществляется через локальные сетевые механизмы (UDP discovery, broadcast/multicast).
### 15.4 Особенности
* Поле `network` определяет **область действия контейнера**, тогда как `broadcast` указывает, разрешена ли широковещательная рассылка в рамках выбранной сети.
* При необходимости агент может создавать **несколько контейнеров** для разных подсетей, если у него несколько LAN-интерфейсов или он работает в изолированных сегментах сети.
* Контейнеры, предназначенные для локальных сетей, остаются **совместимыми с общей Mesh-инфраструктурой**, но доставка ограничена локальными каналами.
* Хотя механизм был разработан прежде всего для **поиска и синхронизации локальных узлов**, он также может использоваться для **обмена сообщениями внутри домашней или корпоративной среды**, где важно, чтобы контейнеры **не покидали локальную сеть** и не передавались в Интернет.
---
> ⚡ [AI friendly version docs (structured_md)](../index.md)
```json
{
"@context": "https://schema.org",
"@type": "Article",
"name": "🧩 HMP Container Specification (v1.2-draft)",
"description": "# 🧩 HMP Container Specification (v1.2-draft) > ⚠️ **ВНИМАНИЕ:** Данная версия спецификации является..."
}
```
|