Вместо того, чтобы лишать таксистов работы, блокчейн лишает работы Uber и позволяет таксистам напрямую работать с клиентом. — Виталик Бутерин

Когда я впервые прочитал приведенную выше цитату Виталика Бутерина, я начал думать о том, как реализовать децентрализованное приложение для каршеринга в стиле Uber. Блокчейн дорог и не предназначен для хранения временных данных, таких как положение автомобиля. Ответ заключается в том, что не блокчейн является ответом. Мы должны пойти глубже.

Базовый механизм p2p-приложения каршеринга заключается в том, что пассажир транслирует запрос на машину со своими координатами. Водители получают этот запрос, и у кого есть свободная машина, тот отвечает на него. Пассажир получает ответ и выбирает водителя. Как видите, нам нужен протокол обмена сообщениями с широковещательной функциональностью. Нечто подобное используется для трансляции готовых блоков в сети блокчейн.

Ethereum имеет собственный протокол обмена сообщениями под названием Whisper. К сожалению, он точно неизвестен и по умолчанию не поддерживается в клиентах Ethereum. К счастью, есть проект Status.im, в котором есть протокол Waku, заменяющий Whisper. Waku основан на libp2p и поддерживает обмен сообщениями через gossipsub, поэтому полностью удовлетворяет наши потребности. (У меня есть статья про libp2p. Рекомендую прочитать для понимания основ.)

Теперь у нас есть базовая концепция и протокол pub/sub. Давайте разработаем для него минималистичный пользовательский интерфейс. Мой минималистичный интерфейс выглядит так:

Простая карта Google с 3 кнопками. Первая кнопка — это кнопка профиля. Я попытался найти самое простое решение для управления профилями. Gravatar — это простой общий профильный сервис, где вы можете привязать изображение профиля и некоторые данные профиля к вашему адресу электронной почты.

Он используется во многих сервисах, таких как GitHub, WordPress и т. д., и может хранить основные данные профиля, так что нам он подойдет. На панели профиля вы должны указать только свой адрес электронной почты, и приложение загрузит все данные вашего профиля из gravatar. Важно установить номер телефона или учетную запись Skype, потому что ваши возможные пассажиры могут получить доступ к вам через него.

Вторая кнопка — это кнопка-переключатель для совместного использования автомобиля. Если нажать на нее, цвет кнопки изменится на зеленый, и приложение подпишется на тему трансляции. Если поступает входящий вызов, приложение будет показывать синий маркер. Если вы нажмете на маркер, вы можете сделать предложение возможному пассажиру.

Последняя кнопка предназначена для пассажиров для вызова машины. Если пассажир нажмет эту кнопку, приложение отправит запрос водителям. Если водитель сделает предложение, появится зеленый маркер. Пассажир может выбрать одного из водителей и позвонить ей, используя указанный Skype-аккаунт или номер телефона.

Вот и все. Как я писал ранее. Это полностью минимальная реализация концепции. Цель этого — помочь понять, как система P2P pub/sub работает в приложении. Давайте посмотрим на код.

Инициализировать Waku очень просто.

this.waku = await Waku.create({ bootstrap: true }); await this.waku.waitForConnectedPeer();

Эти 2 строки кода загрузят фактический список узлов начальной загрузки Waku и будут ожидать подключения некоторых пиров. После этой инициализации наше приложение станет частью сетки Gossipsub и будет готово для отправки и получения сообщений.

let privateTopicName = "/waku-uber/1/" + parsedAvatarData.hash + "/proto";
this.waku.relay.addObserver(
  (wakuMessage) => {
    this.processPrivateMessage(wakuMessage);
  },
  [privateTopicName]
);

Каждый клиент подписывается на специальную приватную тему, которая создается из хэша электронной почты, чтобы сделать ее уникальной. Приложение будет использовать эту тему, когда водитель делает предложение возможному пассажиру. Подписка сделана waku.relay.addObserver. Название темы может быть любым, но Waku имеет рекомендацию для формата названия темы.

const payload = proto.WakuUberMessage.encode({ 
  type: proto.Type.REQUEST, 
  lat: this.myPosition.lat, 
  lng: this.myPosition.lng, 
  avatarHash: parsedAvatarData.hash, 
}); 
const wakuMessage = await WakuMessage.fromBytes( 
  payload, 
  broadcastTopicName 
); 
await this.waku.relay.send(wakuMessage);

Сообщения можно отправлять методом waku.relay.send. У метода есть только один параметр, WakuMessage, который создается из полезной нагрузки и имени темы. Waku использует двоичные полезные нагрузки. Можно отправлять строки в виде сообщений, но рекомендуется использовать двоичный формат, поскольку он более компактен. Существует инструмент под названием Protocol Buffers для определения структур сообщений и их кодирования/декодирования. Наше простое определение формата сообщения выглядит так:

enum Type { 
  REQUEST = 1; 
  RESPONSE = 2; 
} 
message WakuUberMessage { 
  Type type = 1; 
  float lat = 2; 
  float lng = 3; 
  string avatarHash = 4; 
}

Содержит поле типа ЗАПРОС (клиент вызывает машину) или ОТВЕТ (водитель делает предложение), широта/долгота. для географических координат и хэш адреса электронной почты отправителя. Приложение может получить информацию о граватаре с помощью хэша электронной почты, и из него также создается приватная тема.

В двух словах, это важные части приложения. Полный код вы можете найти на GitHub.

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

  • Реальное управление идентификацией. Система идентификации на основе блокчейна может обеспечить доверие между водителем и пассажиром. Сообщения могут быть зашифрованы и подписаны открытыми/закрытыми ключами одноранговых узлов, а одноранговые узлы могут быть идентифицированы сторонними поставщиками удостоверений, которые могут подтвердить достоверность данных профиля, проверить действительность водительских прав и т. д.
  • Трансляция на основе местоположения. В текущей реализации каждый водитель получает каждый запрос, даже если пассажир находится на большом расстоянии от водителя. С этим можно было бы справиться за счет большего количества широковещательных тем, основанных на геохеше.

Как вы можете видеть, когда вы создаете децентрализованное приложение, блокчейн не всегда является ответом. Иногда стоит копнуть глубже в стек p2p. Одноранговые сервисы pubsub, такие как Waku, можно использовать по-разному. Вы можете создать свой децентрализованный Uber или децентрализованный Airbnb, вы можете создать децентрализованные базы данных или собственный блокчейн.

Удачного кодирования…

Эта статья изначально была опубликована здесь.

Больше контента на plainenglish.io. Подпишитесь на нашу бесплатную еженедельную рассылку здесь.