РУКОВОДСТВО ПО ПРОГРАММИРОВАНИЮ

Почему я зарегистрировал свои вакцины на блокчейне

И почему ты тоже должен

Примечание автора ✍️

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

Однако следует отметить, что все это - договор, сайт и статья - все было «взломано» за несколько часов.

Мог бы я сегодня по-другому подойти к этому уроку? да.

Однако я решил не сглаживать это. Я хотел сказать, что начать работу с Ethereum не должно быть сложно. И я считаю, что «сырой» аспект этого урока действительно показывает это.

Мои доводы все еще в силе. Приятного чтения!

Недавно, перед поездкой, мне посоветовали записаться на прием к врачу, чтобы проверить, нужны ли мне вакцины. По приезду меня спросили:

«Так какие вакцины вы уже сделали?»

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

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

Это событие заставило меня задуматься, есть ли лучший способ. Не обязательно для всех, на самом деле только для меня. Что, если бы у меня всегда был доступ к моей записи из любого места? Что ж, я мог бы создать базу данных и поместить туда все свои вакцины. Затем я мог бы создать приложение или веб-сайт для взаимодействия с этой базой данных и отображения информации через красивый интерфейс. Однако при этом у меня возникнут некоторые проблемы:

  • Отсутствие неизменности. Традиционные базы данных позволяют пользователям удалять и изменять ранее сохраненные данные. Следовательно, человек, получивший доступ к базе данных, может стереть мои записи или изменить их без моего ведома. Поскольку я не могу вспомнить все записи (именно поэтому я и делаю эту статью), изменение может даже остаться незамеченным и привести к серьезным последствиям (например, я умру от передозировки вакцины).
  • Хостинг: чтобы получить доступ к моей базе данных, мне нужно как-то ее разместить. Таким образом, я должен доверять своему провайдеру и надеяться, что данные всегда будут доступны, когда они мне понадобятся, и, в зависимости от моих требований, мне, возможно, придется заплатить за эту услугу, чтобы она продолжала работать.
  • Техническое обслуживание. Чтобы обеспечить безопасность и доступность, мне нужно в некоторой степени осуществлять активный надзор за моей базой данных и ее хостингом. Кроме того, если возникнет проблема, мне нужно будет исправить ее, чтобы мое приложение продолжало работать.

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

Шаг 1. Смарт-контракт

Я начал с создания смарт-контракта в Solidity, который позволил бы мне регистрировать и извлекать данные таким образом, чтобы только я мог выполнять эти функции.

Чтобы сэкономить на расходах на газ, я сделал договор максимально простым. Если вы не можете понять код, он, по сути, позволяет трем заранее определенным адресам Ethereum «регистрировать данные» и «получать данные» (т.е. писать, какие вакцины я принимал, и просматривать эти записи). Эти три адреса принадлежат мне.

Итак, это все. Но прежде чем мы продолжим, несколько соображений:

  • Я учел тот факт, что могу потерять доступ к одному адресу, поэтому я определил три адреса, которым разрешено писать и читать данные. Однако я не учел, что кто-то получил доступ к одной из моих учетных записей и добавил новые записи. Опять же, я постарался сделать это как можно проще. В случае, если я замечаю регистрацию, которая не была сделана мной, я могу либо прекратить использование контракта, либо дать указание своему интерфейсу игнорировать определенные регистрации при отображении записей для меня. Но самое главное, я могу знать, что произошло вмешательство, и человек не сможет удалить данные, а только добавить новые данные.
  • Я мог бы легко создать функцию для добавления новых вакцин по отдельности, а затем поместить их в массив или использовать структуру с необходимыми параметрами. Однако, поскольку это всего лишь эксперимент, я решил сэкономить, рассортировав отдельные вакцины в JavaScript, вместо того, чтобы реализовывать эту функциональность в Solidity. Это станет более ясным в следующем разделе.
  • Несмотря на то, что getData имеет модификатор onlyOwners, означающий, что функция не может быть вызвана другими, это не означает, что сохраненные данные личное. Вся информация, хранящаяся в блокчейне Ethereum, может быть просмотрена другими пользователями.
  • Функция dataLength включена, поскольку она полезна для оптимизации моих циклов JavaScript.

Шаг 2. JavaScript

