dimas199862
@dimas199862
frontend и backend

Лучший апи сервис для эфириум?

Подскажите лучший по вашему мнению апи сервис для работы с эфириумом.
У меня такая задача:
Получить список всех транзакций определённого контракта, разделить эти транзакции на входящие и исходящие, из всего этого посчитать баланс, текущее кол-во входящих транзакций, и исходящих для каждого момента времени с момента первой транзакции до текущего времени.
Надеюсь понятно объяснил, так как в блокчейне плохо разбираюсь.
Или же подскажите как адаптировать текущий алгоритм, который не очень справляется с задачей.
Я делаю так:
Получаю список всех транзакций (а их может быть до 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) уже бли записаны данные - пропускаю итерацию цикла
				}
			}
  • Вопрос задан
  • 204 просмотра
Пригласить эксперта
Ответы на вопрос 1
dimonchik2013
@dimonchik2013
non progredi est regredi
лучшее API - Geth и поднятая нода эфира
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы