>
Ноябрь 2017
Пн Вт Ср Чт Пт Сб Вс
« Окт    
 12345
6789101112
13141516171819
20212223242526
27282930  

Установка Ethereum на Raspberry Pi

На пересечении двух ультрамодных тем — криптовалют и интернета вещей, возможно, лежит золотая жила. Представь: умные предметы в будущем смогут общаться друг с другом при помощи неразрывных контрактов.
А посмотреть, как это будет работать, можно уже сегодня. В этой статье я расскажу тебе, как установить Ethereum на Raspberry Pi и запустить умный контракт, взаимодействующий с реальным миром.

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

Сейчас же мы находимся в самой начальной точке развития будущей экосистемы, но с появлением Ethereum у нас уже есть нецензурируемая децентрализованная и автономная среда, которая позволяет налаживать экономическое взаимодействие между девайсами. А раз есть, значит, можно экспериментировать!

Итак, тебе понадобятся:

  • Raspberry Pi 2 или 3 или BeagleBone Black. Мы тестировали это руководство с RPi 3, но все должно работать и на RPi 2 и BBB. Нюансы могут быть только с установкой пакетов — в этом случае тебя спасет Google и смекалка.
  • Карта на 64 Гбайт. Большой объем понадобится для хранения блокчейна Ethereum, который к тому же постоянно растет.
  • Все, что ты хочешь подключить к порту GPIO Raspberry Pi.

Мы напишем умный контракт и загрузим его в сеть с помощью браузера Mist. Далее поднимем ноду на Raspberry Pi, развернем на ней небольшое приложение, которое будет слушать события от определенного контракта в сети и управлять GPIO по наступлении этого события.

ПОДГОТОВКА К УСТАНОВКЕ ETHEREUM НА RASPBERRY PI

Для начала подготовим Raspberry Pi к работе.

Форматируем карту и скачиваем Ubuntu Mate для Raspberry Pi (можно выбрать и Raspbian).

  1. Записываем образ на флеш-карту. Для этого можно воспользоваться консолью или Pi Filler.
  2. Вставляем карту и устанавливаем систему. После установки ресайзим карту, перезагружаемся и можем подключаться к RPi через Wi-Fi по SSH.
  3. Устанавливаем клиент сети Ethereum. Сейчас самый популярный из них — это Geth, он написан на Go. Можно собрать его из исходников, но этот процесс имеет некоторые особенности, поэтому более быстрый путь — скачать и установить уже собранную версию.
  4. Приложение у нас будет на Node.js, поэтому скачиваем версию для ARMv7 и устанавливаем:

Убеждаемся, что все в порядке:

6. Теперь нам нужно поставить два пакета npm: web3 и onoff. Для этого, в свою очередь, понадобится Git, а также g++ 4.7 (для корректной установки onoff):

Ставим пакеты:

СИНХРОНИЗАЦИЯ

Для начала работы нужно синхронизировать блокчейн. Иногда это может занять несколько дней. «Легких» клиентов Ethereum пока что нет, и на твоем девайсе должна храниться вся информация о транзакциях с начала летописи. Сейчас архив занимает около 20 Гбайт.

Клиенты бывают разные. Parity, к примеру, очень многообещающий, но для наших целей мы возьмем проверенный Geth. Есть много способов синхронизировать блокчейн.

  1. Самый долгий способ — просто запустить ./geth в фоне и оставить работать. Периодически придется проверять, не прервалась ли синхронизация.
  2. Используя опцию ./geth –fast. В таком случае будут проверяться только заголовки блоков и процесс пойдет чуть быстрее, да и сам блокчейн будет занимать поменьше места.
  3. Если на основной машине уже стоит клиент той же версии, то можешь просто скопировать папку chaindata (на «Маке» это ~/Library/Ethereum/chaindata) при помощи rsync.
  4. Экспортировать данные с основного компьютера можно и при помощи Geth: geth export blockchain_backup. Копируем бэкап на Raspberry Pi и разворачиваем там: geth export blockchain_backup. Как ни странно, процесс тоже очень долгий.
  5. Последний вариант — это не совсем о синхронизации, но если хочешь побыстрее начать экспериментировать, подойдет и он. Тебе понадобится открытая для запросов нода — своя или сторонняя в паблике. К примеру, можно взять инстанс на Digital Ocean, развернуть клиент там и синхронизировать блокчейн, как описано выше. Потом запускаешь его с открытым портом и можешь коннектиться к нему из приложения. Можно обойтись и без Digital Ocean и сделать то же самое на своей машине. Если Raspberry Pi находится в той же подсети, то процесс аналогичен:

КОНТРАКТ

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

Он хранит в блокчейне две переменные: адрес создателя контракта и состояние, которое мы можем устанавливать и получать с помощью функций setState(uint _state) и getState().

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

У нас есть два ивента, которые мы хотим бродкастить в сеть, — stateChanged и eithersRecieved. Первый ивент сообщает всем о том, что кто-то изменил значение переменной state, сделав транзакцию с вызовом функции setState. Второй ивент сообщает, что кто-то послал эфир на адрес контракта.

В конструкторе EthThing(), который вызывается при загрузке контракта в сеть, мы запоминаем владельца — создателя контракта.

С помощью setState(uint _state) любой желающий может установить значение переменной state, что станет известно всем, кто следит за контрактом. Функция getState() возвращает текущее значение переменной state, а constant позволяет вызывать эту функцию локально (значение не вычисляется, и не нужно платить за газ).

Функция без имени — это транзакция без параметров с переводом ETH. Она используется в качестве колбэка и позволяет с помощью события отслеживать перевод средств на адрес контракта. А функция kill() позволяет создателю контракта уничтожить его и вернуть средства на свой адрес.

ФРОНТЕНД

Напишем небольшое приложение на Node.js, которое будет коннектиться к локальной или удаленной ноде и слушать указанные события. Начать лучше всего с интерфейса контракта. Чтобы создать его, можно воспользоваться онлайновым компилятором Solidity или установить браузер Mist на своей рабочей машине.

Мы будем ждать передачи средств и в случае поступления мигать светодиодом (или трещать реле — зависит от того, что у тебя есть) в течение восьми секунд с периодом, который будет передан в state.


Чтобы задеплоить контракт, открываем Contact -> Deploy New Contract. Вставляем код, жмем Execute, оплачиваем газ и немного ждем, пока операция завершится.

Теперь нам нужен адрес контракта и интерфейс. Ими мы проинициализируем переменные в коде приложения, которое крутится на Raspberry Pi.

Теперь в созданном контракте ты можешь изменять значение переменной state и пересылать на его адрес эфир, а «Малинка» будет за этим следить и реагировать так, как ты ее запрограммировал.

На этом все. Как видишь, перед тобой теперь огромное поле для экспериментов.

[Всего голосов: 9    Средний: 4.2/5]
Share Button

Last updated by at .

1 comment to Установка Ethereum на Raspberry Pi

  • Mergasov

    Если у меня множество контрактов, то как я могу отслеживать их состояние (исходя из “best practices”)? Отслеживать в бесконечном цикле тысячу адресов, думаю, не лучший способ

Leave a Reply

You can use these HTML tags

<a href="" title="" rel=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code class="" title="" data-url=""> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong> <pre class="" title="" data-url=""> <span class="" title="" data-url="">