декодировать входные данные эфириума

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

Я не могу получить какую-либо информацию из ввода транзакции. Я пробовал все предыдущие решения и рекомендуемые пакеты, но безрезультатно.

Когда я использую web3.utils.toAscii, я получаю тарабарщину. Когда я использую декодеры ethereum-tx-decodeTx, я получаю недопустимое значение массива. когда я использую любой из других инструментов web3, я получаю сообщение об ошибке.

Пожалуйста, найдите последнюю итерацию моего кода ниже после многих часов попыток найти все решения, которые я смог найти (выше приведены три самых последних сбоя)

const txDecoder = require("ethereum-tx-decoder");
const express = require("express");
require("dotenv").config();
const Web3 = require("web3");
const curl = `wss://mainnet.infura.io/ws/v3/${process.env.infuraProjId}`;
const web3 = new Web3(new Web3.providers.WebsocketProvider(curl));

let counter = 0;

const subscription = web3.eth.subscribe(
    "pendingTransactions",
    (error, transactionHash) => {
        if (!error) {
            web3.eth
                .getTransaction(transactionHash)
                .then((tx) => {
                    if (tx !== null) {
                        counter++;
                        // console.log(tx.hash);

                        const decodedInput = txDecoder.decodeTx(tx.input);
                        console.log(decodedInput);

                       
                    }
                })
                .catch((err) => console.error(err));
        } else {
            console.error(error);
        }
    }
);
// .on("data", (transactionHash) => {
//     web3.eth.getTransaction(transactionHash).then((transaction) => {
//         console.log("coming from data");
//         console.log(transaction.from, transaction.to);
//     });
// }); 

// ^^ this kept returning null

Пожалуйста и спасибо

Ответы (1)

вам не хватает жизненно важной части. Вы не сможете декодировать ввод или журналы, пока у вас не будет ABI контракта «получатель» для ввода TX и контракта FROM для журналов.

Чтобы получить ABI: либо используйте etherscan, используйте https://sourcify.dev/ , либо найдите его в IPFS/BZZ, прочитав байт-код и проанализировав адрес, если компилятору Solidity было разрешено загрузить его.

ПОСЛЕ того, как у вас есть ABI, вы передаете его в ethersjs/web3js/web3py, и эти библиотеки смогут анализировать ввод/вывод.

Редактировать: также имейте в виду: если контракт получателя является «прокси-контрактом», вам нужно будет выследить адрес контракта «конечного получателя» из внутренних транзакций.

Спасибо за ваш ответ. Поэтому, если я получаю ABI для контракта, для которого пытаюсь найти транзакции, и одна из ожидающих транзакций может соответствовать ABI или соответствовать ему (извините за плохую терминологию), тогда я должен получить нужные результаты, но только для транзакции, которые взаимодействуют с контрактами, для которых у меня уже есть ABI?
@streetrat вам нужен только ABI контракта «TO», тот, который получает транзакцию. Это ABI, который вы будете использовать для декодирования ввода TX. Итак, да: когда у вас есть ABI получения и у вас есть TX, который отправляется на этот контракт, вы декодируете свои входные данные.
@streetrat также отредактировал ответ о том, когда / если вы заключите прокси-контракт.
большое спасибо за ваши ответы! Я очень ценю помощь (: