Як реалізувати ринок ERC-721
У цій статті я покажу вам, як написати код Craigslist для блокчейну Етеріум.
До появи Gumtree, Ebay та Craigslist дошки оголошень здебільшого робили з корка або паперу. Дошки оголошень були в шкільних коридорах, газетах, на вуличних ліхтарях та вітринах магазинів.
Усе змінилося з появою інтернету. Кількість людей, які могли побачити певну дошку оголошень, зросла на багато порядків. Завдяки цьому ринки, які вони представляють, стали набагато ефективнішими та масштабувалися до глобальних розмірів. Ebay — це величезний бізнес, який бере свій початок саме з таких фізичних дощок оголошень.
З появою блокчейну ці ринки знову зміняться, і я покажу вам як.
Монетизація
Бізнес-модель публічної блокчейн-дошки оголошень повинна відрізнятися від моделі Ebay та подібних компаній.
По-перше, існує аспект децентралізації. Існуючі платформи повинні підтримувати власні сервери. Децентралізована платформа підтримується її користувачами, тому витрати на роботу базової платформи для її власника знижуються до нуля.
Потім є фронтенд — вебсайт або інтерфейс, який надає доступ до платформи. Тут є багато варіантів. Власники платформи можуть обмежити доступ і змусити всіх використовувати їхній інтерфейс, стягуючи за це плату. Власники платформи також можуть вирішити відкрити доступ (Влада народу!) і дозволити будь-кому створювати інтерфейси для платформи. Або ж власники можуть обрати будь-який компромісний підхід між цими крайнощами.
Бізнес-лідери з ширшим баченням, ніж у мене, знатимуть, як це монетизувати. Усе, що я бачу, — це те, що це відрізняється від статус-кво і, ймовірно, є прибутковим.
Крім того, є аспект автоматизації та платежів. Деякі речі можна дуже ефективно токенізувати (opens in a new tab) та продавати на дошці оголошень. Токенізовані активи легко передаються в блокчейні. У блокчейні можна легко реалізувати дуже складні методи оплати.
Я просто відчуваю тут бізнес-можливість. Дошку оголошень без експлуатаційних витрат можна легко реалізувати, включивши складні шляхи оплати в кожну транзакцію. Я впевнений, що хтось придумає, для чого це використати.
Я просто радий це створювати. Давайте поглянемо на код.
Реалізація
Деякий час тому ми створили репозиторій з відкритим вихідним кодом (opens in a new tab) із прикладами реалізації бізнес-кейсів та іншими корисними речами, будь ласка, погляньте.
Код для цієї дошки оголошень Етеріум (opens in a new tab) знаходиться там, будь ласка, використовуйте його як завгодно. Тільки майте на увазі, що код не проходив аудит, і вам потрібно провести власну перевірку, перш ніж вкладати в нього гроші.
Основи дошки не є складними. Усі оголошення на дошці будуть просто структурою з кількома полями:
struct Trade {
address poster;
uint256 item;
uint256 price;
bytes32 status; // Відкритий, Виконаний, Скасований
}
Отже, є хтось, хто публікує оголошення. Предмет для продажу. Ціна за предмет. Статус угоди, який може бути відкритим, виконаним або скасованим.
Усі ці угоди зберігатимуться у відображенні (mapping). Тому що все в Solidity, здається, є відображенням. А також тому, що це зручно.
mapping(uint256 => Trade) public trades;
Використання відображення просто означає, що ми повинні придумати ідентифікатор (id) для кожного оголошення перед його публікацією, і нам потрібно буде знати ідентифікатор оголошення, перш ніж ми зможемо з ним працювати. Існує кілька способів вирішення цього питання як у смарт-контракті, так і у фронтенді. Будь ласка, запитуйте, якщо вам потрібні підказки.
Далі постає питання про те, з якими предметами ми маємо справу, і що це за валюта, яка використовується для оплати транзакції.
Щодо предметів, ми просто вимагатимемо, щоб вони реалізовували інтерфейс ERC-721 (opens in a new tab), який насправді є просто способом представлення предметів реального світу в блокчейні, хоча він найкраще працює з цифровими активами (opens in a new tab). Ми збираємося вказати наш власний контракт ERC-721 у конструкторі, що означає, що будь-які активи на нашій дошці оголошень повинні бути токенізовані заздалегідь.
Для платежів ми зробимо щось подібне. Більшість блокчейн-проєктів визначають власну криптовалюту ERC-20 (opens in a new tab). Деякі інші вважають за краще використовувати популярну, таку як DAI. На цій дошці оголошень вам просто потрібно вирішити під час створення, якою буде ваша валюта. Легко.
constructor (
address _currencyTokenAddress, address _itemTokenAddress
) public {
currencyToken = IERC20(_currencyTokenAddress);
itemToken = IERC721(_itemTokenAddress);
tradeCounter = 0;
}
Ми майже закінчили. У нас є оголошення, предмети для торгівлі та валюта для платежів. Створити оголошення означає помістити предмет на умовне депонування (escrow), щоб показати, що він у вас є і що ви не опублікували його двічі, можливо, на іншій дошці.
Наведений нижче код робить саме це. Поміщає предмет на умовне депонування, створює оголошення, виконує деякі організаційні дії.
function openTrade(uint256 _item, uint256 _price)
public
{
itemToken.transferFrom(msg.sender, address(this), _item);
trades[tradeCounter] = Trade({
poster: msg.sender,
item: _item,
price: _price,
status: "Open"
});
tradeCounter += 1;
emit TradeStatusChange(tradeCounter - 1, "Open");
}
Прийняти угоду означає вибрати оголошення (угоду), сплатити ціну, отримати предмет. Наведений нижче код отримує угоду. Перевіряє її доступність. Оплачує предмет. Отримує предмет. Оновлює оголошення.
function executeTrade(uint256 _trade)
public
{
Trade memory trade = trades[_trade];
require(trade.status == "Open", "Trade is not Open.");
currencyToken.transferFrom(msg.sender, trade.poster, trade.price);
itemToken.transferFrom(address(this), msg.sender, trade.item);
trades[_trade].status = "Executed";
emit TradeStatusChange(_trade, "Executed");
}
Нарешті, у нас є можливість для продавців відмовитися від угоди до того, як покупець її прийме. У деяких моделях оголошення замість цього були б активними протягом певного періоду часу, перш ніж закінчиться їхній термін дії. Вибір за вами, залежно від дизайну вашого ринку.
Код дуже схожий на той, що використовується для виконання угоди, тільки валюта не переходить з рук в руки, а предмет повертається до автора оголошення.
function cancelTrade(uint256 _trade)
public
{
Trade memory trade = trades[_trade];
require(
msg.sender == trade.poster,
"Trade can be cancelled only by poster."
);
require(trade.status == "Open", "Trade is not Open.");
itemToken.transferFrom(address(this), trade.poster, trade.item);
trades[_trade].status = "Cancelled";
emit TradeStatusChange(_trade, "Cancelled");
}
Ось і все. Ви дійшли до кінця реалізації. Досить дивно, наскільки компактними є деякі бізнес-концепції, коли вони виражені в коді, і це один із таких випадків. Перегляньте повний контракт у нашому репозиторії (opens in a new tab).
Висновок
Дошки оголошень — це поширена конфігурація ринку, яка масово масштабувалася з появою інтернету, ставши надзвичайно популярною бізнес-моделлю з кількома монополістичними переможцями.
Дошки оголошень також виявилися простим інструментом для відтворення в середовищі блокчейну, з дуже специфічними функціями, які зроблять можливим виклик існуючим гігантам.
У цій статті я спробував поєднати бізнес-реальність дошки оголошень із технологічною реалізацією. Ці знання повинні допомогти вам створити бачення та дорожню карту для реалізації, якщо у вас є відповідні навички.
Як завжди, якщо ви збираєтеся створити щось цікаве і хотіли б отримати пораду, будь ласка, напишіть мені (opens in a new tab)! Я завжди радий допомогти.