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