🚹 Runtime Upgrade Proposal: gtest v1110

Objectif: Fix bug de réévaluation quotidienne du DU

@technical-committee

ProblĂšme actuel:

  • Le DU est réévaluĂ© TOUS LES JOURS au lieu de tous les 6 mois
  • Cause: first_ud_reeval en secondes (1766232000) au lieu de millisecondes

Solution:

  • Migration automatique (idempotente): NextReeval passera de 1766232000 Ă  1766232000000 ms
  • Date correcte: 20 dĂ©cembre 2025 Ă  13:00:00 UTC

MR:

Proposition:

Vote: https://duniter-portal.axiom-team.fr/?rpc=wss%3A%2F%2Fgt.p2p.legal%2Fws#/techcomm/proposals

:warning: Votez pour la proposition 1, la proposition 0 Ă©tant obsolĂšte. Vous pouvez voter “Non” Ă  la proposition 0 pour l’annuler avant sont expriration. :warning:

Seuil: 6
Fin du vote: Jeudi 30 Octobre Ă  16h30

:warning: Merci de vérifier le hash en compilant localement avec:

cargo xtask release runtime build gtest
cat release/srtool_output_gtest.json | grep blake2_256 | jq -r '.runtimes.compressed.blake2_256'

Voir ce tuto: Technical committee: Check runtime upgrade hash compliance

Vous pouvez également lire et vérifier que les tests de la migration passent bien:

% cargo test -p gtest-runtime --lib migrations::tests -- --nocapture

running 4 tests
Initial NextReeval (future value): 1782010800000 (June 20, 2026)
Initial NextReeval: 1766232000
Migration weight: Weight { ref_time: 16770000, proof_size: 0 }
Updated NextReeval: 1782010800000
test migrations::tests::test_migration_v1110_with_already_correct_value ... ok
Migration weight: Weight { ref_time: 22976000, proof_size: 0 }
Updated NextReeval: 1766232000000
test migrations::tests::test_migration_v1110_preserves_future_value ... ok
test migrations::tests::test_migration_v1110_is_idempotent ... ok
test migrations::tests::test_migration_v1110_fixes_incorrect_next_reeval ... ok

