如何找出在 RSK 上代币的最新交易支付的汽油费?
How to find out gas fees paid for the latest transactions of a token on RSK?
我想查询 Covalent 数据库,找出 RSK 区块链上最近 100 笔 rUSDT 代币转账交易中支付的 gas 数量。
在下面的 SQL 查询中,我试图加入这两个 table 以找出最近 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 @> 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
是 ERC20 Transfer
事件日志的主题 ID。
0xEf213441a85DF4d7acBdAe0Cf78004E1e486BB96
是ERC20代币的智能合约。
- Postgres 的
bytea
格式中的 \x
用于将十六进制值键入为字符串文字,
可以认为等同于 0x
前缀。
- 在 Covalent 数据库中,
chain_rsk_mainnet.block_log_events
是一个
table RSK 主网上的智能合约发出的所有事件
- 在 Covalent 数据库中,
chain_rsk_mainnet.block_transactions
是一个 table,其中包含所有 RSK 主网交易详细信息
e.topics
匹配两次的原因是性能优化。
严格来说,只有后一个是必须的。
您需要在查询中设置一个日期范围,否则它会 运行 很长时间。
RSK 上有大量 rUSDT Transfer
事件日志。
扫描完整的 table 以找到所有这些,
并且一次加入这些是这个查询花费时间太长的根本原因。
为了解决这个问题,对于每个 table 加入,
为时间相关字段添加条件
(block_log_events.block_signed_at
和 block_transactions.signed_at
),
将它限制在某个时间间隔内,比如一个月:
AND e.block_signed_at > NOW() - INTERVAL '1 month' AND e.block_signed_at <= NOW()
AND t.signed_at > NOW() - INTERVAL '1 month' AND t.signed_at <= 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 @> array[E'\xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef'::bytea]
AND e.topics[1] = E'\xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef'
AND e.sender = E'\xEf213441a85DF4d7acBdAe0Cf78004E1e486BB96'
AND e.block_signed_at > NOW() - INTERVAL '1 month' AND e.block_signed_at <= NOW()
AND t.signed_at > NOW() - INTERVAL '1 month' AND t.signed_at <= NOW()
ORDER BY e.block_id DESC, e.tx_offset DESC
LIMIT 100;
我想查询 Covalent 数据库,找出 RSK 区块链上最近 100 笔 rUSDT 代币转账交易中支付的 gas 数量。
在下面的 SQL 查询中,我试图加入这两个 table 以找出最近 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 @> 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
是 ERC20Transfer
事件日志的主题 ID。0xEf213441a85DF4d7acBdAe0Cf78004E1e486BB96
是ERC20代币的智能合约。- Postgres 的
bytea
格式中的\x
用于将十六进制值键入为字符串文字, 可以认为等同于0x
前缀。 - 在 Covalent 数据库中,
chain_rsk_mainnet.block_log_events
是一个 table RSK 主网上的智能合约发出的所有事件 - 在 Covalent 数据库中,
chain_rsk_mainnet.block_transactions
是一个 table,其中包含所有 RSK 主网交易详细信息 e.topics
匹配两次的原因是性能优化。 严格来说,只有后一个是必须的。
您需要在查询中设置一个日期范围,否则它会 运行 很长时间。
RSK 上有大量 rUSDT Transfer
事件日志。
扫描完整的 table 以找到所有这些,
并且一次加入这些是这个查询花费时间太长的根本原因。
为了解决这个问题,对于每个 table 加入,
为时间相关字段添加条件
(block_log_events.block_signed_at
和 block_transactions.signed_at
),
将它限制在某个时间间隔内,比如一个月:
AND e.block_signed_at > NOW() - INTERVAL '1 month' AND e.block_signed_at <= NOW()
AND t.signed_at > NOW() - INTERVAL '1 month' AND t.signed_at <= 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 @> array[E'\xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef'::bytea]
AND e.topics[1] = E'\xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef'
AND e.sender = E'\xEf213441a85DF4d7acBdAe0Cf78004E1e486BB96'
AND e.block_signed_at > NOW() - INTERVAL '1 month' AND e.block_signed_at <= NOW()
AND t.signed_at > NOW() - INTERVAL '1 month' AND t.signed_at <= NOW()
ORDER BY e.block_id DESC, e.tx_offset DESC
LIMIT 100;