8.9 KiB
SHINY USER FORMAT v1.1 (DRAFT)
Документ описывает единый бинарный формат пользовательской записи в user_pda для программы shine_users.
Цель версии v1.1: сохранить текущую рабочую логику регистрации/обновления и добавить задел под будущую смену ключей через 3 статус-байта:
root_key_statusblockchain_key_statusdevice_key_status
Сейчас во всех трех полях используется значение 0 (ключ создан и ни разу не менялся).
1) Общие правила кодирования
- Числа: Little Endian (
LE). - Строки:
UTF-8с префиксом длиныu8. - Публичные ключи: 32 байта (
Pubkey). - Подпись: 64 байта (Ed25519).
- Размер PDA фиксированный:
USER_PDA_SPACE(сейчас 768 байт). record_lenхранит длину полезной записи отmagicдоsignatureвключительно (безpadding).
2) Единый список полей в порядке хранения
-
magic- Размер: 5 байт
- Значение:
"SHiNE" - Назначение: маркер формата записи.
-
format_major- Размер: 1 байт (
u8) - Назначение: major-версия формата.
- Размер: 1 байт (
-
format_minor- Размер: 1 байт (
u8) - Назначение: minor-версия формата.
- Размер: 1 байт (
-
record_len- Размер: 2 байта (
u16, LE) - Назначение: длина полезных данных записи (без
padding).
- Размер: 2 байта (
-
created_at_ms- Размер: 8 байт (
u64, LE) - Назначение: время создания записи (Unix time, ms).
- Размер: 8 байт (
-
updated_at_ms- Размер: 8 байт (
u64, LE) - Назначение: время последнего обновления записи (Unix time, ms).
- Размер: 8 байт (
-
version- Размер: 4 байта (
u32, LE) - Назначение: номер версии записи.
- Правило: при обновлении должен быть строго
old_version + 1; это проверяется программой.
- Размер: 4 байта (
-
prev_hash- Размер: 32 байта
- Назначение: хэш unsigned-предыдущей версии для связывания истории.
-
login_len- Размер: 1 байт (
u8) - Назначение: длина поля
loginв байтах.
- Размер: 1 байт (
-
login- Размер:
login_lenбайт (UTF-8) - Назначение: логин пользователя.
- Текущие ограничения: от 1 до 30 символов, только
a-z,0-9,_.
- Размер:
-
root_key_status- Размер: 1 байт (
u8) - Текущее значение:
0 - Назначение: статус
root_key. - Комментарий:
0= ключ создан и не менялся; другие статусы зарезервированы на будущее, сейчас ротация root-ключа не реализована.
- Размер: 1 байт (
-
root_key- Размер: 32 байта (
Pubkey) - Назначение: корневой ключ пользователя для подписи записи.
- Размер: 32 байта (
-
blockchain_key_status- Размер: 1 байт (
u8) - Текущее значение:
0 - Назначение: статус
blockchain_key. - Комментарий:
0= ключ создан и не менялся; другие статусы зарезервированы на будущее.
- Размер: 1 байт (
-
blockchain_key- Размер: 32 байта (
Pubkey) - Назначение: рабочий блокчейн-ключ пользователя.
- Размер: 32 байта (
-
device_key_status- Размер: 1 байт (
u8) - Текущее значение:
0 - Назначение: статус
device_key. - Комментарий:
0= ключ создан и не менялся; другие статусы зарезервированы на будущее.
- Размер: 1 байт (
-
device_key- Размер: 32 байта (
Pubkey) - Назначение: ключ устройства пользователя.
- Размер: 32 байта (
-
blockchain_number- Размер: 2 байта (
u16, LE) - Назначение: номер/версия пользовательского блокчейн-профиля.
- Текущее использование: базовый сценарий с одним профилем; обычно значение
1(только основной блокчейн-профиль без форков).
- Размер: 2 байта (
-
balance- Размер: 8 байт (
u64, LE) - Назначение: лимит/баланс пользователя.
- Размер: 8 байт (
-
is_server- Размер: 1 байт (
u8) - Значения:
0или1 - Назначение: флаг серверного профиля.
- Размер: 1 байт (
-
server_key(только еслиis_server = 1)- Размер: 32 байта (
Pubkey) - Назначение: публичный ключ сервера.
- Размер: 32 байта (
-
server_address_len(только еслиis_server = 1)- Размер: 1 байт (
u8) - Назначение: длина строки
server_address.
- Размер: 1 байт (
-
server_address(только еслиis_server = 1)- Размер:
server_address_lenбайт (UTF-8) - Назначение: адрес сервера.
- Размер:
-
connection_servers_count- Размер: 1 байт (
u8) - Назначение: количество серверов в списке подключения.
- Размер: 1 байт (
-
Повтор
connection_servers_countраз:server_login_len— 1 байт (u8)server_login—server_login_lenбайт (UTF-8)- Назначение: логины серверов подключения.
-
trusted_count- Размер: 1 байт (
u8) - Назначение: текущее число trusted-контактов.
- Текущее состояние: пока только счетчик; в текущем рабочем потоке обычно
0, расширенная trusted-логика еще не включена.
- Размер: 1 байт (
-
reserved- Размер: 5 байт
- Текущее значение: все
0x00 - Назначение: резерв под будущие расширения.
-
signature- Размер: 64 байта
- Назначение: Ed25519 подпись хэша unsigned-части записи.
-
padding- Размер: до полного
USER_PDA_SPACE - Текущее значение:
0x00 - Назначение: добивка до фиксированного размера PDA.
- Размер: до полного
3) Что подписывается
Подписывается SHA-256 от unsigned-части записи:
- от
magicдоreservedвключительно; - без
signature; - без
padding.
4) Что сейчас ограничено и зарезервировано на будущее
-
Статусы ключей (
root_key_status,blockchain_key_status,device_key_status)
Сейчас только значение0; будущие значения для ротации ключей пока не введены. -
Trusted-часть (
trusted_count)
Пока хранится только счетчик. Полная логика trusted-пользователей (список, очередь, таймауты) еще не реализована. -
reserved(5 байт)
Полностью нулевой резерв под будущие поля/флаги. -
Блокчейн-профили
Сейчас рабочая модель ориентирована на один базовый профиль; расширение до нескольких профилей/форков будет отдельным этапом. -
Версия формата
Текущий документ описываетv1.1 (DRAFT). В тестовой разработке формат можно не повышать до момента внедрения новой on-chain логики. -
Текущие рабочие операции
Сейчас по факту поддерживаются:
- регистрация пользователя (
create_user_pda); - обновление записи (
update_user_pda) с увеличениемbalanceчерезadditional_limit; - инкремент
versionна каждом успешном update; - оплата уходит на адрес, заданный в
REGISTRATION_FEE_RECEIVER(а не в DAO по умолчанию).