Введение и мотивация

ETH With Friends - это мой первый настоящий набег на мир построения Dapp (децентрализованное приложение, приложение, которое создано для взаимодействия с блокчейном Ethereum). Мне нравится все в Ethereum и его потенциал для устранения посредников, комиссий за транзакции и мошенничества в самых разных отраслях.

Топливом блокчейна Ethereum является эфир (ETH), который также является виртуальной валютой, которую можно использовать для покупок в реальном мире (через нечто вроде TenX), обменять на биткойны или другие криптовалюты или обменять обратно на фиатную валюту ( используя что-то вроде Coinbase).

Одна из проблем заключается в том, что вам нужен кошелек Ethereum для значимого использования ETH, и эти кошельки адресуются длинной шестнадцатеричной строкой чисел и букв (например, 0x00c63DA10aa538CA40b95e0d0DCd4F8A356AbA1e). Отправка ETH кому-либо еще включает в себя копирование этого адреса, когда один неправильный символ заставит вас отправить деньги не в то место.

Что касается фиатной валюты, мне очень нравится Venmo. Это позволяет мне искать и отправлять деньги (или запрашивать деньги у) любого из моих друзей в Facebook.

У меня есть пара друзей, которые любят ETH, как и я, и я был бы рад, если бы у нас был способ платить друг другу в ETH, не беспокоясь о том, чтобы каждый раз запрашивать адрес и копировать его. Это то, что побудило меня создать ETH с друзьями.

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

Создание Dapp

Стек

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

Я использовал для этого фреймворк Трюфель. Truffle - отличный инструмент, который позволяет легко использовать ваши смарт-контракты во внешнем приложении. Исходя из опыта веб-разработчиков, занимающихся JS, я нашел их готовый React box идеальной отправной точкой.

Смарт-контракт

Чтобы найти адреса Ethereum ваших друзей из Facebook, смарт-контракт должен хранить сопоставление профиля Facebook с адресом кошелька. Должно быть просто, правда? Мы можем просто использовать идентификатор профиля пользователя Facebook в качестве уникального идентификатора и использовать метод для установки идентификатора вашего профиля на адрес кошелька отправителя, гарантируя, что у вас есть закрытый ключ адреса, который вы устанавливаете.

Это будет отлично работать через интерфейс Dapp, где мы можем использовать API Facebook для беспрепятственной передачи этой информации в контракт. Однако вы можете вызвать контракт напрямую через кошелек Ethereum и передать любую информацию в функции напрямую, минуя Dapp. В этой ситуации мы можем заставить злоумышленника узнать идентификатор чужого профиля в Facebook и установить его на адрес своего кошелька. Представьте, что вы хотите отправить деньги своему лучшему другу, а вместо этого отправляете их своему злейшему врагу!

Мы можем решить эту проблему через Oracle. Ethereum Oracle - это сервис, который предоставляет данные из реального мира в блокчейн. Его можно использовать, чтобы доказать, что что-то произошло вне сети, и вставить эти данные в цепочку. Oraclize, пожалуй, самый известный сервис Oracle. Они поддерживают множество источников данных, но нас интересует источник данных URL.

Когда вы входите в систему через Facebook, вы получаете токен доступа. Это токен, который можно использовать для подтверждения вашей личности и статуса входа в систему. Мы можем использовать простую конечную точку REST с этим токеном доступа, чтобы определить, действителен ли токен: https://graph.facebook.com/me?fields=id&access_token=<MY_ACCESS_TOKEN>.

Опять же, эти данные беспрепятственно передаются в контракт через Dapp, поэтому обычному пользователю никогда не придется об этом беспокоиться. Цель состоит только в том, чтобы не допустить, чтобы гнусные актеры обошли Dapp прямо к контракту.

Код смарт-контракта

Код смарт-контракта, чтобы все это произошло, приведен ниже:

Главная магия в этом коде - Oracle. Мы берем facebookAccessToken, который передается в функцию, а затем передаем его в запрос Oraclize со сформированным URL-адресом. Обратите внимание, что объединение строк в Solidity - непростая задача, и мне нужно было использовать библиотеку, чтобы упростить процесс.

