Как внедрить рынок ERC-721
В этой статье я покажу вам, как программировать Craigslist для блокчейна Ethereum.
До Gumtree, Ebay and 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}Итак, кто-то размещает объявление. Товар на продажу. Цена за товар. Статус сделки, который может быть «открыта», «исполнена» или «отменена».
Все эти сделки будут храниться в сопоставлении (mapping). Потому что в Solidity все, кажется, является сопоставлением (mapping). А также потому, что это удобно.
1mapping(uint256 => Trade) public trades;Использование сопоставления (mapping) просто означает, что мы должны придумать идентификатор для каждого объявления перед его размещением, и нам нужно будет знать идентификатор объявления, прежде чем мы сможем с ним работать. Есть несколько способов справиться с этим либо в смарт-контракте, либо во внешнем интерфейсе. Пожалуйста, спросите, если вам нужны какие-либо подсказки.
Далее возникает вопрос о том, с какими предметами мы имеем дело, и какая валюта используется для оплаты транзакции.
Что касается предметов, мы просто попросим, чтобы они реализовывали интерфейс 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 _itemTokenAddress3) public {4 currencyToken = IERC20(_currencyTokenAddress);5 itemToken = IERC721(_itemTokenAddress);6 tradeCounter = 0;7}Мы почти у цели. У нас есть объявления, предметы для торговли и валюта для платежей. Разместить объявление означает поместить предмет на эскроу-счет, чтобы показать, что он у вас есть и что вы не разместили его дважды, возможно, на другой доске.
Приведенный ниже код делает именно это. Помещает предмет на эскроу-счет, создает объявление, выполняет некоторые административные действия.
1function openTrade(uint256 _item, uint256 _price)2 public3{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 public3{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 public3{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 г.