Работа со смарт-контрактами Ethereum с помощью ESP8266
О чем эта статья?
В этой статье я расскажу как с помощью микроконтроллера 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