Перейти до основного контенту

Як реалізувати продаж ERC-721

Смарт-контракти
erc-721
Solidity
tokens
Середнячок
Alberto Cuesta Cañada
19 березня 2020 р.
5 читається за хвилину

У цій статті я збираюся показати Вам, як кодувати Craigslist для блокчейну Ethereum.

До Gumtree, Ebay та Craigslist дошки об'яв були здебільшого виготовлені з пробок чи паперу. Розташовували дошки об'яв у шкільних коридорах, у пресі, на фонарних стовпах, на вітринах.

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

З допомогою блокчейну ці продажі відновлюються ще раз, дозвольте показати Вам, як це відбувається.

Монетизація

Бізнес-модель загальнодоступної блокчейнової дошки об'яв має відрізнятися від аналогічної на Ebay та інших сервісах.

По-перше, існує аспект децентралізації. Існуючі платформи потребують підтримки власних серверів. Децентралізована платформа підтримується завдяки її користувачам, тому вартість роботи основної платформи знизилася до нуля для її власника.

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

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

Більше того, тут наявна автоматизація та вигідні платежі. Деякі речі можна дуже ефективно токенізувати (opens in a new tab) та торгувати ними на дошці оголошень. Токенізовані активи легко переносяться до блокчейну. У блокчейні можна з легкістю здійснювати дуже складні методи оплати.

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

Я дуже щасливий, що створив це. Давайте подивимося на код.

Реалізація

Деякий час тому ми створили репозиторій з відкритим кодом (opens in a new tab) з прикладами реалізації бізнес-кейсів та іншими корисними речами, будь ласка, ознайомтеся.

Код для цієї Дошки оголошень Ethereum (opens in a new tab) знаходиться там, будь ласка, вільно використовуйте його. Просто майте на увазі, що код не був перевіреним і Вам потрібно уважно дослідити його перед тим, як надіслати гроші на нього.

Основи дошки не є складними. Усі оголошення на дошці будуть просто конструкцією з кількома полями:

1struct Trade {
2 address poster;
3 uint256 item;
4 uint256 price;
5 bytes32 status; // Відкрита, Виконана, Скасована
6}

Отже, тут є хтось, хто публікує рекламу. Товар для продажу. Вартість товару. Статус торгівлі, яка може бути відкритою, виконаною чи закритою.

Всі ці торгівельні угоди зберігатимуться у відображенні. Бо все в Solidity схоже на відображення. Через те, що це зручно.

1mapping(uint256 => Trade) public trades;

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

Далі виникає питання про те, якими є ті товари, з якими ми маємо справу, і якою є ця валюта, що використовується для сплати за транзикцію.

Що стосується елементів, ми просто вимагатимемо, щоб вони реалізовували інтерфейс ERC-721 (opens in a new tab), що насправді є лише способом представлення предметів реального світу в блокчейні, хоча він найкраще працює з цифровими активами (opens in a new tab). Ми збираємося вказати свій власний договір ERC721 в конструкторі, зазначаючи, що будь-які активи на нашій дошці об'яв мають бути токенізовані заздалегідь.

Для платежів ми збираємося робити щось подібне. Більшість блокчейн-проєктів визначають власну ERC-20 (opens in a new tab) криптовалюту. Дехто надає перевагу використанню основних криптовалют, як-от DAI. На цій дошці об'яв Вам потрібно вирішити, якою буде Ваша валюта. Легко.

1constructor (
2 address _currencyTokenAddress, address _itemTokenAddress
3) public {
4 currencyToken = IERC20(_currencyTokenAddress);
5 itemToken = IERC721(_itemTokenAddress);
6 tradeCounter = 0;
7}

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

Код нижче саме цим і займається. Виставляє товар на зберігання, створює рекламу, робить деяке прибирання.

1function openTrade(uint256 _item, uint256 _price)
2 public
3{
4 itemToken.transferFrom(msg.sender, address(this), _item);
5 trades[tradeCounter] = Trade({
6 poster: msg.sender,
7 item: _item,
8 price: _price,
9 status: "Open"
10 });
11 tradeCounter += 1;
12 emit TradeStatusChange(tradeCounter - 1, "Open");
13}
Показати все

Прийняти товар означає обрати рекламне оголошення (товар), оплатити його, отримати замовлення. Код нижче призначений для отримання товару. Перевіряє його доступ. Оплачує товар. Отримує товар. Оновлює рекламу.

1function executeTrade(uint256 _trade)
2 public
3{
4 Trade memory trade = trades[_trade];
5 require(trade.status == "Open", "Угода не відкрита.");
6 currencyToken.transferFrom(msg.sender, trade.poster, trade.price);
7 itemToken.transferFrom(address(this), msg.sender, trade.item);
8 trades[_trade].status = "Executed";
9 emit TradeStatusChange(_trade, "Executed");
10}
Показати все

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

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

1function cancelTrade(uint256 _trade)
2 public
3{
4 Trade memory trade = trades[_trade];
5 require(
6 msg.sender == trade.poster,
7 "Угоду може скасувати лише автор."
8 );
9 require(trade.status == "Open", "Угода не відкрита.");
10 itemToken.transferFrom(address(this), trade.poster, trade.item);
11 trades[_trade].status = "Cancelled";
12 emit TradeStatusChange(_trade, "Cancelled");
13}
Показати все

Ось так. Ви робите це до кінця реалізації. Це досить дивно, як деякі компактні бізнес-концепції можуть бути виражені в коді, ось один з таких випадків. Перегляньте повний контракт у нашому репозиторії (opens in a new tab).

Висновок

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

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

У цій статті я спробував подолати ділову реальність дошок об'яв з технологічним впровадженням. Це знання має допомогти Вам у створенні перспективи і інструкції для реалізації, якщо у Вас є потрібні навички.

Як завжди, якщо Ви збираєтеся створити щось цікаве і хотіли б отримати пораду, будь ласка, напишіть мені (opens in a new tab)! Я завжди радий допомогти.

Останні оновлення сторінки: 15 серпня 2023 р.

Чи була ця інструкція корисною?