
О чем эта статья?
В этой статье я расскажу как с помощью микроконтроллера ESP8266 подключиться к приватной Ethereum сети и вызвать смарт-контракт.
Необходимые знания
Вы должны понимать устройство Ethereum сетей. Ознакомиться с технологией можно на их сайте https://ethereum.org/en/developers/docs/
Начнем!

Создадим приватную сеть Ethereum
Для начала создадим приватную Ethereum сеть. Для этого есть множество путей, воспользуемся самым простым методом:
1) Скачаем Ganache. Это можно сделать с их официального сайта Ganache - Truffle Suite
2) После установки запускаем приложение.

3) Переходим в NEW WORKSPACE

Переходим в отделение SERVER и отключаем AUTOMINE.

Далее нажимаем на Save Workspace. После сохранения мы увидим уже созданные аккаунты с балансом 100ETH в каждом! НЕ спешим радоваться!) Эти токены не относятся к тем, которыми рассчитываются в сети MAINNET. Ими можно пользоваться только в нашей локальной сети(

Приватная сеть создана!
Подключим созданные аккаунты к MetaMask
1) Скачаем расширение MetaMask для браузера Download MetaMask | Blockchain wallet app and browser extension.
2) Создадим собственный кошелек, установим пароль.
3) Авторизуемся и зайдем а аккаунт, подключим сеть Ganache, как в этом видео Обязfтельно подключите сеть Ganache как в этой инструкции: https://youtu.be/nUEBAS5r4Og.
4) Нажмем на кружок сверху, а потом на "Импортировать счет"

5)Перейдем в Ganache и скопируем закрытый ключ аккаунта


6) копируем и снова переходим в MetsMask, вставляем наш ключ и импортируем аккаунт.

Создадим смарт контракт и выпустим его в сеть
Писать контракт и развертывать его будем в с помощью https://remix.ethereum.org/
1) Создадим файл с расширением ".sol".
Язык Solidity помогает нам создавать программы для управления EVM в сети Ethereum. Документацию можно найти на https://www.dappuniversity.com/articles/solidity-tutorial
2) Давайте создадим простой контракт который будет считать сколько раз к нему обращались.
pragma solidity ^0.8.13; contract MyContract{ uint256 public amoutOfCall = 0; //создаем переменную кол-ва вызовов function call() public{ amoutOfCall = amoutOfCall + 1; //добавляем при вызове } }
3)Скопируем данный код в Remix ide и скомпилируем.

4) Перейдем в DEPLOY & RUN TRANSACTIONS. В выпадающем меню ENVIRONMENT выберем Injected web3. В ячейке ACCOUNT должен подтянуться адрес аккаунта, который мы импортировали из Ganache.
5) Далее деплоем контракт и нажимаем подтвердить.

6) Наш контракт создан!!!!

7) Можно поиграться с ним, нажимая на конку call - мы будем вызывать контракт. Кнопка amountOfCall - будет выводить количество вызовов контракта.
Создадим локальный сервер на Python
Сервер нам нужен, чтобы с помощью Python и библиотеки WEB3 обращаться к блокчейн сети.
1) установим библиотеки Flask - #2 Установка Flask ~ Уроки по Flask ~ PythonRu , Web3 - Intro to Web3.py · Ethereum For Python Developers | Dapp University . Внимание - при установке могут вылетать ошибки, внимательно читайте, что пишет вам командная строка и выполняйте требования.
2)Создадим файл main.pу и скопируем код.
import json from web3 import Web3 from flask import Flask app = Flask(__name__) @app.route("/call") def hello(): infura_url = "http://127.0.0.1:7545" #ссылка на нашу приватную сеть web3 = Web3(Web3.HTTPProvider(infura_url)) web3.eth.defaultAccount = web3.eth.accounts[0] abi = json.loads('[{"inputs":[],"name":"call","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"amoutOfCall","outputs":[{"internalType":"uint256","name":"","type": "uint256"}],"stateMutability": "view","type": "function"}]') address = '0xdD5E2f4244d3E6848E1C3605B693fb0F9E8E1546' #указываем адрес контракта contract = web3.eth.contract(address=address, abi=abi) #создаем образ контракта return contract.functions.call().transact() #обращаемся к контракту if __name__ == "__main__": app.run(host = "0.0.0.0")
ВНИМАНИЕ!!! В переменную abi подставим свои значения!
В переменную abi - сохраняем abi нашего контракта, его можно скопировать в Remix

