Solidity
Приклади інваріантів:
2. pragma solidity ^0.8.0;
return a + b;
`int` — знакове ціле число. Vyper
- access control;
- reentrancy;
- oracle assumptions;
- token logic;
- upgradeability;
- storage layout;
- arithmetic;
- edge cases;
- governance;
- admin powers;
- economic attacks;
- integration risks. Status public status;
Практична роль: constructor задає початковий стан контракту перед його використанням. ! }
ERC-721 — стандарт NFT, тобто non-fungible token. function onlyOwnerAction() public {
value += 1;
== Ownable ==
'''Remix IDE''' — браузерне середовище для написання, компіляції, тестування й розгортання Solidity-контрактів. }
balances [msg.sender] += amount;
</div>
{{SEO
|title=Solidity — мова програмування для смарт-контрактів, Ethereum, EVM, DeFi, NFT і Web3
|description=Solidity — Wiki-стаття про мову програмування для створення смарт-контрактів у мережах Ethereum та інших EVM-сумісних блокчейнах. Розглянуто синтаксис Solidity, EVM, smart contracts, gas, ABI, Remix, Hardhat, Foundry, Truffle, OpenZeppelin, ERC-20, ERC-721, ERC-1155, DeFi, NFT, events, modifiers, inheritance, security, testing, audits, переваги, обмеження і хороші практики.
|keywords=Solidity, мова програмування Solidity, Solidity programming language, smart contracts, смарт-контракти, Ethereum, EVM, Web3, blockchain, DeFi, NFT, ERC-20, ERC-721, ERC-1155, ABI, gas, Remix IDE, Hardhat, Foundry, Truffle, OpenZeppelin, Ethereum Virtual Machine, dApp, програмування
|alternativeTo=ручне виконання угод без смарт-контрактів; централізована бізнес-логіка для блокчейн-активів; закриті backend-правила там, де потрібна on-chain прозорість; ручне керування токенами; централізовані NFT-рішення; кастомні блокчейн-скрипти без стандартів; неаудитована логіка DeFi; традиційні контракти для частини автоматизованих Web3-сценаріїв
}}
</div>
}
</div>
! Interfaces використовуються для:
pragma solidity ^0.8.0;
'''Практична роль:''' Solidity — це високорівнева мова, а EVM — середовище, яке фактично виконує скомпільований контракт. Він виникає, коли зовнішній контракт здатна повторно увійти у функцію до завершення попереднього виконання. pragma solidity ^0.8.0;
require(msg.value > 0, "No value sent");
mapping(address => User) public users;
}
<div style="background:#fff7ed; border-left:6px solid #fb923c; padding:12px; margin:12px 0;">
enum Status {
<syntaxhighlight lang="solidity">
'''Висновок:''' Solidity — провідний вибір для EVM, а Rust часто застосовується для там, де потрібна інша blockchain runtime або системна продуктивність. Значення
застосовується для для:
pragma solidity ^0.8.0;
'''критично:''' навіть із автоматичними перевірками арифметику в фінансових контрактах потрібно тестувати дуже уважно. string public name = "Token";
<div style="background:#eafaf1; border-left:6px solid #2ecc71; padding:12px; margin:12px 0;">
</div>
|-
| Основна роль
| Смарт-контракти
| Скрипти, аналітичні інструменти, backend, testing tools
|-
| Виконання
| EVM
| Python runtime
|-
| Вартість операцій
| Gas
| Звичайні обчислення off-chain
|-
| Безпека
| On-chain ризики й незворотність
| Залежить від застосунку
|}
</div>
</syntaxhighlight>
enum Status {
інформаційні дані блокчейну часто індексують окремі сервіси. value += 1; Solidity має різні області зберігання даних. Solidity
Remix IDE
Практична роль: enum робить стани контракту зрозумілішими, ніж набір чисел або рядків. критично: смарт-контракт після розгортання здатна бути складно або неможливо змінити.== Transactions і calls ==
}
Захисні підходи:
- функції;
- аргументи;
- типи;
- return values;
- events;
- errors.=== Контракт із власником ===
Access control
Solidity застосовується для:
Безпека виступає як центральною темою Solidity-розробки. Критерій
Solidity застосовується для для програмування смарт-контрактів — програм, які зберігаються в блокчейні й виконуються EVM.Mapping
require(msg.sender == owner, "Only owner");
Paid,
Приклад:
- зберегти адресу;
- оновити implementation;
- виправити помилки;
- додати функції;
- розділити storage і logic. * Ethereum;
- Polygon;
- BNB Smart Chain;
- Avalanche C-Chain;
- Arbitrum;
- Optimism;
- Base;
- Fantom;
- Gnosis Chain;
- інші EVM-сумісні L1 і L2 мережі. * OpenZeppelin Contracts Documentation. ERC-20 токени використовуються для:
}
uint256 public totalSupply;
`fallback` викликається, коли функція не знайдена або calldata не відповідає ABI.</syntaxhighlight>
Interfaces
// SPDX-License-Identifier: MIT
Solidity підтримує масиви. * Remix IDE Documentation.</syntaxhighlight>
Ownable — поширений патерн, де контракт має власника. Увага: receive і fallback потрібно проектувати обережно, бо вони можуть несподівано приймати платежі або виклики. function transfer(address to, uint256 amount) public {
Truffle — один із ранніх framework-ів для Ethereum-розробки. * Foundry Book. Приклад:
Практична роль: Solidity дає можливість створювати NFT-колекції, marketplaces і on-chain правила володіння цифровими активами. Не можна покладатися лише на frontend. Mapping часто застосовується для для:
}
</div>
'''Висновок:''' Python здатна бути корисним навколо Web3-проєкту, але on-chain логіка EVM зазвичай пишеться на Solidity.== Randomness ==
}
uint256 public balance;
// SPDX-License-Identifier: MIT
<div style="background:#e8f8f5; border-left:6px solid #16a085; padding:12px; margin:12px 0;">
modifier onlyOwner() {
</div>
<div style="background:#fdecea; border-left:6px solid #e74c3c; padding:12px; margin:12px 0;">
</div>
'''критично:''' не всю бізнес-логіку потрібно переносити в блокчейн.</div>
=== Простий лічильник ===
contract Counter {
Поширені помилки:
<syntaxhighlight lang="solidity">
require(msg.sender == owner, "Only owner");
Рекомендовано:
* DEX trades;
* auctions;
* liquidations;
* NFT minting;
* oracle updates;
* reward claims;
* order matching.<div style="background:#e7f3ff; border-left:6px solid #2b7cff; padding:12px; margin:12px 0;">
owner = msg.sender;
Testing
</div>
* ERC-20;
* ERC-721;
* ERC-1155;
* Ownable;
* AccessControl;
* Pausable;
* ReentrancyGuard;
* upgradeable contracts;
* governance;
* security helpers. }
</div>
</div>
<div style="background:#fef2f2; border-left:6px solid #ef4444; padding:12px; margin:12px 0;">
'''Interface''' описує зовнішній API контракту без реалізації. function getBalance(address account) external view returns (uint256) {
</div>
owner = msg.sender;
'''Практична роль:''' правильне використання storage, memory і calldata впливає на gas і коректність роботи контракту. Checks: перевірити умови
Solidity застосовується для для NFT-контрактів, які можуть містити:
}
Це оптимізує:
<syntaxhighlight lang="text">
== Libraries ==
'''Увага:''' запис у storage виступає як однією з дорожчих операцій у Solidity, тому структуру стану потрібно проектувати уважно. Навіть `private` змінні можуть бути прочитані з raw storage. Active,
'''Solidity''' — це головна мова програмування для створення смарт-контрактів у Ethereum та EVM-сумісних мережах. * Ethers.js Documentation.<div style="background:#ecfdf5; border-left:6px solid #10b981; padding:12px; margin:12px 0;">
Функція має бути `payable`, щоб приймати native token. Приклад:
== ERC-20 ==
fallback() external payable {
У Solidity-файлах часто додають SPDX-ідентифікатор ліцензії. Поширені підходи:
State variables зберігаються в блокчейні, тому їх зміна коштує gas. '''Практична роль:''' один і той самий Solidity-код часто можна адаптувати для різних EVM-сумісних блокчейнів, але умови gas, інфраструктура й ризики можуть відрізнятися. Static analysis оптимізує знайти потенційні проблеми без виконання контракту. → EVM bytecode
<div style="background:#fff4e5; border-left:6px solid #f39c12; padding:12px; margin:12px 0;">
=== Подія ===
require(newOwner != address(0), "Zero address");
'''Практична роль:''' address застосовується для для користувачів, контрактів, власників, отримувачів платежів і перевірки доступу. Для важливих контрактів часто використовують multisig або governance замість одного приватного ключа. '''Критично:''' зовнішні виклики в Solidity завжди потрібно розглядати як потенційно небезпечні. Приклад:
Python часто застосовується для для scripts, testing, analytics і blockchain automation, але не виступає як основною мовою EVM-контрактів.</div>
== Enum ==
}
</div>
* цифрового мистецтва;
* collectibles;
* game assets;
* memberships;
* certificates;
* identity tokens;
* tokenized rights;
* унікальних активів. * ConsenSys Smart Contract Best Practices.
Solidity і Vyper
Приклад:
constructor() {
- використовувати перевірені бібліотеки;
- фіксувати версію компілятора;
- писати тести;
- використовувати fuzz і invariant testing;
- перевіряти access control;
- мінімізувати storage writes;
- уникати зайвих циклів по великих масивах;
- використовувати events;
- документувати припущення;
- перевіряти зовнішні виклики;
- не зберігати секрети on-chain;
- застосовувати checks-effects-interactions;
- використовувати ReentrancyGuard там, де потрібно;
- проводити аудит для важливих контрактів;
- робити deployment checklist. `address` — тип для адрес Ethereum/EVM.
* паролі; * приватні ключі; * секретні токени; * персональні інформаційні дані без потреби; * комерційні секрети; * незашифровану приватну інформацію; * приховані random seed; * конфіденційні документи. '''критично:''' upgradeability дає гнучкість, але зменшує простоту й здатна створити додаткові ризики централізованого контролю. owner = newOwner; string public message = "Hello, world!"; Потрібно контролювати: == Invariant testing == == Смарт-контракт == ! '''Критично:''' аудит не гарантує повної безпеки, але для важливих контрактів без аудиту запускати production-логіку з коштами небезпечно. ! Але він додає складність: '''Практична роль:''' Solidity здатна цифровізувати правила голосування й виконання рішень у decentralized governance. Solidity застосовується для для: message = newMessage; <div style="background:#ecfdf5; border-left:6px solid #10b981; padding:12px; margin:12px 0;"> Pending,
}критично: static analysis корисний, але не замінює тести, review, аудит і розуміння бізнес-логіки.
! Solidity
Контракти
Приклад:
Увага: inheritance у смарт-контрактах потрібно використовувати обережно, бо складна ієрархія здатна ускладнити аудит.uint256 [] public numbers;
- навчання;
- швидких експериментів;
- прототипів;
- перевірки синтаксису;
- простого deployment;
- взаємодії з контрактами;
- debugging у навчальних сценаріях. Смарт-контракт здатна:
- deployment контракту;
- запис у storage;
- виклики функцій;
- цикли;
- створення контрактів;
- зовнішні виклики;
- логування events;
- обчислення. * Матеріали щодо EVM, gas, ABI, DeFi security, NFT standards, proxy patterns і smart contract audits.== msg.value ==
}
'''Struct''' дає можливість створювати власні структури даних. Генерація випадковості в блокчейні складна, бо on-chain інформаційні дані часто передбачувані або можуть бути впливовими для валідаторів.<div style="background:#fff4e5; border-left:6px solid #f39c12; padding:12px; margin:12px 0;">
<div style="background:#ecfdf5; border-left:6px solid #10b981; padding:12px; margin:12px 0;">
'''Критично:''' Solidity-контракт із коштами потрібно проектувати як фінансову систему: з threat model, тестами, аудитом, monitoring і планом реагування. '''Практична роль:''' ERC-20 зробив токени сумісними з wallets, exchanges, DeFi-протоколами й аналітичними інструментами. '''Call''' читає стан і не змінює блокчейн. '''Смарт-контракт''' — це програма, яка розгортається в блокчейні й виконується за правилами мережі.<div style="background:#ecfdf5; border-left:6px solid #10b981; padding:12px; margin:12px 0;">
}
Fuzz testing корисний для:
== Приватність даних ==
<div style="background:#fdecea; border-left:6px solid #e74c3c; padding:12px; margin:12px 0;">
* думати, що `private` приховує інформаційні дані;
* не тестувати edge cases;
* не перевіряти access control;
* писати власний ERC-20 з нуля без потреби;
* ігнорувати reentrancy;
* робити великі цикли по storage;
* не враховувати gas;
* покладатися лише на frontend-перевірки;
* неправильно використовувати `tx.origin`;
* не розуміти proxy storage layout;
* не перевіряти return values;
* довіряти oracle без перевірки;
* не робити аудит важливого контракту;
* зберігати secrets у контракті.== DeFi ==
function decrement() public {
<div style="background:#e7f3ff; border-left:6px solid #2b7cff; padding:12px; margin:12px 0;">
<div style="background:#fff4e5; border-left:6px solid #f39c12; padding:12px; margin:12px 0;">
<div style="background:#eafaf1; border-left:6px solid #2ecc71; padding:12px; margin:12px 0;">
Remix корисний для:
</div>
</div>
! Events використовуються для:
'''Практична роль:''' `msg.value` застосовується для для платежів, deposits, minting за оплату й escrow-логіки. Простий приклад контракту:
- цін активів;
- randomness;
- погоди;
- спортивних результатів;
- cross-chain data;
- proof of reserves;
- off-chain events.
Solidity застосовується для не лише в Ethereum, а й у багатьох EVM-сумісних мережах.== dApp ==
Помилка: писати Solidity як звичайний backend. * швидкого пошуку;
- історії подій;
- dashboards;
- аналітики;
- NFT metadata;
- user portfolios;
- marketplace listings;
- protocol metrics. require(msg.sender == owner, "Only owner");
</syntaxhighlight>
bool public paused;
- checks-effects-interactions;
- ReentrancyGuard;
- обережність із зовнішніми викликами;
- оновлення версій стану до переказу коштів;
- ретельне тестування. ! return balances [account];
constructor() { Практична роль: цей патерн зменшує ризик reentrancy і робить порядок виконання зрозумілішим для аудиту. Rust
numbers.push(value);
}
- компіляції;
- тестування;
- local blockchain;
- deployment scripts;
- debugging;
- plugins;
- TypeScript/JavaScript tooling;
- integration tests;
- mainnet forking. `_;` означає місце, де виконується тіло функції. це мова програмування; так само реалізовано які виконуються у Ethereum Virtual Machine або EVM виступає ключовою рисою створення смарт-контрактів забезпечується через Solidity. Приклад:
Checks-effects-interactions
}
string public message; nextOrderId += 1;
Практична роль: `view` і `pure` допомагають відрізняти read-only логіку від транзакцій, які змінюють стан. Вона застосовується для для токенів, NFT, DeFi, DAO, staking, escrow, governance, dApps і різних on-chain механізмів. Visibility
Solidity має обмеження.Приклад: критично: owner-адреса виступає як критичною точкою довіри. ERC-20 — стандарт fungible token у Ethereum/EVM-екосистемі. Водночас вона потребує високої дисципліни: помилки в контрактах можуть бути незворотними, інформаційні дані зазвичай публічні, операції коштують gas, а безпека залежить від тестів, review, аудитів і правильної архітектури. }
Solidity має синтаксис, схожий на C-подібні мови, але її модель виконання суттєво відрізняється від звичайної backend-розробки: код виконується в блокчейні, операції коштують gas, інформаційні дані можуть бути публічними, а помилки в контракті можуть мати фінансові наслідки. * access control;
- arithmetic;
- edge cases;
- revert conditions;
- events;
- token transfers;
- upgrade behavior;
- permissions;
- paused states;
- external calls;
- oracle scenarios;
- attacks simulation;
- gas usage.== Джерела ==
- 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.== Solidity і JavaScript ==
Аудит зазвичай перевіряє:
address public owner;
}
bool active;
Основні конкурентні переваги Solidity:
SPDX License Identifier
</syntaxhighlight> pragma solidity ^0.8.0; </syntaxhighlight>
Solidity здатна бути не найкращим вибором для:
Constructor
- `public`;
- `external`;
- `internal`;
- `private`;
- `view`;
- `pure`;
- `payable`.
uint256 amount;
- game items;
- collections;
- semi-fungible tokens;
- batch transfers;
- NFT-платформ;
- asset bundles. Критерій
Solidity має велику екосистему, стандарти ERC, бібліотеки OpenZeppelin, інструменти Hardhat, Foundry, Remix і широку підтримку в Web3-інфраструктурі.== конкурентні переваги Solidity ==
Практична роль: правильний вибір типів впливає на безпеку, gas-витрати й зрозумілість контракту. 1. Effects: оновити стан контракту
address payable public treasury; Не варто зберігати on-chain:
Modifiers
</syntaxhighlight>
Transaction змінює стан і потребує gas. function increment() public {
Приклад:
Visibility
<syntaxhighlight lang="solidity">
Приклад:
'''Mapping''' — key-value структура в Solidity.== Тематичні мітки ==
* ownership;
* minting;
* transfers;
* approvals;
* metadata;
* royalties;
* allowlists;
* reveal logic;
* marketplace integration. function increment() public {
require(value > 0, "Value is zero");
</div>
<div style="background:#e8f8f5; border-left:6px solid #16a085; padding:12px; margin:12px 0;">
contract Orders {
return value;
function increment() public {
== Типові помилки початківців ==
</div>
'''Практична роль:''' smart contract зберігає on-chain стан, а індексатор робить ці інформаційні дані зручними для frontend і аналітики. '''DeFi''' або decentralized finance — одна з головних сфер використання Solidity. Якщо oracle дає неправильні інформаційні дані, контракт здатна виконати неправильну логіку.== Pausable ==
}
Приклад:
}
<div style="background:#eafaf1; border-left:6px solid #2ecc71; padding:12px; margin:12px 0;">
<syntaxhighlight lang="solidity">
<syntaxhighlight lang="solidity">
}
- явно вказати ліцензію;
- спростити аудит;
- полегшити публікацію коду;
- зробити контракт зрозумілішим для екосистеми. Приклад:
Практична порада: Solidity доречна тоді, коли логіка справді має виконуватися on-chain, а не без зусиль бути частиною звичайного backend. require(amount > 0, "Amount must be positive"); Invariant testing перевіряє властивості, які мають залишатися істинними завжди. * Hardhat Documentation.</syntaxhighlight>
mapping(address => uint256) public balances; `msg.value` — кількість native token, надіслана разом із викликом функції. * високі security-ризики;
- gas-вартість;
- складність upgradeability;
- публічність даних;
- immutable deployment;
- складність тестування економічних сценаріїв;
- залежність від oracle;
- MEV і front-running;
- складність DeFi-інтеграцій;
- потреба в аудиті;
- складність роботи з великими даними;
- обмеження EVM;
- ризик втрати коштів через помилки. Навіть якщо змінна позначена як `private`, її значення здатна бути прочитане з storage. * `bool`;
- `uint`;
- `uint256`;
- `int`;
- `address`;
- `string`;
- `bytes`;
- `bytes32`;
- `enum`;
- `struct`;
- arrays;
- mappings. Приклад:
Найчастіше використовують `uint256`.<syntaxhighlight lang="solidity">
Власник здатна мати право:
_;
* admin;
* minter;
* burner;
* pauser;
* operator;
* upgrader;
* guardian. }
* станів;
* етапів процесу;
* типів заявок;
* статусів голосування;
* lifecycle контракту;
* order states. Інструменти можуть виявляти:
</div>
'''критично:''' великі масиви в storage можуть бути дорогими для gas, особливо якщо функції проходять по всіх елементах.</div>
'''Vyper''' — інша мова для EVM-смарт-контрактів. Приклад:
}
== Приклади задач на Solidity ==
return value;
'''Головне правило:''' хороший Solidity-код має бути простим, протестованим, аудитованим і написаним із розумінням on-chain ризиків. Вона найчастіше застосовують. function createOrder(uint256 amount) external {
name = newName;
Hardhat застосовується для для:
function transfer(address to, uint256 amount) external returns (bool);
<div style="background:#e7f3ff; border-left:6px solid #2b7cff; padding:12px; margin:12px 0;">
== msg.sender ==
</div>
revert("Operation failed");
'''Історична роль:''' Truffle був важливим інструментом ранньої Solidity-екосистеми, хоча в нових проєктах часто обирають Hardhat або Foundry. int256 public change;
value -= 1;
Функції можуть бути:
* підписувати транзакції;
* показувати інформаційні дані контракту;
* взаємодіяти з dApp;
* керувати accounts;
* підтверджувати gas;
* підписувати повідомлення;
* підключатися до мереж. mapping(uint256 => Order) public orders;
Enums використовуються для: uint256 public count = 0;
Критично: помилка в access control здатна дозволити стороннім адресам керувати коштами, mint, upgrade або змінювати критичні параметри контракту. }
`view` означає, що функція читає стан, але не змінює його. owner = msg.sender;
address buyer;
contract Owned {
Практична порада: для стандартних токенів і access control краще використовувати перевірені бібліотеки, ніж писати все з нуля.View і pure
balances [msg.sender] += msg.value;
- звичайних web-застосунків без blockchain-потреби;
- приватних бізнес-даних;
- великих обсягів даних;
- частих обчислень із високою вартістю gas;
- задач, які краще виконувати off-chain;
- систем, де потрібна повна конфіденційність;
- проєктів без бюджету на тестування й аудит;
- логіки, яку потрібно часто змінювати.
'''Fuzz testing''' перевіряє контракт на багатьох згенерованих вхідних даних. Status status; </div> '''критично:''' Solidity-контракт не існує в ізоляції. * Ethereum Developer Documentation.== Receive і fallback == '''Небезпека:''' помилка в Solidity здатна бути не без зусиль bug, а прямий фінансовий ризик для користувачів і протоколу. '''OpenZeppelin''' — популярна бібліотека перевірених смарт-контрактів і інструментів. У сучасних версіях Solidity переповнення й недоповнення цілих чисел перевіряються автоматизовано, якщо не використано `unchecked`.<div style="background:#e7f3ff; border-left:6px solid #2b7cff; padding:12px; margin:12px 0;"> ! Смарт-контракт виконується в іншому середовищі, де помилки дорожчі, інформаційні дані публічні, а зміни часто незворотні. Приклад: '''Практична роль:''' ERC-1155 зручний, коли в одному проєкті потрібно керувати багатьма типами токенів. modifier onlyOwner() { <div style="background:#eafaf1; border-left:6px solid #2ecc71; padding:12px; margin:12px 0;"> event Transfer(address indexed from, address indexed to, uint256 amount); Використання: return balances [account];
interface IERC20 {
ERC-1155 застосовується для для:
}
'''Pausable''' — патерн, який дає можливість тимчасово зупинити частину функцій контракту. revert NotOwner();
Приклад:
<div style="background:#e8f8f5; border-left:6px solid #16a085; padding:12px; margin:12px 0;">
`pure` означає, що функція не читає й не змінює стан контракту. Контракти можуть зберігати стан, приймати транзакції, викликати інші контракти, випускати токени, вести обліковий облік балансів, керувати правами доступу й цифровізувати частину бізнес-логіки. Помилка здатна призвести до втрати коштів або блокування активів. * Ethereum Yellow Paper. '''Суть прикладу:''' Solidity-контракт схожий на клас, але після deployment він стає on-chain програмою з власною адресою. owner = newOwner;
'''Практична роль:''' SPDX-коментар — невелика, але корисна частина стандартного Solidity-файлу. * Viem Documentation. '''критично:''' версію Solidity потрібно фіксувати уважно, бо різні версії компілятора можуть мати різну поведінку, оптимізації й правила безпеки. `address payable` здатна отримувати native token через transfer/call. ! JavaScript / TypeScript
NFT
orders [nextOrderId] = Order({
}); string name; _;
</div>
function deposit() public payable {
emit Transfer(msg.sender, to, amount);
== Require, revert і assert ==
Oracles використовуються для:
<div style="background:#fef2f2; border-left:6px solid #ef4444; padding:12px; margin:12px 0;">
<div style="background:#eafaf1; border-left:6px solid #2ecc71; padding:12px; margin:12px 0;">
<syntaxhighlight lang="solidity">
== Hardhat ==
function deposit() public payable {
Functions
Upgradeable contracts
- балансів;
- allowlists;
- approvals;
- ролей;
- ownership;
- станів користувачів;
- параметрів за адресою.
EVM або Ethereum Virtual Machine — середовище виконання, у якому функціонує байткод смарт-контрактів. contract HelloWorld { </syntaxhighlight>
`uint` — беззнакове ціле число.== Wallets == Це означає, що контракт призначений для компілятора версії 0.8.x, сумісної із зазначеним діапазоном.== Коли Solidity здатна бути невдалим вибором == Ризикові сценарії:
function changeOwner(address newOwner) public onlyOwner {
Безпека Solidity
</syntaxhighlight>
- DEX;
- lending;
- borrowing;
- liquidity pools;
- staking;
- yield farming;
- derivatives;
- vaults;
- stablecoins;
- liquidations;
- governance tokens. function onlyOwnerData() public view returns (address) {
- storage layout;
- admin access;
- upgrade risks;
- initializer замість constructor;
- audit complexity;
- довіру до upgrader.
Fuzz testing
}
<div style="background:#e8f8f5; border-left:6px solid #16a085; padding:12px; margin:12px 0;">
* transparent proxy;
* UUPS proxy;
* beacon proxy;
* minimal proxy clones. Interactions: викликати зовнішні контракти або відправити кошти
uint і int
require(msg.sender == owner, "Only owner");
→ compiler
State variables — це змінні, які зберігаються в storage контракту. pragma solidity ^0.8.0;
- повторного використання логіки;
- access control;
- standard contracts;
- token contracts;
- abstract base contracts;
- extension patterns. Практична роль: ERC-721 дає можливість створювати унікальні токени, де кожен tokenId представляє окремий актив. mapping(address => uint256) public balances;
// SPDX-License-Identifier: MIT
Увага: oracle виступає як критичною залежністю. У публічних блокчейнах транзакції можуть бути видимі до включення в блок. ABI або Application Binary Interface описує, як зовнішні системи взаємодіють із контрактом. Область Схематично:
return owner;
- `SPDX-License-Identifier` описує ліцензію;
- `pragma solidity ^0.8.0;` задає сумісну версію компілятора;
- `contract HelloWorld` створює контракт;
- `string public message` зберігає текст у стані контракту;
- `public` автоматизовано створює getter.== Типи даних ==
Перша програма на Solidity
Практична роль: функції виступає як публічним або внутрішнім API смарт-контракту. paused = true; // SPDX-License-Identifier: MIT Головна перевага: Solidity виступає як стандартним інструментом для створення смарт-контрактів у найбільшій EVM-екосистемі.</syntaxhighlight> // SPDX-License-Identifier: MIT Gas витрачається на:
Приклад:
Arrays
}
- governance tokens;
- stablecoins;
- DeFi;
- rewards;
- payments;
- staking;
- liquidity pools. Ethereum — одна з головних платформ для смарт-контрактів. function add(uint256 a, uint256 b) internal pure returns (uint256) {
Mapping балансів
</div>
Тестування Solidity-контрактів виступає як критично важливим.== Proxy ==
function getValue() public view returns (uint256) {
Практична роль: ABI виступає як мостом між смарт-контрактом і зовнішніми застосунками. Gas — одиниця вартості обчислень в EVM. ! Приклад:
- Ethereum smart contracts;
- EVM-сумісних мереж;
- ERC-20 токенів;
- NFT;
- DeFi-протоколів;
- DAO;
- staking;
- vesting;
- escrow;
- on-chain governance;
- tokenized assets;
- dApps;
- smart contract wallets;
- blockchain-based automation. Solidity
Див. так само
<syntaxhighlight lang="solidity">
→ deployment transaction
balances [msg.sender] += msg.value;
== Хороші практики Solidity ==
if (msg.sender != owner) {
}
|-
| Основна ніша
| EVM smart contracts
| Systems programming, Solana, WASM smart contracts, backend
|-
| Типізація
| Статична
| Статична з ownership model
|-
| Runtime
| EVM
| Native/WASM/інший runtime залежно від платформи
|-
| ERP-платформа
| Ethereum/EVM
| Ширша systems і blockchain ERP-платформа
|-
| Складність
| Спеціалізована для EVM
| Складніша, але універсальніша
|}
<syntaxhighlight lang="solidity">
<syntaxhighlight lang="solidity">
</div>
Типові функції ERC-20:
Solidity code
'''критично:''' visibility не приховує інформаційні дані з блокчейну. '''Практична роль:''' fuzz testing оптимізує знаходити помилки, які складно передбачити через ручні test cases.</div>
'''Checks-effects-interactions''' — патерн безпечного порядку дій.
</syntaxhighlight>
uint256 [3] public fixedNumbers;
bytes32 public dataHash;
Audit
Практична роль: Remix — зручний стартовий інструмент для вивчення Solidity й швидкої перевірки контрактів. Solidity має кілька способів зупинити виконання. До таких мереж можуть належати:
Inheritance
Практична роль: custom errors допомагають зробити помилки структурованішими й економнішими за gas. Потрібно тестувати:
<syntaxhighlight lang="solidity">
'''Критично:''' `private` у Solidity означає обмеження доступу з інших контрактів, але не конфіденційність даних у блокчейні. * frontend;
* wallet connection;
* smart contracts;
* ABI;
* RPC provider;
* indexing service;
* off-chain backend у деяких випадках;
* storage для metadata;
* monitoring. '''критично:''' Solidity-розробник має думати не лише про правильність коду, а й про вартість його виконання.
Inheritance застосовується для для:
* сума балансів не перевищує total supply;
* користувач системи не здатна зняти більше, ніж має;
* paused контракт не виконує заборонені дії;
* резерви не стають від’ємними;
* governance rules не порушуються.
</syntaxhighlight>
}
| Events дозволяють контракту записувати інформацію в logs блокчейну. Wallet здатна:
OpenZeppelin часто використовують для: owner = msg.sender; Він використовувався для:
| |
|---|---|
| public | Можна викликати ззовні й усередині контракту |
| external | Зазвичай викликається ззовні контракту |
| internal | Доступно в цьому контракті й контрактах-нащадках |
| private | Доступно лише в цьому контракті |
Приклад state-changing функції: // SPDX-License-Identifier: MIT Solidity-код компілюється в EVM bytecode, який потім розгортається в блокчейні.== Висновок ==
Можливі проблеми:
- Офіційна документація Solidity.
address public owner;
function balanceOf(address account) public view returns (uint256) {
3.function pause() public onlyOwner {
|-
| Синтаксис
| C/JavaScript-подібний
| Python-подібний
|-
| Популярність
| Найпоширеніша EVM-мова
| Нішевіша
|-
| функції ERP
| Багато feature, inheritance, libraries
| Більш обмежений дизайн
|-
| Фокус
| Гнучкість і ERP-платформа
| Простота й auditability
|}
`msg.sender` — адреса, яка викликала поточну функцію. Спочатку перевірки й оновлення версій стану, потім взаємодія з іншими контрактами. }
<div style="background:#fff7ed; border-left:6px solid #fb923c; padding:12px; margin:12px 0;">
}
'''Практична роль:''' modifiers часто використовують для access control, pause checks і повторюваних перевірок. Solidity часто застосовується для разом із JavaScript або TypeScript.== Gas ==
error NotOwner();
== Solidity і Python ==
<div style="background:#eef2ff; border-left:6px solid #4f46e5; padding:12px; margin:12px 0;">
constructor() {
!== Обмеження Solidity ==
У цьому прикладі:
'''Практична роль:''' proxy застосовується для, коли потрібно оновлювати логіку контракту без зміни адреси, з якою взаємодіють користувачі. Окремо варто відзначити коли потрібно в Ethereum і інших EVM-сумісних блокчейнах для створення токенів, DeFi-протоколів, NFT, DAO, on-chain логіки, dApp і Web3-застосунків. contract MyContract is Ownable {
Приклад:
receive() external payable {
function getValue() public view returns (uint256) {
assert(total >= balance);
Загальна логіка:
</div>
buyer: msg.sender,
<div style="background:#eafaf1; border-left:6px solid #2ecc71; padding:12px; margin:12px 0;">
}
pragma solidity ^0.8.0;
address public owner;
Events контракту часто виступає як основою для індексації. }
}
== Truffle ==
ERC-721 застосовується для для:
інформаційні дані в публічному блокчейні зазвичай доступні для перегляду.== Ethereum і EVM ==
bool public active = true;
library MathUtils {
Rust застосовується для в інших блокчейн-екосистемах і деяких smart contract платформах. ABI містить інформацію про:
<div style="background:#ecfdf5; border-left:6px solid #10b981; padding:12px; margin:12px 0;">
</div>
* компіляції;
* migrations;
* deployment;
* тестування;
* contract artifacts;
* JavaScript-based workflow. Якщо потрібна ітерація, треба окремо зберігати список ключів.== Front-running і MEV ==
* `totalSupply`;
* `balanceOf`;
* `transfer`;
* `approve`;
* `allowance`;
* `transferFrom`. status: Status.Created
'''Увага:''' контракт має бути безпечним навіть тоді, коли frontend або wallet показує користувачу неповну інформацію. '''критично:''' перевірки в Solidity — це частина безпеки контракту. Її сила в програмованій довірі, але відповідальність розробника значно вища, ніж у звичайній backend-розробці. uint256 balance;
}
constructor() {
event MessageChanged(address indexed user, string message);
'''Constructor''' виконується один раз під час deployment контракту.<div style="background:#fff7ed; border-left:6px solid #fb923c; padding:12px; margin:12px 0;">
</syntaxhighlight>
Практична роль: events — це базовий спосіб повідомляти зовнішнім системам про on-chain дії контракту. Увага: mapping не можна напряму перебрати як масив.== DAO ==
- змінювати параметри;
- pause/unpause;
- встановлювати адреси;
- керувати ролями;
- запускати адміністративні дії. }
Smart contract audit — це незалежна перевірка коду, архітектури, безпеки й економічної логіки контракту. uint256 public value;
Custom errors
Address
|-
| Основна роль
| 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
|}
'''Критично:''' випадковість для лотерей, NFT minting або ігор із цінністю має використовувати спеціальні перевірені механізми, а не прості on-chain значення.
</syntaxhighlight>
- frontend updates;
- indexing;
- analytics;
- audit trail;
- token transfers;
- marketplace activity;
- protocol monitoring. * emergency stop;
- реагування на інциденти;
- тимчасового блокування ризикових дій;
- контрольованого запуску;
- upgrade або migration windows.
Static analysis
address public owner;
EVM-сумісні мережі
ERC-1155
Reentrancy
ERC-721
contract OwnableExample {
'''критично:''' DeFi-контракти мають не лише технічні, а й економічні ризики: liquidity, oracle manipulation, MEV, governance attacks і systemic dependencies. On-chain має бути лише те, що справді потребує прозорості, довіри, токенізації або децентралізованого виконання. Основні типи Solidity:
contract Ownable {
<syntaxhighlight lang="solidity">
== Pragma ==
== Struct ==
'''Proxy''' — контракт, який приймає виклики й делегує їх implementation-контракту. struct User {
* [[Програмування]]
* [[Мова програмування]]
* [[Blockchain]]
* [[Ethereum]]
* [[EVM]]
* [[Smart contract]]
* [[Web3]]
* [[DeFi]]
* [[NFT]]
* [[DAO]]
* [[ERC-20]]
* [[ERC-721]]
* [[ERC-1155]]
* [[OpenZeppelin]]
* [[Hardhat]]
* [[Foundry]]
* [[Remix IDE]]
* [[JavaScript]]
* [[TypeScript]]
* [[Rust]]
* [[Vyper]]
* [[Налагодження коду]]
* [[Логування]]
* [[Безпека застосунків]]
* [[Приватність даних]]
! Python
Fixed-size array:
</div>
* 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. Критерій
Не варто використовувати прості джерела як єдину основу випадковості для цінних призів. * state variables;
* functions;
* events;
* modifiers;
* structs;
* enums;
* mappings;
* constructor;
* errors;
* inheritance;
* interfaces;
* libraries. // SPDX-License-Identifier: MIT
return a + b;
! Solidity
function deposit() external payable {
function add(uint256 a, uint256 b) public pure returns (uint256) {
}
</div>
'''Критично:''' у смарт-контрактах тестування — не формальність. * головна мова Ethereum/EVM;
* велика ERP-платформа;
* технічна підтримка ERC-стандартів;
* OpenZeppelin;
* сумісність із wallets і dApps;
* багато tooling;
* Hardhat;
* Foundry;
* Remix;
* широка спільнота;
* можливість створювати токени;
* DeFi і NFT ecosystem;
* ABI-сумісність;
* технічна підтримка багатьох EVM-мереж.
Libraries використовуються для:
`require` застосовується для для перевірки умов: </syntaxhighlight>
} uint256 public value;
Практична роль: Hardhat добре підходить для командної Solidity-розробки з тестами, deployment scripts і JavaScript/TypeScript-екосистемою. Приклад read-only функції: Solidity варто використовувати для: Практична роль: libraries допомагають винести спільну логіку й не дублювати код між контрактами. Практична роль: invariant testing особливо корисний для DeFi, токенів і складних протоколів.</syntaxhighlight>
uint256 public nextOrderId;
Solidity і Rust
}
Увага: pause-механізм корисний для безпеки, але він так само додає централізований контроль, який потрібно пояснювати користувачам. value += 1; Практична роль: контракт у Solidity описує on-chain стан і правила взаємодії з цим станом.</syntaxhighlight>
Contract у Solidity — основна одиниця коду.== Загальний SEO-опис ==
Struct і enum
contract BalanceBook {
Коли варто використовувати Solidity
function addNumber(uint256 value) public {
<div style="background:#eafaf1; border-left:6px solid #2ecc71; padding:12px; margin:12px 0;">
<div style="background:#fff7ed; border-left:6px solid #fb923c; padding:12px; margin:12px 0;">
}
</div>
== Foundry ==
}
}
'''Практична роль:''' frontend має розрізняти читання даних і транзакції, які змінюють стан і потребують підтвердження користувача. Created,
`revert` явно скасовує виконання:
}
Контракт здатна містити:
Приклад:
'''Основна ідея:''' Solidity дає можливість описувати правила, які виконуються в блокчейні автоматизовано, прозоро й без централізованого сервера.== Events ==
address public owner;
* proposals;
* voting;
* quorum;
* timelocks;
* token-based governance;
* treasury management;
* execution rules;
* roles;
* delegates. Приклад:
<div style="background:#e7f3ff; border-left:6px solid #2b7cff; padding:12px; margin:12px 0;">
'''Підказка:''' у Solidity-прикладах критично дивитися не лише на синтаксис, а й на access control, storage, gas, external calls і можливі edge cases. Це критично для meta-transactions, proxies і contract calls.== Storage, memory і calldata ==
* встановлення owner;
* початкової конфігурації;
* задання адрес залежностей;
* встановлення параметрів токена;
* ініціалізації стану.== Oracles ==
'''ERC-1155''' — multi-token standard, який здатна підтримувати як fungible, так і non-fungible токени в одному контракті.</div>
'''Висновок:''' Solidity має більшу екосистему, а Vyper робить ставку на простіший і більш обмежений дизайн для частини сценаріїв. amount: amount,
<syntaxhighlight lang="solidity">
* Forge для тестування;
* Cast для взаємодії з мережами;
* Anvil для локального node;
* Solidity-based tests;
* fuzz testing;
* scripting.</div>
'''Практична роль:''' interface дає можливість контракту взаємодіяти з іншим контрактом через відомий набір функцій. Cancelled
* арифметики;
* invariants;
* edge cases;
* DeFi-логіки;
* access rules;
* unexpected inputs;
* state transitions.== Indexing ==
Індексація потрібна для:
<div style="background:#eafaf1; border-left:6px solid #2ecc71; padding:12px; margin:12px 0;">
'''Reentrancy''' — один із найвідоміших класів вразливостей у смарт-контрактах. Функції описують дії, які можна виконувати з контрактом. {| class="wikitable"
Приклад:
'''Hardhat''' — популярне середовище розробки для Ethereum/Solidity. Приклад:
<div style="background:#fff4e5; border-left:6px solid #f39c12; padding:12px; margin:12px 0;">
function setMessage(string calldata newMessage) external {
Взаємодія з контрактом здатна бути двох основних типів. Критерій
Proxy-підхід дає можливість:
Constructor часто застосовується для для:
'''Практична роль:''' Foundry популярний серед Solidity-розробників, які хочуть писати тести й scripts безпосередньо в Solidity. ! }
}
Приклад dynamic array:
Простий приклад owner-перевірки:
struct Order {
_;
`assert` зазвичай застосовується для для внутрішніх інваріантів:
Складніші контракти можуть використовувати ролі:
через Практична роль: struct користувачі можуть групувати пов’язані поля в одну логічну структуру.<syntaxhighlight lang="solidity">
Closed
}
<syntaxhighlight lang="solidity">
}
- зберігати інформаційні дані;
- приймати й відправляти активи;
- перевіряти умови;
- виконувати розрахунки;
- викликати інші контракти;
- створювати події;
- керувати ролями;
- реалізовувати токени;
- цифровізувати частину угод. Тому помилки в логіці потрібно знаходити до deployment.
Перевага: Solidity дає можливість створювати програмовані правила для цифрових активів і взаємодій, які виконуються в блокчейні.== State variables ==
<syntaxhighlight lang="solidity">
function setOwner(address newOwner) public { }
emit MessageChanged(msg.sender, newMessage);
DAO або decentralized autonomous organization використовує смарт-контракти для governance.== ABI == Library — повторно використовуваний код без власного звичайного стану контракту. Oracle передає зовнішні інформаційні дані в блокчейн. Foundry — швидкий toolkit для Solidity-розробки. dApp — decentralized application, який зазвичай складається з:
<syntaxhighlight lang="solidity">
OpenZeppelin
Приклад: Висновок: Solidity описує on-chain правила, а JavaScript/TypeScript часто керує frontend, тестами й deployment workflow. Struct застосовується для для:
- математичних операцій;
- helper-функцій;
- роботи зі структурами;
- повторного використання без inheritance;
- gas optimization у деяких сценаріях. → smart contract on blockchain
function setName(string calldata newName) external {
<syntaxhighlight lang="text"> Frontend, scripts і wallets використовують ABI, щоб викликати контракт. }
- виклику інших контрактів;
- стандартів;
- інтеграцій;
- ABI-сумісності;
- dependency boundaries;
- тестування. modifier onlyOwner() {
function balanceOf(address account) external view returns (uint256);
Solidity підтримує inheritance.
- користувацьких профілів;
- позицій у DeFi;
- заявок;
- orders;
- proposals;
- metadata;
- налаштувань. Потрібно враховувати mempool, порядок транзакцій і економічні стимули учасників мережі. * ERC Standards. Користувачі взаємодіють із контрактом через транзакції або read-only виклики. Значення