SHA256
solana: закрыть griefing создания PDA и заморозку выплат, добавить аудит №2
shine_payments + shine_users: - create_pda_account переведён на «создание поверх предзаполненного» (allocate+assign+добор ренты), чтобы подсев лампортов на детерминированный адрес PDA (тикет/логин) не блокировал создание — закрыт LOW из аудита №1; в shine_payments is_uninitialized_account перестала зависеть от баланса. shine_payments (HIGH из аудита №2): - запрещён recipient == inflow_vault в buy_ticket*, manager_add_ticket и change_ticket_recipient; добавлена защита по умолчанию в transfer_from_vault (require vault.key != recipient.key). Это убирает алиасинг аккаунта в step_payout, который навсегда замораживал очередь выплат и средства вольта. Документация и учёт: - doc/programs/shine_payments.md §3.4, §10.1; doc/programs/shine_users.md §3.3; - Dev_Docs/audit: добавлен аудит №2, обе закрытые находки помечены ИСПРАВЛЕНО; - Dev_Docs/Pending_Features: две записи на ручную e2e-проверку на devnet; - VERSION.properties: client 1.2.161, server 1.2.150. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
co-authored by
Claude Fable 5
parent
01d9553db4
commit
cf6a2830c8
@@ -74,6 +74,23 @@ PDA экономических настроек:
|
||||
users_economy_config_pda = PDA(["shine_users_economy_config"], shine_users_program_id)
|
||||
```
|
||||
|
||||
### 3.3. Правило создания PDA (защита от «минирования» адреса)
|
||||
|
||||
Адрес пользовательской PDA выводится из логина и публично предсказуем: зная желаемый логин,
|
||||
любой может заранее вычислить адрес записи и перевести на него немного лампортов обычным
|
||||
system-переводом. Если бы создание шло строго через `system_instruction::create_account`,
|
||||
такой «подсев» приводил бы к ошибке «account already in use» и навсегда блокировал бы
|
||||
регистрацию этого логина (targeted-DoS / сквоттинг логинов), причём без оплаты комиссии.
|
||||
|
||||
Поэтому `create_pda_account` создаёт аккаунт устойчиво к предзаполненному балансу:
|
||||
|
||||
- если на адресе нет лампортов — обычный `create_account` (быстрый путь);
|
||||
- если лампорты уже есть — «создание поверх предзаполненного»: добор ренты переводом,
|
||||
затем `allocate` + `assign` под подписью PDA.
|
||||
|
||||
Проверки повторной инициализации (`owner == System Program` и пустые данные) остаются и
|
||||
не зависят от баланса аккаунта.
|
||||
|
||||
## 4. Состояния программы
|
||||
|
||||
### 4.1. `UsersEconomyConfigState`
|
||||
|
||||
Reference in New Issue
Block a user