Titres Titres
Beaucoup d’entre nous vivent et travaillent sur la ligne de commande Linux.

Je vis dans ce quartier depuis 1986. Pendant la majeure partie de ce temps, la ligne de commande me commandait. Mais finalement, j’ai commencé à commander la ligne de commande.
Dans cet article, je vais partager avec vous un exemple de commande de la ligne de commande. Je vais prendre la ligne de commande par son col de chemise et la secouer jusqu’à ce qu’elle fasse ce que je veux. La cible de mon agression sera une ligne de commande TrueBlocks fournie par l’un de nos utilisateurs. (Merci Pintail.)
Utiliser des tuyaux Linux
Tout d’abord, je vais commencer par vous montrer une commande que notre utilisateur a partagée avec nous :
chifra export --cache --articulate
--first_block 12550000 --last_block 13520000
--fmt csv 0x6b175474e89094c44da98b954eedeac495271d0f |
grep 'approve' |
tr -d '"' |
cut -d ',' -f1,2,5,6,13-20
> dai_uniswapv2_approvals.csv
Traduit en anglais, cela dit :
Afficher chaque transaction contre le DAI StableCoin (0x6b17…71d0f), à partir du bloc 12 550 000 et continuer jusqu’au bloc 13.520.000 inclusif rapportant les résultats dans CSV format. Par ailleurs, articuler ces résultats et cache la requête au fur et à mesure. Puis…
pousser les résultats à travers grep pour ne prélever que les transactions d’approbation de jeton ; supprimer les guillemets ; et, en utilisant une virgule comme délimiteur de champ, extrayez les premier, deuxième, cinquième, sixième et treizième à 20e champs (blockNumber, transactionIndex, from, to, compressedTx) ; et, enfin, stockez les résultats dans un fichier appelé dai_uniswapv2_approvals.csv
Tu vois, je te l’avais dit. La ligne de commande a tendance à commander l’utilisateur. C’est une commande folle.
Pouvons-nous nous améliorer ?
Oui.
Comment?
Il y a cinq choses qui se passent dans la commande ci-dessus :
- Produire la liste des transactions avec exportation chifra
- Filtrage des enregistrements pour approbations avec grep
- Extraire seulement cinq des nombreux champs de chaque enregistrement avec Couper
- Supprimer les guillemets avec tr
- Le stockage des résultats dans un fichier avec une redirection (>)
On va commencer par simplifier les choses.
Nous supprimons toute partie de la commande ci-dessus qui n’est pas pertinente pour cet article (le —-cache
options et le --first_block
et --last_end
options de blocage. Nous garderons le --articulate
option. Nous allons également supprimer la tuyauterie, la saisie, la transformation et la redirection.
Donc, nous nous retrouvons avec cette commande:
chifra export --fmt csv
--articulate 0x6b175474e89094c44da98b954eedeac495271d0f
Cette commande affiche chaque transaction dans tout l’historique du DAI Stablecoin. Nous rajouterons des options à partir d’ici.
Filtrage des enregistrements pour les approbations
Si on lance la commandechifra export --help
, on voit ce résumé :
chifra export [flags]
<address> [address...] [topics...] [fourbytes...]
Vous pouvez voir ici qu’il est possible de fournir non seulement addresses
à la commande export, mais aussi un ou plusieurs topics
et/ou un ou plusieurs fourbyte
signature.
Afin de trouver le fourbyte
signature qui nous intéresse, nous pouvons faire cette commande :
chifra abis 0x6b175474e89094c44da98b954eedeac495271d0f | grep approve
qui renvoie :
fourbyte type name signature
-----------------------------------------------------------------
0x095ea7b3 function approve approve(address,uint256)
Nous pouvons ajouter que fourbyte
signature à notre commande croissante :
chifra export --fmt csv --articulate
0x6b175474e89094c44da98b954eedeac495271d0f
0x095ea7b3
Cette commande affiche chaque approve
transaction qui a été exécutée à chaque fois contre DAI.
La commande ci-dessus remplace le besoin de grep
dans la commande d’origine. C’est aussi plus rapide que la commande d’origine puisque de nombreuses transactions (celles qui ne sont pas approve
) ne sont jamais générés. Il n’y a pas besoin de grep les sortir.
Sélection de champ
Noter: La section suivante décrit une fonctionnalité expérimentale de TrueBlocks. Je peux être supprimé ou modifié dans les versions futures. Utiliser avec précaution.
La commande d’origine utilise tr
pour supprimer les guillemets de la sortie et cut
pour sélectionner les champs 1,2,5,6 et 13-20 des données. Cela peut être accompli en utilisant une fonctionnalité non documentée (et donc expérimentale) de TrueBlocks appelée « chaînes d’affichage ». Je n’expliquerai pas les chaînes d’affichage, car cet article devient déjà long, mais ils vous permettent de sélectionner des champs et (en fait) de décrire la sortie exacte des données que vous souhaitez.
Exécutez cette commande :
DISPLAY_FORMAT="[{BLOCKNUMBER}]"
chifra export --fmt txt --articulate
0x6b175474e89094c44da98b954eedeac495271d0f
0x095ea7b3 2>/dev/null
Noter: J’ai changé le format d’exportation de csv
à txt
afin de rendre les données affichées plus claires. Cela résout également un problème avec la commande d’origine. le compressedTx
Le champ contient des virgules, donc l’utilisation de CSV ne fonctionne pas vraiment car les champs sont brouillés.
La commande ci-dessus produit ligne sur ligne affichant uniquement le blockNumber
de chaque opération.
Exécutez cette commande :
DISPLAY_FORMAT="[{BLOCKNUMBER}][{TRANSACTIONINDEX}]"
chifra export --fmt csv --articulate
0x6b175474e89094c44da98b954eedeac495271d0f
0x095ea7b3 2>/dev/null
Rangée sur rangée de blockNumber
et transactionIndex
. Vous avez eu l’idée.
Vous pouvez indiquer à TrueBlocks quels champs afficher à l’aide d’une variable d’environnement.
Les champs 1,2,,5,6 et 13-20 correspondent à blockNumber
, transactionIndex
, from
, to
, et compressedTx
. Vous pouvez voir les champs exportés ici.
En étendant cela aux champs que nous voulons, la commande devient :
DISPLAY_FORMAT="[{BLOCKNUMBER}]t[{TRANSACTIONINDEX}]t[{FROM}]t[{TO}]t[{COMPRESSEDTX}]"
chifra export --articulate
0x6b175474e89094c44da98b954eedeac495271d0f
0x095ea7b3 2>/dev/null
Noter: Vous devez corriger la commande ci-dessus pour la mettre sur une seule ligne.
Si vous exécutez la commande ci-dessus via | head -1
vous verrez que seuls les champs qui nous intéressent sont exportés :
blocknumber transactionindex from to compressedtx
Pas de citations. C’est ce que nous voulons. Cette commande est plus rapide car vous n’avez pas besoin de transférer des données superflues via le cut
commander. Lorsque vous effectuez un traitement de données en ligne de commande, chaque petit ajustement compte.
Stockage des résultats dans un fichier
Jusqu’à présent, nous avons éliminé grep
, cut
, et tr
. Pouvons-nous éliminer la redirection ?
Oui.
Chifra a une option appelée --output <filename>
qui permet à l’utilisateur de spécifier la destination des données résultantes.
La dernière commande améliorée est donc :
DISPLAY_FORMAT="[{BLOCKNUMBER}]t[{TRANSACTIONINDEX}]t[{FROM}]t[{TO}]t[{COMPRESSEDTX}]"
chifra export --articulate
0x6b175474e89094c44da98b954eedeac495271d0f
0x095ea7b3 --output dai_uniswapv2_approvals.csv
Noter: Edité pour être tout sur une seule ligne.
Performance
Voici les résultats des tests de vitesse des deux commandes :