External-Api

通過 API 下載 Etherscan 輸入數據

  • February 20, 2022

我無法找到正確的 API 呼叫格式來從每個事務的事件日誌中下載輸入數據欄位 - 有沒有辦法使用 API 密鑰來下載此資訊?

我指的是下載這個輸入數據欄位的數據: 在此處輸入圖像描述

您可以使用Etherscan Event Log API,它為給定範圍的塊獲取最多 1000 個事件(如果給定範圍內的事件超過 1000 個,則僅獲取前 1000 個事件)。

對於每個事件,它返回以下對象:

{
   address         : ...,
   topics          : [ ... ],
   data            : ...,
   blockNumber     : ...,
   timeStamp       : ...,
   gasPrice        : ...,
   gasUsed         : ...,
   logIndex        : ...,
   transactionHash : ...,
   transactionIndex: ...
}

欄位的值inputData可以在topicsdata欄位中找到。

更準確地說,該topics欄位是一個數組,由事件簽名雜湊(第一項)和每個事件的索引參數值(第二項以後)組成,而該data欄位是一個字元串,由事件的未索引參數的串聯組成價值觀。

這是一個編碼範例:

const request = require("request");

const CONTRACT_ADDRESS  = "...";
const ETHERSCAN_API_KEY = "...";
const ETHERSCAN_API_URL = "http://api.etherscan.io/api?module=logs&action=getLogs&address=" + CONTRACT_ADDRESS + "&apikey=" + ETHERSCAN_API_KEY;

const MAX_TIMEOUT = 10000;
const MAX_RESULTS = 1000;

function scan(fromBlock, toBlock) {
   request(`${ETHERSCAN_API_URL}&fromBlock=${fromBlock}&toBlock=${toBlock}`, {timeout: MAX_TIMEOUT}, function(error, response, body) {
       const parsed = parse(body);
       if (parsed.result) {
           if (parsed.result.length < MAX_RESULTS) {
               for (const event of parsed.result)
                   console.log(event.topics.slice(1), event.data);
           }
           else {
               console.log("warning: too many events");
               for (const event of parsed.result)
                   console.log(event.topics.slice(1), event.data);
           }
       }
       else {
           console.log("error:", error);
       }
   });
}

function parse(str) {
   try {
       return JSON.parse(str);
   }
   catch (error) {
       return {};
   }
}

scan(0,9000000);

假設您正在嘗試從特定地址查找交易的輸入,那麼使用account API可能會更好地為您服務。

https://api.etherscan.com/api
?module=account
&action=txlist
&address=0x16e7352bb889c5fa3adf59d34c1b4e401e63c223
&startblock=0
&endblock=99999999
&sort=asc
&apikey="your API key"

引用自:https://ethereum.stackexchange.com/questions/80025