Также у вас будет другой крипто адрес контракта!!! поэтому замените значение переменной address, адрес также можно узнать в Remix.

3) Запускаем программу и переходим по ссылке адреса локального сервера/ + call

У меня ссылка выглядит - 192.168.3.3:5000/call
4) Теперь, если мы будем обращаться к этой ссылке, то сервер будет вызывать смарт контракт, в Remix мы сможем увидеть сколько раз контракт был вызван.
Финальный шаг - обращаемся к серверу с помощью платы
Я буду использовать плату Wemos ESP8266

1) Подключаем ее к питанию.
2) Устанавливаем Arduino IDE.
3) Подключаем нашу плату к среде разработки, как в инструкции Настройка для Wemos (esp8266) (alexgyver.ru) .
Перейдем к написанию кода
#include <ESP8266WiFi.h> #include <ESP8266HTTPClient.h> #define SERVER_IP "http://192.168.3.3/" #ifndef STASSID #define STASSID "ИМЯ ВАШЕЙ WIFI сети" #define STAPSK "ПАРОЛЬ ВАШЕЙ СЕТИ" #endif void setup() { Serial.begin(115200); Serial.println(); Serial.println(); Serial.println(); WiFi.begin(STASSID, STAPSK); while (WiFi.status() != WL_CONNECTED) { delay(500); Serial.print("."); } Serial.println(""); Serial.print("Connected! IP address: "); Serial.println(WiFi.localIP()); } void loop() { // wait for WiFi connection if ((WiFi.status() == WL_CONNECTED)) { WiFiClient client; HTTPClient http; Serial.print("[HTTP] begin...\n"); // configure traged server and url http.begin(client, "http://192.168.3.3:5000/call"); //HTTP http.addHeader("Content-Type", "application/json"); Serial.print("[HTTP] POST...\n"); // start connection and send HTTP header and body int httpCode = http.POST("{\"hello\":\"world\"}"); // httpCode will be negative on error if (httpCode > 0) { // HTTP header has been send and Server response header has been handled Serial.printf("[HTTP] POST... code: %d\n", httpCode); // file found at server if (httpCode == HTTP_CODE_OK) { const String& payload = http.getString(); Serial.println("received payload:\n<<"); Serial.println(payload); Serial.println(">>"); } } else { Serial.printf("[HTTP] POST... failed, error: %s\n", http.errorToString(httpCode).c_str()); } http.end(); } delay(10000); }
Внимательно посмотрите код, в некоторых местах нужно поставить свои значения: Имя, пароль сети, ссылка на сервер.
Смысл программы
Программа подключает Wemos esp256 к wifi сети сервера, далее мы используем http клиент, мы с помощью платы обращаемся по ссылке к серверу, а сервер обращается к блокчейн сети и вызывает контракт.
Совсем коротко:
1) Создали приватную сеть Ethereum.
2) Развернули контракт в нашей сети.
3) Создали сервер, обращающийся к блокчейну с помощи библиотеки web3.
4) Подключили WEMOS к серверу.
Для чего это и где применять
Я использую платы Wemos в роботах, для того, чтобы электронные устройства могли финансово взаимодействовать между собой, можно либо просто переводить валюты с кошелька одного устройства на другой, либо вызывать смарт контракт, который будет списывать валюту, при определенных условиях, что замечает робот. Я создаю умные счетчики электроэнергии, которые позволяют списывать GeraCoin, с кошелька устройства, при подключение робота к сети.
Если у вас возникли ошибки
Вот мои контакты, пишите, если появятся вопросы
Telegram - https://t.me/gerard_inc
VK - Герард Исмагилов (vk.com)
Mail - gerard.ismagilov@mail.ru
