Тепер ми перетворимо наш простий контракт Item
на більш складний контракт Marketplace
. Контракт Marketplace
підтримуватиме список товарів для продажу, надасть користувачам можливість розміщувати нові товари для продажу та надавати користувачам можливість купувати товари.
Для цього ми додамо кілька нових функцій до нашого контракту:
Кожен товар тепер матиме адресу seller
, яка представляє власника товару.
Ми представимо нову функцію listItemForSale
, яка дозволить користувачам розміщувати нові товари для продажу.
Ми представимо нову функцію buyItem
, яка дозволить користувачам купувати товар.
Marketplace
:Solidity
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.6;
contract Marketplace {
// Визначити нову структуру для Items
struct Item {
string name;
uint price;
address payable seller;
bool forSale;
}
// Масив для зберігання всіх елементів
Item[] public items;
// Подія, яка буде створена, коли буде створено новий товар.
event NewItem(uint itemId, string itemName, uint itemPrice, адреса продавця);
// Подія, яка буде створена, коли товар виставлено на продаж.
event ItemListed(uint itemId, string itemName, uint itemPrice, адреса продавця);
// Подія, яка буде створена, коли товар купується.
event ItemBought(uint itemId, string itemName, uint itemPrice, адреса продавця, адреса покупця);
// Функція, щоб створити новий товар, але не виставити його на продаж негайно
function createItem(string memory _name, uint _price) public {
items.push(Item(_name, _price, payable(msg.sender), false)); // We need to explicitly convert msg.sender to 'address payable'
emit NewItem(items.length - 1, _name, _price, msg.sender);
}
// Функція, щоб додати товар до списку для продажу
function listItemForSale(uint _itemId) public {
Item storage item = items[_itemId];
require(msg.sender == item.seller, "Only the owner can list the item for sale");
item.forSale = true;
emit ItemListed(_itemId, item.name, item.price, item.seller);
}
// Функція для покупки товару
function buyItem(uint _itemId) public payable {
Item storage item = items[_itemId];
require(msg.sender != item.seller, "Seller cannot buy their own item");
require(item.forSale, "Item is not for sale");
require(msg.value == item.price, "Incorrect price sent");
item.seller.transfer(msg.value);
item.forSale = false;
emit ItemBought(_itemId, item.name, item.price, item.seller, msg.sender);
}
}
Структура Item
, яка тепер містить адресу seller
та логічне значення forSale
. seller
є власником товару, а forSale
вказує, чи товар зараз виставлений на продаж.
Функція createItem
, яка створює новий товар і призначає msg.sender
як продавця. msg.sender
— це глобальна змінна в Solidity, яка представляє адресу особи (або смарт-контракту), яка називається поточною функцією. Однак товар не відразу виставляється на продаж.
Функція listItemForSale
, яка дозволяє продавцю товару виставляти його на продаж. Ми використовуємо функцію require
, щоб переконатися, що лише продавець може виставити товар на продаж.
Функція buyItem
, яка дозволяє комусь купити товар. Функція перевіряє, що товар продається, покупець не є продавцем і надіслано правильну ціну. Якщо ці умови виконуються, функція надсилає гроші продавцю та позначає товар як непроданий.
Після написання контракту Marketplace
наступним кроком є його компіляція та розгортання. Ви можете використовувати плагін Solidity Compiler у Remix для компіляції контракту, як ми робили в Уроці 1.
Щоб розгорнути контракт, перейдіть до плагіна Deploy & Run Transactions (той із піктограмою куба) на правій панелі. Виберіть відповідне середовище (JavaScript VM для симуляції), виберіть договір Marketplace
зі спадного меню «Контракт» і натисніть кнопку «Розгорнути».
Після розгортання контракту він з’явиться в розділі «Розгорнуті контракти». Ви можете розгорнути його, щоб побачити його публічні змінні стану та функції. Ви можете створювати, перераховувати та купувати елементи, викликаючи ці функції.
Щоб створити товар, введіть назву та ціну та натисніть кнопку createItem
. Щоб виставити товар на продаж, введіть ідентифікатор товару та натисніть кнопку listItemForSale
. Щоб купити товар, введіть ідентифікатор товару, надішліть правильну кількість ефіру та натисніть кнопку buyItem
.
Щиро вітаю! Тепер ви знаєте, як створити базовий децентралізований ринок на блокчейні Ethereum.
У наступному уроці ми вдосконалимо наш ринок, додавши функціональні можливості для зняття товарів із продажу та оновлення ціни товару. Залишайтеся на зв'язку!
Тепер ми перетворимо наш простий контракт Item
на більш складний контракт Marketplace
. Контракт Marketplace
підтримуватиме список товарів для продажу, надасть користувачам можливість розміщувати нові товари для продажу та надавати користувачам можливість купувати товари.
Для цього ми додамо кілька нових функцій до нашого контракту:
Кожен товар тепер матиме адресу seller
, яка представляє власника товару.
Ми представимо нову функцію listItemForSale
, яка дозволить користувачам розміщувати нові товари для продажу.
Ми представимо нову функцію buyItem
, яка дозволить користувачам купувати товар.
Marketplace
:Solidity
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.6;
contract Marketplace {
// Визначити нову структуру для Items
struct Item {
string name;
uint price;
address payable seller;
bool forSale;
}
// Масив для зберігання всіх елементів
Item[] public items;
// Подія, яка буде створена, коли буде створено новий товар.
event NewItem(uint itemId, string itemName, uint itemPrice, адреса продавця);
// Подія, яка буде створена, коли товар виставлено на продаж.
event ItemListed(uint itemId, string itemName, uint itemPrice, адреса продавця);
// Подія, яка буде створена, коли товар купується.
event ItemBought(uint itemId, string itemName, uint itemPrice, адреса продавця, адреса покупця);
// Функція, щоб створити новий товар, але не виставити його на продаж негайно
function createItem(string memory _name, uint _price) public {
items.push(Item(_name, _price, payable(msg.sender), false)); // We need to explicitly convert msg.sender to 'address payable'
emit NewItem(items.length - 1, _name, _price, msg.sender);
}
// Функція, щоб додати товар до списку для продажу
function listItemForSale(uint _itemId) public {
Item storage item = items[_itemId];
require(msg.sender == item.seller, "Only the owner can list the item for sale");
item.forSale = true;
emit ItemListed(_itemId, item.name, item.price, item.seller);
}
// Функція для покупки товару
function buyItem(uint _itemId) public payable {
Item storage item = items[_itemId];
require(msg.sender != item.seller, "Seller cannot buy their own item");
require(item.forSale, "Item is not for sale");
require(msg.value == item.price, "Incorrect price sent");
item.seller.transfer(msg.value);
item.forSale = false;
emit ItemBought(_itemId, item.name, item.price, item.seller, msg.sender);
}
}
Структура Item
, яка тепер містить адресу seller
та логічне значення forSale
. seller
є власником товару, а forSale
вказує, чи товар зараз виставлений на продаж.
Функція createItem
, яка створює новий товар і призначає msg.sender
як продавця. msg.sender
— це глобальна змінна в Solidity, яка представляє адресу особи (або смарт-контракту), яка називається поточною функцією. Однак товар не відразу виставляється на продаж.
Функція listItemForSale
, яка дозволяє продавцю товару виставляти його на продаж. Ми використовуємо функцію require
, щоб переконатися, що лише продавець може виставити товар на продаж.
Функція buyItem
, яка дозволяє комусь купити товар. Функція перевіряє, що товар продається, покупець не є продавцем і надіслано правильну ціну. Якщо ці умови виконуються, функція надсилає гроші продавцю та позначає товар як непроданий.
Після написання контракту Marketplace
наступним кроком є його компіляція та розгортання. Ви можете використовувати плагін Solidity Compiler у Remix для компіляції контракту, як ми робили в Уроці 1.
Щоб розгорнути контракт, перейдіть до плагіна Deploy & Run Transactions (той із піктограмою куба) на правій панелі. Виберіть відповідне середовище (JavaScript VM для симуляції), виберіть договір Marketplace
зі спадного меню «Контракт» і натисніть кнопку «Розгорнути».
Після розгортання контракту він з’явиться в розділі «Розгорнуті контракти». Ви можете розгорнути його, щоб побачити його публічні змінні стану та функції. Ви можете створювати, перераховувати та купувати елементи, викликаючи ці функції.
Щоб створити товар, введіть назву та ціну та натисніть кнопку createItem
. Щоб виставити товар на продаж, введіть ідентифікатор товару та натисніть кнопку listItemForSale
. Щоб купити товар, введіть ідентифікатор товару, надішліть правильну кількість ефіру та натисніть кнопку buyItem
.
Щиро вітаю! Тепер ви знаєте, як створити базовий децентралізований ринок на блокчейні Ethereum.
У наступному уроці ми вдосконалимо наш ринок, додавши функціональні можливості для зняття товарів із продажу та оновлення ціни товару. Залишайтеся на зв'язку!