Урок 4

Взаємодія та розгортання смарт-контрактів

Смарт-контракти можуть взаємодіяти з іншими контрактами на блокчейні Ethereum, що дозволяє викликати функції, зчитувати змінні та передавати Ether або токени.

Взаємодія з зовнішніми контрактами

Смарт-контракти можуть взаємодіяти з іншими контрактами на блокчейні Ethereum, дозволяючи їм викликати функції, зчитувати змінні та надсилати Ether чи токени. Один із способів сприяти цій взаємодії - використання Web3j, легкої бібліотеки Java для роботи з Ethereum. Web3j може автоматично генерувати код обгортки смарт-контракту, що дозволяє безшовне розгортання та взаємодію з смарт-контрактами з JVM.

Для взаємодії з зовнішніми контрактами за допомогою Web3j вам спочатку потрібно скомпілювати свій смарт-контракт та згенерувати обгортку коду. Потім ви можете створити та розгорнути свій смарт-контракт або використовувати існуючий контракт, що робить легким проведення транзакцій та безпосереднє виклик методів смарт-контракту.

Події та журнали

Події мають вирішальне значення для відстеження та моніторингу активності смарт-контрактів у блокчейні. Вони забезпечують спосіб випускати журнали, які можуть зберігатися та пізніше отримувати офчейн-системи. Події полегшують відстеження конкретних подій контрактів або змін у змінних стану, що особливо корисно для dApps (децентралізованих програм), які потребують оновлення в режимі реального часу.

Журнали – це записи, які випромінюються подіями та зберігаються в блокчейні. Вони є невід'ємною частиною екосистеми Ethereum, оскільки забезпечують ефективний зв'язок між смарт-контрактами та офчейн-системами. Журнали також індексуються, що полегшує програмам фільтрацію та пошук певних подій або точок даних.

Приклад: Розгортання смарт-контракту за допомогою Remix та MetaMask

