Работа со смарт-контрактами 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 к серверу.

Если у вас возникли ошибки

Вот мои контакты, пишите, если появятся вопросы

Telegram — https://t.me/gerard_inc

VK — Герард Исмагилов (vk.com)

Mail — gerard.ismagilov@mail.ru


ссылка на оригинал статьи https://habr.com/ru/post/666798/


Комментарии

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *