Перейти к основному содержимому

Криптографическая спецификация

Полная спецификация всех криптографических примитивов, используемых в 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

ПрименениеВходные данныеВыходные данные
Сообщение для подписи транзакцииКанонические байты TX32 байта
Обязательство монолитаПоля заголовка32 байта
Хеш утверждения ZKPПоля утверждения32 байта
Вывод ключа AESПароль32 байта

SHA-512

ПрименениеВходные данныеВыходные данные
Хеш блока"BLK" + байт версии + байты заголовка64 байта
Фиксация заголовковБинарное дерево заголовков блоков64 байта

BLAKE3

ПрименениеВходные данныеВыходные данные
Быстрое хешированиеОбщего назначенияПеременные
Вычисление состоянияДанные состояния32 байта

Keccak256

ПрименениеВходные данныеВыходные данные
Слоты хранилища контрактовaddress || base_slot8 байт (u64)
Вложенные маппингиkey || inner_hash8 байт (u64)

Разделение доменов

Все хеш-вычисления включают доменные теги для предотвращения межсекторных коллизий:

ДоменТегХешВыходные данные
Блок"BLK" + version: u8SHA-51264 байта
Корень 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 бит
Размер nonce96 бит (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 для подробностей.

БэкендКриваяСистема доказательствСценарий применения
MockN/AВсегда действительныйТестирование
ArkworksBN254Groth16Продакшен
PLONKBN254PLONKОбщего назначения

Свойства безопасности

Операции с постоянным временем

Вся верификация подписей использует сравнение с постоянным временем (через крейт subtle) для предотвращения атак по времени.

Зерование ключей

Приватные ключи зеруются при освобождении с использованием крейта zeroize как в SDK, так и в мобильном приложении.

Защита от повтора

  • Транзакции: на основе nonce (монотонно возрастающий для каждого аккаунта)
  • Обновления FL: nonce для каждого тренера на раунд
  • Потоки оракула: отслеживание порядковых номеров
  • Сообщения P2P: дедупликация gossipsub