G1-stats.axiom-team.fr

Les sources de https://g1-stats.axiom-team.fr/ sont-elles publiées ?
Comment fait-il pour connaître les clés des comptes non membres ?
Je suis pas sûr que cette information soit disponible depuis BMA.
Est-elle récupérée depuis la BDD ?

C’est @poka qui a dev ça a l’arrache, il se base entre autre sur l’api ES des nœuds Cesium+
Je sais pas s’il a publié le code quelque part

1 J'aime

Oui, je me disais aussi que l’API ES pouvait être utilisée.
Elle offre plus de données ainsi des données plus travaillées que des donnés bruts que BMA.

Oui c’est moi qui est fait ça @Moul

Pour le calcul du nombre de wallets membres / simple portefeuille j’utilise BMA. Sont considérés comme simple portefeuille chaque adresse ayant reçus au moins une transaction.
Pour la récupération des soldes j’utilise l’API ES c’est beaucoup plus rapide.

L’un est un standard du protocole obsolète et l’autre ne l’est pas, donc je suis un peu le cul entre 2 chaises ^^

J’ai publié le code par soucis de transparence et d’audit, si ça peut servir, mais je préviens c’est du full bash pas forcément très digeste pour le peut que ça fait…

Il faudrait qu’on mette en commun les travaux de @yyy et quand on aura une vrai API on refera un truc propre en nodejs par exemple.

3 J'aimes

Tu récupères ça sur quel(s) path(s) ? Je pourrais lire le code aussi :wink:
Ok, tu fais ça en mode bourrins sur touts les blocs contenants des transactions. J’aurais pas le courage de faire ça. J’attendrais qu’une API implémente ça, ça fait beaucoup trop de calculs côté client. Mais pourquoi pas :wink:

J’ai pas compris. Tu parles de BMA et ES/Cesium+ ?


Merci de publier le code. N’oublie pas la licence :wink:

1 J'aime

Je récupère la liste des blocs contenant au moins une trasaction: ${DUNITER}/blockchain/with/tx

Et je boucle dessus pour récupérer les clé publique de destination:
curl -s ${DUNITER}/blockchain/block/${TXBLOCKS[$i]} | jq '.transactions[].outputs[]'

Simplement que BMA est obsolète et attente de remplaçant et que Cesium+ n’est pas proprement un standard du protocole mais plus pratique à manier, donc mon code est doublement pas pérenne dans le temps, c’est pour ça que je ne le diffuse pas trop et que je vais pas plus loin.

Si je devais aller plus loins je ferais au moins une db sqlite ou mysql indexé et pas jsute une génération de fichiers statiques archivés comme je fais là ^^

L’utilité de base était d’avoir la liste des simples portefeuilles actifs et connaitre approximativement leur nombre.

2 J'aimes

Merci d’avoir cherché à obtenir cette information. Le constat est que la majorité des clés publiques contenant des sources ont le statut de membre avec un taux d’environ 85 %.

Et il faut prendre en compte les porte-feuilles qui ne sont plus membres ainsi que les personnes qui ont un compte membre et plusieurs porte-feuilles.

Le pourcentage de personnes ayant uniquement un porte-feuille et pas de compte membre doit être inférieur à 10 % et proche de 5 %. La majorité arrive à avoir un compte membre.

1 J'aime

Oui j’ai été très étonné je m’attendais à beaucoup plus de simple portefeuille.

Est-ce volontaire d’afficher le solde des membres en négatif ? J’imagine que c’est parce que le DU n’est pas compté.

Oui je n’ai pas trouvé de moyen simple d’ajouter les DU.

Scanner tous les DU non consommés de chaque wallet membre rallonge la durée d’exécution de 10 minutes à 1h30 …

Du coup, si un compte est vide et n’est plus utilisé (on peut pas le savoir), alors il est quand même compté. C’est de l’à-peu-près. Mais ça donne un ordre de grandeur. L’idéal serait que GVA fournisse un max de données.

C’est le cas de tous les développeurs de clients :wink: Plus j’écris de code basé sur BMA, je me dis qu’il faudra que j’adapte le code à GVA. Mais, ça devrait être un plaisir étant donné que ça devrait être mieux pensé.

2 J'aimes

Si il a déjà reçus au moins une transaction il est considéré actif, même si il n’a jamais rien fait d’autre.

Si on peut tout faire, je peux filtrer si aucune activité depuis plus de x mois, alors considéré comme inactif, ou si jamais envoyé aucune transaction …
Mais je trouve que c’est une bonne idée à terme d’intégrer ce genre de filtrage dans les statistiques d’utilisation, en affichant plusieurs conditions comme ça.
Comme je parse déjà toutes les transactions ça ne demanderai quasiment pas plus de ressources que d’inclure les date de réception et filtre d’émission.

En train d’investiguer autre chose, j’observe que G1-stats est bugué. Les comptes

Ab1MsqBxaT1oNU4id5Jp4yvwR8wF4SVpqhM34QEPLTsM
Ab1MsqBxaT1cNU4id5Jp4yvwR8wF4SVpqhM34QEPLTsm

ne sont pas présents dans le fichier « tous les wallets », bien qu’ils soient tous deux approvisionnés.

