Holen Sie sich den Saldoverlauf der Adresse

Beim Erstellen einer IONIC-App versuche ich, das historische Gleichgewicht einer einzelnen Ethereum-Adresse abzurufen. Ich bin mir derzeit nicht sicher, wie weit ich zurückgehen muss. Ich weiß, dass Etherscan.IO unter https://etherscan.io/balancecheck-tool ein Webtool anbietet, um das Guthaben ab einem bestimmten Datum abzurufen , aber ich kann keine APIs finden, die mir dies programmgesteuert ermöglichen. Ich kann auch web3 nicht in meinem aktuellen Projekt installieren. Jeder Rat wäre willkommen.

Schauen Sie sich dieses von mir erstellte Beispiel an: ETH Balance Graph

Antworten (4)

Wenn Sie das Balance-Check-Tool beobachten, können Sie sehen, dass es zwei Möglichkeiten gibt

  1. Datum
  2. Blocknummer

Wenn Sie die Blocknummer kennen, können Sie die folgende Funktion verwenden, um den historischen Saldo zu erhalten

web3.eth.getBalance(address, blockNumber).then(balance => `Balance at block number is ${balance}

Wenn Sie die Blocknummer nicht kennen, sie aber nach Datum/Uhrzeit erhalten möchten. Sie müssen zuerst den Block finden, der während dieser Zeit abgebaut wird.

let blockNum = web3.eth.blockNumber;
const historicTimestamp = new Date(historicDate).getTime();
while(true) {
  const block = web3.eth.getBlock(blockNum);
  if(block.timestamp < historicTimestamp) break;
  --blockNum;
}

//The blockNumber here is your required block number
web3.eth.getBalance(address, blockNumber).then(balance => `Balance at block number is ${balance}`);
Ich schätze die Unterstützung diesbezüglich sehr. Wie ich jedoch bereits sagte, kann ich web3 nicht zur Verwendung in meinem Projekt abrufen. Kennen Sie einen anderen Weg als web3?
Können Sie genauer sagen, was mit web3 nicht funktioniert?
Es gab ein Problem mit dem Paket selbst. Ich konnte es zur Installation bringen. Vielen Dank!

Sie können den defaultBlockParameter verwenden, um das historische Gleichgewicht zu erhalten. Verwenden Sie beispielsweise web3.js v1.0:

web3.eth.getBalance(account, 10000).then(balance => {console.log(`balance for ${account} at block 10000 is ${balance}`)});

In Bezug auf die Tatsache, dass Sie web3 nicht in Ihrem Projekt installieren können, sollten Sie eine weitere Frage erstellen, in der Sie mehr Details zu dem, was Sie versucht haben, und den aufgetretenen Fehlern angeben.

Dazu müssen Sie die Kette iterieren, da Sie nur den Zeitstempel haben und die Etherscan-API diesen Dienst nur für PRO-Benutzer bietet

Ich musste dies kürzlich tun und ich musste die gesamte Kette durchlaufen, um sie zu optimieren, habe ich einen binären Suchalgorithmus implementiert, der die Zeitkomplexität erheblich reduziert hat

async function getHistoricBlockByTimestamp(historicTimestamp, provider) {

let lowerBound = 0;
let upperBound = await provider.getBlockNumber();

let midPoint = 0;

while (lowerBound <= upperBound) {
    midPoint = Math.floor(lowerBound + ((upperBound - lowerBound) / 2));
    // Get the block details using midPoint
    let blockDetails = await provider.getBlock(midPoint);

    // Compare timestamp from block with given timestamp
    if (blockDetails.timestamp === historicTimestamp) {
        continue;
    } else if (blockDetails.timestamp > historicTimestamp) {
        upperBound = midPoint - 1;
    } else {
        lowerBound = midPoint + 1;
    }
}

return midPoint;

}

Dann können Sie auf diese Weise die Blocknummer des nächstgelegenen Blocks verwenden, der in diesem Fall Ihr Mittelpunkt ist

let oldBlock = await provider.getBlock(blockAtTimestamp);

let balanceAtTimestampBigNumber = await provider.getBalance(address, blockAtTimestamp);
balanceAtTimestamp = balanceAtTimestampBigNumber.toString() / 10 ** 18;

Notiz

Ich habe hier https://www.docs.ethers.io verwendet und die Vorteile der EtherscanProvider-API genutzt

Etherscan bietet eine API für das, was Sie fragen, aber es ist nicht kostenlos https://docs.etherscan.io/api-endpoints/accounts#get-historical-ether-balance-for-a-single-address-by-blockno As the Andere Leute sagten, ich werde Ihnen empfehlen, web3 oder etherjs zu verwenden, um das Guthaben bei einem bestimmten Block kostenlos zu erhalten.

Dieser Artikel gibt eine gute Vorstellung davon, wie man historische Salden eines Kontos auf Ethereum erhält https://www.shawntabrizi.com/ethereum/graphing-eth-balance-history-of-an-ethereum-address-using-parallel-asynchronous -Anfragen-in-web3-js/

Ich empfehle auch, nach Alternativen wie Covalent https://www.covalenthq.com/docs/api/#/0/Get%20token%20balances%20for%20address/USD/1 zu suchen