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

Solidity

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

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

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 токени використовуються для:
}
Увага: `msg.sender` здатна бути не кінцевим користувачем, а іншим контрактом.

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. Приклад:
Користувачі взаємодіють із Solidity-контрактами через wallets.
Найчастіше використовують `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;
  • станів користувачів;
  • параметрів за адресою.
Visibility визначає, звідки можна викликати функцію або змінну.

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

`receive` викликається, коли контракт отримує native token без calldata. Це створює ризики front-running, sandwich attacks і MEV.
}

<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

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

Практична роль: функції виступає як публічним або внутрішнім API смарт-контракту. paused = true; // SPDX-License-Identifier: MIT Головна перевага: Solidity виступає як стандартним інструментом для створення смарт-контрактів у найбільшій EVM-екосистемі.</syntaxhighlight> // SPDX-License-Identifier: MIT Gas витрачається на:

Приклад:

Arrays

}

`pragma` задає версію компілятора Solidity. * utility tokens;
  • governance tokens;
  • stablecoins;
  • DeFi;
  • rewards;
  • payments;
  • staking;
  • liquidity pools. Ethereum — одна з головних платформ для смарт-контрактів. function add(uint256 a, uint256 b) internal pure returns (uint256) {

Mapping балансів

Modifier дає можливість додати перевірку або спільну логіку до функцій.
Приклад: DAO-контракти можуть реалізовувати: Access control визначає, хто здатна виконувати певні дії.</syntaxhighlight> Foundry зазвичай містить:
</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

Див. так само

address public owner; Смарт-контракти зазвичай immutable, але існують upgradeable patterns через proxy. contract Counter {
<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-розробник має думати не лише про правильність коду, а й про вартість його виконання.
Custom errors часто дешевші за довгі рядкові повідомлення.

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

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

</syntaxhighlight>

}
Events дозволяють контракту записувати інформацію в logs блокчейну. Wallet здатна:

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

owner = msg.sender;

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

  • reentrancy risks;
  • unchecked calls;
  • access control issues;
  • shadowing;
  • dangerous patterns;
  • unused variables;
  • gas inefficiencies;
  • suspicious external calls. contract EventExample {
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;">
NFT — non-fungible token, тобто унікальний токен. Головна думка: Solidity — це мова для on-chain правил і цифрових активів.

</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 {
Custom errors дозволяють економніше описувати помилки.
* [[Програмування]]
* [[Мова програмування]]
* [[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

Enum описує набір фіксованих значень.
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 ==

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

<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 виклики. Значення