Перейти до вмісту

Solidity

Матеріал з K2 ERP Wiki

Status public status;

Gas

Висновок: Python має змогу бути корисним навколо Web3-проєкту, але on-chain логіка EVM зазвичай пишеться на Solidity.; Struct застосовується для:

Приклад:

function decrement() public {
uint256 public value;
<syntaxhighlight lang="solidity">
</div>
contract OwnableExample {
</div>

'''Небезпека:''' помилка в Solidity має змогу бути не без ускладнень bug, а прямий фінансовий ризик для користувачів і протоколу.;</div>

'''Events''' дозволяють контракту записувати інформацію в logs блокчейну.; // SPDX-License-Identifier: MIT

Inheritance застосовується для:

</div>
'''Практична порада:''' Solidity доречна тоді, коли логіка справді має виконуватися on-chain, а не без ускладнень бути частиною звичайного backend.;<syntaxhighlight lang="solidity">
<syntaxhighlight lang="solidity">
<div style="background:#e7f3ff; border-left:6px solid #2b7cff; padding:12px; margin:12px 0;">

Solidity застосовується для:

Генерація випадковості в блокчейні складна, бо on-chain інформаційні дані часто передбачувані або можуть бути впливовими для валідаторів.; Це створює ризики front-running, sandwich attacks і MEV.; constructor() {

Libraries використовуються для:
Смарт-контракти зазвичай immutable, але існують upgradeable patterns через proxy.; '''Transaction''' змінює стан і потребує gas.;== переважні аспекти Solidity ==

!; paused = true;
Приклад:
<div style="background:#e8f8f5; border-left:6px solid #16a085; padding:12px; margin:12px 0;">

</div>

<div style="background:#eef2ff; border-left:6px solid #4f46e5; padding:12px; margin:12px 0;">

 });

 }
