Portefeuilles manquants #1

Closed
opened 2020-09-10 19:06:45 +02:00 by matograine · 5 comments

Comme dit sur le forum, certains portefeuilles n'apparaissent pas dans la liste.

La source vient de le fonction lookWalletUp. La boucle est mal fichue et ne parcourt pas tous les blocs, loin de là. Voici une solution (le script tourne depuis 30 min et n'est pas encore au bout...) :

loopWalletUp() {
	for i in ${TXBLOCKS[*]}; do    # pour tout n° de bloc listé dans TXBLOCKS
		[[ -z $i ]] && break    #[[ -z ${TXBLOCKS[$i]} ]] && break     
#(à la première itération, le 1er bloc étant 52, on va regarder la valeur n°52. Et ainsi de suite...)
		sleep 0.1
		WALLETS0=$(curl -s ${DUNITER}/blockchain/block/$i})    #$(curl -s ${DUNITER}/blockchain/block/${TXBLOCKS[$i]})
		until WALLETS=$(echo $WALLETS0 | jq '.transactions[].outputs[]' 2>/dev/null); do
			[[ $isWeb != "web" ]] && echo -e "iter $iter \n$WALLETS0"
			sleep 2
			WALLETS0=$(curl -s ${DUNITER}/blockchain/block/$i)    # $(curl -s ${DUNITER}/blockchain/block/${TXBLOCKS[$i]})
		done
                [[ -z "$WALLETS" ]] && echo "Erreur: $RET" && exit 1
		WALLETS=$(echo "$WALLETS" | tr -d '"' | awk -F '(' '{ print $2 }' | tr -d ')')

		#bloc=${TXBLOCKS[$i]}
		wallets+=$(echo -e "$WALLETS \n" | sed 's/ /\\n/g')

		progress=$(echo "scale=1; $i*100/$lastBloc/1" | bc)   # $(echo "scale=1; $bloc*100/$lastBloc/1" | bc)


		if [[ $isWeb != "web" ]]; then
			clear
			echo "Heure de début: $startTime"
			echo
			echo "Scan en cours: $progress% - $bloc/$lastBloc"
		fi

		((iter++))

	done
}

