Discussions autour du developpement de duniter-rs (Duniter en Rust)

Je n’avais pas pensé à ça, mais si c’est le cas il va falloir que le protocole v11 comprennent les docs v10 ce qui n’était plus prévu. Je pense qu’il y aurait moyen pendant la transition d’avoir un autre type “Document v10” qui serait accepté dans le protocole. Ca ne concerne que la partie “transformation”, après dans l’état les signatures des documents ne sont plus nécéssaires et du coup les documents peuvent être convertis sans problème. Je vais voir ce que je peux faire :slight_smile:

Un timestamp UNIX précis que tous les logiciels pourront utiliser avec une petite marge d’erreur.

Comment ça ? Je veux dire : je dois pouvoir vérifier les signatures de documents v10 comme v11, non ?

Au niveau de la partie “transformation d’état” oui, vu que ce sont des données extérieures.

L’état précédent est par définition valide, les transformations sont vérifiées valides, du coup l’état suivant est valide (et vérifié par chaque nœud). Donc par construction les signatures ne sont utiles que dans la partie transformation.

Par exemple, une transaction. Elle est signée, valide le script et met à jour les comptes (il peut en créer de nouveaux aussi). Les comptes eux n’ont pas de signatures, et de toute façon ne sont jamais signés par les créateurs de la transaction.

Autre exemple, une certification. Dans la partie transformation, il y a le document de certification, il est vérifié (contenu, contexte, signature), puis est inséré dans l’état. Cette procédure est le seul moyen de modifier l’état, donc si une certification se retrouve dans l’état sa signature était forcement valide dans la transformation où elle est apparu. Dans l’état, on stockera certification de A à B à tel date.

Ce qui fait consensus à la fin, c’est l’état après un bloc. Dès qu’on sort de la fenêtre de fork, les nœuds qui le souhaites peuvent oublier ces documents (de transformation) car leurs “effets” sont bien intégrés dans l’état.

1 Like

OK. Donc un nœud qui désire tout stocker conserve bien les signatures. Même v10, tu confirmes ?

Yeap, et avec il peut vérifier l’intégralité des états de la blockchain.

1 Like

Alléluia après environ 5h de dev sur ces 3 jours, j’ai réussi a établir une connexion WS2P a partir de zéro depuis un programme Rust :fireworks::sparkler::rofl:

Honnêtement je pensais que ce serait plus simple, Rust étant très bas niveau il m’a fallu un paquet de dépendances pour y arriver :stuck_out_tongue:
Alors c’est expérimental mais ça m’entraine, je voulais le faire pour plusieurs raisons :

  1. M’assurer de l’interopérabilité du protocole WS2P actuel (on savais que c’était évidemment vrai en théorie mais la on à la preuve par la pratique).
  2. Pratiquer en Rust car j’ai envie d’apprendre a maitriser ce langage.
  3. Je vais avoir besoin de ws2p pour un projets en cours mais j’en parlerai quand ce sera plus avancé.
  4. Ça me permet de vérifier si la crate duniter-keys dev par @nanocryk fonctionne bien, et la réponse est oui :wink:
  5. Ce programme expérimental va me permettre de vérifier la conformité de la RFC WS2p v1, je compte checker tout les types de requêtes dans les semaines qui viennent :slight_smile:

La crate duniter-keys m’a générée la clé publique 3fBoNtSDbko7J1ch6xWu7RpbQBxz1eWt7C2fNZEsUZ9j, pour les tests j’ai ajouté cette clé a ma liste des privilégiés sur mon seul noeud membre G1 accessible en ws2p public en clair. Ci-dessous les log de mon programme, qui traite successivement les messages CONNECT, ACK puis OK. Après les OK on voit que je reçoit des fiches de peer puis des head, je n’ai pas codé le traitement de ces messages,une fois la connexion établie mon programme se contente d’écouter passivement et de logger tout ce qu’il reçoit.

EDIT : en regardant les log de plus près je vois que j’ai aussi reçu une certification et une requête BLOCKS_CHUNK (demande d’un groupe de blocs). J’ai coupé avec ctrl+C au bout de 10 secondes environ, ws2p est plus bavard que ce que je pensais.

