При создании приложения IONIC я пытаюсь получить исторический баланс одного адреса Ethereum. В настоящее время я не уверен, как далеко мне нужно будет вернуться. Я знаю, что Etherscan.IO предлагает веб-инструмент для получения баланса с определенной даты по адресу https://etherscan.io/balancecheck-tool , однако я не могу найти никаких API, которые позволяют мне делать это программно. Я также не могу установить web3 в моем текущем проекте. Любые советы будут оценены.
Если вы посмотрите на инструмент проверки баланса, вы увидите два варианта.
Если вы знаете номер блока, вы можете использовать следующую функцию, чтобы получить исторический баланс
web3.eth.getBalance(address, blockNumber).then(balance => `Balance at block number is ${balance}
Если вы не знаете номер блока, но хотите получить его по дате/времени. Сначала вам нужно найти блок, который добывается за это время.
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}`);
Вы можете использовать defaultBlock
параметр, чтобы получить исторический баланс. Например, используя web3.js v1.0:
web3.eth.getBalance(account, 10000).then(balance => {console.log(`balance for ${account} at block 10000 is ${balance}`)});
Что касается того факта, что вы не можете установить web3 в свой проект, вам следует создать еще один вопрос, предоставив более подробную информацию о том, что вы пробовали, и об ошибках, с которыми вы столкнулись.
Вам придется повторить цепочку, чтобы сделать это, так как у вас есть только метка времени, а Etherscan API имеет эту услугу только для пользователей PRO.
Недавно мне пришлось это сделать, и мне пришлось пройти всю цепочку, чтобы оптимизировать ее, я реализовал алгоритм бинарного поиска, который значительно уменьшил временную сложность.
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;
}
Затем вы можете использовать номер блока ближайшего блока, который в данном случае является вашей средней точкой, таким образом
let oldBlock = await provider.getBlock(blockAtTimestamp);
let balanceAtTimestampBigNumber = await provider.getBalance(address, blockAtTimestamp);
balanceAtTimestamp = balanceAtTimestampBigNumber.toString() / 10 ** 18;
Я использовал здесь https://www.docs.ethers.io , воспользовавшись API EtherscanProvider.
Etherscan предоставляет API для того, что вы просите, но это не бесплатно https://docs.etherscan.io/api-endpoints/accounts#get-historical-ether-balance-for-a-single-address-by-blockno другие ребята сказали, что я рекомендую вам использовать web3 или etherjs, чтобы получить баланс в конкретном блоке бесплатно.
Эта статья дает хорошее представление о том, как получить исторические балансы аккаунта в Ethereum https://www.shawntabrizi.com/ethereum/graphing-eth-balance-history-of-an-ethereum-address-using-parallel-asynchronous . -запросы-в-web3-js/
Я также рекомендую искать альтернативы, такие как ковалентные https://www.covalenthq.com/docs/api/#/0/Get%20token%20balances%20for%20address/USD/1.
Шон Табризи