Теперь мы преобразуем наш простой контракт Item
в более сложный контракт Marketplace
. Контракт Marketplace
будет поддерживать список товаров, выставленных на продажу, предоставлять пользователям возможность выставлять новые товары на продажу, а также предоставлять пользователям возможность покупать товары.
Для этого мы добавим в наш контракт несколько новых функций:
Теперь каждый товар будет иметь адрес продавца
, который представляет владельца товара.
Мы введем новую функцию 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, 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);
}
}
Структура Item
, которая теперь включает адрес продавца
и булевую опцию forSale
. Продавец
- это владелец товара, а forSale
указывает, выставлен ли товар на продажу в настоящее время.
Функция createItem
, которая создает новый элемент и назначает msg.sender
в качестве продавца. msg.sender
- это глобальная переменная в Solidity, которая представляет собой адрес человека (или смарт-контракта), который вызывает текущую функцию. Однако товар не выставляется на продажу немедленно.
Функция listItemForSale
, которая позволяет продавцу товара выставить его на продажу. Мы используем функцию require
для того, чтобы убедиться, что только продавец может выставить товар на продажу.
Функция buyItem
, которая позволяет кому-либо купить товар. Функция проверяет, что товар выставлен на продажу, покупатель не является продавцом, и была отправлена правильная цена. Если эти условия выполнены, функция отправляет деньги продавцу и помечает товар как не предназначенный для продажи.
После написания контракта Marketplace
следующим шагом будет его компиляция и развертывание. Вы можете использовать плагин Solidity Compiler в Remix для компиляции контракта, точно так же, как мы делали это в Уроке 1.
Чтобы развернуть контракт, перейдите к плагину Deploy & Run Transactions (тот, что со значком куба) на правой панели. Выберите подходящую среду (JavaScript VM для моделирования), выберите контракт Marketplace
из выпадающего списка Contract и нажмите кнопку Deploy.
Когда контракт будет развернут, он появится в разделе Развернутые контракты. Вы можете развернуть его, чтобы увидеть его публичные переменные состояния и функции. Вы можете создавать, перечислять и покупать товары, вызывая эти функции.
Чтобы создать товар, введите название и цену и нажмите кнопку createItem
. Чтобы выставить товар на продажу, введите ID товара и нажмите кнопку listItemForSale
. Чтобы купить предмет, введите ID предмета, отправьте нужное количество Эфира и нажмите кнопку buyItem
.
Поздравляем! Теперь Вы знаете, как создать базовую децентрализованную торговую площадку на блокчейне Ethereum.
В следующем уроке мы усовершенствуем нашу торговую площадку, добавив функциональность для снятия товаров с продажи и обновления цены товара. Оставайтесь с нами!
Теперь мы преобразуем наш простой контракт Item
в более сложный контракт Marketplace
. Контракт Marketplace
будет поддерживать список товаров, выставленных на продажу, предоставлять пользователям возможность выставлять новые товары на продажу, а также предоставлять пользователям возможность покупать товары.
Для этого мы добавим в наш контракт несколько новых функций:
Теперь каждый товар будет иметь адрес продавца
, который представляет владельца товара.
Мы введем новую функцию 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, 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);
}
}
Структура Item
, которая теперь включает адрес продавца
и булевую опцию forSale
. Продавец
- это владелец товара, а forSale
указывает, выставлен ли товар на продажу в настоящее время.
Функция createItem
, которая создает новый элемент и назначает msg.sender
в качестве продавца. msg.sender
- это глобальная переменная в Solidity, которая представляет собой адрес человека (или смарт-контракта), который вызывает текущую функцию. Однако товар не выставляется на продажу немедленно.
Функция listItemForSale
, которая позволяет продавцу товара выставить его на продажу. Мы используем функцию require
для того, чтобы убедиться, что только продавец может выставить товар на продажу.
Функция buyItem
, которая позволяет кому-либо купить товар. Функция проверяет, что товар выставлен на продажу, покупатель не является продавцом, и была отправлена правильная цена. Если эти условия выполнены, функция отправляет деньги продавцу и помечает товар как не предназначенный для продажи.
После написания контракта Marketplace
следующим шагом будет его компиляция и развертывание. Вы можете использовать плагин Solidity Compiler в Remix для компиляции контракта, точно так же, как мы делали это в Уроке 1.
Чтобы развернуть контракт, перейдите к плагину Deploy & Run Transactions (тот, что со значком куба) на правой панели. Выберите подходящую среду (JavaScript VM для моделирования), выберите контракт Marketplace
из выпадающего списка Contract и нажмите кнопку Deploy.
Когда контракт будет развернут, он появится в разделе Развернутые контракты. Вы можете развернуть его, чтобы увидеть его публичные переменные состояния и функции. Вы можете создавать, перечислять и покупать товары, вызывая эти функции.
Чтобы создать товар, введите название и цену и нажмите кнопку createItem
. Чтобы выставить товар на продажу, введите ID товара и нажмите кнопку listItemForSale
. Чтобы купить предмет, введите ID предмета, отправьте нужное количество Эфира и нажмите кнопку buyItem
.
Поздравляем! Теперь Вы знаете, как создать базовую децентрализованную торговую площадку на блокчейне Ethereum.
В следующем уроке мы усовершенствуем нашу торговую площадку, добавив функциональность для снятия товаров с продажи и обновления цены товара. Оставайтесь с нами!