Смарт-контракти - це програмовані фрагменти коду, які виконуються лише тоді, коли виконані певні умови. Вони синонімічні юридично обов’язковим реальним контрактам; тільки в цьому випадку код є законом. Оскільки смарт-контракти знаходяться на блокчейні, вони є незмінними - їх не можна підміняти. Цей коефіцієнт незмінності робить смарт-контракти особливими, серед іншого.
Смарт-контрактипризначені для автоматизації специфічних транзакцій у блокчейні. Оскільки вони є умовно-специфічними контрактами, вони не потребують посередників. Те, що робить смарт-контракти корисними, - це їх сумісність для широкого спектру сценаріїв використання, включаючи фінансові послуги, управління ланцюгом постачання та інше. І на відміну від традиційних частин коду, які програмуються на ходу, смарт-контракти потребують високої безпеки та часоміцних стратегій.
Як смарт-контракти відповідають технології блокчейну: BeInCrypto
«Модний термін «web3» вказує на бездоглядні, небезпечні звички програмування для Інтернету. Коли крипто або смарт-контракти програмуються як веб-сторінка, вони призначені на провал. Успішні блокчейни та їх додатки ґрунтуються на набагато безпечніших, обачних та повільних методах програмування.»
Нік Сзабо, криптограф та комп'ютерний вчений: Twitter
Смарт-контракти можуть працювати з токенами, специфічними для блокчейну, скажімо, ERC-20 для блокчейну Ethereum, стимулюючи зусилля та переміщуючи транзакції. Оскільки це пов'язано з кодом, умовами та витратами, ви повинні бути обережними з їх читанням, написанням та аудитом.
Справжнє значення смарт-контрактів стосується їх природи та позиціонування. Для даного сценарію — скажімо, людина А переміщує кошти особі Б, коли Б завершує послугу — копія смарт-контракту зберігається та виконується вузлами блокчейну. Смарт-контракти зберігаються у вигляді кодів контрактів у ланцюжку. Ця багатошляхова перевірка є рисою, орієнтованою на блокчейн, і забезпечує безпеку речей.
Крім того, існує послідовний або синхронний смарт-контракт і асинхронні смарт-контрактиде завдання виконуються паралельно. Тому тип та призначення смарт-контракту визначають, як він написаний, прочитаний або навіть перевірений.
Традиційні контракти, акти на власність, заповіти тощо є приватним правом, «складені приватними особами, а не політиками чи урядовими чиновниками». Смарт-контракти - це нова форма такого децентралізованого правотворення.https://t.co/EU2Y28FznK
— Нік Сзабо ( @NickSzabo4)15 березня 2018 року
Давайте розглянемо стандартний пул ліквідності, керований смарт-контрактом.
Уявіть, що пул токенів може бути використаний для торгівлі, і кожного разу, коли відбувається успішна угода, 0,3% від загальної вартості угоди надсилається постачальнику ліквідності, який зробив цю угоду можливою або додав ліквідність для цього торгового активу. Всі умови, що висвітлюють торгові сценарії, торгові комісії та умови невиконання та невдач торгівлі, закодовані як Смарт-контракт, яке зберігається у ланцюжку як код контракту.
Ми не можемо глибоко вникати в читання, написання та перевірку контрактів, якщо ми не знаємо їх характеристики. Ось стандартні риси смарт-контрактів, про які варто знати:
Декілька рис стандартного смарт-контракту: BeInCrypto
Смарт-контракти - це просто шматки коду. Ви можете писати смарт-контракти для виконання команд та сценаріїв на основі певних умов. Тому розробники та програмісти смарт-контрактів зараз величезно востребовані, оскільки більшість DeFiпростір вже покладається на смарт-контракти для обробки складних випадків, таких як обробка торгівельних комісій по пулах ліквідності, підтримання APYспіввідношення, та більше.
Смарт-контракти, що знаходяться в блокчейні, усувають людське втручання. Це робить їх повністю надійними. Наприклад, якщо конкретний DeFiпротокол, керований смарт-контрактом(ами), погоджується на ліквідацію ваших активів, якщо їх вартість впаде нижче порогу, жодне втручання людини не може або не повинно зупинити це. Код відповідає за оплату, виконання, управління та забезпечення дотримання правил, зроблючи весь простір повністю недовіреним.
Як зазначено раніше, смарт-контракти завантажені наборами самовиконуючих інструкцій. З точки зору кодування це означає, що в ньому вбудовані ітерації та петлі. Це забезпечує автономне вирішення завдань, таких як оплата, виведення коштів, внесення внесків, покарання валідаторів шляхом стриження та кілька інших завдань.
І, нарешті, оскільки смарт-контракти захищені криптографією, їх порушення надзвичайно складне. Без вбудованої вразливості обійти смарт-контракт означало б спробу порушити його на відкритому майданчику перед усім блокчейном.
Транзакції, оброблені через смарт-контракти, є самоверифікаційними. Це означає, що виконання достатньо доказує, що транзакція відбулася в першу чергу, оскільки в ній не бере участі жодний людський елемент. Механізм самоверифікації дає смарт-контрактам перевагу перед традиційними контрактами, які регулюють спадкові банківські установи.
Тому наступного разу, коли ви плануєте прочитати смарт-контракт, переконайтеся, що заготовка або документація містить усі вказані характеристики.
Спрощена версія смарт-контрактів: Reddit
Ось простий смарт-контракт, що представляє собою рахунок умовного депонування. Користувачі вносять свої кошти на депонування, яке потім перекладає ті ж самі отримувачу після певного часового інтервалу.
/ SPDX-License-Identifier: MITpragma solidity ^0.8.0;// Базовий смарт-контракт Boilerplatecontract SimpleTrustlessEscrow {// Державні змінніадреса публічного депонента; // Поповнення рахунку etheraddress публічного бенефіціара; // Отримання облікового запису etheruint256 public releaseTime; // Часова позначка для випуску ether// Події для перевірки контрактної активностіevent Deposited(адреса індексована _from, uint256 _value); event Released(address indexed _to, uint256 _value);// Конструктор контракту ініціалізує смарт-контрактконструктор(address payable _beneficiary, uint256 _releaseTime) { require(_releaseTime > block.timestamp, "Час релізу має бути в майбутньому"); Безпечний і такий, що не потребує довіри: Договір зобов'язує вкладника та бенефіціара вкладника = msg.sender; бенефіціар = _beneficiary; releaseTime = _releaseTime;}Функція депозиту – автономне виконання (резервна функція)receive() зовнішня сплата { emit Deposited(msg.sender, msg.value);}Відпустіть ефір до бенефіціарноїфункції release() public { // Programmable: Може бути виконаний тільки після releaseTime require(block.timestamp >= releaseTime, "Занадто рано випускати"); Автономний: Автоматично виконується на основі умови uint256 amount = address(this).balance; бенефіціар.переказ(сума); emit Released(бенефіціар, сума);}}
Поки ми докладно розшифровуємо та читаємо цей смарт-контракт, спочатку переконаємося, що він відповідає зазначеним характеристикам контракту.
Детально розгляньте контракт для цього фрагмента коду:
require(block.timestamp >= releaseTime, "Занадто рано випускати");
uint256 amount = address(this).balance;
beneficiary.transfer(amount);
Кошти будуть випущені лише тоді, коли буде виконана конкретна умова releaseTime, що робить ці програмовані контракти.
Ось швидкий фрагмент коду з вищевказаного:
depositor = msg.sender;
бенефіціар = _бенефіціар;
releaseTime = _releaseTime;
У контракті всі пов'язані кодом від депонента до особи, що отримує кошти. Ніхто не потребує взаємодії або довіри до іншого, оскільки функція переказу коштів пов'язана з releaseTime — параметром на основі коду.
Ось частина коду "fund release":
function release() public {require(block.timestamp >= releaseTime, “Занадто рано для виплати”);uint256 amount = address(this).balance;beneficiary.transfer(amount);emit Released(beneficiary, amount);}
Весь процес є автономним, оскільки кошти випускаються лише тоді, коли releaseTime відповідає певному критерію. Зверніть увагу, що код не є частково програмованим, а повністю автономним.
Інші елементи коду смарт-контракту, включаючи функцію депозиту, також можуть бути повністю автономними залежно від функцій, які ви хочете включити. Наприклад, ви можете розпочати план регулярних депозитів кожного разу, коли користувач гаманець перетинає позначку у $100, а зайву суму перекидують на користувача.
Занепокоєний тим, який елемент надаєбезпекадо контракту? Перевірте цю частину коду:
constructor(address payable _beneficiary, uint256 _releaseTime) {require(_releaseTime > block.timestamp, “Час випуску повинен бути у майбутньому”);depositor = msg.sender;beneficiary = _beneficiary;releaseTime = _releaseTime;}
Зверніть увагу на встановлену пріоритетність функції releaseTime відносно відмітки часу. Ніщо не є випадковим, і умови повинні бути виконані.
Кожна транзакція, пов'язана з смарт-контрактом, реєструється в ланцюгу завдяки окремим елементам активності журналу.
event Deposited(address indexed _from, uint256 _value);
event Released(address indexed _to, uint256 _value);
emit Deposited(msg.sender, msg.value);
емітувати Звільнено (бенефіціар, сума);
Тепер, коли ми визначили елементи, які визначають характеристики смарт-контракту, ось інші елементи контракту, які допоможуть вам краще зрозуміти суть речей.
Pragma solidity ^0.8.0; – Версія мови програмування Solidity, необхідна для написання цього смарт-контракту.
// SPDX-License-Identifier: MIT – Цей ідентифікатор визначає ліцензію на випуск коду. Рекомендується включати це, щоб люди знали, чи відкритий вихідний код, та чи можна з ним працювати, чи ні.
Часовий блок угоди { - Надає ім'я смарт-контракту, схоже на мітку.
Адреса публічного депонента; – Оскільки угода передбачає депонента та одержувача, це та точка, де згадується публічна адреса депонента. Ця зміннаГаманець Ethereum адреса і є загальнодоступним.
Адреса для виплати публічного бенефіціара; - Це публічна адреса бенефіціара, куди ескроу переказує кошти. Вона також є читабельною і надає відчуття прозорості смарт-контрактам на блокчейні.
Uint256 public releaseTime; – Оскільки це контракт, пов'язаний з часом, uint256 призначає часову змінну контракту. Це буде період, відповідно до якого відбудуться виплати коштів.
У Solidity uint (беззнакове ціле число) - це спосіб призначення значень на основі цілих чисел. Суфікс 256 вказує на велике сховище чисел.
після 5 років написання смарт-контрактів я лише сьогодні усвідомлюю, що логотип Solidity - це розгорнутий логотип Ethereum 🤯pic.twitter.com/wlM369Eff9
— kaden.eth (@0xKaden) 8 Липня, 2023
Ви можете розглянути читання Документація Solidityознайомитися з синтаксисом, виразами та іншими елементами коду.
constructor(address payable _beneficiary, uint256 _releaseTime) { – «Конструктор» - це одноразова спеціальна функція, яка викликається при розгортанні смарт-контракту. Вона запускає дію контракту. Зверніть увагу, що на цьому етапі всі змінні адреси, які ми раніше оголосили, викликаються та ініціалізуються.
Receive() external payable { – Це особлива функція, яка викликається, коли кошти переходять на адресу контракту ззовні. Зовнішній підказує, що ззовні, а "Payable" визначає природу переміщення, тобто отримання токенів ERC-20.
Функція release() public { - Це публічна функція, яка вказує на переміщення токенів ERC-20 з адреси контракту до отримувача. Ця функція залежить від releaseTime.
Всі ці елементи є частинами гіпотетичного договору умовного зберігання (ескроу), який ми обговорювали. Переконайтеся, що ви переглянули всю документацію Solidity, щоб краще вивчити мову.
Знайте елементи, перш ніж планувати написання смарт-контрактів: BeInCrypto
На цей момент ви вже маєте попередній старт у читанні та розумінні вже написаного смарт-контракту. І багато смарт-контрактів, таких як ті, про які ми говорили, становлять основу додатка децентралізованої програми — ланцюговий блокверсія стандартного мобільного додатка.
Кожна характеристика смарт-контракту, включаючи безпеку контрактів, автономне та програмоване виконання, відсутність довіри до транзакцій та інші, легко реалізується під час розробки децентралізованої додаткової програми. Так що, наступного разу, коли ви натрапите на додаток DApp, зауважте, що це потужна бекенд, який працює завдяки смарт-контрактам, розміщеним на блокчейні, допомагаючи вам розпочати кілька завдань без участі людини. Смарт-контракти формують логіку DApps.
Ми знаємо, що Ethereum дозволяє вам розробляти смарт-контракти, схожі на масштабне програмне рішення. Проте це не єдиний протокол блокчейну. Якщо ви хочете глибоко пірнути в світ розробки смарт-контрактів, вам може знадобитися оглянути інші блокчейни. Різні блокчейни мають різні терміни, коли мова йде про укладання контрактів.
Але спочатку давайте обговоримоЕфіріум — платформа для більшості розробників смарт-контрактів.
Смарт-контракти на Ethereum написані мовою програмування Solidity. І інтерфейс токена для цієї платформи розробки смарт-контрактів - ERC-20.
Ви можете повернутися до смарт-контракту на основі ескроу, про який ми говорили раніше, щоб побачити, як написаний стандартний смарт-контракт на основі Ethereum.
Навіть запуск ERC-20 токена на блокчейні Ethereum є функцією, що вимагає багато смарт-контрактів, про що ми докладно поговоримо під час написання смарт-контракту.
Ось як виглядає базова структура коду, якщо ми плануємо запустити нову криптовалюту BIC.
Розгляньте цей гіпотетичний сценарій. Точно не запускаючи криптовалюту BIC.
pragma solidity ^0.8.0;import "@openzeppelin/contracts/token/ERC20/ERC20.sol";contract BICToken is ERC20 { constructor(uint256 initialSupply) ERC20("BIC Token", "BIC") { _mint(msg.sender, initialSupply); }}
Ми обговоримо кожний елемент цього коду пізніше, коли писатимемо наш смарт-контракт.
Як і Ethereum, ви навіть можете створювати смарт-контракти на таких платформах, як Solana, використовуючи Rust і Cardano, за допомогою Plutus, підмножина Haskell — функціональна мова програмування.
«Чи у Кордони є смарт-контракти?»
Жартую над тобою, приятель.#CardanoADA pic.twitter.com/j8SXCu72Sd
— Віллібот 🇦🇺 (@wilbot28) 9 липня 2023 року
Ось яка структура коду в Rust ( Solana) виглядає як:
Примітка: Це простий контракт, де лічильник збільшується.
use anchor_lang::prelude::*;declare_id!(“Fg6PaFpoGXkYsidMpWTK6W2BeZ7FEfcYkg476zPFsLnS”);#[програма] pub mod hello_world {use super::*;pub fn initialize(ctx: Context<Initialize>) -> ProgramResult { let greeting_account = &mut ctx.accounts.greeting_account; greeting_account.counter = 0; Ok(())}pub fn increment(ctx: Context<Increment>) -> ProgramResult { let greeting_account = &mut ctx.accounts.greeting_account; greeting_account.counter += 1; Ok(())}}
Чи ви знали? В той час як Rust - це мова програмування для створення смарт-контрактів на базі Solana, ЯкірЦе фреймворк розробки смарт-контрактів, який використовується. Для створення смарт-контрактів за допомогою Rust розробникам потрібно витягнути модулі з фреймворку Anchor — щось, що перший рядок нашого зразка коду (використання anchor_lang::*;) означає.
Документація Solana допоможе вам зрозуміти мову смарт-контрактів, специфічну для Rust.
Так само, Cardano слідує за Plutus як мова програмування, за якою слідує мова Ink!Polkadot, TEAL для Algorand, C# для NEO тощо. Бажано детально вивчити документацію по ланцюжку, перш ніж приступати до написання сумісних смарт-контрактів.
Можливість писати смарт-контракти високо цінується, але навіть здатність читати має свої переваги:
Тепер, коли читання смарт-контрактів вже виконано, давайте зосередимося на написанні смарт-контрактів. Перш ніж ви поглибитеся, важливо повторити, що різні блокчейни можуть мати різні стандарти та мови, що стосуються розробки смарт-контрактів. Важливо зосередитися на стандартах, визначених будь-яким конкретним блокчейном, щоб почати з написання та розгортання контракту.
Для більшості нашої дискусії ми будемо акцентувати увагу на Ethereum як ланцюжок і Solidity як мова.
Програмування смарт-контракту - легко найважливіша частина циклу розробки. Щоб розпочати розробку смарт-контрактів на Ethereum або будь-якому іншому блокчейні, вам слід мати деякий досвід роботи з мовами програмування, що не є блокчейном, такими як Javascript.
Різні блокчейни та мова для написання смарт-контрактів: BeInCrypto
Можливість програмувати смарт-контракт дозволяє вам реалізувати логіку, обробляти елементи безпеки та оптимізувати код для комісія за газ, налаштуйте те ж саме, і навіть зробіть його сумісним, якщо потрібно.
Кожен, хто планує писати смарт-контракти на Ethereum, повинен розуміти, що таке Віртуальна Машина Ethereum (EVM) та як вона працює з смарт-контрактами. На початку, EVM є компонентом Ethereum, який надає програмам ізольоване та контрольоване середовище для роботи. Можна вважати це глобальним комп'ютером, який містить у собі кожен шматок коду контракту на Ethereum. Кожен вузолна мережі Ethereum працює EVM.
Якщо ви мрієте стати розробником смарт-контрактів, ось що вам потрібно знати щодо смарт-контрактів та EVM.
Як тільки ви напишете програму на Solidity, яка є мовою високого рівня, вам потрібно скомпілювати її в байткод - машинозрозумілий формат низького рівня. Цей байткод потрапляє до блокчейну Ethereum та знаходиться там. Будь-хто, хто взаємодіє з смарт-контрактом, повинен відправити транзакцію на адресу контракту.
Кожен вузол з встановленою EVM може бачити цю транзакцію, і як тільки валідатори схвалюють те ж саме, виконується код смарт-контракту. Оскільки кожен вузол має видимість транзакцій, нічого не можна підробити, і код виконується так, як було написано. І як тільки код виконується, стан блокчейну змінюється, зроблюючи процес з кінця в кінець повністю прозорим.
Написання смарт-контрактів потребує технічного ноу-хау. Але це ще не все. Вам також потрібно добре розуміти, як працює технологія блокчейн, які мово-специфічні потреби є важливими для блокчейну, на який ви спрямовуєтеся, інтероперабельність, і більше. Крім цього, вам також слід знати досить багато про вразливості смарт-контрактів - речі, яких слід уникати при написанні коду. І нарешті, знання тестування контрактів та розгортання контрактів також є обов'язковим.
Все це може стати пригнічуючим. Отже, ось швидкий шпаргалка, щоб почати:
Тут є швидка нитка з деякими порадами щодо написання кращих смарт-контрактів:
🥧 FREI-PI
‼️ Чому розробникам смарт-контрактів ПОТРІБНО знати це!
Функція:
– Вимоги
– Ефекти
– Взаємодії
Протокол
– Невідмінності
Це шаблон, про який вам усім слід думати під час створення смарт-контрактів.
Ось чому 👇
— Патрік Коллінз ( @PatrickAlphaC) 6 липня 2023
Час зайнятися технічними аспектами розробки смарт-контрактів. Навіть якщо ланцюжки, такі як Solana та Cardano, дозволяють розробляти смарт-контракти, Ethereum продовжує бути найпопулярнішою платформою для розробки смарт-контрактів.
Чи ви знали? Лише у 2022 році на мережу Ethereum потрапило понад 100 000 децентралізованих додатків.
Ефір має велику спільноту розробників. Будь-що, що ви розробляєте, одразу приверне увагу. Крім того, його рідна мова, Solidity, досить проста для осіб, які знають Python або JavaScript. Нарешті, глобальне програмне забезпечення Ethereum, EVM, допомагає з безперервним виконанням контрактів.
Якщо ви переважно використовуєте Ethereum та Solidity, ось швидкий список речей, які вам потрібно відстежувати перед початком розробки смарт-контракту:
Тепер, коли ми знаємо, як речі відбуваються on-chain, давайте поглибимося у написання та розгортання першого смарт-контракту. Навіть якщо «Привіт, світ!» залишається першим кроком, ми розпочнемо з створення смарт-контракту для запуску гіпотетичного токена BIC з 100% розблокованого постачання у 1 мільйон.
Перший крок - встановити останню версію Node.js та NPM або Node Package Manager. Це дбає про інструменти розробки та локальне середовище для розробки. Крім того, Node.js та NPM дозволяють встановити веб-інтерфейс для вашого смарт-контракту.
Тепер вам потрібно встановити IDE для написання коду контракту. Для цього ви можете швидко встановити Visual Studio Code. Або ви можете прибрати баласт іхмільна Alchemy — платформу для розробки блокчейну. З Alchemy ви можете отримати деякий тестовий ETH. Це покриє витрати на газ при розгортанні смарт-контракту на тестовій мережі Goerli або навіть тестовій мережі Sepolia.
Варто зазначити, що Sepolia - це молодший тестовий мережа і, отже, займає менше місця на диску при розгортанні вузла.
Наразі ми будемо продовжувати використовувати тестову мережу Goerli, оскільки в ній є більша кількість розгорнутих додатків.
Коли тестнет і фальшивий ETH готові, давайте перейдемо до конкретного написання смарт-контракту. Ось фрагмент коду для створення токена BIC з фіксованою пропозицією в 1 мільйон.
Примітка: Ми будемо використовувати наш смарт-контракт локально на MacOS, а не на тестовій мережі. Для розгортання смарт-контрактів на тестовій та головній мережах ми будемо мати окремий етап, який виходить за межі цієї дискусії.
Тут простий фрагмент коду для умовного токена:
pragma solidity ^0.8.0;import "@openzeppelin/contracts/token/ERC20/ERC20.sol";contract BICToken is ERC20 { constructor() ERC20("BIC Token", "BIC") { _mint(msg.sender, 1000000 * 10 ** decimals()); }}
Якщо ви знаєте синтаксис, ви будете знати, що означає кожен компонент коду. Що стосується Openzepplinчастина, це бібліотека, яка використовується для імпорту смарт-контрактів ERC-20. Ця бібліотека пропонує основні стандарти функціонування токенів ERC-20.
Функція монети говорить про початковий резерв, який розгортається за адресою смарт-контракту або msg.sender.
Для налаштування цього коду локально та його тестування нам знадобиться три компоненти:
Якщо ви пройшли докладний процес написання смарт-контракту, важливо знати дещо про виконання контракту. Це процес, за яким код смарт-контракту виконується на ланцюжку вузлами.
Це єдність, пов'язана з виконанням контракту, робить смарт-контракти прозорими та незмінними. Давайте зараз зрозуміємо кроковий процес, пов'язаний з виконанням контракту:
Фрагменти коду, які ми писали, повинні бути виконані десь. У випадку смарт-контрактів це місце виконання - це блокчейн. Вузли або учасники ланцюга допомагають виконати контракт.
Вузли приймають на себе відповідальність за виконання блоків коду контракту в обмін на ланцюгові стимули. Кожна команда або дія, яка відбувається в межах ланцюга, керується смарт-контрактами.
Кожен смарт-контракт має конкретну адресу. Для виконання контракту транзакції надсилаються на цю адресу контракту. Варто зауважити, що кожен вузол запускає EVM, який має копію коду смарт-контракту, що полегшує перевірку автентичності транзакцій.
Транзакції, націлені на смарт-контракт, вибираються валідаторами, які потім включають їх у певні блоки.
Як тільки транзакцію виконано та успішно перевірено, вона стає частиною блокчейну. Функція смарт-контракту, пов'язана з транзакцією, викликається та виконується на вузлах блокчейну.
Кожен вузол, що виконує смарт-контракт, повинен прийти до детермінованого висновку — однакового результату для одного і того ж набору вхідних даних — що робить характер контрактів абсолютно недовіреним та прозорим.
Примітка: Будь-яка помилка, що стосується виконання коду або питань, пов'язаних з комісією за газ, скасовує транзакції. Це означає, що транзакція, заснована на певному коді смарт-контракту, припинить існування. Саме це відбувається з флеш-кредитиколи нездатність дотримуватися конкретних норм зворотно перешкоджає всій угоді, здавалося б, утворюючи враження, ніби кошти взагалі не рухалися у першу чергу.
Кожне зміна стану, пов'язана з розумними контрактами, реєструється в ланцюжку блоків і стає незмінною частиною одного й того ж.
Тепер, коли ви вже досить багато знаєте про смарт-контракти, ось кілька порад, щоб розпочати розробку контракту:
Кожна з вищезгаданих практик допомагає оптимізувати код та реалізувати специфічні заходи безпеки. Однак є кілька практик, специфічних для контрактів, які вам необхідно виконувати та реалізовувати, щоб піклуватися про стійкість коду. Це спрямовано на збереження легкості та можливості використання коду контракту, щоб кожен вузол, який виконує той самий код, не повинен виділяти велику обчислювальну потужність на виконання того ж самого.
Незважаючи на дотримання найкращих практик при написанні та розробці смарт-контрактів, необхідно звернути увагу на вразливості безпеки контрактів при їх пушингу на мейннет.
Кожен смарт-контракт, який має присутність на головній мережі, потребує оцінки щодо продуктивності коду, безпеки та інших характеристик. Саме тут на передній план виходить аудит — ретельний процес тестування контракту — що дозволяє виявити потенційні вразливості та слабкості контракту.
Ось швидкий перелік для початку аудиту:
Чудовий перелік перевірки смарт-контрактів😈
Обов'язково перевірте їх під час наступної аудитування✅
Я б вдячний за ретвіт, поширте знання🫡https://t.co/ILx0C67kf8
— cholakov (@cholakovv) 7 липня 2023 року
Під час читання та написання смарт-контрактів взаємопов'язані, коли мова йде про розробку інтелектуальних фрагментів коду, аудит має особливе значення і включає перевірку логіки на першому місці. Щодо виконання коду, що базується на блокчейні, все є незмінним, і будь-яка катастрофа може мати необоротні наслідки під час виконання контракту. Точно тому перевірка коду контракту та інших аспектів через аудит є необхідною.
Тут може бути безліч вразливості контракту які може виявити детальний аудит смарт-контрактів. До них відносяться перевірка на наявність атак повторного входу, переповнень або недоповнень, проблем, пов'язаних з контролем доступу, і багато іншого. Після того, як буде визначено точний характер проблеми, аудитор може навіть запропонувати найкращі практики для її усунення.
Ще не впевнені, як перевірка смарт-контрактів може допомогти? Ну, дозвольте нам повернутися до печально відомогоDAOвзлом у 2016 році, який використовував проблему повторного входу і призвів до втрат майже 3,6 мільйона ETH. Так само, у 2017 році стався взлом контракту гаманця Parity, що призвів до втрати майже 500 000 ETH. Ці проблеми можна було уникнути за допомогою правильного набору аудитів.
Схема взлому DAO: BeInCrypto
Існує безліч стратегій для аудиту смарт-контрактів. Деякі з найпопулярніших включають:
Ці інструменти виступають як перший набір захисту й найкраще використовуються для виявлення загальних вразливостей. Деякі з найпопулярніших інструментів включають Securify, Mythril та інші, здатні виконувати статичний аналіз коду, виявлення шаблонів порушень та допомагати отримати специфічний початковий підхід до безпеки.
Інструменти для аудиту смарт-контрактів: BeInCrypto
Тут з'являються ручні рецензенти коду, які ретельно вивчають кодову базу та виявляють складні вразливості, якщо вони є. Ручний огляд може допомогти врахувати бізнес-логіку, контекст та шаблони використання.
Ось як ручні кодові перегляди допомагають вам виявляти загрози:
Невеличка цікавинка для наших молодших аудиторів!
Давайте підемо та ретвітнемо, якщо ви знайшли помилку!pic.twitter.com/i14YtweXcz
— Чарльз Паладин (англ.@PaladinCharles) 8 липня 2023 року
Такі інструменти, як Snyk і GuardRails, допомагають з автоматичним скануванням контрактів — реалізацією безпеки, яка викликається щоразу, коли код оновлюється. Ця форма аудиту гарантує, що нові зміни, внесені до коду, є безпечними та неінвазивними за своєю природою.
Це складний процес, який виключно ґрунтується на перевірці бізнес-логіки коду. Зверніть увагу, що формальне підтвердження фактично не призначене для перевірки синтаксису, а лише логіки, щоб переконатися, що код виконується, як бажано.
Крім згаданих стратегій, аудит смарт-контрактів також може бути ініційований за допомогою рецензій колег, програм bug bounty та тестового охоплення за допомогою інструментів, таких як Solidity Coverage, для максимізації ефективності.
Простий спосіб аудиту смарт-контрактів: BeInCrypto
Якщо ви новенькі в аудиті смарт-контрактів, важливо зазначити, що є два широкі способи аналізування коду та виявлення проблем. Це включає:
Цей тип аналізу коду допомагає виявляти базові уразливості безпеки, помилки в кодуванні та інші проблеми згідно з встановленими стандартами кодування та конвенціями. Загрози, такі як невпорядковані виклики до зовнішніх джерел, переповнення цілочисельних значень та інше можуть бути виділені за допомогою статичного аналізу. Найкраще у статичному аналізі полягає в тому, що код не потрібно виконувати для його перевірки.
Цей підхід до аудиту тестує відповідність коду з EVM. Замість перевірки коду, динамічний аналіз перевіряє відповідь смарт-контрактів на широкий спектр вхідних даних. Динамічний аналіз може виявити проблеми, такі як некоординація споживання газу та навіть помилкова логіка контракту. Особисті блокчейн-середовища, такі як Ganache, можуть працювати як платформи динамічного аналізу, дозволяючи розробникам здійснювати транзакції, виконувати команди та робити багато іншого з їх контрактами.
Тут є фрагмент смарт-контракту, який працює як засіб зберігання коштів, маючи функцію зняття коштів:
pragma solidity ^0.6.1;contract VulnerableContract { mapping(address => uint256) public balances; function deposit() public payable { balances[msg.sender] += msg.value; } function withdraw(uint256 _amount) public { require(balances[msg.sender] >= _amount, "Insufficient balance."); (bool success, ) = msg.sender.call{value: _amount}(""); require(success, "Transfer failed."); balances[msg.sender] -= _amount; }}
Якщо ви уважно подивитесь на код, там є ключова вразливість:
У попередньому випадку функція «виведення» може бути викликана повторно, якщо користувач, який отримує кошти, також є смарт-контрактом, нехай і шкідливим. Тому до того, як відбудеться остання функція або оновлення балансу, може бути ініційована атака повторного входу для переказу додаткових коштів. Досвідчені аудитори виявляють такого роду вразливості.
Ось виправлений код для того ж самого:
function withdraw(uint256 _amount) public { require(balances[msg.sender] >= _amount, "Недостатній баланс."); balances[msg.sender] -= _amount; (булевий успіх, ) = msg.sender.call{значення: _amount}("");
require(success, “Передача не вдалася.”);}
Перевірте, як функція оновлення балансу викликається першою, а потім перший хід до користувача. Ця зміна порядку операцій вирішує контракт.
Світ децентралізованих додатків і смарт-контрактів вийшов за рамки Ethereum. Незважаючи на те, що основна частина дій все ще відбувається в екосистемі Ethereum, є й інші мережі, такі як Cardano, Solana та інші, які підтримують смарт-контракти та вимагають інших стандартів аудиту.
Різні блокчейни використовують різні мови програмування. Семантика, синтаксис і властивості коду відрізняються, що робить смарт-контракти реагуючими на різні практики написання та аудиту. Наприклад, Ethereum використовує Solidity, тоді як Polkadotвикористовує Ink та Rust — це реагує на конкретні стандарти аудиту.
Тепер, якщо ви хочете вийти за межі Ethereum, є кілька спеціалізованих інструментів аудиту, щоб ви могли почати. Наприклад, у Cardano є набір Marlowe для формальної верифікації та аудиту. Щодо Solana, специфічні для Rust libfuzzer та cargo-fuzz призначені для аудиту та тестування контрактів. Багатоланцюговий аудитор повинен бути ознайомлений з цими концепціями, щоб уникнути вразливості контрактів.
Просто щоб повторити, ви можете розділити перевірку смарт-контрактів на три типи: ручну, автоматичну та гібридну. Зверніть увагу, що люди віддають перевагу гібридним стратегіям перевірки для складних контрактів з глибокою бізнес-логікою, оскільки вони є найбільш комплексними.
Організації та приватні особи з мінімальними знаннями кодування часто передають свої вимоги до написання та аудиту на аутсорсинг відомим фірмам. Коли справа доходить до аудиту, вибір правильної компанії стає ще більш важливим, оскільки Інструменти штучного інтелектуподобатисяChatGPTможе допомогти написати код смарт-контракту, перевірка такого вимагає вручні інсайти.
Також, ось фактори, на які варто звернути увагу при зовнішньому виконанні аудиторських завдань:
Перед тим як ви зосередитесь на правильній фірмі для зовнішнього виконання, важливо перевірити минулі аудити, оцінити досвід, а навіть зосередитися на ключових членах команди.
Перед тим як здійснити найм, зверніть увагу на витрати та послуги, пов'язані з аудитами. Надзвичайно важливо спочатку зрозуміти характер наданих послуг — такі як виявлення проблем, вирішення проблем та інше. Вам також слід перевірити, чи надаються повторні аудити після впровадження першого рядка виправлень. Вартість аудиту смарт-контракту може варіюватися в залежності від наданих послуг, тому необхідно відстежувати кожну вимогу та пропозицію перед продовженням.
У разі, якщо ви хочете позбутися фірми та перевірити смарт-контракти самостійно, ось найкращі стратегії та практики, які варто мати на увазі:
Штучний інтелект дійсно полегшує написання смарт-контрактів. Однак, незважаючи на інновації штучного інтелекту, найкращим способом перевірки смарт-контрактів залишається втручання людини. Тому, якщо ви плануєте побудувати наступний веб3 продукт, акцентуючи увагу на смарт-контрактах та децентралізованих додатках, важливо ретельно фокусуватися на найкращих ресурсах для аудиту ваших смарт-контрактів. З виявленням крадіжок криптовалюти та порушень щодня, а також плануванням хакерами нових стратегій проникнення, аудит контракту до ідеальності безумовно є одним з найважливіших навичок сучасності.
Compartir
Смарт-контракти - це програмовані фрагменти коду, які виконуються лише тоді, коли виконані певні умови. Вони синонімічні юридично обов’язковим реальним контрактам; тільки в цьому випадку код є законом. Оскільки смарт-контракти знаходяться на блокчейні, вони є незмінними - їх не можна підміняти. Цей коефіцієнт незмінності робить смарт-контракти особливими, серед іншого.
Смарт-контрактипризначені для автоматизації специфічних транзакцій у блокчейні. Оскільки вони є умовно-специфічними контрактами, вони не потребують посередників. Те, що робить смарт-контракти корисними, - це їх сумісність для широкого спектру сценаріїв використання, включаючи фінансові послуги, управління ланцюгом постачання та інше. І на відміну від традиційних частин коду, які програмуються на ходу, смарт-контракти потребують високої безпеки та часоміцних стратегій.
Як смарт-контракти відповідають технології блокчейну: BeInCrypto
«Модний термін «web3» вказує на бездоглядні, небезпечні звички програмування для Інтернету. Коли крипто або смарт-контракти програмуються як веб-сторінка, вони призначені на провал. Успішні блокчейни та їх додатки ґрунтуються на набагато безпечніших, обачних та повільних методах програмування.»
Нік Сзабо, криптограф та комп'ютерний вчений: Twitter
Смарт-контракти можуть працювати з токенами, специфічними для блокчейну, скажімо, ERC-20 для блокчейну Ethereum, стимулюючи зусилля та переміщуючи транзакції. Оскільки це пов'язано з кодом, умовами та витратами, ви повинні бути обережними з їх читанням, написанням та аудитом.
Справжнє значення смарт-контрактів стосується їх природи та позиціонування. Для даного сценарію — скажімо, людина А переміщує кошти особі Б, коли Б завершує послугу — копія смарт-контракту зберігається та виконується вузлами блокчейну. Смарт-контракти зберігаються у вигляді кодів контрактів у ланцюжку. Ця багатошляхова перевірка є рисою, орієнтованою на блокчейн, і забезпечує безпеку речей.
Крім того, існує послідовний або синхронний смарт-контракт і асинхронні смарт-контрактиде завдання виконуються паралельно. Тому тип та призначення смарт-контракту визначають, як він написаний, прочитаний або навіть перевірений.
Традиційні контракти, акти на власність, заповіти тощо є приватним правом, «складені приватними особами, а не політиками чи урядовими чиновниками». Смарт-контракти - це нова форма такого децентралізованого правотворення.https://t.co/EU2Y28FznK
— Нік Сзабо ( @NickSzabo4)15 березня 2018 року
Давайте розглянемо стандартний пул ліквідності, керований смарт-контрактом.
Уявіть, що пул токенів може бути використаний для торгівлі, і кожного разу, коли відбувається успішна угода, 0,3% від загальної вартості угоди надсилається постачальнику ліквідності, який зробив цю угоду можливою або додав ліквідність для цього торгового активу. Всі умови, що висвітлюють торгові сценарії, торгові комісії та умови невиконання та невдач торгівлі, закодовані як Смарт-контракт, яке зберігається у ланцюжку як код контракту.
Ми не можемо глибоко вникати в читання, написання та перевірку контрактів, якщо ми не знаємо їх характеристики. Ось стандартні риси смарт-контрактів, про які варто знати:
Декілька рис стандартного смарт-контракту: BeInCrypto
Смарт-контракти - це просто шматки коду. Ви можете писати смарт-контракти для виконання команд та сценаріїв на основі певних умов. Тому розробники та програмісти смарт-контрактів зараз величезно востребовані, оскільки більшість DeFiпростір вже покладається на смарт-контракти для обробки складних випадків, таких як обробка торгівельних комісій по пулах ліквідності, підтримання APYспіввідношення, та більше.
Смарт-контракти, що знаходяться в блокчейні, усувають людське втручання. Це робить їх повністю надійними. Наприклад, якщо конкретний DeFiпротокол, керований смарт-контрактом(ами), погоджується на ліквідацію ваших активів, якщо їх вартість впаде нижче порогу, жодне втручання людини не може або не повинно зупинити це. Код відповідає за оплату, виконання, управління та забезпечення дотримання правил, зроблючи весь простір повністю недовіреним.
Як зазначено раніше, смарт-контракти завантажені наборами самовиконуючих інструкцій. З точки зору кодування це означає, що в ньому вбудовані ітерації та петлі. Це забезпечує автономне вирішення завдань, таких як оплата, виведення коштів, внесення внесків, покарання валідаторів шляхом стриження та кілька інших завдань.
І, нарешті, оскільки смарт-контракти захищені криптографією, їх порушення надзвичайно складне. Без вбудованої вразливості обійти смарт-контракт означало б спробу порушити його на відкритому майданчику перед усім блокчейном.
Транзакції, оброблені через смарт-контракти, є самоверифікаційними. Це означає, що виконання достатньо доказує, що транзакція відбулася в першу чергу, оскільки в ній не бере участі жодний людський елемент. Механізм самоверифікації дає смарт-контрактам перевагу перед традиційними контрактами, які регулюють спадкові банківські установи.
Тому наступного разу, коли ви плануєте прочитати смарт-контракт, переконайтеся, що заготовка або документація містить усі вказані характеристики.
Спрощена версія смарт-контрактів: Reddit
Ось простий смарт-контракт, що представляє собою рахунок умовного депонування. Користувачі вносять свої кошти на депонування, яке потім перекладає ті ж самі отримувачу після певного часового інтервалу.
/ SPDX-License-Identifier: MITpragma solidity ^0.8.0;// Базовий смарт-контракт Boilerplatecontract SimpleTrustlessEscrow {// Державні змінніадреса публічного депонента; // Поповнення рахунку etheraddress публічного бенефіціара; // Отримання облікового запису etheruint256 public releaseTime; // Часова позначка для випуску ether// Події для перевірки контрактної активностіevent Deposited(адреса індексована _from, uint256 _value); event Released(address indexed _to, uint256 _value);// Конструктор контракту ініціалізує смарт-контрактконструктор(address payable _beneficiary, uint256 _releaseTime) { require(_releaseTime > block.timestamp, "Час релізу має бути в майбутньому"); Безпечний і такий, що не потребує довіри: Договір зобов'язує вкладника та бенефіціара вкладника = msg.sender; бенефіціар = _beneficiary; releaseTime = _releaseTime;}Функція депозиту – автономне виконання (резервна функція)receive() зовнішня сплата { emit Deposited(msg.sender, msg.value);}Відпустіть ефір до бенефіціарноїфункції release() public { // Programmable: Може бути виконаний тільки після releaseTime require(block.timestamp >= releaseTime, "Занадто рано випускати"); Автономний: Автоматично виконується на основі умови uint256 amount = address(this).balance; бенефіціар.переказ(сума); emit Released(бенефіціар, сума);}}
Поки ми докладно розшифровуємо та читаємо цей смарт-контракт, спочатку переконаємося, що він відповідає зазначеним характеристикам контракту.
Детально розгляньте контракт для цього фрагмента коду:
require(block.timestamp >= releaseTime, "Занадто рано випускати");
uint256 amount = address(this).balance;
beneficiary.transfer(amount);
Кошти будуть випущені лише тоді, коли буде виконана конкретна умова releaseTime, що робить ці програмовані контракти.
Ось швидкий фрагмент коду з вищевказаного:
depositor = msg.sender;
бенефіціар = _бенефіціар;
releaseTime = _releaseTime;
У контракті всі пов'язані кодом від депонента до особи, що отримує кошти. Ніхто не потребує взаємодії або довіри до іншого, оскільки функція переказу коштів пов'язана з releaseTime — параметром на основі коду.
Ось частина коду "fund release":
function release() public {require(block.timestamp >= releaseTime, “Занадто рано для виплати”);uint256 amount = address(this).balance;beneficiary.transfer(amount);emit Released(beneficiary, amount);}
Весь процес є автономним, оскільки кошти випускаються лише тоді, коли releaseTime відповідає певному критерію. Зверніть увагу, що код не є частково програмованим, а повністю автономним.
Інші елементи коду смарт-контракту, включаючи функцію депозиту, також можуть бути повністю автономними залежно від функцій, які ви хочете включити. Наприклад, ви можете розпочати план регулярних депозитів кожного разу, коли користувач гаманець перетинає позначку у $100, а зайву суму перекидують на користувача.
Занепокоєний тим, який елемент надаєбезпекадо контракту? Перевірте цю частину коду:
constructor(address payable _beneficiary, uint256 _releaseTime) {require(_releaseTime > block.timestamp, “Час випуску повинен бути у майбутньому”);depositor = msg.sender;beneficiary = _beneficiary;releaseTime = _releaseTime;}
Зверніть увагу на встановлену пріоритетність функції releaseTime відносно відмітки часу. Ніщо не є випадковим, і умови повинні бути виконані.
Кожна транзакція, пов'язана з смарт-контрактом, реєструється в ланцюгу завдяки окремим елементам активності журналу.
event Deposited(address indexed _from, uint256 _value);
event Released(address indexed _to, uint256 _value);
emit Deposited(msg.sender, msg.value);
емітувати Звільнено (бенефіціар, сума);
Тепер, коли ми визначили елементи, які визначають характеристики смарт-контракту, ось інші елементи контракту, які допоможуть вам краще зрозуміти суть речей.
Pragma solidity ^0.8.0; – Версія мови програмування Solidity, необхідна для написання цього смарт-контракту.
// SPDX-License-Identifier: MIT – Цей ідентифікатор визначає ліцензію на випуск коду. Рекомендується включати це, щоб люди знали, чи відкритий вихідний код, та чи можна з ним працювати, чи ні.
Часовий блок угоди { - Надає ім'я смарт-контракту, схоже на мітку.
Адреса публічного депонента; – Оскільки угода передбачає депонента та одержувача, це та точка, де згадується публічна адреса депонента. Ця зміннаГаманець Ethereum адреса і є загальнодоступним.
Адреса для виплати публічного бенефіціара; - Це публічна адреса бенефіціара, куди ескроу переказує кошти. Вона також є читабельною і надає відчуття прозорості смарт-контрактам на блокчейні.
Uint256 public releaseTime; – Оскільки це контракт, пов'язаний з часом, uint256 призначає часову змінну контракту. Це буде період, відповідно до якого відбудуться виплати коштів.
У Solidity uint (беззнакове ціле число) - це спосіб призначення значень на основі цілих чисел. Суфікс 256 вказує на велике сховище чисел.
після 5 років написання смарт-контрактів я лише сьогодні усвідомлюю, що логотип Solidity - це розгорнутий логотип Ethereum 🤯pic.twitter.com/wlM369Eff9
— kaden.eth (@0xKaden) 8 Липня, 2023
Ви можете розглянути читання Документація Solidityознайомитися з синтаксисом, виразами та іншими елементами коду.
constructor(address payable _beneficiary, uint256 _releaseTime) { – «Конструктор» - це одноразова спеціальна функція, яка викликається при розгортанні смарт-контракту. Вона запускає дію контракту. Зверніть увагу, що на цьому етапі всі змінні адреси, які ми раніше оголосили, викликаються та ініціалізуються.
Receive() external payable { – Це особлива функція, яка викликається, коли кошти переходять на адресу контракту ззовні. Зовнішній підказує, що ззовні, а "Payable" визначає природу переміщення, тобто отримання токенів ERC-20.
Функція release() public { - Це публічна функція, яка вказує на переміщення токенів ERC-20 з адреси контракту до отримувача. Ця функція залежить від releaseTime.
Всі ці елементи є частинами гіпотетичного договору умовного зберігання (ескроу), який ми обговорювали. Переконайтеся, що ви переглянули всю документацію Solidity, щоб краще вивчити мову.
Знайте елементи, перш ніж планувати написання смарт-контрактів: BeInCrypto
На цей момент ви вже маєте попередній старт у читанні та розумінні вже написаного смарт-контракту. І багато смарт-контрактів, таких як ті, про які ми говорили, становлять основу додатка децентралізованої програми — ланцюговий блокверсія стандартного мобільного додатка.
Кожна характеристика смарт-контракту, включаючи безпеку контрактів, автономне та програмоване виконання, відсутність довіри до транзакцій та інші, легко реалізується під час розробки децентралізованої додаткової програми. Так що, наступного разу, коли ви натрапите на додаток DApp, зауважте, що це потужна бекенд, який працює завдяки смарт-контрактам, розміщеним на блокчейні, допомагаючи вам розпочати кілька завдань без участі людини. Смарт-контракти формують логіку DApps.
Ми знаємо, що Ethereum дозволяє вам розробляти смарт-контракти, схожі на масштабне програмне рішення. Проте це не єдиний протокол блокчейну. Якщо ви хочете глибоко пірнути в світ розробки смарт-контрактів, вам може знадобитися оглянути інші блокчейни. Різні блокчейни мають різні терміни, коли мова йде про укладання контрактів.
Але спочатку давайте обговоримоЕфіріум — платформа для більшості розробників смарт-контрактів.
Смарт-контракти на Ethereum написані мовою програмування Solidity. І інтерфейс токена для цієї платформи розробки смарт-контрактів - ERC-20.
Ви можете повернутися до смарт-контракту на основі ескроу, про який ми говорили раніше, щоб побачити, як написаний стандартний смарт-контракт на основі Ethereum.
Навіть запуск ERC-20 токена на блокчейні Ethereum є функцією, що вимагає багато смарт-контрактів, про що ми докладно поговоримо під час написання смарт-контракту.
Ось як виглядає базова структура коду, якщо ми плануємо запустити нову криптовалюту BIC.
Розгляньте цей гіпотетичний сценарій. Точно не запускаючи криптовалюту BIC.
pragma solidity ^0.8.0;import "@openzeppelin/contracts/token/ERC20/ERC20.sol";contract BICToken is ERC20 { constructor(uint256 initialSupply) ERC20("BIC Token", "BIC") { _mint(msg.sender, initialSupply); }}
Ми обговоримо кожний елемент цього коду пізніше, коли писатимемо наш смарт-контракт.
Як і Ethereum, ви навіть можете створювати смарт-контракти на таких платформах, як Solana, використовуючи Rust і Cardano, за допомогою Plutus, підмножина Haskell — функціональна мова програмування.
«Чи у Кордони є смарт-контракти?»
Жартую над тобою, приятель.#CardanoADA pic.twitter.com/j8SXCu72Sd
— Віллібот 🇦🇺 (@wilbot28) 9 липня 2023 року
Ось яка структура коду в Rust ( Solana) виглядає як:
Примітка: Це простий контракт, де лічильник збільшується.
use anchor_lang::prelude::*;declare_id!(“Fg6PaFpoGXkYsidMpWTK6W2BeZ7FEfcYkg476zPFsLnS”);#[програма] pub mod hello_world {use super::*;pub fn initialize(ctx: Context<Initialize>) -> ProgramResult { let greeting_account = &mut ctx.accounts.greeting_account; greeting_account.counter = 0; Ok(())}pub fn increment(ctx: Context<Increment>) -> ProgramResult { let greeting_account = &mut ctx.accounts.greeting_account; greeting_account.counter += 1; Ok(())}}
Чи ви знали? В той час як Rust - це мова програмування для створення смарт-контрактів на базі Solana, ЯкірЦе фреймворк розробки смарт-контрактів, який використовується. Для створення смарт-контрактів за допомогою Rust розробникам потрібно витягнути модулі з фреймворку Anchor — щось, що перший рядок нашого зразка коду (використання anchor_lang::*;) означає.
Документація Solana допоможе вам зрозуміти мову смарт-контрактів, специфічну для Rust.
Так само, Cardano слідує за Plutus як мова програмування, за якою слідує мова Ink!Polkadot, TEAL для Algorand, C# для NEO тощо. Бажано детально вивчити документацію по ланцюжку, перш ніж приступати до написання сумісних смарт-контрактів.
Можливість писати смарт-контракти високо цінується, але навіть здатність читати має свої переваги:
Тепер, коли читання смарт-контрактів вже виконано, давайте зосередимося на написанні смарт-контрактів. Перш ніж ви поглибитеся, важливо повторити, що різні блокчейни можуть мати різні стандарти та мови, що стосуються розробки смарт-контрактів. Важливо зосередитися на стандартах, визначених будь-яким конкретним блокчейном, щоб почати з написання та розгортання контракту.
Для більшості нашої дискусії ми будемо акцентувати увагу на Ethereum як ланцюжок і Solidity як мова.
Програмування смарт-контракту - легко найважливіша частина циклу розробки. Щоб розпочати розробку смарт-контрактів на Ethereum або будь-якому іншому блокчейні, вам слід мати деякий досвід роботи з мовами програмування, що не є блокчейном, такими як Javascript.
Різні блокчейни та мова для написання смарт-контрактів: BeInCrypto
Можливість програмувати смарт-контракт дозволяє вам реалізувати логіку, обробляти елементи безпеки та оптимізувати код для комісія за газ, налаштуйте те ж саме, і навіть зробіть його сумісним, якщо потрібно.
Кожен, хто планує писати смарт-контракти на Ethereum, повинен розуміти, що таке Віртуальна Машина Ethereum (EVM) та як вона працює з смарт-контрактами. На початку, EVM є компонентом Ethereum, який надає програмам ізольоване та контрольоване середовище для роботи. Можна вважати це глобальним комп'ютером, який містить у собі кожен шматок коду контракту на Ethereum. Кожен вузолна мережі Ethereum працює EVM.
Якщо ви мрієте стати розробником смарт-контрактів, ось що вам потрібно знати щодо смарт-контрактів та EVM.
Як тільки ви напишете програму на Solidity, яка є мовою високого рівня, вам потрібно скомпілювати її в байткод - машинозрозумілий формат низького рівня. Цей байткод потрапляє до блокчейну Ethereum та знаходиться там. Будь-хто, хто взаємодіє з смарт-контрактом, повинен відправити транзакцію на адресу контракту.
Кожен вузол з встановленою EVM може бачити цю транзакцію, і як тільки валідатори схвалюють те ж саме, виконується код смарт-контракту. Оскільки кожен вузол має видимість транзакцій, нічого не можна підробити, і код виконується так, як було написано. І як тільки код виконується, стан блокчейну змінюється, зроблюючи процес з кінця в кінець повністю прозорим.
Написання смарт-контрактів потребує технічного ноу-хау. Але це ще не все. Вам також потрібно добре розуміти, як працює технологія блокчейн, які мово-специфічні потреби є важливими для блокчейну, на який ви спрямовуєтеся, інтероперабельність, і більше. Крім цього, вам також слід знати досить багато про вразливості смарт-контрактів - речі, яких слід уникати при написанні коду. І нарешті, знання тестування контрактів та розгортання контрактів також є обов'язковим.
Все це може стати пригнічуючим. Отже, ось швидкий шпаргалка, щоб почати:
Тут є швидка нитка з деякими порадами щодо написання кращих смарт-контрактів:
🥧 FREI-PI
‼️ Чому розробникам смарт-контрактів ПОТРІБНО знати це!
Функція:
– Вимоги
– Ефекти
– Взаємодії
Протокол
– Невідмінності
Це шаблон, про який вам усім слід думати під час створення смарт-контрактів.
Ось чому 👇
— Патрік Коллінз ( @PatrickAlphaC) 6 липня 2023
Час зайнятися технічними аспектами розробки смарт-контрактів. Навіть якщо ланцюжки, такі як Solana та Cardano, дозволяють розробляти смарт-контракти, Ethereum продовжує бути найпопулярнішою платформою для розробки смарт-контрактів.
Чи ви знали? Лише у 2022 році на мережу Ethereum потрапило понад 100 000 децентралізованих додатків.
Ефір має велику спільноту розробників. Будь-що, що ви розробляєте, одразу приверне увагу. Крім того, його рідна мова, Solidity, досить проста для осіб, які знають Python або JavaScript. Нарешті, глобальне програмне забезпечення Ethereum, EVM, допомагає з безперервним виконанням контрактів.
Якщо ви переважно використовуєте Ethereum та Solidity, ось швидкий список речей, які вам потрібно відстежувати перед початком розробки смарт-контракту:
Тепер, коли ми знаємо, як речі відбуваються on-chain, давайте поглибимося у написання та розгортання першого смарт-контракту. Навіть якщо «Привіт, світ!» залишається першим кроком, ми розпочнемо з створення смарт-контракту для запуску гіпотетичного токена BIC з 100% розблокованого постачання у 1 мільйон.
Перший крок - встановити останню версію Node.js та NPM або Node Package Manager. Це дбає про інструменти розробки та локальне середовище для розробки. Крім того, Node.js та NPM дозволяють встановити веб-інтерфейс для вашого смарт-контракту.
Тепер вам потрібно встановити IDE для написання коду контракту. Для цього ви можете швидко встановити Visual Studio Code. Або ви можете прибрати баласт іхмільна Alchemy — платформу для розробки блокчейну. З Alchemy ви можете отримати деякий тестовий ETH. Це покриє витрати на газ при розгортанні смарт-контракту на тестовій мережі Goerli або навіть тестовій мережі Sepolia.
Варто зазначити, що Sepolia - це молодший тестовий мережа і, отже, займає менше місця на диску при розгортанні вузла.
Наразі ми будемо продовжувати використовувати тестову мережу Goerli, оскільки в ній є більша кількість розгорнутих додатків.
Коли тестнет і фальшивий ETH готові, давайте перейдемо до конкретного написання смарт-контракту. Ось фрагмент коду для створення токена BIC з фіксованою пропозицією в 1 мільйон.
Примітка: Ми будемо використовувати наш смарт-контракт локально на MacOS, а не на тестовій мережі. Для розгортання смарт-контрактів на тестовій та головній мережах ми будемо мати окремий етап, який виходить за межі цієї дискусії.
Тут простий фрагмент коду для умовного токена:
pragma solidity ^0.8.0;import "@openzeppelin/contracts/token/ERC20/ERC20.sol";contract BICToken is ERC20 { constructor() ERC20("BIC Token", "BIC") { _mint(msg.sender, 1000000 * 10 ** decimals()); }}
Якщо ви знаєте синтаксис, ви будете знати, що означає кожен компонент коду. Що стосується Openzepplinчастина, це бібліотека, яка використовується для імпорту смарт-контрактів ERC-20. Ця бібліотека пропонує основні стандарти функціонування токенів ERC-20.
Функція монети говорить про початковий резерв, який розгортається за адресою смарт-контракту або msg.sender.
Для налаштування цього коду локально та його тестування нам знадобиться три компоненти:
Якщо ви пройшли докладний процес написання смарт-контракту, важливо знати дещо про виконання контракту. Це процес, за яким код смарт-контракту виконується на ланцюжку вузлами.
Це єдність, пов'язана з виконанням контракту, робить смарт-контракти прозорими та незмінними. Давайте зараз зрозуміємо кроковий процес, пов'язаний з виконанням контракту:
Фрагменти коду, які ми писали, повинні бути виконані десь. У випадку смарт-контрактів це місце виконання - це блокчейн. Вузли або учасники ланцюга допомагають виконати контракт.
Вузли приймають на себе відповідальність за виконання блоків коду контракту в обмін на ланцюгові стимули. Кожна команда або дія, яка відбувається в межах ланцюга, керується смарт-контрактами.
Кожен смарт-контракт має конкретну адресу. Для виконання контракту транзакції надсилаються на цю адресу контракту. Варто зауважити, що кожен вузол запускає EVM, який має копію коду смарт-контракту, що полегшує перевірку автентичності транзакцій.
Транзакції, націлені на смарт-контракт, вибираються валідаторами, які потім включають їх у певні блоки.
Як тільки транзакцію виконано та успішно перевірено, вона стає частиною блокчейну. Функція смарт-контракту, пов'язана з транзакцією, викликається та виконується на вузлах блокчейну.
Кожен вузол, що виконує смарт-контракт, повинен прийти до детермінованого висновку — однакового результату для одного і того ж набору вхідних даних — що робить характер контрактів абсолютно недовіреним та прозорим.
Примітка: Будь-яка помилка, що стосується виконання коду або питань, пов'язаних з комісією за газ, скасовує транзакції. Це означає, що транзакція, заснована на певному коді смарт-контракту, припинить існування. Саме це відбувається з флеш-кредитиколи нездатність дотримуватися конкретних норм зворотно перешкоджає всій угоді, здавалося б, утворюючи враження, ніби кошти взагалі не рухалися у першу чергу.
Кожне зміна стану, пов'язана з розумними контрактами, реєструється в ланцюжку блоків і стає незмінною частиною одного й того ж.
Тепер, коли ви вже досить багато знаєте про смарт-контракти, ось кілька порад, щоб розпочати розробку контракту:
Кожна з вищезгаданих практик допомагає оптимізувати код та реалізувати специфічні заходи безпеки. Однак є кілька практик, специфічних для контрактів, які вам необхідно виконувати та реалізовувати, щоб піклуватися про стійкість коду. Це спрямовано на збереження легкості та можливості використання коду контракту, щоб кожен вузол, який виконує той самий код, не повинен виділяти велику обчислювальну потужність на виконання того ж самого.
Незважаючи на дотримання найкращих практик при написанні та розробці смарт-контрактів, необхідно звернути увагу на вразливості безпеки контрактів при їх пушингу на мейннет.
Кожен смарт-контракт, який має присутність на головній мережі, потребує оцінки щодо продуктивності коду, безпеки та інших характеристик. Саме тут на передній план виходить аудит — ретельний процес тестування контракту — що дозволяє виявити потенційні вразливості та слабкості контракту.
Ось швидкий перелік для початку аудиту:
Чудовий перелік перевірки смарт-контрактів😈
Обов'язково перевірте їх під час наступної аудитування✅
Я б вдячний за ретвіт, поширте знання🫡https://t.co/ILx0C67kf8
— cholakov (@cholakovv) 7 липня 2023 року
Під час читання та написання смарт-контрактів взаємопов'язані, коли мова йде про розробку інтелектуальних фрагментів коду, аудит має особливе значення і включає перевірку логіки на першому місці. Щодо виконання коду, що базується на блокчейні, все є незмінним, і будь-яка катастрофа може мати необоротні наслідки під час виконання контракту. Точно тому перевірка коду контракту та інших аспектів через аудит є необхідною.
Тут може бути безліч вразливості контракту які може виявити детальний аудит смарт-контрактів. До них відносяться перевірка на наявність атак повторного входу, переповнень або недоповнень, проблем, пов'язаних з контролем доступу, і багато іншого. Після того, як буде визначено точний характер проблеми, аудитор може навіть запропонувати найкращі практики для її усунення.
Ще не впевнені, як перевірка смарт-контрактів може допомогти? Ну, дозвольте нам повернутися до печально відомогоDAOвзлом у 2016 році, який використовував проблему повторного входу і призвів до втрат майже 3,6 мільйона ETH. Так само, у 2017 році стався взлом контракту гаманця Parity, що призвів до втрати майже 500 000 ETH. Ці проблеми можна було уникнути за допомогою правильного набору аудитів.
Схема взлому DAO: BeInCrypto
Існує безліч стратегій для аудиту смарт-контрактів. Деякі з найпопулярніших включають:
Ці інструменти виступають як перший набір захисту й найкраще використовуються для виявлення загальних вразливостей. Деякі з найпопулярніших інструментів включають Securify, Mythril та інші, здатні виконувати статичний аналіз коду, виявлення шаблонів порушень та допомагати отримати специфічний початковий підхід до безпеки.
Інструменти для аудиту смарт-контрактів: BeInCrypto
Тут з'являються ручні рецензенти коду, які ретельно вивчають кодову базу та виявляють складні вразливості, якщо вони є. Ручний огляд може допомогти врахувати бізнес-логіку, контекст та шаблони використання.
Ось як ручні кодові перегляди допомагають вам виявляти загрози:
Невеличка цікавинка для наших молодших аудиторів!
Давайте підемо та ретвітнемо, якщо ви знайшли помилку!pic.twitter.com/i14YtweXcz
— Чарльз Паладин (англ.@PaladinCharles) 8 липня 2023 року
Такі інструменти, як Snyk і GuardRails, допомагають з автоматичним скануванням контрактів — реалізацією безпеки, яка викликається щоразу, коли код оновлюється. Ця форма аудиту гарантує, що нові зміни, внесені до коду, є безпечними та неінвазивними за своєю природою.
Це складний процес, який виключно ґрунтується на перевірці бізнес-логіки коду. Зверніть увагу, що формальне підтвердження фактично не призначене для перевірки синтаксису, а лише логіки, щоб переконатися, що код виконується, як бажано.
Крім згаданих стратегій, аудит смарт-контрактів також може бути ініційований за допомогою рецензій колег, програм bug bounty та тестового охоплення за допомогою інструментів, таких як Solidity Coverage, для максимізації ефективності.
Простий спосіб аудиту смарт-контрактів: BeInCrypto
Якщо ви новенькі в аудиті смарт-контрактів, важливо зазначити, що є два широкі способи аналізування коду та виявлення проблем. Це включає:
Цей тип аналізу коду допомагає виявляти базові уразливості безпеки, помилки в кодуванні та інші проблеми згідно з встановленими стандартами кодування та конвенціями. Загрози, такі як невпорядковані виклики до зовнішніх джерел, переповнення цілочисельних значень та інше можуть бути виділені за допомогою статичного аналізу. Найкраще у статичному аналізі полягає в тому, що код не потрібно виконувати для його перевірки.
Цей підхід до аудиту тестує відповідність коду з EVM. Замість перевірки коду, динамічний аналіз перевіряє відповідь смарт-контрактів на широкий спектр вхідних даних. Динамічний аналіз може виявити проблеми, такі як некоординація споживання газу та навіть помилкова логіка контракту. Особисті блокчейн-середовища, такі як Ganache, можуть працювати як платформи динамічного аналізу, дозволяючи розробникам здійснювати транзакції, виконувати команди та робити багато іншого з їх контрактами.
Тут є фрагмент смарт-контракту, який працює як засіб зберігання коштів, маючи функцію зняття коштів:
pragma solidity ^0.6.1;contract VulnerableContract { mapping(address => uint256) public balances; function deposit() public payable { balances[msg.sender] += msg.value; } function withdraw(uint256 _amount) public { require(balances[msg.sender] >= _amount, "Insufficient balance."); (bool success, ) = msg.sender.call{value: _amount}(""); require(success, "Transfer failed."); balances[msg.sender] -= _amount; }}
Якщо ви уважно подивитесь на код, там є ключова вразливість:
У попередньому випадку функція «виведення» може бути викликана повторно, якщо користувач, який отримує кошти, також є смарт-контрактом, нехай і шкідливим. Тому до того, як відбудеться остання функція або оновлення балансу, може бути ініційована атака повторного входу для переказу додаткових коштів. Досвідчені аудитори виявляють такого роду вразливості.
Ось виправлений код для того ж самого:
function withdraw(uint256 _amount) public { require(balances[msg.sender] >= _amount, "Недостатній баланс."); balances[msg.sender] -= _amount; (булевий успіх, ) = msg.sender.call{значення: _amount}("");
require(success, “Передача не вдалася.”);}
Перевірте, як функція оновлення балансу викликається першою, а потім перший хід до користувача. Ця зміна порядку операцій вирішує контракт.
Світ децентралізованих додатків і смарт-контрактів вийшов за рамки Ethereum. Незважаючи на те, що основна частина дій все ще відбувається в екосистемі Ethereum, є й інші мережі, такі як Cardano, Solana та інші, які підтримують смарт-контракти та вимагають інших стандартів аудиту.
Різні блокчейни використовують різні мови програмування. Семантика, синтаксис і властивості коду відрізняються, що робить смарт-контракти реагуючими на різні практики написання та аудиту. Наприклад, Ethereum використовує Solidity, тоді як Polkadotвикористовує Ink та Rust — це реагує на конкретні стандарти аудиту.
Тепер, якщо ви хочете вийти за межі Ethereum, є кілька спеціалізованих інструментів аудиту, щоб ви могли почати. Наприклад, у Cardano є набір Marlowe для формальної верифікації та аудиту. Щодо Solana, специфічні для Rust libfuzzer та cargo-fuzz призначені для аудиту та тестування контрактів. Багатоланцюговий аудитор повинен бути ознайомлений з цими концепціями, щоб уникнути вразливості контрактів.
Просто щоб повторити, ви можете розділити перевірку смарт-контрактів на три типи: ручну, автоматичну та гібридну. Зверніть увагу, що люди віддають перевагу гібридним стратегіям перевірки для складних контрактів з глибокою бізнес-логікою, оскільки вони є найбільш комплексними.
Організації та приватні особи з мінімальними знаннями кодування часто передають свої вимоги до написання та аудиту на аутсорсинг відомим фірмам. Коли справа доходить до аудиту, вибір правильної компанії стає ще більш важливим, оскільки Інструменти штучного інтелектуподобатисяChatGPTможе допомогти написати код смарт-контракту, перевірка такого вимагає вручні інсайти.
Також, ось фактори, на які варто звернути увагу при зовнішньому виконанні аудиторських завдань:
Перед тим як ви зосередитесь на правильній фірмі для зовнішнього виконання, важливо перевірити минулі аудити, оцінити досвід, а навіть зосередитися на ключових членах команди.
Перед тим як здійснити найм, зверніть увагу на витрати та послуги, пов'язані з аудитами. Надзвичайно важливо спочатку зрозуміти характер наданих послуг — такі як виявлення проблем, вирішення проблем та інше. Вам також слід перевірити, чи надаються повторні аудити після впровадження першого рядка виправлень. Вартість аудиту смарт-контракту може варіюватися в залежності від наданих послуг, тому необхідно відстежувати кожну вимогу та пропозицію перед продовженням.
У разі, якщо ви хочете позбутися фірми та перевірити смарт-контракти самостійно, ось найкращі стратегії та практики, які варто мати на увазі:
Штучний інтелект дійсно полегшує написання смарт-контрактів. Однак, незважаючи на інновації штучного інтелекту, найкращим способом перевірки смарт-контрактів залишається втручання людини. Тому, якщо ви плануєте побудувати наступний веб3 продукт, акцентуючи увагу на смарт-контрактах та децентралізованих додатках, важливо ретельно фокусуватися на найкращих ресурсах для аудиту ваших смарт-контрактів. З виявленням крадіжок криптовалюти та порушень щодня, а також плануванням хакерами нових стратегій проникнення, аудит контракту до ідеальності безумовно є одним з найважливіших навичок сучасності.