August 13, 2022

Эфириум в Расте? Часть вторая

В этом руководстве показано, как законнектиться к WebSocket ноде Эфира, генерировать кошельки, подписывать сообщения, чтение мемпула.

Окружение

Про то как скачать и установить раст было в прошлой части, так что останавливаться и ждать балласт не будем.

Зависимости

Теперь мы создадим проект Rust и добавим необходимые зависимости.

Создайте папку нашего проекта и инициализируйте его с помощью cargo:

mkdir rust-ethereum-tutorial-part2
cd rust-ethereum-tutorial-part2
cargo init

Для удобства добавления зависимостей Rust в наш проект мы будем использовать cargo-edit:

cargo install cargo-edit

Добавим необходимые модули:

cargo add tokio eyre ethers +legacy

Подключение к WebSocket Ноде эфира.

В отличие от прошлого туториала, конструкция подключения будет немного иная:

use ethers::prelude::*;

#[tokio::main]
async fn main() -> eyre::Result<()> {
    // Подключаемся ноде, создаем новый экземпляр провайдера.
    let client = Provider::new(
        Ws::connect("wss://eth-mainnet.g.alchemy.com/v2/rhHsBRIaD9TsoHdKpnymrJimBxPwv5Xp").await?,
    );
    
    Ok(()) // Пустое возвращаемое значение
}

Создание кошелька

Теперь когда клиент создан, можно заняться хуйней, то есть сгенерировать новый кошелек:

    let wallet = LocalWallet::new(&mut rand::thread_rng()); // Генерация рандомного кошелька
    let address = wallet.address(); // Получение адреса кошелька

    println!("ебать привет {:?}", address);

Подпись сообщения

Так как мы не долбаебы, то лучше всего изучить какие-то доп. возможности объекта кошелька.

Одна из возможностей подпись сообщения:

    let signature = wallet.sign_message("Я пидор").await?; // Создание сигнатуры

    println!("{}", signature);

Сигнатура подписанного сообщения есть, но как теперь ее верефать?

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

Попробуем наебать систему и вписать какую-то хуйню:

    match signature.verify("Я не пидор", address) {
        Err(_) => println!("ХХИХХИХИ, ТЫ ЧО ПИДОР?))"),
        Ok(_) => println!("ЧОО ТЫ НЕ ПИДОР?"),
    };

Запустив наше детище в ебло прилетит сообщение ХХИХХИХИ, ТЫ ЧО ПИДОР?))

Так, а теперь попробуем ввести правильное значение, которое соответствует подписанному сообщению:

    match signature.verify("Я пидор", address) {
        Ok(_) => println!("ЧЧООО ПИДОР??"),
        Err(_) => println!("НЕЕЕЕЕЕЕ ПИДОР???"),
    };

Что же получится при запуске? - Выведется ЧЧООО ПИДОР??

Чтение мемпула

Чтобы полностью овладеть БЛОКЧЕЙНОМ ЭФИРОМ и стать настоящим Терном, нужно научиться читать мемпул.

Mempool — очень важная часть сети Bitcoin (сеть компьютеров и устройств, подключенных к Интернет и работающих с программным обеспечением Bitcoin Core). Данные, хранящиеся в мемпуле — это неподтвержденные транзакции, которые в настоящее время застряли в сети. Каждая часть мемпула хранится на специальном электронном устройстве и за его содержимым можно наблюдать в режиме реального времени. Чтобы объяснить, как это работает, сначала нужно разобраться, что происходит во время транзакции?

(я спиздил определение хз нахуя но мне похуй)

ТАААК, чтение мемпула дело простое, но требует некоторых действий.

Для начала нужно создать фильтр мемпула, то есть какого типа транзакций будут поступать при чтении.

В своем примере я решил хуй забить на фильтрацию и сделать его пустым, то есть любого вида транзакции будут поступать:

    let filter = Filter::new();

Теперь, чтобы начать читать мемпул, нам нужно передать этот своеобразный фильтр в метод subscribe_logs, который создает новый ручей подписок

    let mut stream = client.subscribe_logs(&filter).await?;

Ручей получили, а как в нем купаться? Для этого нам потребуется особенная конструкция:

    while let Some(log) = stream.next().await {}

Такая хуета позволяет постоянно получать данные из мемпула.

Чтобы понять, что находится внутри лога, достаточно ебануть под двум клавишам ctrl+space.

По аналогии я сделал что-то примерно такое:

    while let Some(log) = stream.next().await {
        println!(
            "транзакция {:?}, блок {:?}",
            log.transaction_hash, log.block_number
        );
    }

Код готов, пришло время запускать:

[meqy@meqy-hplaptop15seq2xxx eth_rust]$ cargo run
    Finished dev [unoptimized + debuginfo] target(s) in 0.38s
     Running `target/debug/eth_rust`
ебать привет 0xda85e6532cce4869c18025aac2b34386d5c5f8ce
18350d269ad85efee75ee83ed22c84c891dd6209c27868582c9e81a65cc6ad9965002af2fd1c0174ad44bfcacd314ff6af153f1cba02e6e368f25e2d9fc6172c1b
ХХИХХИХИ, ТЫ ЧО ПИДОР?))
ЧЧООО ПИДОР??
^C

Дальше мне думать чото лень, так что ждите следующей статьи.