== Storage, memory і calldata ==
fallback() external payable {

'''Практична роль:''' fuzz testing сприяє знаходити помилки, які складно передбачити через ручні test cases.;== Inheritance ==
!; '''істотно:''' смарт-контракт після розгортання має змогу бути складно або неможливо змінити.; value += 1;
Приклад:
 require(newOwner != address(0), "Zero address");

== EVM-сумісні мережі ==

Складніші контракти можуть використовувати ролі:

</div>

<div style="background:#e7f3ff; border-left:6px solid #2b7cff; padding:12px; margin:12px 0;">
<syntaxhighlight lang="solidity">
'''dApp'''  decentralized application, який зазвичай складається з:

pragma solidity ^0.8.0;

Коли Solidity має змогу бути невдалим вибором

Використання:

function setMessage(string calldata newMessage) external {

Hardhat застосовується для: Потрібно тестувати:

Типові помилки початківців

Foundry зазвичай охоплює:

 }

 uint256 amount;

<syntaxhighlight lang="solidity">

 owner = newOwner;

</div>
</div>

 Created,
Загальна логіка:
 uint256 public nextOrderId;
<div style="background:#e8f8f5; border-left:6px solid #16a085; padding:12px; margin:12px 0;">
Поширені помилки:
це мова програмування для створення '''смарт-контрактів''', які виконуються у '''Ethereum Virtual Machine''' або '''EVM''' виступає ключовою рисою '''Solidity'''.; 1.; '''Практична роль:''' modifiers часто використовують для access control, pause checks і повторюваних перевірок.;== Modifiers ==
contract MyContract is Ownable {
'''Практична роль:''' proxy застосовується, коли потрібно оновлювати логіку контракту без зміни адреси, з якою взаємодіють користувачі.; * Foundry Book.; '''Практична роль:''' custom errors допомагають зробити помилки структурованішими й економнішими за gas.;<div style="background:#ecfdf5; border-left:6px solid #10b981; padding:12px; margin:12px 0;">
завдяки наявності '''Практична роль:''' struct користувачі можуть групувати пов’язані поля в одну логічну структуру.; Solidity має кілька способів зупинити виконання.; uint256 public balance;

// SPDX-License-Identifier: MIT

* паролі;
* приватні ключі;
* секретні токени;
* персональні інформаційні дані без потреби;
* комерційні секрети;
* незашифровану приватну інформацію;
* приховані random seed;
* конфіденційні документи.; Він виникає, коли зовнішній контракт має змогу повторно увійти у функцію до завершення попереднього виконання.;== ERC-20 ==

<div style="background:#fff4e5; border-left:6px solid #f39c12; padding:12px; margin:12px 0;">

 bool active;

=== Подія ===
'''Увага:''' запис у storage є собою однією з дорожчих операцій у Solidity, з цієї причини структуру стану потрібно проектувати уважно.;
uint256 public value;

</syntaxhighlight> function addNumber(uint256 value) public { Функції можуть бути:

Solidity має різні області зберігання даних.; У сучасних версіях Solidity переповнення й недоповнення цілих чисел перевіряються автономно, якщо не використано `unchecked`.; ERC-20 — стандарт fungible token у Ethereum/EVM-екосистемі.; * Ethereum Developer Documentation.; !; Effects: оновити стан контракту `require` застосовується для перевірки умов:

Struct і enum

Приклад: Практична роль: правильний вибір типів впливає на безпеку, gas-витрати й зрозумілість контракту.; Access control визначає, хто має змогу виконувати певні дії.; Solidity

<div style="background:#fdecea; border-left:6px solid #e74c3c; padding:12px; margin:12px 0;">
 revert NotOwner();

</div>
Аудит зазвичай перевіряє:
'''DeFi''' або decentralized finance  одна з головних сфер використання Solidity.; Solidity
</div>
 }

<div style="background:#eafaf1; border-left:6px solid #2ecc71; padding:12px; margin:12px 0;">

Приклад dynamic array: State variables зберігаються в блокчейні, з цієї причини їх зміна коштує gas.; Найчастіше використовують `uint256`.; }

Приклад: !;{{SEO

Fuzz testing

OpenZeppelin часто використовують для:

Користувачі взаємодіють із Solidity-контрактами через wallets.; mapping(address => User) public users;

  • математичних операцій;
  • helper-функцій;
  • роботи зі структурами;
  • повторного використання без inheritance;
  • gas optimization у деяких сценаріях.; Rust

істотно: перевірки в Solidity — це частина безпеки контракту.; function deposit() external payable {

* `SPDX-License-Identifier` описує ліцензію;
* `pragma solidity ^0.8.0;` задає сумісну версію компілятора;
* `contract HelloWorld` створює контракт;
* `string public message` зберігає текст у стані контракту;
* `public` автономно створює getter.;</div>

== DeFi ==

* access control;
* arithmetic;
* edge cases;
* revert conditions;
* events;
* token transfers;
* upgrade behavior;
* permissions;
* paused states;
* external calls;
* oracle scenarios;
* attacks simulation;
* gas usage.;</div>
!; Oracles використовуються для:
<div style="background:#e7f3ff; border-left:6px solid #2b7cff; padding:12px; margin:12px 0;">
`int`  знакове ціле число.;</div>
'''істотно:''' visibility не приховує інформаційні дані з блокчейну.; * state variables;
* functions;
* events;
* modifiers;
* structs;
* enums;
* mappings;
* constructor;
* errors;
* inheritance;
* interfaces;
* libraries.;== Address ==

Тестування Solidity-контрактів є собою критично важливим.;</div>

* storage layout;
* admin access;
* upgrade risks;
* initializer замість constructor;
* audit complexity;
* довіру до upgrader.; * Remix IDE Documentation.; Solidity застосовується не лише в Ethereum, а й у багатьох EVM-сумісних мережах.;== Висновок ==
 address buyer;
!; * ConsenSys Smart Contract Best Practices.;== Безпека Solidity ==

<syntaxhighlight lang="text">

</div>

* зберігати інформаційні дані;
* приймати й відправляти активи;
* перевіряти умови;
* виконувати розрахунки;
* викликати інші контракти;
* створювати події;
* керувати ролями;
* реалізовувати токени;
* автоматизувати частину угод.;</div>

</div>

* admin;
* minter;
* burner;
* pauser;
* operator;
* upgrader;
* guardian.; * ERC Standards.;== Oracles ==
<div style="background:#fff4e5; border-left:6px solid #f39c12; padding:12px; margin:12px 0;">
'''Практична роль:''' `view` і `pure` допомагають відрізняти read-only логіку від транзакцій, які змінюють стан.; !; '''Практична роль:''' контракт у Solidity описує on-chain стан і правила взаємодії з цим станом.;<div style="background:#fef2f2; border-left:6px solid #ef4444; padding:12px; margin:12px 0;">
bool public paused;

'''Практична роль:''' invariant testing особливо корисний для DeFi, токенів і складних протоколів.;
→ EVM bytecode

Access control

Контракти

Типові функції ERC-20:

  • DEX;
  • lending;
  • borrowing;
  • liquidity pools;
  • staking;
  • yield farming;
  • derivatives;
  • vaults;
  • stablecoins;
  • liquidations;
  • governance tokens.; Gas — одиниця вартості обчислень в EVM.;
require(msg.sender == owner, "Only owner");

uint і int

Практична роль: events — це ключовий спосіб повідомляти зовнішнім системам про on-chain дії контракту.; !; Критерій !; balances [msg.sender] += msg.value; Приклад:

status: Status.Created
owner = msg.sender;
Практична роль: constructor задає початковий стан контракту перед його використанням.;

Enums використовуються для:

Практична роль: ABI є собою мостом між смарт-контрактом і зовнішніми застосунками.;
Pending,

Receive і fallback

  • звичайних web-застосунків без blockchain-потреби;
  • приватних бізнес-даних;
  • великих обсягів даних;
  • частих обчислень із високою вартістю gas;
  • задач, які краще виконувати off-chain;
  • систем, де потрібна повна конфіденційність;
  • проєктів без бюджету на тестування й аудит;
  • логіки, яку потрібно часто змінювати.; numbers.push(value);
Solidity має синтаксис, схожий на C-подібні мови, але її модель виконання суттєво відрізняється від звичайної backend-розробки: код виконується в блокчейні, операції коштують gas, інформаційні дані можуть бути публічними, а помилки в контракті можуть мати фінансові наслідки.; Практична порада: для стандартних токенів і access control краще використовувати перевірені бібліотеки, ніж писати все з нуля.;
owner = newOwner;

Checks-effects-interactions

Головна думка: Solidity — це мова для on-chain правил і цифрових активів.; Якщо oracle дає неправильні інформаційні дані, контракт має змогу виконати неправильну логіку.; Приклад:

  • `public`;
  • `external`;
  • `internal`;
  • `private`;
  • `view`;
  • `pure`;
  • `payable`.; → compiler

Solidity і Rust

function getValue() public view returns (uint256) {

Functions

Приклад:

  • reentrancy risks;
  • unchecked calls;
  • access control issues;
  • shadowing;
  • dangerous patterns;
  • unused variables;
  • gas inefficiencies;
  • suspicious external calls.; On-chain має бути лише те, що справді потребує прозорості, довіри, токенізації або децентралізованого виконання.; function getBalance(address account) external view returns (uint256) {

Transactions і calls

}

інформаційні дані блокчейну часто індексують окремі сервіси.; Суть прикладу: Solidity-контракт схожий на клас, але після deployment він стає on-chain програмою з власною адресою.;
</div>
== Коли варто використовувати Solidity ==

== Arrays ==

<syntaxhighlight lang="solidity">
<div style="background:#e7f3ff; border-left:6px solid #2b7cff; padding:12px; margin:12px 0;">
 function transfer(address to, uint256 amount) external returns (bool);

Не варто використовувати прості джерела як єдину основу випадковості для цінних призів.; Область
'''істотно:''' навіть із автоматичними перевірками арифметику в фінансових контрактах потрібно тестувати дуже уважно.;<div style="background:#eef2ff; border-left:6px solid #4f46e5; padding:12px; margin:12px 0;">

 mapping(uint256 => Order) public orders;
<div style="background:#fff4e5; border-left:6px solid #f39c12; padding:12px; margin:12px 0;">
'''Увага:''' `msg.sender` має змогу бути не кінцевим користувачем, а іншим контрактом.; !; require(msg.value > 0, "No value sent");

ERC-1155 застосовується для:
== Testing ==

Ownable

Static analysis сприяє знайти потенційні проблеми без виконання контракту.; |- | Основна роль | Смарт-контракти | Скрипти, аналітичні інструменти, backend, testing tools |- | Виконання | EVM | Python runtime |- | Вартість операцій | Gas | Звичайні обчислення off-chain |- | Безпека | On-chain ризики й незворотність | Залежить від застосунку |}

address public owner;

OpenZeppelin — популярна бібліотека перевірених смарт-контрактів і інструментів.; Приклад:

} !; {| class="wikitable"

  • frontend updates;
  • indexing;
  • analytics;
  • audit trail;
  • token transfers;
  • marketplace activity;
  • protocol monitoring.; Gas витрачається на:

Solidity-код компілюється в EVM bytecode, який потім розгортається в блокчейні.;</syntaxhighlight>

`pure` означає, що функція не читає й не змінює стан контракту.;
* високі security-ризики;
* gas-вартість;
* складність upgradeability;
* публічність даних;
* immutable deployment;
* складність тестування економічних сценаріїв;
* залежність від oracle;
* MEV і front-running;
* складність DeFi-інтеграцій;
* потреба в аудиті;
* складність роботи з великими даними;
* обмеження EVM;
* ризик втрати коштів через помилки.;</div>
'''Vyper'''  інша мова для EVM-смарт-контрактів.; message = newMessage;

* Forge для тестування;
* Cast для взаємодії з мережами;
* Anvil для локального node;
* Solidity-based tests;
* fuzz testing;
* scripting.; Контракти можуть зберігати стан, приймати транзакції, викликати інші контракти, випускати токени, вести обліковий облік балансів, керувати правами доступу й автоматизувати частину бізнес-логіки.; Смарт-контракт виконується в іншому середовищі, де помилки дорожчі, інформаційні дані публічні, а зміни часто незворотні.; Solidity підтримує роботу масиви.; * функції;
* аргументи;
* типи;
* return values;
* events;
* errors.; * компіляції;
* migrations;
* deployment;
* тестування;
* contract artifacts;
* JavaScript-based workflow.; function balanceOf(address account) external view returns (uint256);
'''Головне правило:''' хороший Solidity-код має бути простим, протестованим, аудитованим і написаним із розумінням on-chain ризиків.;<div style="background:#e7f3ff; border-left:6px solid #2b7cff; padding:12px; margin:12px 0;">
== ERC-1155 ==
<div style="background:#ecfdf5; border-left:6px solid #10b981; padding:12px; margin:12px 0;">

== Приклади задач на Solidity ==

Він використовувався для:

</div>

* DEX trades;
* auctions;
* liquidations;
* NFT minting;
* oracle updates;
* reward claims;
* order matching.;== NFT ==
'''Головна перевага:''' Solidity є собою стандартним інструментом для створення смарт-контрактів у найбільшій EVM-екосистемі.; }

'''істотно:''' Solidity-розробник має думати не лише про правильність коду, а й про вартість його виконання.; Visibility
Це означає, що контракт призначений для компілятора версії 0.8.x, сумісної із зазначеним діапазоном.; * Ethereum Yellow Paper.;== Invariant testing ==
Events використовуються для:
 Closed

contract Orders {

інформаційні дані в публічному блокчейні зазвичай доступні для перегляду.; function pause() public onlyOwner {
!;<syntaxhighlight lang="solidity">
`revert` явно скасовує виконання:
</div>

 function increment() public {

'''Практична роль:''' smart contract зберігає on-chain стан, а індексатор робить ці інформаційні дані зручними для frontend і аналітики.; contract HelloWorld {

Solidity застосовується для:

<syntaxhighlight lang="solidity">
}
<div style="background:#fff4e5; border-left:6px solid #f39c12; padding:12px; margin:12px 0;">

 _;
== Remix IDE ==
 return value;
'''істотно:''' upgradeability дає гнучкість, але зменшує простоту й має змогу створити додаткові ризики централізованого контролю.; '''Увага:''' inheritance у смарт-контрактах потрібно використовувати обережно, бо складна ієрархія має змогу ускладнити аудит.;== Хороші практики Solidity ==
<syntaxhighlight lang="solidity">
== Custom errors ==

library MathUtils {

<syntaxhighlight lang="text">

== OpenZeppelin ==

<div style="background:#fff4e5; border-left:6px solid #f39c12; padding:12px; margin:12px 0;">
<div style="background:#fff7ed; border-left:6px solid #fb923c; padding:12px; margin:12px 0;">

</syntaxhighlight>

Solidity застосовується для NFT-контрактів, які можуть містити:

  • зберегти адресу;
  • оновити implementation;
  • виправити помилки;
  • додати функції;
  • розділити storage і logic.;

Events

'''Помилка:''' писати Solidity як звичайний backend.;
return a + b;

ERC-721

</syntaxhighlight>

Library — повторно використовуваний код без власного звичайного стану контракту.;</syntaxhighlight> } Wallet має змогу:

Критично: зовнішні виклики в Solidity завжди потрібно розглядати як потенційно небезпечні.;</syntaxhighlight>

`msg.value` — кількість native token, надіслана разом із викликом функції.; істотно: версію Solidity потрібно фіксувати уважно, бо різні версії компілятора можуть мати різну поведінку, оптимізації й правила безпеки.;</syntaxhighlight>

Приклад:

}

 name = newName;
== Ethereum і EVM ==
event Transfer(address indexed from, address indexed to, uint256 amount);

Приклад:

<div style="background:#fef2f2; border-left:6px solid #ef4444; padding:12px; margin:12px 0;">
pragma solidity ^0.8.0;
function setOwner(address newOwner) public {

address payable public treasury;

* балансів;
* allowlists;
* approvals;
* ролей;
* ownership;
* станів користувачів;
* параметрів за адресою.; '''Висновок:''' Solidity має більшу екосистему, а Vyper робить ставку на простіший і більш обмежений дизайн для частини сценаріїв.; * Матеріали щодо EVM, gas, ABI, DeFi security, NFT standards, proxy patterns і smart contract audits.; Status status;
}
Приклад:

Приклади інваріантів:

'''Увага:''' oracle є собою критичною залежністю.;</div>

}

'''істотно:''' великі масиви в storage можуть бути дорогими для gas, особливо якщо функції проходять по всіх елементах.;== Solidity і JavaScript ==
function setName(string calldata newName) external {
<div style="background:#ecfdf5; border-left:6px solid #10b981; padding:12px; margin:12px 0;">
'''Практична роль:''' Solidity має змогу автоматизувати правила голосування й виконання рішень у decentralized governance.; function balanceOf(address account) public view returns (uint256) {
'''Перевага:''' Solidity дає можливість створювати програмовані правила для цифрових активів і взаємодій, які виконуються в блокчейні.; `assert` зазвичай застосовується для внутрішніх інваріантів:

 balances [msg.sender] += msg.value;

 require(msg.sender == owner, "Only owner");
}
== dApp ==

Критично: помилка в access control має змогу дозволити стороннім адресам керувати коштами, mint, upgrade або змінювати критичні параметри контракту.;== Solidity і Vyper ==

Reentrancy

істотно: Solidity-контракт не існує в ізоляції.; Remix корисний для:

  • підписувати транзакції;
  • показувати інформаційні дані контракту;
  • взаємодіяти з dApp;
  • керувати accounts;
  • підтверджувати gas;
  • підписувати повідомлення;
  • підключатися до мереж.; }

}

Solidity підтримує роботу inheritance.; ABI або Application Binary Interface описує, як зовнішні системи взаємодіють із контрактом.; * frontend;

  • wallet connection;
  • smart contracts;
  • ABI;
  • RPC provider;
  • indexing service;
  • off-chain backend у деяких випадках;
  • storage для metadata;
  • monitoring.; * Viem Documentation.; Навіть `private` змінні можуть бути прочитані з raw storage.; enum Status {

Solidity має велику екосистему, стандарти ERC, бібліотеки OpenZeppelin, інструменти Hardhat, Foundry, Remix і широку підтримку в Web3-інфраструктурі.; Водночас вона потребує високої дисципліни: помилки в контрактах можуть бути незворотними, інформаційні дані зазвичай публічні, операції коштують gas, а безпека залежить від тестів, review, аудитів і правильної архітектури.; JavaScript / TypeScript

  • Офіційна документація Solidity.; interface IERC20 {

} Solidity має змогу бути не найкращим вибором для:

msg.sender

Interfaces використовуються для:

Python часто застосовується для scripts, testing, analytics і blockchain automation, але не є собою основною мовою EVM-контрактів.;

require(amount > 0, "Amount must be positive");

  • встановлення owner;
  • початкової конфігурації;
  • задання адрес залежностей;
  • встановлення параметрів токена;
  • ініціалізації стану.;</syntaxhighlight>
<syntaxhighlight lang="solidity">

 }

* Ethereum smart contracts;
* EVM-сумісних мереж;
* ERC-20 токенів;
* NFT;
* DeFi-протоколів;
* DAO;
* staking;
* vesting;
* escrow;
* on-chain governance;
* tokenized assets;
* dApps;
* smart contract wallets;
* blockchain-based automation.;</div>
'''Історична роль:''' Truffle був важливим інструментом ранньої Solidity-екосистеми, хоча в нових проєктах часто обирають Hardhat або Foundry.; // SPDX-License-Identifier: MIT
Приклад:
У цьому прикладі:

<syntaxhighlight lang="solidity">

<syntaxhighlight lang="solidity">

 struct Order {

* сума балансів не перевищує total supply;
* користувач системи не має змогу зняти більше, ніж має;
* paused контракт не виконує заборонені дії;
* резерви не стають від’ємними;
* governance rules не порушуються.;<syntaxhighlight lang="solidity">

<syntaxhighlight lang="solidity">
 Paid,
</div>
</div>
== Mapping ==
<div style="background:#eafaf1; border-left:6px solid #2ecc71; padding:12px; margin:12px 0;">
'''Практична роль:''' ERC-721 надає можливість створювати унікальні токени, де кожен tokenId представляє окремий актив.; '''Ethereum'''  одна з головних платформ для смарт-контрактів.; '''Interface''' описує зовнішній API контракту без реалізації.;== Struct ==
'''Увага:''' контракт має бути безпечним навіть тоді, коли frontend або wallet показує користувачу неповну інформацію.; Solidity застосовується для програмування смарт-контрактів  програм, які зберігаються в блокчейні й виконуються EVM.; }
<div style="background:#fff7ed; border-left:6px solid #fb923c; padding:12px; margin:12px 0;">
 amount: amount,

 }

Навіть якщо змінна позначена як `private`, її значення має змогу бути прочитане з storage.; `receive` викликається, коли контракт отримує native token без calldata.; }

* змінювати параметри;
* pause/unpause;
* встановлювати адреси;
* керувати ролями;
* запускати адміністративні дії.; `view` означає, що функція читає стан, але не змінює його.; Якщо потрібна ітерація, треба окремо зберігати список ключів.;
if (msg.sender != owner) {

Див.; додатково

modifier onlyOwner() {

  • reentrancy;
  • access control;
  • integer logic;
  • oracle manipulation;
  • front-running;
  • MEV;
  • upgradeability risks;
  • storage collision;
  • unchecked external calls;
  • signature replay;
  • authorization bugs;
  • emergency pause;
  • governance attacks;
  • dependency risks;
  • economic exploits.; bool public active = true;

contract Counter { function transfer(address to, uint256 amount) public {

modifier onlyOwner() {
  • `bool`;
  • `uint`;
  • `uint256`;
  • `int`;
  • `address`;
  • `string`;
  • `bytes`;
  • `bytes32`;
  • `enum`;
  • `struct`;
  • arrays;
  • mappings.;

Критично: аудит не гарантує повної безпеки, але для важливих контрактів без аудиту запускати production-логіку з коштами небезпечно.; Modifier надає можливість додати перевірку або спільну логіку до функцій.; * Ethers.js Documentation.; error NotOwner();

  • access control;
  • reentrancy;
  • oracle assumptions;
  • token logic;
  • upgradeability;
  • storage layout;
  • arithmetic;
  • edge cases;
  • governance;
  • admin powers;
  • economic attacks;
  • integration risks.; _;

// SPDX-License-Identifier: MIT

enum Status {

DAO-контракти можуть реалізовувати:

Практична роль: Foundry популярний серед Solidity-розробників, які хочуть писати тести й scripts безпосередньо в Solidity.;
* швидкого пошуку;
* історії подій;
* dashboards;
* аналітики;
* NFT metadata;
* user portfolios;
* marketplace listings;
* protocol metrics.; Значення
<div style="background:#fff7ed; border-left:6px solid #fb923c; padding:12px; margin:12px 0;">

</div>

}

== Upgradeable contracts ==

* цифрового мистецтва;
* collectibles;
* game assets;
* memberships;
* certificates;
* identity tokens;
* tokenized rights;
* унікальних активів.;== ABI ==
revert("Operation failed");
'''Pausable'''  патерн, який надає можливість тимчасово зупинити частину функцій контракту.;</div>
 owner = msg.sender;

Не варто зберігати on-chain:

Критично: у смарт-контрактах тестування — не формальність.; Frontend, scripts і wallets використовують ABI, щоб викликати контракт.; }

  • `totalSupply`;
  • `balanceOf`;
  • `transfer`;
  • `approve`;
  • `allowance`;
  • `transferFrom`.; Solidity

Контракт із власником

}

return balances [account];
  • думати, що `private` приховує інформаційні дані;
  • не тестувати edge cases;
  • не перевіряти access control;
  • писати власний ERC-20 з нуля без потреби;
  • ігнорувати reentrancy;
  • робити великі цикли по storage;
  • не враховувати gas;
  • покладатися лише на frontend-перевірки;
  • неправильно використовувати `tx.origin`;
  • не розуміти proxy storage layout;
  • не перевіряти return values;
  • довіряти oracle без перевірки;
  • не робити аудит важливого контракту;
  • зберігати secrets у контракті.; `msg.sender` — адреса, яка викликала поточну функцію.; Checks: перевірити умови

DAO або decentralized autonomous organization використовує смарт-контракти для governance.; modifier onlyOwner() {

→ smart contract on blockchain
;

Смарт-контракт має змогу:

'''ERC-1155'''  multi-token standard, який має змогу підтримувати як fungible, так і non-fungible токени в одному контракті.;=== Простий лічильник ===
</div>
== Загальний характеристика ==

'''NFT'''  non-fungible token, тобто унікальний токен.; }
function getValue() public view returns (uint256) {
Індексація потрібна для:

function increment() public {

<div style="background:#e8f8f5; border-left:6px solid #16a085; padding:12px; margin:12px 0;">

<div style="background:#eef2ff; border-left:6px solid #4f46e5; padding:12px; margin:12px 0;">
{| class="wikitable"
== DAO ==

== Proxy ==
 address public owner;
'''Основна ідея:''' Solidity надає можливість описувати правила, які виконуються в блокчейні автономно, прозоро й без централізованого сервера.;== Interfaces ==
<syntaxhighlight lang="solidity">
uint256 [3] public fixedNumbers;
</div>
 constructor() {

Приклад:

* повторного використання логіки;
* access control;
* standard contracts;
* token contracts;
* abstract base contracts;
* extension patterns.; }

 Cancelled
'''Практична роль:''' Solidity надає можливість створювати NFT-колекції, marketplaces і on-chain правила володіння цифровими активами.; }

}

</div>

</div>

'''Увага:''' receive і fallback потрібно проектувати обережно, бо вони можуть несподівано приймати платежі або виклики.;</div>
<div style="background:#e7f3ff; border-left:6px solid #2b7cff; padding:12px; margin:12px 0;">
return owner;
→ deployment transaction

Обмеження Solidity

Приклад:

Smart contract audit — це незалежна перевірка коду, архітектури, безпеки й економічної логіки контракту.;

Практична роль: один і той самий Solidity-код часто можна адаптувати для різних EVM-сумісних блокчейнів, але умови gas, інфраструктура й ризики можуть відрізнятися.; contract Counter {

}

Contract у Solidity — основна одиниця коду.; Vyper Call читає стан і не змінює блокчейн.; require(value > 0, "Value is zero");

address public owner;

</syntaxhighlight>

  • checks-effects-interactions;
  • ReentrancyGuard;
  • обережність із зовнішніми викликами;
  • актуалізація стану до переказу коштів;
  • ретельне тестування.; Solidity

істотно: не всю бізнес-логіку потрібно переносити в блокчейн.;== Foundry == Enum описує набір фіксованих значень.; Критерій

}

Constructor виконується один раз під час deployment контракту.; Спочатку перевірки й актуалізація стану, потім взаємодія з іншими контрактами.; До таких мереж можуть належати:

Приклад: int256 public change; Solidity code Безпека є собою центральною темою Solidity-розробки.; з цієї причини помилки в логіці потрібно знаходити до deployment.; string public name = "Token";

Практична роль: interface надає можливість контракту взаємодіяти з іншим контрактом через відомий набір функцій.; Ризикові сценарії:

} Proxy — контракт, який приймає виклики й делегує їх implementation-контракту.; } Висновок: Solidity — центральний вибір для EVM, а Rust часто застосовується там, де потрібна інша blockchain runtime або системна продуктивність.; Для важливих контрактів часто використовують multisig або governance замість одного приватного ключа.;
== Приватність даних ==

* головна мова Ethereum/EVM;
* велика програмний пакет;
* супровід ERC-стандартів;
* OpenZeppelin;
* сумісність із wallets і dApps;
* багато tooling;
* Hardhat;
* Foundry;
* Remix;
* широка спільнота;
* можливість створювати токени;
* DeFi і NFT ecosystem;
* ABI-сумісність;
* супровід багатьох EVM-мереж.; Помилка має змогу призвести до втрати коштів або блокування активів.; // SPDX-License-Identifier: MIT
</div>
Основні типи Solidity:

'''Увага:''' pause-механізм корисний для безпеки, але він додатково додає централізований контроль, який потрібно пояснювати користувачам.; Вона найчастіше застосовують, коли потрібно в Ethereum та інших EVM-сумісних блокчейнах для створення токенів, DeFi-протоколів, NFT, DAO, on-chain логіки, dApp і Web3-застосунків.;<div style="background:#fdecea; border-left:6px solid #e74c3c; padding:12px; margin:12px 0;">
Приклад:
== SPDX License Identifier ==
 orders [nextOrderId] = Order({
|-
| Основна роль
| On-chain smart contracts
| Frontend, scripts, tests, deployment
|-
| Середовище
| EVM
| Browser, Node.js
|-
| інформаційні дані
| On-chain state
| Off-chain UI, integration, tooling
|-
| Вартість виконання
| Gas
| Залежить від runtime
|-
| Типові інструменти
| solc, Hardhat, Foundry
| ethers.js, viem, web3.js, scripts
|}

</div>
Приклад:
<div style="background:#fdecea; border-left:6px solid #e74c3c; padding:12px; margin:12px 0;">

'''Checks-effects-interactions'''  патерн безпечного порядку дій.; * Hardhat Documentation.; Вона застосовується для токенів, NFT, DeFi, DAO, staking, escrow, governance, dApps і різних on-chain механізмів.;<div style="background:#fdecea; border-left:6px solid #e74c3c; padding:12px; margin:12px 0;">

* utility tokens;
* governance tokens;
* stablecoins;
* DeFi;
* rewards;
* payments;
* staking;
* liquidity pools.;</div>

== Visibility ==

'''Практична роль:''' Hardhat добре підходить для командної Solidity-розробки з тестами, deployment scripts і JavaScript/TypeScript-екосистемою.; Простий приклад контракту:

'''Критично:''' Solidity-контракт із коштами потрібно проектувати як фінансову систему: з threat model, тестами, аудитом, monitoring і планом реагування.; Приклад:
uint256 public count = 0;
== Wallets ==
'''Struct''' надає можливість створювати власні структури даних.;</div>
<div style="background:#fff7ed; border-left:6px solid #fb923c; padding:12px; margin:12px 0;">
'''Практична роль:''' enum робить стани контракту зрозумілішими, ніж набір чисел або рядків.; address public owner;

Приклад:
storage Постійне on-chain сховище контракту
memory Тимчасові інформаційні дані під час виконання функції
calldata Read-only інформаційні дані зовнішнього виклику

Remix IDE — браузерне середовище для написання, компіляції, тестування й розгортання Solidity-контрактів.; Приклад read-only функції:

mapping(address => uint256) public balances;

  • станів;
  • етапів процесу;
  • типів заявок;
  • статусів голосування;
  • lifecycle контракту;
  • order states.;
return a + b;
constructor() {

Mapping часто застосовується для: Приклад:

msg.value

'''Oracle''' передає зовнішні інформаційні дані в блокчейн.; Constructor часто застосовується для:

Функції описують дії, які можна виконувати з контрактом.; * явно вказати ліцензію;
* спростити аудит;
* полегшити публікацію коду;
* зробити контракт зрозумілішим для екосистеми.; У публічних блокчейнах транзакції можуть бути видимі до включення в блок.; }
`uint`  беззнакове ціле число.; * emergency stop;
* реагування на інциденти;
* тимчасового блокування ризикових дій;
* контрольованого запуску;
* upgrade або migration windows.;

function add(uint256 a, uint256 b) public pure returns (uint256) { function deposit() public payable {

string public message;

</syntaxhighlight>

</syntaxhighlight>

Захисні підходи:

 function increment() public {
pragma solidity ^0.8.0;
</div>
'''Solidity'''  це головна мова програмування для створення смарт-контрактів у Ethereum та EVM-сумісних мережах.; 3.; function createOrder(uint256 amount) external {
}

Це сприяє:

nextOrderId += 1;
; Основні переважні аспекти Solidity:

receive() external payable {

}

Hardhat — популярне середовище розробки для Ethereum/Solidity.;

</syntaxhighlight> Proxy-підхід надає можливість:

pragma solidity ^0.8.0;

Практична роль: функції є собою публічним або внутрішнім API смарт-контракту.; assert(total >= balance);

Взаємодія з контрактом має змогу бути двох основних типів.; string public message = "Hello, world!";

Indexing

</div>

uint256 [] public numbers;

}

* ERC-20;
* ERC-721;
* ERC-1155;
* Ownable;
* AccessControl;
* Pausable;
* ReentrancyGuard;
* upgradeable contracts;
* governance;
* security helpers.;== Тематичні мітки ==

'''ERC-721'''  стандарт NFT, тобто non-fungible token.; `fallback` викликається, коли функція не знайдена або calldata не відповідає ABI.; У Solidity-файлах часто додають SPDX-ідентифікатор ліцензії.; event MessageChanged(address indexed user, string message);

 }

* використовувати перевірені бібліотеки;
* фіксувати версію компілятора;
* писати тести;
* використовувати fuzz і invariant testing;
* перевіряти access control;
* мінімізувати storage writes;
* уникати зайвих циклів по великих масивах;
* використовувати events;
* документувати припущення;
* перевіряти зовнішні виклики;
* не зберігати секрети on-chain;
* застосовувати checks-effects-interactions;
* використовувати ReentrancyGuard там, де потрібно;
* проводити аудит для важливих контрактів;
* робити deployment checklist.;== Require, revert і assert ==

EVM або Ethereum Virtual Machine — середовище виконання, у якому функціонує байткод смарт-контрактів.; }

`address` — тип для адрес Ethereum/EVM.; застосовується для:

function add(uint256 a, uint256 b) internal pure returns (uint256) {

Solidity часто застосовується разом із JavaScript або TypeScript.; Active,

Перша програма на Solidity

</syntaxhighlight>

emit MessageChanged(msg.sender, newMessage);

Fuzz testing перевіряє контракт на багатьох згенерованих вхідних даних.; Практична роль: Remix — зручний стартовий інструмент для вивчення Solidity й швидкої перевірки контрактів.; Приклад: Практична роль: frontend має розрізняти читання даних і транзакції, які змінюють стан і потребують підтвердження користувача.; Практична роль: правильне використання storage, memory і calldata впливає на gas і коректність роботи контракту.; {| class="wikitable"

Основна ніша EVM smart contracts Systems programming, Solana, WASM smart contracts, backend
Типізація Статична Статична з ownership model
Runtime EVM Native/WASM/інший runtime залежно від платформи
програмний пакет Ethereum/EVM Ширша systems і blockchain програмний пакет
Складність Спеціалізована для EVM Складніша, але універсальніша

Fixed-size array:

value -= 1;

Функція має бути `payable`, щоб приймати native token.; * Ethereum;

  • Polygon;
  • BNB Smart Chain;
  • Avalanche C-Chain;
  • Arbitrum;
  • Optimism;
  • Base;
  • Fantom;
  • Gnosis Chain;
  • інші EVM-сумісні L1 і L2 мережі.;</syntaxhighlight>
function onlyOwnerData() public view returns (address) {

Схематично:

* арифметики;
* invariants;
* edge cases;
* DeFi-логіки;
* access rules;
* unexpected inputs;
* state transitions.; Python
Приклад:
== Hardhat ==

'''Reentrancy'''  один із найвідоміших класів вразливостей у смарт-контрактах.;<syntaxhighlight lang="solidity">

 require(msg.sender == owner, "Only owner");

contract EventExample {

</div>

* transparent proxy;
* UUPS proxy;
* beacon proxy;
* minimal proxy clones.; Це істотно для meta-transactions, proxies і contract calls.; '''Практична роль:''' ERC-1155 зручний, коли в одному проєкті потрібно керувати багатьма типами токенів.; '''істотно:''' owner-адреса є собою критичною точкою довіри.;== Pragma ==
'''Висновок:''' Solidity описує on-chain правила, а JavaScript/TypeScript часто керує frontend, тестами й deployment workflow.;

|- | public | Можна викликати ззовні й усередині контракту |- | external | Зазвичай викликається ззовні контракту |- | internal | Доступно в цьому контракті й контрактах-нащадках |- | private | Доступно лише в цьому контракті |}

contract Ownable {

ERC-721 застосовується для:

// SPDX-License-Identifier: MIT

Visibility визначає, звідки можна викликати функцію або змінну.; Практична роль: Solidity — це високорівнева мова, а EVM — середовище, яке фактично виконує скомпільований контракт.;</syntaxhighlight>

  • виклику інших контрактів;
  • стандартів;
  • інтеграцій;
  • ABI-сумісності;
  • dependency boundaries;
  • тестування.;
}

Приклад: pragma solidity ^0.8.0;

} Поширені підходи:

Randomness

State variables

</syntaxhighlight>

</div>
Solidity варто використовувати для:
address public owner;

}

function changeOwner(address newOwner) public onlyOwner {

Практична роль: address застосовується для користувачів, контрактів, власників, отримувачів платежів і перевірки доступу.; Власник має змогу мати право:

function onlyOwnerAction() public {

Критично: випадковість для лотерей, NFT minting або ігор із цінністю має використовувати спеціальні перевірені механізми, а не прості on-chain значення.; } Приклад:

Front-running і MEV

}

  • компіляції;
  • тестування;
  • local blockchain;
  • deployment scripts;
  • debugging;
  • plugins;
  • TypeScript/JavaScript tooling;
  • integration tests;
  • mainnet forking.; Ownable — поширений патерн, де контракт має власника.; Критерій

Events контракту часто є собою основою для індексації.; Приклад state-changing функції:

Критично: `private` у Solidity означає обмеження доступу з інших контрактів, але не конфіденційність даних у блокчейні.; Interactions: викликати зовнішні контракти або відправити кошти

Типи даних

<div style="background:#fff4e5; border-left:6px solid #f39c12; padding:12px; margin:12px 0;">
</div>

== Pausable ==

Solidity і Python

  • користувацьких профілів;
  • позицій у DeFi;
  • заявок;
  • orders;
  • proposals;
  • metadata;
  • налаштувань.;

</syntaxhighlight>

return balances [account];

Invariant testing перевіряє властивості, які мають залишатися істинними завжди.; pragma solidity ^0.8.0; Практична роль: `msg.value` застосовується для платежів, deposits, minting за оплату й escrow-логіки.; істотно: static analysis корисний, але не замінює тести, review, аудит і розуміння бізнес-логіки.; Простий приклад owner-перевірки: </syntaxhighlight>

value += 1;
!;
  • цін активів;
  • randomness;
  • погоди;
  • спортивних результатів;
  • cross-chain data;
  • proof of reserves;
  • off-chain events.; }
`pragma` задає версію компілятора Solidity.;

ERC-20 токени використовуються для:

}

* ERC-20 токенів;
* NFT;
* DeFi-протоколів;
* DAO;
* governance contracts;
* staking;
* vesting;
* escrow;
* marketplaces;
* on-chain games;
* identity і access control;
* bridges;
* oracles integration;
* dApps;
* smart contract wallets;
* tokenized assets.; Fuzz testing корисний для:

 mapping(address => uint256) public balances;

 require(msg.sender == owner, "Only owner");
</div>
== Constructor ==

`address payable` має змогу отримувати native token через transfer/call.; Потрібно враховувати mempool, порядок транзакцій і економічні стимули учасників мережі.; }

  • навчання;
  • швидких експериментів;
  • прототипів;
  • перевірки синтаксису;
  • простого deployment;
  • взаємодії з контрактами;
  • debugging у навчальних сценаріях.;

`_;` означає місце, де виконується тіло функції.; !; Не можна покладатися лише на frontend.; Підказка: у Solidity-прикладах істотно дивитися не лише на синтаксис, а й на access control, storage, gas, external calls і можливі edge cases.; contract BalanceBook { Mapping — key-value структура в Solidity.; bytes32 public dataHash;

</syntaxhighlight> return value;
  • deployment контракту;
  • запис у storage;
  • виклики функцій;
  • цикли;
  • створення контрактів;
  • зовнішні виклики;
  • логування events;
  • обчислення.;
contract Owned {

Enum

Смарт-контракт — це програма, яка розгортається в блокчейні й виконується за правилами мережі.; uint256 public totalSupply;

Синтаксис C/JavaScript-подібний Python-подібний
Популярність Найпоширеніша EVM-мова Нішевіша
функціональні можливості Багато feature, inheritance, libraries Більш обмежений дизайн
Фокус Гнучкість і програмний пакет Простота й auditability

Libraries

}

State variables — це змінні, які зберігаються в storage контракту.;
  • ownership;
  • minting;
  • transfers;
  • approvals;
  • metadata;
  • royalties;
  • allowlists;
  • reveal logic;
  • marketplace integration.;=== Mapping балансів ===

}

Рекомендовано:

Truffle

value += 1;

Custom errors дозволяють економніше описувати помилки.; Користувачі взаємодіють із контрактом через транзакції або read-only виклики.; * game items;

  • collections;
  • semi-fungible tokens;
  • batch transfers;
  • NFT-платформ;
  • asset bundles.; }

