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.
Wenn Sie das Balance-Check-Tool beobachten, können Sie sehen, dass es zwei Möglichkeiten gibt
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}`);
Sie können den defaultBlock
Parameter 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;
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
Shawn Tabrizi