О чем эта статья?

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

Комментарии (5)


  1. modestguy
    20.05.2022 11:45

    Извиняюсь, за возможно глупый, вопрос, просто нет компетенций в blockchain/etherium/smart contracts. А какого практическое применение сей связки? Как бы посыл понятен и понятно что сделано. Но не очень понятно, как это может применяться?


    1. ger4ka Автор
      20.05.2022 13:38
      +2

      Спасибо за замечание, добавил краткое описание возможного применения)


      1. modestguy
        21.05.2022 08:43

        Спасибо! Лайкну пост и оперативный ответ.


  1. 13werwolf13
    20.05.2022 13:31

    ну с тем "как" разобрались, осталось понять "зачем" =)


  1. CmpeJ1ok
    22.05.2022 08:56
    +2

    Я думаю, что многие хотели бы увидеть вторую часть, с практической точки применения… надеюсь автор не остановится и запилит подобный туториал, хотя бы описав поверхностно работу с девайсами или более подробным описанием