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

Базовые типы и криптография

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)
}

Криптографические примитивы

Подписи

АлгоритмБиблиотекаПрименение
Ed25519ed25519-dalekПодпись транзакций, подпись блоков, идентификация узлов

Размеры ключей:

  • Приватный ключ: 32 байта
  • Публичный ключ: 32 байта
  • Подпись: 64 байта
  • Адрес: публичный ключ в hex-кодировке (64 hex символа)

Хеш-функции

ФункцияБиблиотекаПрименение
SHA-256sha2Хеш сообщения для подписи транзакции
SHA-512sha2Хеш блока (с доменным тегом "BLK" + байт версии)
BLAKE3blake3Вычисление корня состояния, быстрое хеширование
Keccak256sha3Вычисление слота хранилища контракта

Хеширование с доменными тегами

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

ДоменТегОписание
Блок"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.