บทเรียนที่ 2

Лістинг і торгівля

У цьому уроці ми розповімо про наш контракт щодо предметів, щоб керувати розміщенням і торгівлею предметами на нашому ринку. Ми дізнаємося про те, як додавати, перераховувати та видаляти предмети, а також про основи купівлі та продажу предметів. Ми також навчимося розгортати наш контракт і взаємодіяти з ним у Remix IDE.

Створення контракту на ринковому майданчику

Тепер ми перетворимо наш простий контракт Item на більш складний контракт Marketplace . Контракт Marketplace підтримуватиме список товарів для продажу, надасть користувачам можливість розміщувати нові товари для продажу та надавати користувачам можливість купувати товари.

Для цього ми додамо кілька нових функцій до нашого контракту:

  1. Кожен товар тепер матиме адресу seller , яка представляє власника товару.

  2. Ми представимо нову функцію listItemForSale , яка дозволить користувачам розміщувати нові товари для продажу.

  3. Ми представимо нову функцію 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);
    }
}

У цьому контракті ми маємо:

  1. Структура Item , яка тепер містить адресу seller та логічне значення forSale . seller є власником товару, а forSale вказує, чи товар зараз виставлений на продаж.

  2. Функція createItem , яка створює новий товар і призначає msg.sender як продавця. msg.sender — це глобальна змінна в Solidity, яка представляє адресу особи (або смарт-контракту), яка називається поточною функцією. Однак товар не відразу виставляється на продаж.

  3. Функція listItemForSale , яка дозволяє продавцю товару виставляти його на продаж. Ми використовуємо функцію require , щоб переконатися, що лише продавець може виставити товар на продаж.

  4. Функція buyItem , яка дозволяє комусь купити товар. Функція перевіряє, що товар продається, покупець не є продавцем і надіслано правильну ціну. Якщо ці умови виконуються, функція надсилає гроші продавцю та позначає товар як непроданий.

Розгортання та взаємодія з контрактом Marketplace

Після написання контракту Marketplace наступним кроком є його компіляція та розгортання. Ви можете використовувати плагін Solidity Compiler у Remix для компіляції контракту, як ми робили в Уроці 1.

Щоб розгорнути контракт, перейдіть до плагіна Deploy & Run Transactions (той із піктограмою куба) на правій панелі. Виберіть відповідне середовище (JavaScript VM для симуляції), виберіть договір Marketplace зі спадного меню «Контракт» і натисніть кнопку «Розгорнути».

Після розгортання контракту він з’явиться в розділі «Розгорнуті контракти». Ви можете розгорнути його, щоб побачити його публічні змінні стану та функції. Ви можете створювати, перераховувати та купувати елементи, викликаючи ці функції.

Щоб створити товар, введіть назву та ціну та натисніть кнопку createItem . Щоб виставити товар на продаж, введіть ідентифікатор товару та натисніть кнопку listItemForSale . Щоб купити товар, введіть ідентифікатор товару, надішліть правильну кількість ефіру та натисніть кнопку buyItem .

Щиро вітаю! Тепер ви знаєте, як створити базовий децентралізований ринок на блокчейні Ethereum.

У наступному уроці ми вдосконалимо наш ринок, додавши функціональні можливості для зняття товарів із продажу та оновлення ціни товару. Залишайтеся на зв'язку!

ข้อจำกัดความรับผิด
* การลงทุนคริปโตมีความเสี่ยงสูง โปรดดำเนินการด้วยความระมัดระวัง หลักสูตรนี้ไม่ได้มีไว้เพื่อเป็นคำแนะนำในการลงทุน
* หลักสูตรนี้สร้างขึ้นโดยผู้เขียนที่ได้เข้าร่วม Gate Learn ความคิดเห็นของผู้เขียนไม่ได้มาจาก Gate Learn
แคตตาล็อก
บทเรียนที่ 2

Лістинг і торгівля

У цьому уроці ми розповімо про наш контракт щодо предметів, щоб керувати розміщенням і торгівлею предметами на нашому ринку. Ми дізнаємося про те, як додавати, перераховувати та видаляти предмети, а також про основи купівлі та продажу предметів. Ми також навчимося розгортати наш контракт і взаємодіяти з ним у Remix IDE.

Створення контракту на ринковому майданчику

Тепер ми перетворимо наш простий контракт Item на більш складний контракт Marketplace . Контракт Marketplace підтримуватиме список товарів для продажу, надасть користувачам можливість розміщувати нові товари для продажу та надавати користувачам можливість купувати товари.

Для цього ми додамо кілька нових функцій до нашого контракту:

  1. Кожен товар тепер матиме адресу seller , яка представляє власника товару.

  2. Ми представимо нову функцію listItemForSale , яка дозволить користувачам розміщувати нові товари для продажу.

  3. Ми представимо нову функцію 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);
    }
}

У цьому контракті ми маємо:

  1. Структура Item , яка тепер містить адресу seller та логічне значення forSale . seller є власником товару, а forSale вказує, чи товар зараз виставлений на продаж.

  2. Функція createItem , яка створює новий товар і призначає msg.sender як продавця. msg.sender — це глобальна змінна в Solidity, яка представляє адресу особи (або смарт-контракту), яка називається поточною функцією. Однак товар не відразу виставляється на продаж.

  3. Функція listItemForSale , яка дозволяє продавцю товару виставляти його на продаж. Ми використовуємо функцію require , щоб переконатися, що лише продавець може виставити товар на продаж.

  4. Функція buyItem , яка дозволяє комусь купити товар. Функція перевіряє, що товар продається, покупець не є продавцем і надіслано правильну ціну. Якщо ці умови виконуються, функція надсилає гроші продавцю та позначає товар як непроданий.

Розгортання та взаємодія з контрактом Marketplace

Після написання контракту Marketplace наступним кроком є його компіляція та розгортання. Ви можете використовувати плагін Solidity Compiler у Remix для компіляції контракту, як ми робили в Уроці 1.

Щоб розгорнути контракт, перейдіть до плагіна Deploy & Run Transactions (той із піктограмою куба) на правій панелі. Виберіть відповідне середовище (JavaScript VM для симуляції), виберіть договір Marketplace зі спадного меню «Контракт» і натисніть кнопку «Розгорнути».

Після розгортання контракту він з’явиться в розділі «Розгорнуті контракти». Ви можете розгорнути його, щоб побачити його публічні змінні стану та функції. Ви можете створювати, перераховувати та купувати елементи, викликаючи ці функції.

Щоб створити товар, введіть назву та ціну та натисніть кнопку createItem . Щоб виставити товар на продаж, введіть ідентифікатор товару та натисніть кнопку listItemForSale . Щоб купити товар, введіть ідентифікатор товару, надішліть правильну кількість ефіру та натисніть кнопку buyItem .

Щиро вітаю! Тепер ви знаєте, як створити базовий децентралізований ринок на блокчейні Ethereum.

У наступному уроці ми вдосконалимо наш ринок, додавши функціональні можливості для зняття товарів із продажу та оновлення ціни товару. Залишайтеся на зв'язку!

ข้อจำกัดความรับผิด
* การลงทุนคริปโตมีความเสี่ยงสูง โปรดดำเนินการด้วยความระมัดระวัง หลักสูตรนี้ไม่ได้มีไว้เพื่อเป็นคำแนะนำในการลงทุน
* หลักสูตรนี้สร้างขึ้นโดยผู้เขียนที่ได้เข้าร่วม Gate Learn ความคิดเห็นของผู้เขียนไม่ได้มาจาก Gate Learn