test result: ok. 4 passed; 0 failed; 0 ignored; 0 measured; 5 filtered out; finished in 0.00s```
3 Likes

Je viens de rĂ©aliser que ma condition d’execution de la migration n’est pas bonne. Il se base sur la valeur de nextReeval alors qu’il faudrait plutĂŽt se baser sur le numĂ©ro du runtime. Je dois refaire une proposition.


Et en fait je me rend compte qu’ici il y a beaucoup plus simple, pas besoin de runtime upgrade, juste un setStorage directement, proposition 5.

Comment j’ai dĂ©terminĂ© les bonnes valeurs ?

et

python3 -c "import struct; print('0x' + struct.pack('<Q', 1766232000000).hex())"

1 Like

La proposition 6 remet la bonne valeur du DU.

duniter-v2s % python3 -c "import struct; print('0x' + struct.pack('<Q', 1148).hex())"


Pour vous y retrouver dans les diffĂ©rentes propositions ouvertes, vous pouvez vous rĂ©fĂ©rer Ă  celle auquels j’ai vĂŽtĂ© oui.
Actuellement les 3 derniĂšres.


Si ça vous convient je peux supprimer la MR runtime 1110 ainsi que la release 1110.
Soyez indulgent je m’entraine, le rĂ©seau gtest est fait pour ça, on se fait la main :slight_smile:

6 Likes

Juste pour clarifier : quand tu dis proposition “5” c’est en rĂ©fĂ©rence aux propositions visibles dans l’onglet “ComitĂ© tech > Proposals” de Duniter Portal, donc index 5.

Proposition d’index 5

  • fonctionnellement : universalDividend.nextReeval = 1766232000000
  • hash de la clĂ© du storage : 0x235cdca73b1fc4b26dd60639fe5bf213510012cc03aa2d41b711cd71b8a63e85
  • hash de la valeur : 0x0086a13b9b010000

J’ai testĂ© le call en local sur un nƓud de dev pour bien tout vĂ©rifier par moi-mĂȘme, le storage est correctement mis Ă  jour.

J’ai donc votĂ© la proposition.

Procédure de vérification détaillée

Obtention de la clé

On veut connaßtre la clé du storage associée à universalDividend.nextReeval :

Copier la valeur 0x235cdca73b1fc4b26dd60639fe5bf213510012cc03aa2d41b711cd71b8a63e85.

Obtention de la valeur

Comme Substrate attend une valeur hexadécimale, il faut convertir 1766232000000 en hexadécimal.

En python, Poka propose :

python3 -c "import struct; print('0x' + struct.pack('<Q', 1766232000000).hex())"                                                                                                    

En JS :

const num = 1766232000000;

// Créer un buffer de 8 octets
const buffer = new ArrayBuffer(8);
const view = new DataView(buffer);

// Écrire en little-endian (true = little-endian)
view.setBigUint64(0, BigInt(num), true);

// Convertir en hex
const hex = '0x' + Array.from(new Uint8Array(buffer))
    .map(b => b.toString(16).padStart(2, '0'))
    .join('');

console.log(hex);

Dans les 2 cas, on obtient 0x0086a13b9b010000.

Proposition finale

On vérifie dans la proposition que les 2 valeurs calculées correspondent bien.

  • clĂ© 0x235cdca73b1fc4b26dd60639fe5bf213510012cc03aa2d41b711cd71b8a63e85
  • valeur 0x0086a13b9b010000

C’est OK.

Proposition d’index 6

  • fonctionnellement : universalDividend.currentUd = 1148 au lieu de 1505 actuellement, mais il vaudrait mieux que la proposition 5 passe avant sinon il va falloir recommencer la proposition 6 plus tard.
  • hash de la clĂ© du storage : 0x235cdca73b1fc4b26dd60639fe5bf213e693e94477a5a91aed0757f3de0b8168
  • hash de la valeur : 0x7c04000000000000

MĂȘmes vĂ©rifications que pour la proposition prĂ©cĂ©dente.

C’est OK.

J’ai n’ai PAS votĂ© la proposition pour la bloquer temporairement tant que la proposition 5 n’est pas passĂ©e.

2 Likes

Oui je parle en index, proposition 5, la 6Ăšme :slightly_smiling_face:.

J’ai votĂ© oui, non, oui, non, puis finalement oui avec Tikka. Pour la proposition du set storage.

C’est pas que j’hĂ©sitais, c’est que je testais mon code de Tikka
 :grin:
Les propositions y sont affichĂ©es par ordre d’index croissant.

3 Likes

@technical-committee pour rappel il reste 4 jours pour voter les propositions, à commencer par l’index 4 et 5. Il manque 2 votes pour la 5ùme.

1 Like

De ce que je comprends, la date de prochaine réévaluation du DU serait au 20 dĂ©cembre avec la proposition d’index 5.

Quitte Ă  ce que ce soit pas Ă  l’équinox, pourquoi ne pas la mettre plus tĂŽt pour se rendre compte plus rapidement si le problĂšme est rĂ©glĂ© et que la réévaluation ce fait correctement ?

En ce sens, j’ai tentĂ© de faire un proposal aussi, mais je n’arrive pas Ă  le passer (wrong length me dit-il) qu’est-ce qui cloche ?

Avec la valeur que j’indique, si j’ai bien compris ça donnerais le 1er novembre 2025 à 13h c’est bien ça ?

PS : si on change quand a lieu la prochaine rééval et le montant, ça ne change pas la fréquence, il y a donc une chose de plus à changer non ?

Enfin, j’ai essayer de recompiler duniter-v2s Ă  plusieurs reprise, y compris en crĂ©ant le dossier qu’il rĂ©clame avec un chmod o+w mais pas moyen de finir la compile :confused: avez vous eu ce problĂšme et comment l’avez vous rĂ©solu :

$ cargo xtask release runtime build gtest
Finished `dev` profile [unoptimized + debuginfo] target(s) in 2.29s
Running `target/debug/xtask release runtime build gtest`
rustc 1.91.0-nightly (7d82b83ed 2025-08-06)
cargo 1.91.0-nightly (840b83a10 2025-07-30)
🚀 Construction du runtime avec srtool: gtest
Docker version 28.5.1, build e180ab8
📄 SRTOOL_OUTPUT = release/srtool_output_gtest.json
🐳 Lancement du conteneur srtool...
🚀 DĂ©marrage de srtool...
📁 RĂ©pertoire de travail: /build
🔧 Runtime: gtest
📄 Sortie: release/srtool_output_gtest.json
🔹 Construction du runtime avec srtool...
tee: release/srtool_output_gtest.json: Permission denied
🧰 Substrate Runtime Toolbox - srtool v0.18.3 🧰
              - by Chevdor -
info: override toolchain for '/build' set to '1.88.0-x86_64-unknown-linux-gnu'
info: component 'rust-std' for target 'wasm32-unknown-unknown' is up to date
info: component 'rust-src' is up to date
🏗  Building gtest-runtime as release using rustc 1.88.0 (6b00bc388 2025-06-23)
⏳ That can take a little while, be patient... subsequent builds may be faster.
   Since you have to wait a little, you may want to learn more about Substrate runtimes:
   https://docs.substrate.io/learn/architecture/
    Updating git repository `https://github.com/duniter/duniter-polkadot-sdk`
    Updating crates.io index
    Updating git repository `https://github.com/paritytech/subxt`
 Downloading crates ...
[...]
error: failed to create directory `/build/runtime/gtest/target`

Caused by:
  Permission denied (os error 13)
Error: Échec de la construction du runtime avec srtool
1 Like

Non, voir: Duniter v2s et l’indexeur ne dĂ©marrent pas avec la valeur du DU de la Ğ1 - #16 by poka

