Криптографическая спецификация
Полная спецификация всех криптографических примитивов, используемых в Savitri Network.
Схема подписи
| Свойство | Значение |
|---|---|
| Алгоритм | Ed25519 |
| Библиотека | ed25519-dalek |
| Приватный ключ | 32 байта |
| Публичный ключ | 32 байта (сжатая точка Эдвардса) |
| Подпись | 64 байта |
| Адрес | Публичный ключ в шестнадцатеричной кодировке (64 шестнадцатеричных символа) |
Подпись транзакции
message = from_hex_bytes || to_hex_bytes || amount_le_u64 || nonce_le_u64 || fee_le_u128
hash = SHA-256(message)
sig = Ed25519_sign(signing_key, hash)
Подпись блока
Блоки подписываются предложителем с использованием Ed25519 над хешем заголовка блока (SHA-512).
Идентичность узла
libp2p-узлы используют Ed25519 для ключей идентичности (отдельно от ключей аккаунта).
Хеш-функции
SHA-256
| Применение | Входные данные | Выходные данные |
|---|---|---|
| Сообщение для подписи транзакции | Канонические байты TX | 32 байта |
| Обязательство монолита | Поля заголовка | 32 байта |
| Хеш утверждения ZKP | Поля утверждения | 32 байта |
| Вывод ключа AES | Пароль | 32 байта |
SHA-512
| Применение | Входные данные | Выходные данные |
|---|---|---|
| Хеш блока | "BLK" + байт версии + байты заголовка | 64 байта |
| Фиксация заголовков | Бинарное дерево заголовков блоков | 64 байта |
BLAKE3
| Применение | Входные данные | Выходные данные |
|---|---|---|
| Быстрое хеширование | Общего назначения | Переменные |
| Вычисление состояния | Данные состояния | 32 байта |
Keccak256
| Применение | Входные данные | Выходные данные |
|---|---|---|
| Слоты хранилища контрактов | address || base_slot | 8 байт (u64) |
| Вложенные маппинги | key || inner_hash | 8 байт (u64) |
Разделение доменов
Все хеш-вычисления включают доменные теги для предотвращения межсекторных коллизий:
| Домен | Тег | Хеш | Выходные данные |
|---|---|---|---|
| Блок | "BLK" + version: u8 | SHA-512 | 64 байта |
| Корень TX | Тег листа "TXv1" | Накопитель с прокруткой | 32 байта |
| Корень состояния | Начальное значение "STATEv1-LE" + лист "STATE" | Лексикографический снимок | 32 байта |
Корень транзакций
Вычисляется как накопитель с прокруткой над каноническим bincode транзакций:
accumulator = H("TXv1")
for tx in transactions:
leaf = bincode::serialize(tx)
accumulator = H(accumulator || leaf)
tx_root = accumulator
Корень состояния
Вычисляется из лексикографического снимка базы данных:
seed = H("STATEv1-LE")
for (key, value) in storage.iter_sorted():
leaf = H("STATE" || key || value)
seed = H(seed || leaf)
state_root = seed
Шифрование
AES-256-GCM (при хранении)
Используется для:
- Шифрования приватных ключей в SDK
- Шифрования столбцов мобильной базы данных
- Шифрования данных устройств в IoT-коннекторе
| Свойство | Значение |
|---|---|
| Алгоритм | AES-256-GCM |
| Размер ключа | 256 бит |
| Размер nonce | 96 бит (12 байт) |
| Размер тега | 128 бит (16 байт) |
| Вывод ключа | На основе пароля |
Шифрование P2P
| Свойство | Значение |
|---|---|
| Протокол | Noise (шаблон рукопожатия XX) |
| Обмен ключами | X25519 |
| Шифр | ChaChaPoly |
| Мультиплексирование | Yamux |
Вывод ключей (мобильный)
BIP-39
- Список слов: английский (2048 слов)
- Энтропия: 128 бит (12 слов) или 256 бит (24 слова)
- Мнемоника → Начальное значение: PBKDF2-HMAC-SHA512 (2048 раундов)
BIP-44
- Путь:
m/44'/1337'/0'/0/0 - Тип монеты: 1337 (Savitri)
- Аккаунт: 0
- Сдача: 0 (внешний)
- Индекс: 0
Иерархия ключей
mnemonic → seed (512 bits)
→ master_key (via HMAC-SHA512)
→ m/44' → m/44'/1337' → m/44'/1337'/0'
→ m/44'/1337'/0'/0 → m/44'/1337'/0'/0/0
→ ed25519_private_key (32 bytes)
→ ed25519_public_key (32 bytes)
→ address (hex-encoded, 64 chars)
Доказательства с нулевым разглашением
См. Архитектура ZKP для подробностей.
| Бэкенд | Кривая | Система доказательств | Сценарий применения |
|---|---|---|---|
| Mock | N/A | Всегда действительный | Тестирование |
| Arkworks | BN254 | Groth16 | Продакшен |
| PLONK | BN254 | PLONK | Общего назначения |
Свойства безопасности
Операции с постоянным временем
Вся верификация подписей использует сравнение с постоянным временем (через крейт subtle) для предотвращения атак по времени.
Зерование ключей
Приватные ключи зеруются при освобождении с использованием крейта zeroize как в SDK, так и в мобильном приложении.
Защита от повтора
- Транзакции: на основе nonce (монотонно возрастающий для каждого аккаунта)
- Обновления FL: nonce для каждого тренера на раунд
- Потоки оракула: отслеживание порядковых номеров
- Сообщения P2P: дедупликация gossipsub