$ cargo run
   Compiling ws2p-exp v0.1.0 (file:///home/elois/dev/duniter/nodes/rust/ws2p-exp)
    Finished dev [unoptimized + debuginfo] target(s) in 7.1 secs
     Running `target/debug/ws2p-exp`
pubkey : 3fBoNtSDbko7J1ch6xWu7RpbQBxz1eWt7C2fNZEsUZ9j
Send: "{\"auth\":\"CONNECT\",\"pub\":\"3fBoNtSDbko7J1ch6xWu7RpbQBxz1eWt7C2fNZEsUZ9j\",\"challenge\":\"b60a14fd-0826-4ae0-83eb-1a92cd59fd5308535fd3-78f2-4678-9315-cd6e3b7871b1\",\"sig\":\"oliroRA5Aa/MDUC8qmWuMn6O+IUAh8cV5R8I12sNltCp/h4jnil6nKGr0233FOqTzHOEIfXvBU0saZ/N4344Bg==\"}"
Recv: Text(
    "{\"auth\":\"CONNECT\",\"pub\":\"D9D2zaJoWYWveii1JRYLVK3J4Z7ZH3QczoKrnQeiM6mx\",\"challenge\":\"252cfd85-0c12-4665-947e-320f41d501db7608907c-c3af-4ee3-945b-159b5ebb96ad\",\"sig\":\"in/QsJCuZX6eWlk/ZfDp+Kka7d41/nah5+BHVg+DbOKxKIp6SlKRNNZPb8riadZZRL3JCt4NET6NG00fdNVkAQ==\"}"
)
Send: "{\"auth\":\"ACK\",\"pub\":\"3fBoNtSDbko7J1ch6xWu7RpbQBxz1eWt7C2fNZEsUZ9j\",\"sig\":\"I2t/KIZJTu8UknB8NYGYW0qiap6hspuZWYx7pJBFCG0iVyswybHoYGc/ncsyGKYE0Aa5HbsztAvJgUWfob5ZBA==\"}"
Recv: Text(
    "{\"auth\":\"ACK\",\"pub\":\"D9D2zaJoWYWveii1JRYLVK3J4Z7ZH3QczoKrnQeiM6mx\",\"sig\":\"famL+eQ1dW1/4IzNTdWoozUGaXC0p14kCggAhVd2OTfqOjOiJkreI0ugnL98t0Y35DN5qdGiZEgu5EYcT+JkAw==\"}"
)
Send: "{\"auth\":\"OK\",\"sig\":\"fNWxk3bxgVJqFX7NpYbjifOUX152zRtVkCPWlqFcPaeqcDPxxYW52Wcht69lgMmP3y46L8iEe9czmOpPtTBqCg==\"}"
Recv: Text(
    "{\"auth\":\"OK\",\"sig\":\"w+oNGgnx6gDGUa+Za4+QiHEIF19FlktmRwvVaj3eGG61bKxHzKfBESmSjkCiORCKuIAS4VwthWRsAZU1FTqZDg==\"}"
)
Received OK
No response
Recv: Text(
    "{\"body\":{\"name\":\"PEER\",\"peer\":{\"version\":10,\"currency\":\"g1\",\"pubkey\":\"5jfUpXPWAiBXNVG49tjQYA7R3VFX2oG2aPiskR5PE8Mc\",\"blockstamp\":\"93585-00000155B3C518CB990EBAEDC2C1D0637BA9DC299AE550616769C01163396832\",\"endpoints\":[\"WS2P 813abae6 2.8.235.28 20900\"],\"signature\":\"gTjjjqIFwfw1j3qQLoDr9+tavghWPj1OsOQrI1sXhYgOEy7gd+PwSHAMFLOAeh1jUSJzRgTw4Qx2qG2vDsDAAg==\",\"status\":\"UP\",\"statusTS\":1518202490,\"member\":false}}}"
)
unknow message
No response
Recv: Text(
    "{\"body\":{\"name\":\"PEER\",\"peer\":{\"version\":10,\"currency\":\"g1\",\"pubkey\":\"FkyYZ15dJC2GvShLqyWH38BV913CEp6WuhnRfvbRAWin\",\"blockstamp\":\"93585-00000155B3C518CB990EBAEDC2C1D0637BA9DC299AE550616769C01163396832\",\"endpoints\":[\"BMAS g1.guimik.fr 443\",\"BASIC_MERKLED_API g1.guimik.fr 82.241.192.14 443\",\"WS2P e9bc630f g1.guimik.fr 443 /ws2p\"],\"signature\":\"3R7Ly3gogQ+dBS37eGSj2ZSwKT5NtT1WU5Z3OxgOiEhapIO86FXR1z6D9GXcAwWAYrWD+WAj6Xgh5MT5uoQXCw==\",\"status\":\"UP\",\"statusTS\":1518202490,\"member\":false}}}"
)
unknow message
No response
Recv: Text(
    "{\"body\":{\"name\":\"CERTIFICATION\",\"certification\":{\"pubkey\":\"Ep1DeihHkcW95XukYXwigB6sfdNefD317y3d6wp3komT\",\"block_number\":93615,\"sig\":\"3DjqzBANk3+X/vSeB1d2zhWL8RCeLxLzTjLx7oh+mTVntpS5gAQok7xSo0opQP3HMVzlTu9XHgvgkhysfvfDAQ==\",\"idty_issuer\":\"2RvAe3UZdjDM88FUT87LFx6nETnA9MJt6a3yshamjtwz\",\"version\":\"10\",\"currency\":\"g1\",\"buid\":\"93615-0000064A14C4EA2CD09BE4EBA346E3552D250F48FED2DC02FA593B374535AB0E\",\"idty_uid\":\"JohannaT\",\"idty_buid\":\"90121-000005D534F98B2D6827C2C1B0DE1DB92F979BED5AE9DC99D8E689E49DF20678\",\"idty_sig\":\"OcI1xcvoZoRqX7PPfAFUVnx9JChjc5inU9LcdPlLhfiop+3nJ9pmg45KZLHX2LBHnGVzcG/3bNmnrMdsLz2FCg==\"}}}"
)
unknow message
No response
Recv: Text(
    "{\"reqId\":\"e79a6be4-d7d1-4fe9-862a-b2f88f219b3c\",\"body\":{\"name\":\"BLOCKS_CHUNK\",\"params\":{\"count\":50,\"fromNumber\":93616}}}"
)
unknow message
No response
Recv: Text(
    "{\"body\":{\"name\":\"PEER\",\"peer\":{\"version\":10,\"currency\":\"g1\",\"pubkey\":\"D9D2zaJoWYWveii1JRYLVK3J4Z7ZH3QczoKrnQeiM6mx\",\"blockstamp\":\"93614-0000059138371434A187267C35A1FB9BB4E358837788694F6B56E876DC52B6B2\",\"endpoints\":[\"MONIT_API g1-monit.librelois.fr 443\",\"BASIC_MERKLED_API g1-monit.librelois.fr 10901\",\"WS2P c1c39a0a g1-monit.librelois.fr 443 /ws2p\",\"BMATOR 3k2zovlpihbt3j3g.onion 80\",\"WS2PTOR 1be86653 3k2zovlpihbt3j3g.onion 20901\",\"WS2PTOR 53844c91 txeyf3zs65sq2g3v.onion 80\",\"WS2PTOR d0a2cfcc toefa6zlbcyvqzlg.onion 20901\",\"WS2PTOR 1be86653 3k2zovlpihbt3j3g.onion 80 ws2p\",\"WS2PTOR d0a2cfcctoefa6zlbcyvqzlg.onion 10902\"],\"signature\":\"A67uq1Kq4gJO0rdzIbZbY20Riy6c+VKd89CWwHGtWbqS+oCtWCvTK9SBHLfP4RYf5tVzIeRMcEEMUGnKk6yLDg==\",\"status\":\"UP\",\"statusTS\":1518211314,\"member\":false}}}"
)
unknow message
No response
Recv: Text(
    "{\"body\":{\"name\":\"PEER\",\"peer\":{\"version\":10,\"currency\":\"g1\",\"pubkey\":\"DA4PYtXdvQqk1nCaprXH52iMsK5Ahxs1nRWbWKLhpVkQ\",\"blockstamp\":\"93612-00000488F156889BF728F659FF4AC3C8BBD942B7BB59FA97EADBF656A9E28755\",\"endpoints\":[\"BASIC_MERKLED_API s0.cco.ovh 37.59.48.28 2001:41d0:8:6b1c:: 10901\",\"BASIC_MERKLED_API s2.cco.ovh 37.59.44.69 10901\"],\"signature\":\"+HPoUP2J2gb6BL5Mz7Cy1xYeCJfSXui8N2DcM5jN9+sHHdVXHuM8fGFte/Ti8L0JiuvL38vUmPhZt7/a57+XCw==\",\"status\":\"UP\",\"statusTS\":1518210814,\"member\":false}}}"
)
unknow message
No response
Recv: Text(
    "{\"body\":{\"name\":\"PEER\",\"peer\":{\"version\":10,\"currency\":\"g1\",\"pubkey\":\"GfKERHnJTYzKhKUma5h1uWhetbA8yHKymhVH2raf2aCP\",\"blockstamp\":\"93585-00000155B3C518CB990EBAEDC2C1D0637BA9DC299AE550616769C01163396832\",\"endpoints\":[\"BASIC_MERKLED_API 37.172.180.136 2a02:8389:2200:600:b496:bdc:27cd:42f9 10901\",\"BMAS duniter.moul.re 443\",\"WS2P 632b3f50 165.227.164.19 20892\"],\"signature\":\"yGkOcA4pn/mEnXstbEUnCADI6D6hwZXpOVG1nuFOYnv8hdTtI5jlZD6ZvFtwpRsbPon3yjVDQ7noePZU6XnyDQ==\",\"status\":\"UP\",\"statusTS\":1518202490,\"member\":false}}}"
)
unknow message
No response
Recv: Text(
    "{\"body\":{\"name\":\"PEER\",\"peer\":{\"version\":10,\"currency\":\"g1\",\"pubkey\":\"9UCGiboriR5rDuszGWYBKo4NgnydPrwHxQWNqeoxmsyY\",\"blockstamp\":\"93585-00000155B3C518CB990EBAEDC2C1D0637BA9DC299AE550616769C01163396832\",\"endpoints\":[\"BASIC_MERKLED_API duniter.veniro.fr 82.251.247.134 fe80::7c0b:eaff:fe36:6782%eth0 10901\",\"WS2P 956f29d6 duniter.veniro.fr 20901\"],\"signature\":\"IrHjmMI4njp/wOHpeNWdiKyc1oXGrWEf/entS9YKRr1Pc8y8S7M5MIRE/T1PSjtfjll6OCtfZHRjpHh0QXhtCA==\",\"status\":\"UP\",\"statusTS\":1518202490,\"member\":false}}}"
)
unknow message
No response
Recv: Text(
    "{\"body\":{\"name\":\"PEER\",\"peer\":{\"version\":10,\"currency\":\"g1\",\"pubkey\":\"5gJYnQp8v7bWwk7EWRoL8vCLof1r3y9c6VDdnGSM1GLv\",\"blockstamp\":\"93585-00000155B3C518CB990EBAEDC2C1D0637BA9DC299AE550616769C01163396832\",\"endpoints\":[\"BASIC_MERKLED_API g1.imirhil.fr 80\",\"WS2PTOR cb06a19b g1.aerisryzdvrx7teq.onion 53012 /\",\"BMATOR g1.aerisryzdvrx7teq.onion 80\",\"BASIC_MERKLED_API g1.imirhil.fr 443\",\"WS2P cb06a19b g1.imirhil.fr 53012 /\"],\"signature\":\"hinon04aH0pYQKmvYiqza75zfZjk4rxJ3mNu7G8ceEeLh5TnFpwFj71mTRubEva8c+EU8dHkRKtOQSnEiHJfDQ==\",\"status\":\"UP\",\"statusTS\":1518202490,\"member\":false}}}"
)
unknow message
No response
Recv: Text(
    "{\"body\":{\"name\":\"PEER\",\"peer\":{\"version\":10,\"currency\":\"g1\",\"pubkey\":\"7v2J4badvfWQ6qwRdCwhhJfAsmKwoxRUNpJHiJHj7zef\",\"blockstamp\":\"93585-00000155B3C518CB990EBAEDC2C1D0637BA9DC299AE550616769C01163396832\",\"endpoints\":[\"BMAS g1.monnaielibreoccitanie.org 443\",\"BASIC_MERKLED_API g1.monnaielibreoccitanie.org 443\",\"WS2P b48824f0 g1.monnaielibreoccitanie.org 20901\"],\"signature\":\"OrV3XzHd+GPkzUHnu+hzxC/mCBFNJtVr5DmJWvfp3jEUgRHoDt2Qz7Rv2dTeztjUlwgN818H4Clx0W0AhxzAAQ==\",\"status\":\"UP\",\"statusTS\":1518202490,\"member\":false}}}"
)
unknow message
No response
Recv: Text(
    "{\"body\":{\"name\":\"HEAD\",\"heads\":[{\"message\":\"WS2P:HEAD:1:7AQzQb475tEzCkSLKD4HffeQbckizJWFvubhYA2rfwgt:93008-000001B3A727A9F4C58A6B8126AFE7F7642A9F12DD6DFBD05D7D32A40FD26BFD:451a34fb:duniter:1.6.14:1\",\"sig\":\"5x33JNlb1Mw4DdwQVDp2jn9Q/UMKY7I0/9vT7szPgyVI2gDjbZqKsoRMKZYAjk2Ncnt0Ymw8ORgAOO8TlWX7Bg==\"}]}}"
)
unknow message
No response
Recv: Text(
    "{\"body\":{\"name\":\"HEAD\",\"heads\":[{\"message\":\"WS2P:HEAD:1:7AQzQb475tEzCkSLKD4HffeQbckizJWFvubhYA2rfwgt:93009-0000023058365FA06C43113DBCF858D6279D7ADAB0BB1B8292F93F91086BC73D:451a34fb:duniter:1.6.14:1\",\"sig\":\"u7XvyqonTbDlOGC+fCzvG8XlVO/pS/9CHlvU8Tg/Nm773QGRTLXG7HNWzxhaWu6L6LdPkGB5h9nWQ1iPtGsJCQ==\"}]}}"
)
unknow message
No response
Recv: Text(
    "{\"body\":{\"name\":\"HEAD\",\"heads\":[{\"message\":\"WS2P:HEAD:1:7AQzQb475tEzCkSLKD4HffeQbckizJWFvubhYA2rfwgt:93010-000004A5F2E4873840D27CA68333FD7F852A6C6B15527CA416CE8F3886A31FE3:451a34fb:duniter:1.6.14:1\",\"sig\":\"7gm5gVWlMRhWXtjJ1ISLTZZzJA0TNvKjyTFu5f3PYCaQZ1S81M4rSfdkKOHnQftTNWOau/FWL8YmaLGNqqzVDQ==\"}]}}"
)
unknow message
No response
Recv: Text(
    "{\"body\":{\"name\":\"HEAD\",\"heads\":[{\"message\":\"WS2P:HEAD:1:7AQzQb475tEzCkSLKD4HffeQbckizJWFvubhYA2rfwgt:93011-0000013BDB7B0C966281D981CBCC5ABC84CA1BEC36B8CD361979487250CE8865:451a34fb:duniter:1.6.14:1\",\"sig\":\"DHPp8Ip+ddsGrilqr7+1N3fzWlZkkZo7H0YygtTS8Arp1g0xu6k+qajotRhOCP1aISm95JdkcOdQGZItVuAEDA==\"}]}}"
)
unknow message
No response
Recv: Text(
    "{\"body\":{\"name\":\"HEAD\",\"heads\":[{\"message\":\"WS2P:HEAD:1:7AQzQb475tEzCkSLKD4HffeQbckizJWFvubhYA2rfwgt:93012-000004B0A4C3E13853FD78B5F405699325A70EF595E300862A893A285EA4B664:451a34fb:duniter:1.6.14:1\",\"sig\":\"7kujkdV7A/f+BCKr/m+7pZSgBok4pCsupK4HS/MO/8iTnoOs/LbdfNPh1NDXCMbeHiFevH3ke9koOdnVo7yhDw==\"}]}}"
)
unknow message
No response
Recv: Text(
    "{\"body\":{\"name\":\"HEAD\",\"heads\":[{\"message\":\"WS2P:HEAD:1:7AQzQb475tEzCkSLKD4HffeQbckizJWFvubhYA2rfwgt:93013-000000AFCEDB64828190A23D51021D18949E06A4DE4FCA6D247B6A32EA674F2D:451a34fb:duniter:1.6.14:1\",\"sig\":\"dbu8whxKecyvSlB3K+xoYeDdOlpUVP/q7sJffR7dIoGUHLzrhye+sjN9sNg6ySbht7Oe3XtakcTT3lHSiBBdBQ==\"}]}}"
)
unknow message
No response

Et bien sûr la preuve sur la vue réseau de mon noeud membre :

3 Likes

Alors comme ça môssieur fait des tests hautement risqués sur la monnaie de prod ??!!! :grimacing:

C’est mal ! C’est comme croiser les effluves… :wink:

G1-test, c’est pas fait pour les canidés…

haha y a rien de risqué je n’ai contacté que mon propre noeud et ne lui est envoyé aucune requête autre qu’établir une connexion, t’inquiète je sais ce que je fait :wink:
Y a vraiment rien de risqué dans ce que je fais la, quand on teste une nouvelle pré-release sur la g1 on prend des risques infiniment plus grands alors détend toi :slight_smile:

1 Like

Elle est où la branche ? Je veux voir ça moi :stuck_out_tongue:

1 Like

Je partagerai le code quand ce sera un peu plus avancé :wink:

Meh ! Je voudrais au moins vérifier qu’il n’y ai pas trop de mauvaises pratiques :wink: Ca évitera de faire des modifs partout après.

Ce que je dev la ne sera pas intégré a duniter-rs. C’est un module ws2p expérimental qui va me servir pour un autre projets. Quand j’aurais plus d’expérience je redévelopperai le module ws2p pour duniter-rs a partir de zéro, histoire de faire quelque chose de bien propre :slight_smile: (c’est plus facile de dev proprement en 2ème écriture).

D’accord, comme tu veux :slight_smile: Si tu veux un avis sur le code n’hésite pas.

1 Like

@nanocryk comment s’articulent les documents que tu développes désormais ? Les DIP 0001 et 0002 sont-elles toujours d’actualité ? La 0005, à quel point es-tu avancé dessus ?

Et puis où sont les 0003 et 0004 ? OK, c’est GVA et WS2P_v1.

Les RFC 1 et 2 sont dépréciées et remplacées par la RFC 5. Cette dernière est quasiment complète, il ne manque plus que la partie bloc/Merkle tree géant. Le reste peut déjà être peer-reviewed, vu qu’il introduit/modifie pas mal de choses :slight_smile:

2 Likes

Bon j’ai lu avec attention la RFC5. Mon retour général :

  • il reste encore à décrire le document Block (et donc les arbres)
  • il reste aussi à intégrer les règles formelles du protocole v10, et à y incorporer la partie scripting des transactions

Du reste j’ai des petites typo, je te ferai un retour détaillé sur GitLab.

Niveau compréhension, j’ai parfois un peu de mal sur quelques points précis. Je te ferai également un retour sur GitLab.

Mais si j’avais une inquiétude à formuler, c’est concernant le langage de scripting. Notamment les opérations de contrôle de flux et les rapatriements de données. Ce sont des points à vérifier avec une grande attention à mon avis pour qu’il ne s’agisse pas de vecteurs d’attaque.

J’ai déjà une bonne idée de ce que ça va donner, mais j’aimerais d’abord avoir le reste stable et reviewed.

Dans cette partie “Block” aussi

Là par contre je ne comprend pas, vu que la partie scripting est quand même assez détaillée.

J’ai hate de lire ça et d’améliorer ce document.

As-tu des idées de vecteur d’attaque la dessus ? Ces opérateurs ne peuvent retourner que des valeurs vides ou des données de taille fixe ayant toujours la même taille.

Oui mais elle ne s’inscrit pas encore dans les règles d’acceptation de bloc, vu que précisément tu n’as pas encore incorporé cette partie dans la RFC. Mais j’attends de voir comment tu vas faire.

Peut-être demain, j’ai tout noté.

Les opérations ToAltStack et FromAltStack m’ont alerté quand j’ai lu l’exemple. J’ai cru y déceler de la récursivité, mais je n’ai pas creusé.

De même pour les opérations de rapatriement de données : celui qui sait quelles opérations sont coûteuses pourrait produire des scripts qui solliciteraient le plus les nœuds, dans le but de les inonder d’accès coûteux.

Elles sont aussi dans le langage de script de Bitcoin. Elles permettent de stocker des données dans un autre stack et éviter de devoir swap les valeurs à longueur de temps. Tu peux alors faire plein de vérifications, stocker leur résultat dans la alt-stack pour ne pas qu’elles te gènes, et ensuite les récupérer pour prendre la décision finale.

En effet. Je pense que l’on fera comme Bitcoin et qu’on définiera un nombre maximum d’opcodes, sachant que les mulltisigs et les MAST permettent de faire des scripts complexes en minimisant le nombre d’opcodes.

La stack que tu as produite, est-elle à ce point similaire à Bitcoin que l’on peut lire des articles sur ce dernier pour mieux comprendre ?