Je crois qu’il y a peut ĂȘtre un bug de l’interface polkadotjs car parfois j’ai l’impression que lengthBound est prĂ©rempli. Mais parfois j’ai dĂ» la calculer Ă  la main.
Pour se faire il suffit de prendre le encoded call data, retirer le 0x au début, compter son nombre de caractÚre et le diviser par 2 (nombre de bytes). Par exemple:

echo 1702101500000a2acefe9868b7798a1f61489a1a0d45b330accf87e1e88326ee97430ecbd4815700 | wc -c → 81
Ca fait 40.5, on peut mettre 50 pour avoir de la marge.


Regarde surtout le owner du dossier en question et dossier parent. Dans le doute pour tester fait un petit chmod 777 -R du dossier parent, pour voir si c’est vraiment un pbm de droits.

J’ai approuvĂ© les propositions aux index 4, 5 et 6. La 5 est Ă  valider.
Curieux cette nouvelle maniĂšre de vĂ©rifier uniquement le changement d’une valeur.
Je cherchais ou se trouve le code (la branche) de la proposition 6.
Pour la proposition 5, j’ai construit le runtime et ait obtenu le mĂȘme hash blake256.

Aucune de ces 3 propositions n’est un runtime upgrade, juste un setStorage. Donc il n’y a pas de code associĂ© (pas de preimage).

Du coup je ne sais pas quel runtime tu as compilé et quel hash tu as vérifié ?
Pour ces propositions le contenu des changements est directement présenté dans la proposual, il suffit donc de vérifier que le contenu est celui attendu (@cgeek a expliqué la procédure un peu mieux que moi juste au dessus).

2 Likes

Ah ok. J’avais vĂ©rifiĂ© la proposition 5 en vĂ©rifiant cette branche et en obtenant ce hash, mais ça correspond aux premiĂšres propositions.

Aprùs relecture du message de cgeek c’est plus clair.

2 Likes

Oui je dois supprimer cette branche, elle est obsolĂšte, mais c’était un bon entrainement en soit.


La proposition 5 vient d’ĂȘtre exĂ©cutĂ© avec succĂšs :slight_smile:

La valeur du nextReeval a donc été modifié.

Avant:
image

AprĂšs:
image


Il reste donc:

  • Proposition 4 (manque 2 votes): Nouvelle constitution du comitĂ© technique
  • Proposition 6 (manque 2 votes): Nouvelle valeur du currentUd corrigĂ©
5 Likes

Étrange cette valeur. C’est pas ce qui a Ă©tĂ© configurĂ©.


Ça fonctionne ! Le montant arrĂȘte d’ĂȘtre réévaluĂ© tous les jours.

3 Likes

Si:


Ah tu veux parler de l’ancienne valeur, si en fait c’est qu’elle a Ă©tĂ© réévaluĂ© plusieurs fois donc n’est plus du tout Ă©gale au first_ud_reeval (il rajoutait 6 mois tous les jours) :slight_smile:

C’est un teasing de Silkaj v2 ?

1 Like

Le montant initialement inscrit était, toujours avec la conversion de ms en s :

date -d @1766232
Wed 21 Jan 11:37:12 CET 1970

or, ta capture d’écran indique :

date -d @270005832
Sun 23 Jul 02:37:12 CET 1978

La nouvelle valeur est :

date -d @1766232000
Sat 20 Dec 13:00:00 CET 2025

Ah oui, en effet. Intéressant.

3600 × 24 × 365.25 / 2 = 15778800
1766232 + 15778800 × 17 = 270005832 s

La date de réévaluation s’est dĂ©placĂ©e de huit annĂ©es et demie (17/2 semestres). Mais Ă©tait toujours dans le passĂ©. Donc, il y avait réévaluation tous les jours.


Euh, comment dire, c’est un prototype. J’ai voulu tester l’affichage de tableaux et de graphiques avec deux bibliothùques graphiques.

4 Likes

Je n’avais pas regardĂ©, je vois que c’est un changement de clĂ© pour Hugo, le retrait d’EloĂŻs et l’ajout de @aya. J’ai votĂ©, la proposition est passĂ©e. :slight_smile:

3 Likes

Chouette, j’ai exĂ©cutĂ© la proposition, bienvenue @aya au comitĂ©


Pour executer une proposition ayant atteint le nombre de vote requis, il faut executer l’extrinsics technicalCommittee.close, qui peut se faire simplement en cliquant sur le bouton “close” à droite de la proposition, remplaçant le bouton de vote.

Reste donc la proposition 6 pour remettre la bonne valeur du DU.

1 Like

Vu que la 5 est passée, je viens de voter la 6 également.

Ma clĂ© est encore dĂ©rivĂ©e du format Cesium, et je ne peux pas le faire via Ğcli, je te laisse la main.

3 Likes

Proposition 6 également passé !

Avant:

image

AprĂšs:

image

Merci Ă  tous !

4 Likes