Как узнать плату за газ, уплаченную за последние транзакции токена на RSK?

#sql #rsk

Вопрос:

Я хочу запросить Ковалентную базу данных, чтобы узнать количество газа, выплаченного в ходе последних 100 транзакций по переводу токенов rUSDT в блокчейне RSK.

В следующем SQL-запросе я пытаюсь объединить эти две таблицы, чтобы узнать плату за газ, уплаченную за каждую из последних 100 транзакций.

 SELECT  t.fees_paid FROM chain_rsk_mainnet.block_log_events e  INNER JOIN chain_rsk_mainnet.block_transactions t ON  e.block_id = t.block_id  AND e.tx_offset = t.tx_offset WHERE   e.topics @gt; array[E'\xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef'::bytea]  AND e.topics[1] = E'\xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef'  AND e.sender = E'\xEf213441a85DF4d7acBdAe0Cf78004E1e486BB96' ORDER BY e.block_id DESC, e.tx_offset DESC LIMIT 100;  

К сожалению, обработка этого запроса занимает слишком много времени.

Как я могу изменить этот запрос?

Больше контекста:

  • 0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef это идентификатор Transfer темы журнала событий ERC20.
  • 0xEf213441a85DF4d7acBdAe0Cf78004E1e486BB96 является смарт — контрактом токена ERC20.
  • формат \x in Postgres bytea используется для ввода шестнадцатеричных значений в виде строковых литералов, которые можно считать эквивалентными 0x префиксу.
  • В ковалентной базе данных chain_rsk_mainnet.block_log_events находится таблица со всеми событиями, генерируемыми смарт-контрактами в сети RSK Mainnet
  • В ковалентной базе данных chain_rsk_mainnet.block_transactions находится таблица со всеми подробностями транзакций RSK Mainnet
  • Причина, по которой e.topics это сопоставляется дважды, заключается в оптимизации производительности. Строго говоря, необходимо только последнее.

Ответ №1:

Вам нужно указать диапазон дат в запросе, иначе он будет выполняться очень долго. В RSK существует огромное количество журналов Transfer событий rUSDT. Сканирование всей таблицы, чтобы найти их все, и объединение их всех за один раз является основной причиной того, что этот запрос занимает слишком много времени.

Чтобы решить эту проблему, для каждой из присоединяемых таблиц добавьте условие в поля, связанные со временем ( block_log_events.block_signed_at и block_transactions.signed_at ), чтобы ограничить его определенным интервалом, скажем, месяцем:

 AND e.block_signed_at gt; NOW() - INTERVAL '1 month' AND e.block_signed_at lt;= NOW() AND t.signed_at gt; NOW() - INTERVAL '1 month' AND t.signed_at lt;= NOW()  

Вот полный запрос:

 SELECT  t.fees_paid FROM chain_rsk_mainnet.block_log_events e  INNER JOIN chain_rsk_mainnet.block_transactions t ON  e.block_id = t.block_id  AND e.tx_offset = t.tx_offset WHERE   e.topics @gt; array[E'\xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef'::bytea]  AND e.topics[1] = E'\xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef'  AND e.sender = E'\xEf213441a85DF4d7acBdAe0Cf78004E1e486BB96'  AND e.block_signed_at gt; NOW() - INTERVAL '1 month' AND e.block_signed_at lt;= NOW()  AND t.signed_at gt; NOW() - INTERVAL '1 month' AND t.signed_at lt;= NOW() ORDER BY e.block_id DESC, e.tx_offset DESC LIMIT 100;