Эфириум в Расте? Часть вторая
В этом руководстве показано, как законнектиться к 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
Дальше мне думать чото лень, так что ждите следующей статьи.