Je vais regarder, c’est une info qui m’intéresse.

edit- c’est la boucle for de la fonction lookwalletup qui est buguée. La liste de n°s de blocs étant [52, 60, 62, …] , la boucle va directement voir la valeur n° 52, puis la valeur n°60, puis la n° 62, etc… Elle saute des blocs !

La belle étourderie des familles :sweat_smile:

Solution

Voilà la fonction loopWalletUp() telle que je l’ai faite tourner :

loopWalletUp() {
#	for i in ${TXBLOCKS[*]}; do
        echo "${#TXBLOCKS[@]}"
	for block in ${TXBLOCKS[@]} ; do
                echo "$block"
           #     block="block"
#		[[ -z ${TXBLOCKS[$i]} ]] && break
		[[ -z $block ]] && break
		sleep 0.1
#		WALLETS0=$(curl -s ${DUNITER}/blockchain/block/${TXBLOCKS[$i]})
		WALLETS0=$(curl -s ${DUNITER}/blockchain/block/$block)
		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/${TXBLOCKS[$i]})
			WALLETS0=$(curl -s ${DUNITER}/blockchain/block/$block)
		done
                [[ -z "$WALLETS" ]] && echo "Erreur: $RET" && exit 1
		WALLETS=$(echo "$WALLETS" | tr -d '"' | awk -F '(' '{ print $2 }' | tr -d ')')  
# attention : le dernier awk retient également les || et les espaces utilisées dans les conditions d'unlock composées, ça fait planter la suite du script.

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

		progress=$(echo "scale=1; $block*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
}

J’ai fait tourner le script (plus de deux heures, au lieu de 15 min !), qui a parcouru tous les blocs avec des transaction. Malheureusement, il a rencontré une erreur par la suite, donc le débogage n’est pas fini.

Voici donc des résultats temporaires : 6534 simples portefeuilles, 9331 portefeuilles en tout !

A suivre… J’ai l’info qu’il me faut (la liste des wallets), je ne sais pas si j’irai voir plus loin.

(message édité après avoir un peu débogué)
Noeud: https://duniter-g1.p2p.legal
Nombre total de wallet: 9329
Nombre de membres: 2794 (29.9%)
Nombre de simple portefeuille: 6535 (70.0%)

---

Extraction wallets membres / Simples portefeuille

---

Isolation des simples portefeuilles...
Récupération du solde des simples wallets...
Reçus simples wallets:	 4.720.054,67
Envoyé simples wallets:	 2.943.669,22
Soldes simples wallets:	 1.776.385,45

---

Récupération du solde des membres...
Reçus membres:	 4.100.772,32
Envoyé membres:	 5.840.712,08
Soldes membres:	 -1.739.939,76
Total DU non consumés:	 0

---

Solde des membres (sans DU):	 36.445,69
Masse Monétaire:	 19.130.375,05 Ḡ1

---
Analyse
---

69,5% des Ḡ1 n'ont jamais été utilisés.
11-09-20 - Heure de fin: 10:35

2 J'aimes

Woua effectivement belle erreur des familles comme tu dis …
Je me disais bien qu’il y avait un soucis dans ces stats, et ce n’est peut être pas le seul, d’où le gros disclaimer sur la page web…

Il y a quelques mois j’avais même entrepris de refaire entièrement ce code un peu mieux, sur une autre branche, avec une autre manière de scanner les blocs qui me permet d’avoir plus d’informations quotidiennes sur les comptes, et en stockant les valeurs en json cette fois ci, un peu plus proprement … Mais d’une part mes résultats n’étaient pas cohérents avec la version actuelle, et d’autre part je me suis rendu compte à la fin que Benoit index déjà un certain nombre de stats dans ses DB ElasticSearch bien plus proprement que moi, donc ce que je faisais ne semblait plus très utile.

Je fix ça au plus vite, merci @matograine

La base de donnée de Duniter recense exactement 8375 portefeuilles (au bloc #355937), mais elle ne contient que ceux ayant un solde non-null :slight_smile:

Je travaille actuellement sur un explorateur de la DB de Duniter en ligne de commande (dex) qui permettra d’extraire ce genre d’infos, et bien d’autres :slight_smile:

C’est ainsi que j’ai eu le nombre de portefeuilles avec un solde non-null :

$ ./dex count wallet
Database opened in 0.149972 seconds.
Count operation performed in 0.010083 seconds.

This collection contains 8375 entries.
2 J'aimes

Pour ceux qui veulent j’ai extrait la liste des wallet dans un fichier json avec dex :

$ ./dex find wallet -f wallet.json -o json --pretty --keys-only
Database opened in 0.106677 seconds.
Search performed in 0.210568 seconds.

8375 entries found.
Export all 8375 entries ? (Be careful, may crash your system!) [y/N]
y
Search results were written to file: ‹ wallet.json › in 0.282570 seconds.

Voici le fichier: wallet.json (449.4 KB)

Je peux aussi faire un export avec les soldes.

Pour ceux qui voudraient compiler dex eux-mêmes afin de faire les exports eux-mêmes depuis leur propre nœud duniter les indications sont là : Dex (Duniter DBs Explorer)