J’ai mis en route un process automatique hier soir vers 21h30 / 22h et arrêté vers 00h/00h30
J’ai effectué pas mal de transactions entre les comptes ^^.
Je fais une remonté du résultat ce matin, de la “vue” sur http://g1-test.duniter.fr/#/app/home
et je m’interroge sur les calculs de prise en compte du solde,
étant donné les différences entre les 2 urls sur le site:
app/wot/tx/key/uid <=> correspond au retour des montants sur tx/sources/pubkey
app/wot/key/stats <=> ?
si je calcul bien le montant total restant de mes sources et la requête tx/sources sur laquelle je me base pour calculer le solde disponible, il y a des G1tests ( 25,24 - 22,99 => 2,25 ) qui sont probablement perdus au fin fond de la galaxie du numérique au travers du nombres de transactions stockées dans les tableaux “sending” et “pending” que l’on voit sur les requetes tx/history
par ailleurs
“time”: null,
“block_number”: null,
sont a nulls uniquement dans les champs pending et sending, pas “sent”
les champs à null sont ils critiques ? je suppose qu’ils sont remplis une fois validés par la blockchain
du coup, qu’elle est la différence fondamentale entre les tx stockées dans “sending” et “pending” ?
Les tableaux “pending” et “sending” réfèrent aux transactions qui ne sont pas passées en blockchain, donc qui ne sont pas officielles et qui ne valent rien en elles-mêmes. Les GT (je vais abréger pour Ğ1-Test, c’est trop long) qui sont dépensés par ces transactions sont toujours officiellement disponibles.
Cela veut simplement dire que ces transactions ne sont pas écrites, car ils sont remplis en fonction du bloc qui intègre ces transactions, les officialise.
Dans “sending” tu vois les GT que tu dépenses mais qui n’ont pas encore été encaissés par le destinataire (car la transaction n’est pas encore officiellement écrite en blockchain). Même chose pour “pending”, concernant les GT que tu vas recevoir.
Chaque nœud a une taille limite de piscine, pour les transactions c’est une piscine globale limitée actuellement à 200 entrées.
Pour contourner la limite, 2 solutions :
soit envoyer les transactions depuis un compte membre vers le nœud membre correspondant, car bien sûr notre propre nœud accepte toujours nos propres documents
soit envoyer des transactions de plus gros montant, car la piscine a une notion de priorité et accepte tout de même les transactions de montant plus important que celles qu’elle possède déjà
Ceci dit c’est quand même pas terrible d’avoir une piscine « globale », ce serait plus malin d’avoir une piscine par émetteur de transaction tout comme on a une piscine limitée à 12 entrées par membre pour les certifications.
Une piscine par clé émettrice je le sens pas, ça permettrais une attaque de spam massive assez facilement, ou alors il faut vraiment des protections solides avec par exemple un pré-traitement rapide du document avant de décider de le stocker en piscine :
refus systématique des clés émettrices qui n’ont pas de sources dispo
un timer avec refus de plus de x documents par minute par exemple.
Sinon on peut garder une piscine globale mais dont la taille est dynamique en fonction du nombre de tx inscrites dans le dernier bloc, par exemple quelque chose comme txSandboxMaxSize = MAX (200;1.1*countTxLastBlock)
Ben il est facile pour un attaquant de disperser sa monnaie et de la monnaies de complices sur des millions de clés puis de se mettre d’accord pour envoyer 1 document tx de chaque clé en même temps, une sorte de DDos qui plomberai tout le réseau même avec 1 seul document par clé.
Eh bien alors c’est facile, il suffit d’avoir des piscines par montant (]0; 10], ]10; 50], …) , et refuser par exemple X fois le même émetteur au sein d’une petite piscine par exemple, tout en ayant une taille maximale générale pour chaque piscine.
Le coup des piscines par clé me paraît bien au niveau des membres par contre.
Effectivement très bonne idée, a condition que les tranches soient calculés relativement au DU courant pour que le système reste pertinent sur long terme. On peut choisir par exemple :
Pour les émetteurs non-membres uniquement :
]0; 10 DU] : maxi 2 tx par émetteur
]10 DU; 50 DU] : maxi 3 tx par émetteur
]50 DU; 100 DU] : maxi 4 tx par émetteur
]100 DU; +inf] : maxi 5 tx par émetteur
Chaque tranche ayant par ailleurs une taille totale maximale de MAX (200;1.1*countTxLastBlock)
Pour les émetteurs membres : 5 tx par émetteur quelque soit le montant.
Parce que c’est le facteur que tu a déjà choisi pour la taille des blocs il me semble, 110% de la taille du bloc précédent au maximum, c’est bien ça non ?
Oui mais c’est une fonction récursive pour la taille du bloc, j’ai fait en sorte qu’il puisse y avoir une augmentation de 10%. Tandis que là, le 1.1 ne fait rien. D’où mon interrogation !
Donc, retirons-le et mettons directement countTxLastBlock.
j’ai envie d’ajouter que sur les requêtes de l’api BMA,
un timeout lié à l’adresse IP de la connexion entrante me semble on ne peut plus pertinent, j’ai envoyé à un certain moment environ 3 requêtes toutes les 2/3 secondes,
rejeter le traitement de la requete au + tôt dans le processus au dela de X requetes dans une periode P, appliquer cela a minima sur la fonction concernée par l’URI tx/process…