6.1 KiB
shine_users
Кратко
shine_users — вторая программа Solana-модуля SHiNE. Она отвечает за создание и обновление пользовательской PDA-записи, проверку подписи записи, проверку логина через shine_login_guard и оплату регистрации/дополнительного лимита.
Папка программы: shine-solana/shine/programs/shine_users/.
Текущие функции
-
init_users_economy_config- Создает PDA с экономическими настройками пользователей.
- Записывает стартовую регистрационную комиссию, цену шага лимита и стартовый бонус лимита.
-
update_users_economy_config- Обновляет экономические настройки.
- Требует подпись
DAO_AUTHORITYиз общего deploy-конфига.
-
create_user_pda- Проверяет логин через
shine_login_guard. - Проверяет структуру полей пользователя.
- Проверяет подпись записи root-ключом пользователя.
- Создает
user_pdaпо seedlogin=<normalized_login>. - Переводит оплату регистрации и дополнительного лимита в
shine_payments::inflow_vault_pda.
- Проверяет логин через
-
update_user_pda- Проверяет неизменяемые поля пользователя.
- Проверяет
prev_hash, новую подпись и новое состояние последнего блока. - При необходимости расширяет PDA.
- Переводит оплату дополнительного лимита в
shine_payments::inflow_vault_pda.
Аргументы инструкций
init_users_economy_config аргументов не принимает.
update_users_economy_config:
registration_fee_lamports: u64lamports_per_limit_step: u64start_bonus_limit: u64
create_user_pda:
login: Stringroot_key: Pubkeycreated_at_ms: u64additional_limit: u64fields: UserMutableFieldssignature: Vec<u8>
update_user_pda:
login: Stringroot_key: Pubkeycreated_at_ms: u64updated_at_ms: u64version: u32prev_hash: Vec<u8>additional_limit: u64fields: UserMutableFieldssignature: Vec<u8>
UserMutableFields:
client_key: Pubkeyblockchain_public_key: Pubkeyblockchain_name: Stringused_bytes: u64last_block_number: u32last_block_hash: Vec<u8>— ровно 32 байтаlast_block_signature: Vec<u8>— ровно 64 байтаarweave_tx_id: Stringis_server: boolserver_key: Pubkeyserver_address: Stringsync_servers: Vec<String>access_servers: Vec<String>trusted_count: u8
Главные PDA
-
user_pda- PDA записи пользователя.
- Seed:
login=<normalized_login>. - Создается отдельно для каждого логина.
- Стартовый размер:
768байт. - При обновлении может расширяться через
realloc, но один auto-realloc ограничен10_000байт.
-
users_economy_config_pda- PDA с настройками экономики.
- Seed:
shine_users_economy_config. - Хранит регистрационную комиссию, цену шага лимита и стартовый бонус.
- Размер PDA:
8 + 96байт.
Текущие параметры экономики
Параметры initial config из programs/shine_users/src/settings.rs:
| Поле | Значение | Смысл |
|---|---|---|
START_REGISTRATION_FEE_LAMPORTS |
10_000_000 |
стартовая комиссия регистрации, 0.01 SOL |
LIMIT_STEP |
10_000 |
шаг additional_limit |
START_LAMPORTS_PER_LIMIT_STEP |
100_000 |
0.0001 SOL за один шаг лимита |
START_BONUS_LIMIT |
100_000 |
стартовый бесплатный лимит при регистрации |
additional_limit в create/update должен быть кратен LIMIT_STEP.
Связь с другими программами
shine_users зависит от:
shine_login_guard— для проверки логина при создании пользователя;shine_payments— для вычисления и проверкиinflow_vault_pda, куда уходят платежи.
create_user_pda делает CPI-вызов shine_login_guard::classify_login и принимает только результат 0. Premium/trademark логины сейчас отклоняются ошибками PremiumLogin или TrademarkLoginRequiresReview.
Подпись user_pda и подпись состояния последнего блока проверяются через встроенную Solana Ed25519-инструкцию, которая должна идти раньше инструкции shine_users в той же транзакции.
Деньги
Деньги из shine_users идут только в inflow_vault_pda программы shine_payments.
Потоки:
create_user_pda: регистрационная комиссия + оплатаadditional_limit;update_user_pda: оплатаadditional_limit, если она больше нуля.
Ключи и управление
На старте удобно считать, что у программы есть отдельный управляющий ключ key_2.
Целевая модель:
- economy-настройки меняет DAO-authority;
- upgrade-authority программы после проверки передается DAO;
- пользовательские операции
create_user_pdaиupdate_user_pdaостаются доступными обычным пользователям при корректных подписях и оплате.