Comme dit sur [le forum](https://forum.duniter.org/t/g1-stats-axiom-team-fr/6587/13), certains portefeuilles n'apparaissent pas dans la liste. La source vient de le fonction `lookWalletUp`. La boucle est mal fichue et ne parcourt pas tous les blocs, loin de là. Voici une solution (le script tourne depuis 30 min et n'est pas encore au bout...) : ```bash loopWalletUp() { for i in ${TXBLOCKS[*]}; do # pour tout n° de bloc listé dans TXBLOCKS [[ -z $i ]] && break #[[ -z ${TXBLOCKS[$i]} ]] && break #(à la première itération, le 1er bloc étant 52, on va regarder la valeur n°52. Et ainsi de suite...) sleep 0.1 WALLETS0=$(curl -s ${DUNITER}/blockchain/block/$i}) #$(curl -s ${DUNITER}/blockchain/block/${TXBLOCKS[$i]}) until WALLETS=$(echo $WALLETS0 | jq '.transactions[].outputs[]' 2>/dev/null); do [[ $isWeb != "web" ]] && echo -e "iter $iter \n$WALLETS0" sleep 2 WALLETS0=$(curl -s ${DUNITER}/blockchain/block/$i) # $(curl -s ${DUNITER}/blockchain/block/${TXBLOCKS[$i]}) done [[ -z "$WALLETS" ]] && echo "Erreur: $RET" && exit 1 WALLETS=$(echo "$WALLETS" | tr -d '"' | awk -F '(' '{ print $2 }' | tr -d ')') #bloc=${TXBLOCKS[$i]} wallets+=$(echo -e "$WALLETS \n" | sed 's/ /\\n/g') progress=$(echo "scale=1; $i*100/$lastBloc/1" | bc) # $(echo "scale=1; $bloc*100/$lastBloc/1" | bc) if [[ $isWeb != "web" ]]; then clear echo "Heure de début: $startTime" echo echo "Scan en cours: $progress% - $bloc/$lastBloc" fi ((iter++)) done } ```
Owner

Effectivement grosse coquille qui fausse totalement les statistiques depuis le début.
Je rectifie ça au plus vite.

Effectivement grosse coquille qui fausse totalement les statistiques depuis le début. Je rectifie ça au plus vite.
Author

Attention, il y a un awk qui filtré le contenu des unlocks. La liste des wqllets qui en résulte commencé par une espace et un double pipe. Ca fait planter la suite du script. Il est possible que des conditions de dépense non souhaitées (autres que SIG) se glissent dans la liste de allers.

Un filtrage par regex semble nécessaire.

Attention, il y a un awk qui filtré le contenu des unlocks. La liste des wqllets qui en résulte commencé par une espace et un double pipe. Ca fait planter la suite du script. Il est possible que des conditions de dépense non souhaitées (autres que SIG) se glissent dans la liste de allers. Un filtrage par regex semble nécessaire.
Author

La liste de wallets créée contient une première ligne vide et une deuxième avec "||" (vient de transactions avec conditions d'unlock composées).

on peut les filtrer avec une regex:

REGEX_PUBKEYS="[a-zA-Z0-9]{42,43}"
[...]
### Ecriture des adresses actives dans un fichier tampon ###
echo -e "$(echo -e "$wallets" | sort -u)" > $outFile
# ne conserver que les lignes qui matchent la regex pubkey
grep -E $REGEX_PUBKEYS $outfile >> $outfile

edit - Il reste des problèmes de parsing après ça. Je ne sais pas par où continuer.

La liste de wallets créée contient une première ligne vide et une deuxième avec "||" (vient de transactions avec conditions d'unlock composées). on peut les filtrer avec une regex: ```python REGEX_PUBKEYS="[a-zA-Z0-9]{42,43}" [...] ### Ecriture des adresses actives dans un fichier tampon ### echo -e "$(echo -e "$wallets" | sort -u)" > $outFile # ne conserver que les lignes qui matchent la regex pubkey grep -E $REGEX_PUBKEYS $outfile >> $outfile ``` edit - Il reste des problèmes de parsing après ça. Je ne sais pas par où continuer.
Owner

J'ai commencé à faire autrement, en filtrant avec grep -v les lignes contenant des || une fois isolés, et retirant les lignes vides avec awk 'NF'.

Mais ton regex est pas mal, d'autant qu'avec l'option -o de grep je peux ne sélectionner uniquement que les clés publiques des lignes, évitant alors de awk et tr pour sélectionner les clés.
Je ne sais pas ce qui est le mieux.

Pour la regex il faut la faire matcher entre 42 et 44 pour qu'elle prenne toutes les clés.

REGEX_PUBKEYS="[a-zA-Z0-9]{42,44}"
echo -e "$wallets" | sort -u | grep -Eo $REGEX_PUBKEYS) > $outFile

J'ai fais pas mal de test avec quelques clés pour aller vite, là je refait un test complet mais ça va prendre plus de 4h (test lancé à 15h40) ...

Si j'ai le temps je vais reprendre une partie de ce que j'avais fait dans la branche solidity-rebuild, où j'exportait les données en json, pour faire en sorte de ne pas tout rescanner à chaque passe, mais juste les derniers blocs pas encore indexés.

J'ai commencé à faire autrement, en filtrant avec `grep -v` les lignes contenant des `||` une fois isolés, et retirant les lignes vides avec `awk 'NF'`. Mais ton regex est pas mal, d'autant qu'avec l'option `-o` de grep je peux ne sélectionner uniquement que les clés publiques des lignes, évitant alors de awk et tr pour sélectionner les clés. Je ne sais pas ce qui est le mieux. Pour la regex il faut la faire matcher entre 42 et 44 pour qu'elle prenne toutes les clés. ``` REGEX_PUBKEYS="[a-zA-Z0-9]{42,44}" echo -e "$wallets" | sort -u | grep -Eo $REGEX_PUBKEYS) > $outFile ``` J'ai fais pas mal de test avec quelques clés pour aller vite, là je refait un test complet mais ça va prendre plus de 4h (test lancé à 15h40) ... Si j'ai le temps je vais reprendre une partie de ce que j'avais fait dans la branche solidity-rebuild, où j'exportait les données en json, pour faire en sorte de ne pas tout rescanner à chaque passe, mais juste les derniers blocs pas encore indexés.
Owner

J'ai push mes modifications.
J'en ai profité pour améliorer légèrement le code, notamment en virant le fichier tampon outFile qui ne servait à rien, remplacé par l'utilisation d'une variable.

J'ai aussi ajouté du cache pour le boucle loopWalletUp.

J'ai push mes modifications. J'en ai profité pour améliorer légèrement le code, notamment en virant le fichier tampon outFile qui ne servait à rien, remplacé par l'utilisation d'une variable. J'ai aussi ajouté du cache pour le boucle loopWalletUp.
poka closed this issue 2020-11-04 16:21:40 +01:00
Sign in to join this conversation.
No Label
No Milestone
No Assignees
2 Participants
Notifications
Due Date
The due date is invalid or out of range. Please use the format 'yyyy-mm-dd'.

No due date set.

Dependencies

No dependencies set.

Reference: axiom-team/g1-stats#1
No description provided.