CREATOR_Settings_Update - my-crypto-datascience-portfolio/my_crypto_donations_bank_solana GitHub Wiki

Базовые настройки банка донатов

Настройки банка донатов хранятся в PDA, привязанному к публичному адресу банка донатов (известному всем и прописанному в WEB UI - куда, собственно, всем USER'ам донатить).

Восстановление адреса PDA из SEED и адреса смарт-контракта &id (через find_program_address):

Pubkey::find_program_address(&[SETTINGS_SEED.as_bytes()], &id())

Адрес PDA для настроек создается автоматически внутри смарт-контракта (на основе SEED и публичного адреса банка донатов).

Адрес PDA может запросить на чтение (по известному SEED) - любой USER (в том числе, из WEB UI).

Адрес PDA может запросить на запись - только CREATOR (транзакция UPDATE настроек).

  • Это реализуется при помощи проверки адреса CREATOR'а, а НЕ на основе подписи CREATOR'а.

Инициализация настроек

Первый (и единственный) UPDATE настроек происходит при создании банка донатов (или кампании по сбору).

Мы нигде не храним ключи от настроек для банка донатов. Т.е. атака на настройки - нетривиальный процесс.


Проверка адреса настроек - защита от подмены настроек со стороны USER'ов

is_ok_settings_pubkey:

    pub fn is_ok_settings_pubkey(settings_pubkey: &Pubkey) -> bool { 

        let (pubkey, _) = Self::get_settings_pubkey_with_bump();

        pubkey.to_bytes() == settings_pubkey.to_bytes()
    }


    pub fn get_settings_pubkey_with_bump() -> (Pubkey, u8) {

        Pubkey::find_program_address(&[SETTINGS_SEED.as_bytes()], &id())

    }

Аккаунты (для транзакции установки настроек)

0. `[signer, writable]` Owner of ToaPayoh Bank | Владелец платформы банка донатов - кто платит за создание аккаунта
1. `[writable]` settings_account, PDA
2. `[]` Rent sysvar | Программа для оценки количества lamport, чтобы содержать аккаунт
3. `[]` System program | Системная программа для создания аккаунтов и перевода lamport

Использование настроек банка донатов

Какой функционал подразумевает чтение настроек:

  • Проводка доната от USER'а (чтение настройки комиссии CREATOR'а)

Стоимость транзакции по установке настроек

Если SOL = 70$

COST = 0,00156708 (расход SOL на газ) * 70$ ~ 0.1 $


Варианты чтения настроек из WEB клиента

1. Выборка по ключу Pubkey программы банка + фильтр нужной структуры из всей генеральной выборки

connection.getProgramAccounts(this.programId, {..});

С последующим deserializeBankSettings(accountId: PublicKey, data: Buffer): DonationBankSettings

Этот вариант может быть НЕ оптимален для большого числа донатов в системе.

2. Выборка по ключу Pubkey самих настроек

const account = await this.connection.getAccountInfo(this.settingsPubkey)

Мы можем точно знать настройки всего банка (создаются один раз), но можем не знать адрес настроек отдельных кампаний (динамически создаются).

Т.е. данный вариант НЕ оптимален для сервиса с любым количеством кампаний по сбору донатов.