Еще стоит отметить mapping (bytes32 => address) requestMap;. Это сделано для того, чтобы мы могли сохранить msg.sender с конкретным запросом Oracle (случайный идентификатор, который невозможно подделать). Это защищает от другой проблемы безопасности: атаки типа «злоумышленник в середине», когда кто-то может напрямую вызвать функцию __callback и попытаться подделать чей-то идентификатор профиля в Facebook.

Dapp

Смарт-контракт обрабатывает всю бизнес-логику и хранилище данных, поэтому единственная другая часть, которую нужно создать, - это Dapp, который является интерфейсом для нашего смарт-контракта. Что касается пользовательского интерфейса, я выбрал хорошо спроектированную Material UI Framework, структуру компонентов React, разработанную в соответствии со спецификациями Google Material Design.

Основными особенностями Dapp являются:

  • Взаимодействуйте с контрактом, чтобы связать адрес вашего кошелька и идентификатор профиля Facebook.
  • Используйте API Facebook, чтобы найти друзей, которые также связали адреса своих кошельков.
  • Отправляйте деньги своим друзьям.

Абстракции контрактов в Truffle делают компиляцию, развертывание и взаимодействие с контрактами чрезвычайно простыми, а

Окончательный (начальный) пользовательский интерфейс:

Верхний раздел уведомляет пользователя о том, что он подключен к Web3, и позволяет им проверить свой сопоставленный адрес кошелька и установить его, если они этого не сделали. Это также позволяет им войти в Facebook, если они еще не сделали этого.

В нижнем разделе API Facebook используется для поиска ваших друзей, которые также зарегистрировались и зарегистрировали свой адрес. Нажав на имя друга, вы сможете отправлять деньги через кошелек Web3 без необходимости вводить адреса!

Развертывание

Приложение развертывается как статический веб-сайт, поэтому есть несколько отличных решений, которые упростят этот процесс. GitHub Pages - фаворит, но я нашел рабочий процесс для Surge лучше. Я купил доменное имя для сайта, используя мою любимую службу DNS, Zeit, и настроил псевдоним так, чтобы он указывал на Surge.

Наконец, я настроил Travis CI так, что каждый раз, когда код помещается в основную ветку, он строится и развертывается с помощью Surge.

Подведение итогов и мысли о будущем

Когда я сам тестировал инструмент, я был поражен тем, насколько легко было отправить ETH моему другу. Раньше я отправлял ETH друзьям, и копировать адреса всегда было немного странно.

Некоторым людям эта идея может не понравиться в целом из-за того, что вы должны публично и навсегда привязать адрес своего кошелька к идентификатору вашего профиля Facebook в блокчейне. Совпадение людей, которые положительно относятся к Facebook как компании, и людей, которые осуществляют транзакции ETH, не очень сильное. Однако я думаю, что Ethereum будет становиться все более и более популярным, и подобные инструменты будут необходимы для обеспечения нашего будущего криптовалюты. Этот инструмент является полностью добровольным и предназначен для удобства людей, которым нужен простой способ оплаты и запроса от своих друзей. У меня нет проблем с привязкой моего профиля Facebook к моему адресу кошелька Ethereum (по крайней мере, одному из них), так что это то, что мне подойдет.

Будущие улучшения

  • Добавьте функцию запроса - запрашивайте ETH у своих друзей и легко возвращайте их из Dapp.
  • Перенести развертывание в IPFS - развернуть в децентрализованном хранилище.
  • Улучшение UI / UX - Мои навыки веб-дизайна - самые слабые из моих навыков как разработчика полного цикла, поэтому для этого потребуется несколько итераций (хотя мне бы хотелось получить отзывы и предложения!).

Попытайся!

Dapp сейчас находится на сайте http://ethwithfriends.xyz/. Сейчас он работает в тестовой сети Kovan, но я планирую перенести его в основную сеть после того, как я найду еще несколько человек, которые помогут мне протестировать его.

Код полностью открыт и доступен по адресу https://github.com/rhlsthrm/eth-with-friends. Я хотел бы видеть любые отзывы, предложения, отчеты об ошибках и запросы на включение!