Архитектура Blockchain Integrity Appliance
Общая схема
graph TB
subgraph INFRA["Инфраструктура OZON"]
subgraph SOT["Source of Truth: любой сервис Ozon"]
S1["Order Service"]
S2["Contract Service"]
S3["Logger"]
S4["CRM"]
end
subgraph IA["Integrity Appliance"]
API["Go REST API"] --> HE["Hash Engine
(SHA-256)"] HE --> POA_NODE["PoA Node
(Ethereum Client)"] JDB[("Journal DB
(PostgreSQL)")] JDB -.->|хранит proof-ы и метаданные| API end S1 -.-> API S2 -.-> API S3 -.-> API S4 -.-> API end subgraph NET["PoA CONSENSUS NETWORK
6 Валидаторов"] N1["Node 1
(ДЦ А)"] --- N2["Node 2
(ДЦ B)"] --- N3["Node 3
(ДЦ C)"] N4["Node 4
(ДЦ D)"] --- N5["Node 5
(ДЦ E)"] --- N6["Node 6
(OZON)"] N1 --- N4 N3 --- N6 NOTES["Consensus: IBFT 2.0
Block time: 3-12 сек
Gas: 0 (бесплатные транзакции)"] end POA_NODE -->|публикует хеши| N6
(SHA-256)"] HE --> POA_NODE["PoA Node
(Ethereum Client)"] JDB[("Journal DB
(PostgreSQL)")] JDB -.->|хранит proof-ы и метаданные| API end S1 -.-> API S2 -.-> API S3 -.-> API S4 -.-> API end subgraph NET["PoA CONSENSUS NETWORK
6 Валидаторов"] N1["Node 1
(ДЦ А)"] --- N2["Node 2
(ДЦ B)"] --- N3["Node 3
(ДЦ C)"] N4["Node 4
(ДЦ D)"] --- N5["Node 5
(ДЦ E)"] --- N6["Node 6
(OZON)"] N1 --- N4 N3 --- N6 NOTES["Consensus: IBFT 2.0
Block time: 3-12 сек
Gas: 0 (бесплатные транзакции)"] end POA_NODE -->|публикует хеши| N6
Компоненты Appliance
1. REST API (Go)
- Фреймворк: chi или стандартный net/http
- Эндпоинты:
| Метод | Путь | Описание |
|---|---|---|
| POST | /api/v1/proof |
Отправить данные на proof |
| GET | /api/v1/proof/:id |
Получить proof по ID |
| GET | /api/v1/proof/tx/:txhash |
Получить proof по tx hash |
| GET | /api/v1/verify |
Проверить документ (hash → proof) |
| GET | /api/v1/status |
Health check + метрики ноды |
| GET | /metrics |
Prometheus metrics |
-
Формат запроса POST /proof:
{ "document_id": "contract-2025-001", "hash": "sha256hex...", "metadata": { "type": "contract", "timestamp": 1715692800, "source": "contract-service.ozon.internal" } } -
Формат ответа:
{ "status": "confirmed", "proof": { "tx_hash": "0x7a1e...f3c9", "block_number": 1047297, "block_hash": "0x...", "timestamp": 1715692802, "validator": "ozon-node" }, "verification_url": "https://explorer.integrity.network/tx/0x7a1e...f3c9" }
2. Hash Engine
- SHA-256 (стандартный, может быть BLAKE2b для производительности)
- Возможность пакетной обработки: несколько документов → Merkle tree → один root hash → одна транзакция
- Bulk API до 1000 документов в одной транзакции
3. PoA Node (Ethereum Client)
- Клиент: Go-Ethereum (geth) в режиме PoA
- Consensus: IBFT 2.0 (Istanbul Byzantine Fault Tolerance)
- Block time: 3-12 секунд
- Finality: мгновенная (no fork possibility in PoA)
4. Journal DB (PostgreSQL)
- Хранит полную историю: какие документы, когда, какой hash, какой tx hash
- Служит для быстрой проверки без обращения к блокчейну
- Реплицируется на внешний storage для disaster recovery
5. Мониторинг
- Prometheus metrics: количество proof-ов, время подтверждения, статус консенсуса, загрузка CPU/RAM
- Health check:
/api/v1/status— состояние ноды, синхронизация, peers - Alerts: падение ноды, потеря синхронизации, деградация производительности
Процесс proof-ing (пошагово)
sequenceDiagram
participant Client as Клиент
participant Appliance as Appliance
participant PoA as PoA Network
Note over Client,PoA: Создание proof
Client->>Appliance: POST /api/v1/proof
activate Appliance
Appliance->>Appliance: 1. Валидация входных данных
Appliance->>Appliance: 2. Вычисление SHA-256
Appliance->>Appliance: 3. Формирование tx
Appliance->>PoA: 4. IBFT consensus (3-12 сек)
activate PoA
PoA-->>Appliance: Подтверждение
deactivate PoA
Appliance->>Appliance: 5. Сохранение в Journal DB
Appliance-->>Client: { tx_hash, block, ts }
deactivate Appliance
Note over Client,PoA: Верификация
Client->>Appliance: GET /api/v1/verify
activate Appliance
Appliance->>PoA: 6. Запрос hash из блокчейна
activate PoA
PoA-->>Appliance: hash из блокчейна
deactivate PoA
Appliance->>Appliance: Сравнение hash: запрос vs блокчейн
Appliance-->>Client: { valid: true/false }
deactivate Appliance
Hardware спецификация (начальная оценка)
| Компонент | Минимальная | Рекомендуемая (Ozon) |
|---|---|---|
| CPU | 4 cores, 2.0 GHz | 16 cores, 3.0 GHz (AMD EPYC 7313) |
| RAM | 16 GB | 64 GB |
| SSD | 500 GB | 1 TB NVMe + 4TB SAS |
| Сеть | 1 GbE | 10 GbE |
| Питание | 1x | 2N hot-swap |
| Форм-фактор | 1U | 1U |
Оценка нагрузки: - 100 TPS хэшей → ~8.6M proof-ов в день - Размер 1 proof в блокчейне: ~100 байт - Рост блокчейна: ~1 GB в месяц при 100 TPS - Journal DB: ~30 GB в месяц (с метаданными)
Безопасность
Data leakage
- Zero data leakage: только 32-байтовые хэши покидают периметр Ozon
- Hash необратим — невозможно восстановить исходные данные
- Метаданные (document_id, source) остаются только в Journal DB на appliance
Network security
- Нода Ozon подключается к PoA сети через TLS
- Белый список пиров (static-nodes.json)
- API доступен только внутри сети Ozon
- Option: дополнительная аутентификация запросов (API key / JWT)
Физическая безопасность
- TPM 2.0 для защиты ключа валидатора
- Secure boot
- Encrypted storage (LUKS)
Аудит
- Все изменения конфигурации логируются
- Journal DB immutable (append-only)
- Регулярная сверка Journal DB с блокчейном