Ether-Scan-API, Kontostand am Datum berechnen

Ich brauche einen berechneten Kontostand am Datum, um abzurechnen, aber der Web3-Kontostand und die etherscan.com-API sind falsch. Wie korrekt ist es, das Gleichgewicht aus den verfügbaren Daten von api zu berechnen.

const web3 = new Web3("https://ropsten.infura.io/erKFM1jCovzvFHE1wBah");

BigNumber.config({ ERRORS: false });

const url = "http://ropsten.etherscan.io/api?";
const key = "apikey=HJ583R13XWNWUZVYB1H8J7XVGRDKEPJK9U";
const address = "0x5360486ef76c4c857675c8212f885f7757510d9f";

axios.get(`${url}module=account&action=txlist&address=${address}&startblock=0&endblock=99999999&sort=asc&${key}`)
.then(res => {
  const result = res.data.result;

  const input = [];
  const output = [];
  let balance = new BigNumber(0);

  result.forEach(item => {
    const value = new BigNumber(item.value);
    const gasUsed = +item.gasUsed;
    const gasPrice = +item.gasPrice;
    const cumGasUsed = +item.cumulativeGasUsed;


    if(item.isError === "0" && item.txreceipt_status !== "0") {
      if(item.to === address) {
        input.push({
          value: value,
          gasUsed: 0,
          time: moment.unix(item.timeStamp).format("DD-MM-YYYY").toString(),
        });

        balance = balance.plus(value);
      }
      if(item.from === address) {
        output.push({
          value: value,
          gasUsed: gasUsed,
          time: moment.unix(item.timeStamp).format("DD-MM-YYYY").toString(),
        });

        balance = balance.minus(value);
        balance = balance.minus(gasUsed * gasPrice)
      }
      if(item.from === item.to) {
        console.log("self", item.value);
      }
    }
  });
  console.log("api balance", web3.utils.fromWei(balance.toString(), "ether"));
  web3.eth.getBalance(address)
  .then(balance => console.log("web3 balance", web3.utils.fromWei(balance, "ether")));
})
.catch(console.log);

Antworten (2)

Ein paar Dinge zu beachten

  • txlist Aus der Dokumentation listet nur Transaktionen von „normalen“ Konten auf, dh es listet keine „internen Transaktionen“ auf, es listet auch keine abgebauten Blöcke auf.

  • txlist gibt nur die letzten 10000 Transaktionen zurück.

Es gibt verschiedene Arten von Transaktionen, die sich auf den Kontostand auswirken können, der von der Funktion web3js.eth.getBalance() zurückgegeben wird. Überprüfen Sie verschiedene RPCs in der API-Liste von Etherscan https://etherscan.io/apis#accounts

Interne Transaktionen (Gas, das zur Interaktion mit Verträgen verwendet wird) und die Adresse, nach der Sie suchen, wurden möglicherweise auch für das Mining verwendet, daher sollte es Ether aus abgebauten Blöcken verdient haben (die nicht in der Liste der normalen Transaktionen enthalten sein werden, die von Etherscans erster API zurückgegeben werden. Versuchen Sie es der dafür vorgesehen ist)

wie Ismael bereits erwähnt hat, können Sie auch Paging in Betracht ziehen, da das Konto möglicherweise mehr als 10000 Transaktionen in seiner Historie aufweist.

Sobald Sie all dies in Ihre Berechnung einbezogen haben, sollten die Ergebnisse theoretisch mit web3js übereinstimmen :)

Lassen Sie uns wissen, ob Sie das Rätsel gelöst haben