Чтобы максимально сократить расходы на публикацию смарт-контракта и вызов его функций, я выбрал простую структуру, а всю «тяжелую работу» оставил JavaScript на интерфейсе. По сути, чем сложнее смарт-контракт, тем больше вычислительной мощности он требует от сети и, следовательно, тем больше будет стоить его выполнение. Поэтому я решил использовать смарт-контракт только для хранения данных в их самой простой форме и выполнять всю необходимую обработку на машине пользователя через JS.

Я не буду показывать свой код в этой статье, но желающие могут увидеть его здесь.

Я сделал так, чтобы при регистрации моих записей через смарт-контракт я записал их в определенном формате, показанном ниже:

«Дата, название вакцины, номер вакцины, дополнительная информация |»

Дата относится к дате вакцинации, а название относится к заболеванию, от которого она защищает. «Номер вакцины» относится к вакцинам, которые необходимо вводить более одного раза, а дополнительная информация позволяет мне добавлять метаданные, например, где я ее принимал или были ли у меня какие-либо побочные эффекты.

Таким образом, регистрация будет выглядеть примерно так:

«22.01.2018, Гепатит В, 3, Финляндия | 16.04.2018, столбняк, 1, Великобритания »

С помощью этого метода я могу зарегистрировать все свои вакцины сразу с помощью только одного вызова функции. Важно отметить, что запятые и | Символы важны, поскольку они определяют, что будет интерпретироваться JavaScript как новая вакцина или отдельный фрагмент информации. Используя этот формат, мне не нужно иметь отдельные параметры для моих функций Solidity, и я могу сэкономить на расходах на газ, соответствующим образом разделив данные в JS.

Шаг 3. Веб-сайт

Теперь, когда с сортировкой данных разобрались, мне нужен способ их отображения. Цель состоит в том, чтобы иметь возможность легко получить доступ к этим данным из любого места, поэтому я выбрал (адаптивный для мобильных устройств) веб-сайт. Вот как это выглядит:

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

Таким образом, мои затраты (в долларах США) на постоянную регистрацию всех моих вакцин в блокчейне и создание веб-сайта для их отображения в любом месте составили:

  • Стоимость публикации контракта: 0,28 доллара США.
  • Стоимость вызова функции: 0,53 доллара США.
  • Общая стоимость: 0,81 $

Дополнительные (технические) соображения

Пропустите этот раздел, если вас не волнуют технические аспекты из-за кулис. Здесь я расскажу подробнее о том, как я создал это приложение и какие инструменты использовал.

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

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

Что касается процесса разработки, я начал с написания смарт-контракта и тестирования его локально с помощью Truffle и Ganache. После этого я создал веб-сайт и развернул его локально, все еще используя Ganache, но проверяя правильность взаимодействия между смарт-контрактом и интерфейсом. Это было сделано с помощью библиотеки web3.js. Затем я перенес свое тестирование в сеть Ropsten и использовал MyEtherWallet для взаимодействия с контрактом. Я не создавал способ вызова registerData с самого веб-сайта. После тестирования на Ropsten я, наконец, развернул его в основной сети и использовал бесплатный хостинг, чтобы запустить веб-сайт. Для Ropsten и Mainnet я использовал конечную точку Infura в качестве резервного механизма, если MetaMask отсутствует. Таким образом, пользователям (то есть мне) не нужно использовать проводник dApp, например, для просмотра данных на своем телефоне.

Код JavaScript запускается, как только страница загружается, и вызывает функцию для проверки длины массива Vacines. Затем он вызывает функцию getData достаточное количество раз, чтобы собрать все зарегистрированные данные (в настоящее время это означает ее однократный вызов) и объединяет их. Затем он перебирает данные, отделяя вакцины друг от друга. Затем он разделяет каждую часть информации для каждой регистрации вакцины и добавляет их в соответствующие ячейки таблицы.

И, наконец, для внешнего интерфейса я использовал Bootstrap, чтобы таблица выглядела гладко, но не вмешивалась в цвета или дизайн. О, и все HTML, CSS и JS находятся в одном файле, извините.

В смарт-контракте и на сайте всего 289 строк кода, и все это можно найти здесь.

Выводы

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

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

Наконец, как вы можете видеть, общая стоимость создания этого децентрализованного приложения, его публикации в основной сети Ethereum и использования составила 0,81 доллара. Это приложение, которое я действительно буду использовать и которое поможет мне в будущем, и мне не нужно беспокоиться об обслуживании или удалении записей. Он неизменен и доступен в любое время и в любом месте.

Итак, что вы хотите построить, чтобы облегчить себе жизнь?