Перейти к основному содержанию

Как внедрить рынок ERC-721

смарт-контракты
erc-721
Solidity
токенов
Intermediate
Alberto Cuesta Cañada
19 марта 2020 г.
5 минута прочтения

В этой статье я покажу вам, как программировать 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 _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 г.

Было ли это руководство полезным?