Крок 1: Відкрийте Remix IDE Спочатку відкрийте IDE Remix (https://remix.ethereum.org/) у вашому веб-переглядачі.

Крок 2: Створіть новий файл Натисніть на кнопку “+” в лівому верхньому куті IDE, щоб створити новий порожній робочий простір. Потім натисніть на сторінку “Новий файл”, щоб створити новий файл.

Назвіть файл «Auction.sol».

Крок 3: Визначте контракт Скопіюйте та вставте наступний код у новий файл «Auction.sol»:``` TypeScript// SPDX-License-Identifier: MIT// Вкажіть версію Soliditypragma solidity ^0.8.0;// Визначте аукціонний контрактконтракт Auction { // Оголосити змінні стану адресою платоспроможного публічного власника; // Власник контракту (може скасувати аукціон) uint public startBlock; // Номер блоку, при якому починається аукціон uint public endBlock; // Номер блоку, при якому закінчується аукціон рядок public ipfsHash; // IPFS хеш для об'єкта, що виставляється на аукціон bool public canceled; Чи скасовано аукціон, чи закінчився публічний захід; Чи завершився аукціон uint public highestBid; Найвища пропозиція на даний момент адресована публічній ціні, що підлягає сплаті; Адреса учасника, який запропонував найвищу ціну // Оголошення події події AuctionCanceled(); Подія, ініційована при скасуванні аукціону подія HighestBidEnhanced(адреса учасника торгів, сума uint); Подія, що виникла, коли встановлено нову найвищу ставку: подія AuctionEnded(адреса переможця, сума uint); Подія, випущена після завершення аукціону // Оголосити відображення відображення(адреса => uint256) публічні баланси; Функція-конструктор constructor() { owner = payable(msg.sender); // Встановити власнику адресу, яка розгортає контракт startBlock = block.number; // Встановити стартовий блок на поточний номер блоку endBlock = startBlock + 40320; // Встановити кінцевий блок на 1 тиждень (40320 блоків) після стартового блоку ipfsHash = ""; Ініціалізувати хеш IPFS порожнім рядком } // Функція для розміщення ставки функція placeBid() public payable { require(block.number >= startBlock && block.number highestBid, "Вже є вища ставка."); // Перевірте, чи нова ставка вища за поточну найвищу ставку (!canceled, "Аукціон скасовано."); // Перевірте, чи аукціон не скасовано Якщо раніше був учасник, який запропонував найвищу ціну, додайте суму його ставки до його балансу, якщо (highestBidder != address(0)) { balances[highestBidder] += highestBid; } // Встановити нову найвищу ставку та ставку highestBid = msg.value; highestBidder = payable(msg.sender); Імітувати подію, яка сигналізує про те, що встановлено нову найвищу ставку, emit HighestBidEnhanced(msg.sender, msg.value); } // Функція скасування аукціону функція cancelAuction() public { require(msg.sender == owner, "Тільки власник може скасувати аукціон."); // Перевірити, що відправник є власником require(!ended, "Аукціон вже завершено."); // Перевірити, що аукціон ще не закінчився // Встановити прапорець canceled та видати подію, яка сигналізує про те, що аукціон скасовано canceled = true; emit AuctionCanceled(); } // Функція завершення аукціону функція endAuction() public { require(block.number > endBlock, "Аукціон ще не закінчено."); // Перевірити, чи аукціон закінчено require(!canceled, "Аукціон скасовано."); // Перевірити, чи аукціон не скасовано require(!ended, "Аукціон вже завершено."); // Перевірити, що аукціон ще не закінчився // Встановити прапорець end і видати подію, яка сигналізує про завершення аукціону end = true; emit AuctionEnded(highestBidder, highestBid); Передати найвищу суму ставки власнику.transfer(highestBid); Якщо раніше був учасник, який запропонував найвищу ціну, додайте суму його ставки до його балансу if (highestBidder != address(0)) { balances[highestBidder] += highestBid; } } // Функція для встановлення хешу IPFS для об'єкта, що виставляється на аукціон function setIpfsHash(string memory hash) public { require(msg.sender == owner, "Тільки власник може встановити IPFS hash."); // Перевірити, що відправник є власником ipfsHash = hash; // Встановити хеш IPFS на надане значення }}


Цей код визначає `Аукціон`контракт, який дозволяє користувачам робити ставки на товар та завершує аукціон після визначеного періоду. Контракт також має функцію скасувати аукціон та функцію встановити хеш IPFS для товару, що виставляється на аукціон.

**Крок 4: Скомпілюйте контракт**

![](https://s3.ap-northeast-1.amazonaws.com/gimg.gateimg.com/learn/892317f5fd1da3a3f21317c034515181a7cfe176.png)

Клацніть на вкладці "Компілятор Solidity" у лівому меню. Під "Компіляція Auction.sol" клацніть кнопку "Компілювати". Контракт повинен бути успішно скомпільований, і ви повинні побачити зелений позначення під "Auction.sol" в провіднику файлів.

**Крок 5: Розгорнути контракт**

![](https://s3.ap-northeast-1.amazonaws.com/gimg.gateimg.com/learn/a0d50ce3bc74d7d23187a3c0e74977a775562a9d.png)

Натисніть на вкладку «Розгортання та запуск транзакцій» у меню ліворуч. У розділі «Середовище» виберіть «Injected Web3» як середовище. У розділі "Контракт" виберіть "Аукціон" як контракт для розгортання. Натисніть кнопку «Розгорнути».

**Крок 6: Взаємодія з контрактом**
Після розгортання контракту ви можете взаємодіяти з ним за допомогою різних функцій, визначених у контракті. Наприклад, ви можете викликати `placeBid()`функція розмістити ставку на товарЗа допомогою Remix та MetaMask ви можете легко розгортати та взаємодіяти зі смарт-контрактами на мережі Ethereum, що дозволяє розробку та тестування децентралізованих додатків в зручному середовищі.

**Основні моменти**
Смарт-контракти можуть взаємодіяти з іншими контрактами в блокчейні Ethereum, забезпечуючи виклики функцій, зчитування змінних і передачу Ether або токенів.
Web3j - це легка бібліотека Java, яка сприяє взаємодії з Ethereum. Вона може автоматично генерувати код обгортки розумного контракту для безшовного розгортання та взаємодії з контрактами з JVM.
Події є важливими для відстеження та моніторингу активності контрактів на блокчейні. Вони випромінюють журнали, які можуть бути збережені та отримані off-chain системами, що дозволяє отримувати оновлення в реальному часі для додатків.
Журнали, тобто записи, що випромінюються подіями, відіграють вирішальну роль в ефективній комунікації між смарт-контрактами та офчейн-системами. Вони індексуються, що дозволяє легко фільтрувати та шукати конкретні події чи точки даних.
Наданий приклад демонструє процес розгортання смарт-контракту за допомогою інтерфейсу Remix та MetaMask. Він включає кроки, такі як створення нового файлу, визначення контракту, компіляція, розгортання та взаємодія з його функціями.

Відмова від відповідальності

* Криптоінвестиції пов'язані зі значними ризиками. Дійте обережно. Курс не є інвестиційною консультацією.

* Курс створений автором, який приєднався до Gate Learn. Будь-яка думка, висловлена автором, не є позицією Gate Learn.