Подскажите лучший по вашему мнению апи сервис для работы с эфириумом.
У меня такая задача:
Получить список всех транзакций определённого контракта, разделить эти транзакции на входящие и исходящие, из всего этого посчитать баланс, текущее кол-во входящих транзакций, и исходящих для каждого момента времени с момента первой транзакции до текущего времени.
Надеюсь понятно объяснил, так как в блокчейне плохо разбираюсь.
Или же подскажите как адаптировать текущий алгоритм, который не очень справляется с задачей.
Я делаю так:
Получаю список всех транзакций (а их может быть до 50000, и даже на этом этапе сервер может повиснуть, либо кинуть 502 ошибку bad gateway)
Далее я получаю список internal транзакций.
Теперь имея список всех транзакций, прогоняю их циклом и делаю необходимые вычисления. Внутри цикла делаю проверку, если транзакция исходит от текущего адреса, то мне приходится прогонять циклом все транзакции которые я получил во втором пункте.
Короче говоря, с таким количеством вычислений сервер тупо не справляется
Немного быдлокода:
$limit = 0;
for($p = 1; $p < 5; $p++) {
// ---------------------- получение списка in транзакций ------------------------
$TRin = file_get_contents("https://api.etherscan.io/api?module=account&action=txlist&address=".$adr."&startblock=".$row['lastblock']."&page=".$p."&endblock=99999999&sort=asc&apikey=".$token); //список транзакций
$TRin = json_decode($TRin);
if($TRin->status == "0") break;
// ---------------------- получение списка out транзакций ------------------------
$TRout = file_get_contents("https://api.etherscan.io/api?module=account&action=txlistinternal&address=".$adr."&startblock=".$row['lastblock']."&endblock=99999999&sort=asc&apikey=".$token); //список транзакций
//file_put_contents("test",$TRout);
$TRout = json_decode($TRout);
if($TRout->status == "0") break;
foreach($TRin->result as $t) {
if($t->value != "0") {
$totalout += round(($t->value/1000000000000000000),4);
$count_o++;
}
else {
foreach($TRout->result as $tro) {
if($tro->blockNumber == $t->blockNumber) {
//file_put_contents("test",$tro->value);
$totalin += round(($tro->value/1000000000000000000),4);
$count_i++;
}
}
}
$balance = $totalout-$totalin;
if($hour == date("H",$t->timeStamp) && $day == date("d",$t->timeStamp)) continue;
$hour = date("H",$t->timeStamp);
$day = date("d",$t->timeStamp);
//тут записываю данные куда нужно. если за date("H",$t->timeStamp) уже бли записаны данные - пропускаю итерацию цикла
}
}