# Деплой и инициализация Solana-регистрации ## Коротко Для рабочей регистрации пользователя нужны три программы: 1. `shine_users` — хранение и обновление `user_pda`, economy-конфиг, логика регистрации. 2. `shine_login_guard` — проверка/классификация логина через CPI из `shine_users`. 3. `shine_payments` — приём платежей за регистрацию и докупку лимита через `inflow_vault PDA`. Если `shine_users` или `shine_login_guard` не совпадают по адресам с UI/сервером, регистрация неработоспособна. ## Актуальные адреса (mainnet) - `shine_users`: `SHiNEPr1APdAgNBteUyBXcNovaHctpSjUu8oH2ZJdN6` - `shine_login_guard`: `SHiGxGsXGioQYCYhchQ5R7KWoxN5UjFAFsucPf6sfnh` - `shine_payments`: `SHiPmXbM9Fs9khzRUW3TGKsS2W84aqaXTxs3ZkajW9v` Временный on-chain admin для `shine_users` и `shine_payments` до перевода управления на DAO: - `aiShm43fZjm3YkMs22sYL1bpXaL3bVxv7SSraPHzVgq` ## Подтверждение текущего mainnet deploy - Сеть: `https://api.mainnet-beta.solana.com` - `shine_login_guard`: - `Program ID`: `SHiGxGsXGioQYCYhchQ5R7KWoxN5UjFAFsucPf6sfnh` - TX deploy: `5gCxrw5gj7ig5C3HFf4AUrHq2pMW1LxgfLUj4jtmQvTqXnR7xp1iySf7m63S3MaimpeUyYhQR1zpPFJyPi6NTAv7` - `shine_users`: - `Program ID`: `SHiNEPr1APdAgNBteUyBXcNovaHctpSjUu8oH2ZJdN6` - TX deploy: `5Cwp53EegPv6aV69Ztxj7nXomHt9H9ZaXSgWvDfLPeR5EAaU38ADsQjn9h8xShU34AgttYGwWaVWiicF2vLwJXU9` - `shine_payments`: - `Program ID`: `SHiPmXbM9Fs9khzRUW3TGKsS2W84aqaXTxs3ZkajW9v` - TX deploy: `2vzsM85bTwSxdYvzWKZMpAg7Gqxs8R7CC5T5LTm7cRFizhr11QZvgDKqP77b8n2mcmA6DF4RqwrUrPzQ8bsQhvCn` ## Как адреса связаны между собой - `shine_users` внутри кода вызывает `shine_login_guard`. - `shine_users` внутри кода знает `shine_payments` и переводит оплату в `inflow_vault PDA` этой программы. - `shine_users` и `shine_payments` пока управляются временным адресом `aiShm...`. - Позже эти hardcoded authority-адреса планируется заменить на адреса DAO через upgrade программ. ## Куда вписаны адреса в проекте ### UI - `shine-UI/js/solana-programs.js` - `shine-UI/js/pages/wallet-view.js` - `shine-UI/js/services/solana-register-service.js` - `shine-UI/server-ui/*.html` ### Browser plugin wallet - `SHiNE-browser-plugin-wallet/js/lib/shine-server-resolver.js` ### Сервер - `SHiNE-server/shine-server-config/src/main/java/utils/config/SolanaProgramsConfig.java` ### Solana / Anchor - `shine-solana/shine/Anchor.toml` - `shine-solana/shine/programs/shine_users/src/lib.rs` - `shine-solana/shine/programs/shine_users/src/settings.rs` - `shine-solana/shine/programs/shine_login_guard/src/lib.rs` - `shine-solana/shine/programs/shine_payments/src/lib.rs` - `shine-solana/shine/programs/shine_payments/src/settings.rs` ### Дополнительные потребители - `shine-solana/shine/programs/shine_payments/web/*.html` - `ESP32/.../shine_homeserver_main.ino` - `ESP32/.../shine_homeserver_ui.ino` ## Как запустить инициализацию economy PDA 1. Открыть UI. 2. Перейти: `Профиль -> Настройки -> Настройки разработчика -> Solana: init регистрации`. 3. Подключить mainnet-кошелёк. 4. Нажать `Запустить init_users_economy_config`. 5. Дождаться статуса `Успешно`. Страница вычисляет PDA `users_economy_config` по seed: - seed: `shine_users_economy_config` - program: `SHiNEPr1APdAgNBteUyBXcNovaHctpSjUu8oH2ZJdN6` ## Кто оплачивает create/update user_pda - И обычная регистрация `create_user_pda`, и последующее `update_user_pda` оплачиваются с `clientKey`. - В UI это означает, что Solana fee payer всегда берётся из `device`-ключа пользователя или сервера. - `rootKey` нужен для подписи unsigned PDA-записи, но не оплачивает транзакцию. - Для server UI это особенно важно: перед `create` и `update` нужно пополнять именно Solana-адрес `clientKey`. ## Важно - `init_users_economy_config` выполняется один раз на программу. Если PDA уже создан, повторный вызов вернёт ошибку `already initialized`. - Серверные приватные ключи для Solana не используются как отдельный backend-wallet: транзакцию оплачивает `clientKey`, а содержимое записи подписывает `rootKey`. - `shine_users` внутри `create_user_pda` требует корректный адрес `shine_login_guard` для CPI-классификации логина. - При новом devnet deploy планируется использовать те же program keypair, чтобы `program id` на devnet совпадали с mainnet.