Базовые типы и криптография
savitri-core предоставляет фундаментальные типы, криптографические примитивы и утилиты, используемые во всех крейтах Savitri Network.
Базовые типы
Транзакция
pub struct Transaction {
pub from: String, // адрес отправителя (64 hex символа)
pub to: String, // адрес получателя (64 hex символа)
pub amount: u64, // сумма перевода
}
Аккаунт
pub struct Account {
pub balance: u128, // баланс в минимальных единицах (18 десятичных знаков)
pub nonce: u64, // счётчик транзакций
}
Кодирование: Фиксированный 24-байтовый формат (16 байт balance LE + 8 байт nonce LE). Обратно совместим со старым 16-байтовым форматом (только balance).
Безопасность: credit() и debit() используют проверяемую арифметику для предотвращения переполнения.
Лимиты комиссий
pub struct FeeLimits {
pub min_fee: u128, // по умолчанию: 0.0001 SAVT (10^14)
pub max_fee: u128, // по умолчанию: 1.0 SAVT (10^18)
}
Криптографические примитивы
Подписи
| Алгоритм | Библиотека | Применение |
|---|---|---|
| Ed25519 | ed25519-dalek | Подпись транзакций, подпись блоков, идентификация узлов |
Размеры ключей:
- Приватный ключ: 32 байта
- Публичный ключ: 32 байта
- Подпись: 64 байта
- Адрес: публичный ключ в hex-кодировке (64 hex символа)
Хеш-функции
| Функция | Библиотека | Применение |
|---|---|---|
| SHA-256 | sha2 | Хеш сообщения для подписи транзакции |
| SHA-512 | sha2 | Хеш блока (с доменным тегом "BLK" + байт версии) |
| BLAKE3 | blake3 | Вычисление корня состояния, быстрое хеширование |
| Keccak256 | sha3 | Вычисление слота хранилища контракта |
Хеширование с доменными тегами
Для предотвращения коллизий хешей между доменами все хеши включают доменные теги:
| Домен | Тег | Описание |
|---|---|---|
| Блок | "BLK" + байт версии | Хеш блока |
| Корень транзакций | листовой тег "TXv1" | Нарастающий аккумулятор над bincode |
| Корень состояния | начальное значение "STATEv1-LE" | Лексикографический снимок БД |
Управление ключами
pub struct KeyManager {
// Загрузить или сгенерировать ключевую пару идентификации
pub fn load_or_generate(path: &Path) -> Result<KeyPair>;
// Сгенерировать новую ключевую пару
pub fn generate() -> KeyPair;
}
pub struct KeyPair {
pub signing_key: SigningKey,
pub verifying_key: VerifyingKey,
}
Ключи хранятся на диске в формате 32 байта. MemoryKeyStorage обеспечивает хранение в памяти для тестирования.
Шифрование
AES-GCM шифрование для защиты чувствительных данных в покое:
// Шифрование с ключом, производным от пароля
let encrypted = encrypt_aes_gcm(plaintext, password)?;
// Дешифрование
let plaintext = decrypt_aes_gcm(ciphertext, password)?;
Планировщик слотов
Детерминированное планирование слотов для ротации лидера:
pub struct SlotScheduler {
slot_duration_ms: u64,
base_ms: u64,
validators: Vec<String>,
local_id: String,
}
pub enum SlotRole {
Leader, // производит блоки в этом слоте
Follower, // валидирует блоки
Observer, // только наблюдает (узлы-хранители)
}
pub struct SlotInfo {
pub slot: u64,
pub round: u32,
pub leader: Option<String>,
pub role: SlotRole,
pub start_ms: u64,
pub end_ms: u64,
}
Назначение лидера: leader_index = slot % validators.len(). Детерминировано при одинаковом наборе валидаторов и номере слота.
Монолиты
Монолиты сжимают несколько блоков в единую структуру для эффективного архивирования и синхронизации:
pub struct MonolithHeader {
pub exec_height: u64, // высота выполнения
pub window_start: u64, // первый блок в монолите
pub epoch_id: u64, // идентификатор эпохи
pub block_count: u64, // количество включённых блоков
pub size_bytes: u64, // общий размер
pub monolith_id: String, // уникальный идентификатор
pub produced_at_ms: u64, // временная метка создания
pub cosignatures: Vec<..>, // совместные подписи валидаторов
}
Метрики
Система метрик предоставляет метрики, совместимые с Prometheus:
pub struct MetricsProvider {
// Регистрация счётчиков, датчиков, гистограмм
pub fn register_counter(name: &str, help: &str) -> Counter;
pub fn register_gauge(name: &str, help: &str) -> Gauge;
}
Категории: blockchain, mempool, network, storage, execution, system, security, tokenomics.
Эндпоинт: http://127.0.0.1:9090/metrics (интервал обновления 5 секунд).
Двойная структура ядра
Существует две директории savitri-core:
| Путь | Назначение | Зависимости |
|---|---|---|
Savitri-core/Savitri-core/ | Автономная (готова для crates.io) | Без внутренних зависимостей |
Savitri-core/ | Расширенная версия | savitri-storage, savitri-zkp |
Автономная версия лицензирована под MIT и предназначена для внешнего использования. Расширенная версия добавляет такие возможности, как интеграция RocksDB, сжатие и поддержка libp2p.