Особливість смарт контрактів solana в тому, що вони stateless, це означає що вони не можуть змінити свій стан. Іменно тому смарт контракти в мережі solana називають програмами. Програми для Solana пишуть на мові програмування Rust.

Акаунт

Акаунт - це основна одиниця в мережі solana. Існує кілька видів акаунтів, а саме:

  • Виконуваний - Це і є програма
  • Тільки для читання - Може використоуватись одночасно кількома програмами.
  • Змінний - Використовуєтся для зберігання даних.

Це структура інформації про акаунт:

pub struct AccountInfo<'a> {
  pub Key: &'a Pubkey,
  pub is_signer: bool,
  pub is_writable: bool,
  pub lamports: Rc<RefCell<&'a mut u64>>,
  pub data: Rc<RefCell<&'a mut [u8]>>,
  pub owner: &'a Pubkey,
  pub executable: bool,
  pub rent_epoch: Epoch,
}

Виконуваний

Вид акаунт визначаєтся цими двома параметрами:

  • is_writable
  • executable

Нескладно догадатись, що якщо виставити executable в true, то акаунт стане програмою, і зможе виконувати код.

Спочатку новий акаунт належить програмі System program, вона може передати акаунт іншому власнику. Дані про власника програми записані в owner, там зберігаєтся публічний ключ власника.

Тільки для читання

Якщо поставити параметр is_writable в false, то акаунт буде доступний тільки для читання. Такі акаунти вирішують завдання паралельної обробки транзакцій. Так як цей акаунт не можна змінити можна бути впевненим, що дані які в ньому зберігаются вірні.

Змінний

Роль цього акаунта - зберігання даних. Акаунт цього виду може володіти іншими акаунтами. Для можливості змінювати інформацію, яка зберігаєтся в акаунті парамтер is_writable потрібно поставити в true.

Утримання акаунта

Акаунти - не безплатні, і якщо ви не можете утримувати акаунт - то його просто видаляють. Існує два способа утримання акаунта

Оренда акаунта

Раз в епоху з акаунта буде зніматись невелика кількість лампортів.

Забезпечення акаунта

Якщо баланс акаунта перевищить визначену суму, то акаунт не буде видалено в будь якому випадку.

Лампорт

1 lamport = 0.000000001 SOL


The end.