4 votes

Comment calculer les frais de gaz payés pour un transfert unique de pièces stables sur RSK ?

J'essaie de calculer combien d'essence est dépensée pour la transaction de transfert de jeton rUSDT sur RSK . Si je vais à Page des événements RSK explorer rUSDT et prendre le premier disponible transaction avec un événement de transfert je vois qu'en plus de l'événement de transfert qui m'intéresse, il comprend également 24 autres événements (envoi, conversion, approbation, etc.). Ainsi, les frais de gaz payés pour cette transaction (769 510 gaz * 0,000000000065540656 RBTC ) est constitué du montant de gaz payé pour l'ensemble de ces 24 événements. Existe-t-il un moyen de "séparer" les transferts des autres et de calculer les frais de gaz payés uniquement pour eux ? Mon idée était d'utiliser un Covalent pour interroger la blockchain RSK. J'ai écrit cette requête pour calculer les frais de gaz payés pour les 20 dernières transactions avec des événements de transfert.

SELECT encode(t.hash, 'hex'),  t.gas_spent * t.gas_price / 10^18 AS gas_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[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 20

donde 0xEf213441a85DF4d7acBdAe0Cf78004E1e486BB96 est une adresse de jeton rUSDT et 0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef est une constante (ERC20 Transfer hachage de la signature de l'événement).

Est-il possible de modifier cette requête de manière à calculer le gaz payé séparément pour les transferts de jetons ?

5voto

bguiz Points 6226

Vous pouvez restreindre votre requête afin de n'inclure que les transactions pour lesquelles le numéro de transaction to correspond à l'adresse du smart contract du jeton rUSDT, en ajoutant une autre condition à votre WHERE clause :

AND t.to = E'\\xEf213441a85DF4d7acBdAe0Cf78004E1e486BB96'

Explication :

  • Votre requête originale a été ramassée Transfer événements au sein de transactions entre les adresses de comptes externes (EOA) et l'adresse du contrat intelligent (SC) du jeton ERC20.
  • Votre requête originale a également été reprise Transfer événements au sein de transactions internes entre autre les adresses SC (par exemple, un protocole DeFi), et l'adresse SC du jeton ERC20
  • D'après votre question, il semble que vous souhaitiez uniquement prendre le premier et exclure le second.
  • Pour ce faire, une approche consisterait à
    • voir où l'EOA envoie un transaction directement au SC du jeton ERC20 --> inclure ceci
    • voir où l'EOA envoie un transaction à une autre adresse SC, qui à son tour exécute indirectement un transaction interne sur le SC du jeton ERC20 --> exclure ceci

Ce qui précède devrait vous donner un résultat où la redevance gazière payée pour cette transaction est bien pour une seule Transfer l'occurrence.

Cependant, concernant ceci :

Existe-t-il un moyen de "séparer" les transferts des autres et de calculer les frais d'essence payés uniquement pour eux ?

Il n'y a pas de moyen direct de le faire (AFAIK). Potentiellement, vous pourriez être en mesure de le faire en utilisant des appels RPC à debug_traceTransaction ... mais comme cela n'est pas disponible dans votre base de données, vous aurez besoin d'une approche complètement nouvelle basée sur les RPC au lieu du SQL. Je laisserai cette approche alternative à d'autres personnes qui répondront !


Requête complète :

SELECT encode(t.hash, 'hex'),  t.gas_spent * t.gas_price / 10^18
    AS gas_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[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()
    AND t.to = E'\\xEf213441a85DF4d7acBdAe0Cf78004E1e486BB96'
ORDER BY e.block_id DESC, e.tx_offset DESC
LIMIT 20;

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X