Безопасное хранение данных IoT в частном блокчейне Ethereum. Часть 1
Интернет вещей (IoT) — это набор технологий, которые позволяют подключенным к сети устройствам выполнять действия или обмениваться данными между несколькими подключенными устройствами или с общей базой данных. Действия могут могут быть любыми: от дистанционного включения кондиционера воздуха до включения зажигания автомобиля с помощью команды, поданной из удаленного места, или попросить Alexa или Google Assistant найти информацию о погодных условиях в том или ином районе. IoT доказал свою эффективность во многих отраслях промышленности таких как цепочки поставок, доставка и транспортировка, предоставляя информацию о состоянии грузов в режиме реального времени. Это привело к появлению огромного количества данных, создаваемых множеством таких устройств. которые необходимо обрабатывать в режиме реального времени.
В данной статье мы предлагаем метод сбора информации с датчиков устройств IoT и использования блокчейна для хранения и получения собранных данных для безопасного и децентрализованного хранения и извлечения собранных данных в рамках закрытой системы, подходящей для одного предприятия или группы компаний в таких отраслях, как, например, судоходство, где требуется обмен данных друг с другом. Подобно блокчейну, мы представляем себе будущее, в котором устройства IoT смогут подключаться и отключаться к распределенным системам, не вызывая простоя в сборе и хранении данных или не полагаясь на облачные технологии хранения или полагаться на облачную систему хранения для синхронизации данных между устройствами. Мы также рассмотрим производительность некоторых из этих распределенных систем, таких как Inter Planetary File System (IPFS) и Ethereum Swarm на маломощных устройствах, таких как raspberry pi.
Глава 1. Введение
Интернет вещей (IoT) — это захватывающая область компьютерных наук с потенциалом революционных изменений в нескольких отраслях, таких как здравоохранение, энергетика и коммунальные услуги, транспорт, судоходство и розничная торговля. Такие устройства, как Apple Smartwatch, способны распознать сердечный приступ и при необходимости оповестить экстренные службы с помощью своих датчиков ЭКГ. Последние исследования показывают, что в ближайшие годы в сети появится множество таких устройств, и каждое из них будет генерировать небольшие объемы данных в больших количествах. Это требует безопасной и надежной модели хранения данных со средствами защиты этих данных от кражи. В последние годы блокчейн быстро набирает обороты в других областях, помимо его самого известного применения в качестве криптовалюты, используемой в качестве замены обычной валюты. Реализации блокчейна/распределенного реестра, такие как Ethereum и Hyperledger Fabric, представили концепцию, называемую программируемым блокчейном, которая открыла возможности эффективного использования блокчейна для улучшения и оптимизации таких отраслей, как доставка, цепочки поставок и Интернет вещей (IoT). Вместо того чтобы просто хранить в блокчейне такие данные, как баланс определенного кошелька для криптовалюты, программируемый блокчейн позволил нам хранить и выполнять код, который может быть использован для хранения и получения всех видов данных децентрализованным образом. Эта концепция в Ethereum называется смарт-контрактами, которые могут быть написаны и развернуты в любой сети Ethereum. Безопасность IoT является основной проблемой для таких устройств, как Raspberry Pi, где необходимо решить проблемы приватности данных, гарантировать конфиденциальность и целостность данных, если мы хотим доверять данным от IoT-устройства.
1.1 Цель
В данной статье мы рассмотрим, как хранить данные IoT на комбинации on-chain (Ethereum Blockchain) и off-chain хранилищ (IPFS и Ethereum Swarm) в зашифрованном виде и использовать их в модели публикации-подписки в режиме реального времени без использования каких-либо протоколов M2M, таких как MQTT или CoAP. Мы также оценим производительность этой системы с точки зрения количества транзакций, которые могут быть выполнены в секунду, а также попытаемся оптимизировать ее работу.
1.2 Краткое содержание
В главе 1 мы познакомим читателя с устройствами IoT и той ролью, которую они призваны сыграть в нашей жизни, а также с тем, как мы можем интегрировать их с другими технологиями, такими как блокчейн.
В главе 2 мы рассмотрим мотивацию, которая подтолкнула нас к рассмотрению исследований в области Интернета вещей и блокчейн, существующие исследования в этой области и, наконец, предложим новую систему для преодоления существующих проблем в этих областях.
В главе 3 мы объясняем различные технологии блокчейн, используемые в настоящее время, и то, как все эти технологии используются для решения определенных проблем.
В главе 4 мы описываем терминологию, протоколы и устройства IoT, рассматриваемые для использования в нашей статье. Мы также рассмотрим, как установить корень доверия для этих устройств и обеспечить функции безопасности с помощью внешнего оборудования.
В главе 5 мы описываем предложенную систему хранения данных в блокчейн и вне блокчейн для децентрализованного хранения данных с датчиков. Мы также описываем смарт-контракт, используемый для регистрации IoT-устройств и хранения данных.
В главе 6 мы проводим эксперименты по хранению данных с использованием традиционных баз данных, а также предложенной системы с использованием Ethereum Blockchain, IPFS и Swarm. Чтобы понять стоимость безопасности IoT, мы проводим эксперименты по оценке производительности предложенной системы.
В главе 7 мы попытаемся обобщить выводы, сделанные в данной статье, и завершим ее ретроспективным обзором 2 измерений производительности этих систем хранения данных вместе с блокчейном.
Глава 2. Задачи и предпосылки
2.1 Задачи
IoT-устройства были сопряжены с проблемами на протяжении всего времени существования технологии, и до недавнего времени эти устройства использовались только в хобби-проектах и никогда не имели массового успеха, пока мощь облачных вычислений не была использована для питания таких устройств, как Alexa Echo, Google Home Mini. Это также позволило использовать управляемые через Интернет датчики в "умных" холодильниках, автомобилях и духовках. Если мы не хотим зависеть от этих управляемых облачных решений, то создание сопоставимой инфраструктуры с точки зрения хранения данных и протоколов обмена сообщениями требует огромных затрат. Децентрализованные системы, такие как блокчейн, особенно Ethereum и все другие производные блокчейна, действительно перспективны в том смысле, что они обеспечивают сетевой метод для подключения к другим устройствам, на которых работает программное обеспечение, а также предоставляют решения для хранения данных.
Вопросы безопасности являются очень важным вопросом, который необходимо решить в этих устройствах, причем основной проблемой является "труднозащищенный" механизм хранения конфиденциальных данных, таких как закрытые ключи и секретные ключи для API. Аппаратные механизмы безопасности или доверенные платформенные модули (TPM) направлены на создание аппаратного уровня доверия для шифрования устройств хранения и хранения конфиденциальных данных.
Блокчейн все еще является очень молодой технологией и имеет множество собственных проблем. Скорость транзакций в секунду по своей природе очень мала по сравнению с традиционными системами хранения и обработки данных, а большинство блокчейн разработаны как полностью открытые и не предусматривают никакой конфиденциальности данных. Только достоверность данных подтверждается механизмами консенсуса, обеспечиваемыми сетью блокчейн.
Хранение данных в блокчейне дорого для больших объемов данных. В сочетании с проблемой скорости транзакций, блокчейн кажется плохим способом хранения данных. Однако децентрализованные технологии, такие как Inter Planetary File System (IPFS) или Ethereum Swarm, могут быть использованы для хранения фактической полезной информации, а реализация блокчейна, такая как Ethereum, может быть использована для хранения ссылок на фактические данные, хранящиеся в этих системах. Edge устройства не должны хранить ссылки на данные или саму полезную нагрузку. Любое количество высокопроизводительных устройств может быть добавлено или удалено в сеть, чтобы взять на себя работу по хранению данных в системе хранения и блокчейне.
Это решает проблемы как скорости транзакций, так и стоимости хранения. Нам не нужно ждать, пока транзакции будут проверены, и вместо этого переходить к следующей транзакции. Майнеры в сети будут работать в своем собственном темпе и обрабатывать эти транзакции, а от нас не потребуется оплачивать расходы на хранение, которые в противном случае должны быть оплачены. Мы можем ввести централизацию и утвердить контроль над системой, заставив все IoT-устройства зарегистрироваться в сети, прежде чем им будет разрешено отправлять или получать данные. Это поможет предотвратить несанкционированный доступ к сети.
2.2 Исследования
Исследования в области Интернета вещей и блокчейна переживают значительное оживление после внезапного интереса к криптовалютам и майнингу. Такие компании, как IBM, Amazon и Microsoft, внесли свой вклад в недавний всплеск использования блокчейн в коммерческих приложениях.
В различных научных публикациях были представлены новые решения для телекоммуникаций, голосования, создания децентрализованных систем социальных сетей, умных домов и фондовых бирж. Использование публичных блокчейнов для хранения промышленных данных в зашифрованном виде также широко изучалось.
IPFS также может быть использована в качестве мощной замены Swarm, о чем свидетельствует тот факт, что IPFS нацелена на решение большинства тех же проблем, для устранения которых разрабатывается Swarm. Ethereum + Swarm и Ethereum + IPFS были изучены для хранения пользовательских данных, контроля доступа к данным, хранящимся в системе, шифрования конфиденциальных данных в публичных блокчейн-сетях, а также хранения данных IoT и IoT маркетплейсах.
Исследование эталонных байткодов EVM и объектно-ориентированных методов, используемых для написания смарт-контрактов, обеспечили мне значительное понимание написания эффективных смарт-контрактов в соответствии с лучшими практиками.
Анализ производительности децентрализованных решений также рассматривался в различных научных публикациях, где частная сеть ethereum была протестирована на предмет показателей производительности. Любопытно, что показатели производительности Ethereum с IPFS или Swarm не были тщательно исследованы.
Текущие исследования в области применения блокчейна для IoT в основном касаются обеспечения конфиденциальности, аутентификации и других аспектов безопасности для устройств и датчиков IoT. Основной областью исследований является изучение того, могут ли данные, собранные и сохраненные датчиками IoT, быть безопасно получены и использованы другими источниками, различных систем, которые могут быть использованы для таких целей, и какие из них обеспечивают наиболее идеальное решение. Используя идеи, изучаются методы интеграции IoT-устройств в инфраструктуру блокчейна, исследуются способы обеспечения безопасности SSL/TLS.
2.3 Предлагаемое решение
В этой статье мы создадим модель зашифрованного хранения данных IoT, в которой данные, генерируемые датчиками, будут надежно храниться на нескольких распределенных узлах либо Ethereum Swarm (или) IPFS, а порядок сбора данных будет сохранен с помощью блокчейна Ethereum и смарт-контрактов. Настройка IPFS, Ethereum Swarm и частного Ethereum Blockchain выполнена, и данные собираются с датчиков, таких как цифровой датчик влажности и температуры (DHT11). Edge узлы (узлы Ethereum и Swarm без майнинга) на крошечных компьютерах типа Raspberry Pi 3B+ используются для сбора и хранения показаний датчиков в сети, а узлы майнеров, работающие на более мощных машинах, используются для обработки и подтверждения транзакций в сети. Сила этой модели заключается в ее конструкции, где нет единой точки отказа, и любой узел, майнер или не-майнер, может быть добавлен, удален и заменен без ущерба для функционирования всей сети, при условии, что другой узел будет добавлен до удаления предыдущего.
Контроль над устройствами осуществляется с помощью смарт-контрактов для регистрации устройства, прежде чем оно сможет отправлять или получать данные из системы. Однако наличие распределенных устройств добавляет значительные накладные расходы на защиту информации, передаваемой между ними. Шифрование с открытым и закрытым ключом, такое как RSA, может сочетаться с симметричным шифрованием, таким как Advanced Encryption Standard (AES), а подлинность проверяется с помощью кода аутентификации сообщений с хэш-ключом (HMAC). Мы предлагаем аппаратные и программные методы, такие как модуль Trusted Platform Module (TPM), для полного шифрования файловой системы носителя на граничных устройствах с помощью Linux Unified Key System (LUKS) и безопасного хранения секретных ключей, используемых для симметричного шифрования, на устройстве хранения данных путем блокировки его в системе с помощью закрытого ключа TPM.
Глава 3. Технология блокчейн
3.1 Блокчейн
Блокчейн — это, проще говоря, серия блоков, объединенных в цепочку. Большинство блокчейнов представляют собой транзакционные машины состояний, которые принимают транзакции (вход) и генерируют новое состояние (выход), как показано на рисунке 3.1.
Блокчейн или, точнее, технология распределенных реестров была создана для хранения и передачи новой формы валюты под названием криптовалюта, первая из которых называлась Bitcoin. Эта технология была изобретена человеком (или группой людей) под псевдонимом Сатоши Накамото. Благодаря оглушительному успеху биткойна, сегодня он стал синонимом блокчейна. Но технология блокчейн не ограничивается использованием в качестве базовой технологии для криптовалюты, скорее это лишь одна из составляющих гораздо более крупной экосистемы, состоящей из множества различных сценариев использования. Совсем недавно блокчейн стал использоваться в различных приложениях, таких как цепочки поставок, программы лояльности, обмен данными и недвижимость.
Блокчейн децентрализован по своей сути, и наличие одинаковой информации на всех узлов приводит к тому, что он является ресурсом, принадлежащим всем, без единой точки отказа.
При использовании блокчейна нам необходимо использовать сложные криптографические алгоритмы для подтверждения транзакций.
Это может сделать каждый, кто запускает программное обеспечение
блокчейна, и после успешной проверки этих транзакций, которая называется
консенсусом, новый блок может быть добавлен в цепочку. Этот процесс называется
майнингом. Успешному майнеру выплачивается вознаграждение в виде BTC для
биткоина и ether для Ethereum. Таблица 3.1 объясняет несколько различий между
Bitcoin и Ethereum, двумя наиболее наиболее популярных реализаций блокчейна.
3.1.1 Концепции блокчейна
Цепочка блоков
Блоки генерируются и заполняются транзакциями. Когда блок заполнен, он транслируется по сети и выполняется майнинг. После завершения майнинга этот блок соединяется с предыдущим блоком в цепочку, создавая реестр. Этот процесс может повторяться бесконечное число раз, создавая бесконечную цепочку блоков. Процесс создания цепочки блоков показан на рисунке 3.2.
Каждый блок хранит хэш-значение предыдущего блока, и если кто-то изменит содержимое исторического блока, его хэш-значение изменится и не будет соответствовать хэшам, хранящимся в любых последующих блоках. Когда эта цепочка реплицируется среди нескольких различных пользователей, копия блокчейна человека, изменившего содержимое, не будет совпадать с содержимым других пользователей, создавая таким образом постоянную, неизменяемую децентрализованную цепочку блоков.
Одноранговое обнаружение (P2P)
Одноранговое обнаружение является краеугольным камнем любого блокчейна. Именно так различные пиры находят друг друга и синхронизируют с ними свое состояние блокчейна. Технология P2P не нова и ранее использовалась в таких приложениях, как BitTorrent, Napster и др.
Распределенные или децентрализованные системы
Распределенные системы все еще централизованы и требуют наличия сервера для подключения к каждому клиенту и обмена данными с ним. Блокчейн и другие связанные с ним системы разработаны таким образом, чтобы быть независимыми от сервера, и вместо этого зависят от механизмов P2P синхронизации и группового консенсуса для связи друг с другом и принятия решений.
Майнинг криптовалюты
Говоря простым языком, майнинг — это процесс выполнения математических (или, точнее, криптографических) вычислений, требующих больших вычислительных затрат. Эти вычисления настолько сложны, что для их выполнения требуется огромное количество вычислительной мощности и энергии. Компьютеры, успешно выполнившие эту операцию, получают вознаграждение в новой валюте, которой ранее не существовало. Это прямая аналогия с добычей золота из земли. Выполняя этот процесс, майнеры подтверждают подлинность платежа и добавляют эти подтвержденные транзакции в сеть. Майнинг — это то, что делает платежную сеть безопасной и надежной без доверенной и централизованной третьей стороны для подтверждения транзакции, как это происходит в традиционных методах. Криптографические вычисления, выполняемые этими майнерами, называются Proof of Work (PoW). Майнинг - трудная задача, но верификация относительно проста и выполняется всеми узлами системы в процессе. Доказательство работы, которое необходимо для подтверждения транзакции, называется консенсусом.
Новый блок создается примерно за 10 минут в Bitcoin, в то время как в Ethereum новый блок создается каждые 10-12 секунд. Каждый блок создает 12,5 новых BTC в Bitcoin, в то время как новый блок в Ethereum генерирует 3 эфира.
Распределенные приложения
Термин Distributed Apps (dapps) используется для обозначения любого приложения (веб- или автономного), которое может взаимодействовать и обмениваться данными с блокчейном. Dapps отличаются от обычных веб-приложений или мобильных приложений тем, что их внутренняя логика написана и выполняется полностью в блокчейне.
3.1.2 Частные и публичные блокчейны
Биткойн и Ethereum в первую очередь предназначались для использования в качестве публичных блокчейнов. Это означает, что данные, хранящиеся в цепочке, доступны для чтения и записи всем желающим. Однако эти сети могут быть настроены для работы в качестве частных блокчейнов, обработки платежей и выполнения кода смарт-контрактов. По сути, это означает, что над обычным блокчейном создается слой управления доступом для осуществления контроля над тем, кому разрешено читать или записывать данные в блокчейн. Такие частные блокчейны можно также назвать блокчейнами с правами доступа.
3.2 Блокчейн Ethereum
Ethereum является популярной реализацией блокчейна и предоставляет платформу для запуска смарт-контрактов. Эти смарт-контракты могут использоваться для облегчения денежных операций, а также для хранения важных данных в распределенном реестре. В Ethereum есть два типа валют - газ и эфир. Газ — это эфир, который должен быть оплачен узлами, выполняющими смарт-контракты. Эфир — это криптовалюта в Ethereum, которая может использоваться для перевода денег и оплаты газа для выполнения смарт-контрактов.
Ethereum вводит ряд концепций, позволяющих отправлять и получать эфир, выполнять транзакции смарт-контрактов и считывать данные в блокчейн и из него в целом.
3.2.1 Производительность и масштабирование
Как объяснялось в разделе 3.1.1, новый блок в Ethereum генерируется каждые 10-12 секунд. Из-за намеренного ограничения вычислений на блок, количество транзакций в секунду ограничивается в среднем 15 в секунду. Другие методы, такие как шейдинг и офф-чейн хранение данных, рассматриваются как способы улучшения этого коэффициента масштабирования.
Расходы на транзакции в gas несет клиент Ethereum, отправляющий транзакцию, и рассчитываются они следующим образом.
TxCost = gasLimit ∗ gasPrice (3.1)
Средний лимит газа на блок (на момент написания статьи) составляет около 8 000 000. Это значение определяется майнерами и меняется каждый блок. При среднем времени блока в 12 секунд и цене газа за транзакцию в среднем от 20 000 до 60 000, мы можем ожидать от 10 до 20 транзакций в секунду.
3.2.2 Кошелек Ethereum
Адрес Ethereum использует ECC (Elliptic Curve Cryptography) для генерации открытых и закрытых ключей и ECDSA (Elliptic Curve Digital Signatures) для проверки и подписания транзакций. На рисунке 3.4 показана эллиптическая кривая secp256k1, используемая в Ethereum (а также в Bitcoin и других крупных блокчейнах). Выбираются две точки, и на их основе генерируется пара открытый-закрытый ключ.
Закрытый ключ используется для подписания транзакций, а хэш Keccak-256 (разновидность SHA-3) открытого ключа берется и самые правые 20 байт регистрируются как адрес Ethereum.
Адреса в Ethereum бывают двух типов.
1. Аккаунты, принадлежащие пользователям
2. Контрактные аккаунты (аккаунты смарт-контрактов)
Счета, принадлежащие пользователям, используются
узлами для отправки и получения эфира. Это наиболее часто используемые счета,
которые имеют соответствующий закрытый ключ.
Счета контрактов хранят код контракта, а их адрес используется для выполнения смарт-контрактов. Они не имеют связанного закрытого ключа, и их адрес может быть вызван клиентами для выполнения хранящегося в нем кода.
3.2.3 Криптовалюта в Ethereum
Ethereum выплачивает успешным майнерам криптовалюту под названием эфир. Эфир может быть разделен на более мелкие единицы, вплоть до абсолютно наименьшей единицы, называемой вэй. Название Wei — это дань уважения одному из самых ранних провидцев криптовалюты, Вэй Даю, автору раннего протокола на основе блокчейна и криптовалюты под названием b-money.
Как и любая другая валюта, ethereum не застрахован от волатильности и колеблется в широких пределах. Чтобы предотвратить волатильность сумма (называемой gas), которую необходимо заплатить за выполнение транзакций в сети Ethereum, не зависит от фактических курсов обмена Ether.
Газ можно определить как специальную единицу, используемую в Ethereum для расчета затрат, понесенных при выполнении транзакции. Лимит газа должен быть указан в транзакции и должен быть разумным. Если лимит слишком мал, маловероятно, что кто-то из майнеров будет обрабатывать эту транзакцию. Когда транзакция выполнена, майнер, обработавший транзакцию, получает вознаграждение в эфире, соответствующее потраченному газу. Оставшийся газ возвращается на счет, запросивший транзакцию.
3.2.4 Алгоритм майнинга
Ethereum использует алгоритм Eth-Hash для нахождения криптографического хэша блока (процесс майнинга). Перед началом майнинга создается большой направленый ациклический граф (DAG). Процесс майнинга пытается решить определенное условие в нем. Этот процесс является Proof of Work (PoW) в ethereum и предназначен для проверки другими узлами очень быстро за линейное время на центральном процессоре с использованием меньшего количества ресурсов.
Угадывание осуществляется майнерами для создания блока и добавления его в цепочку. Угадать невероятно сложно, поэтому значение сложности устанавливается и изменяется после каждого блока. Если блок добывается раньше среднего времени добычи (10 - 12 секунд), сложность увеличивается и уменьшается, когда время добычи превышает среднее время добычи.
3.2.5 Блок Genesis
Блок Genesis — это первый блок всей цепочки, в Ethereum он называется блок 0. Он должен быть создан вручную для частных сетей и содержит хэш из нулей. Этот блок представлен в виде файла JSON и загружается первым при запуске нового узла и добавлении его в существующую сеть Ethereum.
3.2.6 Сетевые режимы в Ethereum
Публичная сеть Ethereum
Существует два вида публичных сетей, поддерживаемых Ethereum Foundation. Первая - основная сеть с сетевым идентификатором 1. Существуют и другие тестовые сети, которые могут использоваться разработчиками для тестирования функций своих распределенных приложений, созданных с использованием ethereum.
В таблице 3.4 приведено краткое объяснение различных основных и тестовых сетей.
Частная сеть Ethereum
Частные сети могут быть созданы как в закрытом, так и в открытом режиме. Все узлы в этой сети должны быть запущены с идентификатором, отличным от тех, которые используются в публичных сетях. Еще одно требование - все узлы в частной сети должны быть инициализированы одним и тем же блоком генезиса. Для данного случая было выбрано случайное число 63723. Если мы хотим, чтобы к частной сети не имел доступа никто, имеющий идентификатор сети и блок genesis, мы можем отключить режим обнаружения других пиров и вместо этого добавлять их вручную.
3.2.7 Geth
Geth — это клиент для Ethereum, реализованный на языке Golang и используемый для подключения к сети Ethereum. Также доступны другие реализации на C++ и Python. После установки он может быть инициирован блоком genesis (первый блок в блокчейне), запущен и подключен к различным сетям, доступным в Ethereum. Эти сети идентифицируются по их сетевому идентификатору. Различные узлы с одинаковым блоком генезиса и сетевым ID могут синхронизироваться друг с другом и майнить транзакции. Идентификатор сети: 1 - для основной сети, 2 и 3 - для тестовых сетей. Мы можем использовать другой сетевой ID для создания частной сети. Доступны различные версии для Windows, Linux, MacOS и Android.
3.2.8 Режимы синхронизации Geth
Geth может работать в 3 различных режимах: Полный, Быстрый или Легкий, каждый из которых имеет свои особенности использования и назначения.
Полный (Full)
Это режим работы geth по умолчанию при запуске без каких-либо опций запуска. Он запрашивает все состояние базы данных, получает заголовки, тело и проверяет каждый элемент, начиная с блока genesis.
Быстрый (Fast)
Этот режим получает заголовки блоков, тело и не обрабатывает ни одной транзакции, пока не достигнет текущего блока. После этого он работает точно так же, как режим полной синхронизации.
Легкий (Light)
Этот режим получает только текущее состояние из блокчейна. Чтобы проверить элементы, ему необходимо запросить полные узлы предыдущих состояний. Это идеальный вариант для Edge устройств, таких как raspberry pi, где мы не хотим хранить большие объемы данных. Однако это требует от полного узла выделения части своих ресурсов для обслуживания и поддержки запросов от легкого узла.
3.2.9 Виртуальная машина Ethereum
Виртуальная машина Ethereum (EVM) — это виртуальная среда, которая работает на всех узлах geth и выполняет код, хранящийся в смарт-контрактах. Для написания контрактов доступны различные языки программирования, такие как Solidity, Vyper и т.д., которые могут быть скомпилированы в байт-код EVM.
3.2.10 Методы сопряжения
В зависимости от того, хотим ли мы получить доступ к нашему узлу с одной машины или с разных машин в сети, используется межпроцессное взаимодействие (IPC, Inter-Process Communication) или удаленные вызовы процедур (RPC, Remote Procedure Calls).
Межпроцессная связь (IPC)
Межпроцессная связь — это предпочтительный метод подключения к узлу ethereum из процессов, запущенных в той же системе. Если узел запущен без каких-либо опций, единственным доступным методом подключения к этому узлу является IPC. Geth создает файл geth.ipc в своем домашнем каталоге, на который необходимо ссылаться, когда мы хотим подключиться к системе. В целях безопасности IPC ограничен локальным хостом и не может быть запущен с другой машины.
Удаленные вызовы процедур (RPC)
Удаленные вызовы процедур следует использовать, если узел ethereum запущен на другой машине. Geth предоставляет HTTP- и WebSocket-прокси для подключения к ethereum. Кроме того, формат, используемый для взаимодействия с ethereum, называется JSON-RPC. Это интерфейс, с помощью которого внешнее приложение, написанное на любом языке программирования, может взаимодействовать с бизнес-логикой и данными, хранящимися в блокчейне.
3.3 Умный контракт
Смарт-контракт - это код типа "класс", который живет в блокчейне Ethereum (EVM). Методы, объявленные в смарт-контракте, могут быть запущены как транзакция любым узлом, у которого достаточно эфира, чтобы заплатить за выполнение этой транзакции. Внешний мир может получить доступ к этому контракту через распределенные приложения (также называемые dapps). Компилятор Solidity (solc) используется для компиляции этих смарт-контрактов в байткод EVM (содержащий машинный код как инструкции, скомпилированные из Solidity) и ABI Definition (Application Blockchain Interface), содержащий мета-данные, такие как переменные и методы, используемые в смарт-контракте.
Типичный смарт-контракт состоит из переменных, методов setter и getter с модификаторами доступа для регулирования доступа в точности как в объектно-ориентированных языках, таких как C++ и Java. Методы setter предполагают изменение состояния данных, содержащихся в блокчейне, и, следовательно, влекут за собой плату за транзакцию, которая должна быть оплачена газом. Методы Getter только извлекают данные, хранящиеся внутри полного узла или от однорангового узла, и не взимают никакой платы.
3.3.1 Solidity
Solidity — это полный по Тьюрингу язык программирования, ориентированный на контракты, доступный для Ethereum для написания смарт-контрактов. Это язык высокого уровня, поддерживающий все функции современного языка программирования, такие как статическая типизация, наследование и сложные типы данных, определяемые пользователем. Это позволяет нам создавать смарт-контракты, способные создавать распределенные приложения, такие как ведение записей о собственности на землю, приложения для голосования, аукционов и ставок и другие.
3.3.2 Remix или HardHat
Смарт-контракты можно писать и тестировать с помощью браузерной IDE под названием Remix. Кроме того, плагины и фреймворки для создания и тестирования смарт-контрактов доступны во многих популярных IDE и текстовых редакторах.
3.3.3 Концепции умных контрактов
Типичный смарт-контракт выглядит как определение класса, написанное на таких языках, как C++ или Java. В дополнение к общепринятым объектно-ориентированным принципам, таким как конструкторы, методы, переменные, модификаторы видимости, наследование, массивы и циклы, solidity предоставляет несколько дополнительных возможностей для повышения удобства использования смарт-контрактов для решения различных задач.
Компилятор solc
Смарт-контракты должны быть скомпилированы в байт-код EVM и определение ABI, прежде чем виртуальная машина на узле ethereum сможет получить доступ и выполнить транзакции и методы, упомянутые в блокчейне. Инструменты Ethereum, такие как Remix и Truffle, поставляются в комплекте с этим компилятором. Версия, используемая для компиляции смарт-контракта, указывается в самом верху кода solidity.
pragma solidity ˆ0.4.24;
0.4.24 — это версия компилятора solidity, которая будет использоваться, а символ перед номером версии означает, что исходный файл не будет действителен выше 0.4.24.
Переменные
Переменные в Solidity являются статически типизированными и должны быть объявлены только один раз. Компилятор выдает ошибку, если переменная объявлена более одного раза в исходном файле. Таблица 3.6 объясняет некоторые из часто используемых типов данных, доступных в Solidity.
Массивы
Массивы могут быть как динамическими, так и статическими. Использование массивов, как статических, так и динамических, в solidity не рекомендуется, поскольку они могут вырасти до больших размеров и потребовать большого количества газа для выполнения простых операций, таких как поиск данных. В приведенном ниже примере показан статический массив размером 7.
В Solidity вместо массивов рекомендуется использовать маппинг. Маппинг определяется как пара ключ-значение с любым типом данных для ключа и значения. Их можно представить как хэш-таблицы, которые инициализируются при объявлении, содержат все возможные значения и изначально отображаются в байтовое представление всех нулей. Ключ не хранится в отображении, хранится только его хэш keccak-256, который используется для поиска соответствующего значения. Приведенный ниже пример показывает, как можно объявлять и использовать отображения
Структуры
Структуры похожи на структуры языка C и используются для хранения значений различных типов данных. Структуры могут использоваться в пределах типа данных отображения и широко применяются в solidity.
Пример структуры показан ниже:
Конструктор
Конструкторы в solidity предоставляют ту же функциональность, что и конструкторы в любом другом объектно-ориентированном языке программирования. Приведенный ниже пример взят из смарт-контракта, используемого в данной статье.
Методы
Методы - это функции, определенные в смарт-контракте, которые можно использовать для изменения или получения состояния блокчейна. Однако методы, которые служат сеттерами, то есть изменяют состояние блокчейна, не могут возвращать результат. Вызов таких методов с помощью web3 возвращает только хэши транзакций, а за использованные услуги необходимо заплатить эфиром. Методы, которые не модифицируют блокчейн, а просто возвращают состояние значения, хранящегося в их локальной копии блокчейна, не несут никаких затрат на газ. Пример метода для установки значения показан ниже.
События
События — это специальные методы, которые могут вызываться при выполнении определенного условия в смарт-контракте. Например, для обозначения завершения успешной транзакции или для оповещения о возникновении ошибки. Эти события могут прослушиваться другим смарт-контрактом или из других источников через web3. Пример события приведен ниже.
Модификаторы
Модификаторы используются, когда мы хотим запретить определенному типу пользователей доступ к блокчейну. Базовая форма контроля доступа может быть установлена в смарт-контракте с помощью модификаторов. Эти модификаторы могут быть применены к методам, которые запускаются только при выполнении условий, указанных в модификаторе. Пример модификатора приведен ниже.
3.3.4 Web3
Web3 — это фреймворк, разработанный Ethereum Foundation и позволяющий разработчику создать клиент (веб-приложение или мобильное приложение), который может напрямую взаимодействовать с блокчейном Ethereum. Функциональность, предоставляемая web3, включает в себя получение адреса кошелька текущего узла, отправку эфира на другой узел и т. д. Его также можно использовать для подключения к смарт-контракту, развернутому в блокчейне, и выполнения определенных в нем методов. Эти функции могут быть любыми - от передачи права собственности на землю от одного человека другому, перевода эфира или голосования за кандидата на выборах. Web3 доступен на javascript, python и других языках. Web3.js, безусловно, является самым популярным фреймворком, который позволяет пользователю подключить веб-страницу к некоторой функциональности внутреннего смарт-контракта. Большинство IoT-устройств имеют отличную поддержку языков C и Python. web3.py был использован вместо web3.js в качестве интерфейса между IoT-устройствами и блокчейном Ethereum для данной статье.
3.3.5 Truffle
Truffle - это фреймворк, который позволяет быстро разрабатывать и внедрять смарт-контракты в Ethereum. Дополнительные функции, такие как получение адреса смарт-контракта и определение ABI, также могут быть выполнены с помощью truffle.
В таблице 3.7 описаны несколько команд, которые
позволяют truffle
компилировать и развертывать смарт-контракты.
В таблице 3.8 приведены команды, которые можно выполнить в консоли truffle.
3.3.6 Ganache
Ganache - это фреймворк, который может быть полезен для тестирования смарт-контрактов во время разработки. Он предоставляет загрузочный приватный блокчейн с тестовыми счетами, предварительно загруженными эфиром.
3.4 Альтернативные децентрализованные решения для хранения данных
Ethereum позволяет хранить данные через переменные смарт-контракта. Такое хранение данных требует значительных затрат, и по мере увеличения объема хранимых данных возрастает стоимость загрузки транзакций в блокчейн.
Еще одним существенным недостатком использования Ethereum в качестве единственного механизма хранения данных является то, что хранимым данным придется бороться с жесткими ограничениями, наложенными на переменные в Solidity. Это сделано специально, и хранение огромных объемов данных на блокчейне не приветствуется Ethereum, чтобы предотвратить злоупотребления, которые могут вызвать отказ в обслуживании и другие сетевые атаки. Все данные должны быть реплицированы на всех узлах, а такой экстремальный уровень избыточности не требуется для нашего случая использования.
Чтобы преодолеть эти ограничения, данные можно хранить в альтернативных децентрализованных хранилищах, таких как Ethereum Swarm или Inter Planetary File System. Мы сравним производительность обоих этих решений в данной статье. Другие схемы хранения данных, такие как Siacoin, Storj и т.д., находятся на разных стадиях разработки.
И Swarm, и IPFS предлагают отличные решения для создания децентрализованного уровня хранения данных в Интернете с использованием платформы хостинга без сервера. Они предлагают уровень стимулирования для участвующих узлов, чтобы гарантировать, что хранящиеся на них данные не будут удалены, а также предлагают блочную модель хранения, где большие документы обслуживаются блоками и могут быть получены параллельно. Они обеспечивают защиту целостности путем адресации содержимого (filehash) и предлагают децентрализованное разрешение доменных имен.
3.4.1 Ethereum Swarm
Ethereum Swarm — это решение для хранения данных, целью которого является использование протокола bit-torrent типа Peer to Peer (P2P) для децентрализованного хранения данных, распределенных на большом количестве узлов. Он является частью инструментальной цепочки geth и использует множество технологий, изобретенных фондом Ethereum. Текущая реализация находится на версии 0.3.x или Proof of Concept 3.
Он предоставляет HTTP-прокси для доступа к данным, хранящимся на разных узлах. Файл, хранящийся в Swarm, возвращает хэш файла, уникально идентифицирующий этот ресурс.
Его основная цель - позволить dapps эффективно хранить данные для таких приложений, как обмен сообщениями, потоковая передача данных и обновление изменяемых ресурсов. Поскольку он одобрен непосредственно Ethereum Foundation, Swarm является довольно хорошим выбором для данной дипломной работы.
3.4.2 Межпланетная файловая система
Межпланетная файловая система (IPFS) — это решение для хранения данных, очень похожее на Ethereum Swarm и решающее множество аналогичных проблем, с которыми сталкивается Swarm. Однако она существует гораздо дольше, чем Ethereum, и гораздо проще в настройке и использовании.
Как и Swarm, он возвращает хэш файла для данных, хранящихся в сети IPFS. В отличие от Ethereum Swarm, он предоставляет новый протокол для доступа к содержимому, хранящемуся на его узлах. Он также предоставляет пользовательский интерфейс для графического доступа к файлам, хранящимся на узле.
3.4.3 Сравнение между решениями для хранения данных
В таблице 3.9 показано простое сравнение различных решений для хранения данных, включая обычные базы данных.
В таблице 3.10 показаны технические различия между IPFS и Swarm.
Продолжение:
Безопасное хранение данных IoT в частном блокчейне Ethereum. Часть 2