Leçon 2

Листинг и торговые позиции

В этом уроке мы расширим наш контракт Item для работы с листингом и торговлей товарами на нашей торговой площадке. Мы узнаем о том, как добавлять, вносить в список и удалять товары, а также об основах покупки и продажи товаров. Мы также узнаем, как развернуть наш контракт и взаимодействовать с ним в Remix IDE.

Построение контракта на рынке

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

Для этого мы добавим в наш контракт несколько новых функций:

  1. Теперь каждый товар будет иметь адрес продавца, который представляет владельца товара.

  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, address seller);

   // Событие, которое произойдет, когда товар будет выставлен на продажу
 event ItemListed(uint itemId, string itemName, uint itemPrice, address seller);

   // Событие, которое произойдет, когда товар будет куплен
 event ItemBought(uint itemId, string itemName, uint itemPrice, address seller, address buyer);

 // Функция для создания нового товара, но не для немедленного выставления его на продажу
 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, которая теперь включает адрес продавца и булевую опцию forSale. Продавец - это владелец товара, а 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 из выпадающего списка Contract и нажмите кнопку Deploy.

Когда контракт будет развернут, он появится в разделе Развернутые контракты. Вы можете развернуть его, чтобы увидеть его публичные переменные состояния и функции. Вы можете создавать, перечислять и покупать товары, вызывая эти функции.

Чтобы создать товар, введите название и цену и нажмите кнопку createItem. Чтобы выставить товар на продажу, введите ID товара и нажмите кнопку listItemForSale. Чтобы купить предмет, введите ID предмета, отправьте нужное количество Эфира и нажмите кнопку buyItem.

Поздравляем! Теперь Вы знаете, как создать базовую децентрализованную торговую площадку на блокчейне Ethereum.

В следующем уроке мы усовершенствуем нашу торговую площадку, добавив функциональность для снятия товаров с продажи и обновления цены товара. Оставайтесь с нами!

Clause de non-responsabilité
* Les investissements en cryptomonnaies comportent des risques importants. Veuillez faire preuve de prudence. Le cours n'est pas destiné à fournir des conseils en investissement.
* Ce cours a été créé par l'auteur qui a rejoint Gate Learn. Toute opinion partagée par l'auteur ne représente pas Gate Learn.
Catalogue
Leçon 2

Листинг и торговые позиции

В этом уроке мы расширим наш контракт Item для работы с листингом и торговлей товарами на нашей торговой площадке. Мы узнаем о том, как добавлять, вносить в список и удалять товары, а также об основах покупки и продажи товаров. Мы также узнаем, как развернуть наш контракт и взаимодействовать с ним в Remix IDE.

Построение контракта на рынке

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

Для этого мы добавим в наш контракт несколько новых функций:

  1. Теперь каждый товар будет иметь адрес продавца, который представляет владельца товара.

  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, address seller);

   // Событие, которое произойдет, когда товар будет выставлен на продажу
 event ItemListed(uint itemId, string itemName, uint itemPrice, address seller);

   // Событие, которое произойдет, когда товар будет куплен
 event ItemBought(uint itemId, string itemName, uint itemPrice, address seller, address buyer);

 // Функция для создания нового товара, но не для немедленного выставления его на продажу
 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, которая теперь включает адрес продавца и булевую опцию forSale. Продавец - это владелец товара, а 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 из выпадающего списка Contract и нажмите кнопку Deploy.

Когда контракт будет развернут, он появится в разделе Развернутые контракты. Вы можете развернуть его, чтобы увидеть его публичные переменные состояния и функции. Вы можете создавать, перечислять и покупать товары, вызывая эти функции.

Чтобы создать товар, введите название и цену и нажмите кнопку createItem. Чтобы выставить товар на продажу, введите ID товара и нажмите кнопку listItemForSale. Чтобы купить предмет, введите ID предмета, отправьте нужное количество Эфира и нажмите кнопку buyItem.

Поздравляем! Теперь Вы знаете, как создать базовую децентрализованную торговую площадку на блокчейне Ethereum.

В следующем уроке мы усовершенствуем нашу торговую площадку, добавив функциональность для снятия товаров с продажи и обновления цены товара. Оставайтесь с нами!

Clause de non-responsabilité
* Les investissements en cryptomonnaies comportent des risques importants. Veuillez faire preuve de prudence. Le cours n'est pas destiné à fournir des conseils en investissement.
* Ce cours a été créé par l'auteur qui a rejoint Gate Learn. Toute opinion partagée par l'auteur ne représente pas Gate Learn.