Контракт має змогу містити:

owner = msg.sender;

constructor() {

address public owner;

Audit

Але він додає складність:

<div style="background:#e8f8f5; border-left:6px solid #16a085; padding:12px; margin:12px 0;">

}
'''Практична роль:''' ERC-20 зробив токени сумісними з wallets, exchanges, DeFi-протоколами й аналітичними інструментами.; Її сила в програмованій довірі, але відповідальність розробника значно вища, ніж у звичайній backend-розробці.;<syntaxhighlight lang="solidity">

Інструменти можуть виявляти:

 emit Transfer(msg.sender, to, amount);

Rust застосовується в інших блокчейн-екосистемах і деяких smart contract платформах.; Практична роль: цей патерн зменшує ризик reentrancy і робить порядок виконання зрозумілішим для аудиту.; Критерій

Увага: mapping не можна напряму перебрати як масив.; ABI містить інформацію про: Custom errors часто дешевші за довгі рядкові повідомлення.; Можливі проблеми:

* proposals;
* voting;
* quorum;
* timelocks;
* token-based governance;
* treasury management;
* execution rules;
* roles;
* delegates.;

struct User {

uint256 balance;

Джерела

</syntaxhighlight>

Практична роль: Solidity відповідає за on-chain логіку dApp, але повний застосунок зазвичай має ще frontend, індексацію й off-chain інфраструктуру.; pragma solidity ^0.8.0;

2.; buyer: msg.sender,

_;

View і pure

Truffle — один із ранніх framework-ів для Ethereum-розробки.; // SPDX-License-Identifier: MIT

Solidity має обмеження.; * OpenZeppelin Contracts Documentation.; Значення

function deposit() public payable {

owner = msg.sender;
<div style="background:#fff7ed; border-left:6px solid #fb923c; padding:12px; margin:12px 0;">

<div style="background:#e7f3ff; border-left:6px solid #2b7cff; padding:12px; margin:12px 0;">
'''істотно:''' DeFi-контракти мають не лише технічні, а й економічні ризики: liquidity, oracle manipulation, MEV, governance attacks і systemic dependencies.;== Static analysis ==
Потрібно контролювати:
<syntaxhighlight lang="solidity">
'''Foundry'''  швидкий toolkit для Solidity-розробки.; '''Практична роль:''' SPDX-коментар  невелика, але корисна частина стандартного Solidity-файлу.;<div style="background:#fff4e5; border-left:6px solid #f39c12; padding:12px; margin:12px 0;">

 string name;
'''Практична роль:''' libraries допомагають винести спільну логіку й не дублювати код між контрактами.;<div style="background:#ecfdf5; border-left:6px solid #10b981; padding:12px; margin:12px 0;">
== Смарт-контракт ==

balances [msg.sender] += amount;