Solidity
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);
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>
істотно: не всю бізнес-логіку потрібно переносити в блокчейн.;== 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;
Приклад:
Remix IDE — браузерне середовище для написання, компіляції, тестування й розгортання Solidity-контрактів.; Приклад read-only функції: mapping(address => uint256) public balances;
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 { } </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.; }
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;
- deployment контракту;
- запис у storage;
- виклики функцій;
- цикли;
- створення контрактів;
- зовнішні виклики;
- логування events;
- обчислення.;
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;">
== Смарт-контракт ==
- Програмування
- Мова програмування
- Blockchain
- Ethereum
- EVM
- Smart contract
- Web3
- DeFi
- NFT
- DAO
- ERC-20
- ERC-721
- ERC-1155
- OpenZeppelin
- Hardhat
- Foundry
- Remix IDE
- JavaScript
- TypeScript
- Rust
- Vyper
- Налагодження коду
- Логування
- Безпека застосунків
- Приватність даних
balances [msg.sender] += amount;